From ae469b8146c2e68b1c1e06acc7d267e255389c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Tue, 30 Apr 2024 00:52:09 +0200 Subject: [PATCH 1/5] Add hyperparameter convergence_best move test libraries to test folder --- .gitmodules | 4 +- .vscode/launch.json | 2 +- CHANGELOG.md | 9 +- CMakeLists.txt | 6 +- README.md | 7 +- bayesnet/ensembles/BoostAODE.cc | 33 +- bayesnet/ensembles/BoostAODE.h | 1 + docs/BoostAODE.md | 1 + docs/algorithm.md | 3 +- html/bayesnet/BaseClassifier.h.func-c.html | 6 +- html/bayesnet/BaseClassifier.h.func.html | 6 +- html/bayesnet/BaseClassifier.h.gcov.html | 4 +- .../classifiers/Classifier.cc.func-c.html | 74 +- .../classifiers/Classifier.cc.func.html | 50 +- .../classifiers/Classifier.cc.gcov.html | 254 +- .../classifiers/Classifier.h.func-c.html | 8 +- .../classifiers/Classifier.h.func.html | 8 +- .../classifiers/Classifier.h.gcov.html | 6 +- html/bayesnet/classifiers/KDB.cc.func-c.html | 12 +- html/bayesnet/classifiers/KDB.cc.func.html | 12 +- html/bayesnet/classifiers/KDB.cc.gcov.html | 106 +- html/bayesnet/classifiers/KDB.h.func-c.html | 2 +- html/bayesnet/classifiers/KDB.h.func.html | 2 +- html/bayesnet/classifiers/KDB.h.gcov.html | 2 +- .../bayesnet/classifiers/KDBLd.cc.func-c.html | 10 +- html/bayesnet/classifiers/KDBLd.cc.func.html | 10 +- html/bayesnet/classifiers/KDBLd.cc.gcov.html | 36 +- html/bayesnet/classifiers/KDBLd.h.func-c.html | 2 +- html/bayesnet/classifiers/KDBLd.h.func.html | 2 +- html/bayesnet/classifiers/KDBLd.h.gcov.html | 2 +- .../classifiers/Proposal.cc.func-c.html | 20 +- .../classifiers/Proposal.cc.func.html | 20 +- .../classifiers/Proposal.cc.gcov.html | 170 +- .../bayesnet/classifiers/SPODE.cc.func-c.html | 8 +- html/bayesnet/classifiers/SPODE.cc.func.html | 8 +- html/bayesnet/classifiers/SPODE.cc.gcov.html | 22 +- html/bayesnet/classifiers/SPODE.h.func-c.html | 8 +- html/bayesnet/classifiers/SPODE.h.func.html | 8 +- html/bayesnet/classifiers/SPODE.h.gcov.html | 4 +- .../classifiers/SPODELd.cc.func-c.html | 14 +- .../bayesnet/classifiers/SPODELd.cc.func.html | 14 +- .../bayesnet/classifiers/SPODELd.cc.gcov.html | 54 +- .../classifiers/SPODELd.h.func-c.html | 2 +- html/bayesnet/classifiers/SPODELd.h.func.html | 2 +- html/bayesnet/classifiers/SPODELd.h.gcov.html | 2 +- html/bayesnet/classifiers/TAN.cc.func-c.html | 10 +- html/bayesnet/classifiers/TAN.cc.func.html | 10 +- html/bayesnet/classifiers/TAN.cc.gcov.html | 48 +- html/bayesnet/classifiers/TAN.h.func-c.html | 2 +- html/bayesnet/classifiers/TAN.h.func.html | 2 +- html/bayesnet/classifiers/TAN.h.gcov.html | 2 +- .../bayesnet/classifiers/TANLd.cc.func-c.html | 10 +- html/bayesnet/classifiers/TANLd.cc.func.html | 10 +- html/bayesnet/classifiers/TANLd.cc.gcov.html | 36 +- html/bayesnet/classifiers/TANLd.h.func-c.html | 2 +- html/bayesnet/classifiers/TANLd.h.func.html | 2 +- html/bayesnet/classifiers/TANLd.h.gcov.html | 2 +- html/bayesnet/classifiers/index-sort-f.html | 2 +- html/bayesnet/classifiers/index-sort-l.html | 2 +- html/bayesnet/classifiers/index.html | 2 +- html/bayesnet/ensembles/AODE.cc.func-c.html | 10 +- html/bayesnet/ensembles/AODE.cc.func.html | 10 +- html/bayesnet/ensembles/AODE.cc.gcov.html | 42 +- html/bayesnet/ensembles/AODE.h.func-c.html | 2 +- html/bayesnet/ensembles/AODE.h.func.html | 2 +- html/bayesnet/ensembles/AODE.h.gcov.html | 2 +- html/bayesnet/ensembles/AODELd.cc.func-c.html | 12 +- html/bayesnet/ensembles/AODELd.cc.func.html | 12 +- html/bayesnet/ensembles/AODELd.cc.gcov.html | 50 +- html/bayesnet/ensembles/AODELd.h.func-c.html | 2 +- html/bayesnet/ensembles/AODELd.h.func.html | 2 +- html/bayesnet/ensembles/AODELd.h.gcov.html | 2 +- .../ensembles/BoostAODE.cc.func-c.html | 62 +- .../bayesnet/ensembles/BoostAODE.cc.func.html | 82 +- .../bayesnet/ensembles/BoostAODE.cc.gcov.html | 745 +- .../ensembles/BoostAODE.h.func-c.html | 2 +- html/bayesnet/ensembles/BoostAODE.h.func.html | 2 +- html/bayesnet/ensembles/BoostAODE.h.gcov.html | 19 +- .../ensembles/Ensemble.cc.func-c.html | 82 +- html/bayesnet/ensembles/Ensemble.cc.func.html | 52 +- html/bayesnet/ensembles/Ensemble.cc.gcov.html | 304 +- .../bayesnet/ensembles/Ensemble.h.func-c.html | 2 +- html/bayesnet/ensembles/Ensemble.h.func.html | 2 +- html/bayesnet/ensembles/Ensemble.h.gcov.html | 2 +- html/bayesnet/ensembles/index-sort-f.html | 16 +- html/bayesnet/ensembles/index-sort-l.html | 16 +- html/bayesnet/ensembles/index.html | 16 +- .../feature_selection/CFS.cc.func-c.html | 6 +- .../feature_selection/CFS.cc.func.html | 6 +- .../feature_selection/CFS.cc.gcov.html | 90 +- .../feature_selection/CFS.h.func-c.html | 8 +- .../feature_selection/CFS.h.func.html | 8 +- .../feature_selection/CFS.h.gcov.html | 4 +- .../feature_selection/FCBF.cc.func-c.html | 6 +- .../feature_selection/FCBF.cc.func.html | 6 +- .../feature_selection/FCBF.cc.gcov.html | 50 +- .../feature_selection/FCBF.h.func-c.html | 2 +- .../feature_selection/FCBF.h.func.html | 2 +- .../feature_selection/FCBF.h.gcov.html | 2 +- .../FeatureSelect.cc.func-c.html | 18 +- .../FeatureSelect.cc.func.html | 18 +- .../FeatureSelect.cc.gcov.html | 86 +- .../FeatureSelect.h.func-c.html | 2 +- .../FeatureSelect.h.func.html | 2 +- .../FeatureSelect.h.gcov.html | 2 +- .../feature_selection/IWSS.cc.func-c.html | 6 +- .../feature_selection/IWSS.cc.func.html | 6 +- .../feature_selection/IWSS.cc.gcov.html | 58 +- .../feature_selection/IWSS.h.func-c.html | 2 +- .../feature_selection/IWSS.h.func.html | 2 +- .../feature_selection/IWSS.h.gcov.html | 2 +- .../feature_selection/index-sort-f.html | 2 +- .../feature_selection/index-sort-l.html | 2 +- html/bayesnet/feature_selection/index.html | 2 +- html/bayesnet/index-sort-f.html | 2 +- html/bayesnet/index-sort-l.html | 2 +- html/bayesnet/index.html | 2 +- html/bayesnet/network/Network.cc.func-c.html | 94 +- html/bayesnet/network/Network.cc.func.html | 82 +- html/bayesnet/network/Network.cc.gcov.html | 582 +- html/bayesnet/network/Network.h.func-c.html | 4 +- html/bayesnet/network/Network.h.func.html | 4 +- html/bayesnet/network/Network.h.gcov.html | 4 +- html/bayesnet/network/Node.cc.func-c.html | 42 +- html/bayesnet/network/Node.cc.func.html | 42 +- html/bayesnet/network/Node.cc.gcov.html | 170 +- html/bayesnet/network/index-sort-f.html | 2 +- html/bayesnet/network/index-sort-l.html | 2 +- html/bayesnet/network/index.html | 2 +- .../utils/BayesMetrics.cc.func-c.html | 24 +- html/bayesnet/utils/BayesMetrics.cc.func.html | 24 +- html/bayesnet/utils/BayesMetrics.cc.gcov.html | 224 +- .../bayesnet/utils/BayesMetrics.h.func-c.html | 12 +- html/bayesnet/utils/BayesMetrics.h.func.html | 12 +- html/bayesnet/utils/BayesMetrics.h.gcov.html | 26 +- html/bayesnet/utils/Mst.cc.func-c.html | 22 +- html/bayesnet/utils/Mst.cc.func.html | 22 +- html/bayesnet/utils/Mst.cc.gcov.html | 130 +- html/bayesnet/utils/Mst.h.func-c.html | 4 +- html/bayesnet/utils/Mst.h.func.html | 4 +- html/bayesnet/utils/Mst.h.gcov.html | 4 +- .../utils/bayesnetUtils.cc.func-c.html | 10 +- .../bayesnet/utils/bayesnetUtils.cc.func.html | 10 +- .../bayesnet/utils/bayesnetUtils.cc.gcov.html | 48 +- html/bayesnet/utils/index-sort-f.html | 2 +- html/bayesnet/utils/index-sort-l.html | 2 +- html/bayesnet/utils/index.html | 2 +- html/index-sort-f.html | 16 +- html/index-sort-l.html | 16 +- html/index.html | 16 +- lib/catch2 | 1 - lib/json | 2 +- lib/log/loguru.cpp | 2009 ++ lib/log/loguru.hpp | 1475 ++ tests/CMakeLists.txt | 4 +- tests/TestBayesClassifier.cc | 34 +- tests/TestBayesEnsemble.cc | 14 +- tests/TestBayesMetrics.cc | 8 +- tests/TestBayesModels.cc | 22 +- tests/TestBayesNetwork.cc | 72 +- tests/TestBoostAODE.cc | 56 +- tests/TestFeatureSelection.cc | 18 +- tests/data/mfeat-factors.arff | 1807 ++ {lib => tests/lib}/Files/ArffFiles.cc | 21 +- {lib => tests/lib}/Files/ArffFiles.h | 21 +- {lib => tests/lib}/Files/CMakeLists.txt | 0 tests/lib/catch2/.bazelrc | 11 + tests/lib/catch2/.clang-format | 45 + tests/lib/catch2/.clang-tidy | 81 + tests/lib/catch2/.conan/build.py | 94 + .../catch2/.conan/test_package/CMakeLists.txt | 8 + .../catch2/.conan/test_package/conanfile.py | 40 + .../.conan/test_package/test_package.cpp | 13 + tests/lib/catch2/.gitattributes | 22 + tests/lib/catch2/.github/FUNDING.yml | 2 + .../.github/ISSUE_TEMPLATE/bug_report.md | 29 + .../.github/ISSUE_TEMPLATE/feature_request.md | 14 + .../catch2/.github/pull_request_template.md | 28 + .../.github/workflows/linux-bazel-builds.yml | 24 + .../.github/workflows/linux-meson-builds.yml | 44 + .../.github/workflows/linux-other-builds.yml | 154 + .../.github/workflows/linux-simple-builds.yml | 123 + .../catch2/.github/workflows/mac-builds.yml | 51 + .../workflows/package-manager-builds.yaml | 31 + .../workflows/validate-header-guards.yml | 36 + .../workflows/windows-simple-builds.yml | 37 + tests/lib/catch2/.gitignore | 38 + tests/lib/catch2/BUILD.bazel | 95 + tests/lib/catch2/CMake/Catch2Config.cmake.in | 10 + .../lib/catch2/CMake/CatchConfigOptions.cmake | 89 + .../lib/catch2/CMake/CatchMiscFunctions.cmake | 121 + tests/lib/catch2/CMake/FindGcov.cmake | 157 + tests/lib/catch2/CMake/FindLcov.cmake | 354 + tests/lib/catch2/CMake/Findcodecov.cmake | 258 + tests/lib/catch2/CMake/catch2-with-main.pc.in | 10 + tests/lib/catch2/CMake/catch2.pc.in | 11 + tests/lib/catch2/CMake/llvm-cov-wrapper | 56 + tests/lib/catch2/CMakeLists.txt | 203 + tests/lib/catch2/CMakePresets.json | 26 + tests/lib/catch2/CODE_OF_CONDUCT.md | 46 + tests/lib/catch2/Doxyfile | 2650 ++ tests/lib/catch2/LICENSE.txt | 23 + tests/lib/catch2/MODULE.bazel | 3 + tests/lib/catch2/README.md | 103 + tests/lib/catch2/SECURITY.md | 19 + tests/lib/catch2/WORKSPACE.bazel | 16 + tests/lib/catch2/appveyor.yml | 83 + tests/lib/catch2/codecov.yml | 22 + tests/lib/catch2/conanfile.py | 127 + .../lib/catch2/data/artwork/catch2-c-logo.png | Bin 0 -> 10636 bytes .../catch2/data/artwork/catch2-hand-logo.png | Bin 0 -> 33761 bytes .../catch2-logo-small-with-background.png | Bin 0 -> 25330 bytes .../catch2/data/artwork/catch2-logo-small.png | Bin 0 -> 20939 bytes tests/lib/catch2/docs/Readme.md | 43 + tests/lib/catch2/docs/assertions.md | 182 + tests/lib/catch2/docs/benchmarks.md | 251 + tests/lib/catch2/docs/ci-and-misc.md | 110 + tests/lib/catch2/docs/cmake-integration.md | 431 + tests/lib/catch2/docs/command-line.md | 648 + tests/lib/catch2/docs/commercial-users.md | 23 + .../docs/comparing-floating-point-numbers.md | 192 + tests/lib/catch2/docs/configuration.md | 296 + tests/lib/catch2/docs/contributing.md | 343 + tests/lib/catch2/docs/deprecations.md | 40 + tests/lib/catch2/docs/event-listeners.md | 44 + tests/lib/catch2/docs/faq.md | 113 + tests/lib/catch2/docs/generators.md | 280 + tests/lib/catch2/docs/limitations.md | 191 + tests/lib/catch2/docs/list-of-examples.md | 46 + tests/lib/catch2/docs/logging.md | 163 + tests/lib/catch2/docs/matchers.md | 458 + tests/lib/catch2/docs/migrate-v2-to-v3.md | 98 + tests/lib/catch2/docs/opensource-users.md | 159 + tests/lib/catch2/docs/other-macros.md | 155 + tests/lib/catch2/docs/own-main.md | 132 + tests/lib/catch2/docs/release-notes.md | 1775 ++ tests/lib/catch2/docs/release-process.md | 66 + tests/lib/catch2/docs/reporter-events.md | 175 + tests/lib/catch2/docs/reporters.md | 213 + .../catch2/docs/skipping-passing-failing.md | 135 + .../catch2/docs/test-cases-and-sections.md | 346 + tests/lib/catch2/docs/test-fixtures.md | 162 + tests/lib/catch2/docs/tostring.md | 132 + tests/lib/catch2/docs/tutorial.md | 228 + tests/lib/catch2/docs/usage-tips.md | 100 + tests/lib/catch2/docs/why-catch.md | 59 + tests/lib/catch2/examples/010-TestCase.cpp | 41 + tests/lib/catch2/examples/020-TestCase-1.cpp | 37 + tests/lib/catch2/examples/020-TestCase-2.cpp | 41 + .../catch2/examples/030-Asn-Require-Check.cpp | 82 + tests/lib/catch2/examples/100-Fix-Section.cpp | 78 + .../catch2/examples/110-Fix-ClassFixture.cpp | 74 + .../120-Bdd-ScenarioGivenWhenThen.cpp | 81 + .../examples/210-Evt-EventListeners.cpp | 436 + .../catch2/examples/231-Cfg-OutputStreams.cpp | 63 + .../catch2/examples/232-Cfg-CustomMain.cpp | 41 + .../catch2/examples/300-Gen-OwnGenerator.cpp | 77 + .../examples/301-Gen-MapTypeConversion.cpp | 69 + tests/lib/catch2/examples/302-Gen-Table.cpp | 63 + .../310-Gen-VariablesInGenerators.cpp | 43 + .../catch2/examples/311-Gen-CustomCapture.cpp | 51 + tests/lib/catch2/examples/CMakeLists.txt | 62 + tests/lib/catch2/extras/Catch.cmake | 304 + tests/lib/catch2/extras/CatchAddTests.cmake | 192 + tests/lib/catch2/extras/CatchShardTests.cmake | 74 + .../catch2/extras/CatchShardTestsImpl.cmake | 52 + .../catch2/extras/ParseAndAddCatchTests.cmake | 252 + tests/lib/catch2/extras/catch_amalgamated.cpp | 11516 ++++++++ tests/lib/catch2/extras/catch_amalgamated.hpp | 13915 ++++++++++ tests/lib/catch2/extras/gdbinit | 16 + tests/lib/catch2/extras/lldbinit | 16 + tests/lib/catch2/fuzzing/CMakeLists.txt | 20 + tests/lib/catch2/fuzzing/NullOStream.cpp | 18 + tests/lib/catch2/fuzzing/NullOStream.h | 28 + tests/lib/catch2/fuzzing/build_fuzzers.sh | 33 + .../catch2/fuzzing/fuzz_TestSpecParser.cpp | 22 + tests/lib/catch2/fuzzing/fuzz_XmlWriter.cpp | 22 + tests/lib/catch2/fuzzing/fuzz_textflow.cpp | 53 + tests/lib/catch2/mdsnippets.json | 9 + tests/lib/catch2/meson.build | 19 + tests/lib/catch2/meson_options.txt | 1 + tests/lib/catch2/src/CMakeLists.txt | 486 + .../src/catch2/benchmark/catch_benchmark.hpp | 148 + .../catch2/benchmark/catch_benchmark_all.hpp | 46 + .../catch2/benchmark/catch_chronometer.cpp | 17 + .../catch2/benchmark/catch_chronometer.hpp | 77 + .../src/catch2/benchmark/catch_clock.hpp | 27 + .../catch2/benchmark/catch_constructor.hpp | 82 + .../catch2/benchmark/catch_environment.hpp | 29 + .../src/catch2/benchmark/catch_estimate.hpp | 25 + .../catch2/benchmark/catch_execution_plan.hpp | 58 + .../src/catch2/benchmark/catch_optimizer.hpp | 78 + .../catch_outlier_classification.hpp | 29 + .../benchmark/catch_sample_analysis.hpp | 31 + .../catch2/benchmark/detail/catch_analyse.cpp | 85 + .../catch2/benchmark/detail/catch_analyse.hpp | 27 + .../detail/catch_benchmark_function.cpp | 17 + .../detail/catch_benchmark_function.hpp | 107 + .../detail/catch_benchmark_stats.hpp | 48 + .../detail/catch_benchmark_stats_fwd.hpp | 23 + .../detail/catch_complete_invoke.hpp | 58 + .../benchmark/detail/catch_estimate_clock.hpp | 125 + .../catch2/benchmark/detail/catch_measure.hpp | 32 + .../catch2/benchmark/detail/catch_repeat.hpp | 36 + .../detail/catch_run_for_at_least.cpp | 31 + .../detail/catch_run_for_at_least.hpp | 65 + .../catch2/benchmark/detail/catch_stats.cpp | 393 + .../catch2/benchmark/detail/catch_stats.hpp | 60 + .../catch2/benchmark/detail/catch_timing.hpp | 31 + tests/lib/catch2/src/catch2/catch_all.hpp | 135 + tests/lib/catch2/src/catch2/catch_approx.cpp | 85 + tests/lib/catch2/src/catch2/catch_approx.hpp | 128 + .../src/catch2/catch_assertion_info.hpp | 28 + .../src/catch2/catch_assertion_result.cpp | 105 + .../src/catch2/catch_assertion_result.hpp | 60 + tests/lib/catch2/src/catch2/catch_config.cpp | 249 + tests/lib/catch2/src/catch2/catch_config.hpp | 153 + .../src/catch2/catch_get_random_seed.cpp | 18 + .../src/catch2/catch_get_random_seed.hpp | 18 + tests/lib/catch2/src/catch2/catch_message.cpp | 117 + tests/lib/catch2/src/catch2/catch_message.hpp | 150 + .../catch2/src/catch2/catch_registry_hub.cpp | 106 + .../catch2/src/catch2/catch_section_info.hpp | 42 + tests/lib/catch2/src/catch2/catch_session.cpp | 364 + tests/lib/catch2/src/catch2/catch_session.hpp | 62 + .../lib/catch2/src/catch2/catch_tag_alias.hpp | 29 + .../catch2/catch_tag_alias_autoregistrar.cpp | 24 + .../catch2/catch_tag_alias_autoregistrar.hpp | 29 + .../src/catch2/catch_template_test_macros.hpp | 124 + .../src/catch2/catch_test_case_info.cpp | 266 + .../src/catch2/catch_test_case_info.hpp | 132 + .../catch2/src/catch2/catch_test_macros.hpp | 226 + .../lib/catch2/src/catch2/catch_test_spec.cpp | 141 + .../lib/catch2/src/catch2/catch_test_spec.hpp | 119 + tests/lib/catch2/src/catch2/catch_timer.cpp | 37 + tests/lib/catch2/src/catch2/catch_timer.hpp | 27 + .../lib/catch2/src/catch2/catch_tostring.cpp | 254 + .../lib/catch2/src/catch2/catch_tostring.hpp | 674 + tests/lib/catch2/src/catch2/catch_totals.cpp | 65 + tests/lib/catch2/src/catch2/catch_totals.hpp | 41 + .../src/catch2/catch_translate_exception.cpp | 20 + .../src/catch2/catch_translate_exception.hpp | 88 + .../src/catch2/catch_user_config.hpp.in | 220 + tests/lib/catch2/src/catch2/catch_version.cpp | 43 + tests/lib/catch2/src/catch2/catch_version.hpp | 39 + .../src/catch2/catch_version_macros.hpp | 15 + .../generators/catch_generator_exception.cpp | 17 + .../generators/catch_generator_exception.hpp | 31 + .../catch2/generators/catch_generators.cpp | 42 + .../catch2/generators/catch_generators.hpp | 244 + .../generators/catch_generators_adapters.hpp | 241 + .../generators/catch_generators_all.hpp | 30 + .../generators/catch_generators_random.cpp | 41 + .../generators/catch_generators_random.hpp | 107 + .../generators/catch_generators_range.hpp | 111 + .../interfaces/catch_interfaces_all.hpp | 37 + .../interfaces/catch_interfaces_capture.cpp | 13 + .../interfaces/catch_interfaces_capture.hpp | 110 + .../interfaces/catch_interfaces_config.cpp | 13 + .../interfaces/catch_interfaces_config.hpp | 100 + .../catch_interfaces_enum_values_registry.hpp | 47 + .../interfaces/catch_interfaces_exception.cpp | 14 + .../interfaces/catch_interfaces_exception.hpp | 36 + .../catch_interfaces_generatortracker.cpp | 32 + .../catch_interfaces_generatortracker.hpp | 90 + .../catch_interfaces_registry_hub.cpp | 14 + .../catch_interfaces_registry_hub.hpp | 66 + .../interfaces/catch_interfaces_reporter.cpp | 93 + .../interfaces/catch_interfaces_reporter.hpp | 223 + .../catch_interfaces_reporter_factory.cpp | 14 + .../catch_interfaces_reporter_factory.hpp | 45 + .../catch_interfaces_tag_alias_registry.hpp | 29 + .../catch_interfaces_test_invoker.hpp | 21 + .../interfaces/catch_interfaces_testcase.cpp | 13 + .../interfaces/catch_interfaces_testcase.hpp | 30 + .../internal/catch_assertion_handler.cpp | 82 + .../internal/catch_assertion_handler.hpp | 68 + .../catch_case_insensitive_comparisons.cpp | 35 + .../catch_case_insensitive_comparisons.hpp | 30 + .../catch2/internal/catch_case_sensitive.hpp | 17 + .../src/catch2/internal/catch_clara.cpp | 464 + .../src/catch2/internal/catch_clara.hpp | 750 + .../src/catch2/internal/catch_commandline.cpp | 314 + .../src/catch2/internal/catch_commandline.hpp | 21 + .../catch2/internal/catch_compare_traits.hpp | 75 + .../internal/catch_compiler_capabilities.hpp | 447 + .../catch_config_android_logwrite.hpp | 33 + .../catch2/internal/catch_config_counter.hpp | 34 + .../internal/catch_config_prefix_messages.hpp | 29 + .../catch_config_static_analysis_support.hpp | 34 + .../catch_config_uncaught_exceptions.hpp | 46 + .../catch2/internal/catch_config_wchar.hpp | 35 + .../catch2/internal/catch_console_colour.cpp | 282 + .../catch2/internal/catch_console_colour.hpp | 141 + .../catch2/internal/catch_console_width.hpp | 19 + .../internal/catch_container_nonmembers.hpp | 73 + .../src/catch2/internal/catch_context.cpp | 41 + .../src/catch2/internal/catch_context.hpp | 51 + .../catch2/internal/catch_debug_console.cpp | 45 + .../catch2/internal/catch_debug_console.hpp | 17 + .../src/catch2/internal/catch_debugger.cpp | 120 + .../src/catch2/internal/catch_debugger.hpp | 67 + .../src/catch2/internal/catch_decomposer.cpp | 28 + .../src/catch2/internal/catch_decomposer.hpp | 451 + .../src/catch2/internal/catch_enforce.cpp | 41 + .../src/catch2/internal/catch_enforce.hpp | 54 + .../internal/catch_enum_values_registry.cpp | 73 + .../internal/catch_enum_values_registry.hpp | 36 + .../src/catch2/internal/catch_errno_guard.cpp | 16 + .../src/catch2/internal/catch_errno_guard.hpp | 27 + .../catch_exception_translator_registry.cpp | 87 + .../catch_exception_translator_registry.hpp | 30 + .../catch_fatal_condition_handler.cpp | 244 + .../catch_fatal_condition_handler.hpp | 66 + .../internal/catch_floating_point_helpers.cpp | 43 + .../internal/catch_floating_point_helpers.hpp | 108 + .../src/catch2/internal/catch_getenv.cpp | 37 + .../src/catch2/internal/catch_getenv.hpp | 20 + .../catch2/internal/catch_is_permutation.hpp | 138 + .../src/catch2/internal/catch_istream.cpp | 154 + .../src/catch2/internal/catch_istream.hpp | 54 + .../src/catch2/internal/catch_jsonwriter.cpp | 148 + .../src/catch2/internal/catch_jsonwriter.hpp | 120 + .../src/catch2/internal/catch_lazy_expr.cpp | 29 + .../src/catch2/internal/catch_lazy_expr.hpp | 40 + .../catch2/internal/catch_leak_detector.cpp | 38 + .../catch2/internal/catch_leak_detector.hpp | 19 + .../catch2/src/catch2/internal/catch_list.cpp | 120 + .../catch2/src/catch2/internal/catch_list.hpp | 43 + .../catch2/internal/catch_logical_traits.hpp | 44 + .../catch2/src/catch2/internal/catch_main.cpp | 39 + .../catch2/internal/catch_message_info.cpp | 25 + .../catch2/internal/catch_message_info.hpp | 42 + .../catch2/src/catch2/internal/catch_meta.hpp | 47 + .../internal/catch_move_and_forward.hpp | 19 + .../src/catch2/internal/catch_noncopyable.hpp | 28 + .../src/catch2/internal/catch_optional.hpp | 117 + .../catch2/internal/catch_output_redirect.cpp | 146 + .../catch2/internal/catch_output_redirect.hpp | 118 + .../catch2/internal/catch_parse_numbers.cpp | 52 + .../catch2/internal/catch_parse_numbers.hpp | 26 + .../src/catch2/internal/catch_platform.hpp | 40 + .../src/catch2/internal/catch_polyfills.cpp | 42 + .../src/catch2/internal/catch_polyfills.hpp | 21 + .../catch2/internal/catch_preprocessor.hpp | 237 + .../catch_preprocessor_internal_stringify.hpp | 19 + .../catch_preprocessor_remove_parens.hpp | 19 + .../catch_random_floating_point_helpers.hpp | 94 + .../internal/catch_random_integer_helpers.hpp | 220 + .../catch_random_number_generator.cpp | 70 + .../catch_random_number_generator.hpp | 59 + .../internal/catch_random_seed_generation.cpp | 35 + .../internal/catch_random_seed_generation.hpp | 26 + .../internal/catch_reporter_registry.cpp | 91 + .../internal/catch_reporter_registry.hpp | 55 + .../internal/catch_reporter_spec_parser.cpp | 173 + .../internal/catch_reporter_spec_parser.hpp | 85 + .../src/catch2/internal/catch_result_type.cpp | 26 + .../src/catch2/internal/catch_result_type.hpp | 57 + .../internal/catch_reusable_string_stream.cpp | 62 + .../internal/catch_reusable_string_stream.hpp | 57 + .../src/catch2/internal/catch_run_context.cpp | 700 + .../src/catch2/internal/catch_run_context.hpp | 161 + .../src/catch2/internal/catch_section.cpp | 60 + .../src/catch2/internal/catch_section.hpp | 104 + .../src/catch2/internal/catch_sharding.hpp | 41 + .../src/catch2/internal/catch_singletons.cpp | 36 + .../src/catch2/internal/catch_singletons.hpp | 45 + .../internal/catch_source_line_info.cpp | 33 + .../internal/catch_source_line_info.hpp | 37 + .../catch_startup_exception_registry.cpp | 29 + .../catch_startup_exception_registry.hpp | 29 + .../src/catch2/internal/catch_stdstreams.cpp | 24 + .../src/catch2/internal/catch_stdstreams.hpp | 22 + .../catch2/internal/catch_stream_end_stop.hpp | 30 + .../catch2/internal/catch_string_manip.cpp | 116 + .../catch2/internal/catch_string_manip.hpp | 61 + .../src/catch2/internal/catch_stringref.cpp | 66 + .../src/catch2/internal/catch_stringref.hpp | 123 + .../internal/catch_tag_alias_registry.cpp | 54 + .../internal/catch_tag_alias_registry.hpp | 33 + .../internal/catch_template_test_registry.hpp | 337 + .../internal/catch_test_case_info_hasher.cpp | 39 + .../internal/catch_test_case_info_hasher.hpp | 29 + .../catch_test_case_registry_impl.cpp | 151 + .../catch_test_case_registry_impl.hpp | 57 + .../internal/catch_test_case_tracker.cpp | 239 + .../internal/catch_test_case_tracker.hpp | 244 + .../internal/catch_test_failure_exception.cpp | 31 + .../internal/catch_test_failure_exception.hpp | 34 + .../catch2/internal/catch_test_macro_impl.hpp | 157 + .../catch2/internal/catch_test_registry.cpp | 82 + .../catch2/internal/catch_test_registry.hpp | 173 + .../catch2/internal/catch_test_run_info.hpp | 22 + .../internal/catch_test_spec_parser.cpp | 239 + .../internal/catch_test_spec_parser.hpp | 81 + .../src/catch2/internal/catch_textflow.cpp | 268 + .../src/catch2/internal/catch_textflow.hpp | 189 + .../src/catch2/internal/catch_to_string.hpp | 29 + .../internal/catch_uncaught_exceptions.cpp | 25 + .../internal/catch_uncaught_exceptions.hpp | 15 + ...ch_uniform_floating_point_distribution.hpp | 131 + .../catch_uniform_integer_distribution.hpp | 108 + .../src/catch2/internal/catch_unique_name.hpp | 20 + .../src/catch2/internal/catch_unique_ptr.hpp | 118 + .../src/catch2/internal/catch_void_type.hpp | 25 + .../internal/catch_wildcard_pattern.cpp | 47 + .../internal/catch_wildcard_pattern.hpp | 38 + .../catch2/internal/catch_windows_h_proxy.hpp | 28 + .../src/catch2/internal/catch_xmlwriter.cpp | 348 + .../src/catch2/internal/catch_xmlwriter.hpp | 152 + .../src/catch2/matchers/catch_matchers.cpp | 25 + .../src/catch2/matchers/catch_matchers.hpp | 237 + .../catch2/matchers/catch_matchers_all.hpp | 36 + .../catch_matchers_container_properties.cpp | 34 + .../catch_matchers_container_properties.hpp | 90 + .../matchers/catch_matchers_contains.hpp | 102 + .../matchers/catch_matchers_exception.cpp | 26 + .../matchers/catch_matchers_exception.hpp | 61 + .../catch_matchers_floating_point.cpp | 226 + .../catch_matchers_floating_point.hpp | 94 + .../matchers/catch_matchers_predicate.cpp | 17 + .../matchers/catch_matchers_predicate.hpp | 59 + .../matchers/catch_matchers_quantifiers.cpp | 24 + .../matchers/catch_matchers_quantifiers.hpp | 165 + .../matchers/catch_matchers_range_equals.hpp | 144 + .../catch2/matchers/catch_matchers_string.cpp | 114 + .../catch2/matchers/catch_matchers_string.hpp | 85 + .../matchers/catch_matchers_templated.cpp | 41 + .../matchers/catch_matchers_templated.hpp | 296 + .../catch2/matchers/catch_matchers_vector.hpp | 194 + .../matchers/internal/catch_matchers_impl.cpp | 25 + .../matchers/internal/catch_matchers_impl.hpp | 88 + tests/lib/catch2/src/catch2/meson.build | 392 + .../reporters/catch_reporter_automake.cpp | 37 + .../reporters/catch_reporter_automake.hpp | 38 + .../reporters/catch_reporter_common_base.cpp | 49 + .../reporters/catch_reporter_common_base.hpp | 79 + .../reporters/catch_reporter_compact.cpp | 254 + .../reporters/catch_reporter_compact.hpp | 39 + .../reporters/catch_reporter_console.cpp | 665 + .../reporters/catch_reporter_console.hpp | 67 + .../catch_reporter_cumulative_base.cpp | 158 + .../catch_reporter_cumulative_base.hpp | 151 + .../catch_reporter_event_listener.cpp | 40 + .../catch_reporter_event_listener.hpp | 60 + .../reporters/catch_reporter_helpers.cpp | 343 + .../reporters/catch_reporter_helpers.hpp | 95 + .../catch2/reporters/catch_reporter_json.cpp | 372 + .../catch2/reporters/catch_reporter_json.hpp | 95 + .../catch2/reporters/catch_reporter_junit.cpp | 309 + .../catch2/reporters/catch_reporter_junit.hpp | 56 + .../catch2/reporters/catch_reporter_multi.cpp | 197 + .../catch2/reporters/catch_reporter_multi.hpp | 72 + .../reporters/catch_reporter_registrars.cpp | 36 + .../reporters/catch_reporter_registrars.hpp | 131 + .../reporters/catch_reporter_sonarqube.cpp | 162 + .../reporters/catch_reporter_sonarqube.hpp | 59 + .../catch_reporter_streaming_base.cpp | 23 + .../catch_reporter_streaming_base.hpp | 73 + .../catch2/reporters/catch_reporter_tap.cpp | 228 + .../catch2/reporters/catch_reporter_tap.hpp | 42 + .../reporters/catch_reporter_teamcity.cpp | 177 + .../reporters/catch_reporter_teamcity.hpp | 66 + .../catch2/reporters/catch_reporter_xml.cpp | 333 + .../catch2/reporters/catch_reporter_xml.hpp | 66 + .../catch2/reporters/catch_reporters_all.hpp | 41 + tests/lib/catch2/tests/CMakeLists.txt | 683 + .../catch2/tests/ExtraTests/CMakeLists.txt | 566 + tests/lib/catch2/tests/ExtraTests/ToDo.txt | 10 + .../tests/ExtraTests/X01-PrefixedMacros.cpp | 97 + .../tests/ExtraTests/X02-DisabledMacros.cpp | 65 + .../X03-DisabledExceptions-DefaultHandler.cpp | 39 + .../X04-DisabledExceptions-CustomHandler.cpp | 40 + .../ExtraTests/X05-DeferredStaticChecks.cpp | 21 + .../ExtraTests/X10-FallbackStringifier.cpp | 35 + .../ExtraTests/X11-DisableStringification.cpp | 27 + .../ExtraTests/X12-CustomDebugBreakMacro.cpp | 26 + ...ingEventGoesBeforeAssertionIsEvaluated.cpp | 77 + .../ExtraTests/X21-PartialTestCaseEvents.cpp | 74 + .../X22-BenchmarksInCumulativeReporter.cpp | 79 + .../ExtraTests/X23-CasingInReporterNames.cpp | 41 + ...4-ListenerStdoutCaptureInMultireporter.cpp | 40 + .../X25-ListenerCanAskForCapturedStdout.cpp | 47 + ...erencesForPassingAssertionsIsRespected.cpp | 52 + .../X27-CapturedStdoutInTestCaseEvents.cpp | 82 + .../X28-ListenersGetEventsBeforeReporters.cpp | 99 + .../X29-CustomArgumentsForReporters.cpp | 60 + .../tests/ExtraTests/X30-BazelReporter.cpp | 17 + .../ExtraTests/X31-DuplicatedTestCases.cpp | 16 + .../X32-DuplicatedTestCasesDifferentTags.cpp | 17 + .../X33-DuplicatedTestCaseMethods.cpp | 22 + ...icatedTestCaseMethodsDifferentFixtures.cpp | 27 + .../X35-DuplicatedReporterNames.cpp | 31 + .../ExtraTests/X90-WindowsHeaderInclusion.cpp | 21 + .../tests/ExtraTests/X91-AmalgamatedCatch.cpp | 38 + .../catch2/tests/ExtraTests/X92-NoTests.cpp | 11 + .../tests/ExtraTests/X93-AllSkipped.cpp | 16 + .../Baselines/automake.std.approved.txt | 168 + .../Baselines/automake.sw.approved.txt | 428 + .../Baselines/automake.sw.multi.approved.txt | 417 + .../Baselines/compact.sw.approved.txt | 2695 ++ .../Baselines/compact.sw.multi.approved.txt | 2684 ++ .../Baselines/console.std.approved.txt | 1593 ++ .../Baselines/console.sw.approved.txt | 18772 +++++++++++++ .../Baselines/console.sw.multi.approved.txt | 18761 +++++++++++++ .../Baselines/console.swa4.approved.txt | 956 + .../Baselines/default.sw.multi.approved.txt | 11 + .../SelfTest/Baselines/junit.sw.approved.txt | 2119 ++ .../Baselines/junit.sw.multi.approved.txt | 2118 ++ .../Baselines/sonarqube.sw.approved.txt | 2139 ++ .../Baselines/sonarqube.sw.multi.approved.txt | 2138 ++ .../SelfTest/Baselines/tap.sw.approved.txt | 4553 ++++ .../Baselines/tap.sw.multi.approved.txt | 4542 ++++ .../Baselines/teamcity.sw.approved.txt | 1019 + .../Baselines/teamcity.sw.multi.approved.txt | 1018 + .../SelfTest/Baselines/xml.sw.approved.txt | 21724 ++++++++++++++++ .../Baselines/xml.sw.multi.approved.txt | 21723 +++++++++++++++ .../IntrospectiveTests/Algorithms.tests.cpp | 94 + .../AssertionHandler.tests.cpp | 17 + .../IntrospectiveTests/Clara.tests.cpp | 73 + .../IntrospectiveTests/CmdLine.tests.cpp | 467 + .../CmdLineHelpers.tests.cpp | 111 + .../IntrospectiveTests/ColourImpl.tests.cpp | 64 + .../IntrospectiveTests/Details.tests.cpp | 172 + .../FloatingPoint.tests.cpp | 139 + .../GeneratorsImpl.tests.cpp | 575 + .../IntrospectiveTests/Integer.tests.cpp | 224 + .../InternalBenchmark.tests.cpp | 455 + .../IntrospectiveTests/Json.tests.cpp | 152 + .../IntrospectiveTests/Parse.tests.cpp | 38 + .../IntrospectiveTests/PartTracker.tests.cpp | 254 + .../RandomNumberGeneration.tests.cpp | 607 + .../IntrospectiveTests/Reporters.tests.cpp | 330 + .../IntrospectiveTests/Sharding.tests.cpp | 45 + .../IntrospectiveTests/Stream.tests.cpp | 32 + .../IntrospectiveTests/String.tests.cpp | 212 + .../IntrospectiveTests/StringManip.tests.cpp | 94 + .../SelfTest/IntrospectiveTests/Tag.tests.cpp | 117 + .../TestCaseInfoHasher.tests.cpp | 72 + .../IntrospectiveTests/TestSpec.tests.cpp | 365 + .../TestSpecParser.tests.cpp | 55 + .../IntrospectiveTests/TextFlow.tests.cpp | 200 + .../IntrospectiveTests/ToString.tests.cpp | 97 + .../IntrospectiveTests/Traits.tests.cpp | 45 + .../IntrospectiveTests/UniquePtr.tests.cpp | 141 + .../SelfTest/IntrospectiveTests/Xml.tests.cpp | 183 + .../SelfTest/Misc/invalid-test-names.input | 1 + .../tests/SelfTest/Misc/plain-old-tests.input | 2 + .../Misc/special-characters-in-file.input | 1 + .../tests/SelfTest/TestRegistrations.cpp | 180 + .../SelfTest/TimingTests/Sleep.tests.cpp | 24 + .../SelfTest/UsageTests/Approx.tests.cpp | 218 + .../tests/SelfTest/UsageTests/BDD.tests.cpp | 106 + .../SelfTest/UsageTests/Benchmark.tests.cpp | 173 + .../tests/SelfTest/UsageTests/Class.tests.cpp | 133 + .../SelfTest/UsageTests/Compilation.tests.cpp | 422 + .../SelfTest/UsageTests/Condition.tests.cpp | 334 + .../UsageTests/Decomposition.tests.cpp | 41 + .../UsageTests/EnumToString.tests.cpp | 108 + .../SelfTest/UsageTests/Exception.tests.cpp | 204 + .../SelfTest/UsageTests/Generators.tests.cpp | 323 + .../SelfTest/UsageTests/Matchers.tests.cpp | 1144 + .../UsageTests/MatchersRanges.tests.cpp | 917 + .../SelfTest/UsageTests/Message.tests.cpp | 312 + .../tests/SelfTest/UsageTests/Misc.tests.cpp | 560 + .../tests/SelfTest/UsageTests/Skip.tests.cpp | 100 + .../UsageTests/ToStringByte.tests.cpp | 23 + .../UsageTests/ToStringChrono.tests.cpp | 51 + .../UsageTests/ToStringGeneral.tests.cpp | 200 + .../UsageTests/ToStringOptional.tests.cpp | 35 + .../UsageTests/ToStringPair.tests.cpp | 38 + .../UsageTests/ToStringTuple.tests.cpp | 54 + .../UsageTests/ToStringVariant.tests.cpp | 99 + .../UsageTests/ToStringVector.tests.cpp | 94 + .../UsageTests/ToStringWhich.tests.cpp | 186 + .../SelfTest/UsageTests/Tricky.tests.cpp | 380 + .../UsageTests/VariadicMacros.tests.cpp | 29 + .../SelfTest/helpers/parse_test_spec.cpp | 22 + .../SelfTest/helpers/parse_test_spec.hpp | 20 + .../SelfTest/helpers/range_test_helpers.hpp | 210 + .../helpers/type_with_lit_0_comparisons.hpp | 49 + .../tests/TestScripts/ConfigureTestsCommon.py | 75 + .../TestScripts/DiscoverTests/CMakeLists.txt | 22 + .../DiscoverTests/VerifyRegistration.py | 153 + .../DiscoverTests/register-tests.cpp | 16 + .../tests/TestScripts/testBazelReporter.py | 104 + .../tests/TestScripts/testBazelSharding.py | 75 + .../testConfigureDefaultReporter.py | 50 + .../tests/TestScripts/testConfigureDisable.py | 48 + .../testConfigureDisableStringification.py | 44 + .../testConfigureExperimentalRedirect.py | 49 + .../TestScripts/testPartialTestCaseEvent.py | 79 + .../tests/TestScripts/testRandomOrder.py | 77 + .../catch2/tests/TestScripts/testSharding.py | 165 + tests/lib/catch2/tests/meson.build | 77 + tests/lib/catch2/third_party/clara.hpp | 1267 + tests/lib/catch2/tools/misc/CMakeLists.txt | 11 + .../misc/appveyorBuildConfigurationScript.bat | 21 + .../tools/misc/appveyorMergeCoverageScript.py | 9 + .../tools/misc/appveyorTestRunScript.bat | 17 + .../lib/catch2/tools/misc/coverage-helper.cpp | 142 + .../tools/misc/installOpenCppCoverage.ps1 | 19 + .../lib/catch2/tools/scripts/approvalTests.py | 243 + tests/lib/catch2/tools/scripts/approve.py | 31 + .../lib/catch2/tools/scripts/buildAndTest.cmd | 17 + .../lib/catch2/tools/scripts/buildAndTest.sh | 19 + .../tools/scripts/checkConvenienceHeaders.py | 151 + .../tools/scripts/checkDuplicateFilenames.py | 14 + .../lib/catch2/tools/scripts/checkLicense.py | 46 + .../lib/catch2/tools/scripts/developBuild.py | 9 + .../extractFeaturesFromReleaseNotes.py | 92 + .../lib/catch2/tools/scripts/fixWhitespace.py | 51 + .../tools/scripts/generateAmalgamatedFiles.py | 139 + .../lib/catch2/tools/scripts/majorRelease.py | 9 + .../lib/catch2/tools/scripts/minorRelease.py | 9 + .../lib/catch2/tools/scripts/patchRelease.py | 9 + .../lib/catch2/tools/scripts/releaseCommon.py | 143 + .../lib/catch2/tools/scripts/scriptCommon.py | 4 + .../tools/scripts/updateDocumentSnippets.py | 23 + .../catch2/tools/scripts/updateDocumentToC.py | 447 + 721 files changed, 206095 insertions(+), 2496 deletions(-) delete mode 160000 lib/catch2 create mode 100644 lib/log/loguru.cpp create mode 100644 lib/log/loguru.hpp rename {lib => tests/lib}/Files/ArffFiles.cc (89%) rename {lib => tests/lib}/Files/ArffFiles.h (90%) rename {lib => tests/lib}/Files/CMakeLists.txt (100%) create mode 100644 tests/lib/catch2/.bazelrc create mode 100644 tests/lib/catch2/.clang-format create mode 100644 tests/lib/catch2/.clang-tidy create mode 100644 tests/lib/catch2/.conan/build.py create mode 100644 tests/lib/catch2/.conan/test_package/CMakeLists.txt create mode 100644 tests/lib/catch2/.conan/test_package/conanfile.py create mode 100644 tests/lib/catch2/.conan/test_package/test_package.cpp create mode 100644 tests/lib/catch2/.gitattributes create mode 100644 tests/lib/catch2/.github/FUNDING.yml create mode 100644 tests/lib/catch2/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 tests/lib/catch2/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 tests/lib/catch2/.github/pull_request_template.md create mode 100644 tests/lib/catch2/.github/workflows/linux-bazel-builds.yml create mode 100644 tests/lib/catch2/.github/workflows/linux-meson-builds.yml create mode 100644 tests/lib/catch2/.github/workflows/linux-other-builds.yml create mode 100644 tests/lib/catch2/.github/workflows/linux-simple-builds.yml create mode 100644 tests/lib/catch2/.github/workflows/mac-builds.yml create mode 100644 tests/lib/catch2/.github/workflows/package-manager-builds.yaml create mode 100644 tests/lib/catch2/.github/workflows/validate-header-guards.yml create mode 100644 tests/lib/catch2/.github/workflows/windows-simple-builds.yml create mode 100644 tests/lib/catch2/.gitignore create mode 100644 tests/lib/catch2/BUILD.bazel create mode 100644 tests/lib/catch2/CMake/Catch2Config.cmake.in create mode 100644 tests/lib/catch2/CMake/CatchConfigOptions.cmake create mode 100644 tests/lib/catch2/CMake/CatchMiscFunctions.cmake create mode 100644 tests/lib/catch2/CMake/FindGcov.cmake create mode 100644 tests/lib/catch2/CMake/FindLcov.cmake create mode 100644 tests/lib/catch2/CMake/Findcodecov.cmake create mode 100644 tests/lib/catch2/CMake/catch2-with-main.pc.in create mode 100644 tests/lib/catch2/CMake/catch2.pc.in create mode 100755 tests/lib/catch2/CMake/llvm-cov-wrapper create mode 100644 tests/lib/catch2/CMakeLists.txt create mode 100644 tests/lib/catch2/CMakePresets.json create mode 100644 tests/lib/catch2/CODE_OF_CONDUCT.md create mode 100644 tests/lib/catch2/Doxyfile create mode 100644 tests/lib/catch2/LICENSE.txt create mode 100644 tests/lib/catch2/MODULE.bazel create mode 100644 tests/lib/catch2/README.md create mode 100644 tests/lib/catch2/SECURITY.md create mode 100644 tests/lib/catch2/WORKSPACE.bazel create mode 100644 tests/lib/catch2/appveyor.yml create mode 100644 tests/lib/catch2/codecov.yml create mode 100755 tests/lib/catch2/conanfile.py create mode 100644 tests/lib/catch2/data/artwork/catch2-c-logo.png create mode 100644 tests/lib/catch2/data/artwork/catch2-hand-logo.png create mode 100644 tests/lib/catch2/data/artwork/catch2-logo-small-with-background.png create mode 100644 tests/lib/catch2/data/artwork/catch2-logo-small.png create mode 100644 tests/lib/catch2/docs/Readme.md create mode 100644 tests/lib/catch2/docs/assertions.md create mode 100644 tests/lib/catch2/docs/benchmarks.md create mode 100644 tests/lib/catch2/docs/ci-and-misc.md create mode 100644 tests/lib/catch2/docs/cmake-integration.md create mode 100644 tests/lib/catch2/docs/command-line.md create mode 100644 tests/lib/catch2/docs/commercial-users.md create mode 100644 tests/lib/catch2/docs/comparing-floating-point-numbers.md create mode 100644 tests/lib/catch2/docs/configuration.md create mode 100644 tests/lib/catch2/docs/contributing.md create mode 100644 tests/lib/catch2/docs/deprecations.md create mode 100644 tests/lib/catch2/docs/event-listeners.md create mode 100644 tests/lib/catch2/docs/faq.md create mode 100644 tests/lib/catch2/docs/generators.md create mode 100644 tests/lib/catch2/docs/limitations.md create mode 100644 tests/lib/catch2/docs/list-of-examples.md create mode 100644 tests/lib/catch2/docs/logging.md create mode 100644 tests/lib/catch2/docs/matchers.md create mode 100644 tests/lib/catch2/docs/migrate-v2-to-v3.md create mode 100644 tests/lib/catch2/docs/opensource-users.md create mode 100644 tests/lib/catch2/docs/other-macros.md create mode 100644 tests/lib/catch2/docs/own-main.md create mode 100644 tests/lib/catch2/docs/release-notes.md create mode 100644 tests/lib/catch2/docs/release-process.md create mode 100644 tests/lib/catch2/docs/reporter-events.md create mode 100644 tests/lib/catch2/docs/reporters.md create mode 100644 tests/lib/catch2/docs/skipping-passing-failing.md create mode 100644 tests/lib/catch2/docs/test-cases-and-sections.md create mode 100644 tests/lib/catch2/docs/test-fixtures.md create mode 100644 tests/lib/catch2/docs/tostring.md create mode 100644 tests/lib/catch2/docs/tutorial.md create mode 100644 tests/lib/catch2/docs/usage-tips.md create mode 100644 tests/lib/catch2/docs/why-catch.md create mode 100644 tests/lib/catch2/examples/010-TestCase.cpp create mode 100644 tests/lib/catch2/examples/020-TestCase-1.cpp create mode 100644 tests/lib/catch2/examples/020-TestCase-2.cpp create mode 100644 tests/lib/catch2/examples/030-Asn-Require-Check.cpp create mode 100644 tests/lib/catch2/examples/100-Fix-Section.cpp create mode 100644 tests/lib/catch2/examples/110-Fix-ClassFixture.cpp create mode 100644 tests/lib/catch2/examples/120-Bdd-ScenarioGivenWhenThen.cpp create mode 100644 tests/lib/catch2/examples/210-Evt-EventListeners.cpp create mode 100644 tests/lib/catch2/examples/231-Cfg-OutputStreams.cpp create mode 100644 tests/lib/catch2/examples/232-Cfg-CustomMain.cpp create mode 100644 tests/lib/catch2/examples/300-Gen-OwnGenerator.cpp create mode 100644 tests/lib/catch2/examples/301-Gen-MapTypeConversion.cpp create mode 100644 tests/lib/catch2/examples/302-Gen-Table.cpp create mode 100644 tests/lib/catch2/examples/310-Gen-VariablesInGenerators.cpp create mode 100644 tests/lib/catch2/examples/311-Gen-CustomCapture.cpp create mode 100644 tests/lib/catch2/examples/CMakeLists.txt create mode 100644 tests/lib/catch2/extras/Catch.cmake create mode 100644 tests/lib/catch2/extras/CatchAddTests.cmake create mode 100644 tests/lib/catch2/extras/CatchShardTests.cmake create mode 100644 tests/lib/catch2/extras/CatchShardTestsImpl.cmake create mode 100644 tests/lib/catch2/extras/ParseAndAddCatchTests.cmake create mode 100644 tests/lib/catch2/extras/catch_amalgamated.cpp create mode 100644 tests/lib/catch2/extras/catch_amalgamated.hpp create mode 100644 tests/lib/catch2/extras/gdbinit create mode 100644 tests/lib/catch2/extras/lldbinit create mode 100644 tests/lib/catch2/fuzzing/CMakeLists.txt create mode 100644 tests/lib/catch2/fuzzing/NullOStream.cpp create mode 100644 tests/lib/catch2/fuzzing/NullOStream.h create mode 100755 tests/lib/catch2/fuzzing/build_fuzzers.sh create mode 100644 tests/lib/catch2/fuzzing/fuzz_TestSpecParser.cpp create mode 100644 tests/lib/catch2/fuzzing/fuzz_XmlWriter.cpp create mode 100644 tests/lib/catch2/fuzzing/fuzz_textflow.cpp create mode 100644 tests/lib/catch2/mdsnippets.json create mode 100644 tests/lib/catch2/meson.build create mode 100644 tests/lib/catch2/meson_options.txt create mode 100644 tests/lib/catch2/src/CMakeLists.txt create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_benchmark.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_benchmark_all.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_chronometer.cpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_chronometer.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_clock.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_constructor.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_environment.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_estimate.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_execution_plan.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_optimizer.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_outlier_classification.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/catch_sample_analysis.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_analyse.cpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_analyse.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_benchmark_function.cpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_benchmark_function.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_benchmark_stats.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_benchmark_stats_fwd.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_complete_invoke.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_estimate_clock.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_measure.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_repeat.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_run_for_at_least.cpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_run_for_at_least.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_stats.cpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_stats.hpp create mode 100644 tests/lib/catch2/src/catch2/benchmark/detail/catch_timing.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_all.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_approx.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_approx.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_assertion_info.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_assertion_result.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_assertion_result.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_config.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_config.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_get_random_seed.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_get_random_seed.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_message.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_message.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_registry_hub.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_section_info.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_session.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_session.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_tag_alias.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_tag_alias_autoregistrar.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_tag_alias_autoregistrar.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_template_test_macros.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_test_case_info.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_test_case_info.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_test_macros.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_test_spec.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_test_spec.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_timer.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_timer.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_tostring.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_tostring.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_totals.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_totals.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_translate_exception.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_translate_exception.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_user_config.hpp.in create mode 100644 tests/lib/catch2/src/catch2/catch_version.cpp create mode 100644 tests/lib/catch2/src/catch2/catch_version.hpp create mode 100644 tests/lib/catch2/src/catch2/catch_version_macros.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generator_exception.cpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generator_exception.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators.cpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators_adapters.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators_all.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators_random.cpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators_random.hpp create mode 100644 tests/lib/catch2/src/catch2/generators/catch_generators_range.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_all.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_capture.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_capture.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_config.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_config.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_enum_values_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_exception.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_exception.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_generatortracker.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_generatortracker.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_registry_hub.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_registry_hub.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_reporter.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_reporter.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_reporter_factory.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_reporter_factory.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_tag_alias_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_test_invoker.hpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_testcase.cpp create mode 100644 tests/lib/catch2/src/catch2/interfaces/catch_interfaces_testcase.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_assertion_handler.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_assertion_handler.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_case_insensitive_comparisons.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_case_insensitive_comparisons.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_case_sensitive.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_clara.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_clara.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_commandline.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_commandline.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_compare_traits.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_compiler_capabilities.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_android_logwrite.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_counter.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_prefix_messages.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_static_analysis_support.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_uncaught_exceptions.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_config_wchar.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_console_colour.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_console_colour.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_console_width.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_container_nonmembers.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_context.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_context.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_debug_console.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_debug_console.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_debugger.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_debugger.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_decomposer.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_decomposer.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_enforce.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_enforce.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_enum_values_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_enum_values_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_errno_guard.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_errno_guard.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_exception_translator_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_exception_translator_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_fatal_condition_handler.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_fatal_condition_handler.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_floating_point_helpers.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_floating_point_helpers.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_getenv.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_getenv.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_is_permutation.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_istream.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_istream.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_jsonwriter.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_jsonwriter.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_lazy_expr.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_lazy_expr.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_leak_detector.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_leak_detector.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_list.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_list.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_logical_traits.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_main.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_message_info.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_message_info.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_meta.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_move_and_forward.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_noncopyable.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_optional.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_output_redirect.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_output_redirect.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_parse_numbers.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_parse_numbers.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_platform.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_polyfills.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_polyfills.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_preprocessor.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_preprocessor_internal_stringify.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_preprocessor_remove_parens.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_floating_point_helpers.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_integer_helpers.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_number_generator.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_number_generator.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_seed_generation.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_random_seed_generation.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reporter_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reporter_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reporter_spec_parser.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reporter_spec_parser.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_result_type.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_result_type.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reusable_string_stream.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_reusable_string_stream.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_run_context.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_run_context.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_section.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_section.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_sharding.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_singletons.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_singletons.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_source_line_info.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_source_line_info.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_startup_exception_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_startup_exception_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_stdstreams.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_stdstreams.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_stream_end_stop.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_string_manip.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_string_manip.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_stringref.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_stringref.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_tag_alias_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_tag_alias_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_template_test_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_info_hasher.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_info_hasher.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_registry_impl.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_registry_impl.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_tracker.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_case_tracker.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_failure_exception.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_failure_exception.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_macro_impl.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_registry.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_registry.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_run_info.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_spec_parser.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_test_spec_parser.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_textflow.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_textflow.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_to_string.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_uncaught_exceptions.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_uncaught_exceptions.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_uniform_floating_point_distribution.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_uniform_integer_distribution.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_unique_name.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_unique_ptr.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_void_type.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_wildcard_pattern.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_wildcard_pattern.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_windows_h_proxy.hpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_xmlwriter.cpp create mode 100644 tests/lib/catch2/src/catch2/internal/catch_xmlwriter.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_all.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_container_properties.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_container_properties.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_contains.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_exception.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_exception.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_floating_point.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_floating_point.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_predicate.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_predicate.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_quantifiers.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_quantifiers.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_range_equals.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_string.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_string.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_templated.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_templated.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/catch_matchers_vector.hpp create mode 100644 tests/lib/catch2/src/catch2/matchers/internal/catch_matchers_impl.cpp create mode 100644 tests/lib/catch2/src/catch2/matchers/internal/catch_matchers_impl.hpp create mode 100644 tests/lib/catch2/src/catch2/meson.build create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_automake.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_automake.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_common_base.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_common_base.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_compact.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_compact.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_console.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_console.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_cumulative_base.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_cumulative_base.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_event_listener.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_event_listener.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_helpers.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_helpers.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_json.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_json.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_junit.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_junit.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_multi.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_multi.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_registrars.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_registrars.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_sonarqube.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_sonarqube.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_streaming_base.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_streaming_base.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_tap.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_tap.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_teamcity.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_teamcity.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_xml.cpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporter_xml.hpp create mode 100644 tests/lib/catch2/src/catch2/reporters/catch_reporters_all.hpp create mode 100644 tests/lib/catch2/tests/CMakeLists.txt create mode 100644 tests/lib/catch2/tests/ExtraTests/CMakeLists.txt create mode 100644 tests/lib/catch2/tests/ExtraTests/ToDo.txt create mode 100644 tests/lib/catch2/tests/ExtraTests/X01-PrefixedMacros.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X02-DisabledMacros.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X03-DisabledExceptions-DefaultHandler.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X04-DisabledExceptions-CustomHandler.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X05-DeferredStaticChecks.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X10-FallbackStringifier.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X11-DisableStringification.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X12-CustomDebugBreakMacro.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X20-AssertionStartingEventGoesBeforeAssertionIsEvaluated.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X21-PartialTestCaseEvents.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X22-BenchmarksInCumulativeReporter.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X23-CasingInReporterNames.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X24-ListenerStdoutCaptureInMultireporter.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X25-ListenerCanAskForCapturedStdout.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X26-ReporterPreferencesForPassingAssertionsIsRespected.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X27-CapturedStdoutInTestCaseEvents.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X28-ListenersGetEventsBeforeReporters.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X29-CustomArgumentsForReporters.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X30-BazelReporter.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X31-DuplicatedTestCases.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X32-DuplicatedTestCasesDifferentTags.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X33-DuplicatedTestCaseMethods.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X34-DuplicatedTestCaseMethodsDifferentFixtures.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X35-DuplicatedReporterNames.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X90-WindowsHeaderInclusion.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X91-AmalgamatedCatch.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X92-NoTests.cpp create mode 100644 tests/lib/catch2/tests/ExtraTests/X93-AllSkipped.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/automake.std.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/automake.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/automake.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/compact.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/compact.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/console.std.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/console.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/console.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/console.swa4.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/default.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/junit.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/junit.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/sonarqube.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/tap.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/tap.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/teamcity.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/xml.sw.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/Baselines/xml.sw.multi.approved.txt create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Algorithms.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/AssertionHandler.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Clara.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/CmdLine.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/CmdLineHelpers.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/ColourImpl.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Details.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/FloatingPoint.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Integer.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/InternalBenchmark.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Json.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Parse.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/PartTracker.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/RandomNumberGeneration.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Reporters.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Sharding.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Stream.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/String.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/StringManip.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Tag.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/TestCaseInfoHasher.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/TestSpec.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/TestSpecParser.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/TextFlow.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/ToString.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Traits.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/UniquePtr.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/IntrospectiveTests/Xml.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/Misc/invalid-test-names.input create mode 100644 tests/lib/catch2/tests/SelfTest/Misc/plain-old-tests.input create mode 100644 tests/lib/catch2/tests/SelfTest/Misc/special-characters-in-file.input create mode 100644 tests/lib/catch2/tests/SelfTest/TestRegistrations.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/TimingTests/Sleep.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Approx.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/BDD.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Benchmark.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Class.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Compilation.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Condition.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Decomposition.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/EnumToString.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Exception.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Generators.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Matchers.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/MatchersRanges.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Message.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Misc.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Skip.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringByte.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringChrono.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringGeneral.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringOptional.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringPair.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringTuple.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringVariant.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringVector.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/ToStringWhich.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/Tricky.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/UsageTests/VariadicMacros.tests.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/helpers/parse_test_spec.cpp create mode 100644 tests/lib/catch2/tests/SelfTest/helpers/parse_test_spec.hpp create mode 100644 tests/lib/catch2/tests/SelfTest/helpers/range_test_helpers.hpp create mode 100644 tests/lib/catch2/tests/SelfTest/helpers/type_with_lit_0_comparisons.hpp create mode 100644 tests/lib/catch2/tests/TestScripts/ConfigureTestsCommon.py create mode 100644 tests/lib/catch2/tests/TestScripts/DiscoverTests/CMakeLists.txt create mode 100644 tests/lib/catch2/tests/TestScripts/DiscoverTests/VerifyRegistration.py create mode 100644 tests/lib/catch2/tests/TestScripts/DiscoverTests/register-tests.cpp create mode 100644 tests/lib/catch2/tests/TestScripts/testBazelReporter.py create mode 100755 tests/lib/catch2/tests/TestScripts/testBazelSharding.py create mode 100644 tests/lib/catch2/tests/TestScripts/testConfigureDefaultReporter.py create mode 100644 tests/lib/catch2/tests/TestScripts/testConfigureDisable.py create mode 100644 tests/lib/catch2/tests/TestScripts/testConfigureDisableStringification.py create mode 100644 tests/lib/catch2/tests/TestScripts/testConfigureExperimentalRedirect.py create mode 100755 tests/lib/catch2/tests/TestScripts/testPartialTestCaseEvent.py create mode 100755 tests/lib/catch2/tests/TestScripts/testRandomOrder.py create mode 100755 tests/lib/catch2/tests/TestScripts/testSharding.py create mode 100644 tests/lib/catch2/tests/meson.build create mode 100644 tests/lib/catch2/third_party/clara.hpp create mode 100644 tests/lib/catch2/tools/misc/CMakeLists.txt create mode 100644 tests/lib/catch2/tools/misc/appveyorBuildConfigurationScript.bat create mode 100644 tests/lib/catch2/tools/misc/appveyorMergeCoverageScript.py create mode 100644 tests/lib/catch2/tools/misc/appveyorTestRunScript.bat create mode 100644 tests/lib/catch2/tools/misc/coverage-helper.cpp create mode 100644 tests/lib/catch2/tools/misc/installOpenCppCoverage.ps1 create mode 100755 tests/lib/catch2/tools/scripts/approvalTests.py create mode 100755 tests/lib/catch2/tools/scripts/approve.py create mode 100644 tests/lib/catch2/tools/scripts/buildAndTest.cmd create mode 100755 tests/lib/catch2/tools/scripts/buildAndTest.sh create mode 100755 tests/lib/catch2/tools/scripts/checkConvenienceHeaders.py create mode 100755 tests/lib/catch2/tools/scripts/checkDuplicateFilenames.py create mode 100755 tests/lib/catch2/tools/scripts/checkLicense.py create mode 100755 tests/lib/catch2/tools/scripts/developBuild.py create mode 100644 tests/lib/catch2/tools/scripts/extractFeaturesFromReleaseNotes.py create mode 100755 tests/lib/catch2/tools/scripts/fixWhitespace.py create mode 100755 tests/lib/catch2/tools/scripts/generateAmalgamatedFiles.py create mode 100755 tests/lib/catch2/tools/scripts/majorRelease.py create mode 100755 tests/lib/catch2/tools/scripts/minorRelease.py create mode 100755 tests/lib/catch2/tools/scripts/patchRelease.py create mode 100644 tests/lib/catch2/tools/scripts/releaseCommon.py create mode 100644 tests/lib/catch2/tools/scripts/scriptCommon.py create mode 100755 tests/lib/catch2/tools/scripts/updateDocumentSnippets.py create mode 100755 tests/lib/catch2/tools/scripts/updateDocumentToC.py diff --git a/.gitmodules b/.gitmodules index 549c379..53dd13c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,8 +3,8 @@ url = https://github.com/rmontanana/mdlp main = main update = merge -[submodule "lib/catch2"] - path = lib/catch2 +[submodule "tests/lib/catch2"] + path = tests/lib/catch2 main = v2.x update = merge url = https://github.com/catchorg/Catch2.git diff --git a/.vscode/launch.json b/.vscode/launch.json index 300bfba..73b7f7d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -16,7 +16,7 @@ "name": "test", "program": "${workspaceFolder}/build_debug/tests/TestBayesNet", "args": [ - "Block Update" + "\"Test Cannot build dataset with wrong data vector\"" ], "cwd": "${workspaceFolder}/build_debug/tests" }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fda348..a7a18c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add the Library logo generated with to README.md -- Add link to the coverage report in the README.md coverage label +- Add link to the coverage report in the README.md coverage label. +- Add the *convergence_best* hyperparameter to the BoostAODE class, to control the way the prior accuracy is computed if convergence is set. Default value is *false*. + +### Internal + +- Refactor library ArffFile to limit the number of samples with a parameter. +- Refactor tests libraries location to test/lib +- Refactor loadDataset function in tests. ## [1.0.5] 2024-04-20 diff --git a/CMakeLists.txt b/CMakeLists.txt index c8f3edc..3ab746e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,14 +66,14 @@ add_git_submodule("lib/json") # Subdirectories # -------------- add_subdirectory(config) -add_subdirectory(lib/Files) add_subdirectory(bayesnet) # Testing # ------- if (ENABLE_TESTING) - MESSAGE("Testing enabled") - add_git_submodule("lib/catch2") +MESSAGE("Testing enabled") + add_git_submodule("tests/lib/catch2") + add_subdirectory(tests/lib/Files) include(CTest) add_subdirectory(tests) endif (ENABLE_TESTING) diff --git a/README.md b/README.md index 82b171f..b290e50 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=rmontanana_BayesNet&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=rmontanana_BayesNet) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=rmontanana_BayesNet&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=rmontanana_BayesNet) ![Gitea Last Commit](https://img.shields.io/gitea/last-commit/rmontanana/bayesnet?gitea_url=https://gitea.rmontanana.es:3000&logo=gitea) -[![Coverage Badge](https://img.shields.io/badge/Coverage-97,2%25-green)](html/index.html) +[![Coverage Badge](https://img.shields.io/badge/Coverage-97,1%25-green)](html/index.html) Bayesian Network Classifiers using libtorch from scratch @@ -47,11 +47,6 @@ make test ```bash make coverage -``` - -or - -```bash make viewcoverage ``` diff --git a/bayesnet/ensembles/BoostAODE.cc b/bayesnet/ensembles/BoostAODE.cc index 7992ae3..1e855c9 100644 --- a/bayesnet/ensembles/BoostAODE.cc +++ b/bayesnet/ensembles/BoostAODE.cc @@ -13,13 +13,14 @@ #include "bayesnet/feature_selection/FCBF.h" #include "bayesnet/feature_selection/IWSS.h" #include "BoostAODE.h" +#include "lib/log/loguru.cpp" namespace bayesnet { BoostAODE::BoostAODE(bool predict_voting) : Ensemble(predict_voting) { validHyperparameters = { - "maxModels", "bisection", "order", "convergence", "threshold", + "maxModels", "bisection", "order", "convergence", "convergence_best", "threshold", "select_features", "maxTolerance", "predict_voting", "block_update" }; @@ -70,6 +71,10 @@ namespace bayesnet { convergence = hyperparameters["convergence"]; hyperparameters.erase("convergence"); } + if (hyperparameters.contains("convergence_best")) { + convergence_best = hyperparameters["convergence_best"]; + hyperparameters.erase("convergence_best"); + } if (hyperparameters.contains("bisection")) { bisection = hyperparameters["bisection"]; hyperparameters.erase("bisection"); @@ -262,6 +267,13 @@ namespace bayesnet { } void BoostAODE::trainModel(const torch::Tensor& weights) { + // + // Logging setup + // + loguru::set_thread_name("BoostAODE"); + loguru::g_stderr_verbosity = loguru::Verbosity_OFF; + loguru::add_file("boostAODE.log", loguru::Truncate, loguru::Verbosity_MAX); + // Algorithm based on the adaboost algorithm for classification // as explained in Ensemble methods (Zhi-Hua Zhou, 2012) fitted = true; @@ -304,8 +316,9 @@ namespace bayesnet { { return std::find(begin(featuresUsed), end(featuresUsed), x) != end(featuresUsed);}), end(featureSelection) ); - int k = pow(2, tolerance); + int k = bisection ? pow(2, tolerance) : 1; int counter = 0; // The model counter of the current pack + VLOG_SCOPE_F(1, "counter=%d k=%d featureSelection.size: %zu", counter, k, featureSelection.size()); while (counter++ < k && featureSelection.size() > 0) { auto feature = featureSelection[0]; featureSelection.erase(featureSelection.begin()); @@ -324,6 +337,7 @@ namespace bayesnet { models.push_back(std::move(model)); significanceModels.push_back(alpha_t); n_models++; + VLOG_SCOPE_F(2, "numItemsPack: %d n_models: %d featuresUsed: %zu", numItemsPack, n_models, featuresUsed.size()); } if (block_update) { std::tie(weights_, alpha_t, finished) = update_weights_block(k, y_train, weights_); @@ -337,20 +351,28 @@ namespace bayesnet { improvement = accuracy - priorAccuracy; } if (improvement < convergence_threshold) { + VLOG_SCOPE_F(3, " (improvement=threshold) Reset. tolerance: %d numItemsPack: %d improvement: %f prior: %f current: %f", tolerance, numItemsPack, improvement, priorAccuracy, accuracy); tolerance = 0; // Reset the counter if the model performs better numItemsPack = 0; } - // Keep the best accuracy until now as the prior accuracy - priorAccuracy = std::max(accuracy, priorAccuracy); - // priorAccuracy = accuracy; + if (convergence_best) { + // Keep the best accuracy until now as the prior accuracy + priorAccuracy = std::max(accuracy, priorAccuracy); + } else { + // Keep the last accuray obtained as the prior accuracy + priorAccuracy = accuracy; + } } + VLOG_SCOPE_F(1, "tolerance: %d featuresUsed.size: %zu features.size: %zu", tolerance, featuresUsed.size(), features.size()); finished = finished || tolerance > maxTolerance || featuresUsed.size() == features.size(); } if (tolerance > maxTolerance) { if (numItemsPack < n_models) { notes.push_back("Convergence threshold reached & " + std::to_string(numItemsPack) + " models eliminated"); + VLOG_SCOPE_F(4, "Convergence threshold reached & %d models eliminated of %d", numItemsPack, n_models); for (int i = 0; i < numItemsPack; ++i) { significanceModels.pop_back(); models.pop_back(); @@ -358,6 +380,7 @@ namespace bayesnet { } } else { notes.push_back("Convergence threshold reached & 0 models eliminated"); + VLOG_SCOPE_F(4, "Convergence threshold reached & 0 models eliminated n_models=%d numItemsPack=%d", n_models, numItemsPack); } } if (featuresUsed.size() != features.size()) { diff --git a/bayesnet/ensembles/BoostAODE.h b/bayesnet/ensembles/BoostAODE.h index 7150db9..2e2851b 100644 --- a/bayesnet/ensembles/BoostAODE.h +++ b/bayesnet/ensembles/BoostAODE.h @@ -39,6 +39,7 @@ namespace bayesnet { int maxTolerance = 3; std::string order_algorithm; // order to process the KBest features asc, desc, rand bool convergence = true; //if true, stop when the model does not improve + bool convergence_best = false; // wether to keep the best accuracy to the moment or the last accuracy as prior accuracy bool selectFeatures = false; // if true, use feature selection std::string select_features_algorithm = Orders.DESC; // Selected feature selection algorithm FeatureSelect* featureSelector = nullptr; diff --git a/docs/BoostAODE.md b/docs/BoostAODE.md index 57916c4..d3ed8df 100644 --- a/docs/BoostAODE.md +++ b/docs/BoostAODE.md @@ -5,6 +5,7 @@ The hyperparameters defined in the algorithm are: - ***bisection*** (*boolean*): If set to true allows the algorithm to add *k* models at once (as specified in the algorithm) to the ensemble. Default value: *true*. +- ***biesection_best*** (*boolean*): If set to *true*, the algorithm will take as *priorAccuracy* the best accuracy computed. If set to *false⁺ it will take the last accuracy as *priorAccuracy*. Default value: *false*. - ***order*** (*{"asc", "desc", "rand"}*): Sets the order (ascending/descending/random) in which dataset variables will be processed to choose the parents of the *SPODEs*. Default value: *"desc"*. diff --git a/docs/algorithm.md b/docs/algorithm.md index b5ad88c..714a911 100644 --- a/docs/algorithm.md +++ b/docs/algorithm.md @@ -105,8 +105,7 @@ 2. $numItemsPack \leftarrow 0$ - 10. If - $(Vars == \emptyset \lor tolerance>maxTolerance) \; finished \leftarrow True$ + 10. If $(Vars == \emptyset \lor tolerance>maxTolerance) \; finished \leftarrow True$ 11. $lastAccuracy \leftarrow max(lastAccuracy, actualAccuracy)$ diff --git a/html/bayesnet/BaseClassifier.h.func-c.html b/html/bayesnet/BaseClassifier.h.func-c.html index 21a4102..b06cf33 100644 --- a/html/bayesnet/BaseClassifier.h.func-c.html +++ b/html/bayesnet/BaseClassifier.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet14BaseClassifierD0Ev - 273 + 241 @@ -79,7 +79,7 @@ _ZN8bayesnet14BaseClassifierD2Ev - 273 + 241 diff --git a/html/bayesnet/BaseClassifier.h.func.html b/html/bayesnet/BaseClassifier.h.func.html index d605349..9d0a938 100644 --- a/html/bayesnet/BaseClassifier.h.func.html +++ b/html/bayesnet/BaseClassifier.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet14BaseClassifierD0Ev - 273 + 241 @@ -79,7 +79,7 @@ _ZN8bayesnet14BaseClassifierD2Ev - 273 + 241 diff --git a/html/bayesnet/BaseClassifier.h.gcov.html b/html/bayesnet/BaseClassifier.h.gcov.html index b02c7b5..a79420f 100644 --- a/html/bayesnet/BaseClassifier.h.gcov.html +++ b/html/bayesnet/BaseClassifier.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % @@ -80,7 +80,7 @@ 18 : virtual BaseClassifier& fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) = 0; 19 : virtual BaseClassifier& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) = 0; 20 : virtual BaseClassifier& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) = 0; - 21 273 : virtual ~BaseClassifier() = default; + 21 241 : virtual ~BaseClassifier() = default; 22 : torch::Tensor virtual predict(torch::Tensor& X) = 0; 23 : std::vector<int> virtual predict(std::vector<std::vector<int >>& X) = 0; 24 : torch::Tensor virtual predict_proba(torch::Tensor& X) = 0; diff --git a/html/bayesnet/classifiers/Classifier.cc.func-c.html b/html/bayesnet/classifiers/Classifier.cc.func-c.html index 21dea48..93c25c1 100644 --- a/html/bayesnet/classifiers/Classifier.cc.func-c.html +++ b/html/bayesnet/classifiers/Classifier.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,168 +65,168 @@ _ZN8bayesnet10Classifier17topological_orderB5cxx11Ev - 1 + 11 _ZNK8bayesnet10Classifier8dump_cptB5cxx11Ev - 1 + 11 _ZN8bayesnet10Classifier5scoreERSt6vectorIS1_IiSaIiEESaIS3_EERS3_ - 4 + 44 _ZN8bayesnet10Classifier7predictERSt6vectorIS1_IiSaIiEESaIS3_EE - 4 + 44 _ZNK8bayesnet10Classifier17getNumberOfStatesEv - 6 + 66 _ZNK8bayesnet10Classifier4showB5cxx11Ev - 6 + 66 _ZN8bayesnet10Classifier18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 19 - - - - - _ZN8bayesnet10Classifier3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - - 28 + 231 _ZN8bayesnet10Classifier5scoreERN2at6TensorES3_ - 28 + 308 + + + + + _ZN8bayesnet10Classifier3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE + + 322 _ZN8bayesnet10Classifier3fitERSt6vectorIS1_IiSaIiEESaIS3_EERS3_RKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISD_EERKSD_RSt3mapISD_S3_St4lessISD_ESaISt4pairISI_S3_EEE - 32 + 360 _ZNK8bayesnet10Classifier16getNumberOfEdgesEv - 40 + 475 _ZNK8bayesnet10Classifier16getNumberOfNodesEv - 40 + 475 _ZN8bayesnet10Classifier13predict_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 67 + 766 _ZNK8bayesnet10Classifier17getClassNumStatesEv - 76 + 877 _ZN8bayesnet10Classifier12buildDatasetERN2at6TensorE - 77 + 888 _ZN8bayesnet10Classifier3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 99 + 1089 _ZN8bayesnet10Classifier3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEERKS2_ - 136 - - - - - _ZN8bayesnet10Classifier7predictERN2at6TensorE - - 245 + 1686 _ZN8bayesnet10Classifier10trainModelERKN2at6TensorE - 251 + 2951 _ZN8bayesnet10Classifier8addNodesEv - 251 + 2951 + + + + + _ZN8bayesnet10Classifier7predictERN2at6TensorE + + 3262 _ZN8bayesnet10Classifier18checkFitParametersEv - 291 + 3413 _ZN8bayesnet10Classifier5buildERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE - 291 + 3413 _ZN8bayesnet10Classifier13predict_probaERN2at6TensorE - 306 + 3562 _ZN8bayesnet10ClassifierC2ENS_7NetworkE - 413 + 4750 diff --git a/html/bayesnet/classifiers/Classifier.cc.func.html b/html/bayesnet/classifiers/Classifier.cc.func.html index 675fe07..f884e13 100644 --- a/html/bayesnet/classifiers/Classifier.cc.func.html +++ b/html/bayesnet/classifiers/Classifier.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,168 +65,168 @@ _ZN8bayesnet10Classifier10trainModelERKN2at6TensorE - 251 + 2951 _ZN8bayesnet10Classifier12buildDatasetERN2at6TensorE - 77 + 888 _ZN8bayesnet10Classifier13predict_probaERN2at6TensorE - 306 + 3562 _ZN8bayesnet10Classifier13predict_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 67 + 766 _ZN8bayesnet10Classifier17topological_orderB5cxx11Ev - 1 + 11 _ZN8bayesnet10Classifier18checkFitParametersEv - 291 + 3413 _ZN8bayesnet10Classifier18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 19 + 231 _ZN8bayesnet10Classifier3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 99 + 1089 _ZN8bayesnet10Classifier3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEERKS2_ - 136 + 1686 _ZN8bayesnet10Classifier3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 28 + 322 _ZN8bayesnet10Classifier3fitERSt6vectorIS1_IiSaIiEESaIS3_EERS3_RKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISD_EERKSD_RSt3mapISD_S3_St4lessISD_ESaISt4pairISI_S3_EEE - 32 + 360 _ZN8bayesnet10Classifier5buildERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE - 291 + 3413 _ZN8bayesnet10Classifier5scoreERN2at6TensorES3_ - 28 + 308 _ZN8bayesnet10Classifier5scoreERSt6vectorIS1_IiSaIiEESaIS3_EERS3_ - 4 + 44 _ZN8bayesnet10Classifier7predictERN2at6TensorE - 245 + 3262 _ZN8bayesnet10Classifier7predictERSt6vectorIS1_IiSaIiEESaIS3_EE - 4 + 44 _ZN8bayesnet10Classifier8addNodesEv - 251 + 2951 _ZN8bayesnet10ClassifierC2ENS_7NetworkE - 413 + 4750 _ZNK8bayesnet10Classifier16getNumberOfEdgesEv - 40 + 475 _ZNK8bayesnet10Classifier16getNumberOfNodesEv - 40 + 475 _ZNK8bayesnet10Classifier17getClassNumStatesEv - 76 + 877 _ZNK8bayesnet10Classifier17getNumberOfStatesEv - 6 + 66 _ZNK8bayesnet10Classifier4showB5cxx11Ev - 6 + 66 _ZNK8bayesnet10Classifier8dump_cptB5cxx11Ev - 1 + 11 diff --git a/html/bayesnet/classifiers/Classifier.cc.gcov.html b/html/bayesnet/classifiers/Classifier.cc.gcov.html index 4938421..16f5243 100644 --- a/html/bayesnet/classifiers/Classifier.cc.gcov.html +++ b/html/bayesnet/classifiers/Classifier.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -71,188 +71,188 @@ 9 : #include "Classifier.h" 10 : 11 : namespace bayesnet { - 12 413 : Classifier::Classifier(Network model) : model(model), m(0), n(0), metrics(Metrics()), fitted(false) {} + 12 4750 : Classifier::Classifier(Network model) : model(model), m(0), n(0), metrics(Metrics()), fitted(false) {} 13 : const std::string CLASSIFIER_NOT_FITTED = "Classifier has not been fitted"; - 14 291 : Classifier& Classifier::build(const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) + 14 3413 : Classifier& Classifier::build(const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) 15 : { - 16 291 : this->features = features; - 17 291 : this->className = className; - 18 291 : this->states = states; - 19 291 : m = dataset.size(1); - 20 291 : n = features.size(); - 21 291 : checkFitParameters(); - 22 283 : auto n_classes = states.at(className).size(); - 23 283 : metrics = Metrics(dataset, features, className, n_classes); - 24 283 : model.initialize(); - 25 283 : buildModel(weights); - 26 283 : trainModel(weights); - 27 279 : fitted = true; - 28 279 : return *this; + 16 3413 : this->features = features; + 17 3413 : this->className = className; + 18 3413 : this->states = states; + 19 3413 : m = dataset.size(1); + 20 3413 : n = features.size(); + 21 3413 : checkFitParameters(); + 22 3325 : auto n_classes = states.at(className).size(); + 23 3325 : metrics = Metrics(dataset, features, className, n_classes); + 24 3325 : model.initialize(); + 25 3325 : buildModel(weights); + 26 3325 : trainModel(weights); + 27 3277 : fitted = true; + 28 3277 : return *this; 29 : } - 30 77 : void Classifier::buildDataset(torch::Tensor& ytmp) + 30 888 : void Classifier::buildDataset(torch::Tensor& ytmp) 31 : { 32 : try { - 33 77 : auto yresized = torch::transpose(ytmp.view({ ytmp.size(0), 1 }), 0, 1); - 34 239 : dataset = torch::cat({ dataset, yresized }, 0); - 35 77 : } - 36 4 : catch (const std::exception& e) { - 37 4 : std::stringstream oss; - 38 4 : oss << "* Error in X and y dimensions *\n"; - 39 4 : oss << "X dimensions: " << dataset.sizes() << "\n"; - 40 4 : oss << "y dimensions: " << ytmp.sizes(); - 41 4 : throw std::runtime_error(oss.str()); - 42 8 : } - 43 154 : } - 44 251 : void Classifier::trainModel(const torch::Tensor& weights) + 33 888 : auto yresized = torch::transpose(ytmp.view({ ytmp.size(0), 1 }), 0, 1); + 34 2752 : dataset = torch::cat({ dataset, yresized }, 0); + 35 888 : } + 36 44 : catch (const std::exception& e) { + 37 44 : std::stringstream oss; + 38 44 : oss << "* Error in X and y dimensions *\n"; + 39 44 : oss << "X dimensions: " << dataset.sizes() << "\n"; + 40 44 : oss << "y dimensions: " << ytmp.sizes(); + 41 44 : throw std::runtime_error(oss.str()); + 42 88 : } + 43 1776 : } + 44 2951 : void Classifier::trainModel(const torch::Tensor& weights) 45 : { - 46 251 : model.fit(dataset, weights, features, className, states); - 47 251 : } + 46 2951 : model.fit(dataset, weights, features, className, states); + 47 2951 : } 48 : // X is nxm where n is the number of features and m the number of samples - 49 28 : Classifier& Classifier::fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) + 49 322 : Classifier& Classifier::fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) 50 : { - 51 28 : dataset = X; - 52 28 : buildDataset(y); - 53 26 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); - 54 44 : return build(features, className, states, weights); - 55 26 : } + 51 322 : dataset = X; + 52 322 : buildDataset(y); + 53 300 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); + 54 512 : return build(features, className, states, weights); + 55 300 : } 56 : // X is nxm where n is the number of features and m the number of samples - 57 32 : Classifier& Classifier::fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) + 57 360 : Classifier& Classifier::fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) 58 : { - 59 32 : dataset = torch::zeros({ static_cast<int>(X.size()), static_cast<int>(X[0].size()) }, torch::kInt32); - 60 643 : for (int i = 0; i < X.size(); ++i) { - 61 2444 : dataset.index_put_({ i, "..." }, torch::tensor(X[i], torch::kInt32)); + 59 360 : dataset = torch::zeros({ static_cast<int>(X.size()), static_cast<int>(X[0].size()) }, torch::kInt32); + 60 5883 : for (int i = 0; i < X.size(); ++i) { + 61 22092 : dataset.index_put_({ i, "..." }, torch::tensor(X[i], torch::kInt32)); 62 : } - 63 32 : auto ytmp = torch::tensor(y, torch::kInt32); - 64 32 : buildDataset(ytmp); - 65 30 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); - 66 56 : return build(features, className, states, weights); - 67 647 : } - 68 99 : Classifier& Classifier::fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) + 63 360 : auto ytmp = torch::tensor(y, torch::kInt32); + 64 360 : buildDataset(ytmp); + 65 338 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); + 66 628 : return build(features, className, states, weights); + 67 5931 : } + 68 1089 : Classifier& Classifier::fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) 69 : { - 70 99 : this->dataset = dataset; - 71 99 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); - 72 198 : return build(features, className, states, weights); - 73 99 : } - 74 136 : Classifier& Classifier::fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) + 70 1089 : this->dataset = dataset; + 71 1089 : const torch::Tensor weights = torch::full({ dataset.size(1) }, 1.0 / dataset.size(1), torch::kDouble); + 72 2178 : return build(features, className, states, weights); + 73 1089 : } + 74 1686 : Classifier& Classifier::fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) 75 : { - 76 136 : this->dataset = dataset; - 77 136 : return build(features, className, states, weights); + 76 1686 : this->dataset = dataset; + 77 1686 : return build(features, className, states, weights); 78 : } - 79 291 : void Classifier::checkFitParameters() + 79 3413 : void Classifier::checkFitParameters() 80 : { - 81 291 : if (torch::is_floating_point(dataset)) { - 82 2 : throw std::invalid_argument("dataset (X, y) must be of type Integer"); + 81 3413 : if (torch::is_floating_point(dataset)) { + 82 22 : throw std::invalid_argument("dataset (X, y) must be of type Integer"); 83 : } - 84 289 : if (dataset.size(0) - 1 != features.size()) { - 85 2 : throw std::invalid_argument("Classifier: X " + std::to_string(dataset.size(0) - 1) + " and features " + std::to_string(features.size()) + " must have the same number of features"); + 84 3391 : if (dataset.size(0) - 1 != features.size()) { + 85 22 : throw std::invalid_argument("Classifier: X " + std::to_string(dataset.size(0) - 1) + " and features " + std::to_string(features.size()) + " must have the same number of features"); 86 : } - 87 287 : if (states.find(className) == states.end()) { - 88 2 : throw std::invalid_argument("class name not found in states"); + 87 3369 : if (states.find(className) == states.end()) { + 88 22 : throw std::invalid_argument("class name not found in states"); 89 : } - 90 9467 : for (auto feature : features) { - 91 9184 : if (states.find(feature) == states.end()) { - 92 2 : throw std::invalid_argument("feature [" + feature + "] not found in states"); + 90 124581 : for (auto feature : features) { + 91 121256 : if (states.find(feature) == states.end()) { + 92 22 : throw std::invalid_argument("feature [" + feature + "] not found in states"); 93 : } - 94 9184 : } - 95 283 : } - 96 245 : torch::Tensor Classifier::predict(torch::Tensor& X) + 94 121256 : } + 95 3325 : } + 96 3262 : torch::Tensor Classifier::predict(torch::Tensor& X) 97 : { - 98 245 : if (!fitted) { - 99 4 : throw std::logic_error(CLASSIFIER_NOT_FITTED); + 98 3262 : if (!fitted) { + 99 44 : throw std::logic_error(CLASSIFIER_NOT_FITTED); 100 : } - 101 241 : return model.predict(X); + 101 3218 : return model.predict(X); 102 : } - 103 4 : std::vector<int> Classifier::predict(std::vector<std::vector<int>>& X) + 103 44 : std::vector<int> Classifier::predict(std::vector<std::vector<int>>& X) 104 : { - 105 4 : if (!fitted) { - 106 2 : throw std::logic_error(CLASSIFIER_NOT_FITTED); + 105 44 : if (!fitted) { + 106 22 : throw std::logic_error(CLASSIFIER_NOT_FITTED); 107 : } - 108 2 : auto m_ = X[0].size(); - 109 2 : auto n_ = X.size(); - 110 2 : std::vector<std::vector<int>> Xd(n_, std::vector<int>(m_, 0)); - 111 10 : for (auto i = 0; i < n_; i++) { - 112 16 : Xd[i] = std::vector<int>(X[i].begin(), X[i].end()); + 108 22 : auto m_ = X[0].size(); + 109 22 : auto n_ = X.size(); + 110 22 : std::vector<std::vector<int>> Xd(n_, std::vector<int>(m_, 0)); + 111 110 : for (auto i = 0; i < n_; i++) { + 112 176 : Xd[i] = std::vector<int>(X[i].begin(), X[i].end()); 113 : } - 114 2 : auto yp = model.predict(Xd); - 115 4 : return yp; - 116 2 : } - 117 306 : torch::Tensor Classifier::predict_proba(torch::Tensor& X) + 114 22 : auto yp = model.predict(Xd); + 115 44 : return yp; + 116 22 : } + 117 3562 : torch::Tensor Classifier::predict_proba(torch::Tensor& X) 118 : { - 119 306 : if (!fitted) { - 120 2 : throw std::logic_error(CLASSIFIER_NOT_FITTED); + 119 3562 : if (!fitted) { + 120 22 : throw std::logic_error(CLASSIFIER_NOT_FITTED); 121 : } - 122 304 : return model.predict_proba(X); + 122 3540 : return model.predict_proba(X); 123 : } - 124 67 : std::vector<std::vector<double>> Classifier::predict_proba(std::vector<std::vector<int>>& X) + 124 766 : std::vector<std::vector<double>> Classifier::predict_proba(std::vector<std::vector<int>>& X) 125 : { - 126 67 : if (!fitted) { - 127 2 : throw std::logic_error(CLASSIFIER_NOT_FITTED); + 126 766 : if (!fitted) { + 127 22 : throw std::logic_error(CLASSIFIER_NOT_FITTED); 128 : } - 129 65 : auto m_ = X[0].size(); - 130 65 : auto n_ = X.size(); - 131 65 : std::vector<std::vector<int>> Xd(n_, std::vector<int>(m_, 0)); + 129 744 : auto m_ = X[0].size(); + 130 744 : auto n_ = X.size(); + 131 744 : std::vector<std::vector<int>> Xd(n_, std::vector<int>(m_, 0)); 132 : // Convert to nxm vector - 133 974 : for (auto i = 0; i < n_; i++) { - 134 1818 : Xd[i] = std::vector<int>(X[i].begin(), X[i].end()); + 133 9722 : for (auto i = 0; i < n_; i++) { + 134 17956 : Xd[i] = std::vector<int>(X[i].begin(), X[i].end()); 135 : } - 136 65 : auto yp = model.predict_proba(Xd); - 137 130 : return yp; - 138 65 : } - 139 28 : float Classifier::score(torch::Tensor& X, torch::Tensor& y) + 136 744 : auto yp = model.predict_proba(Xd); + 137 1488 : return yp; + 138 744 : } + 139 308 : float Classifier::score(torch::Tensor& X, torch::Tensor& y) 140 : { - 141 28 : torch::Tensor y_pred = predict(X); - 142 52 : return (y_pred == y).sum().item<float>() / y.size(0); - 143 26 : } - 144 4 : float Classifier::score(std::vector<std::vector<int>>& X, std::vector<int>& y) + 141 308 : torch::Tensor y_pred = predict(X); + 142 572 : return (y_pred == y).sum().item<float>() / y.size(0); + 143 286 : } + 144 44 : float Classifier::score(std::vector<std::vector<int>>& X, std::vector<int>& y) 145 : { - 146 4 : if (!fitted) { - 147 2 : throw std::logic_error(CLASSIFIER_NOT_FITTED); + 146 44 : if (!fitted) { + 147 22 : throw std::logic_error(CLASSIFIER_NOT_FITTED); 148 : } - 149 2 : return model.score(X, y); + 149 22 : return model.score(X, y); 150 : } - 151 6 : std::vector<std::string> Classifier::show() const + 151 66 : std::vector<std::string> Classifier::show() const 152 : { - 153 6 : return model.show(); + 153 66 : return model.show(); 154 : } - 155 251 : void Classifier::addNodes() + 155 2951 : void Classifier::addNodes() 156 : { 157 : // Add all nodes to the network - 158 8799 : for (const auto& feature : features) { - 159 8548 : model.addNode(feature); + 158 116009 : for (const auto& feature : features) { + 159 113058 : model.addNode(feature); 160 : } - 161 251 : model.addNode(className); - 162 251 : } - 163 40 : int Classifier::getNumberOfNodes() const + 161 2951 : model.addNode(className); + 162 2951 : } + 163 475 : int Classifier::getNumberOfNodes() const 164 : { 165 : // Features does not include class - 166 40 : return fitted ? model.getFeatures().size() : 0; + 166 475 : return fitted ? model.getFeatures().size() : 0; 167 : } - 168 40 : int Classifier::getNumberOfEdges() const + 168 475 : int Classifier::getNumberOfEdges() const 169 : { - 170 40 : return fitted ? model.getNumEdges() : 0; + 170 475 : return fitted ? model.getNumEdges() : 0; 171 : } - 172 6 : int Classifier::getNumberOfStates() const + 172 66 : int Classifier::getNumberOfStates() const 173 : { - 174 6 : return fitted ? model.getStates() : 0; + 174 66 : return fitted ? model.getStates() : 0; 175 : } - 176 76 : int Classifier::getClassNumStates() const + 176 877 : int Classifier::getClassNumStates() const 177 : { - 178 76 : return fitted ? model.getClassNumStates() : 0; + 178 877 : return fitted ? model.getClassNumStates() : 0; 179 : } - 180 1 : std::vector<std::string> Classifier::topological_order() + 180 11 : std::vector<std::string> Classifier::topological_order() 181 : { - 182 1 : return model.topological_sort(); + 182 11 : return model.topological_sort(); 183 : } - 184 1 : std::string Classifier::dump_cpt() const + 184 11 : std::string Classifier::dump_cpt() const 185 : { - 186 1 : return model.dump_cpt(); + 186 11 : return model.dump_cpt(); 187 : } - 188 19 : void Classifier::setHyperparameters(const nlohmann::json& hyperparameters) + 188 231 : void Classifier::setHyperparameters(const nlohmann::json& hyperparameters) 189 : { - 190 19 : if (!hyperparameters.empty()) { - 191 2 : throw std::invalid_argument("Invalid hyperparameters" + hyperparameters.dump()); + 190 231 : if (!hyperparameters.empty()) { + 191 22 : throw std::invalid_argument("Invalid hyperparameters" + hyperparameters.dump()); 192 : } - 193 17 : } + 193 209 : } 194 : } diff --git a/html/bayesnet/classifiers/Classifier.h.func-c.html b/html/bayesnet/classifiers/Classifier.h.func-c.html index ada695f..db6388f 100644 --- a/html/bayesnet/classifiers/Classifier.h.func-c.html +++ b/html/bayesnet/classifiers/Classifier.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 80.0 % @@ -72,7 +72,7 @@ _ZNK8bayesnet10Classifier8getNotesB5cxx11Ev - 20 + 12 @@ -86,7 +86,7 @@ _ZN8bayesnet10ClassifierD0Ev - 273 + 241 @@ -100,7 +100,7 @@ _ZN8bayesnet10ClassifierD2Ev - 273 + 241 diff --git a/html/bayesnet/classifiers/Classifier.h.func.html b/html/bayesnet/classifiers/Classifier.h.func.html index 19d18ba..e5ad3a3 100644 --- a/html/bayesnet/classifiers/Classifier.h.func.html +++ b/html/bayesnet/classifiers/Classifier.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 80.0 % @@ -72,7 +72,7 @@ _ZN8bayesnet10ClassifierD0Ev - 273 + 241 @@ -86,14 +86,14 @@ _ZN8bayesnet10ClassifierD2Ev - 273 + 241 _ZNK8bayesnet10Classifier8getNotesB5cxx11Ev - 20 + 12 diff --git a/html/bayesnet/classifiers/Classifier.h.gcov.html b/html/bayesnet/classifiers/Classifier.h.gcov.html index beca027..ed97fcb 100644 --- a/html/bayesnet/classifiers/Classifier.h.gcov.html +++ b/html/bayesnet/classifiers/Classifier.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 80.0 % @@ -77,7 +77,7 @@ 15 : class Classifier : public BaseClassifier { 16 : public: 17 : Classifier(Network model); - 18 273 : virtual ~Classifier() = default; + 18 241 : virtual ~Classifier() = default; 19 : Classifier& fit(std::vector<std::vector<int>>& X, std::vector<int>& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) override; 20 : Classifier& fit(torch::Tensor& X, torch::Tensor& y, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) override; 21 : Classifier& fit(torch::Tensor& dataset, const std::vector<std::string>& features, const std::string& className, std::map<std::string, std::vector<int>>& states) override; @@ -97,7 +97,7 @@ 35 : float score(std::vector<std::vector<int>>& X, std::vector<int>& y) override; 36 : std::vector<std::string> show() const override; 37 : std::vector<std::string> topological_order() override; - 38 20 : std::vector<std::string> getNotes() const override { return notes; } + 38 12 : std::vector<std::string> getNotes() const override { return notes; } 39 : std::string dump_cpt() const override; 40 : void setHyperparameters(const nlohmann::json& hyperparameters) override; //For classifiers that don't have hyperparameters 41 : protected: diff --git a/html/bayesnet/classifiers/KDB.cc.func-c.html b/html/bayesnet/classifiers/KDB.cc.func-c.html index 703c1ab..50882fc 100644 --- a/html/bayesnet/classifiers/KDB.cc.func-c.html +++ b/html/bayesnet/classifiers/KDB.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZNK8bayesnet3KDB5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 2 + 22 _ZN8bayesnet3KDB18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 3 + 33 _ZN8bayesnet3KDB10buildModelERKN2at6TensorE - 13 + 143 _ZN8bayesnet3KDBC2Eif - 37 + 407 _ZN8bayesnet3KDB11add_m_edgesEiRSt6vectorIiSaIiEERN2at6TensorE - 86 + 946 diff --git a/html/bayesnet/classifiers/KDB.cc.func.html b/html/bayesnet/classifiers/KDB.cc.func.html index 22ed16d..5bcbdde 100644 --- a/html/bayesnet/classifiers/KDB.cc.func.html +++ b/html/bayesnet/classifiers/KDB.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZN8bayesnet3KDB10buildModelERKN2at6TensorE - 13 + 143 _ZN8bayesnet3KDB11add_m_edgesEiRSt6vectorIiSaIiEERN2at6TensorE - 86 + 946 _ZN8bayesnet3KDB18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 3 + 33 _ZN8bayesnet3KDBC2Eif - 37 + 407 _ZNK8bayesnet3KDB5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 2 + 22 diff --git a/html/bayesnet/classifiers/KDB.cc.gcov.html b/html/bayesnet/classifiers/KDB.cc.gcov.html index 99d4bd1..75ec210 100644 --- a/html/bayesnet/classifiers/KDB.cc.gcov.html +++ b/html/bayesnet/classifiers/KDB.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,25 +69,25 @@ 7 : #include "KDB.h" 8 : 9 : namespace bayesnet { - 10 37 : KDB::KDB(int k, float theta) : Classifier(Network()), k(k), theta(theta) + 10 407 : KDB::KDB(int k, float theta) : Classifier(Network()), k(k), theta(theta) 11 : { - 12 111 : validHyperparameters = { "k", "theta" }; + 12 1221 : validHyperparameters = { "k", "theta" }; 13 : - 14 111 : } - 15 3 : void KDB::setHyperparameters(const nlohmann::json& hyperparameters_) + 14 1221 : } + 15 33 : void KDB::setHyperparameters(const nlohmann::json& hyperparameters_) 16 : { - 17 3 : auto hyperparameters = hyperparameters_; - 18 3 : if (hyperparameters.contains("k")) { - 19 1 : k = hyperparameters["k"]; - 20 1 : hyperparameters.erase("k"); + 17 33 : auto hyperparameters = hyperparameters_; + 18 33 : if (hyperparameters.contains("k")) { + 19 11 : k = hyperparameters["k"]; + 20 11 : hyperparameters.erase("k"); 21 : } - 22 3 : if (hyperparameters.contains("theta")) { - 23 1 : theta = hyperparameters["theta"]; - 24 1 : hyperparameters.erase("theta"); + 22 33 : if (hyperparameters.contains("theta")) { + 23 11 : theta = hyperparameters["theta"]; + 24 11 : hyperparameters.erase("theta"); 25 : } - 26 3 : Classifier::setHyperparameters(hyperparameters); - 27 3 : } - 28 13 : void KDB::buildModel(const torch::Tensor& weights) + 26 33 : Classifier::setHyperparameters(hyperparameters); + 27 33 : } + 28 143 : void KDB::buildModel(const torch::Tensor& weights) 29 : { 30 : /* 31 : 1. For each feature Xi, compute mutual information, I(X;C), @@ -110,66 +110,66 @@ 48 : */ 49 : // 1. For each feature Xi, compute mutual information, I(X;C), 50 : // where C is the class. - 51 13 : addNodes(); - 52 39 : const torch::Tensor& y = dataset.index({ -1, "..." }); - 53 13 : std::vector<double> mi; - 54 99 : for (auto i = 0; i < features.size(); i++) { - 55 258 : torch::Tensor firstFeature = dataset.index({ i, "..." }); - 56 86 : mi.push_back(metrics.mutualInformation(firstFeature, y, weights)); - 57 86 : } + 51 143 : addNodes(); + 52 429 : const torch::Tensor& y = dataset.index({ -1, "..." }); + 53 143 : std::vector<double> mi; + 54 1089 : for (auto i = 0; i < features.size(); i++) { + 55 2838 : torch::Tensor firstFeature = dataset.index({ i, "..." }); + 56 946 : mi.push_back(metrics.mutualInformation(firstFeature, y, weights)); + 57 946 : } 58 : // 2. Compute class conditional mutual information I(Xi;XjIC), f or each - 59 13 : auto conditionalEdgeWeights = metrics.conditionalEdge(weights); + 59 143 : auto conditionalEdgeWeights = metrics.conditionalEdge(weights); 60 : // 3. Let the used variable list, S, be empty. - 61 13 : std::vector<int> S; + 61 143 : std::vector<int> S; 62 : // 4. Let the DAG network being constructed, BN, begin with a single 63 : // class node, C. 64 : // 5. Repeat until S includes all domain features 65 : // 5.1. Select feature Xmax which is not in S and has the largest value 66 : // I(Xmax;C). - 67 13 : auto order = argsort(mi); - 68 99 : for (auto idx : order) { + 67 143 : auto order = argsort(mi); + 68 1089 : for (auto idx : order) { 69 : // 5.2. Add a node to BN representing Xmax. 70 : // 5.3. Add an arc from C to Xmax in BN. - 71 86 : model.addEdge(className, features[idx]); + 71 946 : model.addEdge(className, features[idx]); 72 : // 5.4. Add m = min(lSl,/c) arcs from m distinct features Xj in S with 73 : // the highest value for I(Xmax;X,jC). - 74 86 : add_m_edges(idx, S, conditionalEdgeWeights); + 74 946 : add_m_edges(idx, S, conditionalEdgeWeights); 75 : // 5.5. Add Xmax to S. - 76 86 : S.push_back(idx); + 76 946 : S.push_back(idx); 77 : } - 78 112 : } - 79 86 : void KDB::add_m_edges(int idx, std::vector<int>& S, torch::Tensor& weights) + 78 1232 : } + 79 946 : void KDB::add_m_edges(int idx, std::vector<int>& S, torch::Tensor& weights) 80 : { - 81 86 : auto n_edges = std::min(k, static_cast<int>(S.size())); - 82 86 : auto cond_w = clone(weights); - 83 86 : bool exit_cond = k == 0; - 84 86 : int num = 0; - 85 251 : while (!exit_cond) { - 86 660 : auto max_minfo = argmax(cond_w.index({ idx, "..." })).item<int>(); - 87 165 : auto belongs = find(S.begin(), S.end(), max_minfo) != S.end(); - 88 441 : if (belongs && cond_w.index({ idx, max_minfo }).item<float>() > theta) { + 81 946 : auto n_edges = std::min(k, static_cast<int>(S.size())); + 82 946 : auto cond_w = clone(weights); + 83 946 : bool exit_cond = k == 0; + 84 946 : int num = 0; + 85 2761 : while (!exit_cond) { + 86 7260 : auto max_minfo = argmax(cond_w.index({ idx, "..." })).item<int>(); + 87 1815 : auto belongs = find(S.begin(), S.end(), max_minfo) != S.end(); + 88 4851 : if (belongs && cond_w.index({ idx, max_minfo }).item<float>() > theta) { 89 : try { - 90 80 : model.addEdge(features[max_minfo], features[idx]); - 91 80 : num++; + 90 880 : model.addEdge(features[max_minfo], features[idx]); + 91 880 : num++; 92 : } 93 0 : catch (const std::invalid_argument& e) { 94 : // Loops are not allowed 95 0 : } 96 : } - 97 660 : cond_w.index_put_({ idx, max_minfo }, -1); - 98 495 : auto candidates_mask = cond_w.index({ idx, "..." }).gt(theta); - 99 165 : auto candidates = candidates_mask.nonzero(); - 100 165 : exit_cond = num == n_edges || candidates.size(0) == 0; - 101 165 : } - 102 673 : } - 103 2 : std::vector<std::string> KDB::graph(const std::string& title) const + 97 7260 : cond_w.index_put_({ idx, max_minfo }, -1); + 98 5445 : auto candidates_mask = cond_w.index({ idx, "..." }).gt(theta); + 99 1815 : auto candidates = candidates_mask.nonzero(); + 100 1815 : exit_cond = num == n_edges || candidates.size(0) == 0; + 101 1815 : } + 102 7403 : } + 103 22 : std::vector<std::string> KDB::graph(const std::string& title) const 104 : { - 105 2 : std::string header{ title }; - 106 2 : if (title == "KDB") { - 107 2 : header += " (k=" + std::to_string(k) + ", theta=" + std::to_string(theta) + ")"; + 105 22 : std::string header{ title }; + 106 22 : if (title == "KDB") { + 107 22 : header += " (k=" + std::to_string(k) + ", theta=" + std::to_string(theta) + ")"; 108 : } - 109 4 : return model.graph(header); - 110 2 : } + 109 44 : return model.graph(header); + 110 22 : } 111 : } diff --git a/html/bayesnet/classifiers/KDB.h.func-c.html b/html/bayesnet/classifiers/KDB.h.func-c.html index 1d6cc56..ec98e76 100644 --- a/html/bayesnet/classifiers/KDB.h.func-c.html +++ b/html/bayesnet/classifiers/KDB.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/KDB.h.func.html b/html/bayesnet/classifiers/KDB.h.func.html index c49d1aa..b859f2f 100644 --- a/html/bayesnet/classifiers/KDB.h.func.html +++ b/html/bayesnet/classifiers/KDB.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/KDB.h.gcov.html b/html/bayesnet/classifiers/KDB.h.gcov.html index 9d800a6..0be2ab7 100644 --- a/html/bayesnet/classifiers/KDB.h.gcov.html +++ b/html/bayesnet/classifiers/KDB.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/KDBLd.cc.func-c.html b/html/bayesnet/classifiers/KDBLd.cc.func-c.html index c4325c5..d71a389 100644 --- a/html/bayesnet/classifiers/KDBLd.cc.func-c.html +++ b/html/bayesnet/classifiers/KDBLd.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZNK8bayesnet5KDBLd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 _ZN8bayesnet5KDBLd7predictERN2at6TensorE - 4 + 44 _ZN8bayesnet5KDBLd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet5KDBLdC2Ei - 17 + 187 diff --git a/html/bayesnet/classifiers/KDBLd.cc.func.html b/html/bayesnet/classifiers/KDBLd.cc.func.html index 37fe319..f1d9576 100644 --- a/html/bayesnet/classifiers/KDBLd.cc.func.html +++ b/html/bayesnet/classifiers/KDBLd.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet5KDBLd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet5KDBLd7predictERN2at6TensorE - 4 + 44 _ZN8bayesnet5KDBLdC2Ei - 17 + 187 _ZNK8bayesnet5KDBLd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 diff --git a/html/bayesnet/classifiers/KDBLd.cc.gcov.html b/html/bayesnet/classifiers/KDBLd.cc.gcov.html index c372188..8884865 100644 --- a/html/bayesnet/classifiers/KDBLd.cc.gcov.html +++ b/html/bayesnet/classifiers/KDBLd.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,30 +69,30 @@ 7 : #include "KDBLd.h" 8 : 9 : namespace bayesnet { - 10 17 : KDBLd::KDBLd(int k) : KDB(k), Proposal(dataset, features, className) {} - 11 5 : KDBLd& KDBLd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 10 187 : KDBLd::KDBLd(int k) : KDB(k), Proposal(dataset, features, className) {} + 11 55 : KDBLd& KDBLd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 12 : { - 13 5 : checkInput(X_, y_); - 14 5 : features = features_; - 15 5 : className = className_; - 16 5 : Xf = X_; - 17 5 : y = y_; + 13 55 : checkInput(X_, y_); + 14 55 : features = features_; + 15 55 : className = className_; + 16 55 : Xf = X_; + 17 55 : y = y_; 18 : // Fills std::vectors Xv & yv with the data from tensors X_ (discretized) & y - 19 5 : states = fit_local_discretization(y); + 19 55 : states = fit_local_discretization(y); 20 : // We have discretized the input data 21 : // 1st we need to fit the model to build the normal KDB structure, KDB::fit initializes the base Bayesian network - 22 5 : KDB::fit(dataset, features, className, states); - 23 5 : states = localDiscretizationProposal(states, model); - 24 5 : return *this; + 22 55 : KDB::fit(dataset, features, className, states); + 23 55 : states = localDiscretizationProposal(states, model); + 24 55 : return *this; 25 : } - 26 4 : torch::Tensor KDBLd::predict(torch::Tensor& X) + 26 44 : torch::Tensor KDBLd::predict(torch::Tensor& X) 27 : { - 28 4 : auto Xt = prepareX(X); - 29 8 : return KDB::predict(Xt); - 30 4 : } - 31 1 : std::vector<std::string> KDBLd::graph(const std::string& name) const + 28 44 : auto Xt = prepareX(X); + 29 88 : return KDB::predict(Xt); + 30 44 : } + 31 11 : std::vector<std::string> KDBLd::graph(const std::string& name) const 32 : { - 33 1 : return KDB::graph(name); + 33 11 : return KDB::graph(name); 34 : } 35 : } diff --git a/html/bayesnet/classifiers/KDBLd.h.func-c.html b/html/bayesnet/classifiers/KDBLd.h.func-c.html index d011794..ffe7266 100644 --- a/html/bayesnet/classifiers/KDBLd.h.func-c.html +++ b/html/bayesnet/classifiers/KDBLd.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/KDBLd.h.func.html b/html/bayesnet/classifiers/KDBLd.h.func.html index 864acdb..e7a86d9 100644 --- a/html/bayesnet/classifiers/KDBLd.h.func.html +++ b/html/bayesnet/classifiers/KDBLd.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/KDBLd.h.gcov.html b/html/bayesnet/classifiers/KDBLd.h.gcov.html index 4718826..995a036 100644 --- a/html/bayesnet/classifiers/KDBLd.h.gcov.html +++ b/html/bayesnet/classifiers/KDBLd.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/Proposal.cc.func-c.html b/html/bayesnet/classifiers/Proposal.cc.func-c.html index ad4f28c..4b28b11 100644 --- a/html/bayesnet/classifiers/Proposal.cc.func-c.html +++ b/html/bayesnet/classifiers/Proposal.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 88.9 % @@ -65,14 +65,14 @@ _ZN8bayesnet8Proposal8prepareXERN2at6TensorE - 42 + 462 _ZN8bayesnet8ProposalD0Ev - 50 + 550 @@ -86,49 +86,49 @@ _ZN8bayesnet8ProposalD2Ev - 50 + 550 _ZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkE - 53 + 583 _ZN8bayesnet8Proposal10checkInputERKN2at6TensorES4_ - 57 + 627 _ZN8bayesnet8Proposal24fit_local_discretizationB5cxx11ERKN2at6TensorE - 58 + 638 _ZN8bayesnet8ProposalC2ERN2at6TensorERSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERSA_ - 106 + 1166 _ZZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkEENKUlRKT_E0_clIS7_EEDaSO_ - 343 + 3773 _ZZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkEENKUlRKT_E_clIPNS_4NodeEEEDaSO_ - 674 + 7414 diff --git a/html/bayesnet/classifiers/Proposal.cc.func.html b/html/bayesnet/classifiers/Proposal.cc.func.html index 4180906..746b4c0 100644 --- a/html/bayesnet/classifiers/Proposal.cc.func.html +++ b/html/bayesnet/classifiers/Proposal.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 88.9 % @@ -65,42 +65,42 @@ _ZN8bayesnet8Proposal10checkInputERKN2at6TensorES4_ - 57 + 627 _ZN8bayesnet8Proposal24fit_local_discretizationB5cxx11ERKN2at6TensorE - 58 + 638 _ZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkE - 53 + 583 _ZN8bayesnet8Proposal8prepareXERN2at6TensorE - 42 + 462 _ZN8bayesnet8ProposalC2ERN2at6TensorERSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERSA_ - 106 + 1166 _ZN8bayesnet8ProposalD0Ev - 50 + 550 @@ -114,21 +114,21 @@ _ZN8bayesnet8ProposalD2Ev - 50 + 550 _ZZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkEENKUlRKT_E0_clIS7_EEDaSO_ - 343 + 3773 _ZZN8bayesnet8Proposal27localDiscretizationProposalERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERNS_7NetworkEENKUlRKT_E_clIPNS_4NodeEEEDaSO_ - 674 + 7414 diff --git a/html/bayesnet/classifiers/Proposal.cc.gcov.html b/html/bayesnet/classifiers/Proposal.cc.gcov.html index 743d4ac..7fb96d0 100644 --- a/html/bayesnet/classifiers/Proposal.cc.gcov.html +++ b/html/bayesnet/classifiers/Proposal.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 88.9 % @@ -70,111 +70,111 @@ 8 : #include "Proposal.h" 9 : 10 : namespace bayesnet { - 11 106 : Proposal::Proposal(torch::Tensor& dataset_, std::vector<std::string>& features_, std::string& className_) : pDataset(dataset_), pFeatures(features_), pClassName(className_) {} - 12 50 : Proposal::~Proposal() + 11 1166 : Proposal::Proposal(torch::Tensor& dataset_, std::vector<std::string>& features_, std::string& className_) : pDataset(dataset_), pFeatures(features_), pClassName(className_) {} + 12 550 : Proposal::~Proposal() 13 : { - 14 474 : for (auto& [key, value] : discretizers) { - 15 424 : delete value; + 14 5214 : for (auto& [key, value] : discretizers) { + 15 4664 : delete value; 16 : } - 17 50 : } - 18 57 : void Proposal::checkInput(const torch::Tensor& X, const torch::Tensor& y) + 17 550 : } + 18 627 : void Proposal::checkInput(const torch::Tensor& X, const torch::Tensor& y) 19 : { - 20 57 : if (!torch::is_floating_point(X)) { + 20 627 : if (!torch::is_floating_point(X)) { 21 0 : throw std::invalid_argument("X must be a floating point tensor"); 22 : } - 23 57 : if (torch::is_floating_point(y)) { + 23 627 : if (torch::is_floating_point(y)) { 24 0 : throw std::invalid_argument("y must be an integer tensor"); 25 : } - 26 57 : } - 27 53 : map<std::string, std::vector<int>> Proposal::localDiscretizationProposal(const map<std::string, std::vector<int>>& oldStates, Network& model) + 26 627 : } + 27 583 : map<std::string, std::vector<int>> Proposal::localDiscretizationProposal(const map<std::string, std::vector<int>>& oldStates, Network& model) 28 : { 29 : // order of local discretization is important. no good 0, 1, 2... 30 : // although we rediscretize features after the local discretization of every feature - 31 53 : auto order = model.topological_sort(); - 32 53 : auto& nodes = model.getNodes(); - 33 53 : map<std::string, std::vector<int>> states = oldStates; - 34 53 : std::vector<int> indicesToReDiscretize; - 35 53 : bool upgrade = false; // Flag to check if we need to upgrade the model - 36 444 : for (auto feature : order) { - 37 391 : auto nodeParents = nodes[feature]->getParents(); - 38 391 : if (nodeParents.size() < 2) continue; // Only has class as parent - 39 331 : upgrade = true; - 40 331 : int index = find(pFeatures.begin(), pFeatures.end(), feature) - pFeatures.begin(); - 41 331 : indicesToReDiscretize.push_back(index); // We need to re-discretize this feature - 42 331 : std::vector<std::string> parents; - 43 1005 : transform(nodeParents.begin(), nodeParents.end(), back_inserter(parents), [](const auto& p) { return p->getName(); }); + 31 583 : auto order = model.topological_sort(); + 32 583 : auto& nodes = model.getNodes(); + 33 583 : map<std::string, std::vector<int>> states = oldStates; + 34 583 : std::vector<int> indicesToReDiscretize; + 35 583 : bool upgrade = false; // Flag to check if we need to upgrade the model + 36 4884 : for (auto feature : order) { + 37 4301 : auto nodeParents = nodes[feature]->getParents(); + 38 4301 : if (nodeParents.size() < 2) continue; // Only has class as parent + 39 3641 : upgrade = true; + 40 3641 : int index = find(pFeatures.begin(), pFeatures.end(), feature) - pFeatures.begin(); + 41 3641 : indicesToReDiscretize.push_back(index); // We need to re-discretize this feature + 42 3641 : std::vector<std::string> parents; + 43 11055 : transform(nodeParents.begin(), nodeParents.end(), back_inserter(parents), [](const auto& p) { return p->getName(); }); 44 : // Remove class as parent as it will be added later - 45 331 : parents.erase(remove(parents.begin(), parents.end(), pClassName), parents.end()); + 45 3641 : parents.erase(remove(parents.begin(), parents.end(), pClassName), parents.end()); 46 : // Get the indices of the parents - 47 331 : std::vector<int> indices; - 48 331 : indices.push_back(-1); // Add class index - 49 674 : transform(parents.begin(), parents.end(), back_inserter(indices), [&](const auto& p) {return find(pFeatures.begin(), pFeatures.end(), p) - pFeatures.begin(); }); + 47 3641 : std::vector<int> indices; + 48 3641 : indices.push_back(-1); // Add class index + 49 7414 : transform(parents.begin(), parents.end(), back_inserter(indices), [&](const auto& p) {return find(pFeatures.begin(), pFeatures.end(), p) - pFeatures.begin(); }); 50 : // Now we fit the discretizer of the feature, conditioned on its parents and the class i.e. discretizer.fit(X[index], X[indices] + y) - 51 331 : std::vector<std::string> yJoinParents(Xf.size(1)); - 52 1005 : for (auto idx : indices) { - 53 239660 : for (int i = 0; i < Xf.size(1); ++i) { - 54 716958 : yJoinParents[i] += to_string(pDataset.index({ idx, i }).item<int>()); + 51 3641 : std::vector<std::string> yJoinParents(Xf.size(1)); + 52 11055 : for (auto idx : indices) { + 53 2636260 : for (int i = 0; i < Xf.size(1); ++i) { + 54 7886538 : yJoinParents[i] += to_string(pDataset.index({ idx, i }).item<int>()); 55 : } 56 : } - 57 331 : auto arff = ArffFiles(); - 58 331 : auto yxv = arff.factorize(yJoinParents); - 59 662 : auto xvf_ptr = Xf.index({ index }).data_ptr<float>(); - 60 331 : auto xvf = std::vector<mdlp::precision_t>(xvf_ptr, xvf_ptr + Xf.size(1)); - 61 331 : discretizers[feature]->fit(xvf, yxv); - 62 451 : } - 63 53 : if (upgrade) { + 57 3641 : auto arff = ArffFiles(); + 58 3641 : auto yxv = arff.factorize(yJoinParents); + 59 7282 : auto xvf_ptr = Xf.index({ index }).data_ptr<float>(); + 60 3641 : auto xvf = std::vector<mdlp::precision_t>(xvf_ptr, xvf_ptr + Xf.size(1)); + 61 3641 : discretizers[feature]->fit(xvf, yxv); + 62 4961 : } + 63 583 : if (upgrade) { 64 : // Discretize again X (only the affected indices) with the new fitted discretizers - 65 384 : for (auto index : indicesToReDiscretize) { - 66 662 : auto Xt_ptr = Xf.index({ index }).data_ptr<float>(); - 67 331 : auto Xt = std::vector<float>(Xt_ptr, Xt_ptr + Xf.size(1)); - 68 1324 : pDataset.index_put_({ index, "..." }, torch::tensor(discretizers[pFeatures[index]]->transform(Xt))); - 69 331 : auto xStates = std::vector<int>(discretizers[pFeatures[index]]->getCutPoints().size() + 1); - 70 331 : iota(xStates.begin(), xStates.end(), 0); + 65 4224 : for (auto index : indicesToReDiscretize) { + 66 7282 : auto Xt_ptr = Xf.index({ index }).data_ptr<float>(); + 67 3641 : auto Xt = std::vector<float>(Xt_ptr, Xt_ptr + Xf.size(1)); + 68 14564 : pDataset.index_put_({ index, "..." }, torch::tensor(discretizers[pFeatures[index]]->transform(Xt))); + 69 3641 : auto xStates = std::vector<int>(discretizers[pFeatures[index]]->getCutPoints().size() + 1); + 70 3641 : iota(xStates.begin(), xStates.end(), 0); 71 : //Update new states of the feature/node - 72 331 : states[pFeatures[index]] = xStates; - 73 331 : } - 74 53 : const torch::Tensor weights = torch::full({ pDataset.size(1) }, 1.0 / pDataset.size(1), torch::kDouble); - 75 53 : model.fit(pDataset, weights, pFeatures, pClassName, states); - 76 53 : } - 77 106 : return states; - 78 240032 : } - 79 58 : map<std::string, std::vector<int>> Proposal::fit_local_discretization(const torch::Tensor& y) + 72 3641 : states[pFeatures[index]] = xStates; + 73 3641 : } + 74 583 : const torch::Tensor weights = torch::full({ pDataset.size(1) }, 1.0 / pDataset.size(1), torch::kDouble); + 75 583 : model.fit(pDataset, weights, pFeatures, pClassName, states); + 76 583 : } + 77 1166 : return states; + 78 2640352 : } + 79 638 : map<std::string, std::vector<int>> Proposal::fit_local_discretization(const torch::Tensor& y) 80 : { 81 : // Discretize the continuous input data and build pDataset (Classifier::dataset) - 82 58 : int m = Xf.size(1); - 83 58 : int n = Xf.size(0); - 84 58 : map<std::string, std::vector<int>> states; - 85 58 : pDataset = torch::zeros({ n + 1, m }, torch::kInt32); - 86 58 : auto yv = std::vector<int>(y.data_ptr<int>(), y.data_ptr<int>() + y.size(0)); + 82 638 : int m = Xf.size(1); + 83 638 : int n = Xf.size(0); + 84 638 : map<std::string, std::vector<int>> states; + 85 638 : pDataset = torch::zeros({ n + 1, m }, torch::kInt32); + 86 638 : auto yv = std::vector<int>(y.data_ptr<int>(), y.data_ptr<int>() + y.size(0)); 87 : // discretize input data by feature(row) - 88 486 : for (auto i = 0; i < pFeatures.size(); ++i) { - 89 428 : auto* discretizer = new mdlp::CPPFImdlp(); - 90 856 : auto Xt_ptr = Xf.index({ i }).data_ptr<float>(); - 91 428 : auto Xt = std::vector<float>(Xt_ptr, Xt_ptr + Xf.size(1)); - 92 428 : discretizer->fit(Xt, yv); - 93 1712 : pDataset.index_put_({ i, "..." }, torch::tensor(discretizer->transform(Xt))); - 94 428 : auto xStates = std::vector<int>(discretizer->getCutPoints().size() + 1); - 95 428 : iota(xStates.begin(), xStates.end(), 0); - 96 428 : states[pFeatures[i]] = xStates; - 97 428 : discretizers[pFeatures[i]] = discretizer; - 98 428 : } - 99 58 : int n_classes = torch::max(y).item<int>() + 1; - 100 58 : auto yStates = std::vector<int>(n_classes); - 101 58 : iota(yStates.begin(), yStates.end(), 0); - 102 58 : states[pClassName] = yStates; - 103 174 : pDataset.index_put_({ n, "..." }, y); - 104 116 : return states; - 105 972 : } - 106 42 : torch::Tensor Proposal::prepareX(torch::Tensor& X) + 88 5346 : for (auto i = 0; i < pFeatures.size(); ++i) { + 89 4708 : auto* discretizer = new mdlp::CPPFImdlp(); + 90 9416 : auto Xt_ptr = Xf.index({ i }).data_ptr<float>(); + 91 4708 : auto Xt = std::vector<float>(Xt_ptr, Xt_ptr + Xf.size(1)); + 92 4708 : discretizer->fit(Xt, yv); + 93 18832 : pDataset.index_put_({ i, "..." }, torch::tensor(discretizer->transform(Xt))); + 94 4708 : auto xStates = std::vector<int>(discretizer->getCutPoints().size() + 1); + 95 4708 : iota(xStates.begin(), xStates.end(), 0); + 96 4708 : states[pFeatures[i]] = xStates; + 97 4708 : discretizers[pFeatures[i]] = discretizer; + 98 4708 : } + 99 638 : int n_classes = torch::max(y).item<int>() + 1; + 100 638 : auto yStates = std::vector<int>(n_classes); + 101 638 : iota(yStates.begin(), yStates.end(), 0); + 102 638 : states[pClassName] = yStates; + 103 1914 : pDataset.index_put_({ n, "..." }, y); + 104 1276 : return states; + 105 10692 : } + 106 462 : torch::Tensor Proposal::prepareX(torch::Tensor& X) 107 : { - 108 42 : auto Xtd = torch::zeros_like(X, torch::kInt32); - 109 344 : for (int i = 0; i < X.size(0); ++i) { - 110 302 : auto Xt = std::vector<float>(X[i].data_ptr<float>(), X[i].data_ptr<float>() + X.size(1)); - 111 302 : auto Xd = discretizers[pFeatures[i]]->transform(Xt); - 112 906 : Xtd.index_put_({ i }, torch::tensor(Xd, torch::kInt32)); - 113 302 : } - 114 42 : return Xtd; - 115 302 : } + 108 462 : auto Xtd = torch::zeros_like(X, torch::kInt32); + 109 3784 : for (int i = 0; i < X.size(0); ++i) { + 110 3322 : auto Xt = std::vector<float>(X[i].data_ptr<float>(), X[i].data_ptr<float>() + X.size(1)); + 111 3322 : auto Xd = discretizers[pFeatures[i]]->transform(Xt); + 112 9966 : Xtd.index_put_({ i }, torch::tensor(Xd, torch::kInt32)); + 113 3322 : } + 114 462 : return Xtd; + 115 3322 : } 116 : } diff --git a/html/bayesnet/classifiers/SPODE.cc.func-c.html b/html/bayesnet/classifiers/SPODE.cc.func-c.html index 03e877d..34837ca 100644 --- a/html/bayesnet/classifiers/SPODE.cc.func-c.html +++ b/html/bayesnet/classifiers/SPODE.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,21 +65,21 @@ _ZNK8bayesnet5SPODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 17 + 187 _ZN8bayesnet5SPODE10buildModelERKN2at6TensorE - 225 + 2665 _ZN8bayesnet5SPODEC2Ei - 252 + 2962 diff --git a/html/bayesnet/classifiers/SPODE.cc.func.html b/html/bayesnet/classifiers/SPODE.cc.func.html index c58a512..422717d 100644 --- a/html/bayesnet/classifiers/SPODE.cc.func.html +++ b/html/bayesnet/classifiers/SPODE.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,21 +65,21 @@ _ZN8bayesnet5SPODE10buildModelERKN2at6TensorE - 225 + 2665 _ZN8bayesnet5SPODEC2Ei - 252 + 2962 _ZNK8bayesnet5SPODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 17 + 187 diff --git a/html/bayesnet/classifiers/SPODE.cc.gcov.html b/html/bayesnet/classifiers/SPODE.cc.gcov.html index b83fd68..8032885 100644 --- a/html/bayesnet/classifiers/SPODE.cc.gcov.html +++ b/html/bayesnet/classifiers/SPODE.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,24 +70,24 @@ 8 : 9 : namespace bayesnet { 10 : - 11 252 : SPODE::SPODE(int root) : Classifier(Network()), root(root) {} + 11 2962 : SPODE::SPODE(int root) : Classifier(Network()), root(root) {} 12 : - 13 225 : void SPODE::buildModel(const torch::Tensor& weights) + 13 2665 : void SPODE::buildModel(const torch::Tensor& weights) 14 : { 15 : // 0. Add all nodes to the model - 16 225 : addNodes(); + 16 2665 : addNodes(); 17 : // 1. Add edges from the class node to all other nodes 18 : // 2. Add edges from the root node to all other nodes - 19 8611 : for (int i = 0; i < static_cast<int>(features.size()); ++i) { - 20 8386 : model.addEdge(className, features[i]); - 21 8386 : if (i != root) { - 22 8161 : model.addEdge(features[root], features[i]); + 19 113941 : for (int i = 0; i < static_cast<int>(features.size()); ++i) { + 20 111276 : model.addEdge(className, features[i]); + 21 111276 : if (i != root) { + 22 108611 : model.addEdge(features[root], features[i]); 23 : } 24 : } - 25 225 : } - 26 17 : std::vector<std::string> SPODE::graph(const std::string& name) const + 25 2665 : } + 26 187 : std::vector<std::string> SPODE::graph(const std::string& name) const 27 : { - 28 17 : return model.graph(name); + 28 187 : return model.graph(name); 29 : } 30 : 31 : } diff --git a/html/bayesnet/classifiers/SPODE.h.func-c.html b/html/bayesnet/classifiers/SPODE.h.func-c.html index 2c7cc48..2d16a0b 100644 --- a/html/bayesnet/classifiers/SPODE.h.func-c.html +++ b/html/bayesnet/classifiers/SPODE.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,21 +65,21 @@ _ZN8bayesnet5SPODED0Ev - 401 + 337 _ZN8bayesnet5SPODED0Ev - 180 + 148 _ZN8bayesnet5SPODED2Ev - 221 + 189 diff --git a/html/bayesnet/classifiers/SPODE.h.func.html b/html/bayesnet/classifiers/SPODE.h.func.html index 3e3dde2..74f9e37 100644 --- a/html/bayesnet/classifiers/SPODE.h.func.html +++ b/html/bayesnet/classifiers/SPODE.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,21 +65,21 @@ _ZN8bayesnet5SPODED0Ev - 401 + 337 _ZN8bayesnet5SPODED0Ev - 180 + 148 _ZN8bayesnet5SPODED2Ev - 221 + 189 diff --git a/html/bayesnet/classifiers/SPODE.h.gcov.html b/html/bayesnet/classifiers/SPODE.h.gcov.html index 6941aef..699f8ce 100644 --- a/html/bayesnet/classifiers/SPODE.h.gcov.html +++ b/html/bayesnet/classifiers/SPODE.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -78,7 +78,7 @@ 16 : void buildModel(const torch::Tensor& weights) override; 17 : public: 18 : explicit SPODE(int root); - 19 401 : virtual ~SPODE() = default; + 19 337 : virtual ~SPODE() = default; 20 : std::vector<std::string> graph(const std::string& name = "SPODE") const override; 21 : }; 22 : } diff --git a/html/bayesnet/classifiers/SPODELd.cc.func-c.html b/html/bayesnet/classifiers/SPODELd.cc.func-c.html index 132c081..7d144a2 100644 --- a/html/bayesnet/classifiers/SPODELd.cc.func-c.html +++ b/html/bayesnet/classifiers/SPODELd.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,42 +65,42 @@ _ZN8bayesnet7SPODELd3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 2 + 22 _ZNK8bayesnet7SPODELd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 9 + 99 _ZN8bayesnet7SPODELd7predictERN2at6TensorE - 34 + 374 _ZN8bayesnet7SPODELd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 42 + 462 _ZN8bayesnet7SPODELd9commonFitERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEE - 43 + 473 _ZN8bayesnet7SPODELdC2Ei - 55 + 605 diff --git a/html/bayesnet/classifiers/SPODELd.cc.func.html b/html/bayesnet/classifiers/SPODELd.cc.func.html index faaada6..c11e080 100644 --- a/html/bayesnet/classifiers/SPODELd.cc.func.html +++ b/html/bayesnet/classifiers/SPODELd.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,42 +65,42 @@ _ZN8bayesnet7SPODELd3fitERN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 2 + 22 _ZN8bayesnet7SPODELd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 42 + 462 _ZN8bayesnet7SPODELd7predictERN2at6TensorE - 34 + 374 _ZN8bayesnet7SPODELd9commonFitERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEE - 43 + 473 _ZN8bayesnet7SPODELdC2Ei - 55 + 605 _ZNK8bayesnet7SPODELd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 9 + 99 diff --git a/html/bayesnet/classifiers/SPODELd.cc.gcov.html b/html/bayesnet/classifiers/SPODELd.cc.gcov.html index 84af208..15dab9c 100644 --- a/html/bayesnet/classifiers/SPODELd.cc.gcov.html +++ b/html/bayesnet/classifiers/SPODELd.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,45 +69,45 @@ 7 : #include "SPODELd.h" 8 : 9 : namespace bayesnet { - 10 55 : SPODELd::SPODELd(int root) : SPODE(root), Proposal(dataset, features, className) {} - 11 42 : SPODELd& SPODELd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 10 605 : SPODELd::SPODELd(int root) : SPODE(root), Proposal(dataset, features, className) {} + 11 462 : SPODELd& SPODELd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 12 : { - 13 42 : checkInput(X_, y_); - 14 42 : Xf = X_; - 15 42 : y = y_; - 16 42 : return commonFit(features_, className_, states_); + 13 462 : checkInput(X_, y_); + 14 462 : Xf = X_; + 15 462 : y = y_; + 16 462 : return commonFit(features_, className_, states_); 17 : } 18 : - 19 2 : SPODELd& SPODELd::fit(torch::Tensor& dataset, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 19 22 : SPODELd& SPODELd::fit(torch::Tensor& dataset, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 20 : { - 21 2 : if (!torch::is_floating_point(dataset)) { - 22 1 : throw std::runtime_error("Dataset must be a floating point tensor"); + 21 22 : if (!torch::is_floating_point(dataset)) { + 22 11 : throw std::runtime_error("Dataset must be a floating point tensor"); 23 : } - 24 4 : Xf = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), "..." }).clone(); - 25 3 : y = dataset.index({ -1, "..." }).clone().to(torch::kInt32); - 26 1 : return commonFit(features_, className_, states_); - 27 3 : } + 24 44 : Xf = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), "..." }).clone(); + 25 33 : y = dataset.index({ -1, "..." }).clone().to(torch::kInt32); + 26 11 : return commonFit(features_, className_, states_); + 27 33 : } 28 : - 29 43 : SPODELd& SPODELd::commonFit(const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 29 473 : SPODELd& SPODELd::commonFit(const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 30 : { - 31 43 : features = features_; - 32 43 : className = className_; + 31 473 : features = features_; + 32 473 : className = className_; 33 : // Fills std::vectors Xv & yv with the data from tensors X_ (discretized) & y - 34 43 : states = fit_local_discretization(y); + 34 473 : states = fit_local_discretization(y); 35 : // We have discretized the input data 36 : // 1st we need to fit the model to build the normal SPODE structure, SPODE::fit initializes the base Bayesian network - 37 43 : SPODE::fit(dataset, features, className, states); - 38 43 : states = localDiscretizationProposal(states, model); - 39 43 : return *this; + 37 473 : SPODE::fit(dataset, features, className, states); + 38 473 : states = localDiscretizationProposal(states, model); + 39 473 : return *this; 40 : } - 41 34 : torch::Tensor SPODELd::predict(torch::Tensor& X) + 41 374 : torch::Tensor SPODELd::predict(torch::Tensor& X) 42 : { - 43 34 : auto Xt = prepareX(X); - 44 68 : return SPODE::predict(Xt); - 45 34 : } - 46 9 : std::vector<std::string> SPODELd::graph(const std::string& name) const + 43 374 : auto Xt = prepareX(X); + 44 748 : return SPODE::predict(Xt); + 45 374 : } + 46 99 : std::vector<std::string> SPODELd::graph(const std::string& name) const 47 : { - 48 9 : return SPODE::graph(name); + 48 99 : return SPODE::graph(name); 49 : } 50 : } diff --git a/html/bayesnet/classifiers/SPODELd.h.func-c.html b/html/bayesnet/classifiers/SPODELd.h.func-c.html index 1f39acb..2261f26 100644 --- a/html/bayesnet/classifiers/SPODELd.h.func-c.html +++ b/html/bayesnet/classifiers/SPODELd.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/SPODELd.h.func.html b/html/bayesnet/classifiers/SPODELd.h.func.html index 1443afd..951a8d4 100644 --- a/html/bayesnet/classifiers/SPODELd.h.func.html +++ b/html/bayesnet/classifiers/SPODELd.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/SPODELd.h.gcov.html b/html/bayesnet/classifiers/SPODELd.h.gcov.html index ae12675..37210c0 100644 --- a/html/bayesnet/classifiers/SPODELd.h.gcov.html +++ b/html/bayesnet/classifiers/SPODELd.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TAN.cc.func-c.html b/html/bayesnet/classifiers/TAN.cc.func-c.html index cd3e30d..6850650 100644 --- a/html/bayesnet/classifiers/TAN.cc.func-c.html +++ b/html/bayesnet/classifiers/TAN.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZNK8bayesnet3TAN5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 2 + 22 _ZN8bayesnet3TAN10buildModelERKN2at6TensorE - 13 + 143 _ZN8bayesnet3TANC2Ev - 47 + 517 _ZZN8bayesnet3TAN10buildModelERKN2at6TensorEENKUlRKT_RKT0_E_clISt4pairIifESE_EEDaS7_SA_ - 162 + 1782 diff --git a/html/bayesnet/classifiers/TAN.cc.func.html b/html/bayesnet/classifiers/TAN.cc.func.html index 2212fa4..52d9fc9 100644 --- a/html/bayesnet/classifiers/TAN.cc.func.html +++ b/html/bayesnet/classifiers/TAN.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet3TAN10buildModelERKN2at6TensorE - 13 + 143 _ZN8bayesnet3TANC2Ev - 47 + 517 _ZNK8bayesnet3TAN5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 2 + 22 _ZZN8bayesnet3TAN10buildModelERKN2at6TensorEENKUlRKT_RKT0_E_clISt4pairIifESE_EEDaS7_SA_ - 162 + 1782 diff --git a/html/bayesnet/classifiers/TAN.cc.gcov.html b/html/bayesnet/classifiers/TAN.cc.gcov.html index e9bec0b..41b147a 100644 --- a/html/bayesnet/classifiers/TAN.cc.gcov.html +++ b/html/bayesnet/classifiers/TAN.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,40 +69,40 @@ 7 : #include "TAN.h" 8 : 9 : namespace bayesnet { - 10 47 : TAN::TAN() : Classifier(Network()) {} + 10 517 : TAN::TAN() : Classifier(Network()) {} 11 : - 12 13 : void TAN::buildModel(const torch::Tensor& weights) + 12 143 : void TAN::buildModel(const torch::Tensor& weights) 13 : { 14 : // 0. Add all nodes to the model - 15 13 : addNodes(); + 15 143 : addNodes(); 16 : // 1. Compute mutual information between each feature and the class and set the root node 17 : // as the highest mutual information with the class - 18 13 : auto mi = std::vector <std::pair<int, float >>(); - 19 39 : torch::Tensor class_dataset = dataset.index({ -1, "..." }); - 20 89 : for (int i = 0; i < static_cast<int>(features.size()); ++i) { - 21 228 : torch::Tensor feature_dataset = dataset.index({ i, "..." }); - 22 76 : auto mi_value = metrics.mutualInformation(class_dataset, feature_dataset, weights); - 23 76 : mi.push_back({ i, mi_value }); - 24 76 : } - 25 175 : sort(mi.begin(), mi.end(), [](const auto& left, const auto& right) {return left.second < right.second;}); - 26 13 : auto root = mi[mi.size() - 1].first; + 18 143 : auto mi = std::vector <std::pair<int, float >>(); + 19 429 : torch::Tensor class_dataset = dataset.index({ -1, "..." }); + 20 979 : for (int i = 0; i < static_cast<int>(features.size()); ++i) { + 21 2508 : torch::Tensor feature_dataset = dataset.index({ i, "..." }); + 22 836 : auto mi_value = metrics.mutualInformation(class_dataset, feature_dataset, weights); + 23 836 : mi.push_back({ i, mi_value }); + 24 836 : } + 25 1925 : sort(mi.begin(), mi.end(), [](const auto& left, const auto& right) {return left.second < right.second;}); + 26 143 : auto root = mi[mi.size() - 1].first; 27 : // 2. Compute mutual information between each feature and the class - 28 13 : auto weights_matrix = metrics.conditionalEdge(weights); + 28 143 : auto weights_matrix = metrics.conditionalEdge(weights); 29 : // 3. Compute the maximum spanning tree - 30 13 : auto mst = metrics.maximumSpanningTree(features, weights_matrix, root); + 30 143 : auto mst = metrics.maximumSpanningTree(features, weights_matrix, root); 31 : // 4. Add edges from the maximum spanning tree to the model - 32 76 : for (auto i = 0; i < mst.size(); ++i) { - 33 63 : auto [from, to] = mst[i]; - 34 63 : model.addEdge(features[from], features[to]); + 32 836 : for (auto i = 0; i < mst.size(); ++i) { + 33 693 : auto [from, to] = mst[i]; + 34 693 : model.addEdge(features[from], features[to]); 35 : } 36 : // 5. Add edges from the class to all features - 37 89 : for (auto feature : features) { - 38 76 : model.addEdge(className, feature); - 39 76 : } - 40 102 : } - 41 2 : std::vector<std::string> TAN::graph(const std::string& title) const + 37 979 : for (auto feature : features) { + 38 836 : model.addEdge(className, feature); + 39 836 : } + 40 1122 : } + 41 22 : std::vector<std::string> TAN::graph(const std::string& title) const 42 : { - 43 2 : return model.graph(title); + 43 22 : return model.graph(title); 44 : } 45 : } diff --git a/html/bayesnet/classifiers/TAN.h.func-c.html b/html/bayesnet/classifiers/TAN.h.func-c.html index cbb6283..00b7f9c 100644 --- a/html/bayesnet/classifiers/TAN.h.func-c.html +++ b/html/bayesnet/classifiers/TAN.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TAN.h.func.html b/html/bayesnet/classifiers/TAN.h.func.html index 9a1efde..2a1ee6c 100644 --- a/html/bayesnet/classifiers/TAN.h.func.html +++ b/html/bayesnet/classifiers/TAN.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TAN.h.gcov.html b/html/bayesnet/classifiers/TAN.h.gcov.html index a8b4b61..561772c 100644 --- a/html/bayesnet/classifiers/TAN.h.gcov.html +++ b/html/bayesnet/classifiers/TAN.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TANLd.cc.func-c.html b/html/bayesnet/classifiers/TANLd.cc.func-c.html index 479c946..fba6e70 100644 --- a/html/bayesnet/classifiers/TANLd.cc.func-c.html +++ b/html/bayesnet/classifiers/TANLd.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZNK8bayesnet5TANLd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 _ZN8bayesnet5TANLd7predictERN2at6TensorE - 4 + 44 _ZN8bayesnet5TANLd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet5TANLdC2Ev - 17 + 187 diff --git a/html/bayesnet/classifiers/TANLd.cc.func.html b/html/bayesnet/classifiers/TANLd.cc.func.html index af2ec8a..3c4dd2a 100644 --- a/html/bayesnet/classifiers/TANLd.cc.func.html +++ b/html/bayesnet/classifiers/TANLd.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet5TANLd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet5TANLd7predictERN2at6TensorE - 4 + 44 _ZN8bayesnet5TANLdC2Ev - 17 + 187 _ZNK8bayesnet5TANLd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 diff --git a/html/bayesnet/classifiers/TANLd.cc.gcov.html b/html/bayesnet/classifiers/TANLd.cc.gcov.html index 38a3d05..dd84f5d 100644 --- a/html/bayesnet/classifiers/TANLd.cc.gcov.html +++ b/html/bayesnet/classifiers/TANLd.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,31 +69,31 @@ 7 : #include "TANLd.h" 8 : 9 : namespace bayesnet { - 10 17 : TANLd::TANLd() : TAN(), Proposal(dataset, features, className) {} - 11 5 : TANLd& TANLd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 10 187 : TANLd::TANLd() : TAN(), Proposal(dataset, features, className) {} + 11 55 : TANLd& TANLd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 12 : { - 13 5 : checkInput(X_, y_); - 14 5 : features = features_; - 15 5 : className = className_; - 16 5 : Xf = X_; - 17 5 : y = y_; + 13 55 : checkInput(X_, y_); + 14 55 : features = features_; + 15 55 : className = className_; + 16 55 : Xf = X_; + 17 55 : y = y_; 18 : // Fills std::vectors Xv & yv with the data from tensors X_ (discretized) & y - 19 5 : states = fit_local_discretization(y); + 19 55 : states = fit_local_discretization(y); 20 : // We have discretized the input data 21 : // 1st we need to fit the model to build the normal TAN structure, TAN::fit initializes the base Bayesian network - 22 5 : TAN::fit(dataset, features, className, states); - 23 5 : states = localDiscretizationProposal(states, model); - 24 5 : return *this; + 22 55 : TAN::fit(dataset, features, className, states); + 23 55 : states = localDiscretizationProposal(states, model); + 24 55 : return *this; 25 : 26 : } - 27 4 : torch::Tensor TANLd::predict(torch::Tensor& X) + 27 44 : torch::Tensor TANLd::predict(torch::Tensor& X) 28 : { - 29 4 : auto Xt = prepareX(X); - 30 8 : return TAN::predict(Xt); - 31 4 : } - 32 1 : std::vector<std::string> TANLd::graph(const std::string& name) const + 29 44 : auto Xt = prepareX(X); + 30 88 : return TAN::predict(Xt); + 31 44 : } + 32 11 : std::vector<std::string> TANLd::graph(const std::string& name) const 33 : { - 34 1 : return TAN::graph(name); + 34 11 : return TAN::graph(name); 35 : } 36 : } diff --git a/html/bayesnet/classifiers/TANLd.h.func-c.html b/html/bayesnet/classifiers/TANLd.h.func-c.html index 0b4cc72..3465c24 100644 --- a/html/bayesnet/classifiers/TANLd.h.func-c.html +++ b/html/bayesnet/classifiers/TANLd.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TANLd.h.func.html b/html/bayesnet/classifiers/TANLd.h.func.html index 9aa6b0e..268a55d 100644 --- a/html/bayesnet/classifiers/TANLd.h.func.html +++ b/html/bayesnet/classifiers/TANLd.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/TANLd.h.gcov.html b/html/bayesnet/classifiers/TANLd.h.gcov.html index 2faafc7..d466127 100644 --- a/html/bayesnet/classifiers/TANLd.h.gcov.html +++ b/html/bayesnet/classifiers/TANLd.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/classifiers/index-sort-f.html b/html/bayesnet/classifiers/index-sort-f.html index 7e8669d..a4fd90e 100644 --- a/html/bayesnet/classifiers/index-sort-f.html +++ b/html/bayesnet/classifiers/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.4 % diff --git a/html/bayesnet/classifiers/index-sort-l.html b/html/bayesnet/classifiers/index-sort-l.html index e47c6a2..e788707 100644 --- a/html/bayesnet/classifiers/index-sort-l.html +++ b/html/bayesnet/classifiers/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.4 % diff --git a/html/bayesnet/classifiers/index.html b/html/bayesnet/classifiers/index.html index 16c9cd1..ae92c6b 100644 --- a/html/bayesnet/classifiers/index.html +++ b/html/bayesnet/classifiers/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.4 % diff --git a/html/bayesnet/ensembles/AODE.cc.func-c.html b/html/bayesnet/ensembles/AODE.cc.func-c.html index d3ad76c..7b3e5d9 100644 --- a/html/bayesnet/ensembles/AODE.cc.func-c.html +++ b/html/bayesnet/ensembles/AODE.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet4AODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 1 + 11 _ZNK8bayesnet4AODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 _ZN8bayesnet4AODE10buildModelERKN2at6TensorE - 6 + 66 _ZN8bayesnet4AODEC2Eb - 19 + 209 diff --git a/html/bayesnet/ensembles/AODE.cc.func.html b/html/bayesnet/ensembles/AODE.cc.func.html index fcbba8f..219adf1 100644 --- a/html/bayesnet/ensembles/AODE.cc.func.html +++ b/html/bayesnet/ensembles/AODE.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet4AODE10buildModelERKN2at6TensorE - 6 + 66 _ZN8bayesnet4AODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 1 + 11 _ZN8bayesnet4AODEC2Eb - 19 + 209 _ZNK8bayesnet4AODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 diff --git a/html/bayesnet/ensembles/AODE.cc.gcov.html b/html/bayesnet/ensembles/AODE.cc.gcov.html index 2ace5c3..cac3b51 100644 --- a/html/bayesnet/ensembles/AODE.cc.gcov.html +++ b/html/bayesnet/ensembles/AODE.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,33 +69,33 @@ 7 : #include "AODE.h" 8 : 9 : namespace bayesnet { - 10 19 : AODE::AODE(bool predict_voting) : Ensemble(predict_voting) + 10 209 : AODE::AODE(bool predict_voting) : Ensemble(predict_voting) 11 : { - 12 38 : validHyperparameters = { "predict_voting" }; + 12 418 : validHyperparameters = { "predict_voting" }; 13 : - 14 57 : } - 15 1 : void AODE::setHyperparameters(const nlohmann::json& hyperparameters_) + 14 627 : } + 15 11 : void AODE::setHyperparameters(const nlohmann::json& hyperparameters_) 16 : { - 17 1 : auto hyperparameters = hyperparameters_; - 18 1 : if (hyperparameters.contains("predict_voting")) { - 19 1 : predict_voting = hyperparameters["predict_voting"]; - 20 1 : hyperparameters.erase("predict_voting"); + 17 11 : auto hyperparameters = hyperparameters_; + 18 11 : if (hyperparameters.contains("predict_voting")) { + 19 11 : predict_voting = hyperparameters["predict_voting"]; + 20 11 : hyperparameters.erase("predict_voting"); 21 : } - 22 1 : Classifier::setHyperparameters(hyperparameters); - 23 1 : } - 24 6 : void AODE::buildModel(const torch::Tensor& weights) + 22 11 : Classifier::setHyperparameters(hyperparameters); + 23 11 : } + 24 66 : void AODE::buildModel(const torch::Tensor& weights) 25 : { - 26 6 : models.clear(); - 27 6 : significanceModels.clear(); - 28 47 : for (int i = 0; i < features.size(); ++i) { - 29 41 : models.push_back(std::make_unique<SPODE>(i)); + 26 66 : models.clear(); + 27 66 : significanceModels.clear(); + 28 517 : for (int i = 0; i < features.size(); ++i) { + 29 451 : models.push_back(std::make_unique<SPODE>(i)); 30 : } - 31 6 : n_models = models.size(); - 32 6 : significanceModels = std::vector<double>(n_models, 1.0); - 33 6 : } - 34 1 : std::vector<std::string> AODE::graph(const std::string& title) const + 31 66 : n_models = models.size(); + 32 66 : significanceModels = std::vector<double>(n_models, 1.0); + 33 66 : } + 34 11 : std::vector<std::string> AODE::graph(const std::string& title) const 35 : { - 36 1 : return Ensemble::graph(title); + 36 11 : return Ensemble::graph(title); 37 : } 38 : } diff --git a/html/bayesnet/ensembles/AODE.h.func-c.html b/html/bayesnet/ensembles/AODE.h.func-c.html index 9756df5..771cd92 100644 --- a/html/bayesnet/ensembles/AODE.h.func-c.html +++ b/html/bayesnet/ensembles/AODE.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/AODE.h.func.html b/html/bayesnet/ensembles/AODE.h.func.html index 28f4cba..94b5da8 100644 --- a/html/bayesnet/ensembles/AODE.h.func.html +++ b/html/bayesnet/ensembles/AODE.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/AODE.h.gcov.html b/html/bayesnet/ensembles/AODE.h.gcov.html index 8fbf254..a19daf2 100644 --- a/html/bayesnet/ensembles/AODE.h.gcov.html +++ b/html/bayesnet/ensembles/AODE.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/AODELd.cc.func-c.html b/html/bayesnet/ensembles/AODELd.cc.func-c.html index c4127b6..611811d 100644 --- a/html/bayesnet/ensembles/AODELd.cc.func-c.html +++ b/html/bayesnet/ensembles/AODELd.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZNK8bayesnet6AODELd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 _ZN8bayesnet6AODELd10buildModelERKN2at6TensorE - 5 + 55 _ZN8bayesnet6AODELd10trainModelERKN2at6TensorE - 5 + 55 _ZN8bayesnet6AODELd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet6AODELdC2Eb - 17 + 187 diff --git a/html/bayesnet/ensembles/AODELd.cc.func.html b/html/bayesnet/ensembles/AODELd.cc.func.html index cf64435..2a31c86 100644 --- a/html/bayesnet/ensembles/AODELd.cc.func.html +++ b/html/bayesnet/ensembles/AODELd.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZN8bayesnet6AODELd10buildModelERKN2at6TensorE - 5 + 55 _ZN8bayesnet6AODELd10trainModelERKN2at6TensorE - 5 + 55 _ZN8bayesnet6AODELd3fitERN2at6TensorES3_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EERKSA_RSt3mapISA_S4_IiSaIiEESt4lessISA_ESaISt4pairISF_SJ_EEE - 5 + 55 _ZN8bayesnet6AODELdC2Eb - 17 + 187 _ZNK8bayesnet6AODELd5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 1 + 11 diff --git a/html/bayesnet/ensembles/AODELd.cc.gcov.html b/html/bayesnet/ensembles/AODELd.cc.gcov.html index 608ff92..5d54c5f 100644 --- a/html/bayesnet/ensembles/AODELd.cc.gcov.html +++ b/html/bayesnet/ensembles/AODELd.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -69,42 +69,42 @@ 7 : #include "AODELd.h" 8 : 9 : namespace bayesnet { - 10 17 : AODELd::AODELd(bool predict_voting) : Ensemble(predict_voting), Proposal(dataset, features, className) + 10 187 : AODELd::AODELd(bool predict_voting) : Ensemble(predict_voting), Proposal(dataset, features, className) 11 : { - 12 17 : } - 13 5 : AODELd& AODELd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) + 12 187 : } + 13 55 : AODELd& AODELd::fit(torch::Tensor& X_, torch::Tensor& y_, const std::vector<std::string>& features_, const std::string& className_, map<std::string, std::vector<int>>& states_) 14 : { - 15 5 : checkInput(X_, y_); - 16 5 : features = features_; - 17 5 : className = className_; - 18 5 : Xf = X_; - 19 5 : y = y_; + 15 55 : checkInput(X_, y_); + 16 55 : features = features_; + 17 55 : className = className_; + 18 55 : Xf = X_; + 19 55 : y = y_; 20 : // Fills std::vectors Xv & yv with the data from tensors X_ (discretized) & y - 21 5 : states = fit_local_discretization(y); + 21 55 : states = fit_local_discretization(y); 22 : // We have discretized the input data 23 : // 1st we need to fit the model to build the normal TAN structure, TAN::fit initializes the base Bayesian network - 24 5 : Ensemble::fit(dataset, features, className, states); - 25 5 : return *this; + 24 55 : Ensemble::fit(dataset, features, className, states); + 25 55 : return *this; 26 : 27 : } - 28 5 : void AODELd::buildModel(const torch::Tensor& weights) + 28 55 : void AODELd::buildModel(const torch::Tensor& weights) 29 : { - 30 5 : models.clear(); - 31 42 : for (int i = 0; i < features.size(); ++i) { - 32 37 : models.push_back(std::make_unique<SPODELd>(i)); + 30 55 : models.clear(); + 31 462 : for (int i = 0; i < features.size(); ++i) { + 32 407 : models.push_back(std::make_unique<SPODELd>(i)); 33 : } - 34 5 : n_models = models.size(); - 35 5 : significanceModels = std::vector<double>(n_models, 1.0); - 36 5 : } - 37 5 : void AODELd::trainModel(const torch::Tensor& weights) + 34 55 : n_models = models.size(); + 35 55 : significanceModels = std::vector<double>(n_models, 1.0); + 36 55 : } + 37 55 : void AODELd::trainModel(const torch::Tensor& weights) 38 : { - 39 42 : for (const auto& model : models) { - 40 37 : model->fit(Xf, y, features, className, states); + 39 462 : for (const auto& model : models) { + 40 407 : model->fit(Xf, y, features, className, states); 41 : } - 42 5 : } - 43 1 : std::vector<std::string> AODELd::graph(const std::string& name) const + 42 55 : } + 43 11 : std::vector<std::string> AODELd::graph(const std::string& name) const 44 : { - 45 1 : return Ensemble::graph(name); + 45 11 : return Ensemble::graph(name); 46 : } 47 : } diff --git a/html/bayesnet/ensembles/AODELd.h.func-c.html b/html/bayesnet/ensembles/AODELd.h.func-c.html index f149f31..9838de0 100644 --- a/html/bayesnet/ensembles/AODELd.h.func-c.html +++ b/html/bayesnet/ensembles/AODELd.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/AODELd.h.func.html b/html/bayesnet/ensembles/AODELd.h.func.html index 4760745..e7ca1eb 100644 --- a/html/bayesnet/ensembles/AODELd.h.func.html +++ b/html/bayesnet/ensembles/AODELd.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/AODELd.h.gcov.html b/html/bayesnet/ensembles/AODELd.h.gcov.html index 6ce0ab6..3dc2694 100644 --- a/html/bayesnet/ensembles/AODELd.h.gcov.html +++ b/html/bayesnet/ensembles/AODELd.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/BoostAODE.cc.func-c.html b/html/bayesnet/ensembles/BoostAODE.cc.func-c.html index 4212a23..729c321 100644 --- a/html/bayesnet/ensembles/BoostAODE.cc.func-c.html +++ b/html/bayesnet/ensembles/BoostAODE.cc.func-c.html @@ -31,13 +31,13 @@ coverage.info Lines: - 99.1 % - 218 - 216 + 98.3 % + 237 + 233 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -63,65 +63,65 @@ - _ZNK8bayesnet9BoostAODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - - 1 - - - - - _ZN8bayesnet9BoostAODE20update_weights_blockEiRN2at6TensorES3_ - - 5 - - - - - _ZN8bayesnet9BoostAODE16initializeModelsEv + _ZNK8bayesnet9BoostAODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 8 - _ZN8bayesnet9BoostAODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE + _ZN8bayesnet9BoostAODE20update_weights_blockEiRN2at6TensorES3_ - 20 + 40 - _ZN8bayesnet9BoostAODE10buildModelERKN2at6TensorE + _ZN8bayesnet9BoostAODE16initializeModelsEv - 21 + 76 - _ZN8bayesnet9BoostAODE10trainModelERKN2at6TensorE + _ZN8bayesnet9BoostAODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE - 21 + 187 - _ZN8bayesnet9BoostAODEC2Eb + _ZN8bayesnet9BoostAODE10buildModelERKN2at6TensorE - 41 + 190 - _ZN8bayesnet14update_weightsERN2at6TensorES2_S2_ + _ZN8bayesnet9BoostAODE10trainModelERKN2at6TensorE - 108 + 190 - _ZZN8bayesnet9BoostAODE10trainModelERKN2at6TensorEENKUlT_E_clIiEEDaS5_ + _ZN8bayesnet9BoostAODEC2Eb - 2691 + 345 + + + + + _ZN8bayesnet14update_weightsERN2at6TensorES2_S2_ + + 1025 + + + + + _ZZN8bayesnet9BoostAODE10trainModelERKN2at6TensorEENKUlT_E_clIiEEDaS5_ + + 27637 diff --git a/html/bayesnet/ensembles/BoostAODE.cc.func.html b/html/bayesnet/ensembles/BoostAODE.cc.func.html index a446760..4b3cdae 100644 --- a/html/bayesnet/ensembles/BoostAODE.cc.func.html +++ b/html/bayesnet/ensembles/BoostAODE.cc.func.html @@ -31,13 +31,13 @@ coverage.info Lines: - 99.1 % - 218 - 216 + 98.3 % + 237 + 233 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -63,65 +63,65 @@ - _ZN8bayesnet14update_weightsERN2at6TensorES2_S2_ + _ZN8bayesnet14update_weightsERN2at6TensorES2_S2_ - 108 + 1025 - _ZN8bayesnet9BoostAODE10buildModelERKN2at6TensorE + _ZN8bayesnet9BoostAODE10buildModelERKN2at6TensorE - 21 + 190 - _ZN8bayesnet9BoostAODE10trainModelERKN2at6TensorE + _ZN8bayesnet9BoostAODE10trainModelERKN2at6TensorE - 21 + 190 - _ZN8bayesnet9BoostAODE16initializeModelsEv + _ZN8bayesnet9BoostAODE16initializeModelsEv + + 76 + + + + + _ZN8bayesnet9BoostAODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE + + 187 + + + + + _ZN8bayesnet9BoostAODE20update_weights_blockEiRN2at6TensorES3_ + + 40 + + + + + _ZN8bayesnet9BoostAODEC2Eb + + 345 + + + + + _ZNK8bayesnet9BoostAODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 8 - _ZN8bayesnet9BoostAODE18setHyperparametersERKN8nlohmann16json_abi_v3_11_310basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEvEE + _ZZN8bayesnet9BoostAODE10trainModelERKN2at6TensorEENKUlT_E_clIiEEDaS5_ - 20 - - - - - _ZN8bayesnet9BoostAODE20update_weights_blockEiRN2at6TensorES3_ - - 5 - - - - - _ZN8bayesnet9BoostAODEC2Eb - - 41 - - - - - _ZNK8bayesnet9BoostAODE5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - - 1 - - - - - _ZZN8bayesnet9BoostAODE10trainModelERKN2at6TensorEENKUlT_E_clIiEEDaS5_ - - 2691 + 27637 diff --git a/html/bayesnet/ensembles/BoostAODE.cc.gcov.html b/html/bayesnet/ensembles/BoostAODE.cc.gcov.html index 82f2511..92f4443 100644 --- a/html/bayesnet/ensembles/BoostAODE.cc.gcov.html +++ b/html/bayesnet/ensembles/BoostAODE.cc.gcov.html @@ -31,13 +31,13 @@ coverage.info Lines: - 99.1 % - 218 - 216 + 98.3 % + 237 + 233 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -75,364 +75,387 @@ 13 : #include "bayesnet/feature_selection/FCBF.h" 14 : #include "bayesnet/feature_selection/IWSS.h" 15 : #include "BoostAODE.h" - 16 : - 17 : namespace bayesnet { - 18 : - 19 41 : BoostAODE::BoostAODE(bool predict_voting) : Ensemble(predict_voting) - 20 : { - 21 410 : validHyperparameters = { - 22 : "maxModels", "bisection", "order", "convergence", "threshold", - 23 : "select_features", "maxTolerance", "predict_voting", "block_update" - 24 410 : }; - 25 : - 26 123 : } - 27 21 : void BoostAODE::buildModel(const torch::Tensor& weights) - 28 : { - 29 : // Models shall be built in trainModel - 30 21 : models.clear(); - 31 21 : significanceModels.clear(); - 32 21 : n_models = 0; - 33 : // Prepare the validation dataset - 34 63 : auto y_ = dataset.index({ -1, "..." }); - 35 21 : if (convergence) { - 36 : // Prepare train & validation sets from train data - 37 17 : auto fold = folding::StratifiedKFold(5, y_, 271); - 38 17 : auto [train, test] = fold.getFold(0); - 39 17 : auto train_t = torch::tensor(train); - 40 17 : auto test_t = torch::tensor(test); - 41 : // Get train and validation sets - 42 85 : X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), train_t }); - 43 51 : y_train = dataset.index({ -1, train_t }); - 44 85 : X_test = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), test_t }); - 45 51 : y_test = dataset.index({ -1, test_t }); - 46 17 : dataset = X_train; - 47 17 : m = X_train.size(1); - 48 17 : auto n_classes = states.at(className).size(); - 49 : // Build dataset with train data - 50 17 : buildDataset(y_train); - 51 17 : metrics = Metrics(dataset, features, className, n_classes); - 52 17 : } else { - 53 : // Use all data to train - 54 16 : X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), "..." }); - 55 4 : y_train = y_; - 56 : } - 57 203 : } - 58 20 : void BoostAODE::setHyperparameters(const nlohmann::json& hyperparameters_) - 59 : { - 60 20 : auto hyperparameters = hyperparameters_; - 61 20 : if (hyperparameters.contains("order")) { - 62 25 : std::vector<std::string> algos = { Orders.ASC, Orders.DESC, Orders.RAND }; - 63 5 : order_algorithm = hyperparameters["order"]; - 64 5 : if (std::find(algos.begin(), algos.end(), order_algorithm) == algos.end()) { - 65 1 : throw std::invalid_argument("Invalid order algorithm, valid values [" + Orders.ASC + ", " + Orders.DESC + ", " + Orders.RAND + "]"); - 66 : } - 67 4 : hyperparameters.erase("order"); - 68 5 : } - 69 19 : if (hyperparameters.contains("convergence")) { - 70 7 : convergence = hyperparameters["convergence"]; - 71 7 : hyperparameters.erase("convergence"); - 72 : } - 73 19 : if (hyperparameters.contains("bisection")) { - 74 6 : bisection = hyperparameters["bisection"]; - 75 6 : hyperparameters.erase("bisection"); - 76 : } - 77 19 : if (hyperparameters.contains("threshold")) { - 78 6 : threshold = hyperparameters["threshold"]; - 79 6 : hyperparameters.erase("threshold"); - 80 : } - 81 19 : if (hyperparameters.contains("maxTolerance")) { - 82 9 : maxTolerance = hyperparameters["maxTolerance"]; - 83 9 : if (maxTolerance < 1 || maxTolerance > 4) - 84 3 : throw std::invalid_argument("Invalid maxTolerance value, must be greater in [1, 4]"); - 85 6 : hyperparameters.erase("maxTolerance"); - 86 : } - 87 16 : if (hyperparameters.contains("predict_voting")) { - 88 1 : predict_voting = hyperparameters["predict_voting"]; - 89 1 : hyperparameters.erase("predict_voting"); - 90 : } - 91 16 : if (hyperparameters.contains("select_features")) { - 92 9 : auto selectedAlgorithm = hyperparameters["select_features"]; - 93 45 : std::vector<std::string> algos = { SelectFeatures.IWSS, SelectFeatures.CFS, SelectFeatures.FCBF }; - 94 9 : selectFeatures = true; - 95 9 : select_features_algorithm = selectedAlgorithm; - 96 9 : if (std::find(algos.begin(), algos.end(), selectedAlgorithm) == algos.end()) { - 97 1 : throw std::invalid_argument("Invalid selectFeatures value, valid values [" + SelectFeatures.IWSS + ", " + SelectFeatures.CFS + ", " + SelectFeatures.FCBF + "]"); - 98 : } - 99 8 : hyperparameters.erase("select_features"); - 100 10 : } - 101 15 : if (hyperparameters.contains("block_update")) { - 102 2 : block_update = hyperparameters["block_update"]; - 103 2 : hyperparameters.erase("block_update"); - 104 : } - 105 15 : Classifier::setHyperparameters(hyperparameters); - 106 34 : } - 107 108 : std::tuple<torch::Tensor&, double, bool> update_weights(torch::Tensor& ytrain, torch::Tensor& ypred, torch::Tensor& weights) - 108 : { - 109 108 : bool terminate = false; - 110 108 : double alpha_t = 0; - 111 108 : auto mask_wrong = ypred != ytrain; - 112 108 : auto mask_right = ypred == ytrain; - 113 108 : auto masked_weights = weights * mask_wrong.to(weights.dtype()); - 114 108 : double epsilon_t = masked_weights.sum().item<double>(); - 115 108 : if (epsilon_t > 0.5) { - 116 : // Inverse the weights policy (plot ln(wt)) - 117 : // "In each round of AdaBoost, there is a sanity check to ensure that the current base - 118 : // learner is better than random guess" (Zhi-Hua Zhou, 2012) - 119 4 : terminate = true; - 120 : } else { - 121 104 : double wt = (1 - epsilon_t) / epsilon_t; - 122 104 : alpha_t = epsilon_t == 0 ? 1 : 0.5 * log(wt); - 123 : // Step 3.2: Update weights for next classifier - 124 : // Step 3.2.1: Update weights of wrong samples - 125 104 : weights += mask_wrong.to(weights.dtype()) * exp(alpha_t) * weights; - 126 : // Step 3.2.2: Update weights of right samples - 127 104 : weights += mask_right.to(weights.dtype()) * exp(-alpha_t) * weights; - 128 : // Step 3.3: Normalise the weights - 129 104 : double totalWeights = torch::sum(weights).item<double>(); - 130 104 : weights = weights / totalWeights; - 131 : } - 132 216 : return { weights, alpha_t, terminate }; - 133 108 : } - 134 5 : std::tuple<torch::Tensor&, double, bool> BoostAODE::update_weights_block(int k, torch::Tensor& ytrain, torch::Tensor& weights) - 135 : { - 136 : /* Update Block algorithm - 137 : k = # of models in block - 138 : n_models = # of models in ensemble to make predictions - 139 : n_models_bak = # models saved - 140 : models = vector of models to make predictions - 141 : models_bak = models not used to make predictions - 142 : significances_bak = backup of significances vector - 143 : - 144 : Case list - 145 : A) k = 1, n_models = 1 => n = 0 , n_models = n + k - 146 : B) k = 1, n_models = n + 1 => n_models = n + k - 147 : C) k > 1, n_models = k + 1 => n= 1, n_models = n + k - 148 : D) k > 1, n_models = k => n = 0, n_models = n + k - 149 : E) k > 1, n_models = k + n => n_models = n + k - 150 : - 151 : A, D) n=0, k > 0, n_models == k - 152 : 1. n_models_bak <- n_models - 153 : 2. significances_bak <- significances - 154 : 3. significances = vector(k, 1) - 155 : 4. Don’t move any classifiers out of models - 156 : 5. n_models <- k - 157 : 6. Make prediction, compute alpha, update weights - 158 : 7. Don’t restore any classifiers to models - 159 : 8. significances <- significances_bak - 160 : 9. Update last k significances - 161 : 10. n_models <- n_models_bak - 162 : - 163 : B, C, E) n > 0, k > 0, n_models == n + k - 164 : 1. n_models_bak <- n_models - 165 : 2. significances_bak <- significances - 166 : 3. significances = vector(k, 1) - 167 : 4. Move first n classifiers to models_bak - 168 : 5. n_models <- k - 169 : 6. Make prediction, compute alpha, update weights - 170 : 7. Insert classifiers in models_bak to be the first n models - 171 : 8. significances <- significances_bak - 172 : 9. Update last k significances - 173 : 10. n_models <- n_models_bak - 174 : */ - 175 : // - 176 : // Make predict with only the last k models - 177 : // - 178 5 : std::unique_ptr<Classifier> model; - 179 5 : std::vector<std::unique_ptr<Classifier>> models_bak; - 180 : // 1. n_models_bak <- n_models 2. significances_bak <- significances - 181 5 : auto significance_bak = significanceModels; - 182 5 : auto n_models_bak = n_models; - 183 : // 3. significances = vector(k, 1) - 184 5 : significanceModels = std::vector<double>(k, 1.0); - 185 : // 4. Move first n classifiers to models_bak - 186 : // backup the first n_models - k models (if n_models == k, don't backup any) - 187 20 : for (int i = 0; i < n_models - k; ++i) { - 188 15 : model = std::move(models[0]); - 189 15 : models.erase(models.begin()); - 190 15 : models_bak.push_back(std::move(model)); - 191 : } - 192 5 : assert(models.size() == k); - 193 : // 5. n_models <- k - 194 5 : n_models = k; - 195 : // 6. Make prediction, compute alpha, update weights - 196 5 : auto ypred = predict(X_train); - 197 : // - 198 : // Update weights - 199 : // - 200 : double alpha_t; - 201 : bool terminate; - 202 5 : std::tie(weights, alpha_t, terminate) = update_weights(y_train, ypred, weights); - 203 : // - 204 : // Restore the models if needed - 205 : // - 206 : // 7. Insert classifiers in models_bak to be the first n models - 207 : // if n_models_bak == k, don't restore any, because none of them were moved - 208 5 : if (k != n_models_bak) { - 209 : // Insert in the same order as they were extracted - 210 4 : int bak_size = models_bak.size(); - 211 19 : for (int i = 0; i < bak_size; ++i) { - 212 15 : model = std::move(models_bak[bak_size - 1 - i]); - 213 15 : models_bak.erase(models_bak.end() - 1); - 214 15 : models.insert(models.begin(), std::move(model)); - 215 : } - 216 : } - 217 : // 8. significances <- significances_bak - 218 5 : significanceModels = significance_bak; - 219 : // - 220 : // Update the significance of the last k models - 221 : // - 222 : // 9. Update last k significances - 223 21 : for (int i = 0; i < k; ++i) { - 224 16 : significanceModels[n_models_bak - k + i] = alpha_t; - 225 : } - 226 : // 10. n_models <- n_models_bak - 227 5 : n_models = n_models_bak; - 228 10 : return { weights, alpha_t, terminate }; - 229 5 : } - 230 8 : std::vector<int> BoostAODE::initializeModels() - 231 : { - 232 8 : std::vector<int> featuresUsed; - 233 8 : torch::Tensor weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64); - 234 8 : int maxFeatures = 0; - 235 8 : if (select_features_algorithm == SelectFeatures.CFS) { - 236 2 : featureSelector = new CFS(dataset, features, className, maxFeatures, states.at(className).size(), weights_); - 237 6 : } else if (select_features_algorithm == SelectFeatures.IWSS) { - 238 3 : if (threshold < 0 || threshold >0.5) { - 239 2 : throw std::invalid_argument("Invalid threshold value for " + SelectFeatures.IWSS + " [0, 0.5]"); - 240 : } - 241 1 : featureSelector = new IWSS(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold); - 242 3 : } else if (select_features_algorithm == SelectFeatures.FCBF) { - 243 3 : if (threshold < 1e-7 || threshold > 1) { - 244 2 : throw std::invalid_argument("Invalid threshold value for " + SelectFeatures.FCBF + " [1e-7, 1]"); + 16 : #include "lib/log/loguru.cpp" + 17 : + 18 : namespace bayesnet { + 19 : + 20 345 : BoostAODE::BoostAODE(bool predict_voting) : Ensemble(predict_voting) + 21 : { + 22 3795 : validHyperparameters = { + 23 : "maxModels", "bisection", "order", "convergence", "convergence_best", "threshold", + 24 : "select_features", "maxTolerance", "predict_voting", "block_update" + 25 3795 : }; + 26 : + 27 1035 : } + 28 190 : void BoostAODE::buildModel(const torch::Tensor& weights) + 29 : { + 30 : // Models shall be built in trainModel + 31 190 : models.clear(); + 32 190 : significanceModels.clear(); + 33 190 : n_models = 0; + 34 : // Prepare the validation dataset + 35 570 : auto y_ = dataset.index({ -1, "..." }); + 36 190 : if (convergence) { + 37 : // Prepare train & validation sets from train data + 38 155 : auto fold = folding::StratifiedKFold(5, y_, 271); + 39 155 : auto [train, test] = fold.getFold(0); + 40 155 : auto train_t = torch::tensor(train); + 41 155 : auto test_t = torch::tensor(test); + 42 : // Get train and validation sets + 43 775 : X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), train_t }); + 44 465 : y_train = dataset.index({ -1, train_t }); + 45 775 : X_test = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), test_t }); + 46 465 : y_test = dataset.index({ -1, test_t }); + 47 155 : dataset = X_train; + 48 155 : m = X_train.size(1); + 49 155 : auto n_classes = states.at(className).size(); + 50 : // Build dataset with train data + 51 155 : buildDataset(y_train); + 52 155 : metrics = Metrics(dataset, features, className, n_classes); + 53 155 : } else { + 54 : // Use all data to train + 55 140 : X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), "..." }); + 56 35 : y_train = y_; + 57 : } + 58 1845 : } + 59 187 : void BoostAODE::setHyperparameters(const nlohmann::json& hyperparameters_) + 60 : { + 61 187 : auto hyperparameters = hyperparameters_; + 62 187 : if (hyperparameters.contains("order")) { + 63 250 : std::vector<std::string> algos = { Orders.ASC, Orders.DESC, Orders.RAND }; + 64 50 : order_algorithm = hyperparameters["order"]; + 65 50 : if (std::find(algos.begin(), algos.end(), order_algorithm) == algos.end()) { + 66 9 : throw std::invalid_argument("Invalid order algorithm, valid values [" + Orders.ASC + ", " + Orders.DESC + ", " + Orders.RAND + "]"); + 67 : } + 68 41 : hyperparameters.erase("order"); + 69 50 : } + 70 178 : if (hyperparameters.contains("convergence")) { + 71 70 : convergence = hyperparameters["convergence"]; + 72 70 : hyperparameters.erase("convergence"); + 73 : } + 74 178 : if (hyperparameters.contains("convergence_best")) { + 75 18 : convergence_best = hyperparameters["convergence_best"]; + 76 18 : hyperparameters.erase("convergence_best"); + 77 : } + 78 178 : if (hyperparameters.contains("bisection")) { + 79 56 : bisection = hyperparameters["bisection"]; + 80 56 : hyperparameters.erase("bisection"); + 81 : } + 82 178 : if (hyperparameters.contains("threshold")) { + 83 56 : threshold = hyperparameters["threshold"]; + 84 56 : hyperparameters.erase("threshold"); + 85 : } + 86 178 : if (hyperparameters.contains("maxTolerance")) { + 87 83 : maxTolerance = hyperparameters["maxTolerance"]; + 88 83 : if (maxTolerance < 1 || maxTolerance > 4) + 89 27 : throw std::invalid_argument("Invalid maxTolerance value, must be greater in [1, 4]"); + 90 56 : hyperparameters.erase("maxTolerance"); + 91 : } + 92 151 : if (hyperparameters.contains("predict_voting")) { + 93 9 : predict_voting = hyperparameters["predict_voting"]; + 94 9 : hyperparameters.erase("predict_voting"); + 95 : } + 96 151 : if (hyperparameters.contains("select_features")) { + 97 85 : auto selectedAlgorithm = hyperparameters["select_features"]; + 98 425 : std::vector<std::string> algos = { SelectFeatures.IWSS, SelectFeatures.CFS, SelectFeatures.FCBF }; + 99 85 : selectFeatures = true; + 100 85 : select_features_algorithm = selectedAlgorithm; + 101 85 : if (std::find(algos.begin(), algos.end(), selectedAlgorithm) == algos.end()) { + 102 9 : throw std::invalid_argument("Invalid selectFeatures value, valid values [" + SelectFeatures.IWSS + ", " + SelectFeatures.CFS + ", " + SelectFeatures.FCBF + "]"); + 103 : } + 104 76 : hyperparameters.erase("select_features"); + 105 94 : } + 106 142 : if (hyperparameters.contains("block_update")) { + 107 16 : block_update = hyperparameters["block_update"]; + 108 16 : hyperparameters.erase("block_update"); + 109 : } + 110 142 : Classifier::setHyperparameters(hyperparameters); + 111 322 : } + 112 1025 : std::tuple<torch::Tensor&, double, bool> update_weights(torch::Tensor& ytrain, torch::Tensor& ypred, torch::Tensor& weights) + 113 : { + 114 1025 : bool terminate = false; + 115 1025 : double alpha_t = 0; + 116 1025 : auto mask_wrong = ypred != ytrain; + 117 1025 : auto mask_right = ypred == ytrain; + 118 1025 : auto masked_weights = weights * mask_wrong.to(weights.dtype()); + 119 1025 : double epsilon_t = masked_weights.sum().item<double>(); + 120 1025 : if (epsilon_t > 0.5) { + 121 : // Inverse the weights policy (plot ln(wt)) + 122 : // "In each round of AdaBoost, there is a sanity check to ensure that the current base + 123 : // learner is better than random guess" (Zhi-Hua Zhou, 2012) + 124 34 : terminate = true; + 125 : } else { + 126 991 : double wt = (1 - epsilon_t) / epsilon_t; + 127 991 : alpha_t = epsilon_t == 0 ? 1 : 0.5 * log(wt); + 128 : // Step 3.2: Update weights for next classifier + 129 : // Step 3.2.1: Update weights of wrong samples + 130 991 : weights += mask_wrong.to(weights.dtype()) * exp(alpha_t) * weights; + 131 : // Step 3.2.2: Update weights of right samples + 132 991 : weights += mask_right.to(weights.dtype()) * exp(-alpha_t) * weights; + 133 : // Step 3.3: Normalise the weights + 134 991 : double totalWeights = torch::sum(weights).item<double>(); + 135 991 : weights = weights / totalWeights; + 136 : } + 137 2050 : return { weights, alpha_t, terminate }; + 138 1025 : } + 139 40 : std::tuple<torch::Tensor&, double, bool> BoostAODE::update_weights_block(int k, torch::Tensor& ytrain, torch::Tensor& weights) + 140 : { + 141 : /* Update Block algorithm + 142 : k = # of models in block + 143 : n_models = # of models in ensemble to make predictions + 144 : n_models_bak = # models saved + 145 : models = vector of models to make predictions + 146 : models_bak = models not used to make predictions + 147 : significances_bak = backup of significances vector + 148 : + 149 : Case list + 150 : A) k = 1, n_models = 1 => n = 0 , n_models = n + k + 151 : B) k = 1, n_models = n + 1 => n_models = n + k + 152 : C) k > 1, n_models = k + 1 => n= 1, n_models = n + k + 153 : D) k > 1, n_models = k => n = 0, n_models = n + k + 154 : E) k > 1, n_models = k + n => n_models = n + k + 155 : + 156 : A, D) n=0, k > 0, n_models == k + 157 : 1. n_models_bak <- n_models + 158 : 2. significances_bak <- significances + 159 : 3. significances = vector(k, 1) + 160 : 4. Don’t move any classifiers out of models + 161 : 5. n_models <- k + 162 : 6. Make prediction, compute alpha, update weights + 163 : 7. Don’t restore any classifiers to models + 164 : 8. significances <- significances_bak + 165 : 9. Update last k significances + 166 : 10. n_models <- n_models_bak + 167 : + 168 : B, C, E) n > 0, k > 0, n_models == n + k + 169 : 1. n_models_bak <- n_models + 170 : 2. significances_bak <- significances + 171 : 3. significances = vector(k, 1) + 172 : 4. Move first n classifiers to models_bak + 173 : 5. n_models <- k + 174 : 6. Make prediction, compute alpha, update weights + 175 : 7. Insert classifiers in models_bak to be the first n models + 176 : 8. significances <- significances_bak + 177 : 9. Update last k significances + 178 : 10. n_models <- n_models_bak + 179 : */ + 180 : // + 181 : // Make predict with only the last k models + 182 : // + 183 40 : std::unique_ptr<Classifier> model; + 184 40 : std::vector<std::unique_ptr<Classifier>> models_bak; + 185 : // 1. n_models_bak <- n_models 2. significances_bak <- significances + 186 40 : auto significance_bak = significanceModels; + 187 40 : auto n_models_bak = n_models; + 188 : // 3. significances = vector(k, 1) + 189 40 : significanceModels = std::vector<double>(k, 1.0); + 190 : // 4. Move first n classifiers to models_bak + 191 : // backup the first n_models - k models (if n_models == k, don't backup any) + 192 160 : for (int i = 0; i < n_models - k; ++i) { + 193 120 : model = std::move(models[0]); + 194 120 : models.erase(models.begin()); + 195 120 : models_bak.push_back(std::move(model)); + 196 : } + 197 40 : assert(models.size() == k); + 198 : // 5. n_models <- k + 199 40 : n_models = k; + 200 : // 6. Make prediction, compute alpha, update weights + 201 40 : auto ypred = predict(X_train); + 202 : // + 203 : // Update weights + 204 : // + 205 : double alpha_t; + 206 : bool terminate; + 207 40 : std::tie(weights, alpha_t, terminate) = update_weights(y_train, ypred, weights); + 208 : // + 209 : // Restore the models if needed + 210 : // + 211 : // 7. Insert classifiers in models_bak to be the first n models + 212 : // if n_models_bak == k, don't restore any, because none of them were moved + 213 40 : if (k != n_models_bak) { + 214 : // Insert in the same order as they were extracted + 215 32 : int bak_size = models_bak.size(); + 216 152 : for (int i = 0; i < bak_size; ++i) { + 217 120 : model = std::move(models_bak[bak_size - 1 - i]); + 218 120 : models_bak.erase(models_bak.end() - 1); + 219 120 : models.insert(models.begin(), std::move(model)); + 220 : } + 221 : } + 222 : // 8. significances <- significances_bak + 223 40 : significanceModels = significance_bak; + 224 : // + 225 : // Update the significance of the last k models + 226 : // + 227 : // 9. Update last k significances + 228 168 : for (int i = 0; i < k; ++i) { + 229 128 : significanceModels[n_models_bak - k + i] = alpha_t; + 230 : } + 231 : // 10. n_models <- n_models_bak + 232 40 : n_models = n_models_bak; + 233 80 : return { weights, alpha_t, terminate }; + 234 40 : } + 235 76 : std::vector<int> BoostAODE::initializeModels() + 236 : { + 237 76 : std::vector<int> featuresUsed; + 238 76 : torch::Tensor weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64); + 239 76 : int maxFeatures = 0; + 240 76 : if (select_features_algorithm == SelectFeatures.CFS) { + 241 20 : featureSelector = new CFS(dataset, features, className, maxFeatures, states.at(className).size(), weights_); + 242 56 : } else if (select_features_algorithm == SelectFeatures.IWSS) { + 243 29 : if (threshold < 0 || threshold >0.5) { + 244 18 : throw std::invalid_argument("Invalid threshold value for " + SelectFeatures.IWSS + " [0, 0.5]"); 245 : } - 246 1 : featureSelector = new FCBF(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold); - 247 : } - 248 4 : featureSelector->fit(); - 249 4 : auto cfsFeatures = featureSelector->getFeatures(); - 250 4 : auto scores = featureSelector->getScores(); - 251 25 : for (const int& feature : cfsFeatures) { - 252 21 : featuresUsed.push_back(feature); - 253 21 : std::unique_ptr<Classifier> model = std::make_unique<SPODE>(feature); - 254 21 : model->fit(dataset, features, className, states, weights_); - 255 21 : models.push_back(std::move(model)); - 256 21 : significanceModels.push_back(1.0); // They will be updated later in trainModel - 257 21 : n_models++; - 258 21 : } - 259 4 : notes.push_back("Used features in initialization: " + std::to_string(featuresUsed.size()) + " of " + std::to_string(features.size()) + " with " + select_features_algorithm); - 260 4 : delete featureSelector; - 261 8 : return featuresUsed; - 262 12 : } - 263 21 : void BoostAODE::trainModel(const torch::Tensor& weights) - 264 : { - 265 : // Algorithm based on the adaboost algorithm for classification - 266 : // as explained in Ensemble methods (Zhi-Hua Zhou, 2012) - 267 21 : fitted = true; - 268 21 : double alpha_t = 0; - 269 21 : torch::Tensor weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64); - 270 21 : bool finished = false; - 271 21 : std::vector<int> featuresUsed; - 272 21 : if (selectFeatures) { - 273 8 : featuresUsed = initializeModels(); - 274 4 : auto ypred = predict(X_train); - 275 4 : std::tie(weights_, alpha_t, finished) = update_weights(y_train, ypred, weights_); - 276 : // Update significance of the models - 277 25 : for (int i = 0; i < n_models; ++i) { - 278 21 : significanceModels[i] = alpha_t; - 279 : } - 280 4 : if (finished) { - 281 0 : return; - 282 : } - 283 4 : } - 284 17 : int numItemsPack = 0; // The counter of the models inserted in the current pack - 285 : // Variables to control the accuracy finish condition - 286 17 : double priorAccuracy = 0.0; - 287 17 : double improvement = 1.0; - 288 17 : double convergence_threshold = 1e-4; - 289 17 : int tolerance = 0; // number of times the accuracy is lower than the convergence_threshold - 290 : // Step 0: Set the finish condition - 291 : // epsilon sub t > 0.5 => inverse the weights policy - 292 : // validation error is not decreasing - 293 : // run out of features - 294 17 : bool ascending = order_algorithm == Orders.ASC; - 295 17 : std::mt19937 g{ 173 }; - 296 99 : while (!finished) { - 297 : // Step 1: Build ranking with mutual information - 298 82 : auto featureSelection = metrics.SelectKBestWeighted(weights_, ascending, n); // Get all the features sorted - 299 82 : if (order_algorithm == Orders.RAND) { - 300 9 : std::shuffle(featureSelection.begin(), featureSelection.end(), g); - 301 : } - 302 : // Remove used features - 303 164 : featureSelection.erase(remove_if(begin(featureSelection), end(featureSelection), [&](auto x) - 304 10764 : { return std::find(begin(featuresUsed), end(featuresUsed), x) != end(featuresUsed);}), - 305 82 : end(featureSelection) - 306 : ); - 307 82 : int k = pow(2, tolerance); - 308 82 : int counter = 0; // The model counter of the current pack - 309 197 : while (counter++ < k && featureSelection.size() > 0) { - 310 115 : auto feature = featureSelection[0]; - 311 115 : featureSelection.erase(featureSelection.begin()); - 312 115 : std::unique_ptr<Classifier> model; - 313 115 : model = std::make_unique<SPODE>(feature); - 314 115 : model->fit(dataset, features, className, states, weights_); - 315 115 : alpha_t = 0.0; - 316 115 : if (!block_update) { - 317 99 : auto ypred = model->predict(X_train); - 318 : // Step 3.1: Compute the classifier amout of say - 319 99 : std::tie(weights_, alpha_t, finished) = update_weights(y_train, ypred, weights_); - 320 99 : } - 321 : // Step 3.4: Store classifier and its accuracy to weigh its future vote - 322 115 : numItemsPack++; - 323 115 : featuresUsed.push_back(feature); - 324 115 : models.push_back(std::move(model)); - 325 115 : significanceModels.push_back(alpha_t); - 326 115 : n_models++; - 327 115 : } - 328 82 : if (block_update) { - 329 5 : std::tie(weights_, alpha_t, finished) = update_weights_block(k, y_train, weights_); - 330 : } - 331 82 : if (convergence && !finished) { - 332 49 : auto y_val_predict = predict(X_test); - 333 49 : double accuracy = (y_val_predict == y_test).sum().item<double>() / (double)y_test.size(0); - 334 49 : if (priorAccuracy == 0) { - 335 13 : priorAccuracy = accuracy; - 336 : } else { - 337 36 : improvement = accuracy - priorAccuracy; - 338 : } - 339 49 : if (improvement < convergence_threshold) { - 340 32 : tolerance++; - 341 : } else { - 342 17 : tolerance = 0; // Reset the counter if the model performs better - 343 17 : numItemsPack = 0; - 344 : } - 345 : // Keep the best accuracy until now as the prior accuracy - 346 49 : priorAccuracy = std::max(accuracy, priorAccuracy); - 347 : // priorAccuracy = accuracy; - 348 49 : } - 349 82 : finished = finished || tolerance > maxTolerance || featuresUsed.size() == features.size(); - 350 82 : } - 351 17 : if (tolerance > maxTolerance) { - 352 2 : if (numItemsPack < n_models) { - 353 2 : notes.push_back("Convergence threshold reached & " + std::to_string(numItemsPack) + " models eliminated"); - 354 32 : for (int i = 0; i < numItemsPack; ++i) { - 355 30 : significanceModels.pop_back(); - 356 30 : models.pop_back(); - 357 30 : n_models--; - 358 : } - 359 : } else { - 360 0 : notes.push_back("Convergence threshold reached & 0 models eliminated"); - 361 : } - 362 : } - 363 17 : if (featuresUsed.size() != features.size()) { - 364 2 : notes.push_back("Used features in train: " + std::to_string(featuresUsed.size()) + " of " + std::to_string(features.size())); - 365 2 : status = WARNING; - 366 : } - 367 17 : notes.push_back("Number of models: " + std::to_string(n_models)); - 368 25 : } - 369 1 : std::vector<std::string> BoostAODE::graph(const std::string& title) const - 370 : { - 371 1 : return Ensemble::graph(title); - 372 : } - 373 : } + 246 11 : featureSelector = new IWSS(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold); + 247 27 : } else if (select_features_algorithm == SelectFeatures.FCBF) { + 248 27 : if (threshold < 1e-7 || threshold > 1) { + 249 18 : throw std::invalid_argument("Invalid threshold value for " + SelectFeatures.FCBF + " [1e-7, 1]"); + 250 : } + 251 9 : featureSelector = new FCBF(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold); + 252 : } + 253 40 : featureSelector->fit(); + 254 40 : auto cfsFeatures = featureSelector->getFeatures(); + 255 40 : auto scores = featureSelector->getScores(); + 256 245 : for (const int& feature : cfsFeatures) { + 257 205 : featuresUsed.push_back(feature); + 258 205 : std::unique_ptr<Classifier> model = std::make_unique<SPODE>(feature); + 259 205 : model->fit(dataset, features, className, states, weights_); + 260 205 : models.push_back(std::move(model)); + 261 205 : significanceModels.push_back(1.0); // They will be updated later in trainModel + 262 205 : n_models++; + 263 205 : } + 264 40 : notes.push_back("Used features in initialization: " + std::to_string(featuresUsed.size()) + " of " + std::to_string(features.size()) + " with " + select_features_algorithm); + 265 40 : delete featureSelector; + 266 80 : return featuresUsed; + 267 112 : } + 268 190 : void BoostAODE::trainModel(const torch::Tensor& weights) + 269 : { + 270 : // + 271 : // Logging setup + 272 : // + 273 190 : loguru::set_thread_name("BoostAODE"); + 274 190 : loguru::g_stderr_verbosity = loguru::Verbosity_OFF; + 275 190 : loguru::add_file("boostAODE.log", loguru::Truncate, loguru::Verbosity_MAX); + 276 : + 277 : // Algorithm based on the adaboost algorithm for classification + 278 : // as explained in Ensemble methods (Zhi-Hua Zhou, 2012) + 279 190 : fitted = true; + 280 190 : double alpha_t = 0; + 281 190 : torch::Tensor weights_ = torch::full({ m }, 1.0 / m, torch::kFloat64); + 282 190 : bool finished = false; + 283 190 : std::vector<int> featuresUsed; + 284 190 : if (selectFeatures) { + 285 76 : featuresUsed = initializeModels(); + 286 40 : auto ypred = predict(X_train); + 287 40 : std::tie(weights_, alpha_t, finished) = update_weights(y_train, ypred, weights_); + 288 : // Update significance of the models + 289 245 : for (int i = 0; i < n_models; ++i) { + 290 205 : significanceModels[i] = alpha_t; + 291 : } + 292 40 : if (finished) { + 293 0 : return; + 294 : } + 295 40 : } + 296 154 : int numItemsPack = 0; // The counter of the models inserted in the current pack + 297 : // Variables to control the accuracy finish condition + 298 154 : double priorAccuracy = 0.0; + 299 154 : double improvement = 1.0; + 300 154 : double convergence_threshold = 1e-4; + 301 154 : int tolerance = 0; // number of times the accuracy is lower than the convergence_threshold + 302 : // Step 0: Set the finish condition + 303 : // epsilon sub t > 0.5 => inverse the weights policy + 304 : // validation error is not decreasing + 305 : // run out of features + 306 154 : bool ascending = order_algorithm == Orders.ASC; + 307 154 : std::mt19937 g{ 173 }; + 308 919 : while (!finished) { + 309 : // Step 1: Build ranking with mutual information + 310 765 : auto featureSelection = metrics.SelectKBestWeighted(weights_, ascending, n); // Get all the features sorted + 311 765 : if (order_algorithm == Orders.RAND) { + 312 81 : std::shuffle(featureSelection.begin(), featureSelection.end(), g); + 313 : } + 314 : // Remove used features + 315 1530 : featureSelection.erase(remove_if(begin(featureSelection), end(featureSelection), [&](auto x) + 316 110548 : { return std::find(begin(featuresUsed), end(featuresUsed), x) != end(featuresUsed);}), + 317 765 : end(featureSelection) + 318 : ); + 319 765 : int k = bisection ? pow(2, tolerance) : 1; + 320 765 : int counter = 0; // The model counter of the current pack + 321 765 : VLOG_SCOPE_F(1, "counter=%d k=%d featureSelection.size: %zu", counter, k, featureSelection.size()); + 322 1838 : while (counter++ < k && featureSelection.size() > 0) { + 323 1073 : auto feature = featureSelection[0]; + 324 1073 : featureSelection.erase(featureSelection.begin()); + 325 1073 : std::unique_ptr<Classifier> model; + 326 1073 : model = std::make_unique<SPODE>(feature); + 327 1073 : model->fit(dataset, features, className, states, weights_); + 328 1073 : alpha_t = 0.0; + 329 1073 : if (!block_update) { + 330 945 : auto ypred = model->predict(X_train); + 331 : // Step 3.1: Compute the classifier amout of say + 332 945 : std::tie(weights_, alpha_t, finished) = update_weights(y_train, ypred, weights_); + 333 945 : } + 334 : // Step 3.4: Store classifier and its accuracy to weigh its future vote + 335 1073 : numItemsPack++; + 336 1073 : featuresUsed.push_back(feature); + 337 1073 : models.push_back(std::move(model)); + 338 1073 : significanceModels.push_back(alpha_t); + 339 1073 : n_models++; + 340 1073 : VLOG_SCOPE_F(2, "numItemsPack: %d n_models: %d featuresUsed: %zu", numItemsPack, n_models, featuresUsed.size()); + 341 1073 : } + 342 765 : if (block_update) { + 343 40 : std::tie(weights_, alpha_t, finished) = update_weights_block(k, y_train, weights_); + 344 : } + 345 765 : if (convergence && !finished) { + 346 474 : auto y_val_predict = predict(X_test); + 347 474 : double accuracy = (y_val_predict == y_test).sum().item<double>() / (double)y_test.size(0); + 348 474 : if (priorAccuracy == 0) { + 349 119 : priorAccuracy = accuracy; + 350 : } else { + 351 355 : improvement = accuracy - priorAccuracy; + 352 : } + 353 474 : if (improvement < convergence_threshold) { + 354 296 : VLOG_SCOPE_F(3, " (improvement<threshold) tolerance: %d numItemsPack: %d improvement: %f prior: %f current: %f", tolerance, numItemsPack, improvement, priorAccuracy, accuracy); + 355 296 : tolerance++; + 356 296 : } else { + 357 178 : VLOG_SCOPE_F(3, "* (improvement>=threshold) Reset. tolerance: %d numItemsPack: %d improvement: %f prior: %f current: %f", tolerance, numItemsPack, improvement, priorAccuracy, accuracy); + 358 178 : tolerance = 0; // Reset the counter if the model performs better + 359 178 : numItemsPack = 0; + 360 178 : } + 361 474 : if (convergence_best) { + 362 : // Keep the best accuracy until now as the prior accuracy + 363 71 : priorAccuracy = std::max(accuracy, priorAccuracy); + 364 : } else { + 365 : // Keep the last accuray obtained as the prior accuracy + 366 403 : priorAccuracy = accuracy; + 367 : } + 368 474 : } + 369 765 : VLOG_SCOPE_F(1, "tolerance: %d featuresUsed.size: %zu features.size: %zu", tolerance, featuresUsed.size(), features.size()); + 370 765 : finished = finished || tolerance > maxTolerance || featuresUsed.size() == features.size(); + 371 765 : } + 372 154 : if (tolerance > maxTolerance) { + 373 21 : if (numItemsPack < n_models) { + 374 21 : notes.push_back("Convergence threshold reached & " + std::to_string(numItemsPack) + " models eliminated"); + 375 21 : VLOG_SCOPE_F(4, "Convergence threshold reached & %d models eliminated of %d", numItemsPack, n_models); + 376 336 : for (int i = 0; i < numItemsPack; ++i) { + 377 315 : significanceModels.pop_back(); + 378 315 : models.pop_back(); + 379 315 : n_models--; + 380 : } + 381 21 : } else { + 382 0 : notes.push_back("Convergence threshold reached & 0 models eliminated"); + 383 0 : VLOG_SCOPE_F(4, "Convergence threshold reached & 0 models eliminated n_models=%d numItemsPack=%d", n_models, numItemsPack); + 384 0 : } + 385 : } + 386 154 : if (featuresUsed.size() != features.size()) { + 387 21 : notes.push_back("Used features in train: " + std::to_string(featuresUsed.size()) + " of " + std::to_string(features.size())); + 388 21 : status = WARNING; + 389 : } + 390 154 : notes.push_back("Number of models: " + std::to_string(n_models)); + 391 226 : } + 392 8 : std::vector<std::string> BoostAODE::graph(const std::string& title) const + 393 : { + 394 8 : return Ensemble::graph(title); + 395 : } + 396 : } diff --git a/html/bayesnet/ensembles/BoostAODE.h.func-c.html b/html/bayesnet/ensembles/BoostAODE.h.func-c.html index 306eec8..9a1563c 100644 --- a/html/bayesnet/ensembles/BoostAODE.h.func-c.html +++ b/html/bayesnet/ensembles/BoostAODE.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/BoostAODE.h.func.html b/html/bayesnet/ensembles/BoostAODE.h.func.html index 2823d68..a37ce5d 100644 --- a/html/bayesnet/ensembles/BoostAODE.h.func.html +++ b/html/bayesnet/ensembles/BoostAODE.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/ensembles/BoostAODE.h.gcov.html b/html/bayesnet/ensembles/BoostAODE.h.gcov.html index d6e190e..6ba95f1 100644 --- a/html/bayesnet/ensembles/BoostAODE.h.gcov.html +++ b/html/bayesnet/ensembles/BoostAODE.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -101,14 +101,15 @@ 39 : int maxTolerance = 3; 40 : std::string order_algorithm; // order to process the KBest features asc, desc, rand 41 : bool convergence = true; //if true, stop when the model does not improve - 42 : bool selectFeatures = false; // if true, use feature selection - 43 : std::string select_features_algorithm = Orders.DESC; // Selected feature selection algorithm - 44 : FeatureSelect* featureSelector = nullptr; - 45 : double threshold = -1; - 46 : bool block_update = false; - 47 : }; - 48 : } - 49 : #endif + 42 : bool convergence_best = false; // wether to keep the best accuracy to the moment or the last accuracy as prior accuracy + 43 : bool selectFeatures = false; // if true, use feature selection + 44 : std::string select_features_algorithm = Orders.DESC; // Selected feature selection algorithm + 45 : FeatureSelect* featureSelector = nullptr; + 46 : double threshold = -1; + 47 : bool block_update = false; + 48 : }; + 49 : } + 50 : #endif diff --git a/html/bayesnet/ensembles/Ensemble.cc.func-c.html b/html/bayesnet/ensembles/Ensemble.cc.func-c.html index 76716e3..ae649d5 100644 --- a/html/bayesnet/ensembles/Ensemble.cc.func-c.html +++ b/html/bayesnet/ensembles/Ensemble.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,175 +65,175 @@ _ZNK8bayesnet8Ensemble17getNumberOfStatesEv - 1 + 11 _ZNK8bayesnet8Ensemble4showB5cxx11Ev - 1 + 11 _ZNK8bayesnet8Ensemble5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 3 + 33 _ZN8bayesnet8Ensemble10trainModelERKN2at6TensorE - 6 + 66 _ZNK8bayesnet8Ensemble16getNumberOfEdgesEv - 6 + 70 _ZNK8bayesnet8Ensemble16getNumberOfNodesEv - 6 + 70 _ZN8bayesnet8Ensemble22predict_average_votingERSt6vectorIS1_IiSaIiEESaIS3_EE - 7 + 82 _ZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 11 + 120 _ZN8bayesnet8Ensemble5scoreERSt6vectorIS1_IiSaIiEESaIS3_EERS3_ - 12 + 134 _ZN8bayesnet8Ensemble15compute_arg_maxERSt6vectorIS1_IdSaIdEESaIS3_EE - 13 - - - - - _ZN8bayesnet8Ensemble5scoreERN2at6TensorES3_ - - 16 + 145 _ZN8bayesnet8Ensemble7predictERSt6vectorIS1_IiSaIiEESaIS3_EE - 16 + 178 - _ZN8bayesnet8Ensemble22predict_average_votingERN2at6TensorE + _ZN8bayesnet8Ensemble5scoreERN2at6TensorES3_ - 20 - - - - - _ZN8bayesnet8Ensemble6votingERN2at6TensorE - - 20 + 194 _ZN8bayesnet8Ensemble13predict_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 24 + 268 - _ZN8bayesnet8Ensemble21predict_average_probaERN2at6TensorE + _ZN8bayesnet8Ensemble22predict_average_votingERN2at6TensorE - 63 + 291 + + + + + _ZN8bayesnet8Ensemble6votingERN2at6TensorE + + 291 _ZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUlvE_clEv - 63 + 722 - _ZN8bayesnet8Ensemble15compute_arg_maxERN2at6TensorE + _ZN8bayesnet8Ensemble21predict_average_probaERN2at6TensorE - 75 + 735 _ZN8bayesnet8EnsembleC2Eb - 77 + 864 + + + + + _ZN8bayesnet8Ensemble15compute_arg_maxERN2at6TensorE + + 933 _ZN8bayesnet8Ensemble7predictERN2at6TensorE - 78 + 966 _ZN8bayesnet8Ensemble13predict_probaERN2at6TensorE - 82 + 1010 _ZZN8bayesnet8Ensemble22predict_average_votingERN2at6TensorEENKUlvE_clEv - 114 + 1668 _ZZN8bayesnet8Ensemble21predict_average_probaERN2at6TensorEENKUlvE_clEv - 302 + 3518 _ZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUldE_clEd - 8606 + 98260 _ZZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUlvE_clEvENKUlddE_clEdd - 65366 + 756136 diff --git a/html/bayesnet/ensembles/Ensemble.cc.func.html b/html/bayesnet/ensembles/Ensemble.cc.func.html index 0afd5f1..7efcb6d 100644 --- a/html/bayesnet/ensembles/Ensemble.cc.func.html +++ b/html/bayesnet/ensembles/Ensemble.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,175 +65,175 @@ _ZN8bayesnet8Ensemble10trainModelERKN2at6TensorE - 6 + 66 _ZN8bayesnet8Ensemble13predict_probaERN2at6TensorE - 82 + 1010 _ZN8bayesnet8Ensemble13predict_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 24 + 268 _ZN8bayesnet8Ensemble15compute_arg_maxERN2at6TensorE - 75 + 933 _ZN8bayesnet8Ensemble15compute_arg_maxERSt6vectorIS1_IdSaIdEESaIS3_EE - 13 + 145 _ZN8bayesnet8Ensemble21predict_average_probaERN2at6TensorE - 63 + 735 _ZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EE - 11 + 120 _ZN8bayesnet8Ensemble22predict_average_votingERN2at6TensorE - 20 + 291 _ZN8bayesnet8Ensemble22predict_average_votingERSt6vectorIS1_IiSaIiEESaIS3_EE - 7 + 82 _ZN8bayesnet8Ensemble5scoreERN2at6TensorES3_ - 16 + 194 _ZN8bayesnet8Ensemble5scoreERSt6vectorIS1_IiSaIiEESaIS3_EERS3_ - 12 + 134 _ZN8bayesnet8Ensemble6votingERN2at6TensorE - 20 + 291 _ZN8bayesnet8Ensemble7predictERN2at6TensorE - 78 + 966 _ZN8bayesnet8Ensemble7predictERSt6vectorIS1_IiSaIiEESaIS3_EE - 16 + 178 _ZN8bayesnet8EnsembleC2Eb - 77 + 864 _ZNK8bayesnet8Ensemble16getNumberOfEdgesEv - 6 + 70 _ZNK8bayesnet8Ensemble16getNumberOfNodesEv - 6 + 70 _ZNK8bayesnet8Ensemble17getNumberOfStatesEv - 1 + 11 _ZNK8bayesnet8Ensemble4showB5cxx11Ev - 1 + 11 _ZNK8bayesnet8Ensemble5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 3 + 33 _ZZN8bayesnet8Ensemble21predict_average_probaERN2at6TensorEENKUlvE_clEv - 302 + 3518 _ZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUldE_clEd - 8606 + 98260 _ZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUlvE_clEv - 63 + 722 _ZZN8bayesnet8Ensemble22predict_average_votingERN2at6TensorEENKUlvE_clEv - 114 + 1668 _ZZZN8bayesnet8Ensemble21predict_average_probaERSt6vectorIS1_IiSaIiEESaIS3_EEENKUlvE_clEvENKUlddE_clEdd - 65366 + 756136 diff --git a/html/bayesnet/ensembles/Ensemble.cc.gcov.html b/html/bayesnet/ensembles/Ensemble.cc.gcov.html index baab61f..a499ade 100644 --- a/html/bayesnet/ensembles/Ensemble.cc.gcov.html +++ b/html/bayesnet/ensembles/Ensemble.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,216 +70,216 @@ 8 : 9 : namespace bayesnet { 10 : - 11 77 : Ensemble::Ensemble(bool predict_voting) : Classifier(Network()), n_models(0), predict_voting(predict_voting) + 11 864 : Ensemble::Ensemble(bool predict_voting) : Classifier(Network()), n_models(0), predict_voting(predict_voting) 12 : { 13 : - 14 77 : }; + 14 864 : }; 15 : const std::string ENSEMBLE_NOT_FITTED = "Ensemble has not been fitted"; - 16 6 : void Ensemble::trainModel(const torch::Tensor& weights) + 16 66 : void Ensemble::trainModel(const torch::Tensor& weights) 17 : { - 18 6 : n_models = models.size(); - 19 47 : for (auto i = 0; i < n_models; ++i) { + 18 66 : n_models = models.size(); + 19 517 : for (auto i = 0; i < n_models; ++i) { 20 : // fit with std::vectors - 21 41 : models[i]->fit(dataset, features, className, states); + 21 451 : models[i]->fit(dataset, features, className, states); 22 : } - 23 6 : } - 24 13 : std::vector<int> Ensemble::compute_arg_max(std::vector<std::vector<double>>& X) + 23 66 : } + 24 145 : std::vector<int> Ensemble::compute_arg_max(std::vector<std::vector<double>>& X) 25 : { - 26 13 : std::vector<int> y_pred; - 27 2843 : for (auto i = 0; i < X.size(); ++i) { - 28 2830 : auto max = std::max_element(X[i].begin(), X[i].end()); - 29 5660 : y_pred.push_back(std::distance(X[i].begin(), max)); + 26 145 : std::vector<int> y_pred; + 27 33363 : for (auto i = 0; i < X.size(); ++i) { + 28 33218 : auto max = std::max_element(X[i].begin(), X[i].end()); + 29 66436 : y_pred.push_back(std::distance(X[i].begin(), max)); 30 : } - 31 13 : return y_pred; + 31 145 : return y_pred; 32 0 : } - 33 75 : torch::Tensor Ensemble::compute_arg_max(torch::Tensor& X) + 33 933 : torch::Tensor Ensemble::compute_arg_max(torch::Tensor& X) 34 : { - 35 75 : auto y_pred = torch::argmax(X, 1); - 36 75 : return y_pred; + 35 933 : auto y_pred = torch::argmax(X, 1); + 36 933 : return y_pred; 37 : } - 38 20 : torch::Tensor Ensemble::voting(torch::Tensor& votes) + 38 291 : torch::Tensor Ensemble::voting(torch::Tensor& votes) 39 : { 40 : // Convert m x n_models tensor to a m x n_class_states with voting probabilities - 41 20 : auto y_pred_ = votes.accessor<int, 2>(); - 42 20 : std::vector<int> y_pred_final; - 43 20 : int numClasses = states.at(className).size(); + 41 291 : auto y_pred_ = votes.accessor<int, 2>(); + 42 291 : std::vector<int> y_pred_final; + 43 291 : int numClasses = states.at(className).size(); 44 : // votes is m x n_models with the prediction of every model for each sample - 45 20 : auto result = torch::zeros({ votes.size(0), numClasses }, torch::kFloat32); - 46 20 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); - 47 5364 : for (int i = 0; i < votes.size(0); ++i) { + 45 291 : auto result = torch::zeros({ votes.size(0), numClasses }, torch::kFloat32); + 46 291 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); + 47 69474 : for (int i = 0; i < votes.size(0); ++i) { 48 : // n_votes store in each index (value of class) the significance added by each model 49 : // i.e. n_votes[0] contains how much value has the value 0 of class. That value is generated by the models predictions - 50 5344 : std::vector<double> n_votes(numClasses, 0.0); - 51 42310 : for (int j = 0; j < n_models; ++j) { - 52 36966 : n_votes[y_pred_[i][j]] += significanceModels.at(j); + 50 69183 : std::vector<double> n_votes(numClasses, 0.0); + 51 541708 : for (int j = 0; j < n_models; ++j) { + 52 472525 : n_votes[y_pred_[i][j]] += significanceModels.at(j); 53 : } - 54 5344 : result[i] = torch::tensor(n_votes); - 55 5344 : } + 54 69183 : result[i] = torch::tensor(n_votes); + 55 69183 : } 56 : // To only do one division and gain precision - 57 20 : result /= sum; - 58 40 : return result; - 59 20 : } - 60 24 : std::vector<std::vector<double>> Ensemble::predict_proba(std::vector<std::vector<int>>& X) + 57 291 : result /= sum; + 58 582 : return result; + 59 291 : } + 60 268 : std::vector<std::vector<double>> Ensemble::predict_proba(std::vector<std::vector<int>>& X) 61 : { - 62 24 : if (!fitted) { - 63 6 : throw std::logic_error(ENSEMBLE_NOT_FITTED); + 62 268 : if (!fitted) { + 63 66 : throw std::logic_error(ENSEMBLE_NOT_FITTED); 64 : } - 65 18 : return predict_voting ? predict_average_voting(X) : predict_average_proba(X); + 65 202 : return predict_voting ? predict_average_voting(X) : predict_average_proba(X); 66 : } - 67 82 : torch::Tensor Ensemble::predict_proba(torch::Tensor& X) + 67 1010 : torch::Tensor Ensemble::predict_proba(torch::Tensor& X) 68 : { - 69 82 : if (!fitted) { - 70 6 : throw std::logic_error(ENSEMBLE_NOT_FITTED); + 69 1010 : if (!fitted) { + 70 66 : throw std::logic_error(ENSEMBLE_NOT_FITTED); 71 : } - 72 76 : return predict_voting ? predict_average_voting(X) : predict_average_proba(X); + 72 944 : return predict_voting ? predict_average_voting(X) : predict_average_proba(X); 73 : } - 74 16 : std::vector<int> Ensemble::predict(std::vector<std::vector<int>>& X) + 74 178 : std::vector<int> Ensemble::predict(std::vector<std::vector<int>>& X) 75 : { - 76 16 : auto res = predict_proba(X); - 77 24 : return compute_arg_max(res); - 78 12 : } - 79 78 : torch::Tensor Ensemble::predict(torch::Tensor& X) + 76 178 : auto res = predict_proba(X); + 77 268 : return compute_arg_max(res); + 78 134 : } + 79 966 : torch::Tensor Ensemble::predict(torch::Tensor& X) 80 : { - 81 78 : auto res = predict_proba(X); - 82 148 : return compute_arg_max(res); - 83 74 : } - 84 63 : torch::Tensor Ensemble::predict_average_proba(torch::Tensor& X) + 81 966 : auto res = predict_proba(X); + 82 1844 : return compute_arg_max(res); + 83 922 : } + 84 735 : torch::Tensor Ensemble::predict_average_proba(torch::Tensor& X) 85 : { - 86 63 : auto n_states = models[0]->getClassNumStates(); - 87 63 : torch::Tensor y_pred = torch::zeros({ X.size(1), n_states }, torch::kFloat32); - 88 63 : auto threads{ std::vector<std::thread>() }; - 89 63 : std::mutex mtx; - 90 365 : for (auto i = 0; i < n_models; ++i) { - 91 302 : threads.push_back(std::thread([&, i]() { - 92 302 : auto ypredict = models[i]->predict_proba(X); - 93 302 : std::lock_guard<std::mutex> lock(mtx); - 94 302 : y_pred += ypredict * significanceModels[i]; - 95 302 : })); + 86 735 : auto n_states = models[0]->getClassNumStates(); + 87 735 : torch::Tensor y_pred = torch::zeros({ X.size(1), n_states }, torch::kFloat32); + 88 735 : auto threads{ std::vector<std::thread>() }; + 89 735 : std::mutex mtx; + 90 4253 : for (auto i = 0; i < n_models; ++i) { + 91 3518 : threads.push_back(std::thread([&, i]() { + 92 3518 : auto ypredict = models[i]->predict_proba(X); + 93 3518 : std::lock_guard<std::mutex> lock(mtx); + 94 3518 : y_pred += ypredict * significanceModels[i]; + 95 3518 : })); 96 : } - 97 365 : for (auto& thread : threads) { - 98 302 : thread.join(); + 97 4253 : for (auto& thread : threads) { + 98 3518 : thread.join(); 99 : } - 100 63 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); - 101 63 : y_pred /= sum; - 102 126 : return y_pred; - 103 63 : } - 104 11 : std::vector<std::vector<double>> Ensemble::predict_average_proba(std::vector<std::vector<int>>& X) + 100 735 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); + 101 735 : y_pred /= sum; + 102 1470 : return y_pred; + 103 735 : } + 104 120 : std::vector<std::vector<double>> Ensemble::predict_average_proba(std::vector<std::vector<int>>& X) 105 : { - 106 11 : auto n_states = models[0]->getClassNumStates(); - 107 11 : std::vector<std::vector<double>> y_pred(X[0].size(), std::vector<double>(n_states, 0.0)); - 108 11 : auto threads{ std::vector<std::thread>() }; - 109 11 : std::mutex mtx; - 110 74 : for (auto i = 0; i < n_models; ++i) { - 111 63 : threads.push_back(std::thread([&, i]() { - 112 63 : auto ypredict = models[i]->predict_proba(X); - 113 63 : assert(ypredict.size() == y_pred.size()); - 114 63 : assert(ypredict[0].size() == y_pred[0].size()); - 115 63 : std::lock_guard<std::mutex> lock(mtx); + 106 120 : auto n_states = models[0]->getClassNumStates(); + 107 120 : std::vector<std::vector<double>> y_pred(X[0].size(), std::vector<double>(n_states, 0.0)); + 108 120 : auto threads{ std::vector<std::thread>() }; + 109 120 : std::mutex mtx; + 110 842 : for (auto i = 0; i < n_models; ++i) { + 111 722 : threads.push_back(std::thread([&, i]() { + 112 722 : auto ypredict = models[i]->predict_proba(X); + 113 722 : assert(ypredict.size() == y_pred.size()); + 114 722 : assert(ypredict[0].size() == y_pred[0].size()); + 115 722 : std::lock_guard<std::mutex> lock(mtx); 116 : // Multiply each prediction by the significance of the model and then add it to the final prediction - 117 12479 : for (auto j = 0; j < ypredict.size(); ++j) { - 118 12416 : std::transform(y_pred[j].begin(), y_pred[j].end(), ypredict[j].begin(), y_pred[j].begin(), - 119 77782 : [significanceModels = significanceModels[i]](double x, double y) { return x + y * significanceModels; }); + 117 143118 : for (auto j = 0; j < ypredict.size(); ++j) { + 118 142396 : std::transform(y_pred[j].begin(), y_pred[j].end(), ypredict[j].begin(), y_pred[j].begin(), + 119 898532 : [significanceModels = significanceModels[i]](double x, double y) { return x + y * significanceModels; }); 120 : } - 121 63 : })); + 121 722 : })); 122 : } - 123 74 : for (auto& thread : threads) { - 124 63 : thread.join(); + 123 842 : for (auto& thread : threads) { + 124 722 : thread.join(); 125 : } - 126 11 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); + 126 120 : auto sum = std::reduce(significanceModels.begin(), significanceModels.end()); 127 : //Divide each element of the prediction by the sum of the significances - 128 2067 : for (auto j = 0; j < y_pred.size(); ++j) { - 129 10662 : std::transform(y_pred[j].begin(), y_pred[j].end(), y_pred[j].begin(), [sum](double x) { return x / sum; }); + 128 22520 : for (auto j = 0; j < y_pred.size(); ++j) { + 129 120660 : std::transform(y_pred[j].begin(), y_pred[j].end(), y_pred[j].begin(), [sum](double x) { return x / sum; }); 130 : } - 131 22 : return y_pred; - 132 11 : } - 133 7 : std::vector<std::vector<double>> Ensemble::predict_average_voting(std::vector<std::vector<int>>& X) + 131 240 : return y_pred; + 132 120 : } + 133 82 : std::vector<std::vector<double>> Ensemble::predict_average_voting(std::vector<std::vector<int>>& X) 134 : { - 135 7 : torch::Tensor Xt = bayesnet::vectorToTensor(X, false); - 136 7 : auto y_pred = predict_average_voting(Xt); - 137 7 : std::vector<std::vector<double>> result = tensorToVectorDouble(y_pred); - 138 14 : return result; - 139 7 : } - 140 20 : torch::Tensor Ensemble::predict_average_voting(torch::Tensor& X) + 135 82 : torch::Tensor Xt = bayesnet::vectorToTensor(X, false); + 136 82 : auto y_pred = predict_average_voting(Xt); + 137 82 : std::vector<std::vector<double>> result = tensorToVectorDouble(y_pred); + 138 164 : return result; + 139 82 : } + 140 291 : torch::Tensor Ensemble::predict_average_voting(torch::Tensor& X) 141 : { 142 : // Build a m x n_models tensor with the predictions of each model - 143 20 : torch::Tensor y_pred = torch::zeros({ X.size(1), n_models }, torch::kInt32); - 144 20 : auto threads{ std::vector<std::thread>() }; - 145 20 : std::mutex mtx; - 146 134 : for (auto i = 0; i < n_models; ++i) { - 147 114 : threads.push_back(std::thread([&, i]() { - 148 114 : auto ypredict = models[i]->predict(X); - 149 114 : std::lock_guard<std::mutex> lock(mtx); - 150 342 : y_pred.index_put_({ "...", i }, ypredict); - 151 228 : })); + 143 291 : torch::Tensor y_pred = torch::zeros({ X.size(1), n_models }, torch::kInt32); + 144 291 : auto threads{ std::vector<std::thread>() }; + 145 291 : std::mutex mtx; + 146 1959 : for (auto i = 0; i < n_models; ++i) { + 147 1668 : threads.push_back(std::thread([&, i]() { + 148 1668 : auto ypredict = models[i]->predict(X); + 149 1668 : std::lock_guard<std::mutex> lock(mtx); + 150 5004 : y_pred.index_put_({ "...", i }, ypredict); + 151 3336 : })); 152 : } - 153 134 : for (auto& thread : threads) { - 154 114 : thread.join(); + 153 1959 : for (auto& thread : threads) { + 154 1668 : thread.join(); 155 : } - 156 40 : return voting(y_pred); - 157 20 : } - 158 16 : float Ensemble::score(torch::Tensor& X, torch::Tensor& y) + 156 582 : return voting(y_pred); + 157 291 : } + 158 194 : float Ensemble::score(torch::Tensor& X, torch::Tensor& y) 159 : { - 160 16 : auto y_pred = predict(X); - 161 14 : int correct = 0; - 162 4746 : for (int i = 0; i < y_pred.size(0); ++i) { - 163 4732 : if (y_pred[i].item<int>() == y[i].item<int>()) { - 164 4026 : correct++; + 160 194 : auto y_pred = predict(X); + 161 172 : int correct = 0; + 162 53601 : for (int i = 0; i < y_pred.size(0); ++i) { + 163 53429 : if (y_pred[i].item<int>() == y[i].item<int>()) { + 164 45279 : correct++; 165 : } 166 : } - 167 28 : return (double)correct / y_pred.size(0); - 168 14 : } - 169 12 : float Ensemble::score(std::vector<std::vector<int>>& X, std::vector<int>& y) + 167 344 : return (double)correct / y_pred.size(0); + 168 172 : } + 169 134 : float Ensemble::score(std::vector<std::vector<int>>& X, std::vector<int>& y) 170 : { - 171 12 : auto y_pred = predict(X); - 172 10 : int correct = 0; - 173 2534 : for (int i = 0; i < y_pred.size(); ++i) { - 174 2524 : if (y_pred[i] == y[i]) { - 175 2173 : correct++; + 171 134 : auto y_pred = predict(X); + 172 112 : int correct = 0; + 173 29964 : for (int i = 0; i < y_pred.size(); ++i) { + 174 29852 : if (y_pred[i] == y[i]) { + 175 25423 : correct++; 176 : } 177 : } - 178 20 : return (double)correct / y_pred.size(); - 179 10 : } - 180 1 : std::vector<std::string> Ensemble::show() const + 178 224 : return (double)correct / y_pred.size(); + 179 112 : } + 180 11 : std::vector<std::string> Ensemble::show() const 181 : { - 182 1 : auto result = std::vector<std::string>(); - 183 5 : for (auto i = 0; i < n_models; ++i) { - 184 4 : auto res = models[i]->show(); - 185 4 : result.insert(result.end(), res.begin(), res.end()); - 186 4 : } - 187 1 : return result; + 182 11 : auto result = std::vector<std::string>(); + 183 55 : for (auto i = 0; i < n_models; ++i) { + 184 44 : auto res = models[i]->show(); + 185 44 : result.insert(result.end(), res.begin(), res.end()); + 186 44 : } + 187 11 : return result; 188 0 : } - 189 3 : std::vector<std::string> Ensemble::graph(const std::string& title) const + 189 33 : std::vector<std::string> Ensemble::graph(const std::string& title) const 190 : { - 191 3 : auto result = std::vector<std::string>(); - 192 20 : for (auto i = 0; i < n_models; ++i) { - 193 17 : auto res = models[i]->graph(title + "_" + std::to_string(i)); - 194 17 : result.insert(result.end(), res.begin(), res.end()); - 195 17 : } - 196 3 : return result; + 191 33 : auto result = std::vector<std::string>(); + 192 220 : for (auto i = 0; i < n_models; ++i) { + 193 187 : auto res = models[i]->graph(title + "_" + std::to_string(i)); + 194 187 : result.insert(result.end(), res.begin(), res.end()); + 195 187 : } + 196 33 : return result; 197 0 : } - 198 6 : int Ensemble::getNumberOfNodes() const + 198 70 : int Ensemble::getNumberOfNodes() const 199 : { - 200 6 : int nodes = 0; - 201 43 : for (auto i = 0; i < n_models; ++i) { - 202 37 : nodes += models[i]->getNumberOfNodes(); + 200 70 : int nodes = 0; + 201 512 : for (auto i = 0; i < n_models; ++i) { + 202 442 : nodes += models[i]->getNumberOfNodes(); 203 : } - 204 6 : return nodes; + 204 70 : return nodes; 205 : } - 206 6 : int Ensemble::getNumberOfEdges() const + 206 70 : int Ensemble::getNumberOfEdges() const 207 : { - 208 6 : int edges = 0; - 209 43 : for (auto i = 0; i < n_models; ++i) { - 210 37 : edges += models[i]->getNumberOfEdges(); + 208 70 : int edges = 0; + 209 512 : for (auto i = 0; i < n_models; ++i) { + 210 442 : edges += models[i]->getNumberOfEdges(); 211 : } - 212 6 : return edges; + 212 70 : return edges; 213 : } - 214 1 : int Ensemble::getNumberOfStates() const + 214 11 : int Ensemble::getNumberOfStates() const 215 : { - 216 1 : int nstates = 0; - 217 5 : for (auto i = 0; i < n_models; ++i) { - 218 4 : nstates += models[i]->getNumberOfStates(); + 216 11 : int nstates = 0; + 217 55 : for (auto i = 0; i < n_models; ++i) { + 218 44 : nstates += models[i]->getNumberOfStates(); 219 : } - 220 1 : return nstates; + 220 11 : return nstates; 221 : } 222 : } diff --git a/html/bayesnet/ensembles/Ensemble.h.func-c.html b/html/bayesnet/ensembles/Ensemble.h.func-c.html index 7e74306..49ed65c 100644 --- a/html/bayesnet/ensembles/Ensemble.h.func-c.html +++ b/html/bayesnet/ensembles/Ensemble.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 75.0 % diff --git a/html/bayesnet/ensembles/Ensemble.h.func.html b/html/bayesnet/ensembles/Ensemble.h.func.html index 2389f98..d1392ea 100644 --- a/html/bayesnet/ensembles/Ensemble.h.func.html +++ b/html/bayesnet/ensembles/Ensemble.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 75.0 % diff --git a/html/bayesnet/ensembles/Ensemble.h.gcov.html b/html/bayesnet/ensembles/Ensemble.h.gcov.html index 5d807b0..53cbba4 100644 --- a/html/bayesnet/ensembles/Ensemble.h.gcov.html +++ b/html/bayesnet/ensembles/Ensemble.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 75.0 % diff --git a/html/bayesnet/ensembles/index-sort-f.html b/html/bayesnet/ensembles/index-sort-f.html index cec41df..aa9bc1d 100644 --- a/html/bayesnet/ensembles/index-sort-f.html +++ b/html/bayesnet/ensembles/index-sort-f.html @@ -31,13 +31,13 @@ coverage.info Lines: - 98.8 % - 424 - 419 + 98.4 % + 443 + 436 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 98.1 % @@ -154,11 +154,11 @@ BoostAODE.cc -
99.1%99.1%
+
98.3%98.3%
- 99.1 % - 218 - 216 + 98.3 % + 237 + 233 100.0 % 9 9 diff --git a/html/bayesnet/ensembles/index-sort-l.html b/html/bayesnet/ensembles/index-sort-l.html index f9c0fb2..7686195 100644 --- a/html/bayesnet/ensembles/index-sort-l.html +++ b/html/bayesnet/ensembles/index-sort-l.html @@ -31,13 +31,13 @@ coverage.info Lines: - 98.8 % - 424 - 419 + 98.4 % + 443 + 436 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 98.1 % @@ -94,11 +94,11 @@ BoostAODE.cc -
99.1%99.1%
+
98.3%98.3%
- 99.1 % - 218 - 216 + 98.3 % + 237 + 233 100.0 % 9 9 diff --git a/html/bayesnet/ensembles/index.html b/html/bayesnet/ensembles/index.html index 465c3c2..a1696e3 100644 --- a/html/bayesnet/ensembles/index.html +++ b/html/bayesnet/ensembles/index.html @@ -31,13 +31,13 @@ coverage.info Lines: - 98.8 % - 424 - 419 + 98.4 % + 443 + 436 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 98.1 % @@ -130,11 +130,11 @@ BoostAODE.cc -
99.1%99.1%
+
98.3%98.3%
- 99.1 % - 218 - 216 + 98.3 % + 237 + 233 100.0 % 9 9 diff --git a/html/bayesnet/feature_selection/CFS.cc.func-c.html b/html/bayesnet/feature_selection/CFS.cc.func-c.html index 6b63902..f7bc825 100644 --- a/html/bayesnet/feature_selection/CFS.cc.func-c.html +++ b/html/bayesnet/feature_selection/CFS.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet3CFS3fitEv - 6 + 70 _ZN8bayesnet3CFS24computeContinueConditionERKSt6vectorIiSaIiEE - 28 + 328 diff --git a/html/bayesnet/feature_selection/CFS.cc.func.html b/html/bayesnet/feature_selection/CFS.cc.func.html index cff5915..55ddef8 100644 --- a/html/bayesnet/feature_selection/CFS.cc.func.html +++ b/html/bayesnet/feature_selection/CFS.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet3CFS24computeContinueConditionERKSt6vectorIiSaIiEE - 28 + 328 _ZN8bayesnet3CFS3fitEv - 6 + 70 diff --git a/html/bayesnet/feature_selection/CFS.cc.gcov.html b/html/bayesnet/feature_selection/CFS.cc.gcov.html index 65913b4..315fb85 100644 --- a/html/bayesnet/feature_selection/CFS.cc.gcov.html +++ b/html/bayesnet/feature_selection/CFS.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,46 +70,46 @@ 8 : #include "bayesnet/utils/bayesnetUtils.h" 9 : #include "CFS.h" 10 : namespace bayesnet { - 11 6 : void CFS::fit() + 11 70 : void CFS::fit() 12 : { - 13 6 : initialize(); - 14 6 : computeSuLabels(); - 15 6 : auto featureOrder = argsort(suLabels); // sort descending order - 16 6 : auto continueCondition = true; - 17 6 : auto feature = featureOrder[0]; - 18 6 : selectedFeatures.push_back(feature); - 19 6 : selectedScores.push_back(suLabels[feature]); - 20 6 : featureOrder.erase(featureOrder.begin()); - 21 34 : while (continueCondition) { - 22 28 : double merit = std::numeric_limits<double>::lowest(); - 23 28 : int bestFeature = -1; - 24 164 : for (auto feature : featureOrder) { - 25 136 : selectedFeatures.push_back(feature); + 13 70 : initialize(); + 14 70 : computeSuLabels(); + 15 70 : auto featureOrder = argsort(suLabels); // sort descending order + 16 70 : auto continueCondition = true; + 17 70 : auto feature = featureOrder[0]; + 18 70 : selectedFeatures.push_back(feature); + 19 70 : selectedScores.push_back(suLabels[feature]); + 20 70 : featureOrder.erase(featureOrder.begin()); + 21 398 : while (continueCondition) { + 22 328 : double merit = std::numeric_limits<double>::lowest(); + 23 328 : int bestFeature = -1; + 24 1929 : for (auto feature : featureOrder) { + 25 1601 : selectedFeatures.push_back(feature); 26 : // Compute merit with selectedFeatures - 27 136 : auto meritNew = computeMeritCFS(); - 28 136 : if (meritNew > merit) { - 29 57 : merit = meritNew; - 30 57 : bestFeature = feature; + 27 1601 : auto meritNew = computeMeritCFS(); + 28 1601 : if (meritNew > merit) { + 29 663 : merit = meritNew; + 30 663 : bestFeature = feature; 31 : } - 32 136 : selectedFeatures.pop_back(); + 32 1601 : selectedFeatures.pop_back(); 33 : } - 34 28 : if (bestFeature == -1) { + 34 328 : if (bestFeature == -1) { 35 : // meritNew has to be nan due to constant features 36 0 : break; 37 : } - 38 28 : selectedFeatures.push_back(bestFeature); - 39 28 : selectedScores.push_back(merit); - 40 28 : featureOrder.erase(remove(featureOrder.begin(), featureOrder.end(), bestFeature), featureOrder.end()); - 41 28 : continueCondition = computeContinueCondition(featureOrder); + 38 328 : selectedFeatures.push_back(bestFeature); + 39 328 : selectedScores.push_back(merit); + 40 328 : featureOrder.erase(remove(featureOrder.begin(), featureOrder.end(), bestFeature), featureOrder.end()); + 41 328 : continueCondition = computeContinueCondition(featureOrder); 42 : } - 43 6 : fitted = true; - 44 6 : } - 45 28 : bool CFS::computeContinueCondition(const std::vector<int>& featureOrder) + 43 70 : fitted = true; + 44 70 : } + 45 328 : bool CFS::computeContinueCondition(const std::vector<int>& featureOrder) 46 : { - 47 28 : if (selectedFeatures.size() == maxFeatures || featureOrder.size() == 0) { - 48 1 : return false; + 47 328 : if (selectedFeatures.size() == maxFeatures || featureOrder.size() == 0) { + 48 11 : return false; 49 : } - 50 27 : if (selectedScores.size() >= 5) { + 50 317 : if (selectedScores.size() >= 5) { 51 : /* 52 : "To prevent the best first search from exploring the entire 53 : feature subset search space, a stopping criterion is imposed. @@ -117,25 +117,25 @@ 55 : subsets show no improvement over the current best subset." 56 : as stated in Mark A.Hall Thesis 57 : */ - 58 10 : double item_ant = std::numeric_limits<double>::lowest(); - 59 10 : int num = 0; - 60 10 : std::vector<double> lastFive(selectedScores.end() - 5, selectedScores.end()); - 61 40 : for (auto item : lastFive) { - 62 35 : if (item_ant == std::numeric_limits<double>::lowest()) { - 63 10 : item_ant = item; + 58 118 : double item_ant = std::numeric_limits<double>::lowest(); + 59 118 : int num = 0; + 60 118 : std::vector<double> lastFive(selectedScores.end() - 5, selectedScores.end()); + 61 472 : for (auto item : lastFive) { + 62 413 : if (item_ant == std::numeric_limits<double>::lowest()) { + 63 118 : item_ant = item; 64 : } - 65 35 : if (item > item_ant) { - 66 5 : break; + 65 413 : if (item > item_ant) { + 66 59 : break; 67 : } else { - 68 30 : num++; - 69 30 : item_ant = item; + 68 354 : num++; + 69 354 : item_ant = item; 70 : } 71 : } - 72 10 : if (num == 5) { - 73 5 : return false; + 72 118 : if (num == 5) { + 73 59 : return false; 74 : } - 75 10 : } - 76 22 : return true; + 75 118 : } + 76 258 : return true; 77 : } 78 : } diff --git a/html/bayesnet/feature_selection/CFS.h.func-c.html b/html/bayesnet/feature_selection/CFS.h.func-c.html index 4756128..4ba9f1b 100644 --- a/html/bayesnet/feature_selection/CFS.h.func-c.html +++ b/html/bayesnet/feature_selection/CFS.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -72,21 +72,21 @@ _ZN8bayesnet3CFSD0Ev - 12 + 140 _ZN8bayesnet3CFSD0Ev - 6 + 70 _ZN8bayesnet3CFSD2Ev - 6 + 70 diff --git a/html/bayesnet/feature_selection/CFS.h.func.html b/html/bayesnet/feature_selection/CFS.h.func.html index 174307b..4c069fc 100644 --- a/html/bayesnet/feature_selection/CFS.h.func.html +++ b/html/bayesnet/feature_selection/CFS.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -72,21 +72,21 @@ _ZN8bayesnet3CFSD0Ev - 12 + 140 _ZN8bayesnet3CFSD0Ev - 6 + 70 _ZN8bayesnet3CFSD2Ev - 6 + 70 diff --git a/html/bayesnet/feature_selection/CFS.h.gcov.html b/html/bayesnet/feature_selection/CFS.h.gcov.html index 62e61ff..2f770e8 100644 --- a/html/bayesnet/feature_selection/CFS.h.gcov.html +++ b/html/bayesnet/feature_selection/CFS.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -79,7 +79,7 @@ 17 6 : FeatureSelect(samples, features, className, maxFeatures, classNumStates, weights) 18 : { 19 6 : } - 20 12 : virtual ~CFS() {}; + 20 140 : virtual ~CFS() {}; 21 : void fit() override; 22 : private: 23 : bool computeContinueCondition(const std::vector<int>& featureOrder); diff --git a/html/bayesnet/feature_selection/FCBF.cc.func-c.html b/html/bayesnet/feature_selection/FCBF.cc.func-c.html index 7271290..e2df0b3 100644 --- a/html/bayesnet/feature_selection/FCBF.cc.func-c.html +++ b/html/bayesnet/feature_selection/FCBF.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet4FCBF3fitEv - 5 + 56 _ZN8bayesnet4FCBFC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_d - 7 + 78 diff --git a/html/bayesnet/feature_selection/FCBF.cc.func.html b/html/bayesnet/feature_selection/FCBF.cc.func.html index 0d2f9ad..9a3c63d 100644 --- a/html/bayesnet/feature_selection/FCBF.cc.func.html +++ b/html/bayesnet/feature_selection/FCBF.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet4FCBF3fitEv - 5 + 56 _ZN8bayesnet4FCBFC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_d - 7 + 78 diff --git a/html/bayesnet/feature_selection/FCBF.cc.gcov.html b/html/bayesnet/feature_selection/FCBF.cc.gcov.html index 0927ddc..8afb556 100644 --- a/html/bayesnet/feature_selection/FCBF.cc.gcov.html +++ b/html/bayesnet/feature_selection/FCBF.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,45 +70,45 @@ 8 : #include "FCBF.h" 9 : namespace bayesnet { 10 : - 11 7 : FCBF::FCBF(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights, const double threshold) : - 12 7 : FeatureSelect(samples, features, className, maxFeatures, classNumStates, weights), threshold(threshold) + 11 78 : FCBF::FCBF(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights, const double threshold) : + 12 78 : FeatureSelect(samples, features, className, maxFeatures, classNumStates, weights), threshold(threshold) 13 : { - 14 7 : if (threshold < 1e-7) { - 15 2 : throw std::invalid_argument("Threshold cannot be less than 1e-7"); + 14 78 : if (threshold < 1e-7) { + 15 22 : throw std::invalid_argument("Threshold cannot be less than 1e-7"); 16 : } - 17 7 : } - 18 5 : void FCBF::fit() + 17 78 : } + 18 56 : void FCBF::fit() 19 : { - 20 5 : initialize(); - 21 5 : computeSuLabels(); - 22 5 : auto featureOrder = argsort(suLabels); // sort descending order - 23 5 : auto featureOrderCopy = featureOrder; - 24 42 : for (const auto& feature : featureOrder) { + 20 56 : initialize(); + 21 56 : computeSuLabels(); + 22 56 : auto featureOrder = argsort(suLabels); // sort descending order + 23 56 : auto featureOrderCopy = featureOrder; + 24 472 : for (const auto& feature : featureOrder) { 25 : // Don't self compare - 26 37 : featureOrderCopy.erase(featureOrderCopy.begin()); - 27 37 : if (suLabels.at(feature) == 0.0) { + 26 416 : featureOrderCopy.erase(featureOrderCopy.begin()); + 27 416 : if (suLabels.at(feature) == 0.0) { 28 : // The feature has been removed from the list - 29 16 : continue; + 29 180 : continue; 30 : } - 31 21 : if (suLabels.at(feature) < threshold) { + 31 236 : if (suLabels.at(feature) < threshold) { 32 0 : break; 33 : } 34 : // Remove redundant features - 35 116 : for (const auto& featureCopy : featureOrderCopy) { - 36 95 : double value = computeSuFeatures(feature, featureCopy); - 37 95 : if (value >= suLabels.at(featureCopy)) { + 35 1307 : for (const auto& featureCopy : featureOrderCopy) { + 36 1071 : double value = computeSuFeatures(feature, featureCopy); + 37 1071 : if (value >= suLabels.at(featureCopy)) { 38 : // Remove feature from list - 39 33 : suLabels[featureCopy] = 0.0; + 39 373 : suLabels[featureCopy] = 0.0; 40 : } 41 : } - 42 21 : selectedFeatures.push_back(feature); - 43 21 : selectedScores.push_back(suLabels[feature]); - 44 21 : if (selectedFeatures.size() == maxFeatures) { + 42 236 : selectedFeatures.push_back(feature); + 43 236 : selectedScores.push_back(suLabels[feature]); + 44 236 : if (selectedFeatures.size() == maxFeatures) { 45 0 : break; 46 : } 47 : } - 48 5 : fitted = true; - 49 5 : } + 48 56 : fitted = true; + 49 56 : } 50 : } diff --git a/html/bayesnet/feature_selection/FCBF.h.func-c.html b/html/bayesnet/feature_selection/FCBF.h.func-c.html index 049052a..faf32d1 100644 --- a/html/bayesnet/feature_selection/FCBF.h.func-c.html +++ b/html/bayesnet/feature_selection/FCBF.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/FCBF.h.func.html b/html/bayesnet/feature_selection/FCBF.h.func.html index e7585ab..bcd6055 100644 --- a/html/bayesnet/feature_selection/FCBF.h.func.html +++ b/html/bayesnet/feature_selection/FCBF.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/FCBF.h.gcov.html b/html/bayesnet/feature_selection/FCBF.h.gcov.html index 022d803..402d5b3 100644 --- a/html/bayesnet/feature_selection/FCBF.h.gcov.html +++ b/html/bayesnet/feature_selection/FCBF.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/FeatureSelect.cc.func-c.html b/html/bayesnet/feature_selection/FeatureSelect.cc.func-c.html index 7fd49a0..0487944 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.cc.func-c.html +++ b/html/bayesnet/feature_selection/FeatureSelect.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,56 +65,56 @@ _ZN8bayesnet13FeatureSelect10initializeEv - 16 + 184 _ZN8bayesnet13FeatureSelect15computeSuLabelsEv - 16 + 184 _ZNK8bayesnet13FeatureSelect11getFeaturesEv - 16 + 184 _ZNK8bayesnet13FeatureSelect9getScoresEv - 16 + 184 _ZN8bayesnet13FeatureSelectC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_ - 22 + 250 _ZN8bayesnet13FeatureSelect15computeMeritCFSEv - 158 + 1851 _ZN8bayesnet13FeatureSelect22symmetricalUncertaintyEii - 411 + 5151 _ZN8bayesnet13FeatureSelect17computeSuFeaturesEii - 980 + 11429 diff --git a/html/bayesnet/feature_selection/FeatureSelect.cc.func.html b/html/bayesnet/feature_selection/FeatureSelect.cc.func.html index 8d6d330..25a2c63 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.cc.func.html +++ b/html/bayesnet/feature_selection/FeatureSelect.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,56 +65,56 @@ _ZN8bayesnet13FeatureSelect10initializeEv - 16 + 184 _ZN8bayesnet13FeatureSelect15computeMeritCFSEv - 158 + 1851 _ZN8bayesnet13FeatureSelect15computeSuLabelsEv - 16 + 184 _ZN8bayesnet13FeatureSelect17computeSuFeaturesEii - 980 + 11429 _ZN8bayesnet13FeatureSelect22symmetricalUncertaintyEii - 411 + 5151 _ZN8bayesnet13FeatureSelectC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_ - 22 + 250 _ZNK8bayesnet13FeatureSelect11getFeaturesEv - 16 + 184 _ZNK8bayesnet13FeatureSelect9getScoresEv - 16 + 184 diff --git a/html/bayesnet/feature_selection/FeatureSelect.cc.gcov.html b/html/bayesnet/feature_selection/FeatureSelect.cc.gcov.html index e7a0c08..0bc9883 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.cc.gcov.html +++ b/html/bayesnet/feature_selection/FeatureSelect.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,17 +70,17 @@ 8 : #include "bayesnet/utils/bayesnetUtils.h" 9 : #include "FeatureSelect.h" 10 : namespace bayesnet { - 11 22 : FeatureSelect::FeatureSelect(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights) : - 12 22 : Metrics(samples, features, className, classNumStates), maxFeatures(maxFeatures == 0 ? samples.size(0) - 1 : maxFeatures), weights(weights) + 11 250 : FeatureSelect::FeatureSelect(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights) : + 12 250 : Metrics(samples, features, className, classNumStates), maxFeatures(maxFeatures == 0 ? samples.size(0) - 1 : maxFeatures), weights(weights) 13 : 14 : { - 15 22 : } - 16 16 : void FeatureSelect::initialize() + 15 250 : } + 16 184 : void FeatureSelect::initialize() 17 : { - 18 16 : selectedFeatures.clear(); - 19 16 : selectedScores.clear(); - 20 16 : } - 21 411 : double FeatureSelect::symmetricalUncertainty(int a, int b) + 18 184 : selectedFeatures.clear(); + 19 184 : selectedScores.clear(); + 20 184 : } + 21 5151 : double FeatureSelect::symmetricalUncertainty(int a, int b) 22 : { 23 : /* 24 : Compute symmetrical uncertainty. Normalize* information gain (mutual @@ -88,60 +88,60 @@ 26 : the bias due to high cardinality features. *Range [0, 1] 27 : (https://www.sciencedirect.com/science/article/pii/S0020025519303603) 28 : */ - 29 1233 : auto x = samples.index({ a, "..." }); - 30 1233 : auto y = samples.index({ b, "..." }); - 31 411 : auto mu = mutualInformation(x, y, weights); - 32 411 : auto hx = entropy(x, weights); - 33 411 : auto hy = entropy(y, weights); - 34 411 : return 2.0 * mu / (hx + hy); - 35 1233 : } - 36 16 : void FeatureSelect::computeSuLabels() + 29 15453 : auto x = samples.index({ a, "..." }); + 30 15453 : auto y = samples.index({ b, "..." }); + 31 5151 : auto mu = mutualInformation(x, y, weights); + 32 5151 : auto hx = entropy(x, weights); + 33 5151 : auto hy = entropy(y, weights); + 34 5151 : return 2.0 * mu / (hx + hy); + 35 15453 : } + 36 184 : void FeatureSelect::computeSuLabels() 37 : { 38 : // Compute Simmetrical Uncertainty between features and labels 39 : // https://en.wikipedia.org/wiki/Symmetric_uncertainty - 40 135 : for (int i = 0; i < features.size(); ++i) { - 41 119 : suLabels.push_back(symmetricalUncertainty(i, -1)); + 40 1976 : for (int i = 0; i < features.size(); ++i) { + 41 1792 : suLabels.push_back(symmetricalUncertainty(i, -1)); 42 : } - 43 16 : } - 44 980 : double FeatureSelect::computeSuFeatures(const int firstFeature, const int secondFeature) + 43 184 : } + 44 11429 : double FeatureSelect::computeSuFeatures(const int firstFeature, const int secondFeature) 45 : { 46 : // Compute Simmetrical Uncertainty between features 47 : // https://en.wikipedia.org/wiki/Symmetric_uncertainty 48 : try { - 49 980 : return suFeatures.at({ firstFeature, secondFeature }); + 49 11429 : return suFeatures.at({ firstFeature, secondFeature }); 50 : } - 51 292 : catch (const std::out_of_range& e) { - 52 292 : double result = symmetricalUncertainty(firstFeature, secondFeature); - 53 292 : suFeatures[{firstFeature, secondFeature}] = result; - 54 292 : return result; - 55 292 : } + 51 3359 : catch (const std::out_of_range& e) { + 52 3359 : double result = symmetricalUncertainty(firstFeature, secondFeature); + 53 3359 : suFeatures[{firstFeature, secondFeature}] = result; + 54 3359 : return result; + 55 3359 : } 56 : } - 57 158 : double FeatureSelect::computeMeritCFS() + 57 1851 : double FeatureSelect::computeMeritCFS() 58 : { - 59 158 : double rcf = 0; - 60 727 : for (auto feature : selectedFeatures) { - 61 569 : rcf += suLabels[feature]; + 59 1851 : double rcf = 0; + 60 8514 : for (auto feature : selectedFeatures) { + 61 6663 : rcf += suLabels[feature]; 62 : } - 63 158 : double rff = 0; - 64 158 : int n = selectedFeatures.size(); - 65 1043 : for (const auto& item : doCombinations(selectedFeatures)) { - 66 885 : rff += computeSuFeatures(item.first, item.second); - 67 158 : } - 68 158 : return rcf / sqrt(n + (n * n - n) * rff); + 63 1851 : double rff = 0; + 64 1851 : int n = selectedFeatures.size(); + 65 12209 : for (const auto& item : doCombinations(selectedFeatures)) { + 66 10358 : rff += computeSuFeatures(item.first, item.second); + 67 1851 : } + 68 1851 : return rcf / sqrt(n + (n * n - n) * rff); 69 : } - 70 16 : std::vector<int> FeatureSelect::getFeatures() const + 70 184 : std::vector<int> FeatureSelect::getFeatures() const 71 : { - 72 16 : if (!fitted) { + 72 184 : if (!fitted) { 73 0 : throw std::runtime_error("FeatureSelect not fitted"); 74 : } - 75 16 : return selectedFeatures; + 75 184 : return selectedFeatures; 76 : } - 77 16 : std::vector<double> FeatureSelect::getScores() const + 77 184 : std::vector<double> FeatureSelect::getScores() const 78 : { - 79 16 : if (!fitted) { + 79 184 : if (!fitted) { 80 0 : throw std::runtime_error("FeatureSelect not fitted"); 81 : } - 82 16 : return selectedScores; + 82 184 : return selectedScores; 83 : } 84 : } diff --git a/html/bayesnet/feature_selection/FeatureSelect.h.func-c.html b/html/bayesnet/feature_selection/FeatureSelect.h.func-c.html index 19f475b..d50f2cc 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.h.func-c.html +++ b/html/bayesnet/feature_selection/FeatureSelect.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/feature_selection/FeatureSelect.h.func.html b/html/bayesnet/feature_selection/FeatureSelect.h.func.html index e29a6fd..ff9bc83 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.h.func.html +++ b/html/bayesnet/feature_selection/FeatureSelect.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/feature_selection/FeatureSelect.h.gcov.html b/html/bayesnet/feature_selection/FeatureSelect.h.gcov.html index 0f25a63..4d0d11f 100644 --- a/html/bayesnet/feature_selection/FeatureSelect.h.gcov.html +++ b/html/bayesnet/feature_selection/FeatureSelect.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/feature_selection/IWSS.cc.func-c.html b/html/bayesnet/feature_selection/IWSS.cc.func-c.html index a45fffb..13940a9 100644 --- a/html/bayesnet/feature_selection/IWSS.cc.func-c.html +++ b/html/bayesnet/feature_selection/IWSS.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet4IWSS3fitEv - 5 + 58 _ZN8bayesnet4IWSSC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_d - 9 + 102 diff --git a/html/bayesnet/feature_selection/IWSS.cc.func.html b/html/bayesnet/feature_selection/IWSS.cc.func.html index 1f08e8d..fcf94fd 100644 --- a/html/bayesnet/feature_selection/IWSS.cc.func.html +++ b/html/bayesnet/feature_selection/IWSS.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,14 +65,14 @@ _ZN8bayesnet4IWSS3fitEv - 5 + 58 _ZN8bayesnet4IWSSC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_iiS4_d - 9 + 102 diff --git a/html/bayesnet/feature_selection/IWSS.cc.gcov.html b/html/bayesnet/feature_selection/IWSS.cc.gcov.html index 9dd4289..5720b93 100644 --- a/html/bayesnet/feature_selection/IWSS.cc.gcov.html +++ b/html/bayesnet/feature_selection/IWSS.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,48 +70,48 @@ 8 : #include "bayesnet/utils/bayesnetUtils.h" 9 : #include "IWSS.h" 10 : namespace bayesnet { - 11 9 : IWSS::IWSS(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights, const double threshold) : - 12 9 : FeatureSelect(samples, features, className, maxFeatures, classNumStates, weights), threshold(threshold) + 11 102 : IWSS::IWSS(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int maxFeatures, const int classNumStates, const torch::Tensor& weights, const double threshold) : + 12 102 : FeatureSelect(samples, features, className, maxFeatures, classNumStates, weights), threshold(threshold) 13 : { - 14 9 : if (threshold < 0 || threshold > .5) { - 15 4 : throw std::invalid_argument("Threshold has to be in [0, 0.5]"); + 14 102 : if (threshold < 0 || threshold > .5) { + 15 44 : throw std::invalid_argument("Threshold has to be in [0, 0.5]"); 16 : } - 17 9 : } - 18 5 : void IWSS::fit() + 17 102 : } + 18 58 : void IWSS::fit() 19 : { - 20 5 : initialize(); - 21 5 : computeSuLabels(); - 22 5 : auto featureOrder = argsort(suLabels); // sort descending order - 23 5 : auto featureOrderCopy = featureOrder; + 20 58 : initialize(); + 21 58 : computeSuLabels(); + 22 58 : auto featureOrder = argsort(suLabels); // sort descending order + 23 58 : auto featureOrderCopy = featureOrder; 24 : // Add first and second features to result 25 : // First with its own score - 26 5 : auto first_feature = pop_first(featureOrderCopy); - 27 5 : selectedFeatures.push_back(first_feature); - 28 5 : selectedScores.push_back(suLabels.at(first_feature)); + 26 58 : auto first_feature = pop_first(featureOrderCopy); + 27 58 : selectedFeatures.push_back(first_feature); + 28 58 : selectedScores.push_back(suLabels.at(first_feature)); 29 : // Second with the score of the candidates - 30 5 : selectedFeatures.push_back(pop_first(featureOrderCopy)); - 31 5 : auto merit = computeMeritCFS(); - 32 5 : selectedScores.push_back(merit); - 33 17 : for (const auto feature : featureOrderCopy) { - 34 17 : selectedFeatures.push_back(feature); + 30 58 : selectedFeatures.push_back(pop_first(featureOrderCopy)); + 31 58 : auto merit = computeMeritCFS(); + 32 58 : selectedScores.push_back(merit); + 33 192 : for (const auto feature : featureOrderCopy) { + 34 192 : selectedFeatures.push_back(feature); 35 : // Compute merit with selectedFeatures - 36 17 : auto meritNew = computeMeritCFS(); - 37 17 : double delta = merit != 0.0 ? std::abs(merit - meritNew) / merit : 0.0; - 38 17 : if (meritNew > merit || delta < threshold) { - 39 12 : if (meritNew > merit) { + 36 192 : auto meritNew = computeMeritCFS(); + 37 192 : double delta = merit != 0.0 ? std::abs(merit - meritNew) / merit : 0.0; + 38 192 : if (meritNew > merit || delta < threshold) { + 39 134 : if (meritNew > merit) { 40 0 : merit = meritNew; 41 : } - 42 12 : selectedScores.push_back(meritNew); + 42 134 : selectedScores.push_back(meritNew); 43 : } else { - 44 5 : selectedFeatures.pop_back(); - 45 5 : break; + 44 58 : selectedFeatures.pop_back(); + 45 58 : break; 46 : } - 47 12 : if (selectedFeatures.size() == maxFeatures) { + 47 134 : if (selectedFeatures.size() == maxFeatures) { 48 0 : break; 49 : } 50 : } - 51 5 : fitted = true; - 52 5 : } + 51 58 : fitted = true; + 52 58 : } 53 : } diff --git a/html/bayesnet/feature_selection/IWSS.h.func-c.html b/html/bayesnet/feature_selection/IWSS.h.func-c.html index 80f6733..0a3e46b 100644 --- a/html/bayesnet/feature_selection/IWSS.h.func-c.html +++ b/html/bayesnet/feature_selection/IWSS.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/IWSS.h.func.html b/html/bayesnet/feature_selection/IWSS.h.func.html index e9101b3..e63cb1e 100644 --- a/html/bayesnet/feature_selection/IWSS.h.func.html +++ b/html/bayesnet/feature_selection/IWSS.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/IWSS.h.gcov.html b/html/bayesnet/feature_selection/IWSS.h.gcov.html index d848c67..ad1914a 100644 --- a/html/bayesnet/feature_selection/IWSS.h.gcov.html +++ b/html/bayesnet/feature_selection/IWSS.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/feature_selection/index-sort-f.html b/html/bayesnet/feature_selection/index-sort-f.html index 34ae8d1..1b08606 100644 --- a/html/bayesnet/feature_selection/index-sort-f.html +++ b/html/bayesnet/feature_selection/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 95.7 % diff --git a/html/bayesnet/feature_selection/index-sort-l.html b/html/bayesnet/feature_selection/index-sort-l.html index 3c10ce7..80170e6 100644 --- a/html/bayesnet/feature_selection/index-sort-l.html +++ b/html/bayesnet/feature_selection/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 95.7 % diff --git a/html/bayesnet/feature_selection/index.html b/html/bayesnet/feature_selection/index.html index 13df33b..b96e9c6 100644 --- a/html/bayesnet/feature_selection/index.html +++ b/html/bayesnet/feature_selection/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 95.7 % diff --git a/html/bayesnet/index-sort-f.html b/html/bayesnet/index-sort-f.html index d556a88..d47749c 100644 --- a/html/bayesnet/index-sort-f.html +++ b/html/bayesnet/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/index-sort-l.html b/html/bayesnet/index-sort-l.html index 921df1a..41fd217 100644 --- a/html/bayesnet/index-sort-l.html +++ b/html/bayesnet/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/index.html b/html/bayesnet/index.html index 84f9ffc..62fd9de 100644 --- a/html/bayesnet/index.html +++ b/html/bayesnet/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 50.0 % diff --git a/html/bayesnet/network/Network.cc.func-c.html b/html/bayesnet/network/Network.cc.func-c.html index 55e29cb..bb0c95a 100644 --- a/html/bayesnet/network/Network.cc.func-c.html +++ b/html/bayesnet/network/Network.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,280 +65,280 @@ _ZN8bayesnet7Network3fitERKN2at6TensorES4_S4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE - 1 + 11 _ZN8bayesnet7NetworkC2Ef - 2 + 22 _ZNK8bayesnet7Network8dump_cptB5cxx11Ev - 2 + 22 _ZN8bayesnet7Network5scoreERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_ - 5 + 55 _ZNK8bayesnet7Network4showB5cxx11Ev - 7 + 77 _ZN8bayesnet7Network10getSamplesEv - 12 + 132 _ZN8bayesnet7Network7predictERKSt6vectorIS1_IiSaIiEESaIS3_EE - 12 + 132 _ZNK8bayesnet7Network9getStatesEv - 12 + 132 _ZN8bayesnet7Network3fitERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_IdSaIdEERKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISJ_EERKSJ_RKSt3mapISJ_S3_St4lessISJ_ESaISt4pairISO_S3_EEE - 21 + 231 _ZNK8bayesnet7Network5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 22 + 242 _ZNK8bayesnet7Network11getNumEdgesEv - 48 - - - - - _ZNK8bayesnet7Network11getFeaturesB5cxx11Ev - - 52 + 563 _ZN8bayesnet7Network16topological_sortB5cxx11Ev - 55 + 605 + + + + + _ZNK8bayesnet7Network11getFeaturesB5cxx11Ev + + 607 _ZNK8bayesnet7Network8getEdgesB5cxx11Ev - 59 + 684 _ZN8bayesnet7Network13predict_probaERKSt6vectorIS1_IiSaIiEESaIS3_EE - 68 + 777 _ZN8bayesnet7Network7predictERKN2at6TensorE - 245 + 3262 _ZN8bayesnet7Network10initializeEv - 286 + 3358 _ZN8bayesnet7Network13predict_probaERKN2at6TensorE - 304 + 3540 _ZN8bayesnet7Network3fitERKN2at6TensorES4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE - 305 + 3545 _ZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorE - 313 + 3633 _ZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEE - 313 + 3633 _ZN8bayesnet7Network12checkFitDataEiiiRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RKSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE - 327 + 3787 _ZN8bayesnet7NetworkC2ERKS0_ - 414 + 4761 _ZNK8bayesnet7Network13getMaxThreadsEv - 417 + 4794 _ZN8bayesnet7NetworkC2Ev - 435 + 4992 _ZNK8bayesnet7Network17getClassNumStatesEv - 496 + 5704 _ZN8bayesnet7Network14predict_tensorERKN2at6TensorEb - 549 + 6802 _ZN8bayesnet7Network7addNodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 8878 + 116878 _ZZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorEENKUlvE_clEv - 9288 + 121388 _ZZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEEENKUlRSE_E_clESK_ - 9288 + 121388 _ZN8bayesnet7Network14predict_sampleERKSt6vectorIiSaIiEE - 13606 + 155486 _ZN8bayesnet7Network7addEdgeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ - 16946 + 224276 _ZN8bayesnet7Network8isCyclicERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt13unordered_setIS6_St4hashIS6_ESt8equal_toIS6_ESaIS6_EESG_ - 22324 + 295830 _ZN8bayesnet7Network14predict_sampleERKN2at6TensorE - 95840 + 1163291 _ZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 109442 + 1318733 _ZN8bayesnet7Network13computeFactorERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 437768 + 5150558 _ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKdE_clESH_ - 437768 + 5150558 _ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlvE_clEv - 437768 + 5150558 _ZNK8bayesnet7Network12getClassNameB5cxx11Ev - 437774 + 5150624 _ZN8bayesnet7Network8getNodesB5cxx11Ev - 437841 + 5151361 diff --git a/html/bayesnet/network/Network.cc.func.html b/html/bayesnet/network/Network.cc.func.html index dd99d8e..9d633be 100644 --- a/html/bayesnet/network/Network.cc.func.html +++ b/html/bayesnet/network/Network.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,280 +65,280 @@ _ZN8bayesnet7Network10getSamplesEv - 12 + 132 _ZN8bayesnet7Network10initializeEv - 286 + 3358 _ZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorE - 313 + 3633 _ZN8bayesnet7Network12checkFitDataEiiiRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RKSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE - 327 + 3787 _ZN8bayesnet7Network13computeFactorERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 437768 + 5150558 _ZN8bayesnet7Network13predict_probaERKN2at6TensorE - 304 + 3540 _ZN8bayesnet7Network13predict_probaERKSt6vectorIS1_IiSaIiEESaIS3_EE - 68 + 777 _ZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 109442 + 1318733 _ZN8bayesnet7Network14predict_sampleERKN2at6TensorE - 95840 + 1163291 _ZN8bayesnet7Network14predict_sampleERKSt6vectorIiSaIiEE - 13606 + 155486 _ZN8bayesnet7Network14predict_tensorERKN2at6TensorEb - 549 + 6802 _ZN8bayesnet7Network16topological_sortB5cxx11Ev - 55 + 605 _ZN8bayesnet7Network3fitERKN2at6TensorES4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE - 305 + 3545 _ZN8bayesnet7Network3fitERKN2at6TensorES4_S4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE - 1 + 11 _ZN8bayesnet7Network3fitERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_IdSaIdEERKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISJ_EERKSJ_RKSt3mapISJ_S3_St4lessISJ_ESaISt4pairISO_S3_EEE - 21 + 231 _ZN8bayesnet7Network5scoreERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_ - 5 + 55 _ZN8bayesnet7Network7addEdgeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ - 16946 + 224276 _ZN8bayesnet7Network7addNodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 8878 + 116878 _ZN8bayesnet7Network7predictERKN2at6TensorE - 245 + 3262 _ZN8bayesnet7Network7predictERKSt6vectorIS1_IiSaIiEESaIS3_EE - 12 + 132 _ZN8bayesnet7Network8getNodesB5cxx11Ev - 437841 + 5151361 _ZN8bayesnet7Network8isCyclicERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt13unordered_setIS6_St4hashIS6_ESt8equal_toIS6_ESaIS6_EESG_ - 22324 + 295830 _ZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEE - 313 + 3633 _ZN8bayesnet7NetworkC2ERKS0_ - 414 + 4761 _ZN8bayesnet7NetworkC2Ef - 2 + 22 _ZN8bayesnet7NetworkC2Ev - 435 + 4992 _ZNK8bayesnet7Network11getFeaturesB5cxx11Ev - 52 + 607 _ZNK8bayesnet7Network11getNumEdgesEv - 48 + 563 _ZNK8bayesnet7Network12getClassNameB5cxx11Ev - 437774 + 5150624 _ZNK8bayesnet7Network13getMaxThreadsEv - 417 + 4794 _ZNK8bayesnet7Network17getClassNumStatesEv - 496 + 5704 _ZNK8bayesnet7Network4showB5cxx11Ev - 7 + 77 _ZNK8bayesnet7Network5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 22 + 242 _ZNK8bayesnet7Network8dump_cptB5cxx11Ev - 2 + 22 _ZNK8bayesnet7Network8getEdgesB5cxx11Ev - 59 + 684 _ZNK8bayesnet7Network9getStatesEv - 12 + 132 _ZZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorEENKUlvE_clEv - 9288 + 121388 _ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKdE_clESH_ - 437768 + 5150558 _ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlvE_clEv - 437768 + 5150558 _ZZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEEENKUlRSE_E_clESK_ - 9288 + 121388 diff --git a/html/bayesnet/network/Network.cc.gcov.html b/html/bayesnet/network/Network.cc.gcov.html index 4363428..a17fe2c 100644 --- a/html/bayesnet/network/Network.cc.gcov.html +++ b/html/bayesnet/network/Network.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -72,405 +72,405 @@ 10 : #include "Network.h" 11 : #include "bayesnet/utils/bayesnetUtils.h" 12 : namespace bayesnet { - 13 435 : Network::Network() : fitted{ false }, maxThreads{ 0.95 }, classNumStates{ 0 }, laplaceSmoothing{ 0 } + 13 4992 : Network::Network() : fitted{ false }, maxThreads{ 0.95 }, classNumStates{ 0 }, laplaceSmoothing{ 0 } 14 : { - 15 435 : } - 16 2 : Network::Network(float maxT) : fitted{ false }, maxThreads{ maxT }, classNumStates{ 0 }, laplaceSmoothing{ 0 } + 15 4992 : } + 16 22 : Network::Network(float maxT) : fitted{ false }, maxThreads{ maxT }, classNumStates{ 0 }, laplaceSmoothing{ 0 } 17 : { 18 : - 19 2 : } - 20 414 : Network::Network(const Network& other) : laplaceSmoothing(other.laplaceSmoothing), features(other.features), className(other.className), classNumStates(other.getClassNumStates()), - 21 828 : maxThreads(other.getMaxThreads()), fitted(other.fitted), samples(other.samples) + 19 22 : } + 20 4761 : Network::Network(const Network& other) : laplaceSmoothing(other.laplaceSmoothing), features(other.features), className(other.className), classNumStates(other.getClassNumStates()), + 21 9522 : maxThreads(other.getMaxThreads()), fitted(other.fitted), samples(other.samples) 22 : { - 23 414 : if (samples.defined()) - 24 1 : samples = samples.clone(); - 25 419 : for (const auto& node : other.nodes) { - 26 5 : nodes[node.first] = std::make_unique<Node>(*node.second); + 23 4761 : if (samples.defined()) + 24 11 : samples = samples.clone(); + 25 4816 : for (const auto& node : other.nodes) { + 26 55 : nodes[node.first] = std::make_unique<Node>(*node.second); 27 : } - 28 414 : } - 29 286 : void Network::initialize() + 28 4761 : } + 29 3358 : void Network::initialize() 30 : { - 31 286 : features.clear(); - 32 286 : className = ""; - 33 286 : classNumStates = 0; - 34 286 : fitted = false; - 35 286 : nodes.clear(); - 36 286 : samples = torch::Tensor(); - 37 286 : } - 38 417 : float Network::getMaxThreads() const + 31 3358 : features.clear(); + 32 3358 : className = ""; + 33 3358 : classNumStates = 0; + 34 3358 : fitted = false; + 35 3358 : nodes.clear(); + 36 3358 : samples = torch::Tensor(); + 37 3358 : } + 38 4794 : float Network::getMaxThreads() const 39 : { - 40 417 : return maxThreads; + 40 4794 : return maxThreads; 41 : } - 42 12 : torch::Tensor& Network::getSamples() + 42 132 : torch::Tensor& Network::getSamples() 43 : { - 44 12 : return samples; + 44 132 : return samples; 45 : } - 46 8878 : void Network::addNode(const std::string& name) + 46 116878 : void Network::addNode(const std::string& name) 47 : { - 48 8878 : if (name == "") { - 49 2 : throw std::invalid_argument("Node name cannot be empty"); + 48 116878 : if (name == "") { + 49 22 : throw std::invalid_argument("Node name cannot be empty"); 50 : } - 51 8876 : if (nodes.find(name) != nodes.end()) { + 51 116856 : if (nodes.find(name) != nodes.end()) { 52 0 : return; 53 : } - 54 8876 : if (find(features.begin(), features.end(), name) == features.end()) { - 55 8876 : features.push_back(name); + 54 116856 : if (find(features.begin(), features.end(), name) == features.end()) { + 55 116856 : features.push_back(name); 56 : } - 57 8876 : nodes[name] = std::make_unique<Node>(name); + 57 116856 : nodes[name] = std::make_unique<Node>(name); 58 : } - 59 52 : std::vector<std::string> Network::getFeatures() const + 59 607 : std::vector<std::string> Network::getFeatures() const 60 : { - 61 52 : return features; + 61 607 : return features; 62 : } - 63 496 : int Network::getClassNumStates() const + 63 5704 : int Network::getClassNumStates() const 64 : { - 65 496 : return classNumStates; + 65 5704 : return classNumStates; 66 : } - 67 12 : int Network::getStates() const + 67 132 : int Network::getStates() const 68 : { - 69 12 : int result = 0; - 70 72 : for (auto& node : nodes) { - 71 60 : result += node.second->getNumStates(); + 69 132 : int result = 0; + 70 792 : for (auto& node : nodes) { + 71 660 : result += node.second->getNumStates(); 72 : } - 73 12 : return result; + 73 132 : return result; 74 : } - 75 437774 : std::string Network::getClassName() const + 75 5150624 : std::string Network::getClassName() const 76 : { - 77 437774 : return className; + 77 5150624 : return className; 78 : } - 79 22324 : bool Network::isCyclic(const std::string& nodeId, std::unordered_set<std::string>& visited, std::unordered_set<std::string>& recStack) + 79 295830 : bool Network::isCyclic(const std::string& nodeId, std::unordered_set<std::string>& visited, std::unordered_set<std::string>& recStack) 80 : { - 81 22324 : if (visited.find(nodeId) == visited.end()) // if node hasn't been visited yet + 81 295830 : if (visited.find(nodeId) == visited.end()) // if node hasn't been visited yet 82 : { - 83 22324 : visited.insert(nodeId); - 84 22324 : recStack.insert(nodeId); - 85 27702 : for (Node* child : nodes[nodeId]->getChildren()) { - 86 5384 : if (visited.find(child->getName()) == visited.end() && isCyclic(child->getName(), visited, recStack)) - 87 6 : return true; - 88 5380 : if (recStack.find(child->getName()) != recStack.end()) - 89 2 : return true; + 83 295830 : visited.insert(nodeId); + 84 295830 : recStack.insert(nodeId); + 85 367384 : for (Node* child : nodes[nodeId]->getChildren()) { + 86 71620 : if (visited.find(child->getName()) == visited.end() && isCyclic(child->getName(), visited, recStack)) + 87 66 : return true; + 88 71576 : if (recStack.find(child->getName()) != recStack.end()) + 89 22 : return true; 90 : } 91 : } - 92 22318 : recStack.erase(nodeId); // remove node from recursion stack before function ends - 93 22318 : return false; + 92 295764 : recStack.erase(nodeId); // remove node from recursion stack before function ends + 93 295764 : return false; 94 : } - 95 16946 : void Network::addEdge(const std::string& parent, const std::string& child) + 95 224276 : void Network::addEdge(const std::string& parent, const std::string& child) 96 : { - 97 16946 : if (nodes.find(parent) == nodes.end()) { - 98 2 : throw std::invalid_argument("Parent node " + parent + " does not exist"); + 97 224276 : if (nodes.find(parent) == nodes.end()) { + 98 22 : throw std::invalid_argument("Parent node " + parent + " does not exist"); 99 : } - 100 16944 : if (nodes.find(child) == nodes.end()) { - 101 2 : throw std::invalid_argument("Child node " + child + " does not exist"); + 100 224254 : if (nodes.find(child) == nodes.end()) { + 101 22 : throw std::invalid_argument("Child node " + child + " does not exist"); 102 : } 103 : // Temporarily add edge to check for cycles - 104 16942 : nodes[parent]->addChild(nodes[child].get()); - 105 16942 : nodes[child]->addParent(nodes[parent].get()); - 106 16942 : std::unordered_set<std::string> visited; - 107 16942 : std::unordered_set<std::string> recStack; - 108 16942 : if (isCyclic(nodes[child]->getName(), visited, recStack)) // if adding this edge forms a cycle + 104 224232 : nodes[parent]->addChild(nodes[child].get()); + 105 224232 : nodes[child]->addParent(nodes[parent].get()); + 106 224232 : std::unordered_set<std::string> visited; + 107 224232 : std::unordered_set<std::string> recStack; + 108 224232 : if (isCyclic(nodes[child]->getName(), visited, recStack)) // if adding this edge forms a cycle 109 : { 110 : // remove problematic edge - 111 2 : nodes[parent]->removeChild(nodes[child].get()); - 112 2 : nodes[child]->removeParent(nodes[parent].get()); - 113 2 : throw std::invalid_argument("Adding this edge forms a cycle in the graph."); + 111 22 : nodes[parent]->removeChild(nodes[child].get()); + 112 22 : nodes[child]->removeParent(nodes[parent].get()); + 113 22 : throw std::invalid_argument("Adding this edge forms a cycle in the graph."); 114 : } - 115 16944 : } - 116 437841 : std::map<std::string, std::unique_ptr<Node>>& Network::getNodes() + 115 224254 : } + 116 5151361 : std::map<std::string, std::unique_ptr<Node>>& Network::getNodes() 117 : { - 118 437841 : return nodes; + 118 5151361 : return nodes; 119 : } - 120 327 : void Network::checkFitData(int n_samples, int n_features, int n_samples_y, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) + 120 3787 : void Network::checkFitData(int n_samples, int n_features, int n_samples_y, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) 121 : { - 122 327 : if (weights.size(0) != n_samples) { - 123 2 : throw std::invalid_argument("Weights (" + std::to_string(weights.size(0)) + ") must have the same number of elements as samples (" + std::to_string(n_samples) + ") in Network::fit"); + 122 3787 : if (weights.size(0) != n_samples) { + 123 22 : throw std::invalid_argument("Weights (" + std::to_string(weights.size(0)) + ") must have the same number of elements as samples (" + std::to_string(n_samples) + ") in Network::fit"); 124 : } - 125 325 : if (n_samples != n_samples_y) { - 126 2 : throw std::invalid_argument("X and y must have the same number of samples in Network::fit (" + std::to_string(n_samples) + " != " + std::to_string(n_samples_y) + ")"); + 125 3765 : if (n_samples != n_samples_y) { + 126 22 : throw std::invalid_argument("X and y must have the same number of samples in Network::fit (" + std::to_string(n_samples) + " != " + std::to_string(n_samples_y) + ")"); 127 : } - 128 323 : if (n_features != featureNames.size()) { - 129 2 : throw std::invalid_argument("X and features must have the same number of features in Network::fit (" + std::to_string(n_features) + " != " + std::to_string(featureNames.size()) + ")"); + 128 3743 : if (n_features != featureNames.size()) { + 129 22 : throw std::invalid_argument("X and features must have the same number of features in Network::fit (" + std::to_string(n_features) + " != " + std::to_string(featureNames.size()) + ")"); 130 : } - 131 321 : if (features.size() == 0) { - 132 2 : throw std::invalid_argument("The network has not been initialized. You must call addNode() before calling fit()"); + 131 3721 : if (features.size() == 0) { + 132 22 : throw std::invalid_argument("The network has not been initialized. You must call addNode() before calling fit()"); 133 : } - 134 319 : if (n_features != features.size() - 1) { - 135 2 : throw std::invalid_argument("X and local features must have the same number of features in Network::fit (" + std::to_string(n_features) + " != " + std::to_string(features.size() - 1) + ")"); + 134 3699 : if (n_features != features.size() - 1) { + 135 22 : throw std::invalid_argument("X and local features must have the same number of features in Network::fit (" + std::to_string(n_features) + " != " + std::to_string(features.size() - 1) + ")"); 136 : } - 137 317 : if (find(features.begin(), features.end(), className) == features.end()) { - 138 2 : throw std::invalid_argument("Class Name not found in Network::features"); + 137 3677 : if (find(features.begin(), features.end(), className) == features.end()) { + 138 22 : throw std::invalid_argument("Class Name not found in Network::features"); 139 : } - 140 9296 : for (auto& feature : featureNames) { - 141 8983 : if (find(features.begin(), features.end(), feature) == features.end()) { - 142 2 : throw std::invalid_argument("Feature " + feature + " not found in Network::features"); + 140 121476 : for (auto& feature : featureNames) { + 141 117843 : if (find(features.begin(), features.end(), feature) == features.end()) { + 142 22 : throw std::invalid_argument("Feature " + feature + " not found in Network::features"); 143 : } - 144 8981 : if (states.find(feature) == states.end()) { + 144 117821 : if (states.find(feature) == states.end()) { 145 0 : throw std::invalid_argument("Feature " + feature + " not found in states"); 146 : } 147 : } - 148 313 : } - 149 313 : void Network::setStates(const std::map<std::string, std::vector<int>>& states) + 148 3633 : } + 149 3633 : void Network::setStates(const std::map<std::string, std::vector<int>>& states) 150 : { 151 : // Set states to every Node in the network - 152 313 : for_each(features.begin(), features.end(), [this, &states](const std::string& feature) { - 153 9288 : nodes.at(feature)->setNumStates(states.at(feature).size()); - 154 9288 : }); - 155 313 : classNumStates = nodes.at(className)->getNumStates(); - 156 313 : } + 152 3633 : for_each(features.begin(), features.end(), [this, &states](const std::string& feature) { + 153 121388 : nodes.at(feature)->setNumStates(states.at(feature).size()); + 154 121388 : }); + 155 3633 : classNumStates = nodes.at(className)->getNumStates(); + 156 3633 : } 157 : // X comes in nxm, where n is the number of features and m the number of samples - 158 1 : void Network::fit(const torch::Tensor& X, const torch::Tensor& y, const torch::Tensor& weights, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) + 158 11 : void Network::fit(const torch::Tensor& X, const torch::Tensor& y, const torch::Tensor& weights, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) 159 : { - 160 1 : checkFitData(X.size(1), X.size(0), y.size(0), featureNames, className, states, weights); - 161 1 : this->className = className; - 162 1 : torch::Tensor ytmp = torch::transpose(y.view({ y.size(0), 1 }), 0, 1); - 163 3 : samples = torch::cat({ X , ytmp }, 0); - 164 5 : for (int i = 0; i < featureNames.size(); ++i) { - 165 12 : auto row_feature = X.index({ i, "..." }); - 166 4 : } - 167 1 : completeFit(states, weights); - 168 6 : } - 169 305 : void Network::fit(const torch::Tensor& samples, const torch::Tensor& weights, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) + 160 11 : checkFitData(X.size(1), X.size(0), y.size(0), featureNames, className, states, weights); + 161 11 : this->className = className; + 162 11 : torch::Tensor ytmp = torch::transpose(y.view({ y.size(0), 1 }), 0, 1); + 163 33 : samples = torch::cat({ X , ytmp }, 0); + 164 55 : for (int i = 0; i < featureNames.size(); ++i) { + 165 132 : auto row_feature = X.index({ i, "..." }); + 166 44 : } + 167 11 : completeFit(states, weights); + 168 66 : } + 169 3545 : void Network::fit(const torch::Tensor& samples, const torch::Tensor& weights, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) 170 : { - 171 305 : checkFitData(samples.size(1), samples.size(0) - 1, samples.size(1), featureNames, className, states, weights); - 172 305 : this->className = className; - 173 305 : this->samples = samples; - 174 305 : completeFit(states, weights); - 175 305 : } + 171 3545 : checkFitData(samples.size(1), samples.size(0) - 1, samples.size(1), featureNames, className, states, weights); + 172 3545 : this->className = className; + 173 3545 : this->samples = samples; + 174 3545 : completeFit(states, weights); + 175 3545 : } 176 : // input_data comes in nxm, where n is the number of features and m the number of samples - 177 21 : void Network::fit(const std::vector<std::vector<int>>& input_data, const std::vector<int>& labels, const std::vector<double>& weights_, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) + 177 231 : void Network::fit(const std::vector<std::vector<int>>& input_data, const std::vector<int>& labels, const std::vector<double>& weights_, const std::vector<std::string>& featureNames, const std::string& className, const std::map<std::string, std::vector<int>>& states) 178 : { - 179 21 : const torch::Tensor weights = torch::tensor(weights_, torch::kFloat64); - 180 21 : checkFitData(input_data[0].size(), input_data.size(), labels.size(), featureNames, className, states, weights); - 181 7 : this->className = className; + 179 231 : const torch::Tensor weights = torch::tensor(weights_, torch::kFloat64); + 180 231 : checkFitData(input_data[0].size(), input_data.size(), labels.size(), featureNames, className, states, weights); + 181 77 : this->className = className; 182 : // Build tensor of samples (nxm) (n+1 because of the class) - 183 7 : samples = torch::zeros({ static_cast<int>(input_data.size() + 1), static_cast<int>(input_data[0].size()) }, torch::kInt32); - 184 35 : for (int i = 0; i < featureNames.size(); ++i) { - 185 112 : samples.index_put_({ i, "..." }, torch::tensor(input_data[i], torch::kInt32)); + 183 77 : samples = torch::zeros({ static_cast<int>(input_data.size() + 1), static_cast<int>(input_data[0].size()) }, torch::kInt32); + 184 385 : for (int i = 0; i < featureNames.size(); ++i) { + 185 1232 : samples.index_put_({ i, "..." }, torch::tensor(input_data[i], torch::kInt32)); 186 : } - 187 28 : samples.index_put_({ -1, "..." }, torch::tensor(labels, torch::kInt32)); - 188 7 : completeFit(states, weights); - 189 56 : } - 190 313 : void Network::completeFit(const std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) + 187 308 : samples.index_put_({ -1, "..." }, torch::tensor(labels, torch::kInt32)); + 188 77 : completeFit(states, weights); + 189 616 : } + 190 3633 : void Network::completeFit(const std::map<std::string, std::vector<int>>& states, const torch::Tensor& weights) 191 : { - 192 313 : setStates(states); - 193 313 : laplaceSmoothing = 1.0 / samples.size(1); // To use in CPT computation - 194 313 : std::vector<std::thread> threads; - 195 9601 : for (auto& node : nodes) { - 196 9288 : threads.emplace_back([this, &node, &weights]() { - 197 9288 : node.second->computeCPT(samples, features, laplaceSmoothing, weights); - 198 9288 : }); + 192 3633 : setStates(states); + 193 3633 : laplaceSmoothing = 1.0 / samples.size(1); // To use in CPT computation + 194 3633 : std::vector<std::thread> threads; + 195 125021 : for (auto& node : nodes) { + 196 121388 : threads.emplace_back([this, &node, &weights]() { + 197 121388 : node.second->computeCPT(samples, features, laplaceSmoothing, weights); + 198 121388 : }); 199 : } - 200 9601 : for (auto& thread : threads) { - 201 9288 : thread.join(); + 200 125021 : for (auto& thread : threads) { + 201 121388 : thread.join(); 202 : } - 203 313 : fitted = true; - 204 313 : } - 205 549 : torch::Tensor Network::predict_tensor(const torch::Tensor& samples, const bool proba) + 203 3633 : fitted = true; + 204 3633 : } + 205 6802 : torch::Tensor Network::predict_tensor(const torch::Tensor& samples, const bool proba) 206 : { - 207 549 : if (!fitted) { - 208 2 : throw std::logic_error("You must call fit() before calling predict()"); + 207 6802 : if (!fitted) { + 208 22 : throw std::logic_error("You must call fit() before calling predict()"); 209 : } - 210 547 : torch::Tensor result; - 211 547 : result = torch::zeros({ samples.size(1), classNumStates }, torch::kFloat64); - 212 96385 : for (int i = 0; i < samples.size(1); ++i) { - 213 287520 : const torch::Tensor sample = samples.index({ "...", i }); - 214 95840 : auto psample = predict_sample(sample); - 215 95838 : auto temp = torch::tensor(psample, torch::kFloat64); + 210 6780 : torch::Tensor result; + 211 6780 : result = torch::zeros({ samples.size(1), classNumStates }, torch::kFloat64); + 212 1170049 : for (int i = 0; i < samples.size(1); ++i) { + 213 3489873 : const torch::Tensor sample = samples.index({ "...", i }); + 214 1163291 : auto psample = predict_sample(sample); + 215 1163269 : auto temp = torch::tensor(psample, torch::kFloat64); 216 : // result.index_put_({ i, "..." }, torch::tensor(predict_sample(sample), torch::kFloat64)); - 217 287514 : result.index_put_({ i, "..." }, temp); - 218 95840 : } - 219 545 : if (proba) - 220 304 : return result; - 221 482 : return result.argmax(1); - 222 192225 : } + 217 3489807 : result.index_put_({ i, "..." }, temp); + 218 1163291 : } + 219 6758 : if (proba) + 220 3540 : return result; + 221 6436 : return result.argmax(1); + 222 2333340 : } 223 : // Return mxn tensor of probabilities - 224 304 : torch::Tensor Network::predict_proba(const torch::Tensor& samples) + 224 3540 : torch::Tensor Network::predict_proba(const torch::Tensor& samples) 225 : { - 226 304 : return predict_tensor(samples, true); + 226 3540 : return predict_tensor(samples, true); 227 : } 228 : 229 : // Return mxn tensor of probabilities - 230 245 : torch::Tensor Network::predict(const torch::Tensor& samples) + 230 3262 : torch::Tensor Network::predict(const torch::Tensor& samples) 231 : { - 232 245 : return predict_tensor(samples, false); + 232 3262 : return predict_tensor(samples, false); 233 : } 234 : 235 : // Return mx1 std::vector of predictions 236 : // tsamples is nxm std::vector of samples - 237 12 : std::vector<int> Network::predict(const std::vector<std::vector<int>>& tsamples) + 237 132 : std::vector<int> Network::predict(const std::vector<std::vector<int>>& tsamples) 238 : { - 239 12 : if (!fitted) { - 240 4 : throw std::logic_error("You must call fit() before calling predict()"); + 239 132 : if (!fitted) { + 240 44 : throw std::logic_error("You must call fit() before calling predict()"); 241 : } - 242 8 : std::vector<int> predictions; - 243 8 : std::vector<int> sample; - 244 891 : for (int row = 0; row < tsamples[0].size(); ++row) { - 245 885 : sample.clear(); - 246 6563 : for (int col = 0; col < tsamples.size(); ++col) { - 247 5678 : sample.push_back(tsamples[col][row]); + 242 88 : std::vector<int> predictions; + 243 88 : std::vector<int> sample; + 244 9801 : for (int row = 0; row < tsamples[0].size(); ++row) { + 245 9735 : sample.clear(); + 246 72193 : for (int col = 0; col < tsamples.size(); ++col) { + 247 62458 : sample.push_back(tsamples[col][row]); 248 : } - 249 885 : std::vector<double> classProbabilities = predict_sample(sample); + 249 9735 : std::vector<double> classProbabilities = predict_sample(sample); 250 : // Find the class with the maximum posterior probability - 251 883 : auto maxElem = max_element(classProbabilities.begin(), classProbabilities.end()); - 252 883 : int predictedClass = distance(classProbabilities.begin(), maxElem); - 253 883 : predictions.push_back(predictedClass); - 254 883 : } - 255 12 : return predictions; - 256 10 : } + 251 9713 : auto maxElem = max_element(classProbabilities.begin(), classProbabilities.end()); + 252 9713 : int predictedClass = distance(classProbabilities.begin(), maxElem); + 253 9713 : predictions.push_back(predictedClass); + 254 9713 : } + 255 132 : return predictions; + 256 110 : } 257 : // Return mxn std::vector of probabilities 258 : // tsamples is nxm std::vector of samples - 259 68 : std::vector<std::vector<double>> Network::predict_proba(const std::vector<std::vector<int>>& tsamples) + 259 777 : std::vector<std::vector<double>> Network::predict_proba(const std::vector<std::vector<int>>& tsamples) 260 : { - 261 68 : if (!fitted) { - 262 2 : throw std::logic_error("You must call fit() before calling predict_proba()"); + 261 777 : if (!fitted) { + 262 22 : throw std::logic_error("You must call fit() before calling predict_proba()"); 263 : } - 264 66 : std::vector<std::vector<double>> predictions; - 265 66 : std::vector<int> sample; - 266 12787 : for (int row = 0; row < tsamples[0].size(); ++row) { - 267 12721 : sample.clear(); - 268 193587 : for (int col = 0; col < tsamples.size(); ++col) { - 269 180866 : sample.push_back(tsamples[col][row]); + 264 755 : std::vector<std::vector<double>> predictions; + 265 755 : std::vector<int> sample; + 266 146506 : for (int row = 0; row < tsamples[0].size(); ++row) { + 267 145751 : sample.clear(); + 268 1941951 : for (int col = 0; col < tsamples.size(); ++col) { + 269 1796200 : sample.push_back(tsamples[col][row]); 270 : } - 271 12721 : predictions.push_back(predict_sample(sample)); + 271 145751 : predictions.push_back(predict_sample(sample)); 272 : } - 273 132 : return predictions; - 274 66 : } - 275 5 : double Network::score(const std::vector<std::vector<int>>& tsamples, const std::vector<int>& labels) + 273 1510 : return predictions; + 274 755 : } + 275 55 : double Network::score(const std::vector<std::vector<int>>& tsamples, const std::vector<int>& labels) 276 : { - 277 5 : std::vector<int> y_pred = predict(tsamples); - 278 3 : int correct = 0; - 279 581 : for (int i = 0; i < y_pred.size(); ++i) { - 280 578 : if (y_pred[i] == labels[i]) { - 281 486 : correct++; + 277 55 : std::vector<int> y_pred = predict(tsamples); + 278 33 : int correct = 0; + 279 6391 : for (int i = 0; i < y_pred.size(); ++i) { + 280 6358 : if (y_pred[i] == labels[i]) { + 281 5346 : correct++; 282 : } 283 : } - 284 6 : return (double)correct / y_pred.size(); - 285 3 : } + 284 66 : return (double)correct / y_pred.size(); + 285 33 : } 286 : // Return 1xn std::vector of probabilities - 287 13606 : std::vector<double> Network::predict_sample(const std::vector<int>& sample) + 287 155486 : std::vector<double> Network::predict_sample(const std::vector<int>& sample) 288 : { 289 : // Ensure the sample size is equal to the number of features - 290 13606 : if (sample.size() != features.size() - 1) { - 291 4 : throw std::invalid_argument("Sample size (" + std::to_string(sample.size()) + - 292 6 : ") does not match the number of features (" + std::to_string(features.size() - 1) + ")"); + 290 155486 : if (sample.size() != features.size() - 1) { + 291 44 : throw std::invalid_argument("Sample size (" + std::to_string(sample.size()) + + 292 66 : ") does not match the number of features (" + std::to_string(features.size() - 1) + ")"); 293 : } - 294 13604 : std::map<std::string, int> evidence; - 295 200142 : for (int i = 0; i < sample.size(); ++i) { - 296 186538 : evidence[features[i]] = sample[i]; + 294 155464 : std::map<std::string, int> evidence; + 295 2014056 : for (int i = 0; i < sample.size(); ++i) { + 296 1858592 : evidence[features[i]] = sample[i]; 297 : } - 298 27208 : return exactInference(evidence); - 299 13604 : } + 298 310928 : return exactInference(evidence); + 299 155464 : } 300 : // Return 1xn std::vector of probabilities - 301 95840 : std::vector<double> Network::predict_sample(const torch::Tensor& sample) + 301 1163291 : std::vector<double> Network::predict_sample(const torch::Tensor& sample) 302 : { 303 : // Ensure the sample size is equal to the number of features - 304 95840 : if (sample.size(0) != features.size() - 1) { - 305 4 : throw std::invalid_argument("Sample size (" + std::to_string(sample.size(0)) + - 306 6 : ") does not match the number of features (" + std::to_string(features.size() - 1) + ")"); + 304 1163291 : if (sample.size(0) != features.size() - 1) { + 305 44 : throw std::invalid_argument("Sample size (" + std::to_string(sample.size(0)) + + 306 66 : ") does not match the number of features (" + std::to_string(features.size() - 1) + ")"); 307 : } - 308 95838 : std::map<std::string, int> evidence; - 309 2448008 : for (int i = 0; i < sample.size(0); ++i) { - 310 2352170 : evidence[features[i]] = sample[i].item<int>(); + 308 1163269 : std::map<std::string, int> evidence; + 309 30202277 : for (int i = 0; i < sample.size(0); ++i) { + 310 29039008 : evidence[features[i]] = sample[i].item<int>(); 311 : } - 312 191676 : return exactInference(evidence); - 313 95838 : } - 314 437768 : double Network::computeFactor(std::map<std::string, int>& completeEvidence) + 312 2326538 : return exactInference(evidence); + 313 1163269 : } + 314 5150558 : double Network::computeFactor(std::map<std::string, int>& completeEvidence) 315 : { - 316 437768 : double result = 1.0; - 317 6084992 : for (auto& node : getNodes()) { - 318 5647224 : result *= node.second->getFactorValue(completeEvidence); + 316 5150558 : double result = 1.0; + 317 72453396 : for (auto& node : getNodes()) { + 318 67302838 : result *= node.second->getFactorValue(completeEvidence); 319 : } - 320 437768 : return result; + 320 5150558 : return result; 321 : } - 322 109442 : std::vector<double> Network::exactInference(std::map<std::string, int>& evidence) + 322 1318733 : std::vector<double> Network::exactInference(std::map<std::string, int>& evidence) 323 : { - 324 109442 : std::vector<double> result(classNumStates, 0.0); - 325 109442 : std::vector<std::thread> threads; - 326 109442 : std::mutex mtx; - 327 547210 : for (int i = 0; i < classNumStates; ++i) { - 328 437768 : threads.emplace_back([this, &result, &evidence, i, &mtx]() { - 329 437768 : auto completeEvidence = std::map<std::string, int>(evidence); - 330 437768 : completeEvidence[getClassName()] = i; - 331 437768 : double factor = computeFactor(completeEvidence); - 332 437768 : std::lock_guard<std::mutex> lock(mtx); - 333 437768 : result[i] = factor; - 334 437768 : }); + 324 1318733 : std::vector<double> result(classNumStates, 0.0); + 325 1318733 : std::vector<std::thread> threads; + 326 1318733 : std::mutex mtx; + 327 6469291 : for (int i = 0; i < classNumStates; ++i) { + 328 5150558 : threads.emplace_back([this, &result, &evidence, i, &mtx]() { + 329 5150558 : auto completeEvidence = std::map<std::string, int>(evidence); + 330 5150558 : completeEvidence[getClassName()] = i; + 331 5150558 : double factor = computeFactor(completeEvidence); + 332 5150558 : std::lock_guard<std::mutex> lock(mtx); + 333 5150558 : result[i] = factor; + 334 5150558 : }); 335 : } - 336 547210 : for (auto& thread : threads) { - 337 437768 : thread.join(); + 336 6469291 : for (auto& thread : threads) { + 337 5150558 : thread.join(); 338 : } 339 : // Normalize result - 340 109442 : double sum = accumulate(result.begin(), result.end(), 0.0); - 341 547210 : transform(result.begin(), result.end(), result.begin(), [sum](const double& value) { return value / sum; }); - 342 218884 : return result; - 343 109442 : } - 344 7 : std::vector<std::string> Network::show() const + 340 1318733 : double sum = accumulate(result.begin(), result.end(), 0.0); + 341 6469291 : transform(result.begin(), result.end(), result.begin(), [sum](const double& value) { return value / sum; }); + 342 2637466 : return result; + 343 1318733 : } + 344 77 : std::vector<std::string> Network::show() const 345 : { - 346 7 : std::vector<std::string> result; + 346 77 : std::vector<std::string> result; 347 : // Draw the network - 348 40 : for (auto& node : nodes) { - 349 33 : std::string line = node.first + " -> "; - 350 77 : for (auto child : node.second->getChildren()) { - 351 44 : line += child->getName() + ", "; + 348 440 : for (auto& node : nodes) { + 349 363 : std::string line = node.first + " -> "; + 350 847 : for (auto child : node.second->getChildren()) { + 351 484 : line += child->getName() + ", "; 352 : } - 353 33 : result.push_back(line); - 354 33 : } - 355 7 : return result; + 353 363 : result.push_back(line); + 354 363 : } + 355 77 : return result; 356 0 : } - 357 22 : std::vector<std::string> Network::graph(const std::string& title) const + 357 242 : std::vector<std::string> Network::graph(const std::string& title) const 358 : { - 359 22 : auto output = std::vector<std::string>(); - 360 22 : auto prefix = "digraph BayesNet {\nlabel=<BayesNet "; - 361 22 : auto suffix = ">\nfontsize=30\nfontcolor=blue\nlabelloc=t\nlayout=circo\n"; - 362 22 : std::string header = prefix + title + suffix; - 363 22 : output.push_back(header); - 364 175 : for (auto& node : nodes) { - 365 153 : auto result = node.second->graph(className); - 366 153 : output.insert(output.end(), result.begin(), result.end()); - 367 153 : } - 368 22 : output.push_back("}\n"); - 369 44 : return output; - 370 22 : } - 371 59 : std::vector<std::pair<std::string, std::string>> Network::getEdges() const + 359 242 : auto output = std::vector<std::string>(); + 360 242 : auto prefix = "digraph BayesNet {\nlabel=<BayesNet "; + 361 242 : auto suffix = ">\nfontsize=30\nfontcolor=blue\nlabelloc=t\nlayout=circo\n"; + 362 242 : std::string header = prefix + title + suffix; + 363 242 : output.push_back(header); + 364 1925 : for (auto& node : nodes) { + 365 1683 : auto result = node.second->graph(className); + 366 1683 : output.insert(output.end(), result.begin(), result.end()); + 367 1683 : } + 368 242 : output.push_back("}\n"); + 369 484 : return output; + 370 242 : } + 371 684 : std::vector<std::pair<std::string, std::string>> Network::getEdges() const 372 : { - 373 59 : auto edges = std::vector<std::pair<std::string, std::string>>(); - 374 937 : for (const auto& node : nodes) { - 375 878 : auto head = node.first; - 376 2456 : for (const auto& child : node.second->getChildren()) { - 377 1578 : auto tail = child->getName(); - 378 1578 : edges.push_back({ head, tail }); - 379 1578 : } - 380 878 : } - 381 59 : return edges; + 373 684 : auto edges = std::vector<std::pair<std::string, std::string>>(); + 374 10684 : for (const auto& node : nodes) { + 375 10000 : auto head = node.first; + 376 27937 : for (const auto& child : node.second->getChildren()) { + 377 17937 : auto tail = child->getName(); + 378 17937 : edges.push_back({ head, tail }); + 379 17937 : } + 380 10000 : } + 381 684 : return edges; 382 0 : } - 383 48 : int Network::getNumEdges() const + 383 563 : int Network::getNumEdges() const 384 : { - 385 48 : return getEdges().size(); + 385 563 : return getEdges().size(); 386 : } - 387 55 : std::vector<std::string> Network::topological_sort() + 387 605 : std::vector<std::string> Network::topological_sort() 388 : { 389 : /* Check if al the fathers of every node are before the node */ - 390 55 : auto result = features; - 391 55 : result.erase(remove(result.begin(), result.end(), className), result.end()); - 392 55 : bool ending{ false }; - 393 157 : while (!ending) { - 394 102 : ending = true; - 395 951 : for (auto feature : features) { - 396 849 : auto fathers = nodes[feature]->getParents(); - 397 2250 : for (const auto& father : fathers) { - 398 1401 : auto fatherName = father->getName(); - 399 1401 : if (fatherName == className) { - 400 745 : continue; + 390 605 : auto result = features; + 391 605 : result.erase(remove(result.begin(), result.end(), className), result.end()); + 392 605 : bool ending{ false }; + 393 1727 : while (!ending) { + 394 1122 : ending = true; + 395 10461 : for (auto feature : features) { + 396 9339 : auto fathers = nodes[feature]->getParents(); + 397 24750 : for (const auto& father : fathers) { + 398 15411 : auto fatherName = father->getName(); + 399 15411 : if (fatherName == className) { + 400 8195 : continue; 401 : } 402 : // Check if father is placed before the actual feature - 403 656 : auto it = find(result.begin(), result.end(), fatherName); - 404 656 : if (it != result.end()) { - 405 656 : auto it2 = find(result.begin(), result.end(), feature); - 406 656 : if (it2 != result.end()) { - 407 656 : if (distance(it, it2) < 0) { + 403 7216 : auto it = find(result.begin(), result.end(), fatherName); + 404 7216 : if (it != result.end()) { + 405 7216 : auto it2 = find(result.begin(), result.end(), feature); + 406 7216 : if (it2 != result.end()) { + 407 7216 : if (distance(it, it2) < 0) { 408 : // if it is not, insert it before the feature - 409 61 : result.erase(remove(result.begin(), result.end(), fatherName), result.end()); - 410 61 : result.insert(it2, fatherName); - 411 61 : ending = false; + 409 671 : result.erase(remove(result.begin(), result.end(), fatherName), result.end()); + 410 671 : result.insert(it2, fatherName); + 411 671 : ending = false; 412 : } 413 : } else { 414 0 : throw std::logic_error("Error in topological sort because of node " + feature + " is not in result"); @@ -478,20 +478,20 @@ 416 : } else { 417 0 : throw std::logic_error("Error in topological sort because of node father " + fatherName + " is not in result"); 418 : } - 419 1401 : } - 420 849 : } + 419 15411 : } + 420 9339 : } 421 : } - 422 55 : return result; + 422 605 : return result; 423 0 : } - 424 2 : std::string Network::dump_cpt() const + 424 22 : std::string Network::dump_cpt() const 425 : { - 426 2 : std::stringstream oss; - 427 12 : for (auto& node : nodes) { - 428 10 : oss << "* " << node.first << ": (" << node.second->getNumStates() << ") : " << node.second->getCPT().sizes() << std::endl; - 429 10 : oss << node.second->getCPT() << std::endl; + 426 22 : std::stringstream oss; + 427 132 : for (auto& node : nodes) { + 428 110 : oss << "* " << node.first << ": (" << node.second->getNumStates() << ") : " << node.second->getCPT().sizes() << std::endl; + 429 110 : oss << node.second->getCPT() << std::endl; 430 : } - 431 4 : return oss.str(); - 432 2 : } + 431 44 : return oss.str(); + 432 22 : } 433 : } diff --git a/html/bayesnet/network/Network.h.func-c.html b/html/bayesnet/network/Network.h.func-c.html index 75c26d7..a57e74c 100644 --- a/html/bayesnet/network/Network.h.func-c.html +++ b/html/bayesnet/network/Network.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet7NetworkD2Ev - 711 + 647 diff --git a/html/bayesnet/network/Network.h.func.html b/html/bayesnet/network/Network.h.func.html index 8f64703..e3c03dc 100644 --- a/html/bayesnet/network/Network.h.func.html +++ b/html/bayesnet/network/Network.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet7NetworkD2Ev - 711 + 647 diff --git a/html/bayesnet/network/Network.h.gcov.html b/html/bayesnet/network/Network.h.gcov.html index 5adf6f6..b86b4d1 100644 --- a/html/bayesnet/network/Network.h.gcov.html +++ b/html/bayesnet/network/Network.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -79,7 +79,7 @@ 17 : Network(); 18 : explicit Network(float); 19 : explicit Network(const Network&); - 20 711 : ~Network() = default; + 20 647 : ~Network() = default; 21 : torch::Tensor& getSamples(); 22 : float getMaxThreads() const; 23 : void addNode(const std::string&); diff --git a/html/bayesnet/network/Node.cc.func-c.html b/html/bayesnet/network/Node.cc.func-c.html index b16ae9d..19dfb00 100644 --- a/html/bayesnet/network/Node.cc.func-c.html +++ b/html/bayesnet/network/Node.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,140 +65,140 @@ _ZN8bayesnet4Node5clearEv - 1 + 11 _ZN8bayesnet4Node11removeChildEPS0_ - 3 + 33 _ZN8bayesnet4Node12removeParentEPS0_ - 3 + 33 _ZN8bayesnet4Node12combinationsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE - 5 + 55 _ZN8bayesnet4Node7minFillEv - 5 + 55 _ZN8bayesnet4Node6getCPTEv - 105 + 1155 _ZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 153 + 1683 _ZZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlRKT_E_clIPS0_EEDaSB_ - 241 + 2651 _ZN8bayesnet4Node10getParentsEv - 1268 + 13948 _ZN8bayesnet4NodeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 8887 + 116977 _ZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ - 9288 + 121388 _ZN8bayesnet4Node12setNumStatesEi - 9288 + 121388 _ZN8bayesnet4Node9addParentEPS0_ - 16951 + 224331 _ZN8bayesnet4Node8addChildEPS0_ - 16953 + 224353 _ZZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ENKUlRKT_E_clIPS0_EEDaSI_ - 17649 + 232009 _ZNK8bayesnet4Node12getNumStatesEv - 18032 + 236412 _ZN8bayesnet4Node11getChildrenEv - 23263 + 306501 _ZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 5647224 + 67302838 _ZZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKT_E_clIPS0_EEDaSI_ - 9977196 + 119110574 _ZNK8bayesnet4Node7getNameB5cxx11Ev - 13264685 + 159096442 diff --git a/html/bayesnet/network/Node.cc.func.html b/html/bayesnet/network/Node.cc.func.html index 082f906..3e8081b 100644 --- a/html/bayesnet/network/Node.cc.func.html +++ b/html/bayesnet/network/Node.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,140 +65,140 @@ _ZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ - 9288 + 121388 _ZN8bayesnet4Node10getParentsEv - 1268 + 13948 _ZN8bayesnet4Node11getChildrenEv - 23263 + 306501 _ZN8bayesnet4Node11removeChildEPS0_ - 3 + 33 _ZN8bayesnet4Node12combinationsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE - 5 + 55 _ZN8bayesnet4Node12removeParentEPS0_ - 3 + 33 _ZN8bayesnet4Node12setNumStatesEi - 9288 + 121388 _ZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE - 5647224 + 67302838 _ZN8bayesnet4Node5clearEv - 1 + 11 _ZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 153 + 1683 _ZN8bayesnet4Node6getCPTEv - 105 + 1155 _ZN8bayesnet4Node7minFillEv - 5 + 55 _ZN8bayesnet4Node8addChildEPS0_ - 16953 + 224353 _ZN8bayesnet4Node9addParentEPS0_ - 16951 + 224331 _ZN8bayesnet4NodeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - 8887 + 116977 _ZNK8bayesnet4Node12getNumStatesEv - 18032 + 236412 _ZNK8bayesnet4Node7getNameB5cxx11Ev - 13264685 + 159096442 _ZZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ENKUlRKT_E_clIPS0_EEDaSI_ - 17649 + 232009 _ZZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKT_E_clIPS0_EEDaSI_ - 9977196 + 119110574 _ZZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlRKT_E_clIPS0_EEDaSB_ - 241 + 2651 diff --git a/html/bayesnet/network/Node.cc.gcov.html b/html/bayesnet/network/Node.cc.gcov.html index 2146c2a..6374f33 100644 --- a/html/bayesnet/network/Node.cc.gcov.html +++ b/html/bayesnet/network/Node.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,57 +70,57 @@ 8 : 9 : namespace bayesnet { 10 : - 11 8887 : Node::Node(const std::string& name) - 12 8887 : : name(name), numStates(0), cpTable(torch::Tensor()), parents(std::vector<Node*>()), children(std::vector<Node*>()) + 11 116977 : Node::Node(const std::string& name) + 12 116977 : : name(name), numStates(0), cpTable(torch::Tensor()), parents(std::vector<Node*>()), children(std::vector<Node*>()) 13 : { - 14 8887 : } - 15 1 : void Node::clear() + 14 116977 : } + 15 11 : void Node::clear() 16 : { - 17 1 : parents.clear(); - 18 1 : children.clear(); - 19 1 : cpTable = torch::Tensor(); - 20 1 : dimensions.clear(); - 21 1 : numStates = 0; - 22 1 : } - 23 13264685 : std::string Node::getName() const + 17 11 : parents.clear(); + 18 11 : children.clear(); + 19 11 : cpTable = torch::Tensor(); + 20 11 : dimensions.clear(); + 21 11 : numStates = 0; + 22 11 : } + 23 159096442 : std::string Node::getName() const 24 : { - 25 13264685 : return name; + 25 159096442 : return name; 26 : } - 27 16951 : void Node::addParent(Node* parent) + 27 224331 : void Node::addParent(Node* parent) 28 : { - 29 16951 : parents.push_back(parent); - 30 16951 : } - 31 3 : void Node::removeParent(Node* parent) + 29 224331 : parents.push_back(parent); + 30 224331 : } + 31 33 : void Node::removeParent(Node* parent) 32 : { - 33 3 : parents.erase(std::remove(parents.begin(), parents.end(), parent), parents.end()); - 34 3 : } - 35 3 : void Node::removeChild(Node* child) + 33 33 : parents.erase(std::remove(parents.begin(), parents.end(), parent), parents.end()); + 34 33 : } + 35 33 : void Node::removeChild(Node* child) 36 : { - 37 3 : children.erase(std::remove(children.begin(), children.end(), child), children.end()); - 38 3 : } - 39 16953 : void Node::addChild(Node* child) + 37 33 : children.erase(std::remove(children.begin(), children.end(), child), children.end()); + 38 33 : } + 39 224353 : void Node::addChild(Node* child) 40 : { - 41 16953 : children.push_back(child); - 42 16953 : } - 43 1268 : std::vector<Node*>& Node::getParents() + 41 224353 : children.push_back(child); + 42 224353 : } + 43 13948 : std::vector<Node*>& Node::getParents() 44 : { - 45 1268 : return parents; + 45 13948 : return parents; 46 : } - 47 23263 : std::vector<Node*>& Node::getChildren() + 47 306501 : std::vector<Node*>& Node::getChildren() 48 : { - 49 23263 : return children; + 49 306501 : return children; 50 : } - 51 18032 : int Node::getNumStates() const + 51 236412 : int Node::getNumStates() const 52 : { - 53 18032 : return numStates; + 53 236412 : return numStates; 54 : } - 55 9288 : void Node::setNumStates(int numStates) + 55 121388 : void Node::setNumStates(int numStates) 56 : { - 57 9288 : this->numStates = numStates; - 58 9288 : } - 59 105 : torch::Tensor& Node::getCPT() + 57 121388 : this->numStates = numStates; + 58 121388 : } + 59 1155 : torch::Tensor& Node::getCPT() 60 : { - 61 105 : return cpTable; + 61 1155 : return cpTable; 62 : } 63 : /* 64 : The MinFill criterion is a heuristic for variable elimination. @@ -129,76 +129,76 @@ 67 : The variable with the minimum number of edges is chosen. 68 : Here this is done computing the length of the combinations of the node neighbors taken 2 by 2. 69 : */ - 70 5 : unsigned Node::minFill() + 70 55 : unsigned Node::minFill() 71 : { - 72 5 : std::unordered_set<std::string> neighbors; - 73 13 : for (auto child : children) { - 74 8 : neighbors.emplace(child->getName()); + 72 55 : std::unordered_set<std::string> neighbors; + 73 143 : for (auto child : children) { + 74 88 : neighbors.emplace(child->getName()); 75 : } - 76 12 : for (auto parent : parents) { - 77 7 : neighbors.emplace(parent->getName()); + 76 132 : for (auto parent : parents) { + 77 77 : neighbors.emplace(parent->getName()); 78 : } - 79 5 : auto source = std::vector<std::string>(neighbors.begin(), neighbors.end()); - 80 10 : return combinations(source).size(); - 81 5 : } - 82 5 : std::vector<std::pair<std::string, std::string>> Node::combinations(const std::vector<std::string>& source) + 79 55 : auto source = std::vector<std::string>(neighbors.begin(), neighbors.end()); + 80 110 : return combinations(source).size(); + 81 55 : } + 82 55 : std::vector<std::pair<std::string, std::string>> Node::combinations(const std::vector<std::string>& source) 83 : { - 84 5 : std::vector<std::pair<std::string, std::string>> result; - 85 20 : for (int i = 0; i < source.size(); ++i) { - 86 15 : std::string temp = source[i]; - 87 31 : for (int j = i + 1; j < source.size(); ++j) { - 88 16 : result.push_back({ temp, source[j] }); + 84 55 : std::vector<std::pair<std::string, std::string>> result; + 85 220 : for (int i = 0; i < source.size(); ++i) { + 86 165 : std::string temp = source[i]; + 87 341 : for (int j = i + 1; j < source.size(); ++j) { + 88 176 : result.push_back({ temp, source[j] }); 89 : } - 90 15 : } - 91 5 : return result; + 90 165 : } + 91 55 : return result; 92 0 : } - 93 9288 : void Node::computeCPT(const torch::Tensor& dataset, const std::vector<std::string>& features, const double laplaceSmoothing, const torch::Tensor& weights) + 93 121388 : void Node::computeCPT(const torch::Tensor& dataset, const std::vector<std::string>& features, const double laplaceSmoothing, const torch::Tensor& weights) 94 : { - 95 9288 : dimensions.clear(); + 95 121388 : dimensions.clear(); 96 : // Get dimensions of the CPT - 97 9288 : dimensions.push_back(numStates); - 98 26937 : transform(parents.begin(), parents.end(), back_inserter(dimensions), [](const auto& parent) { return parent->getNumStates(); }); + 97 121388 : dimensions.push_back(numStates); + 98 353397 : transform(parents.begin(), parents.end(), back_inserter(dimensions), [](const auto& parent) { return parent->getNumStates(); }); 99 : 100 : // Create a tensor of zeros with the dimensions of the CPT - 101 9288 : cpTable = torch::zeros(dimensions, torch::kFloat) + laplaceSmoothing; + 101 121388 : cpTable = torch::zeros(dimensions, torch::kFloat) + laplaceSmoothing; 102 : // Fill table with counts - 103 9288 : auto pos = find(features.begin(), features.end(), name); - 104 9288 : if (pos == features.end()) { + 103 121388 : auto pos = find(features.begin(), features.end(), name); + 104 121388 : if (pos == features.end()) { 105 0 : throw std::logic_error("Feature " + name + " not found in dataset"); 106 : } - 107 9288 : int name_index = pos - features.begin(); - 108 1756738 : for (int n_sample = 0; n_sample < dataset.size(1); ++n_sample) { - 109 1747450 : c10::List<c10::optional<at::Tensor>> coordinates; - 110 5242350 : coordinates.push_back(dataset.index({ name_index, n_sample })); - 111 4997840 : for (auto parent : parents) { - 112 3250390 : pos = find(features.begin(), features.end(), parent->getName()); - 113 3250390 : if (pos == features.end()) { + 107 121388 : int name_index = pos - features.begin(); + 108 21284350 : for (int n_sample = 0; n_sample < dataset.size(1); ++n_sample) { + 109 21162962 : c10::List<c10::optional<at::Tensor>> coordinates; + 110 63488886 : coordinates.push_back(dataset.index({ name_index, n_sample })); + 111 60665104 : for (auto parent : parents) { + 112 39502142 : pos = find(features.begin(), features.end(), parent->getName()); + 113 39502142 : if (pos == features.end()) { 114 0 : throw std::logic_error("Feature parent " + parent->getName() + " not found in dataset"); 115 : } - 116 3250390 : int parent_index = pos - features.begin(); - 117 9751170 : coordinates.push_back(dataset.index({ parent_index, n_sample })); + 116 39502142 : int parent_index = pos - features.begin(); + 117 118506426 : coordinates.push_back(dataset.index({ parent_index, n_sample })); 118 : } 119 : // Increment the count of the corresponding coordinate - 120 3494900 : cpTable.index_put_({ coordinates }, cpTable.index({ coordinates }) + weights.index({ n_sample }).item<double>()); - 121 1747450 : } + 120 42325924 : cpTable.index_put_({ coordinates }, cpTable.index({ coordinates }) + weights.index({ n_sample }).item<double>()); + 121 21162962 : } 122 : // Normalize the counts - 123 9288 : cpTable = cpTable / cpTable.sum(0); - 124 6754578 : } - 125 5647224 : float Node::getFactorValue(std::map<std::string, int>& evidence) + 123 121388 : cpTable = cpTable / cpTable.sum(0); + 124 81949454 : } + 125 67302838 : float Node::getFactorValue(std::map<std::string, int>& evidence) 126 : { - 127 5647224 : c10::List<c10::optional<at::Tensor>> coordinates; + 127 67302838 : c10::List<c10::optional<at::Tensor>> coordinates; 128 : // following predetermined order of indices in the cpTable (see Node.h) - 129 5647224 : coordinates.push_back(at::tensor(evidence[name])); - 130 15624420 : transform(parents.begin(), parents.end(), std::back_inserter(coordinates), [&evidence](const auto& parent) { return at::tensor(evidence[parent->getName()]); }); - 131 11294448 : return cpTable.index({ coordinates }).item<float>(); - 132 5647224 : } - 133 153 : std::vector<std::string> Node::graph(const std::string& className) + 129 67302838 : coordinates.push_back(at::tensor(evidence[name])); + 130 186413412 : transform(parents.begin(), parents.end(), std::back_inserter(coordinates), [&evidence](const auto& parent) { return at::tensor(evidence[parent->getName()]); }); + 131 134605676 : return cpTable.index({ coordinates }).item<float>(); + 132 67302838 : } + 133 1683 : std::vector<std::string> Node::graph(const std::string& className) 134 : { - 135 153 : auto output = std::vector<std::string>(); - 136 153 : auto suffix = name == className ? ", fontcolor=red, fillcolor=lightblue, style=filled " : ""; - 137 153 : output.push_back(name + " [shape=circle" + suffix + "] \n"); - 138 394 : transform(children.begin(), children.end(), back_inserter(output), [this](const auto& child) { return name + " -> " + child->getName(); }); - 139 153 : return output; + 135 1683 : auto output = std::vector<std::string>(); + 136 1683 : auto suffix = name == className ? ", fontcolor=red, fillcolor=lightblue, style=filled " : ""; + 137 1683 : output.push_back(name + " [shape=circle" + suffix + "] \n"); + 138 4334 : transform(children.begin(), children.end(), back_inserter(output), [this](const auto& child) { return name + " -> " + child->getName(); }); + 139 1683 : return output; 140 0 : } 141 : } diff --git a/html/bayesnet/network/index-sort-f.html b/html/bayesnet/network/index-sort-f.html index 2d61d45..1868e33 100644 --- a/html/bayesnet/network/index-sort-f.html +++ b/html/bayesnet/network/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/network/index-sort-l.html b/html/bayesnet/network/index-sort-l.html index 6ea7de2..a3532df 100644 --- a/html/bayesnet/network/index-sort-l.html +++ b/html/bayesnet/network/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/network/index.html b/html/bayesnet/network/index.html index c03a06e..55e9199 100644 --- a/html/bayesnet/network/index.html +++ b/html/bayesnet/network/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % diff --git a/html/bayesnet/utils/BayesMetrics.cc.func-c.html b/html/bayesnet/utils/BayesMetrics.cc.func-c.html index 655ef7b..e02589e 100644 --- a/html/bayesnet/utils/BayesMetrics.cc.func-c.html +++ b/html/bayesnet/utils/BayesMetrics.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 91.7 % @@ -72,77 +72,77 @@ _ZNK8bayesnet7Metrics14getScoresKBestEv - 8 + 88 _ZN8bayesnet7MetricsC2ERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISF_EERKSF_i - 16 + 176 _ZN8bayesnet7Metrics19maximumSpanningTreeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKN2at6TensorEi - 29 + 319 _ZN8bayesnet7Metrics15conditionalEdgeERKN2at6TensorE - 34 + 374 _ZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbj - 90 + 1099 _ZN8bayesnet7MetricsC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_i - 338 + 3957 _ZZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbjENKUliiE_clEii - 453 + 5931 _ZN8bayesnet7Metrics17mutualInformationERKN2at6TensorES4_S4_ - 7684 + 91263 _ZN8bayesnet7Metrics18conditionalEntropyERKN2at6TensorES4_S4_ - 7684 + 91263 _ZN8bayesnet7Metrics7entropyERKN2at6TensorES4_ - 8506 + 101565 _ZZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbjENKUliiE0_clEii - 12619 + 168709 diff --git a/html/bayesnet/utils/BayesMetrics.cc.func.html b/html/bayesnet/utils/BayesMetrics.cc.func.html index 82fcc97..2883106 100644 --- a/html/bayesnet/utils/BayesMetrics.cc.func.html +++ b/html/bayesnet/utils/BayesMetrics.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 91.7 % @@ -65,35 +65,35 @@ _ZN8bayesnet7Metrics15conditionalEdgeERKN2at6TensorE - 34 + 374 _ZN8bayesnet7Metrics17mutualInformationERKN2at6TensorES4_S4_ - 7684 + 91263 _ZN8bayesnet7Metrics18conditionalEntropyERKN2at6TensorES4_S4_ - 7684 + 91263 _ZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbj - 90 + 1099 _ZN8bayesnet7Metrics19maximumSpanningTreeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKN2at6TensorEi - 29 + 319 @@ -107,42 +107,42 @@ _ZN8bayesnet7Metrics7entropyERKN2at6TensorES4_ - 8506 + 101565 _ZN8bayesnet7MetricsC2ERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_i - 338 + 3957 _ZN8bayesnet7MetricsC2ERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISF_EERKSF_i - 16 + 176 _ZNK8bayesnet7Metrics14getScoresKBestEv - 8 + 88 _ZZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbjENKUliiE0_clEii - 12619 + 168709 _ZZN8bayesnet7Metrics19SelectKBestWeightedERKN2at6TensorEbjENKUliiE_clEii - 453 + 5931 diff --git a/html/bayesnet/utils/BayesMetrics.cc.gcov.html b/html/bayesnet/utils/BayesMetrics.cc.gcov.html index 44cbc62..d6b2ebe 100644 --- a/html/bayesnet/utils/BayesMetrics.cc.gcov.html +++ b/html/bayesnet/utils/BayesMetrics.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 91.7 % @@ -70,103 +70,103 @@ 8 : #include "BayesMetrics.h" 9 : namespace bayesnet { 10 : //samples is n+1xm tensor used to fit the model - 11 338 : Metrics::Metrics(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int classNumStates) - 12 338 : : samples(samples) - 13 338 : , features(features) - 14 338 : , className(className) - 15 338 : , classNumStates(classNumStates) + 11 3957 : Metrics::Metrics(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int classNumStates) + 12 3957 : : samples(samples) + 13 3957 : , features(features) + 14 3957 : , className(className) + 15 3957 : , classNumStates(classNumStates) 16 : { - 17 338 : } + 17 3957 : } 18 : //samples is n+1xm std::vector used to fit the model - 19 16 : Metrics::Metrics(const std::vector<std::vector<int>>& vsamples, const std::vector<int>& labels, const std::vector<std::string>& features, const std::string& className, const int classNumStates) - 20 16 : : features(features) - 21 16 : , className(className) - 22 16 : , classNumStates(classNumStates) - 23 32 : , samples(torch::zeros({ static_cast<int>(vsamples.size() + 1), static_cast<int>(vsamples[0].size()) }, torch::kInt32)) + 19 176 : Metrics::Metrics(const std::vector<std::vector<int>>& vsamples, const std::vector<int>& labels, const std::vector<std::string>& features, const std::string& className, const int classNumStates) + 20 176 : : features(features) + 21 176 : , className(className) + 22 176 : , classNumStates(classNumStates) + 23 352 : , samples(torch::zeros({ static_cast<int>(vsamples.size() + 1), static_cast<int>(vsamples[0].size()) }, torch::kInt32)) 24 : { - 25 128 : for (int i = 0; i < vsamples.size(); ++i) { - 26 448 : samples.index_put_({ i, "..." }, torch::tensor(vsamples[i], torch::kInt32)); + 25 1408 : for (int i = 0; i < vsamples.size(); ++i) { + 26 4928 : samples.index_put_({ i, "..." }, torch::tensor(vsamples[i], torch::kInt32)); 27 : } - 28 64 : samples.index_put_({ -1, "..." }, torch::tensor(labels, torch::kInt32)); - 29 144 : } - 30 90 : std::vector<int> Metrics::SelectKBestWeighted(const torch::Tensor& weights, bool ascending, unsigned k) + 28 704 : samples.index_put_({ -1, "..." }, torch::tensor(labels, torch::kInt32)); + 29 1584 : } + 30 1099 : std::vector<int> Metrics::SelectKBestWeighted(const torch::Tensor& weights, bool ascending, unsigned k) 31 : { 32 : // Return the K Best features - 33 90 : auto n = features.size(); - 34 90 : if (k == 0) { + 33 1099 : auto n = features.size(); + 34 1099 : if (k == 0) { 35 0 : k = n; 36 : } 37 : // compute scores - 38 90 : scoresKBest.clear(); - 39 90 : featuresKBest.clear(); - 40 270 : auto label = samples.index({ -1, "..." }); - 41 2837 : for (int i = 0; i < n; ++i) { - 42 8241 : scoresKBest.push_back(mutualInformation(label, samples.index({ i, "..." }), weights)); - 43 2747 : featuresKBest.push_back(i); + 38 1099 : scoresKBest.clear(); + 39 1099 : featuresKBest.clear(); + 40 3297 : auto label = samples.index({ -1, "..." }); + 41 37425 : for (int i = 0; i < n; ++i) { + 42 108978 : scoresKBest.push_back(mutualInformation(label, samples.index({ i, "..." }), weights)); + 43 36326 : featuresKBest.push_back(i); 44 : } 45 : // sort & reduce scores and features - 46 90 : if (ascending) { - 47 19 : sort(featuresKBest.begin(), featuresKBest.end(), [&](int i, int j) - 48 453 : { return scoresKBest[i] < scoresKBest[j]; }); - 49 19 : sort(scoresKBest.begin(), scoresKBest.end(), std::less<double>()); - 50 19 : if (k < n) { - 51 28 : for (int i = 0; i < n - k; ++i) { - 52 20 : featuresKBest.erase(featuresKBest.begin()); - 53 20 : scoresKBest.erase(scoresKBest.begin()); + 46 1099 : if (ascending) { + 47 245 : sort(featuresKBest.begin(), featuresKBest.end(), [&](int i, int j) + 48 5931 : { return scoresKBest[i] < scoresKBest[j]; }); + 49 245 : sort(scoresKBest.begin(), scoresKBest.end(), std::less<double>()); + 50 245 : if (k < n) { + 51 308 : for (int i = 0; i < n - k; ++i) { + 52 220 : featuresKBest.erase(featuresKBest.begin()); + 53 220 : scoresKBest.erase(scoresKBest.begin()); 54 : } 55 : } 56 : } else { - 57 71 : sort(featuresKBest.begin(), featuresKBest.end(), [&](int i, int j) - 58 12619 : { return scoresKBest[i] > scoresKBest[j]; }); - 59 71 : sort(scoresKBest.begin(), scoresKBest.end(), std::greater<double>()); - 60 71 : featuresKBest.resize(k); - 61 71 : scoresKBest.resize(k); + 57 854 : sort(featuresKBest.begin(), featuresKBest.end(), [&](int i, int j) + 58 168709 : { return scoresKBest[i] > scoresKBest[j]; }); + 59 854 : sort(scoresKBest.begin(), scoresKBest.end(), std::greater<double>()); + 60 854 : featuresKBest.resize(k); + 61 854 : scoresKBest.resize(k); 62 : } - 63 180 : return featuresKBest; - 64 2927 : } - 65 8 : std::vector<double> Metrics::getScoresKBest() const + 63 2198 : return featuresKBest; + 64 38524 : } + 65 88 : std::vector<double> Metrics::getScoresKBest() const 66 : { - 67 8 : return scoresKBest; + 67 88 : return scoresKBest; 68 : } 69 : - 70 34 : torch::Tensor Metrics::conditionalEdge(const torch::Tensor& weights) + 70 374 : torch::Tensor Metrics::conditionalEdge(const torch::Tensor& weights) 71 : { - 72 34 : auto result = std::vector<double>(); - 73 34 : auto source = std::vector<std::string>(features); - 74 34 : source.push_back(className); - 75 34 : auto combinations = doCombinations(source); + 72 374 : auto result = std::vector<double>(); + 73 374 : auto source = std::vector<std::string>(features); + 74 374 : source.push_back(className); + 75 374 : auto combinations = doCombinations(source); 76 : // Compute class prior - 77 34 : auto margin = torch::zeros({ classNumStates }, torch::kFloat); - 78 184 : for (int value = 0; value < classNumStates; ++value) { - 79 600 : auto mask = samples.index({ -1, "..." }) == value; - 80 150 : margin[value] = mask.sum().item<double>() / samples.size(1); - 81 150 : } - 82 918 : for (auto [first, second] : combinations) { - 83 884 : int index_first = find(features.begin(), features.end(), first) - features.begin(); - 84 884 : int index_second = find(features.begin(), features.end(), second) - features.begin(); - 85 884 : double accumulated = 0; - 86 5240 : for (int value = 0; value < classNumStates; ++value) { - 87 17424 : auto mask = samples.index({ -1, "..." }) == value; - 88 13068 : auto first_dataset = samples.index({ index_first, mask }); - 89 13068 : auto second_dataset = samples.index({ index_second, mask }); - 90 8712 : auto weights_dataset = weights.index({ mask }); - 91 8712 : auto mi = mutualInformation(first_dataset, second_dataset, weights_dataset); - 92 4356 : auto pb = margin[value].item<double>(); - 93 4356 : accumulated += pb * mi; - 94 4356 : } - 95 884 : result.push_back(accumulated); - 96 884 : } - 97 34 : long n_vars = source.size(); - 98 34 : auto matrix = torch::zeros({ n_vars, n_vars }); - 99 34 : auto indices = torch::triu_indices(n_vars, n_vars, 1); - 100 918 : for (auto i = 0; i < result.size(); ++i) { - 101 884 : auto x = indices[0][i]; - 102 884 : auto y = indices[1][i]; - 103 884 : matrix[x][y] = result[i]; - 104 884 : matrix[y][x] = result[i]; - 105 884 : } - 106 68 : return matrix; - 107 21964 : } + 77 374 : auto margin = torch::zeros({ classNumStates }, torch::kFloat); + 78 2024 : for (int value = 0; value < classNumStates; ++value) { + 79 6600 : auto mask = samples.index({ -1, "..." }) == value; + 80 1650 : margin[value] = mask.sum().item<double>() / samples.size(1); + 81 1650 : } + 82 10098 : for (auto [first, second] : combinations) { + 83 9724 : int index_first = find(features.begin(), features.end(), first) - features.begin(); + 84 9724 : int index_second = find(features.begin(), features.end(), second) - features.begin(); + 85 9724 : double accumulated = 0; + 86 57640 : for (int value = 0; value < classNumStates; ++value) { + 87 191664 : auto mask = samples.index({ -1, "..." }) == value; + 88 143748 : auto first_dataset = samples.index({ index_first, mask }); + 89 143748 : auto second_dataset = samples.index({ index_second, mask }); + 90 95832 : auto weights_dataset = weights.index({ mask }); + 91 95832 : auto mi = mutualInformation(first_dataset, second_dataset, weights_dataset); + 92 47916 : auto pb = margin[value].item<double>(); + 93 47916 : accumulated += pb * mi; + 94 47916 : } + 95 9724 : result.push_back(accumulated); + 96 9724 : } + 97 374 : long n_vars = source.size(); + 98 374 : auto matrix = torch::zeros({ n_vars, n_vars }); + 99 374 : auto indices = torch::triu_indices(n_vars, n_vars, 1); + 100 10098 : for (auto i = 0; i < result.size(); ++i) { + 101 9724 : auto x = indices[0][i]; + 102 9724 : auto y = indices[1][i]; + 103 9724 : matrix[x][y] = result[i]; + 104 9724 : matrix[y][x] = result[i]; + 105 9724 : } + 106 748 : return matrix; + 107 241604 : } 108 : // To use in Python 109 0 : std::vector<float> Metrics::conditionalEdgeWeights(std::vector<float>& weights_) 110 : { @@ -175,59 +175,59 @@ 113 0 : std::vector<float> v(matrix.data_ptr<float>(), matrix.data_ptr<float>() + matrix.numel()); 114 0 : return v; 115 0 : } - 116 8506 : double Metrics::entropy(const torch::Tensor& feature, const torch::Tensor& weights) + 116 101565 : double Metrics::entropy(const torch::Tensor& feature, const torch::Tensor& weights) 117 : { - 118 8506 : torch::Tensor counts = feature.bincount(weights); - 119 8506 : double totalWeight = counts.sum().item<double>(); - 120 8506 : torch::Tensor probs = counts.to(torch::kFloat) / totalWeight; - 121 8506 : torch::Tensor logProbs = torch::log(probs); - 122 8506 : torch::Tensor entropy = -probs * logProbs; - 123 17012 : return entropy.nansum().item<double>(); - 124 8506 : } + 118 101565 : torch::Tensor counts = feature.bincount(weights); + 119 101565 : double totalWeight = counts.sum().item<double>(); + 120 101565 : torch::Tensor probs = counts.to(torch::kFloat) / totalWeight; + 121 101565 : torch::Tensor logProbs = torch::log(probs); + 122 101565 : torch::Tensor entropy = -probs * logProbs; + 123 203130 : return entropy.nansum().item<double>(); + 124 101565 : } 125 : // H(Y|X) = sum_{x in X} p(x) H(Y|X=x) - 126 7684 : double Metrics::conditionalEntropy(const torch::Tensor& firstFeature, const torch::Tensor& secondFeature, const torch::Tensor& weights) + 126 91263 : double Metrics::conditionalEntropy(const torch::Tensor& firstFeature, const torch::Tensor& secondFeature, const torch::Tensor& weights) 127 : { - 128 7684 : int numSamples = firstFeature.sizes()[0]; - 129 7684 : torch::Tensor featureCounts = secondFeature.bincount(weights); - 130 7684 : std::unordered_map<int, std::unordered_map<int, double>> jointCounts; - 131 7684 : double totalWeight = 0; - 132 991784 : for (auto i = 0; i < numSamples; i++) { - 133 984100 : jointCounts[secondFeature[i].item<int>()][firstFeature[i].item<int>()] += weights[i].item<double>(); - 134 984100 : totalWeight += weights[i].item<float>(); + 128 91263 : int numSamples = firstFeature.sizes()[0]; + 129 91263 : torch::Tensor featureCounts = secondFeature.bincount(weights); + 130 91263 : std::unordered_map<int, std::unordered_map<int, double>> jointCounts; + 131 91263 : double totalWeight = 0; + 132 11715815 : for (auto i = 0; i < numSamples; i++) { + 133 11624552 : jointCounts[secondFeature[i].item<int>()][firstFeature[i].item<int>()] += weights[i].item<double>(); + 134 11624552 : totalWeight += weights[i].item<float>(); 135 : } - 136 7684 : if (totalWeight == 0) + 136 91263 : if (totalWeight == 0) 137 0 : return 0; - 138 7684 : double entropyValue = 0; - 139 26852 : for (int value = 0; value < featureCounts.sizes()[0]; ++value) { - 140 19168 : double p_f = featureCounts[value].item<double>() / totalWeight; - 141 19168 : double entropy_f = 0; - 142 57129 : for (auto& [label, jointCount] : jointCounts[value]) { - 143 37961 : double p_l_f = jointCount / featureCounts[value].item<double>(); - 144 37961 : if (p_l_f > 0) { - 145 37961 : entropy_f -= p_l_f * log(p_l_f); + 138 91263 : double entropyValue = 0; + 139 311456 : for (int value = 0; value < featureCounts.sizes()[0]; ++value) { + 140 220193 : double p_f = featureCounts[value].item<double>() / totalWeight; + 141 220193 : double entropy_f = 0; + 142 655015 : for (auto& [label, jointCount] : jointCounts[value]) { + 143 434822 : double p_l_f = jointCount / featureCounts[value].item<double>(); + 144 434822 : if (p_l_f > 0) { + 145 434822 : entropy_f -= p_l_f * log(p_l_f); 146 : } else { 147 0 : entropy_f = 0; 148 : } 149 : } - 150 19168 : entropyValue += p_f * entropy_f; + 150 220193 : entropyValue += p_f * entropy_f; 151 : } - 152 7684 : return entropyValue; - 153 7684 : } + 152 91263 : return entropyValue; + 153 91263 : } 154 : // I(X;Y) = H(Y) - H(Y|X) - 155 7684 : double Metrics::mutualInformation(const torch::Tensor& firstFeature, const torch::Tensor& secondFeature, const torch::Tensor& weights) + 155 91263 : double Metrics::mutualInformation(const torch::Tensor& firstFeature, const torch::Tensor& secondFeature, const torch::Tensor& weights) 156 : { - 157 7684 : return entropy(firstFeature, weights) - conditionalEntropy(firstFeature, secondFeature, weights); + 157 91263 : return entropy(firstFeature, weights) - conditionalEntropy(firstFeature, secondFeature, weights); 158 : } 159 : /* 160 : Compute the maximum spanning tree considering the weights as distances 161 : and the indices of the weights as nodes of this square matrix using 162 : Kruskal algorithm 163 : */ - 164 29 : std::vector<std::pair<int, int>> Metrics::maximumSpanningTree(const std::vector<std::string>& features, const torch::Tensor& weights, const int root) + 164 319 : std::vector<std::pair<int, int>> Metrics::maximumSpanningTree(const std::vector<std::string>& features, const torch::Tensor& weights, const int root) 165 : { - 166 29 : auto mst = MST(features, weights, root); - 167 58 : return mst.maximumSpanningTree(); - 168 29 : } + 166 319 : auto mst = MST(features, weights, root); + 167 638 : return mst.maximumSpanningTree(); + 168 319 : } 169 : } diff --git a/html/bayesnet/utils/BayesMetrics.h.func-c.html b/html/bayesnet/utils/BayesMetrics.h.func-c.html index 36534e8..c0f5cc6 100644 --- a/html/bayesnet/utils/BayesMetrics.h.func-c.html +++ b/html/bayesnet/utils/BayesMetrics.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZN8bayesnet7Metrics9pop_firstIiEET_RSt6vectorIS2_SaIS2_EE - 10 + 116 _ZN8bayesnet7Metrics14doCombinationsIiEESt6vectorISt4pairIT_S4_ESaIS5_EERKS2_IS4_SaIS4_EE - 192 + 2225 _ZN8bayesnet7Metrics14doCombinationsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt6vectorISt4pairIT_SA_ESaISB_EERKS8_ISA_SaISA_EE - 34 + 374 _ZN8bayesnet7Metrics14doCombinationsIiEESt6vectorISt4pairIT_S4_ESaIS5_EERKS2_IS4_SaIS4_EE - 158 + 1851 _ZN8bayesnet7MetricsC2Ev - 413 + 4750 diff --git a/html/bayesnet/utils/BayesMetrics.h.func.html b/html/bayesnet/utils/BayesMetrics.h.func.html index ab12dc0..bd35a65 100644 --- a/html/bayesnet/utils/BayesMetrics.h.func.html +++ b/html/bayesnet/utils/BayesMetrics.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,35 +65,35 @@ _ZN8bayesnet7Metrics14doCombinationsIiEESt6vectorISt4pairIT_S4_ESaIS5_EERKS2_IS4_SaIS4_EE - 192 + 2225 _ZN8bayesnet7Metrics14doCombinationsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt6vectorISt4pairIT_SA_ESaISB_EERKS8_ISA_SaISA_EE - 34 + 374 _ZN8bayesnet7Metrics14doCombinationsIiEESt6vectorISt4pairIT_S4_ESaIS5_EERKS2_IS4_SaIS4_EE - 158 + 1851 _ZN8bayesnet7Metrics9pop_firstIiEET_RSt6vectorIS2_SaIS2_EE - 10 + 116 _ZN8bayesnet7MetricsC2Ev - 413 + 4750 diff --git a/html/bayesnet/utils/BayesMetrics.h.gcov.html b/html/bayesnet/utils/BayesMetrics.h.gcov.html index 02f0588..f048cce 100644 --- a/html/bayesnet/utils/BayesMetrics.h.gcov.html +++ b/html/bayesnet/utils/BayesMetrics.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -74,7 +74,7 @@ 12 : namespace bayesnet { 13 : class Metrics { 14 : public: - 15 413 : Metrics() = default; + 15 4750 : Metrics() = default; 16 : Metrics(const torch::Tensor& samples, const std::vector<std::string>& features, const std::string& className, const int classNumStates); 17 : Metrics(const std::vector<std::vector<int>>& vsamples, const std::vector<int>& labels, const std::vector<std::string>& features, const std::string& className, const int classNumStates); 18 : std::vector<int> SelectKBestWeighted(const torch::Tensor& weights, bool ascending = false, unsigned k = 0); @@ -89,23 +89,23 @@ 27 : double entropy(const torch::Tensor& feature, const torch::Tensor& weights); 28 : std::vector<std::string> features; 29 : template <class T> - 30 192 : std::vector<std::pair<T, T>> doCombinations(const std::vector<T>& source) + 30 2225 : std::vector<std::pair<T, T>> doCombinations(const std::vector<T>& source) 31 : { - 32 192 : std::vector<std::pair<T, T>> result; - 33 1013 : for (int i = 0; i < source.size(); ++i) { - 34 821 : T temp = source[i]; - 35 2590 : for (int j = i + 1; j < source.size(); ++j) { - 36 1769 : result.push_back({ temp, source[j] }); + 32 2225 : std::vector<std::pair<T, T>> result; + 33 11660 : for (int i = 0; i < source.size(); ++i) { + 34 9435 : T temp = source[i]; + 35 29517 : for (int j = i + 1; j < source.size(); ++j) { + 36 20082 : result.push_back({ temp, source[j] }); 37 : } 38 : } - 39 192 : return result; + 39 2225 : return result; 40 0 : } 41 : template <class T> - 42 10 : T pop_first(std::vector<T>& v) + 42 116 : T pop_first(std::vector<T>& v) 43 : { - 44 10 : T temp = v[0]; - 45 10 : v.erase(v.begin()); - 46 10 : return temp; + 44 116 : T temp = v[0]; + 45 116 : v.erase(v.begin()); + 46 116 : return temp; 47 : } 48 : private: 49 : int classNumStates = 0; diff --git a/html/bayesnet/utils/Mst.cc.func-c.html b/html/bayesnet/utils/Mst.cc.func-c.html index 0e18943..00e6fd7 100644 --- a/html/bayesnet/utils/Mst.cc.func-c.html +++ b/html/bayesnet/utils/Mst.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,70 +65,70 @@ _ZN8bayesnet3MST19maximumSpanningTreeEv - 29 + 319 _ZN8bayesnet3MSTC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKN2at6TensorEi - 29 + 319 _ZN8bayesnet5Graph17kruskal_algorithmEv - 29 + 319 _ZN8bayesnet5GraphC2Ei - 29 + 319 _ZN8bayesnet7reorderESt6vectorISt4pairIfS1_IiiEESaIS3_EEi - 29 + 319 _ZN8bayesnet13insertElementERNSt7__cxx114listIiSaIiEEEi - 159 + 1749 _ZN8bayesnet5Graph9union_setEii - 159 + 1749 _ZN8bayesnet5Graph7addEdgeEiif - 576 + 6336 _ZZN8bayesnet5Graph17kruskal_algorithmEvENKUlRKT_RKT0_E_clISt4pairIfS9_IiiEESB_EEDaS3_S6_ - 2213 + 24343 _ZN8bayesnet5Graph8find_setEi - 2663 + 29293 diff --git a/html/bayesnet/utils/Mst.cc.func.html b/html/bayesnet/utils/Mst.cc.func.html index e33bc55..50e602e 100644 --- a/html/bayesnet/utils/Mst.cc.func.html +++ b/html/bayesnet/utils/Mst.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,70 +65,70 @@ _ZN8bayesnet13insertElementERNSt7__cxx114listIiSaIiEEEi - 159 + 1749 _ZN8bayesnet3MST19maximumSpanningTreeEv - 29 + 319 _ZN8bayesnet3MSTC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKN2at6TensorEi - 29 + 319 _ZN8bayesnet5Graph17kruskal_algorithmEv - 29 + 319 _ZN8bayesnet5Graph7addEdgeEiif - 576 + 6336 _ZN8bayesnet5Graph8find_setEi - 2663 + 29293 _ZN8bayesnet5Graph9union_setEii - 159 + 1749 _ZN8bayesnet5GraphC2Ei - 29 + 319 _ZN8bayesnet7reorderESt6vectorISt4pairIfS1_IiiEESaIS3_EEi - 29 + 319 _ZZN8bayesnet5Graph17kruskal_algorithmEvENKUlRKT_RKT0_E_clISt4pairIfS9_IiiEESB_EEDaS3_S6_ - 2213 + 24343 diff --git a/html/bayesnet/utils/Mst.cc.gcov.html b/html/bayesnet/utils/Mst.cc.gcov.html index 1c8ee61..ddfb305 100644 --- a/html/bayesnet/utils/Mst.cc.gcov.html +++ b/html/bayesnet/utils/Mst.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -76,108 +76,108 @@ 14 : */ 15 : 16 : namespace bayesnet { - 17 58 : Graph::Graph(int V) : V(V), parent(std::vector<int>(V)) + 17 638 : Graph::Graph(int V) : V(V), parent(std::vector<int>(V)) 18 : { - 19 217 : for (int i = 0; i < V; i++) - 20 188 : parent[i] = i; - 21 29 : G.clear(); - 22 29 : T.clear(); - 23 29 : } - 24 576 : void Graph::addEdge(int u, int v, float wt) + 19 2387 : for (int i = 0; i < V; i++) + 20 2068 : parent[i] = i; + 21 319 : G.clear(); + 22 319 : T.clear(); + 23 319 : } + 24 6336 : void Graph::addEdge(int u, int v, float wt) 25 : { - 26 576 : G.push_back({ wt, { u, v } }); - 27 576 : } - 28 2663 : int Graph::find_set(int i) + 26 6336 : G.push_back({ wt, { u, v } }); + 27 6336 : } + 28 29293 : int Graph::find_set(int i) 29 : { 30 : // If i is the parent of itself - 31 2663 : if (i == parent[i]) - 32 1152 : return i; + 31 29293 : if (i == parent[i]) + 32 12672 : return i; 33 : else 34 : //else recursively find the parent of i - 35 1511 : return find_set(parent[i]); + 35 16621 : return find_set(parent[i]); 36 : } - 37 159 : void Graph::union_set(int u, int v) + 37 1749 : void Graph::union_set(int u, int v) 38 : { - 39 159 : parent[u] = parent[v]; - 40 159 : } - 41 29 : void Graph::kruskal_algorithm() + 39 1749 : parent[u] = parent[v]; + 40 1749 : } + 41 319 : void Graph::kruskal_algorithm() 42 : { 43 : // sort the edges ordered on decreasing weight - 44 2242 : stable_sort(G.begin(), G.end(), [](const auto& left, const auto& right) {return left.first > right.first;}); - 45 605 : for (int i = 0; i < G.size(); i++) { + 44 24662 : stable_sort(G.begin(), G.end(), [](const auto& left, const auto& right) {return left.first > right.first;}); + 45 6655 : for (int i = 0; i < G.size(); i++) { 46 : int uSt, vEd; - 47 576 : uSt = find_set(G[i].second.first); - 48 576 : vEd = find_set(G[i].second.second); - 49 576 : if (uSt != vEd) { - 50 159 : T.push_back(G[i]); // add to mst std::vector - 51 159 : union_set(uSt, vEd); + 47 6336 : uSt = find_set(G[i].second.first); + 48 6336 : vEd = find_set(G[i].second.second); + 49 6336 : if (uSt != vEd) { + 50 1749 : T.push_back(G[i]); // add to mst std::vector + 51 1749 : union_set(uSt, vEd); 52 : } 53 : } - 54 29 : } + 54 319 : } 55 : - 56 159 : void insertElement(std::list<int>& variables, int variable) + 56 1749 : void insertElement(std::list<int>& variables, int variable) 57 : { - 58 159 : if (std::find(variables.begin(), variables.end(), variable) == variables.end()) { - 59 159 : variables.push_front(variable); + 58 1749 : if (std::find(variables.begin(), variables.end(), variable) == variables.end()) { + 59 1749 : variables.push_front(variable); 60 : } - 61 159 : } + 61 1749 : } 62 : - 63 29 : std::vector<std::pair<int, int>> reorder(std::vector<std::pair<float, std::pair<int, int>>> T, int root_original) + 63 319 : std::vector<std::pair<int, int>> reorder(std::vector<std::pair<float, std::pair<int, int>>> T, int root_original) 64 : { 65 : // Create the edges of a DAG from the MST 66 : // replacing unordered_set with list because unordered_set cannot guarantee the order of the elements inserted - 67 29 : auto result = std::vector<std::pair<int, int>>(); - 68 29 : auto visited = std::vector<int>(); - 69 29 : auto nextVariables = std::list<int>(); - 70 29 : nextVariables.push_front(root_original); - 71 217 : while (nextVariables.size() > 0) { - 72 188 : int root = nextVariables.front(); - 73 188 : nextVariables.pop_front(); - 74 664 : for (int i = 0; i < T.size(); ++i) { - 75 476 : auto [weight, edge] = T[i]; - 76 476 : auto [from, to] = edge; - 77 476 : if (from == root || to == root) { - 78 159 : visited.insert(visited.begin(), i); - 79 159 : if (from == root) { - 80 106 : result.push_back({ from, to }); - 81 106 : insertElement(nextVariables, to); + 67 319 : auto result = std::vector<std::pair<int, int>>(); + 68 319 : auto visited = std::vector<int>(); + 69 319 : auto nextVariables = std::list<int>(); + 70 319 : nextVariables.push_front(root_original); + 71 2387 : while (nextVariables.size() > 0) { + 72 2068 : int root = nextVariables.front(); + 73 2068 : nextVariables.pop_front(); + 74 7304 : for (int i = 0; i < T.size(); ++i) { + 75 5236 : auto [weight, edge] = T[i]; + 76 5236 : auto [from, to] = edge; + 77 5236 : if (from == root || to == root) { + 78 1749 : visited.insert(visited.begin(), i); + 79 1749 : if (from == root) { + 80 1166 : result.push_back({ from, to }); + 81 1166 : insertElement(nextVariables, to); 82 : } else { - 83 53 : result.push_back({ to, from }); - 84 53 : insertElement(nextVariables, from); + 83 583 : result.push_back({ to, from }); + 84 583 : insertElement(nextVariables, from); 85 : } 86 : } 87 : } 88 : // Remove visited - 89 347 : for (int i = 0; i < visited.size(); ++i) { - 90 159 : T.erase(T.begin() + visited[i]); + 89 3817 : for (int i = 0; i < visited.size(); ++i) { + 90 1749 : T.erase(T.begin() + visited[i]); 91 : } - 92 188 : visited.clear(); + 92 2068 : visited.clear(); 93 : } - 94 29 : if (T.size() > 0) { + 94 319 : if (T.size() > 0) { 95 0 : for (int i = 0; i < T.size(); ++i) { 96 0 : auto [weight, edge] = T[i]; 97 0 : auto [from, to] = edge; 98 0 : result.push_back({ from, to }); 99 : } 100 : } - 101 58 : return result; - 102 29 : } + 101 638 : return result; + 102 319 : } 103 : - 104 29 : MST::MST(const std::vector<std::string>& features, const torch::Tensor& weights, const int root) : features(features), weights(weights), root(root) {} - 105 29 : std::vector<std::pair<int, int>> MST::maximumSpanningTree() + 104 319 : MST::MST(const std::vector<std::string>& features, const torch::Tensor& weights, const int root) : features(features), weights(weights), root(root) {} + 105 319 : std::vector<std::pair<int, int>> MST::maximumSpanningTree() 106 : { - 107 29 : auto num_features = features.size(); - 108 29 : Graph g(num_features); + 107 319 : auto num_features = features.size(); + 108 319 : Graph g(num_features); 109 : // Make a complete graph - 110 188 : for (int i = 0; i < num_features - 1; ++i) { - 111 735 : for (int j = i + 1; j < num_features; ++j) { - 112 576 : g.addEdge(i, j, weights[i][j].item<float>()); + 110 2068 : for (int i = 0; i < num_features - 1; ++i) { + 111 8085 : for (int j = i + 1; j < num_features; ++j) { + 112 6336 : g.addEdge(i, j, weights[i][j].item<float>()); 113 : } 114 : } - 115 29 : g.kruskal_algorithm(); - 116 29 : auto mst = g.get_mst(); - 117 58 : return reorder(mst, root); - 118 29 : } + 115 319 : g.kruskal_algorithm(); + 116 319 : auto mst = g.get_mst(); + 117 638 : return reorder(mst, root); + 118 319 : } 119 : 120 : } diff --git a/html/bayesnet/utils/Mst.h.func-c.html b/html/bayesnet/utils/Mst.h.func-c.html index d93c838..4a7e6ef 100644 --- a/html/bayesnet/utils/Mst.h.func-c.html +++ b/html/bayesnet/utils/Mst.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet5Graph7get_mstEv - 29 + 319 diff --git a/html/bayesnet/utils/Mst.h.func.html b/html/bayesnet/utils/Mst.h.func.html index 868bf49..03390c5 100644 --- a/html/bayesnet/utils/Mst.h.func.html +++ b/html/bayesnet/utils/Mst.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,7 +65,7 @@ _ZN8bayesnet5Graph7get_mstEv - 29 + 319 diff --git a/html/bayesnet/utils/Mst.h.gcov.html b/html/bayesnet/utils/Mst.h.gcov.html index 7a122de..229f4bf 100644 --- a/html/bayesnet/utils/Mst.h.gcov.html +++ b/html/bayesnet/utils/Mst.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -89,7 +89,7 @@ 27 : int find_set(int i); 28 : void union_set(int u, int v); 29 : void kruskal_algorithm(); - 30 29 : std::vector <std::pair<float, std::pair<int, int>>> get_mst() { return T; } + 30 319 : std::vector <std::pair<float, std::pair<int, int>>> get_mst() { return T; } 31 : private: 32 : int V; // number of nodes in graph 33 : std::vector <std::pair<float, std::pair<int, int>>> G; // std::vector for graph diff --git a/html/bayesnet/utils/bayesnetUtils.cc.func-c.html b/html/bayesnet/utils/bayesnetUtils.cc.func-c.html index 95c38f5..3970a27 100644 --- a/html/bayesnet/utils/bayesnetUtils.cc.func-c.html +++ b/html/bayesnet/utils/bayesnetUtils.cc.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet20tensorToVectorDoubleERN2at6TensorE - 7 + 82 _ZN8bayesnet14vectorToTensorERSt6vectorIS0_IiSaIiEESaIS2_EEb - 9 + 104 _ZN8bayesnet7argsortERSt6vectorIdSaIdEE - 29 + 327 _ZZN8bayesnet7argsortERSt6vectorIdSaIdEEENKUliiE_clEii - 567 + 8693 diff --git a/html/bayesnet/utils/bayesnetUtils.cc.func.html b/html/bayesnet/utils/bayesnetUtils.cc.func.html index 2c6e2f1..c289429 100644 --- a/html/bayesnet/utils/bayesnetUtils.cc.func.html +++ b/html/bayesnet/utils/bayesnetUtils.cc.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -65,28 +65,28 @@ _ZN8bayesnet14vectorToTensorERSt6vectorIS0_IiSaIiEESaIS2_EEb - 9 + 104 _ZN8bayesnet20tensorToVectorDoubleERN2at6TensorE - 7 + 82 _ZN8bayesnet7argsortERSt6vectorIdSaIdEE - 29 + 327 _ZZN8bayesnet7argsortERSt6vectorIdSaIdEEENKUliiE_clEii - 567 + 8693 diff --git a/html/bayesnet/utils/bayesnetUtils.cc.gcov.html b/html/bayesnet/utils/bayesnetUtils.cc.gcov.html index fbac7cf..c35817d 100644 --- a/html/bayesnet/utils/bayesnetUtils.cc.gcov.html +++ b/html/bayesnet/utils/bayesnetUtils.cc.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 100.0 % @@ -70,38 +70,38 @@ 8 : #include "bayesnetUtils.h" 9 : namespace bayesnet { 10 : // Return the indices in descending order - 11 29 : std::vector<int> argsort(std::vector<double>& nums) + 11 327 : std::vector<int> argsort(std::vector<double>& nums) 12 : { - 13 29 : int n = nums.size(); - 14 29 : std::vector<int> indices(n); - 15 29 : iota(indices.begin(), indices.end(), 0); - 16 596 : sort(indices.begin(), indices.end(), [&nums](int i, int j) {return nums[i] > nums[j];}); - 17 29 : return indices; + 13 327 : int n = nums.size(); + 14 327 : std::vector<int> indices(n); + 15 327 : iota(indices.begin(), indices.end(), 0); + 16 9020 : sort(indices.begin(), indices.end(), [&nums](int i, int j) {return nums[i] > nums[j];}); + 17 327 : return indices; 18 0 : } - 19 7 : std::vector<std::vector<double>> tensorToVectorDouble(torch::Tensor& dtensor) + 19 82 : std::vector<std::vector<double>> tensorToVectorDouble(torch::Tensor& dtensor) 20 : { 21 : // convert mxn tensor to mxn std::vector - 22 7 : std::vector<std::vector<double>> result; + 22 82 : std::vector<std::vector<double>> result; 23 : // Iterate over cols - 24 1803 : for (int i = 0; i < dtensor.size(0); ++i) { - 25 5388 : auto col_tensor = dtensor.index({ i, "..." }); - 26 1796 : auto col = std::vector<double>(col_tensor.data_ptr<float>(), col_tensor.data_ptr<float>() + dtensor.size(1)); - 27 1796 : result.push_back(col); - 28 1796 : } - 29 7 : return result; - 30 1796 : } - 31 9 : torch::Tensor vectorToTensor(std::vector<std::vector<int>>& vector, bool transpose) + 24 22442 : for (int i = 0; i < dtensor.size(0); ++i) { + 25 67080 : auto col_tensor = dtensor.index({ i, "..." }); + 26 22360 : auto col = std::vector<double>(col_tensor.data_ptr<float>(), col_tensor.data_ptr<float>() + dtensor.size(1)); + 27 22360 : result.push_back(col); + 28 22360 : } + 29 82 : return result; + 30 22360 : } + 31 104 : torch::Tensor vectorToTensor(std::vector<std::vector<int>>& vector, bool transpose) 32 : { 33 : // convert nxm std::vector to mxn tensor if transpose - 34 9 : long int m = transpose ? vector[0].size() : vector.size(); - 35 9 : long int n = transpose ? vector.size() : vector[0].size(); - 36 9 : auto tensor = torch::zeros({ m, n }, torch::kInt32); - 37 59 : for (int i = 0; i < m; ++i) { - 38 12481 : for (int j = 0; j < n; ++j) { - 39 12431 : tensor[i][j] = transpose ? vector[j][i] : vector[i][j]; + 34 104 : long int m = transpose ? vector[0].size() : vector.size(); + 35 104 : long int n = transpose ? vector.size() : vector[0].size(); + 36 104 : auto tensor = torch::zeros({ m, n }, torch::kInt32); + 37 686 : for (int i = 0; i < m; ++i) { + 38 156955 : for (int j = 0; j < n; ++j) { + 39 156373 : tensor[i][j] = transpose ? vector[j][i] : vector[i][j]; 40 : } 41 : } - 42 9 : return tensor; + 42 104 : return tensor; 43 0 : } 44 : } diff --git a/html/bayesnet/utils/index-sort-f.html b/html/bayesnet/utils/index-sort-f.html index d4bbb7c..7087601 100644 --- a/html/bayesnet/utils/index-sort-f.html +++ b/html/bayesnet/utils/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 96.8 % diff --git a/html/bayesnet/utils/index-sort-l.html b/html/bayesnet/utils/index-sort-l.html index 7486957..fa1f381 100644 --- a/html/bayesnet/utils/index-sort-l.html +++ b/html/bayesnet/utils/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 96.8 % diff --git a/html/bayesnet/utils/index.html b/html/bayesnet/utils/index.html index 655a208..47c47d8 100644 --- a/html/bayesnet/utils/index.html +++ b/html/bayesnet/utils/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 96.8 % diff --git a/html/index-sort-f.html b/html/index-sort-f.html index 984c162..08d7602 100644 --- a/html/index-sort-f.html +++ b/html/index-sort-f.html @@ -31,13 +31,13 @@ coverage.info Lines: - 97.2 % - 1559 - 1516 + 97.1 % + 1578 + 1533 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.6 % @@ -130,11 +130,11 @@ bayesnet/ensembles -
98.8%98.8%
+
98.4%98.4%
- 98.8 % - 424 - 419 + 98.4 % + 443 + 436 98.1 % 53 52 diff --git a/html/index-sort-l.html b/html/index-sort-l.html index 9daeec0..99c22f6 100644 --- a/html/index-sort-l.html +++ b/html/index-sort-l.html @@ -31,13 +31,13 @@ coverage.info Lines: - 97.2 % - 1559 - 1516 + 97.1 % + 1578 + 1533 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.6 % @@ -118,11 +118,11 @@ bayesnet/ensembles -
98.8%98.8%
+
98.4%98.4%
- 98.8 % - 424 - 419 + 98.4 % + 443 + 436 98.1 % 53 52 diff --git a/html/index.html b/html/index.html index 56896ae..67f38cb 100644 --- a/html/index.html +++ b/html/index.html @@ -31,13 +31,13 @@ coverage.info Lines: - 97.2 % - 1559 - 1516 + 97.1 % + 1578 + 1533 Test Date: - 2024-04-21 17:30:26 + 2024-04-29 20:48:03 Functions: 97.6 % @@ -106,11 +106,11 @@ bayesnet/ensembles -
98.8%98.8%
+
98.4%98.4%
- 98.8 % - 424 - 419 + 98.4 % + 443 + 436 98.1 % 53 52 diff --git a/lib/catch2 b/lib/catch2 deleted file mode 160000 index bff6e35..0000000 --- a/lib/catch2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bff6e35e2b239217f3940ed52429f94b745adc50 diff --git a/lib/json b/lib/json index 199dea1..8c391e0 160000 --- a/lib/json +++ b/lib/json @@ -1 +1 @@ -Subproject commit 199dea11b17c533721b26249e2dcaee6ca1d51d3 +Subproject commit 8c391e04fe4195d8be862c97f38cfe10e2a3472e diff --git a/lib/log/loguru.cpp b/lib/log/loguru.cpp new file mode 100644 index 0000000..a95cfbf --- /dev/null +++ b/lib/log/loguru.cpp @@ -0,0 +1,2009 @@ +#if defined(__GNUC__) || defined(__clang__) +// Disable all warnings from gcc/clang: +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" + +#pragma GCC diagnostic ignored "-Wc++98-compat" +#pragma GCC diagnostic ignored "-Wc++98-compat-pedantic" +#pragma GCC diagnostic ignored "-Wexit-time-destructors" +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#pragma GCC diagnostic ignored "-Wglobal-constructors" +#pragma GCC diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" +#pragma GCC diagnostic ignored "-Wmissing-prototypes" +#pragma GCC diagnostic ignored "-Wpadded" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma GCC diagnostic ignored "-Wunused-macros" +#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4365) // conversion from 'X' to 'Y', signed/unsigned mismatch +#endif + +#include "loguru.hpp" + +#ifndef LOGURU_HAS_BEEN_IMPLEMENTED +#define LOGURU_HAS_BEEN_IMPLEMENTED + +#define LOGURU_PREAMBLE_WIDTH (53 + LOGURU_THREADNAME_WIDTH + LOGURU_FILENAME_WIDTH) + +#undef min +#undef max + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LOGURU_SYSLOG +#include +#else +#define LOG_USER 0 +#endif + +#ifdef _WIN32 +#include + +#define localtime_r(a, b) localtime_s(b, a) // No localtime_r with MSVC, but arguments are swapped for localtime_s +#else +#include +#include // mkdir +#include // STDERR_FILENO +#endif + +#ifdef __linux__ +#include // PATH_MAX +#elif !defined(_WIN32) +#include // PATH_MAX +#endif + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#ifdef __APPLE__ +#include "TargetConditionals.h" +#endif + +// TODO: use defined(_POSIX_VERSION) for some of these things? + +#if defined(_WIN32) || defined(__CYGWIN__) +#define LOGURU_PTHREADS 0 +#define LOGURU_WINTHREADS 1 +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 0 +#endif +#else +#define LOGURU_PTHREADS 1 +#define LOGURU_WINTHREADS 0 +#ifdef __GLIBC__ +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 1 +#endif +#else +#ifndef LOGURU_STACKTRACES +#define LOGURU_STACKTRACES 0 +#endif +#endif +#endif + +#if LOGURU_STACKTRACES +#include // for __cxa_demangle +#include // for dladdr +#include // for backtrace +#endif // LOGURU_STACKTRACES + +#if LOGURU_PTHREADS +#include +#if defined(__FreeBSD__) +#include +#include +#elif defined(__OpenBSD__) +#include +#endif + +#ifdef __linux__ + /* On Linux, the default thread name is the same as the name of the binary. + Additionally, all new threads inherit the name of the thread it got forked from. + For this reason, Loguru use the pthread Thread Local Storage + for storing thread names on Linux. */ +#ifndef LOGURU_PTLS_NAMES +#define LOGURU_PTLS_NAMES 1 +#endif +#endif +#endif + +#if LOGURU_WINTHREADS +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0502 +#endif +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#endif + +#ifndef LOGURU_PTLS_NAMES +#define LOGURU_PTLS_NAMES 0 +#endif + +LOGURU_ANONYMOUS_NAMESPACE_BEGIN + +namespace loguru { + using namespace std::chrono; + +#if LOGURU_WITH_FILEABS + struct FileAbs { + char path[PATH_MAX]; + char mode_str[4]; + Verbosity verbosity; + struct stat st; + FILE* fp; + bool is_reopening = false; // to prevent recursive call in file_reopen. + decltype(steady_clock::now()) last_check_time = steady_clock::now(); + }; +#else + typedef FILE* FileAbs; +#endif + + struct Callback { + std::string id; + log_handler_t callback; + void* user_data; + Verbosity verbosity; // Does not change! + close_handler_t close; + flush_handler_t flush; + unsigned indentation; + }; + + using CallbackVec = std::vector; + + using StringPair = std::pair; + using StringPairList = std::vector; + + const auto s_start_time = steady_clock::now(); + + Verbosity g_stderr_verbosity = Verbosity_0; + bool g_colorlogtostderr = true; + unsigned g_flush_interval_ms = 0; + bool g_preamble_header = true; + bool g_preamble = true; + + Verbosity g_internal_verbosity = Verbosity_0; + + // Preamble details + bool g_preamble_date = true; + bool g_preamble_time = true; + bool g_preamble_uptime = true; + bool g_preamble_thread = true; + bool g_preamble_file = true; + bool g_preamble_verbose = true; + bool g_preamble_pipe = true; + + static std::recursive_mutex s_mutex; + static Verbosity s_max_out_verbosity = Verbosity_OFF; + static std::string s_argv0_filename; + static std::string s_arguments; + static char s_current_dir[PATH_MAX]; + static CallbackVec s_callbacks; + static fatal_handler_t s_fatal_handler = nullptr; + static verbosity_to_name_t s_verbosity_to_name_callback = nullptr; + static name_to_verbosity_t s_name_to_verbosity_callback = nullptr; + static StringPairList s_user_stack_cleanups; + static bool s_strip_file_path = true; + static std::atomic s_stderr_indentation{ 0 }; + + // For periodic flushing: + static std::thread* s_flush_thread = nullptr; + static bool s_needs_flushing = false; + + static SignalOptions s_signal_options = SignalOptions::none(); + + static const bool s_terminal_has_color = []() { +#ifdef _WIN32 +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif + + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + if (hOut != INVALID_HANDLE_VALUE) { + DWORD dwMode = 0; + GetConsoleMode(hOut, &dwMode); + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + return SetConsoleMode(hOut, dwMode) != 0; + } + return false; +#else + if (!isatty(STDERR_FILENO)) { + return false; + } + if (const char* term = getenv("TERM")) { + return 0 == strcmp(term, "cygwin") + || 0 == strcmp(term, "linux") + || 0 == strcmp(term, "rxvt-unicode-256color") + || 0 == strcmp(term, "screen") + || 0 == strcmp(term, "screen-256color") + || 0 == strcmp(term, "screen.xterm-256color") + || 0 == strcmp(term, "tmux-256color") + || 0 == strcmp(term, "xterm") + || 0 == strcmp(term, "xterm-256color") + || 0 == strcmp(term, "xterm-termite") + || 0 == strcmp(term, "xterm-color"); + } else { + return false; + } +#endif + }(); + + static void print_preamble_header(char* out_buff, size_t out_buff_size); + + // ------------------------------------------------------------------------------ + // Colors + + bool terminal_has_color() { return s_terminal_has_color; } + + // Colors + +#ifdef _WIN32 +#define VTSEQ(ID) ("\x1b[1;" #ID "m") +#else +#define VTSEQ(ID) ("\x1b[" #ID "m") +#endif + + const char* terminal_black() { return s_terminal_has_color ? VTSEQ(30) : ""; } + const char* terminal_red() { return s_terminal_has_color ? VTSEQ(31) : ""; } + const char* terminal_green() { return s_terminal_has_color ? VTSEQ(32) : ""; } + const char* terminal_yellow() { return s_terminal_has_color ? VTSEQ(33) : ""; } + const char* terminal_blue() { return s_terminal_has_color ? VTSEQ(34) : ""; } + const char* terminal_purple() { return s_terminal_has_color ? VTSEQ(35) : ""; } + const char* terminal_cyan() { return s_terminal_has_color ? VTSEQ(36) : ""; } + const char* terminal_light_gray() { return s_terminal_has_color ? VTSEQ(37) : ""; } + const char* terminal_white() { return s_terminal_has_color ? VTSEQ(37) : ""; } + const char* terminal_light_red() { return s_terminal_has_color ? VTSEQ(91) : ""; } + const char* terminal_dim() { return s_terminal_has_color ? VTSEQ(2) : ""; } + + // Formating + const char* terminal_bold() { return s_terminal_has_color ? VTSEQ(1) : ""; } + const char* terminal_underline() { return s_terminal_has_color ? VTSEQ(4) : ""; } + + // You should end each line with this! + const char* terminal_reset() { return s_terminal_has_color ? VTSEQ(0) : ""; } + + // ------------------------------------------------------------------------------ +#if LOGURU_WITH_FILEABS + void file_reopen(void* user_data); + inline FILE* to_file(void* user_data) { return reinterpret_cast(user_data)->fp; } +#else + inline FILE* to_file(void* user_data) { return reinterpret_cast(user_data); } +#endif + + void file_log(void* user_data, const Message& message) + { +#if LOGURU_WITH_FILEABS + FileAbs* file_abs = reinterpret_cast(user_data); + if (file_abs->is_reopening) { + return; + } + // It is better checking file change every minute/hour/day, + // instead of doing this every time we log. + // Here check_interval is set to zero to enable checking every time; + const auto check_interval = seconds(0); + if (duration_cast(steady_clock::now() - file_abs->last_check_time) > check_interval) { + file_abs->last_check_time = steady_clock::now(); + file_reopen(user_data); + } + FILE* file = to_file(user_data); + if (!file) { + return; + } +#else + FILE* file = to_file(user_data); +#endif + fprintf(file, "%s%s%s%s\n", + message.preamble, message.indentation, message.prefix, message.message); + if (g_flush_interval_ms == 0) { + fflush(file); + } + } + + void file_close(void* user_data) + { + FILE* file = to_file(user_data); + if (file) { + fclose(file); + } +#if LOGURU_WITH_FILEABS + delete reinterpret_cast(user_data); +#endif + } + + void file_flush(void* user_data) + { + FILE* file = to_file(user_data); + fflush(file); + } + +#if LOGURU_WITH_FILEABS + void file_reopen(void* user_data) + { + FileAbs* file_abs = reinterpret_cast(user_data); + struct stat st; + int ret; + if (!file_abs->fp || (ret = stat(file_abs->path, &st)) == -1 || (st.st_ino != file_abs->st.st_ino)) { + file_abs->is_reopening = true; + if (file_abs->fp) { + fclose(file_abs->fp); + } + if (!file_abs->fp) { + VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to previous error", file_abs->path); + } else if (ret < 0) { + const auto why = errno_as_text(); + VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to '" LOGURU_FMT(s) "'", file_abs->path, why.c_str()); + } else { + VLOG_F(g_internal_verbosity, "Reopening file '" LOGURU_FMT(s) "' due to file changed", file_abs->path); + } + // try reopen current file. + if (!create_directories(file_abs->path)) { + LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", file_abs->path); + } + file_abs->fp = fopen(file_abs->path, file_abs->mode_str); + if (!file_abs->fp) { + LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", file_abs->path); + } else { + stat(file_abs->path, &file_abs->st); + } + file_abs->is_reopening = false; + } + } +#endif + // ------------------------------------------------------------------------------ + // ------------------------------------------------------------------------------ +#if LOGURU_SYSLOG + void syslog_log(void* /*user_data*/, const Message& message) + { + /* + Level 0: Is reserved for kernel panic type situations. + Level 1: Is for Major resource failure. + Level 2->7 Application level failures + */ + int level; + if (message.verbosity < Verbosity_FATAL) { + level = 1; // System Alert + } else { + switch (message.verbosity) { + case Verbosity_FATAL: level = 2; break; // System Critical + case Verbosity_ERROR: level = 3; break; // System Error + case Verbosity_WARNING: level = 4; break; // System Warning + case Verbosity_INFO: level = 5; break; // System Notice + case Verbosity_1: level = 6; break; // System Info + default: level = 7; break; // System Debug + } + } + + // Note: We don't add the time info. + // This is done automatically by the syslog deamon. + // Otherwise log all information that the file log does. + syslog(level, "%s%s%s", message.indentation, message.prefix, message.message); + } + + void syslog_close(void* /*user_data*/) + { + closelog(); + } + + void syslog_flush(void* /*user_data*/) + { + } +#endif + // ------------------------------------------------------------------------------ + // Helpers: + + Text::~Text() { free(_str); } + +#if LOGURU_USE_FMTLIB + Text vtextprintf(const char* format, fmt::format_args args) + { + return Text(STRDUP(fmt::vformat(format, args).c_str())); + } +#else + LOGURU_PRINTF_LIKE(1, 0) + static Text vtextprintf(const char* format, va_list vlist) + { +#ifdef _WIN32 + int bytes_needed = _vscprintf(format, vlist); + CHECK_F(bytes_needed >= 0, "Bad string format: '%s'", format); + char* buff = (char*)malloc(bytes_needed + 1); + vsnprintf(buff, bytes_needed + 1, format, vlist); + return Text(buff); +#else + char* buff = nullptr; + int result = vasprintf(&buff, format, vlist); + CHECK_F(result >= 0, "Bad string format: '" LOGURU_FMT(s) "'", format); + return Text(buff); +#endif + } + + Text textprintf(const char* format, ...) + { + va_list vlist; + va_start(vlist, format); + auto result = vtextprintf(format, vlist); + va_end(vlist); + return result; + } +#endif + + // Overloaded for variadic template matching. + Text textprintf() + { + return Text(static_cast(calloc(1, 1))); + } + + static const char* indentation(unsigned depth) + { + static const char buff[] = + ". . . . . . . . . . " ". . . . . . . . . . " + ". . . . . . . . . . " ". . . . . . . . . . " + ". . . . . . . . . . " ". . . . . . . . . . " + ". . . . . . . . . . " ". . . . . . . . . . " + ". . . . . . . . . . " ". . . . . . . . . . "; + static const size_t INDENTATION_WIDTH = 4; + static const size_t NUM_INDENTATIONS = (sizeof(buff) - 1) / INDENTATION_WIDTH; + depth = std::min(depth, NUM_INDENTATIONS); + return buff + INDENTATION_WIDTH * (NUM_INDENTATIONS - depth); + } + + static void parse_args(int& argc, char* argv[], const char* verbosity_flag) + { + int arg_dest = 1; + int out_argc = argc; + + for (int arg_it = 1; arg_it < argc; ++arg_it) { + auto cmd = argv[arg_it]; + auto arg_len = strlen(verbosity_flag); + + bool last_is_alpha = false; +#if LOGURU_USE_LOCALE + try { // locale variant of isalpha will throw on error + last_is_alpha = std::isalpha(cmd[arg_len], std::locale("")); + } + catch (...) { + last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); + } +#else + last_is_alpha = std::isalpha(static_cast(cmd[arg_len])); +#endif + + if (strncmp(cmd, verbosity_flag, arg_len) == 0 && !last_is_alpha) { + out_argc -= 1; + auto value_str = cmd + arg_len; + if (value_str[0] == '\0') { + // Value in separate argument + arg_it += 1; + CHECK_LT_F(arg_it, argc, "Missing verbosiy level after " LOGURU_FMT(s) "", verbosity_flag); + value_str = argv[arg_it]; + out_argc -= 1; + } + if (*value_str == '=') { value_str += 1; } + + auto req_verbosity = get_verbosity_from_name(value_str); + if (req_verbosity != Verbosity_INVALID) { + g_stderr_verbosity = req_verbosity; + } else { + char* end = 0; + g_stderr_verbosity = static_cast(strtol(value_str, &end, 10)); + CHECK_F(end && *end == '\0', + "Invalid verbosity. Expected integer, INFO, WARNING, ERROR or OFF, got '" LOGURU_FMT(s) "'", value_str); + } + } else { + argv[arg_dest++] = argv[arg_it]; + } + } + + argc = out_argc; + argv[argc] = nullptr; + } + + static long long now_ns() + { + return duration_cast(high_resolution_clock::now().time_since_epoch()).count(); + } + + // Returns the part of the path after the last / or \ (if any). + const char* filename(const char* path) + { + for (auto ptr = path; *ptr; ++ptr) { + if (*ptr == '/' || *ptr == '\\') { + path = ptr + 1; + } + } + return path; + } + + // ------------------------------------------------------------------------------ + + static void on_atexit() + { + VLOG_F(g_internal_verbosity, "atexit"); + flush(); + } + + static void install_signal_handlers(const SignalOptions& signal_options); + + static void write_hex_digit(std::string& out, unsigned num) + { + DCHECK_LT_F(num, 16u); + if (num < 10u) { out.push_back(char('0' + num)); } else { out.push_back(char('A' + num - 10)); } + } + + static void write_hex_byte(std::string& out, uint8_t n) + { + write_hex_digit(out, n >> 4u); + write_hex_digit(out, n & 0x0f); + } + + static void escape(std::string& out, const std::string& str) + { + for (char c : str) { + /**/ if (c == '\a') { out += "\\a"; } else if (c == '\b') { out += "\\b"; } else if (c == '\f') { out += "\\f"; } else if (c == '\n') { out += "\\n"; } else if (c == '\r') { out += "\\r"; } else if (c == '\t') { out += "\\t"; } else if (c == '\v') { out += "\\v"; } else if (c == '\\') { out += "\\\\"; } else if (c == '\'') { out += "\\\'"; } else if (c == '\"') { out += "\\\""; } else if (c == ' ') { out += "\\ "; } else if (0 <= c && c < 0x20) { // ASCI control character: + // else if (c < 0x20 || c != (c & 127)) { // ASCII control character or UTF-8: + out += "\\x"; + write_hex_byte(out, static_cast(c)); + } else { out += c; } + } + } + + Text errno_as_text() + { + char buff[256]; +#if defined(__GLIBC__) && defined(_GNU_SOURCE) + // GNU Version + return Text(STRDUP(strerror_r(errno, buff, sizeof(buff)))); +#elif defined(__APPLE__) || _POSIX_C_SOURCE >= 200112L + // XSI Version + strerror_r(errno, buff, sizeof(buff)); + return Text(strdup(buff)); +#elif defined(_WIN32) + strerror_s(buff, sizeof(buff), errno); + return Text(STRDUP(buff)); +#else + // Not thread-safe. + return Text(STRDUP(strerror(errno))); +#endif + } + + void init(int& argc, char* argv[], const Options& options) + { + CHECK_GT_F(argc, 0, "Expected proper argc/argv"); + CHECK_EQ_F(argv[argc], nullptr, "Expected proper argc/argv"); + + s_argv0_filename = filename(argv[0]); + +#ifdef _WIN32 +#define getcwd _getcwd +#endif + + if (!getcwd(s_current_dir, sizeof(s_current_dir))) { + const auto error_text = errno_as_text(); + LOG_F(WARNING, "Failed to get current working directory: " LOGURU_FMT(s) "", error_text.c_str()); + } + + s_arguments = ""; + for (int i = 0; i < argc; ++i) { + escape(s_arguments, argv[i]); + if (i + 1 < argc) { + s_arguments += " "; + } + } + + if (options.verbosity_flag) { + parse_args(argc, argv, options.verbosity_flag); + } + + if (const auto main_thread_name = options.main_thread_name) { +#if LOGURU_PTLS_NAMES || LOGURU_WINTHREADS + set_thread_name(main_thread_name); +#elif LOGURU_PTHREADS + char old_thread_name[16] = { 0 }; + auto this_thread = pthread_self(); +#if defined(__APPLE__) || defined(__linux__) || defined(__sun) + pthread_getname_np(this_thread, old_thread_name, sizeof(old_thread_name)); +#endif + if (old_thread_name[0] == 0) { +#ifdef __APPLE__ + pthread_setname_np(main_thread_name); +#elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(this_thread, main_thread_name); +#elif defined(__linux__) || defined(__sun) + pthread_setname_np(this_thread, main_thread_name); +#endif + } +#endif // LOGURU_PTHREADS + } + + if (g_stderr_verbosity >= Verbosity_INFO) { + if (g_preamble_header) { + char preamble_explain[LOGURU_PREAMBLE_WIDTH]; + print_preamble_header(preamble_explain, sizeof(preamble_explain)); + if (g_colorlogtostderr && s_terminal_has_color) { + fprintf(stderr, "%s%s%s\n", terminal_reset(), terminal_dim(), preamble_explain); + } else { + fprintf(stderr, "%s\n", preamble_explain); + } + } + fflush(stderr); + } + VLOG_F(g_internal_verbosity, "arguments: " LOGURU_FMT(s) "", s_arguments.c_str()); + if (strlen(s_current_dir) != 0) { + VLOG_F(g_internal_verbosity, "Current dir: " LOGURU_FMT(s) "", s_current_dir); + } + VLOG_F(g_internal_verbosity, "stderr verbosity: " LOGURU_FMT(d) "", g_stderr_verbosity); + VLOG_F(g_internal_verbosity, "-----------------------------------"); + + install_signal_handlers(options.signal_options); + + atexit(on_atexit); + } + + void shutdown() + { + VLOG_F(g_internal_verbosity, "loguru::shutdown()"); + remove_all_callbacks(); + set_fatal_handler(nullptr); + set_verbosity_to_name_callback(nullptr); + set_name_to_verbosity_callback(nullptr); + } + + void write_date_time(char* buff, unsigned long long buff_size) + { + auto now = system_clock::now(); + long long ms_since_epoch = duration_cast(now.time_since_epoch()).count(); + time_t sec_since_epoch = time_t(ms_since_epoch / 1000); + tm time_info; + localtime_r(&sec_since_epoch, &time_info); + snprintf(buff, buff_size, "%04d%02d%02d_%02d%02d%02d.%03lld", + 1900 + time_info.tm_year, 1 + time_info.tm_mon, time_info.tm_mday, + time_info.tm_hour, time_info.tm_min, time_info.tm_sec, ms_since_epoch % 1000); + } + + const char* argv0_filename() + { + return s_argv0_filename.c_str(); + } + + const char* arguments() + { + return s_arguments.c_str(); + } + + const char* current_dir() + { + return s_current_dir; + } + + const char* home_dir() + { +#ifdef __MINGW32__ + auto home = getenv("USERPROFILE"); + CHECK_F(home != nullptr, "Missing USERPROFILE"); + return home; +#elif defined(_WIN32) + char* user_profile; + size_t len; + errno_t err = _dupenv_s(&user_profile, &len, "USERPROFILE"); + CHECK_F(err == 0, "Missing USERPROFILE"); + return user_profile; +#else // _WIN32 + auto home = getenv("HOME"); + CHECK_F(home != nullptr, "Missing HOME"); + return home; +#endif // _WIN32 + } + + void suggest_log_path(const char* prefix, char* buff, unsigned long long buff_size) + { + if (prefix[0] == '~') { + snprintf(buff, buff_size - 1, "%s%s", home_dir(), prefix + 1); + } else { + snprintf(buff, buff_size - 1, "%s", prefix); + } + + // Check for terminating / + size_t n = strlen(buff); + if (n != 0) { + if (buff[n - 1] != '/') { + CHECK_F(n + 2 < buff_size, "Filename buffer too small"); + buff[n] = '/'; + buff[n + 1] = '\0'; + } + } + +#ifdef _WIN32 + strncat_s(buff, buff_size - strlen(buff) - 1, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); + strncat_s(buff, buff_size - strlen(buff) - 1, "/", buff_size - strlen(buff) - 1); + write_date_time(buff + strlen(buff), buff_size - strlen(buff)); + strncat_s(buff, buff_size - strlen(buff) - 1, ".log", buff_size - strlen(buff) - 1); +#else + strncat(buff, s_argv0_filename.c_str(), buff_size - strlen(buff) - 1); + strncat(buff, "/", buff_size - strlen(buff) - 1); + write_date_time(buff + strlen(buff), buff_size - strlen(buff)); + strncat(buff, ".log", buff_size - strlen(buff) - 1); +#endif + } + + bool create_directories(const char* file_path_const) + { + CHECK_F(file_path_const && *file_path_const); + char* file_path = STRDUP(file_path_const); + for (char* p = strchr(file_path + 1, '/'); p; p = strchr(p + 1, '/')) { + *p = '\0'; + +#ifdef _WIN32 + if (_mkdir(file_path) == -1) { +#else + if (mkdir(file_path, 0755) == -1) { +#endif + if (errno != EEXIST) { + LOG_F(ERROR, "Failed to create directory '" LOGURU_FMT(s) "'", file_path); + LOG_IF_F(ERROR, errno == EACCES, "EACCES"); + LOG_IF_F(ERROR, errno == ENAMETOOLONG, "ENAMETOOLONG"); + LOG_IF_F(ERROR, errno == ENOENT, "ENOENT"); + LOG_IF_F(ERROR, errno == ENOTDIR, "ENOTDIR"); + LOG_IF_F(ERROR, errno == ELOOP, "ELOOP"); + + *p = '/'; + free(file_path); + return false; + } + } + *p = '/'; + } + free(file_path); + return true; + } + bool add_file(const char* path_in, FileMode mode, Verbosity verbosity) + { + char path[PATH_MAX]; + if (path_in[0] == '~') { + snprintf(path, sizeof(path) - 1, "%s%s", home_dir(), path_in + 1); + } else { + snprintf(path, sizeof(path) - 1, "%s", path_in); + } + + if (!create_directories(path)) { + LOG_F(ERROR, "Failed to create directories to '" LOGURU_FMT(s) "'", path); + } + + const char* mode_str = (mode == FileMode::Truncate ? "w" : "a"); + FILE* file; +#ifdef _WIN32 + file = _fsopen(path, mode_str, _SH_DENYNO); +#else + file = fopen(path, mode_str); +#endif + if (!file) { + LOG_F(ERROR, "Failed to open '" LOGURU_FMT(s) "'", path); + return false; + } +#if LOGURU_WITH_FILEABS + FileAbs* file_abs = new FileAbs(); // this is deleted in file_close; + snprintf(file_abs->path, sizeof(file_abs->path) - 1, "%s", path); + snprintf(file_abs->mode_str, sizeof(file_abs->mode_str) - 1, "%s", mode_str); + stat(file_abs->path, &file_abs->st); + file_abs->fp = file; + file_abs->verbosity = verbosity; + add_callback(path_in, file_log, file_abs, verbosity, file_close, file_flush); +#else + add_callback(path_in, file_log, file, verbosity, file_close, file_flush); +#endif + + if (mode == FileMode::Append) { + fprintf(file, "\n\n\n\n\n"); + } + if (!s_arguments.empty()) { + fprintf(file, "arguments: %s\n", s_arguments.c_str()); + } + if (strlen(s_current_dir) != 0) { + fprintf(file, "Current dir: %s\n", s_current_dir); + } + fprintf(file, "File verbosity level: %d\n", verbosity); + if (g_preamble_header) { + char preamble_explain[LOGURU_PREAMBLE_WIDTH]; + print_preamble_header(preamble_explain, sizeof(preamble_explain)); + fprintf(file, "%s\n", preamble_explain); + } + fflush(file); + + VLOG_F(g_internal_verbosity, "Logging to '" LOGURU_FMT(s) "', mode: '" LOGURU_FMT(s) "', verbosity: " LOGURU_FMT(d) "", path, mode_str, verbosity); + return true; + } + + /* + Will add syslog as a standard sink for log messages + Any logging message with a verbosity lower or equal to + the given verbosity will be included. + + This works for Unix like systems (i.e. Linux/Mac) + There is no current implementation for Windows (as I don't know the + equivalent calls or have a way to test them). If you know please + add and send a pull request. + + The code should still compile under windows but will only generate + a warning message that syslog is unavailable. + + Search for LOGURU_SYSLOG to find and fix. + */ + bool add_syslog(const char* app_name, Verbosity verbosity) + { + return add_syslog(app_name, verbosity, LOG_USER); + } + bool add_syslog(const char* app_name, Verbosity verbosity, int facility) + { +#if LOGURU_SYSLOG + if (app_name == nullptr) { + app_name = argv0_filename(); + } + openlog(app_name, 0, facility); + add_callback("'syslog'", syslog_log, nullptr, verbosity, syslog_close, syslog_flush); + + VLOG_F(g_internal_verbosity, "Logging to 'syslog' , verbosity: " LOGURU_FMT(d) "", verbosity); + return true; +#else + (void)app_name; + (void)verbosity; + (void)facility; + VLOG_F(g_internal_verbosity, "syslog not implemented on this system. Request to install syslog logging ignored."); + return false; +#endif + } + // Will be called right before abort(). + void set_fatal_handler(fatal_handler_t handler) + { + s_fatal_handler = handler; + } + + fatal_handler_t get_fatal_handler() + { + return s_fatal_handler; + } + + void set_verbosity_to_name_callback(verbosity_to_name_t callback) + { + s_verbosity_to_name_callback = callback; + } + + void set_name_to_verbosity_callback(name_to_verbosity_t callback) + { + s_name_to_verbosity_callback = callback; + } + + void add_stack_cleanup(const char* find_this, const char* replace_with_this) + { + if (strlen(find_this) <= strlen(replace_with_this)) { + LOG_F(WARNING, "add_stack_cleanup: the replacement should be shorter than the pattern!"); + return; + } + + s_user_stack_cleanups.push_back(StringPair(find_this, replace_with_this)); + } + + static void on_callback_change() + { + s_max_out_verbosity = Verbosity_OFF; + for (const auto& callback : s_callbacks) { + s_max_out_verbosity = std::max(s_max_out_verbosity, callback.verbosity); + } + } + + void add_callback( + const char* id, + log_handler_t callback, + void* user_data, + Verbosity verbosity, + close_handler_t on_close, + flush_handler_t on_flush) + { + std::lock_guard lock(s_mutex); + s_callbacks.push_back(Callback{ id, callback, user_data, verbosity, on_close, on_flush, 0 }); + on_callback_change(); + } + + // Returns a custom verbosity name if one is available, or nullptr. + // See also set_verbosity_to_name_callback. + const char* get_verbosity_name(Verbosity verbosity) + { + auto name = s_verbosity_to_name_callback + ? (*s_verbosity_to_name_callback)(verbosity) + : nullptr; + + // Use standard replacements if callback fails: + if (!name) { + if (verbosity <= Verbosity_FATAL) { + name = "FATL"; + } else if (verbosity == Verbosity_ERROR) { + name = "ERR"; + } else if (verbosity == Verbosity_WARNING) { + name = "WARN"; + } else if (verbosity == Verbosity_INFO) { + name = "INFO"; + } + } + + return name; + } + + // Returns Verbosity_INVALID if the name is not found. + // See also set_name_to_verbosity_callback. + Verbosity get_verbosity_from_name(const char* name) + { + auto verbosity = s_name_to_verbosity_callback + ? (*s_name_to_verbosity_callback)(name) + : Verbosity_INVALID; + + // Use standard replacements if callback fails: + if (verbosity == Verbosity_INVALID) { + if (strcmp(name, "OFF") == 0) { + verbosity = Verbosity_OFF; + } else if (strcmp(name, "INFO") == 0) { + verbosity = Verbosity_INFO; + } else if (strcmp(name, "WARNING") == 0) { + verbosity = Verbosity_WARNING; + } else if (strcmp(name, "ERROR") == 0) { + verbosity = Verbosity_ERROR; + } else if (strcmp(name, "FATAL") == 0) { + verbosity = Verbosity_FATAL; + } + } + + return verbosity; + } + + bool remove_callback(const char* id) + { + std::lock_guard lock(s_mutex); + auto it = std::find_if(begin(s_callbacks), end(s_callbacks), [&](const Callback& c) { return c.id == id; }); + if (it != s_callbacks.end()) { + if (it->close) { it->close(it->user_data); } + s_callbacks.erase(it); + on_callback_change(); + return true; + } else { + LOG_F(ERROR, "Failed to locate callback with id '" LOGURU_FMT(s) "'", id); + return false; + } + } + + void remove_all_callbacks() + { + std::lock_guard lock(s_mutex); + for (auto& callback : s_callbacks) { + if (callback.close) { + callback.close(callback.user_data); + } + } + s_callbacks.clear(); + on_callback_change(); + } + + // Returns the maximum of g_stderr_verbosity and all file/custom outputs. + Verbosity current_verbosity_cutoff() + { + return g_stderr_verbosity > s_max_out_verbosity ? + g_stderr_verbosity : s_max_out_verbosity; + } + + // ------------------------------------------------------------------------ + // Threads names + +#if LOGURU_PTLS_NAMES + static pthread_once_t s_pthread_key_once = PTHREAD_ONCE_INIT; + static pthread_key_t s_pthread_key_name; + + void make_pthread_key_name() + { + (void)pthread_key_create(&s_pthread_key_name, free); + } +#endif + +#if LOGURU_WINTHREADS + // Where we store the custom thread name set by `set_thread_name` + char* thread_name_buffer() + { + __declspec(thread) static char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { 0 }; + return &thread_name[0]; + } +#endif // LOGURU_WINTHREADS + + void set_thread_name(const char* name) + { +#if LOGURU_PTLS_NAMES + // Store thread name in thread-local storage at `s_pthread_key_name` + (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); + (void)pthread_setspecific(s_pthread_key_name, STRDUP(name)); +#elif LOGURU_PTHREADS + // Tell the OS the thread name +#ifdef __APPLE__ + pthread_setname_np(name); +#elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(pthread_self(), name); +#elif defined(__linux__) || defined(__sun) + pthread_setname_np(pthread_self(), name); +#endif +#elif LOGURU_WINTHREADS + // Store thread name in a thread-local storage: + strncpy_s(thread_name_buffer(), LOGURU_THREADNAME_WIDTH + 1, name, _TRUNCATE); +#else // LOGURU_PTHREADS + // TODO: on these weird platforms we should also store the thread name + // in a generic thread-local storage. + (void)name; +#endif // LOGURU_PTHREADS + } + + void get_thread_name(char* buffer, unsigned long long length, bool right_align_hex_id) + { + CHECK_NE_F(length, 0u, "Zero length buffer in get_thread_name"); + CHECK_NOTNULL_F(buffer, "nullptr in get_thread_name"); + +#if LOGURU_PTLS_NAMES + (void)pthread_once(&s_pthread_key_once, make_pthread_key_name); + if (const char* name = static_cast(pthread_getspecific(s_pthread_key_name))) { + snprintf(buffer, static_cast(length), "%s", name); + } else { + buffer[0] = 0; + } +#elif LOGURU_PTHREADS + // Ask the OS about the thread name. + // This is what we *want* to do on all platforms, but + // only some platforms support it (currently). + pthread_getname_np(pthread_self(), buffer, length); +#elif LOGURU_WINTHREADS + snprintf(buffer, static_cast(length), "%s", thread_name_buffer()); +#else + // Thread names unsupported + buffer[0] = 0; +#endif + + if (buffer[0] == 0) { + // We failed to get a readable thread name. + // Write a HEX thread ID instead. + // We try to get an ID that is the same as the ID you could + // read in your debugger, system monitor etc. + +#ifdef __APPLE__ + uint64_t thread_id; + pthread_threadid_np(pthread_self(), &thread_id); +#elif defined(__FreeBSD__) + long thread_id; + (void)thr_self(&thread_id); +#elif LOGURU_PTHREADS + uint64_t thread_id = pthread_self(); +#else + // This ID does not correllate to anything we can get from the OS, + // so this is the worst way to get the ID. + const auto thread_id = std::hash{}(std::this_thread::get_id()); +#endif + + if (right_align_hex_id) { + snprintf(buffer, static_cast(length), "%*X", static_cast(length - 1), static_cast(thread_id)); + } else { + snprintf(buffer, static_cast(length), "%X", static_cast(thread_id)); + } + } + } + + // ------------------------------------------------------------------------ + // Stack traces + +#if LOGURU_STACKTRACES + Text demangle(const char* name) + { + int status = -1; + char* demangled = abi::__cxa_demangle(name, 0, 0, &status); + Text result{ status == 0 ? demangled : STRDUP(name) }; + return result; + } + +#if LOGURU_RTTI + template + std::string type_name() + { + auto demangled = demangle(typeid(T).name()); + return demangled.c_str(); + } +#endif // LOGURU_RTTI + + static const StringPairList REPLACE_LIST = { + #if LOGURU_RTTI + { type_name(), "std::string" }, + { type_name(), "std::wstring" }, + { type_name(), "std::u16string" }, + { type_name(), "std::u32string" }, + #endif // LOGURU_RTTI + { "std::__1::", "std::" }, + { "__thiscall ", "" }, + { "__cdecl ", "" }, + }; + + void do_replacements(const StringPairList & replacements, std::string & str) + { + for (auto&& p : replacements) { + if (p.first.size() <= p.second.size()) { + // On gcc, "type_name()" is "std::string" + continue; + } + + size_t it; + while ((it = str.find(p.first)) != std::string::npos) { + str.replace(it, p.first.size(), p.second); + } + } + } + + std::string prettify_stacktrace(const std::string & input) + { + std::string output = input; + + do_replacements(s_user_stack_cleanups, output); + do_replacements(REPLACE_LIST, output); + + try { + std::regex std_allocator_re(R"(,\s*std::allocator<[^<>]+>)"); + output = std::regex_replace(output, std_allocator_re, std::string("")); + + std::regex template_spaces_re(R"(<\s*([^<> ]+)\s*>)"); + output = std::regex_replace(output, template_spaces_re, std::string("<$1>")); + } + catch (std::regex_error&) { + // Probably old GCC. + } + + return output; + } + + std::string stacktrace_as_stdstring(int skip) + { + // From https://gist.github.com/fmela/591333 + void* callstack[128]; + const auto max_frames = sizeof(callstack) / sizeof(callstack[0]); + int num_frames = backtrace(callstack, max_frames); + char** symbols = backtrace_symbols(callstack, num_frames); + + std::string result; + // Print stack traces so the most relevant ones are written last + // Rationale: http://yellerapp.com/posts/2015-01-22-upside-down-stacktraces.html + for (int i = num_frames - 1; i >= skip; --i) { + char buf[1024]; + Dl_info info; + if (dladdr(callstack[i], &info) && info.dli_sname) { + char* demangled = NULL; + int status = -1; + if (info.dli_sname[0] == '_') { + demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); + } + snprintf(buf, sizeof(buf), "%-3d %*p %s + %zd\n", + i - skip, int(2 + sizeof(void*) * 2), callstack[i], + status == 0 ? demangled : + info.dli_sname == 0 ? symbols[i] : info.dli_sname, + static_cast(callstack[i]) - static_cast(info.dli_saddr)); + free(demangled); + } else { + snprintf(buf, sizeof(buf), "%-3d %*p %s\n", + i - skip, int(2 + sizeof(void*) * 2), callstack[i], symbols[i]); + } + result += buf; + } + free(symbols); + + if (num_frames == max_frames) { + result = "[truncated]\n" + result; + } + + if (!result.empty() && result[result.size() - 1] == '\n') { + result.resize(result.size() - 1); + } + + return prettify_stacktrace(result); + } + +#else // LOGURU_STACKTRACES + Text demangle(const char* name) + { + return Text(STRDUP(name)); + } + + std::string stacktrace_as_stdstring(int) + { + // No stacktraces available on this platform" + return ""; + } + +#endif // LOGURU_STACKTRACES + + Text stacktrace(int skip) + { + auto str = stacktrace_as_stdstring(skip + 1); + return Text(STRDUP(str.c_str())); + } + + // ------------------------------------------------------------------------ + + static void print_preamble_header(char* out_buff, size_t out_buff_size) + { + if (out_buff_size == 0) { return; } + out_buff[0] = '\0'; + size_t pos = 0; + if (g_preamble_date && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "date "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_time && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "time "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_uptime && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "( uptime ) "); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_thread && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", LOGURU_THREADNAME_WIDTH, " thread name/id"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_file && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:line ", LOGURU_FILENAME_WIDTH, "file"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_verbose && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, " v"); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_pipe && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); + if (bytes > 0) { + pos += bytes; + } + } + } + + static void print_preamble(char* out_buff, size_t out_buff_size, Verbosity verbosity, const char* file, unsigned line) + { + if (out_buff_size == 0) { return; } + out_buff[0] = '\0'; + if (!g_preamble) { return; } + long long ms_since_epoch = duration_cast(system_clock::now().time_since_epoch()).count(); + time_t sec_since_epoch = time_t(ms_since_epoch / 1000); + tm time_info; + localtime_r(&sec_since_epoch, &time_info); + + auto uptime_ms = duration_cast(steady_clock::now() - s_start_time).count(); + auto uptime_sec = static_cast (uptime_ms) / 1000.0; + + char thread_name[LOGURU_THREADNAME_WIDTH + 1] = { 0 }; + get_thread_name(thread_name, LOGURU_THREADNAME_WIDTH + 1, true); + + if (s_strip_file_path) { + file = filename(file); + } + + char level_buff[6]; + const char* custom_level_name = get_verbosity_name(verbosity); + if (custom_level_name) { + snprintf(level_buff, sizeof(level_buff) - 1, "%s", custom_level_name); + } else { + snprintf(level_buff, sizeof(level_buff) - 1, "% 4d", static_cast(verbosity)); + } + + size_t pos = 0; + + if (g_preamble_date && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%04d-%02d-%02d ", + 1900 + time_info.tm_year, 1 + time_info.tm_mon, time_info.tm_mday); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_time && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%02d:%02d:%02d.%03lld ", + time_info.tm_hour, time_info.tm_min, time_info.tm_sec, ms_since_epoch % 1000); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_uptime && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "(%8.3fs) ", + uptime_sec); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_thread && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", + LOGURU_THREADNAME_WIDTH, thread_name); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_file && pos < out_buff_size) { + char shortened_filename[LOGURU_FILENAME_WIDTH + 1]; + snprintf(shortened_filename, LOGURU_FILENAME_WIDTH + 1, "%s", file); + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:%-5u ", + LOGURU_FILENAME_WIDTH, shortened_filename, line); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_verbose && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%4s", + level_buff); + if (bytes > 0) { + pos += bytes; + } + } + if (g_preamble_pipe && pos < out_buff_size) { + int bytes = snprintf(out_buff + pos, out_buff_size - pos, "| "); + if (bytes > 0) { + pos += bytes; + } + } + } + + // stack_trace_skip is just if verbosity == FATAL. + static void log_message(int stack_trace_skip, Message & message, bool with_indentation, bool abort_if_fatal) + { + const auto verbosity = message.verbosity; + std::lock_guard lock(s_mutex); + + if (message.verbosity == Verbosity_FATAL) { + auto st = loguru::stacktrace(stack_trace_skip + 2); + if (!st.empty()) { + RAW_LOG_F(ERROR, "Stack trace:\n" LOGURU_FMT(s) "", st.c_str()); + } + + auto ec = loguru::get_error_context(); + if (!ec.empty()) { + RAW_LOG_F(ERROR, "" LOGURU_FMT(s) "", ec.c_str()); + } + } + + if (with_indentation) { + message.indentation = indentation(s_stderr_indentation); + } + + if (verbosity <= g_stderr_verbosity) { + if (g_colorlogtostderr && s_terminal_has_color) { + if (verbosity > Verbosity_WARNING) { + fprintf(stderr, "%s%s%s%s%s%s%s%s\n", + terminal_reset(), + terminal_dim(), + message.preamble, + message.indentation, + verbosity == Verbosity_INFO ? terminal_reset() : "", // un-dim for info + message.prefix, + message.message, + terminal_reset()); + } else { + fprintf(stderr, "%s%s%s%s%s%s%s\n", + terminal_reset(), + verbosity == Verbosity_WARNING ? terminal_yellow() : terminal_red(), + message.preamble, + message.indentation, + message.prefix, + message.message, + terminal_reset()); + } + } else { + fprintf(stderr, "%s%s%s%s\n", + message.preamble, message.indentation, message.prefix, message.message); + } + + if (g_flush_interval_ms == 0) { + fflush(stderr); + } else { + s_needs_flushing = true; + } + } + + for (auto& p : s_callbacks) { + if (verbosity <= p.verbosity) { + if (with_indentation) { + message.indentation = indentation(p.indentation); + } + p.callback(p.user_data, message); + if (g_flush_interval_ms == 0) { + if (p.flush) { p.flush(p.user_data); } + } else { + s_needs_flushing = true; + } + } + } + + if (g_flush_interval_ms > 0 && !s_flush_thread) { + s_flush_thread = new std::thread([]() { + for (;;) { + if (s_needs_flushing) { + flush(); + } + std::this_thread::sleep_for(std::chrono::milliseconds(g_flush_interval_ms)); + } + }); + } + + if (message.verbosity == Verbosity_FATAL) { + flush(); + + if (s_fatal_handler) { + s_fatal_handler(message); + flush(); + } + + if (abort_if_fatal) { +#if !defined(_WIN32) + if (s_signal_options.sigabrt) { + // Make sure we don't catch our own abort: + signal(SIGABRT, SIG_DFL); + } +#endif + abort(); + } + } + } + + // stack_trace_skip is just if verbosity == FATAL. + void log_to_everywhere(int stack_trace_skip, Verbosity verbosity, + const char* file, unsigned line, + const char* prefix, const char* buff) + { + char preamble_buff[LOGURU_PREAMBLE_WIDTH]; + print_preamble(preamble_buff, sizeof(preamble_buff), verbosity, file, line); + auto message = Message{ verbosity, file, line, preamble_buff, "", prefix, buff }; + log_message(stack_trace_skip + 1, message, true, true); + } + +#if LOGURU_USE_FMTLIB + void vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, fmt::format_args args) + { + auto formatted = fmt::vformat(format, args); + log_to_everywhere(1, verbosity, file, line, "", formatted.c_str()); + } + + void raw_vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, fmt::format_args args) + { + auto formatted = fmt::vformat(format, args); + auto message = Message{ verbosity, file, line, "", "", "", formatted.c_str() }; + log_message(1, message, false, true); + } +#else + void log(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) + { + va_list vlist; + va_start(vlist, format); + vlog(verbosity, file, line, format, vlist); + va_end(vlist); + } + + void vlog(Verbosity verbosity, const char* file, unsigned line, const char* format, va_list vlist) + { + auto buff = vtextprintf(format, vlist); + log_to_everywhere(1, verbosity, file, line, "", buff.c_str()); + } + + void raw_log(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) + { + va_list vlist; + va_start(vlist, format); + auto buff = vtextprintf(format, vlist); + auto message = Message{ verbosity, file, line, "", "", "", buff.c_str() }; + log_message(1, message, false, true); + va_end(vlist); + } +#endif + + void flush() + { + std::lock_guard lock(s_mutex); + fflush(stderr); + for (const auto& callback : s_callbacks) { + if (callback.flush) { + callback.flush(callback.user_data); + } + } + s_needs_flushing = false; + } + + LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, const char* format, va_list vlist) : + _verbosity(verbosity), _file(file), _line(line) + { + this->Init(format, vlist); + } + + LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, const char* format, ...) : + _verbosity(verbosity), _file(file), _line(line) + { + va_list vlist; + va_start(vlist, format); + this->Init(format, vlist); + va_end(vlist); + } + + LogScopeRAII::~LogScopeRAII() + { + if (_file) { + std::lock_guard lock(s_mutex); + if (_indent_stderr && s_stderr_indentation > 0) { + --s_stderr_indentation; + } + for (auto& p : s_callbacks) { + // Note: Callback indentation cannot change! + if (_verbosity <= p.verbosity) { + // in unlikely case this callback is new + if (p.indentation > 0) { + --p.indentation; + } + } + } +#if LOGURU_VERBOSE_SCOPE_ENDINGS + auto duration_sec = static_cast(now_ns() - _start_time_ns) / 1e9; +#if LOGURU_USE_FMTLIB + auto buff = textprintf("{:.{}f} s: {:s}", duration_sec, LOGURU_SCOPE_TIME_PRECISION, _name); +#else + auto buff = textprintf("%.*f s: %s", LOGURU_SCOPE_TIME_PRECISION, duration_sec, _name); +#endif + log_to_everywhere(1, _verbosity, _file, _line, "} ", buff.c_str()); +#else + log_to_everywhere(1, _verbosity, _file, _line, "}", ""); +#endif + } + } + + void LogScopeRAII::Init(const char* format, va_list vlist) + { + if (_verbosity <= current_verbosity_cutoff()) { + std::lock_guard lock(s_mutex); + _indent_stderr = (_verbosity <= g_stderr_verbosity); + _start_time_ns = now_ns(); + vsnprintf(_name, sizeof(_name), format, vlist); + log_to_everywhere(1, _verbosity, _file, _line, "{ ", _name); + + if (_indent_stderr) { + ++s_stderr_indentation; + } + + for (auto& p : s_callbacks) { + if (_verbosity <= p.verbosity) { + ++p.indentation; + } + } + } else { + _file = nullptr; + } + } + +#if LOGURU_USE_FMTLIB + void vlog_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, const char* format, fmt::format_args args) + { + auto formatted = fmt::vformat(format, args); + log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, formatted.c_str()); + abort(); // log_to_everywhere already does this, but this makes the analyzer happy. + } +#else + void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, const char* format, ...) + { + va_list vlist; + va_start(vlist, format); + auto buff = vtextprintf(format, vlist); + log_to_everywhere(stack_trace_skip + 1, Verbosity_FATAL, file, line, expr, buff.c_str()); + va_end(vlist); + abort(); // log_to_everywhere already does this, but this makes the analyzer happy. + } +#endif + + void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line) + { + log_and_abort(stack_trace_skip + 1, expr, file, line, " "); + } + + // ---------------------------------------------------------------------------- + // Streams: + +#if LOGURU_USE_FMTLIB + template + std::string vstrprintf(const char* format, const Args&... args) + { + auto text = textprintf(format, args...); + std::string result = text.c_str(); + return result; + } + + template + std::string strprintf(const char* format, const Args&... args) + { + return vstrprintf(format, args...); + } +#else + std::string vstrprintf(const char* format, va_list vlist) + { + auto text = vtextprintf(format, vlist); + std::string result = text.c_str(); + return result; + } + + std::string strprintf(const char* format, ...) + { + va_list vlist; + va_start(vlist, format); + auto result = vstrprintf(format, vlist); + va_end(vlist); + return result; + } +#endif + +#if LOGURU_WITH_STREAMS + + StreamLogger::~StreamLogger() noexcept(false) + { + auto message = _ss.str(); + log(_verbosity, _file, _line, LOGURU_FMT(s), message.c_str()); + } + + AbortLogger::~AbortLogger() noexcept(false) + { + auto message = _ss.str(); + loguru::log_and_abort(1, _expr, _file, _line, LOGURU_FMT(s), message.c_str()); + } + +#endif // LOGURU_WITH_STREAMS + + // ---------------------------------------------------------------------------- + // 888888 88""Yb 88""Yb dP"Yb 88""Yb dP""b8 dP"Yb 88b 88 888888 888888 Yb dP 888888 + // 88__ 88__dP 88__dP dP Yb 88__dP dP `" dP Yb 88Yb88 88 88__ YbdP 88 + // 88"" 88"Yb 88"Yb Yb dP 88"Yb Yb Yb dP 88 Y88 88 88"" dPYb 88 + // 888888 88 Yb 88 Yb YbodP 88 Yb YboodP YbodP 88 Y8 88 888888 dP Yb 88 + // ---------------------------------------------------------------------------- + + struct StringStream { + std::string str; + }; + + // Use this in your EcPrinter implementations. + void stream_print(StringStream & out_string_stream, const char* text) + { + out_string_stream.str += text; + } + + // ---------------------------------------------------------------------------- + + using ECPtr = EcEntryBase*; + +#if defined(_WIN32) || (defined(__APPLE__) && !TARGET_OS_IPHONE) +#ifdef __APPLE__ +#define LOGURU_THREAD_LOCAL __thread +#else +#define LOGURU_THREAD_LOCAL thread_local +#endif + static LOGURU_THREAD_LOCAL ECPtr thread_ec_ptr = nullptr; + + ECPtr& get_thread_ec_head_ref() + { + return thread_ec_ptr; + } +#else // !thread_local + static pthread_once_t s_ec_pthread_once = PTHREAD_ONCE_INIT; + static pthread_key_t s_ec_pthread_key; + + void free_ec_head_ref(void* io_error_context) + { + delete reinterpret_cast(io_error_context); + } + + void ec_make_pthread_key() + { + (void)pthread_key_create(&s_ec_pthread_key, free_ec_head_ref); + } + + ECPtr& get_thread_ec_head_ref() + { + (void)pthread_once(&s_ec_pthread_once, ec_make_pthread_key); + auto ec = reinterpret_cast(pthread_getspecific(s_ec_pthread_key)); + if (ec == nullptr) { + ec = new ECPtr(nullptr); + (void)pthread_setspecific(s_ec_pthread_key, ec); + } + return *ec; + } +#endif // !thread_local + + // ---------------------------------------------------------------------------- + + EcHandle get_thread_ec_handle() + { + return get_thread_ec_head_ref(); + } + + Text get_error_context() + { + return get_error_context_for(get_thread_ec_head_ref()); + } + + Text get_error_context_for(const EcEntryBase * ec_head) + { + std::vector stack; + while (ec_head) { + stack.push_back(ec_head); + ec_head = ec_head->_previous; + } + std::reverse(stack.begin(), stack.end()); + + StringStream result; + if (!stack.empty()) { + result.str += "------------------------------------------------\n"; + for (auto entry : stack) { + const auto description = std::string(entry->_descr) + ":"; +#if LOGURU_USE_FMTLIB + auto prefix = textprintf("[ErrorContext] {.{}s}:{:-5u} {:-20s} ", + filename(entry->_file), LOGURU_FILENAME_WIDTH, entry->_line, description.c_str()); +#else + auto prefix = textprintf("[ErrorContext] %*s:%-5u %-20s ", + LOGURU_FILENAME_WIDTH, filename(entry->_file), entry->_line, description.c_str()); +#endif + result.str += prefix.c_str(); + entry->print_value(result); + result.str += "\n"; + } + result.str += "------------------------------------------------"; + } + return Text(STRDUP(result.str.c_str())); + } + + EcEntryBase::EcEntryBase(const char* file, unsigned line, const char* descr) + : _file(file), _line(line), _descr(descr) + { + EcEntryBase*& ec_head = get_thread_ec_head_ref(); + _previous = ec_head; + ec_head = this; + } + + EcEntryBase::~EcEntryBase() + { + get_thread_ec_head_ref() = _previous; + } + + // ------------------------------------------------------------------------ + + Text ec_to_text(const char* value) + { + // Add quotes around the string to make it obvious where it begin and ends. + // This is great for detecting erroneous leading or trailing spaces in e.g. an identifier. + auto str = "\"" + std::string(value) + "\""; + return Text{ STRDUP(str.c_str()) }; + } + + Text ec_to_text(char c) + { + // Add quotes around the character to make it obvious where it begin and ends. + std::string str = "'"; + + auto write_hex_digit = [&](unsigned num) + { + if (num < 10u) { str += char('0' + num); } else { str += char('a' + num - 10); } + }; + + auto write_hex_16 = [&](uint16_t n) + { + write_hex_digit((n >> 12u) & 0x0f); + write_hex_digit((n >> 8u) & 0x0f); + write_hex_digit((n >> 4u) & 0x0f); + write_hex_digit((n >> 0u) & 0x0f); + }; + + if (c == '\\') { str += "\\\\"; } else if (c == '\"') { str += "\\\""; } else if (c == '\'') { str += "\\\'"; } else if (c == '\0') { str += "\\0"; } else if (c == '\b') { str += "\\b"; } else if (c == '\f') { str += "\\f"; } else if (c == '\n') { str += "\\n"; } else if (c == '\r') { str += "\\r"; } else if (c == '\t') { str += "\\t"; } else if (0 <= c && c < 0x20) { + str += "\\u"; + write_hex_16(static_cast(c)); + } else { str += c; } + + str += "'"; + + return Text{ STRDUP(str.c_str()) }; + } + +#define DEFINE_EC(Type) \ + Text ec_to_text(Type value) \ + { \ + auto str = std::to_string(value); \ + return Text{STRDUP(str.c_str())}; \ + } + + DEFINE_EC(int) + DEFINE_EC(unsigned int) + DEFINE_EC(long) + DEFINE_EC(unsigned long) + DEFINE_EC(long long) + DEFINE_EC(unsigned long long) + DEFINE_EC(float) + DEFINE_EC(double) + DEFINE_EC(long double) + +#undef DEFINE_EC + + Text ec_to_text(EcHandle ec_handle) + { + Text parent_ec = get_error_context_for(ec_handle); + size_t buffer_size = strlen(parent_ec.c_str()) + 2; + char* with_newline = reinterpret_cast(malloc(buffer_size)); + with_newline[0] = '\n'; +#ifdef _WIN32 + strncpy_s(with_newline + 1, buffer_size, parent_ec.c_str(), buffer_size - 2); +#else + strcpy(with_newline + 1, parent_ec.c_str()); +#endif + return Text(with_newline); + } + + // ---------------------------------------------------------------------------- + +} // namespace loguru + +// ---------------------------------------------------------------------------- +// .dP"Y8 88 dP""b8 88b 88 db 88 .dP"Y8 +// `Ybo." 88 dP `" 88Yb88 dPYb 88 `Ybo." +// o.`Y8b 88 Yb "88 88 Y88 dP__Yb 88 .o o.`Y8b +// 8bodP' 88 YboodP 88 Y8 dP""""Yb 88ood8 8bodP' +// ---------------------------------------------------------------------------- + +#ifdef _WIN32 +namespace loguru { + void install_signal_handlers(const SignalOptions& signal_options) + { + (void)signal_options; + // TODO: implement signal handlers on windows + } +} // namespace loguru + +#else // _WIN32 + +namespace loguru { + void write_to_stderr(const char* data, size_t size) + { + auto result = write(STDERR_FILENO, data, size); + (void)result; // Ignore errors. + } + + void write_to_stderr(const char* data) + { + write_to_stderr(data, strlen(data)); + } + + void call_default_signal_handler(int signal_number) + { + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_handler = SIG_DFL; + sigaction(signal_number, &sig_action, NULL); + kill(getpid(), signal_number); + } + + void signal_handler(int signal_number, siginfo_t*, void*) + { + const char* signal_name = "UNKNOWN SIGNAL"; + + if (signal_number == SIGABRT) { signal_name = "SIGABRT"; } + if (signal_number == SIGBUS) { signal_name = "SIGBUS"; } + if (signal_number == SIGFPE) { signal_name = "SIGFPE"; } + if (signal_number == SIGILL) { signal_name = "SIGILL"; } + if (signal_number == SIGINT) { signal_name = "SIGINT"; } + if (signal_number == SIGSEGV) { signal_name = "SIGSEGV"; } + if (signal_number == SIGTERM) { signal_name = "SIGTERM"; } + + // -------------------------------------------------------------------- + /* There are few things that are safe to do in a signal handler, + but writing to stderr is one of them. + So we first print out what happened to stderr so we're sure that gets out, + then we do the unsafe things, like logging the stack trace. + */ + + if (g_colorlogtostderr && s_terminal_has_color) { + write_to_stderr(terminal_reset()); + write_to_stderr(terminal_bold()); + write_to_stderr(terminal_light_red()); + } + write_to_stderr("\n"); + write_to_stderr("Loguru caught a signal: "); + write_to_stderr(signal_name); + write_to_stderr("\n"); + if (g_colorlogtostderr && s_terminal_has_color) { + write_to_stderr(terminal_reset()); + } + + // -------------------------------------------------------------------- + + if (s_signal_options.unsafe_signal_handler) { + // -------------------------------------------------------------------- + /* Now we do unsafe things. This can for example lead to deadlocks if + the signal was triggered from the system's memory management functions + and the code below tries to do allocations. + */ + + flush(); + char preamble_buff[LOGURU_PREAMBLE_WIDTH]; + print_preamble(preamble_buff, sizeof(preamble_buff), Verbosity_FATAL, "", 0); + auto message = Message{ Verbosity_FATAL, "", 0, preamble_buff, "", "Signal: ", signal_name }; + try { + log_message(1, message, false, false); + } + catch (...) { + // This can happed due to s_fatal_handler. + write_to_stderr("Exception caught and ignored by Loguru signal handler.\n"); + } + flush(); + + // -------------------------------------------------------------------- + } + + call_default_signal_handler(signal_number); + } + + void install_signal_handlers(const SignalOptions& signal_options) + { + s_signal_options = signal_options; + + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_flags |= SA_SIGINFO; + sig_action.sa_sigaction = &signal_handler; + + if (signal_options.sigabrt) { + CHECK_F(sigaction(SIGABRT, &sig_action, NULL) != -1, "Failed to install handler for SIGABRT"); + } + if (signal_options.sigbus) { + CHECK_F(sigaction(SIGBUS, &sig_action, NULL) != -1, "Failed to install handler for SIGBUS"); + } + if (signal_options.sigfpe) { + CHECK_F(sigaction(SIGFPE, &sig_action, NULL) != -1, "Failed to install handler for SIGFPE"); + } + if (signal_options.sigill) { + CHECK_F(sigaction(SIGILL, &sig_action, NULL) != -1, "Failed to install handler for SIGILL"); + } + if (signal_options.sigint) { + CHECK_F(sigaction(SIGINT, &sig_action, NULL) != -1, "Failed to install handler for SIGINT"); + } + if (signal_options.sigsegv) { + CHECK_F(sigaction(SIGSEGV, &sig_action, NULL) != -1, "Failed to install handler for SIGSEGV"); + } + if (signal_options.sigterm) { + CHECK_F(sigaction(SIGTERM, &sig_action, NULL) != -1, "Failed to install handler for SIGTERM"); + } + } +} // namespace loguru + +#endif // _WIN32 + + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#elif defined(_MSC_VER) +#pragma warning(pop) +#endif + +LOGURU_ANONYMOUS_NAMESPACE_END + +#endif // LOGURU_IMPLEMENTATION diff --git a/lib/log/loguru.hpp b/lib/log/loguru.hpp new file mode 100644 index 0000000..8917b79 --- /dev/null +++ b/lib/log/loguru.hpp @@ -0,0 +1,1475 @@ +/* +Loguru logging library for C++, by Emil Ernerfeldt. +www.github.com/emilk/loguru +If you find Loguru useful, please let me know on twitter or in a mail! +Twitter: @ernerfeldt +Mail: emil.ernerfeldt@gmail.com +Website: www.ilikebigbits.com + +# License + This software is in the public domain. Where that dedication is not + recognized, you are granted a perpetual, irrevocable license to + copy, modify and distribute it as you see fit. + +# Inspiration + Much of Loguru was inspired by GLOG, https://code.google.com/p/google-glog/. + The choice of public domain is fully due Sean T. Barrett + and his wonderful stb libraries at https://github.com/nothings/stb. + +# Version history + * Version 0.1.0 - 2015-03-22 - Works great on Mac. + * Version 0.2.0 - 2015-09-17 - Removed the only dependency. + * Version 0.3.0 - 2015-10-02 - Drop-in replacement for most of GLOG + * Version 0.4.0 - 2015-10-07 - Single-file! + * Version 0.5.0 - 2015-10-17 - Improved file logging + * Version 0.6.0 - 2015-10-24 - Add stack traces + * Version 0.7.0 - 2015-10-27 - Signals + * Version 0.8.0 - 2015-10-30 - Color logging. + * Version 0.9.0 - 2015-11-26 - ABORT_S and proper handling of FATAL + * Version 1.0.0 - 2016-02-14 - ERROR_CONTEXT + * Version 1.1.0 - 2016-02-19 - -v OFF, -v INFO etc + * Version 1.1.1 - 2016-02-20 - textprintf vs strprintf + * Version 1.1.2 - 2016-02-22 - Remove g_alsologtostderr + * Version 1.1.3 - 2016-02-29 - ERROR_CONTEXT as linked list + * Version 1.2.0 - 2016-03-19 - Add get_thread_name() + * Version 1.2.1 - 2016-03-20 - Minor fixes + * Version 1.2.2 - 2016-03-29 - Fix issues with set_fatal_handler throwing an exception + * Version 1.2.3 - 2016-05-16 - Log current working directory in loguru::init(). + * Version 1.2.4 - 2016-05-18 - Custom replacement for -v in loguru::init() by bjoernpollex + * Version 1.2.5 - 2016-05-18 - Add ability to print ERROR_CONTEXT of parent thread. + * Version 1.2.6 - 2016-05-19 - Bug fix regarding VLOG verbosity argument lacking (). + * Version 1.2.7 - 2016-05-23 - Fix PATH_MAX problem. + * Version 1.2.8 - 2016-05-26 - Add shutdown() and remove_all_callbacks() + * Version 1.2.9 - 2016-06-09 - Use a monotonic clock for uptime. + * Version 1.3.0 - 2016-07-20 - Fix issues with callback flush/close not being called. + * Version 1.3.1 - 2016-07-20 - Add LOGURU_UNSAFE_SIGNAL_HANDLER to toggle stacktrace on signals. + * Version 1.3.2 - 2016-07-20 - Add loguru::arguments() + * Version 1.4.0 - 2016-09-15 - Semantic versioning + add loguru::create_directories + * Version 1.4.1 - 2016-09-29 - Customize formating with LOGURU_FILENAME_WIDTH + * Version 1.5.0 - 2016-12-22 - LOGURU_USE_FMTLIB by kolis and LOGURU_WITH_FILEABS by scinart + * Version 1.5.1 - 2017-08-08 - Terminal colors on Windows 10 thanks to looki + * Version 1.6.0 - 2018-01-03 - Add LOGURU_RTTI and LOGURU_STACKTRACES settings + * Version 1.7.0 - 2018-01-03 - Add ability to turn off the preamble with loguru::g_preamble + * Version 1.7.1 - 2018-04-05 - Add function get_fatal_handler + * Version 1.7.2 - 2018-04-22 - Fix a bug where large file names could cause stack corruption (thanks @ccamporesi) + * Version 1.8.0 - 2018-04-23 - Shorten long file names to keep preamble fixed width + * Version 1.9.0 - 2018-09-22 - Adjust terminal colors, add LOGURU_VERBOSE_SCOPE_ENDINGS, add LOGURU_SCOPE_TIME_PRECISION, add named log levels + * Version 2.0.0 - 2018-09-22 - Split loguru.hpp into loguru.hpp and loguru.cpp + * Version 2.1.0 - 2019-09-23 - Update fmtlib + add option to loguru::init to NOT set main thread name. + * Version 2.2.0 - 2020-07-31 - Replace LOGURU_CATCH_SIGABRT with struct SignalOptions + +# Compiling + Just include where you want to use Loguru. + Then, in one .cpp file #include + Make sure you compile with -std=c++11 -lstdc++ -lpthread -ldl + +# Usage + For details, please see the official documentation at emilk.github.io/loguru + + #include + + int main(int argc, char* argv[]) { + loguru::init(argc, argv); + + // Put every log message in "everything.log": + loguru::add_file("everything.log", loguru::Append, loguru::Verbosity_MAX); + + LOG_F(INFO, "The magic number is %d", 42); + } + +*/ + +#if defined(LOGURU_IMPLEMENTATION) +#error "You are defining LOGURU_IMPLEMENTATION. This is for older versions of Loguru. You should now instead include loguru.cpp (or build it and link with it)" +#endif + +// Disable all warnings from gcc/clang: +#if defined(__clang__) +#pragma clang system_header +#elif defined(__GNUC__) +#pragma GCC system_header +#endif + +#ifndef LOGURU_HAS_DECLARED_FORMAT_HEADER +#define LOGURU_HAS_DECLARED_FORMAT_HEADER + +// Semantic versioning. Loguru version can be printed with printf("%d.%d.%d", LOGURU_VERSION_MAJOR, LOGURU_VERSION_MINOR, LOGURU_VERSION_PATCH); +#define LOGURU_VERSION_MAJOR 2 +#define LOGURU_VERSION_MINOR 1 +#define LOGURU_VERSION_PATCH 0 + +#if defined(_MSC_VER) +#include // Needed for _In_z_ etc annotations +#endif + +#if defined(__linux__) || defined(__APPLE__) +#define LOGURU_SYSLOG 1 +#else +#define LOGURU_SYSLOG 0 +#endif + +// ---------------------------------------------------------------------------- + +#ifndef LOGURU_EXPORT + // Define to your project's export declaration if needed for use in a shared library. +#define LOGURU_EXPORT +#endif + +#ifndef LOGURU_SCOPE_TEXT_SIZE + // Maximum length of text that can be printed by a LOG_SCOPE. + // This should be long enough to get most things, but short enough not to clutter the stack. +#define LOGURU_SCOPE_TEXT_SIZE 196 +#endif + +#ifndef LOGURU_FILENAME_WIDTH + // Width of the column containing the file name +#define LOGURU_FILENAME_WIDTH 23 +#endif + +#ifndef LOGURU_THREADNAME_WIDTH + // Width of the column containing the thread name +#define LOGURU_THREADNAME_WIDTH 16 +#endif + +#ifndef LOGURU_SCOPE_TIME_PRECISION + // Resolution of scope timers. 3=ms, 6=us, 9=ns +#define LOGURU_SCOPE_TIME_PRECISION 3 +#endif + +#ifdef LOGURU_CATCH_SIGABRT +#error "You are defining LOGURU_CATCH_SIGABRT. This is for older versions of Loguru. You should now instead set the options passed to loguru::init" +#endif + +#ifndef LOGURU_VERBOSE_SCOPE_ENDINGS + // Show milliseconds and scope name at end of scope. +#define LOGURU_VERBOSE_SCOPE_ENDINGS 1 +#endif + +#ifndef LOGURU_REDEFINE_ASSERT +#define LOGURU_REDEFINE_ASSERT 0 +#endif + +#ifndef LOGURU_WITH_STREAMS +#define LOGURU_WITH_STREAMS 0 +#endif + +#ifndef LOGURU_REPLACE_GLOG +#define LOGURU_REPLACE_GLOG 0 +#endif + +#if LOGURU_REPLACE_GLOG +#undef LOGURU_WITH_STREAMS +#define LOGURU_WITH_STREAMS 1 +#endif + +#if defined(LOGURU_UNSAFE_SIGNAL_HANDLER) +#error "You are defining LOGURU_UNSAFE_SIGNAL_HANDLER. This is for older versions of Loguru. You should now instead set the unsafe_signal_handler option when you call loguru::init." +#endif + +#if LOGURU_IMPLEMENTATION +#undef LOGURU_WITH_STREAMS +#define LOGURU_WITH_STREAMS 1 +#endif + +#ifndef LOGURU_USE_FMTLIB +#define LOGURU_USE_FMTLIB 0 +#endif + +#ifndef LOGURU_USE_LOCALE +#define LOGURU_USE_LOCALE 0 +#endif + +#ifndef LOGURU_WITH_FILEABS +#define LOGURU_WITH_FILEABS 0 +#endif + +#ifndef LOGURU_RTTI +#if defined(__clang__) +#if __has_feature(cxx_rtti) +#define LOGURU_RTTI 1 +#endif +#elif defined(__GNUG__) +#if defined(__GXX_RTTI) +#define LOGURU_RTTI 1 +#endif +#elif defined(_MSC_VER) +#if defined(_CPPRTTI) +#define LOGURU_RTTI 1 +#endif +#endif +#endif + +#ifdef LOGURU_USE_ANONYMOUS_NAMESPACE +#define LOGURU_ANONYMOUS_NAMESPACE_BEGIN namespace { +#define LOGURU_ANONYMOUS_NAMESPACE_END } +#else +#define LOGURU_ANONYMOUS_NAMESPACE_BEGIN +#define LOGURU_ANONYMOUS_NAMESPACE_END +#endif + +// -------------------------------------------------------------------- +// Utility macros + +#define LOGURU_CONCATENATE_IMPL(s1, s2) s1 ## s2 +#define LOGURU_CONCATENATE(s1, s2) LOGURU_CONCATENATE_IMPL(s1, s2) + +#ifdef __COUNTER__ +# define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __COUNTER__) +#else +# define LOGURU_ANONYMOUS_VARIABLE(str) LOGURU_CONCATENATE(str, __LINE__) +#endif + +#if defined(__clang__) || defined(__GNUC__) + // Helper macro for declaring functions as having similar signature to printf. + // This allows the compiler to catch format errors at compile-time. +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#define LOGURU_FORMAT_STRING_TYPE const char* +#elif defined(_MSC_VER) +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) +#define LOGURU_FORMAT_STRING_TYPE _In_z_ _Printf_format_string_ const char* +#else +#define LOGURU_PRINTF_LIKE(fmtarg, firstvararg) +#define LOGURU_FORMAT_STRING_TYPE const char* +#endif + +// Used to mark log_and_abort for the benefit of the static analyzer and optimizer. +#if defined(_MSC_VER) +#define LOGURU_NORETURN __declspec(noreturn) +#else +#define LOGURU_NORETURN __attribute__((noreturn)) +#endif + +#if defined(_MSC_VER) +#define LOGURU_PREDICT_FALSE(x) (x) +#define LOGURU_PREDICT_TRUE(x) (x) +#else +#define LOGURU_PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#define LOGURU_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#endif + +#if LOGURU_USE_FMTLIB +#include +#define LOGURU_FMT(x) "{:" #x "}" +#else +#define LOGURU_FMT(x) "%" #x +#endif + +#ifdef _WIN32 +#define STRDUP(str) _strdup(str) +#else +#define STRDUP(str) strdup(str) +#endif + +#include + +// -------------------------------------------------------------------- +LOGURU_ANONYMOUS_NAMESPACE_BEGIN + +namespace loguru { + // Simple RAII ownership of a char*. + class LOGURU_EXPORT Text { + public: + explicit Text(char* owned_str) : _str(owned_str) {} + ~Text(); + Text(Text&& t) + { + _str = t._str; + t._str = nullptr; + } + Text(Text& t) = delete; + Text& operator=(Text& t) = delete; + void operator=(Text&& t) = delete; + + const char* c_str() const { return _str; } + bool empty() const { return _str == nullptr || *_str == '\0'; } + + char* release() + { + auto result = _str; + _str = nullptr; + return result; + } + + private: + char* _str; + }; + + // Like printf, but returns the formated text. +#if LOGURU_USE_FMTLIB + LOGURU_EXPORT + Text vtextprintf(const char* format, fmt::format_args args); + + template + LOGURU_EXPORT + Text textprintf(LOGURU_FORMAT_STRING_TYPE format, const Args&... args) + { + return vtextprintf(format, fmt::make_format_args(args...)); + } +#else + LOGURU_EXPORT + Text textprintf(LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(1, 2); +#endif + + // Overloaded for variadic template matching. + LOGURU_EXPORT + Text textprintf(); + + using Verbosity = int; + +#undef FATAL +#undef ERROR +#undef WARNING +#undef INFO +#undef MAX + + enum NamedVerbosity : Verbosity { + // Used to mark an invalid verbosity. Do not log to this level. + Verbosity_INVALID = -10, // Never do LOG_F(INVALID) + + // You may use Verbosity_OFF on g_stderr_verbosity, but for nothing else! + Verbosity_OFF = -9, // Never do LOG_F(OFF) + + // Prefer to use ABORT_F or ABORT_S over LOG_F(FATAL) or LOG_S(FATAL). + Verbosity_FATAL = -3, + Verbosity_ERROR = -2, + Verbosity_WARNING = -1, + + // Normal messages. By default written to stderr. + Verbosity_INFO = 0, + + // Same as Verbosity_INFO in every way. + Verbosity_0 = 0, + + // Verbosity levels 1-9 are generally not written to stderr, but are written to file. + Verbosity_1 = +1, + Verbosity_2 = +2, + Verbosity_3 = +3, + Verbosity_4 = +4, + Verbosity_5 = +5, + Verbosity_6 = +6, + Verbosity_7 = +7, + Verbosity_8 = +8, + Verbosity_9 = +9, + + // Do not use higher verbosity levels, as that will make grepping log files harder. + Verbosity_MAX = +9, + }; + + struct Message { + // You would generally print a Message by just concatenating the buffers without spacing. + // Optionally, ignore preamble and indentation. + Verbosity verbosity; // Already part of preamble + const char* filename; // Already part of preamble + unsigned line; // Already part of preamble + const char* preamble; // Date, time, uptime, thread, file:line, verbosity. + const char* indentation; // Just a bunch of spacing. + const char* prefix; // Assertion failure info goes here (or ""). + const char* message; // User message goes here. + }; + + /* Everything with a verbosity equal or greater than g_stderr_verbosity will be + written to stderr. You can set this in code or via the -v argument. + Set to loguru::Verbosity_OFF to write nothing to stderr. + Default is 0, i.e. only log ERROR, WARNING and INFO are written to stderr. + */ + LOGURU_EXPORT extern Verbosity g_stderr_verbosity; + LOGURU_EXPORT extern bool g_colorlogtostderr; // True by default. + LOGURU_EXPORT extern unsigned g_flush_interval_ms; // 0 (unbuffered) by default. + LOGURU_EXPORT extern bool g_preamble_header; // Prepend each log start by a descriptions line with all columns name? True by default. + LOGURU_EXPORT extern bool g_preamble; // Prefix each log line with date, time etc? True by default. + + /* Specify the verbosity used by loguru to log its info messages including the header + logged when logged::init() is called or on exit. Default is 0 (INFO). + */ + LOGURU_EXPORT extern Verbosity g_internal_verbosity; + + // Turn off individual parts of the preamble + LOGURU_EXPORT extern bool g_preamble_date; // The date field + LOGURU_EXPORT extern bool g_preamble_time; // The time of the current day + LOGURU_EXPORT extern bool g_preamble_uptime; // The time since init call + LOGURU_EXPORT extern bool g_preamble_thread; // The logging thread + LOGURU_EXPORT extern bool g_preamble_file; // The file from which the log originates from + LOGURU_EXPORT extern bool g_preamble_verbose; // The verbosity field + LOGURU_EXPORT extern bool g_preamble_pipe; // The pipe symbol right before the message + + // May not throw! + typedef void (*log_handler_t)(void* user_data, const Message& message); + typedef void (*close_handler_t)(void* user_data); + typedef void (*flush_handler_t)(void* user_data); + + // May throw if that's how you'd like to handle your errors. + typedef void (*fatal_handler_t)(const Message& message); + + // Given a verbosity level, return the level's name or nullptr. + typedef const char* (*verbosity_to_name_t)(Verbosity verbosity); + + // Given a verbosity level name, return the verbosity level or + // Verbosity_INVALID if name is not recognized. + typedef Verbosity(*name_to_verbosity_t)(const char* name); + + struct SignalOptions { + /// Make Loguru try to do unsafe but useful things, + /// like printing a stack trace, when catching signals. + /// This may lead to bad things like deadlocks in certain situations. + bool unsafe_signal_handler = true; + + /// Should Loguru catch SIGABRT ? + bool sigabrt = true; + + /// Should Loguru catch SIGBUS ? + bool sigbus = true; + + /// Should Loguru catch SIGFPE ? + bool sigfpe = true; + + /// Should Loguru catch SIGILL ? + bool sigill = true; + + /// Should Loguru catch SIGINT ? + bool sigint = true; + + /// Should Loguru catch SIGSEGV ? + bool sigsegv = true; + + /// Should Loguru catch SIGTERM ? + bool sigterm = true; + + static SignalOptions none() + { + SignalOptions options; + options.unsafe_signal_handler = false; + options.sigabrt = false; + options.sigbus = false; + options.sigfpe = false; + options.sigill = false; + options.sigint = false; + options.sigsegv = false; + options.sigterm = false; + return options; + } + }; + + // Runtime options passed to loguru::init + struct Options { + // This allows you to use something else instead of "-v" via verbosity_flag. + // Set to nullptr if you don't want Loguru to parse verbosity from the args. + const char* verbosity_flag = "-v"; + + // loguru::init will set the name of the calling thread to this. + // If you don't want Loguru to set the name of the main thread, + // set this to nullptr. + // NOTE: on SOME platforms loguru::init will only overwrite the thread name + // if a thread name has not already been set. + // To always set a thread name, use loguru::set_thread_name instead. + const char* main_thread_name = "main thread"; + + SignalOptions signal_options; + }; + + /* Should be called from the main thread. + You don't *need* to call this, but if you do you get: + * Signal handlers installed + * Program arguments logged + * Working dir logged + * Optional -v verbosity flag parsed + * Main thread name set to "main thread" + * Explanation of the preamble (date, thread name, etc) logged + + loguru::init() will look for arguments meant for loguru and remove them. + Arguments meant for loguru are: + -v n Set loguru::g_stderr_verbosity level. Examples: + -v 3 Show verbosity level 3 and lower. + -v 0 Only show INFO, WARNING, ERROR, FATAL (default). + -v INFO Only show INFO, WARNING, ERROR, FATAL (default). + -v WARNING Only show WARNING, ERROR, FATAL. + -v ERROR Only show ERROR, FATAL. + -v FATAL Only show FATAL. + -v OFF Turn off logging to stderr. + + Tip: You can set g_stderr_verbosity before calling loguru::init. + That way you can set the default but have the user override it with the -v flag. + Note that -v does not affect file logging (see loguru::add_file). + + You can you something other than the -v flag by setting the verbosity_flag option. + */ + LOGURU_EXPORT + void init(int& argc, char* argv[], const Options& options = {}); + + // Will call remove_all_callbacks(). After calling this, logging will still go to stderr. + // You generally don't need to call this. + LOGURU_EXPORT + void shutdown(); + + // What ~ will be replaced with, e.g. "/home/your_user_name/" + LOGURU_EXPORT + const char* home_dir(); + + /* Returns the name of the app as given in argv[0] but without leading path. + That is, if argv[0] is "../foo/app" this will return "app". + */ + LOGURU_EXPORT + const char* argv0_filename(); + + // Returns all arguments given to loguru::init(), but escaped with a single space as separator. + LOGURU_EXPORT + const char* arguments(); + + // Returns the path to the current working dir when loguru::init() was called. + LOGURU_EXPORT + const char* current_dir(); + + // Returns the part of the path after the last / or \ (if any). + LOGURU_EXPORT + const char* filename(const char* path); + + // e.g. "foo/bar/baz.ext" will create the directories "foo/" and "foo/bar/" + LOGURU_EXPORT + bool create_directories(const char* file_path_const); + + // Writes date and time with millisecond precision, e.g. "20151017_161503.123" + LOGURU_EXPORT + void write_date_time(char* buff, unsigned long long buff_size); + + // Helper: thread-safe version strerror + LOGURU_EXPORT + Text errno_as_text(); + + /* Given a prefix of e.g. "~/loguru/" this might return + "/home/your_username/loguru/app_name/20151017_161503.123.log" + + where "app_name" is a sanitized version of argv[0]. + */ + LOGURU_EXPORT + void suggest_log_path(const char* prefix, char* buff, unsigned long long buff_size); + + enum FileMode { Truncate, Append }; + + /* Will log to a file at the given path. + Any logging message with a verbosity lower or equal to + the given verbosity will be included. + The function will create all directories in 'path' if needed. + If path starts with a ~, it will be replaced with loguru::home_dir() + To stop the file logging, just call loguru::remove_callback(path) with the same path. + */ + LOGURU_EXPORT + bool add_file(const char* path, FileMode mode, Verbosity verbosity); + + LOGURU_EXPORT + // Send logs to syslog with LOG_USER facility (see next call) + bool add_syslog(const char* app_name, Verbosity verbosity); + LOGURU_EXPORT + // Send logs to syslog with your own choice of facility (LOG_USER, LOG_AUTH, ...) + // see loguru.cpp: syslog_log() for more details. + bool add_syslog(const char* app_name, Verbosity verbosity, int facility); + + /* Will be called right before abort(). + You can for instance use this to print custom error messages, or throw an exception. + Feel free to call LOG:ing function from this, but not FATAL ones! */ + LOGURU_EXPORT + void set_fatal_handler(fatal_handler_t handler); + + // Get the current fatal handler, if any. Default value is nullptr. + LOGURU_EXPORT + fatal_handler_t get_fatal_handler(); + + /* Will be called on each log messages with a verbosity less or equal to the given one. + Useful for displaying messages on-screen in a game, for example. + The given on_close is also expected to flush (if desired). + */ + LOGURU_EXPORT + void add_callback( + const char* id, + log_handler_t callback, + void* user_data, + Verbosity verbosity, + close_handler_t on_close = nullptr, + flush_handler_t on_flush = nullptr); + + /* Set a callback that returns custom verbosity level names. If callback + is nullptr or returns nullptr, default log names will be used. + */ + LOGURU_EXPORT + void set_verbosity_to_name_callback(verbosity_to_name_t callback); + + /* Set a callback that returns the verbosity level matching a name. The + callback should return Verbosity_INVALID if the name is not + recognized. + */ + LOGURU_EXPORT + void set_name_to_verbosity_callback(name_to_verbosity_t callback); + + /* Get a custom name for a specific verbosity, if one exists, or nullptr. */ + LOGURU_EXPORT + const char* get_verbosity_name(Verbosity verbosity); + + /* Get the verbosity enum value from a custom 4-character level name, if one exists. + If the name does not match a custom level name, Verbosity_INVALID is returned. + */ + LOGURU_EXPORT + Verbosity get_verbosity_from_name(const char* name); + + // Returns true iff the callback was found (and removed). + LOGURU_EXPORT + bool remove_callback(const char* id); + + // Shut down all file logging and any other callback hooks installed. + LOGURU_EXPORT + void remove_all_callbacks(); + + // Returns the maximum of g_stderr_verbosity and all file/custom outputs. + LOGURU_EXPORT + Verbosity current_verbosity_cutoff(); + +#if LOGURU_USE_FMTLIB + // Internal functions + LOGURU_EXPORT + void vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); + LOGURU_EXPORT + void raw_vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args args); + + // Actual logging function. Use the LOG macro instead of calling this directly. + template + LOGURU_EXPORT + void log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args &... args) + { + vlog(verbosity, file, line, format, fmt::make_format_args(args...)); + } + + // Log without any preamble or indentation. + template + LOGURU_EXPORT + void raw_log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args &... args) + { + raw_vlog(verbosity, file, line, format, fmt::make_format_args(args...)); + } +#else // LOGURU_USE_FMTLIB? + // Actual logging function. Use the LOG macro instead of calling this directly. + LOGURU_EXPORT + void log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); + + // Actual logging function. + LOGURU_EXPORT + void vlog(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, va_list) LOGURU_PRINTF_LIKE(4, 0); + + // Log without any preamble or indentation. + LOGURU_EXPORT + void raw_log(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(4, 5); +#endif // !LOGURU_USE_FMTLIB + + // Helper class for LOG_SCOPE_F + class LOGURU_EXPORT LogScopeRAII { + public: + LogScopeRAII() : _file(nullptr) {} // No logging + LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, va_list vlist) LOGURU_PRINTF_LIKE(5, 0); + LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(5, 6); + ~LogScopeRAII(); + + void Init(LOGURU_FORMAT_STRING_TYPE format, va_list vlist) LOGURU_PRINTF_LIKE(2, 0); + +#if defined(_MSC_VER) && _MSC_VER > 1800 + // older MSVC default move ctors close the scope on move. See + // issue #43 + LogScopeRAII(LogScopeRAII&& other) + : _verbosity(other._verbosity) + , _file(other._file) + , _line(other._line) + , _indent_stderr(other._indent_stderr) + , _start_time_ns(other._start_time_ns) + { + // Make sure the tmp object's destruction doesn't close the scope: + other._file = nullptr; + + for (unsigned int i = 0; i < LOGURU_SCOPE_TEXT_SIZE; ++i) { + _name[i] = other._name[i]; + } + } +#else + LogScopeRAII(LogScopeRAII&&) = default; +#endif + + private: + LogScopeRAII(const LogScopeRAII&) = delete; + LogScopeRAII& operator=(const LogScopeRAII&) = delete; + void operator=(LogScopeRAII&&) = delete; + + Verbosity _verbosity; + const char* _file; // Set to null if we are disabled due to verbosity + unsigned _line; + bool _indent_stderr; // Did we? + long long _start_time_ns; + char _name[LOGURU_SCOPE_TEXT_SIZE]; + }; + + // Marked as 'noreturn' for the benefit of the static analyzer and optimizer. + // stack_trace_skip is the number of extrace stack frames to skip above log_and_abort. +#if LOGURU_USE_FMTLIB + LOGURU_EXPORT + LOGURU_NORETURN void vlog_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, fmt::format_args); + template + LOGURU_EXPORT + LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, const Args&... args) + { + vlog_and_abort(stack_trace_skip, expr, file, line, format, fmt::make_format_args(args...)); + } +#else + LOGURU_EXPORT + LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line, LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(5, 6); +#endif + LOGURU_EXPORT + LOGURU_NORETURN void log_and_abort(int stack_trace_skip, const char* expr, const char* file, unsigned line); + + // Flush output to stderr and files. + // If g_flush_interval_ms is set to non-zero, this will be called automatically this often. + // If not set, you do not need to call this at all. + LOGURU_EXPORT + void flush(); + + template inline Text format_value(const T&) { return textprintf("N/A"); } + template<> inline Text format_value(const char& v) { return textprintf(LOGURU_FMT(c), v); } + template<> inline Text format_value(const int& v) { return textprintf(LOGURU_FMT(d), v); } + template<> inline Text format_value(const float& v) { return textprintf(LOGURU_FMT(f), v); } + template<> inline Text format_value(const double& v) { return textprintf(LOGURU_FMT(f), v); } + +#if LOGURU_USE_FMTLIB + template<> inline Text format_value(const unsigned int& v) { return textprintf(LOGURU_FMT(d), v); } + template<> inline Text format_value(const long& v) { return textprintf(LOGURU_FMT(d), v); } + template<> inline Text format_value(const unsigned long& v) { return textprintf(LOGURU_FMT(d), v); } + template<> inline Text format_value(const long long& v) { return textprintf(LOGURU_FMT(d), v); } + template<> inline Text format_value(const unsigned long long& v) { return textprintf(LOGURU_FMT(d), v); } +#else + template<> inline Text format_value(const unsigned int& v) { return textprintf(LOGURU_FMT(u), v); } + template<> inline Text format_value(const long& v) { return textprintf(LOGURU_FMT(lu), v); } + template<> inline Text format_value(const unsigned long& v) { return textprintf(LOGURU_FMT(ld), v); } + template<> inline Text format_value(const long long& v) { return textprintf(LOGURU_FMT(llu), v); } + template<> inline Text format_value(const unsigned long long& v) { return textprintf(LOGURU_FMT(lld), v); } +#endif + + /* Thread names can be set for the benefit of readable logs. + If you do not set the thread name, a hex id will be shown instead. + These thread names may or may not be the same as the system thread names, + depending on the system. + Try to limit the thread name to 15 characters or less. */ + LOGURU_EXPORT + void set_thread_name(const char* name); + + /* Returns the thread name for this thread. + On most *nix systems this will return the system thread name (settable from both within and without Loguru). + On other systems it will return whatever you set in `set_thread_name()`; + If no thread name is set, this will return a hexadecimal thread id. + `length` should be the number of bytes available in the buffer. + 17 is a good number for length. + `right_align_hex_id` means any hexadecimal thread id will be written to the end of buffer. + */ + LOGURU_EXPORT + void get_thread_name(char* buffer, unsigned long long length, bool right_align_hex_id); + + /* Generates a readable stacktrace as a string. + 'skip' specifies how many stack frames to skip. + For instance, the default skip (1) means: + don't include the call to loguru::stacktrace in the stack trace. */ + LOGURU_EXPORT + Text stacktrace(int skip = 1); + + /* Add a string to be replaced with something else in the stack output. + + For instance, instead of having a stack trace look like this: + 0x41f541 some_function(std::basic_ofstream >&) + You can clean it up with: + auto verbose_type_name = loguru::demangle(typeid(std::ofstream).name()); + loguru::add_stack_cleanup(verbose_type_name.c_str(); "std::ofstream"); + So the next time you will instead see: + 0x41f541 some_function(std::ofstream&) + + `replace_with_this` must be shorter than `find_this`. + */ + LOGURU_EXPORT + void add_stack_cleanup(const char* find_this, const char* replace_with_this); + + // Example: demangle(typeid(std::ofstream).name()) -> "std::basic_ofstream >" + LOGURU_EXPORT + Text demangle(const char* name); + + // ------------------------------------------------------------------------ + /* + Not all terminals support colors, but if they do, and g_colorlogtostderr + is set, Loguru will write them to stderr to make errors in red, etc. + + You also have the option to manually use them, via the function below. + + Note, however, that if you do, the color codes could end up in your logfile! + + This means if you intend to use them functions you should either: + * Use them on the stderr/stdout directly (bypass Loguru). + * Don't add file outputs to Loguru. + * Expect some \e[1m things in your logfile. + + Usage: + printf("%sRed%sGreen%sBold green%sClear again\n", + loguru::terminal_red(), loguru::terminal_green(), + loguru::terminal_bold(), loguru::terminal_reset()); + + If the terminal at hand does not support colors the above output + will just not have funky \e[1m things showing. + */ + + // Do the output terminal support colors? + LOGURU_EXPORT + bool terminal_has_color(); + + // Colors + LOGURU_EXPORT const char* terminal_black(); + LOGURU_EXPORT const char* terminal_red(); + LOGURU_EXPORT const char* terminal_green(); + LOGURU_EXPORT const char* terminal_yellow(); + LOGURU_EXPORT const char* terminal_blue(); + LOGURU_EXPORT const char* terminal_purple(); + LOGURU_EXPORT const char* terminal_cyan(); + LOGURU_EXPORT const char* terminal_light_gray(); + LOGURU_EXPORT const char* terminal_light_red(); + LOGURU_EXPORT const char* terminal_white(); + + // Formating + LOGURU_EXPORT const char* terminal_bold(); + LOGURU_EXPORT const char* terminal_underline(); + + // You should end each line with this! + LOGURU_EXPORT const char* terminal_reset(); + + // -------------------------------------------------------------------- + // Error context related: + + struct StringStream; + + // Use this in your EcEntryBase::print_value overload. + LOGURU_EXPORT + void stream_print(StringStream& out_string_stream, const char* text); + + class LOGURU_EXPORT EcEntryBase { + public: + EcEntryBase(const char* file, unsigned line, const char* descr); + ~EcEntryBase(); + EcEntryBase(const EcEntryBase&) = delete; + EcEntryBase(EcEntryBase&&) = delete; + EcEntryBase& operator=(const EcEntryBase&) = delete; + EcEntryBase& operator=(EcEntryBase&&) = delete; + + virtual void print_value(StringStream& out_string_stream) const = 0; + + EcEntryBase* previous() const { return _previous; } + + // private: + const char* _file; + unsigned _line; + const char* _descr; + EcEntryBase* _previous; + }; + + template + class EcEntryData : public EcEntryBase { + public: + using Printer = Text(*)(T data); + + EcEntryData(const char* file, unsigned line, const char* descr, T data, Printer&& printer) + : EcEntryBase(file, line, descr), _data(data), _printer(printer) + { + } + + virtual void print_value(StringStream& out_string_stream) const override + { + const auto str = _printer(_data); + stream_print(out_string_stream, str.c_str()); + } + + private: + T _data; + Printer _printer; + }; + + // template + // class EcEntryLambda : public EcEntryBase + // { + // public: + // EcEntryLambda(const char* file, unsigned line, const char* descr, Printer&& printer) + // : EcEntryBase(file, line, descr), _printer(std::move(printer)) {} + + // virtual void print_value(StringStream& out_string_stream) const override + // { + // const auto str = _printer(); + // stream_print(out_string_stream, str.c_str()); + // } + + // private: + // Printer _printer; + // }; + + // template + // EcEntryLambda make_ec_entry_lambda(const char* file, unsigned line, const char* descr, Printer&& printer) + // { + // return {file, line, descr, std::move(printer)}; + // } + + template + struct decay_char_array { using type = T; }; + + template + struct decay_char_array { using type = const char*; }; + + template + struct make_const_ptr { using type = T; }; + + template + struct make_const_ptr { using type = const T*; }; + + template + struct make_ec_type { using type = typename make_const_ptr::type>::type; }; + + /* A stack trace gives you the names of the function at the point of a crash. + With ERROR_CONTEXT, you can also get the values of select local variables. + Usage: + + void process_customers(const std::string& filename) + { + ERROR_CONTEXT("Processing file", filename.c_str()); + for (int customer_index : ...) + { + ERROR_CONTEXT("Customer index", customer_index); + ... + } + } + + The context is in effect during the scope of the ERROR_CONTEXT. + Use loguru::get_error_context() to get the contents of the active error contexts. + + Example result: + + ------------------------------------------------ + [ErrorContext] main.cpp:416 Processing file: "customers.json" + [ErrorContext] main.cpp:417 Customer index: 42 + ------------------------------------------------ + + Error contexts are printed automatically on crashes, and only on crashes. + This makes them much faster than logging the value of a variable. + */ +#define ERROR_CONTEXT(descr, data) \ + const loguru::EcEntryData::type> \ + LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ + __FILE__, __LINE__, descr, data, \ + static_cast::type>::Printer>(loguru::ec_to_text) ) // For better error messages + + /* + #define ERROR_CONTEXT(descr, data) \ + const auto LOGURU_ANONYMOUS_VARIABLE(error_context_scope_)( \ + loguru::make_ec_entry_lambda(__FILE__, __LINE__, descr, \ + [=](){ return loguru::ec_to_text(data); })) + */ + + using EcHandle = const EcEntryBase*; + + /* + Get a light-weight handle to the error context stack on this thread. + The handle is valid as long as the current thread has no changes to its error context stack. + You can pass the handle to loguru::get_error_context on another thread. + This can be very useful for when you have a parent thread spawning several working threads, + and you want the error context of the parent thread to get printed (too) when there is an + error on the child thread. You can accomplish this thusly: + + void foo(const char* parameter) + { + ERROR_CONTEXT("parameter", parameter) + const auto parent_ec_handle = loguru::get_thread_ec_handle(); + + std::thread([=]{ + loguru::set_thread_name("child thread"); + ERROR_CONTEXT("parent context", parent_ec_handle); + dangerous_code(); + }.join(); + } + + */ + LOGURU_EXPORT + EcHandle get_thread_ec_handle(); + + // Get a string describing the current stack of error context. Empty string if there is none. + LOGURU_EXPORT + Text get_error_context(); + + // Get a string describing the error context of the given thread handle. + LOGURU_EXPORT + Text get_error_context_for(EcHandle ec_handle); + + // ------------------------------------------------------------------------ + + LOGURU_EXPORT Text ec_to_text(const char* data); + LOGURU_EXPORT Text ec_to_text(char data); + LOGURU_EXPORT Text ec_to_text(int data); + LOGURU_EXPORT Text ec_to_text(unsigned int data); + LOGURU_EXPORT Text ec_to_text(long data); + LOGURU_EXPORT Text ec_to_text(unsigned long data); + LOGURU_EXPORT Text ec_to_text(long long data); + LOGURU_EXPORT Text ec_to_text(unsigned long long data); + LOGURU_EXPORT Text ec_to_text(float data); + LOGURU_EXPORT Text ec_to_text(double data); + LOGURU_EXPORT Text ec_to_text(long double data); + LOGURU_EXPORT Text ec_to_text(EcHandle); + + /* + You can add ERROR_CONTEXT support for your own types by overloading ec_to_text. Here's how: + + some.hpp: + namespace loguru { + Text ec_to_text(MySmallType data) + Text ec_to_text(const MyBigType* data) + } // namespace loguru + + some.cpp: + namespace loguru { + Text ec_to_text(MySmallType small_value) + { + // Called only when needed, i.e. on a crash. + std::string str = small_value.as_string(); // Format 'small_value' here somehow. + return Text{STRDUP(str.c_str())}; + } + + Text ec_to_text(const MyBigType* big_value) + { + // Called only when needed, i.e. on a crash. + std::string str = big_value->as_string(); // Format 'big_value' here somehow. + return Text{STRDUP(str.c_str())}; + } + } // namespace loguru + + Any file that include some.hpp: + void foo(MySmallType small, const MyBigType& big) + { + ERROR_CONTEXT("Small", small); // Copy ´small` by value. + ERROR_CONTEXT("Big", &big); // `big` should not change during this scope! + .... + } + */ +} // namespace loguru + +LOGURU_ANONYMOUS_NAMESPACE_END + +// -------------------------------------------------------------------- +// Logging macros + +// LOG_F(2, "Only logged if verbosity is 2 or higher: %d", some_number); +#define VLOG_F(verbosity, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff()) ? (void)0 \ + : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) + +// LOG_F(INFO, "Foo: %d", some_number); +#define LOG_F(verbosity_name, ...) VLOG_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) + +#define VLOG_IF_F(verbosity, cond, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ + ? (void)0 \ + : loguru::log(verbosity, __FILE__, __LINE__, __VA_ARGS__) + +#define LOG_IF_F(verbosity_name, cond, ...) \ + VLOG_IF_F(loguru::Verbosity_ ## verbosity_name, cond, __VA_ARGS__) + +#define VLOG_SCOPE_F(verbosity, ...) \ + loguru::LogScopeRAII LOGURU_ANONYMOUS_VARIABLE(error_context_RAII_) = \ + ((verbosity) > loguru::current_verbosity_cutoff()) ? loguru::LogScopeRAII() : \ + loguru::LogScopeRAII(verbosity, __FILE__, __LINE__, __VA_ARGS__) + +// Raw logging - no preamble, no indentation. Slightly faster than full logging. +#define RAW_VLOG_F(verbosity, ...) \ + ((verbosity) > loguru::current_verbosity_cutoff()) ? (void)0 \ + : loguru::raw_log(verbosity, __FILE__, __LINE__, __VA_ARGS__) + +#define RAW_LOG_F(verbosity_name, ...) RAW_VLOG_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) + +// Use to book-end a scope. Affects logging on all threads. +#define LOG_SCOPE_F(verbosity_name, ...) \ + VLOG_SCOPE_F(loguru::Verbosity_ ## verbosity_name, __VA_ARGS__) + +#define LOG_SCOPE_FUNCTION(verbosity_name) LOG_SCOPE_F(verbosity_name, __func__) + +// ----------------------------------------------- +// ABORT_F macro. Usage: ABORT_F("Cause of error: %s", error_str); + +// Message is optional +#define ABORT_F(...) loguru::log_and_abort(0, "ABORT: ", __FILE__, __LINE__, __VA_ARGS__) + +// -------------------------------------------------------------------- +// CHECK_F macros: + +#define CHECK_WITH_INFO_F(test, info, ...) \ + LOGURU_PREDICT_TRUE((test) == true) ? (void)0 : loguru::log_and_abort(0, "CHECK FAILED: " info " ", __FILE__, \ + __LINE__, ##__VA_ARGS__) + +/* Checked at runtime too. Will print error, then call fatal_handler (if any), then 'abort'. + Note that the test must be boolean. + CHECK_F(ptr); will not compile, but CHECK_F(ptr != nullptr); will. */ +#define CHECK_F(test, ...) CHECK_WITH_INFO_F(test, #test, ##__VA_ARGS__) + +#define CHECK_NOTNULL_F(x, ...) CHECK_WITH_INFO_F((x) != nullptr, #x " != nullptr", ##__VA_ARGS__) + +#define CHECK_OP_F(expr_left, expr_right, op, ...) \ + do \ + { \ + auto val_left = expr_left; \ + auto val_right = expr_right; \ + if (! LOGURU_PREDICT_TRUE(val_left op val_right)) \ + { \ + auto str_left = loguru::format_value(val_left); \ + auto str_right = loguru::format_value(val_right); \ + auto fail_info = loguru::textprintf("CHECK FAILED: " LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) " (" LOGURU_FMT(s) " " LOGURU_FMT(s) " " LOGURU_FMT(s) ") ", \ + #expr_left, #op, #expr_right, str_left.c_str(), #op, str_right.c_str()); \ + auto user_msg = loguru::textprintf(__VA_ARGS__); \ + loguru::log_and_abort(0, fail_info.c_str(), __FILE__, __LINE__, \ + LOGURU_FMT(s), user_msg.c_str()); \ + } \ + } while (false) + +#ifndef LOGURU_DEBUG_LOGGING +#ifndef NDEBUG +#define LOGURU_DEBUG_LOGGING 1 +#else +#define LOGURU_DEBUG_LOGGING 0 +#endif +#endif + +#if LOGURU_DEBUG_LOGGING + // Debug logging enabled: +#define DLOG_F(verbosity_name, ...) LOG_F(verbosity_name, __VA_ARGS__) +#define DVLOG_F(verbosity, ...) VLOG_F(verbosity, __VA_ARGS__) +#define DLOG_IF_F(verbosity_name, ...) LOG_IF_F(verbosity_name, __VA_ARGS__) +#define DVLOG_IF_F(verbosity, ...) VLOG_IF_F(verbosity, __VA_ARGS__) +#define DRAW_LOG_F(verbosity_name, ...) RAW_LOG_F(verbosity_name, __VA_ARGS__) +#define DRAW_VLOG_F(verbosity, ...) RAW_VLOG_F(verbosity, __VA_ARGS__) +#else + // Debug logging disabled: +#define DLOG_F(verbosity_name, ...) +#define DVLOG_F(verbosity, ...) +#define DLOG_IF_F(verbosity_name, ...) +#define DVLOG_IF_F(verbosity, ...) +#define DRAW_LOG_F(verbosity_name, ...) +#define DRAW_VLOG_F(verbosity, ...) +#endif + +#define CHECK_EQ_F(a, b, ...) CHECK_OP_F(a, b, ==, ##__VA_ARGS__) +#define CHECK_NE_F(a, b, ...) CHECK_OP_F(a, b, !=, ##__VA_ARGS__) +#define CHECK_LT_F(a, b, ...) CHECK_OP_F(a, b, < , ##__VA_ARGS__) +#define CHECK_GT_F(a, b, ...) CHECK_OP_F(a, b, > , ##__VA_ARGS__) +#define CHECK_LE_F(a, b, ...) CHECK_OP_F(a, b, <=, ##__VA_ARGS__) +#define CHECK_GE_F(a, b, ...) CHECK_OP_F(a, b, >=, ##__VA_ARGS__) + +#ifndef LOGURU_DEBUG_CHECKS +#ifndef NDEBUG +#define LOGURU_DEBUG_CHECKS 1 +#else +#define LOGURU_DEBUG_CHECKS 0 +#endif +#endif + +#if LOGURU_DEBUG_CHECKS + // Debug checks enabled: +#define DCHECK_F(test, ...) CHECK_F(test, ##__VA_ARGS__) +#define DCHECK_NOTNULL_F(x, ...) CHECK_NOTNULL_F(x, ##__VA_ARGS__) +#define DCHECK_EQ_F(a, b, ...) CHECK_EQ_F(a, b, ##__VA_ARGS__) +#define DCHECK_NE_F(a, b, ...) CHECK_NE_F(a, b, ##__VA_ARGS__) +#define DCHECK_LT_F(a, b, ...) CHECK_LT_F(a, b, ##__VA_ARGS__) +#define DCHECK_LE_F(a, b, ...) CHECK_LE_F(a, b, ##__VA_ARGS__) +#define DCHECK_GT_F(a, b, ...) CHECK_GT_F(a, b, ##__VA_ARGS__) +#define DCHECK_GE_F(a, b, ...) CHECK_GE_F(a, b, ##__VA_ARGS__) +#else + // Debug checks disabled: +#define DCHECK_F(test, ...) +#define DCHECK_NOTNULL_F(x, ...) +#define DCHECK_EQ_F(a, b, ...) +#define DCHECK_NE_F(a, b, ...) +#define DCHECK_LT_F(a, b, ...) +#define DCHECK_LE_F(a, b, ...) +#define DCHECK_GT_F(a, b, ...) +#define DCHECK_GE_F(a, b, ...) +#endif // NDEBUG + + +#if LOGURU_REDEFINE_ASSERT +#undef assert +#ifndef NDEBUG + // Debug: +#define assert(test) CHECK_WITH_INFO_F(!!(test), #test) // HACK +#else +#define assert(test) +#endif +#endif // LOGURU_REDEFINE_ASSERT + +#endif // LOGURU_HAS_DECLARED_FORMAT_HEADER + +// ---------------------------------------------------------------------------- +// .dP"Y8 888888 88""Yb 888888 db 8b d8 .dP"Y8 +// `Ybo." 88 88__dP 88__ dPYb 88b d88 `Ybo." +// o.`Y8b 88 88"Yb 88"" dP__Yb 88YbdP88 o.`Y8b +// 8bodP' 88 88 Yb 888888 dP""""Yb 88 YY 88 8bodP' + +#if LOGURU_WITH_STREAMS +#ifndef LOGURU_HAS_DECLARED_STREAMS_HEADER +#define LOGURU_HAS_DECLARED_STREAMS_HEADER + +/* This file extends loguru to enable std::stream-style logging, a la Glog. + It's an optional feature behind the LOGURU_WITH_STREAMS settings + because including it everywhere will slow down compilation times. +*/ + +#include +#include // Adds about 38 kLoC on clang. +#include + +LOGURU_ANONYMOUS_NAMESPACE_BEGIN + +namespace loguru { + // Like sprintf, but returns the formated text. + LOGURU_EXPORT + std::string strprintf(LOGURU_FORMAT_STRING_TYPE format, ...) LOGURU_PRINTF_LIKE(1, 2); + + // Like vsprintf, but returns the formated text. + LOGURU_EXPORT + std::string vstrprintf(LOGURU_FORMAT_STRING_TYPE format, va_list) LOGURU_PRINTF_LIKE(1, 0); + + class LOGURU_EXPORT StreamLogger { + public: + StreamLogger(Verbosity verbosity, const char* file, unsigned line) : _verbosity(verbosity), _file(file), _line(line) {} + ~StreamLogger() noexcept(false); + + template + StreamLogger& operator<<(const T& t) + { + _ss << t; + return *this; + } + + // std::endl and other iomanip:s. + StreamLogger& operator<<(std::ostream& (*f)(std::ostream&)) + { + f(_ss); + return *this; + } + + private: + Verbosity _verbosity; + const char* _file; + unsigned _line; + std::ostringstream _ss; + }; + + class LOGURU_EXPORT AbortLogger { + public: + AbortLogger(const char* expr, const char* file, unsigned line) : _expr(expr), _file(file), _line(line) {} + LOGURU_NORETURN ~AbortLogger() noexcept(false); + + template + AbortLogger& operator<<(const T& t) + { + _ss << t; + return *this; + } + + // std::endl and other iomanip:s. + AbortLogger& operator<<(std::ostream& (*f)(std::ostream&)) + { + f(_ss); + return *this; + } + + private: + const char* _expr; + const char* _file; + unsigned _line; + std::ostringstream _ss; + }; + + class LOGURU_EXPORT Voidify { + public: + Voidify() {} + // This has to be an operator with a precedence lower than << but higher than ?: + void operator&(const StreamLogger&) {} + void operator&(const AbortLogger&) {} + }; + + /* Helper functions for CHECK_OP_S macro. + GLOG trick: The (int, int) specialization works around the issue that the compiler + will not instantiate the template version of the function on values of unnamed enum type. */ +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template \ + inline std::string* name(const char* expr, const T1& v1, const char* op_str, const T2& v2) \ + { \ + if (LOGURU_PREDICT_TRUE(v1 op v2)) { return NULL; } \ + std::ostringstream ss; \ + ss << "CHECK FAILED: " << expr << " (" << v1 << " " << op_str << " " << v2 << ") "; \ + return new std::string(ss.str()); \ + } \ + inline std::string* name(const char* expr, int v1, const char* op_str, int v2) \ + { \ + return name(expr, v1, op_str, v2); \ + } + + DEFINE_CHECK_OP_IMPL(check_EQ_impl, == ) + DEFINE_CHECK_OP_IMPL(check_NE_impl, != ) + DEFINE_CHECK_OP_IMPL(check_LE_impl, <= ) + DEFINE_CHECK_OP_IMPL(check_LT_impl, < ) + DEFINE_CHECK_OP_IMPL(check_GE_impl, >= ) + DEFINE_CHECK_OP_IMPL(check_GT_impl, > ) +#undef DEFINE_CHECK_OP_IMPL + + /* GLOG trick: Function is overloaded for integral types to allow static const integrals + declared in classes and not defined to be used as arguments to CHECK* macros. */ + template + inline const T& referenceable_value(const T& t) { return t; } + inline char referenceable_value(char t) { return t; } + inline unsigned char referenceable_value(unsigned char t) { return t; } + inline signed char referenceable_value(signed char t) { return t; } + inline short referenceable_value(short t) { return t; } + inline unsigned short referenceable_value(unsigned short t) { return t; } + inline int referenceable_value(int t) { return t; } + inline unsigned int referenceable_value(unsigned int t) { return t; } + inline long referenceable_value(long t) { return t; } + inline unsigned long referenceable_value(unsigned long t) { return t; } + inline long long referenceable_value(long long t) { return t; } + inline unsigned long long referenceable_value(unsigned long long t) { return t; } +} // namespace loguru + +LOGURU_ANONYMOUS_NAMESPACE_END + +// ----------------------------------------------- +// Logging macros: + +// usage: LOG_STREAM(INFO) << "Foo " << std::setprecision(10) << some_value; +#define VLOG_IF_S(verbosity, cond) \ + ((verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ + ? (void)0 \ + : loguru::Voidify() & loguru::StreamLogger(verbosity, __FILE__, __LINE__) +#define LOG_IF_S(verbosity_name, cond) VLOG_IF_S(loguru::Verbosity_ ## verbosity_name, cond) +#define VLOG_S(verbosity) VLOG_IF_S(verbosity, true) +#define LOG_S(verbosity_name) VLOG_S(loguru::Verbosity_ ## verbosity_name) + +// ----------------------------------------------- +// ABORT_S macro. Usage: ABORT_S() << "Causo of error: " << details; + +#define ABORT_S() loguru::Voidify() & loguru::AbortLogger("ABORT: ", __FILE__, __LINE__) + +// ----------------------------------------------- +// CHECK_S macros: + +#define CHECK_WITH_INFO_S(cond, info) \ + LOGURU_PREDICT_TRUE((cond) == true) \ + ? (void)0 \ + : loguru::Voidify() & loguru::AbortLogger("CHECK FAILED: " info " ", __FILE__, __LINE__) + +#define CHECK_S(cond) CHECK_WITH_INFO_S(cond, #cond) +#define CHECK_NOTNULL_S(x) CHECK_WITH_INFO_S((x) != nullptr, #x " != nullptr") + +#define CHECK_OP_S(function_name, expr1, op, expr2) \ + while (auto error_string = loguru::function_name(#expr1 " " #op " " #expr2, \ + loguru::referenceable_value(expr1), #op, \ + loguru::referenceable_value(expr2))) \ + loguru::AbortLogger(error_string->c_str(), __FILE__, __LINE__) + +#define CHECK_EQ_S(expr1, expr2) CHECK_OP_S(check_EQ_impl, expr1, ==, expr2) +#define CHECK_NE_S(expr1, expr2) CHECK_OP_S(check_NE_impl, expr1, !=, expr2) +#define CHECK_LE_S(expr1, expr2) CHECK_OP_S(check_LE_impl, expr1, <=, expr2) +#define CHECK_LT_S(expr1, expr2) CHECK_OP_S(check_LT_impl, expr1, < , expr2) +#define CHECK_GE_S(expr1, expr2) CHECK_OP_S(check_GE_impl, expr1, >=, expr2) +#define CHECK_GT_S(expr1, expr2) CHECK_OP_S(check_GT_impl, expr1, > , expr2) + +#if LOGURU_DEBUG_LOGGING + // Debug logging enabled: +#define DVLOG_IF_S(verbosity, cond) VLOG_IF_S(verbosity, cond) +#define DLOG_IF_S(verbosity_name, cond) LOG_IF_S(verbosity_name, cond) +#define DVLOG_S(verbosity) VLOG_S(verbosity) +#define DLOG_S(verbosity_name) LOG_S(verbosity_name) +#else + // Debug logging disabled: +#define DVLOG_IF_S(verbosity, cond) \ + (true || (verbosity) > loguru::current_verbosity_cutoff() || (cond) == false) \ + ? (void)0 \ + : loguru::Voidify() & loguru::StreamLogger(verbosity, __FILE__, __LINE__) + +#define DLOG_IF_S(verbosity_name, cond) DVLOG_IF_S(loguru::Verbosity_ ## verbosity_name, cond) +#define DVLOG_S(verbosity) DVLOG_IF_S(verbosity, true) +#define DLOG_S(verbosity_name) DVLOG_S(loguru::Verbosity_ ## verbosity_name) +#endif + +#if LOGURU_DEBUG_CHECKS + // Debug checks enabled: +#define DCHECK_S(cond) CHECK_S(cond) +#define DCHECK_NOTNULL_S(x) CHECK_NOTNULL_S(x) +#define DCHECK_EQ_S(a, b) CHECK_EQ_S(a, b) +#define DCHECK_NE_S(a, b) CHECK_NE_S(a, b) +#define DCHECK_LT_S(a, b) CHECK_LT_S(a, b) +#define DCHECK_LE_S(a, b) CHECK_LE_S(a, b) +#define DCHECK_GT_S(a, b) CHECK_GT_S(a, b) +#define DCHECK_GE_S(a, b) CHECK_GE_S(a, b) +#else +// Debug checks disabled: +#define DCHECK_S(cond) CHECK_S(true || (cond)) +#define DCHECK_NOTNULL_S(x) CHECK_S(true || (x) != nullptr) +#define DCHECK_EQ_S(a, b) CHECK_S(true || (a) == (b)) +#define DCHECK_NE_S(a, b) CHECK_S(true || (a) != (b)) +#define DCHECK_LT_S(a, b) CHECK_S(true || (a) < (b)) +#define DCHECK_LE_S(a, b) CHECK_S(true || (a) <= (b)) +#define DCHECK_GT_S(a, b) CHECK_S(true || (a) > (b)) +#define DCHECK_GE_S(a, b) CHECK_S(true || (a) >= (b)) +#endif + +#if LOGURU_REPLACE_GLOG +#undef LOG +#undef VLOG +#undef LOG_IF +#undef VLOG_IF +#undef CHECK +#undef CHECK_NOTNULL +#undef CHECK_EQ +#undef CHECK_NE +#undef CHECK_LT +#undef CHECK_LE +#undef CHECK_GT +#undef CHECK_GE +#undef DLOG +#undef DVLOG +#undef DLOG_IF +#undef DVLOG_IF +#undef DCHECK +#undef DCHECK_NOTNULL +#undef DCHECK_EQ +#undef DCHECK_NE +#undef DCHECK_LT +#undef DCHECK_LE +#undef DCHECK_GT +#undef DCHECK_GE +#undef VLOG_IS_ON + +#define LOG LOG_S +#define VLOG VLOG_S +#define LOG_IF LOG_IF_S +#define VLOG_IF VLOG_IF_S +#define CHECK(cond) CHECK_S(!!(cond)) +#define CHECK_NOTNULL CHECK_NOTNULL_S +#define CHECK_EQ CHECK_EQ_S +#define CHECK_NE CHECK_NE_S +#define CHECK_LT CHECK_LT_S +#define CHECK_LE CHECK_LE_S +#define CHECK_GT CHECK_GT_S +#define CHECK_GE CHECK_GE_S +#define DLOG DLOG_S +#define DVLOG DVLOG_S +#define DLOG_IF DLOG_IF_S +#define DVLOG_IF DVLOG_IF_S +#define DCHECK DCHECK_S +#define DCHECK_NOTNULL DCHECK_NOTNULL_S +#define DCHECK_EQ DCHECK_EQ_S +#define DCHECK_NE DCHECK_NE_S +#define DCHECK_LT DCHECK_LT_S +#define DCHECK_LE DCHECK_LE_S +#define DCHECK_GT DCHECK_GT_S +#define DCHECK_GE DCHECK_GE_S +#define VLOG_IS_ON(verbosity) ((verbosity) <= loguru::current_verbosity_cutoff()) + +#endif // LOGURU_REPLACE_GLOG + +#endif // LOGURU_WITH_STREAMS + +#endif // LOGURU_HAS_DECLARED_STREAMS_HEADER diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 978e47a..74d47ab 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,8 +1,8 @@ if(ENABLE_TESTING) include_directories( - ${BayesNet_SOURCE_DIR}/lib/Files - ${BayesNet_SOURCE_DIR}/lib/mdlp + ${BayesNet_SOURCE_DIR}/tests/lib/Files ${BayesNet_SOURCE_DIR}/lib/folding + ${BayesNet_SOURCE_DIR}/lib/mdlp ${BayesNet_SOURCE_DIR}/lib/json/include ${BayesNet_SOURCE_DIR} ${CMAKE_BINARY_DIR}/configured_files/include diff --git a/tests/TestBayesClassifier.cc b/tests/TestBayesClassifier.cc index 9b2bb85..3eb0a3f 100644 --- a/tests/TestBayesClassifier.cc +++ b/tests/TestBayesClassifier.cc @@ -18,47 +18,47 @@ TEST_CASE("Test Cannot build dataset with wrong data vector", "[Classifier]") auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); raw.yv.pop_back(); - REQUIRE_THROWS_AS(model.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv), std::runtime_error); - REQUIRE_THROWS_WITH(model.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv), "* Error in X and y dimensions *\nX dimensions: [4, 150]\ny dimensions: [149]"); + REQUIRE_THROWS_AS(model.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states), std::runtime_error); + REQUIRE_THROWS_WITH(model.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states), "* Error in X and y dimensions *\nX dimensions: [4, 150]\ny dimensions: [149]"); } TEST_CASE("Test Cannot build dataset with wrong data tensor", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); auto yshort = torch::zeros({ 149 }, torch::kInt32); - REQUIRE_THROWS_AS(model.fit(raw.Xt, yshort, raw.featurest, raw.classNamet, raw.statest), std::runtime_error); - REQUIRE_THROWS_WITH(model.fit(raw.Xt, yshort, raw.featurest, raw.classNamet, raw.statest), "* Error in X and y dimensions *\nX dimensions: [4, 150]\ny dimensions: [149]"); + REQUIRE_THROWS_AS(model.fit(raw.Xt, yshort, raw.features, raw.className, raw.states), std::runtime_error); + REQUIRE_THROWS_WITH(model.fit(raw.Xt, yshort, raw.features, raw.className, raw.states), "* Error in X and y dimensions *\nX dimensions: [4, 150]\ny dimensions: [149]"); } TEST_CASE("Invalid data type", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", false); - REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest), std::invalid_argument); - REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest), "dataset (X, y) must be of type Integer"); + REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states), "dataset (X, y) must be of type Integer"); } TEST_CASE("Invalid number of features", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); auto Xt = torch::cat({ raw.Xt, torch::zeros({ 1, 150 }, torch::kInt32) }, 0); - REQUIRE_THROWS_AS(model.fit(Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest), std::invalid_argument); - REQUIRE_THROWS_WITH(model.fit(Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest), "Classifier: X 5 and features 4 must have the same number of features"); + REQUIRE_THROWS_AS(model.fit(Xt, raw.yt, raw.features, raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(model.fit(Xt, raw.yt, raw.features, raw.className, raw.states), "Classifier: X 5 and features 4 must have the same number of features"); } TEST_CASE("Invalid class name", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); - REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.featurest, "duck", raw.statest), std::invalid_argument); - REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.featurest, "duck", raw.statest), "class name not found in states"); + REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.features, "duck", raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.features, "duck", raw.states), "class name not found in states"); } TEST_CASE("Invalid feature name", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); - auto statest = raw.statest; + auto statest = raw.states; statest.erase("petallength"); - REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, statest), std::invalid_argument); - REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, statest), "feature [petallength] not found in states"); + REQUIRE_THROWS_AS(model.fit(raw.Xt, raw.yt, raw.features, raw.className, statest), std::invalid_argument); + REQUIRE_THROWS_WITH(model.fit(raw.Xt, raw.yt, raw.features, raw.className, statest), "feature [petallength] not found in states"); } TEST_CASE("Invalid hyperparameter", "[Classifier]") { @@ -71,7 +71,7 @@ TEST_CASE("Topological order", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); - model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + model.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); auto order = model.topological_order(); REQUIRE(order.size() == 4); REQUIRE(order[0] == "petallength"); @@ -83,7 +83,7 @@ TEST_CASE("Dump_cpt", "[Classifier]") { auto model = bayesnet::TAN(); auto raw = RawDatasets("iris", true); - model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + model.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); auto cpt = model.dump_cpt(); REQUIRE(cpt.size() == 1713); } @@ -111,7 +111,7 @@ TEST_CASE("KDB Graph", "[Classifier]") { auto model = bayesnet::KDB(2); auto raw = RawDatasets("iris", true); - model.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + model.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto graph = model.graph(); REQUIRE(graph.size() == 15); } @@ -119,7 +119,7 @@ TEST_CASE("KDBLd Graph", "[Classifier]") { auto model = bayesnet::KDBLd(2); auto raw = RawDatasets("iris", false); - model.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + model.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); auto graph = model.graph(); REQUIRE(graph.size() == 15); } \ No newline at end of file diff --git a/tests/TestBayesEnsemble.cc b/tests/TestBayesEnsemble.cc index 9957ec3..bbfe086 100644 --- a/tests/TestBayesEnsemble.cc +++ b/tests/TestBayesEnsemble.cc @@ -18,7 +18,7 @@ TEST_CASE("Topological Order", "[Ensemble]") { auto raw = RawDatasets("glass", true); auto clf = bayesnet::BoostAODE(); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto order = clf.topological_order(); REQUIRE(order.size() == 0); } @@ -26,7 +26,7 @@ TEST_CASE("Dump CPT", "[Ensemble]") { auto raw = RawDatasets("glass", true); auto clf = bayesnet::BoostAODE(); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto dump = clf.dump_cpt(); REQUIRE(dump == ""); } @@ -34,7 +34,7 @@ TEST_CASE("Number of States", "[Ensemble]") { auto clf = bayesnet::BoostAODE(); auto raw = RawDatasets("iris", true); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfStates() == 76); } TEST_CASE("Show", "[Ensemble]") @@ -46,7 +46,7 @@ TEST_CASE("Show", "[Ensemble]") {"maxTolerance", 1}, {"convergence", false}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); std::vector expected = { "class -> sepallength, sepalwidth, petallength, petalwidth, ", "petallength -> sepallength, sepalwidth, petalwidth, ", @@ -78,16 +78,16 @@ TEST_CASE("Graph", "[Ensemble]") { auto clf = bayesnet::BoostAODE(); auto raw = RawDatasets("iris", true); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto graph = clf.graph(); REQUIRE(graph.size() == 56); auto clf2 = bayesnet::AODE(); - clf2.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf2.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); graph = clf2.graph(); REQUIRE(graph.size() == 56); raw = RawDatasets("glass", false); auto clf3 = bayesnet::AODELd(); - clf3.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + clf3.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); graph = clf3.graph(); REQUIRE(graph.size() == 261); } diff --git a/tests/TestBayesMetrics.cc b/tests/TestBayesMetrics.cc index c06ed03..e8ca01a 100644 --- a/tests/TestBayesMetrics.cc +++ b/tests/TestBayesMetrics.cc @@ -37,8 +37,8 @@ TEST_CASE("Metrics Test", "[Metrics]") { {"diabetes", 1}, { {1, 4}, {4, 3}, {3, 2}, {3, 5}, {2, 0}, {0, 7}, {0, 6} } } }; auto raw = RawDatasets(file_name, true); - bayesnet::Metrics metrics(raw.dataset, raw.featurest, raw.classNamet, raw.classNumStates); - bayesnet::Metrics metricsv(raw.Xv, raw.yv, raw.featurest, raw.classNamet, raw.classNumStates); + bayesnet::Metrics metrics(raw.dataset, raw.features, raw.className, raw.classNumStates); + bayesnet::Metrics metricsv(raw.Xv, raw.yv, raw.features, raw.className, raw.classNumStates); SECTION("Test Constructor") { @@ -69,8 +69,8 @@ TEST_CASE("Metrics Test", "[Metrics]") auto weights_matrix = metrics.conditionalEdge(raw.weights); auto weights_matrixv = metricsv.conditionalEdge(raw.weights); for (int i = 0; i < 2; ++i) { - auto result = metrics.maximumSpanningTree(raw.featurest, weights_matrix, i); - auto resultv = metricsv.maximumSpanningTree(raw.featurest, weights_matrixv, i); + auto result = metrics.maximumSpanningTree(raw.features, weights_matrix, i); + auto resultv = metricsv.maximumSpanningTree(raw.features, weights_matrixv, i); REQUIRE(result == resultsMST.at({ file_name, i })); REQUIRE(resultv == resultsMST.at({ file_name, i })); } diff --git a/tests/TestBayesModels.cc b/tests/TestBayesModels.cc index 28eb910..027bbc7 100644 --- a/tests/TestBayesModels.cc +++ b/tests/TestBayesModels.cc @@ -54,7 +54,7 @@ TEST_CASE("Test Bayesian Classifiers score & version", "[Models]") auto clf = models[name]; auto discretize = name.substr(name.length() - 2) != "Ld"; auto raw = RawDatasets(file_name, discretize); - clf->fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + clf->fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); auto score = clf->score(raw.Xt, raw.yt); INFO("Classifier: " + name + " File: " + file_name); REQUIRE(score == Catch::Approx(scores[{file_name, name}]).epsilon(raw.epsilon)); @@ -81,7 +81,7 @@ TEST_CASE("Models features & Graph", "[Models]") { auto raw = RawDatasets("iris", true); auto clf = bayesnet::TAN(); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 5); REQUIRE(clf.getNumberOfEdges() == 7); REQUIRE(clf.getNumberOfStates() == 19); @@ -93,7 +93,7 @@ TEST_CASE("Models features & Graph", "[Models]") { auto clf = bayesnet::TANLd(); auto raw = RawDatasets("iris", false); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + clf.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 5); REQUIRE(clf.getNumberOfEdges() == 7); REQUIRE(clf.getNumberOfStates() == 19); @@ -106,7 +106,7 @@ TEST_CASE("Get num features & num edges", "[Models]") { auto raw = RawDatasets("iris", true); auto clf = bayesnet::KDB(2); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 5); REQUIRE(clf.getNumberOfEdges() == 8); } @@ -166,7 +166,7 @@ TEST_CASE("Model predict_proba", "[Models]") SECTION("Test " + model + " predict_proba") { auto clf = models[model]; - clf->fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf->fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto y_pred_proba = clf->predict_proba(raw.Xv); auto yt_pred_proba = clf->predict_proba(raw.Xt); auto y_pred = clf->predict(raw.Xv); @@ -203,7 +203,7 @@ TEST_CASE("AODE voting-proba", "[Models]") { auto raw = RawDatasets("glass", true); auto clf = bayesnet::AODE(false); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto score_proba = clf.score(raw.Xv, raw.yv); auto pred_proba = clf.predict_proba(raw.Xv); clf.setHyperparameters({ @@ -222,9 +222,9 @@ TEST_CASE("SPODELd dataset", "[Models]") auto raw = RawDatasets("iris", false); auto clf = bayesnet::SPODELd(0); // raw.dataset.to(torch::kFloat32); - clf.fit(raw.dataset, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.dataset, raw.features, raw.className, raw.states); auto score = clf.score(raw.Xt, raw.yt); - clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + clf.fit(raw.Xt, raw.yt, raw.features, raw.className, raw.states); auto scoret = clf.score(raw.Xt, raw.yt); REQUIRE(score == Catch::Approx(0.97333f).epsilon(raw.epsilon)); REQUIRE(scoret == Catch::Approx(0.97333f).epsilon(raw.epsilon)); @@ -233,13 +233,13 @@ TEST_CASE("KDB with hyperparameters", "[Models]") { auto raw = RawDatasets("glass", true); auto clf = bayesnet::KDB(2); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto score = clf.score(raw.Xv, raw.yv); clf.setHyperparameters({ {"k", 3}, {"theta", 0.7}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto scoret = clf.score(raw.Xv, raw.yv); REQUIRE(score == Catch::Approx(0.827103).epsilon(raw.epsilon)); REQUIRE(scoret == Catch::Approx(0.761682).epsilon(raw.epsilon)); @@ -248,7 +248,7 @@ TEST_CASE("Incorrect type of data for SPODELd", "[Models]") { auto raw = RawDatasets("iris", true); auto clf = bayesnet::SPODELd(0); - REQUIRE_THROWS_AS(clf.fit(raw.dataset, raw.featurest, raw.classNamet, raw.statest), std::runtime_error); + REQUIRE_THROWS_AS(clf.fit(raw.dataset, raw.features, raw.className, raw.states), std::runtime_error); } TEST_CASE("Predict, predict_proba & score without fitting", "[Models]") { diff --git a/tests/TestBayesNetwork.cc b/tests/TestBayesNetwork.cc index f829af9..f89b2db 100644 --- a/tests/TestBayesNetwork.cc +++ b/tests/TestBayesNetwork.cc @@ -73,9 +73,9 @@ TEST_CASE("Test Bayesian Network", "[Network]") net3.initialize(); net2.initialize(); net.initialize(); - buildModel(net, raw.featuresv, raw.classNamev); - buildModel(net2, raw.featurest, raw.classNamet); - buildModel(net3, raw.featurest, raw.classNamet); + buildModel(net, raw.features, raw.className); + buildModel(net2, raw.features, raw.className); + buildModel(net3, raw.features, raw.className); std::vector> edges = { {"class", "sepallength"}, {"class", "sepalwidth"}, {"class", "petallength"}, {"class", "petalwidth" }, {"sepallength", "sepalwidth"}, {"sepallength", "petallength"}, @@ -114,9 +114,9 @@ TEST_CASE("Test Bayesian Network", "[Network]") REQUIRE(children == children3); } // Fit networks - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); - net2.fit(raw.dataset, raw.weights, raw.featurest, raw.classNamet, raw.statest); - net3.fit(raw.Xt, raw.yt, raw.weights, raw.featurest, raw.classNamet, raw.statest); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); + net2.fit(raw.dataset, raw.weights, raw.features, raw.className, raw.states); + net3.fit(raw.Xt, raw.yt, raw.weights, raw.features, raw.className, raw.states); REQUIRE(net.getStates() == net2.getStates()); REQUIRE(net.getStates() == net3.getStates()); REQUIRE(net.getFeatures() == net2.getFeatures()); @@ -192,8 +192,8 @@ TEST_CASE("Test Bayesian Network", "[Network]") } SECTION("Test predict") { - buildModel(net, raw.featuresv, raw.classNamev); - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(net, raw.features, raw.className); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); std::vector> test = { {1, 2, 0, 1, 1}, {0, 1, 2, 0, 1}, {0, 0, 0, 0, 1}, {2, 2, 2, 2, 1} }; std::vector y_test = { 2, 2, 0, 2, 1 }; auto y_pred = net.predict(test); @@ -201,8 +201,8 @@ TEST_CASE("Test Bayesian Network", "[Network]") } SECTION("Test predict_proba") { - buildModel(net, raw.featuresv, raw.classNamev); - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(net, raw.features, raw.className); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); std::vector> test = { {1, 2, 0, 1, 1}, {0, 1, 2, 0, 1}, {0, 0, 0, 0, 1}, {2, 2, 2, 2, 1} }; std::vector> y_test = { {0.450237, 0.0866621, 0.463101}, @@ -222,15 +222,15 @@ TEST_CASE("Test Bayesian Network", "[Network]") } SECTION("Test score") { - buildModel(net, raw.featuresv, raw.classNamev); - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(net, raw.features, raw.className); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); auto score = net.score(raw.Xv, raw.yv); REQUIRE(score == Catch::Approx(0.97333333).margin(threshold)); } SECTION("Copy constructor") { - buildModel(net, raw.featuresv, raw.classNamev); - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(net, raw.features, raw.className); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); auto net2 = bayesnet::Network(net); REQUIRE(net.getFeatures() == net2.getFeatures()); REQUIRE(net.getEdges() == net2.getEdges()); @@ -252,7 +252,7 @@ TEST_CASE("Test Bayesian Network", "[Network]") } SECTION("Test oddities") { - buildModel(net, raw.featuresv, raw.classNamev); + buildModel(net, raw.features, raw.className); // predict without fitting std::vector> test = { {1, 2, 0, 1, 1}, {0, 1, 2, 0, 1}, {0, 0, 0, 0, 1}, {2, 2, 2, 2, 1} }; auto test_tensor = bayesnet::vectorToTensor(test); @@ -266,8 +266,8 @@ TEST_CASE("Test Bayesian Network", "[Network]") REQUIRE_THROWS_WITH(net.score(raw.Xv, raw.yv), "You must call fit() before calling predict()"); // predict with wrong data auto netx = bayesnet::Network(); - buildModel(netx, raw.featuresv, raw.classNamev); - netx.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(netx, raw.features, raw.className); + netx.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); std::vector> test2 = { {1, 2, 0, 1, 1}, {0, 1, 2, 0, 1}, {0, 0, 0, 0, 1} }; auto test_tensor2 = bayesnet::vectorToTensor(test2, false); REQUIRE_THROWS_AS(netx.predict(test2), std::logic_error); @@ -277,41 +277,41 @@ TEST_CASE("Test Bayesian Network", "[Network]") // fit with wrong data // Weights auto net2 = bayesnet::Network(); - REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, std::vector(), raw.featuresv, raw.classNamev, raw.statesv), std::invalid_argument); + REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, std::vector(), raw.features, raw.className, raw.states), std::invalid_argument); std::string invalid_weights = "Weights (0) must have the same number of elements as samples (150) in Network::fit"; - REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, std::vector(), raw.featuresv, raw.classNamev, raw.statesv), invalid_weights); + REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, std::vector(), raw.features, raw.className, raw.states), invalid_weights); // X & y std::string invalid_labels = "X and y must have the same number of samples in Network::fit (150 != 0)"; - REQUIRE_THROWS_AS(net2.fit(raw.Xv, std::vector(), raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net2.fit(raw.Xv, std::vector(), raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv), invalid_labels); + REQUIRE_THROWS_AS(net2.fit(raw.Xv, std::vector(), raw.weightsv, raw.features, raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net2.fit(raw.Xv, std::vector(), raw.weightsv, raw.features, raw.className, raw.states), invalid_labels); // Features std::string invalid_features = "X and features must have the same number of features in Network::fit (4 != 0)"; - REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, raw.weightsv, std::vector(), raw.classNamev, raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, raw.weightsv, std::vector(), raw.classNamev, raw.statesv), invalid_features); + REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, raw.weightsv, std::vector(), raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, raw.weightsv, std::vector(), raw.className, raw.states), invalid_features); // Different number of features auto net3 = bayesnet::Network(); auto test2y = { 1, 2, 3, 4, 5 }; - buildModel(net3, raw.featuresv, raw.classNamev); - auto features3 = raw.featuresv; + buildModel(net3, raw.features, raw.className); + auto features3 = raw.features; features3.pop_back(); std::string invalid_features2 = "X and local features must have the same number of features in Network::fit (3 != 4)"; - REQUIRE_THROWS_AS(net3.fit(test2, test2y, std::vector(5, 0), features3, raw.classNamev, raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net3.fit(test2, test2y, std::vector(5, 0), features3, raw.classNamev, raw.statesv), invalid_features2); + REQUIRE_THROWS_AS(net3.fit(test2, test2y, std::vector(5, 0), features3, raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net3.fit(test2, test2y, std::vector(5, 0), features3, raw.className, raw.states), invalid_features2); // Uninitialized network std::string network_invalid = "The network has not been initialized. You must call addNode() before calling fit()"; - REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, "duck", raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, "duck", raw.statesv), network_invalid); + REQUIRE_THROWS_AS(net2.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, "duck", raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net2.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, "duck", raw.states), network_invalid); // Classname std::string invalid_classname = "Class Name not found in Network::features"; - REQUIRE_THROWS_AS(net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, "duck", raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, "duck", raw.statesv), invalid_classname); + REQUIRE_THROWS_AS(net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, "duck", raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, "duck", raw.states), invalid_classname); // Invalid feature - auto features2 = raw.featuresv; + auto features2 = raw.features; features2.pop_back(); features2.push_back("duck"); std::string invalid_feature = "Feature duck not found in Network::features"; - REQUIRE_THROWS_AS(net.fit(raw.Xv, raw.yv, raw.weightsv, features2, raw.classNamev, raw.statesv), std::invalid_argument); - REQUIRE_THROWS_WITH(net.fit(raw.Xv, raw.yv, raw.weightsv, features2, raw.classNamev, raw.statesv), invalid_feature); + REQUIRE_THROWS_AS(net.fit(raw.Xv, raw.yv, raw.weightsv, features2, raw.className, raw.states), std::invalid_argument); + REQUIRE_THROWS_WITH(net.fit(raw.Xv, raw.yv, raw.weightsv, features2, raw.className, raw.states), invalid_feature); } } @@ -355,8 +355,8 @@ TEST_CASE("Dump CPT", "[Network]") { auto net = bayesnet::Network(); auto raw = RawDatasets("iris", true); - buildModel(net, raw.featuresv, raw.classNamev); - net.fit(raw.Xv, raw.yv, raw.weightsv, raw.featuresv, raw.classNamev, raw.statesv); + buildModel(net, raw.features, raw.className); + net.fit(raw.Xv, raw.yv, raw.weightsv, raw.features, raw.className, raw.states); auto res = net.dump_cpt(); std::string expected = R"(* class: (3) : [3] 0.3333 diff --git a/tests/TestBoostAODE.cc b/tests/TestBoostAODE.cc index 19dee45..abad4ae 100644 --- a/tests/TestBoostAODE.cc +++ b/tests/TestBoostAODE.cc @@ -17,7 +17,7 @@ TEST_CASE("Feature_select CFS", "[BoostAODE]") auto raw = RawDatasets("glass", true); auto clf = bayesnet::BoostAODE(); clf.setHyperparameters({ {"select_features", "CFS"} }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 90); REQUIRE(clf.getNumberOfEdges() == 153); REQUIRE(clf.getNotes().size() == 2); @@ -29,7 +29,7 @@ TEST_CASE("Feature_select IWSS", "[BoostAODE]") auto raw = RawDatasets("glass", true); auto clf = bayesnet::BoostAODE(); clf.setHyperparameters({ {"select_features", "IWSS"}, {"threshold", 0.5 } }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 90); REQUIRE(clf.getNumberOfEdges() == 153); REQUIRE(clf.getNotes().size() == 2); @@ -41,7 +41,7 @@ TEST_CASE("Feature_select FCBF", "[BoostAODE]") auto raw = RawDatasets("glass", true); auto clf = bayesnet::BoostAODE(); clf.setHyperparameters({ {"select_features", "FCBF"}, {"threshold", 1e-7 } }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 90); REQUIRE(clf.getNumberOfEdges() == 153); REQUIRE(clf.getNotes().size() == 2); @@ -57,7 +57,7 @@ TEST_CASE("Test used features in train note and score", "[BoostAODE]") {"convergence", true}, {"select_features","CFS"}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 72); REQUIRE(clf.getNumberOfEdges() == 120); REQUIRE(clf.getNotes().size() == 2); @@ -72,7 +72,7 @@ TEST_CASE("Voting vs proba", "[BoostAODE]") { auto raw = RawDatasets("iris", true); auto clf = bayesnet::BoostAODE(false); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto score_proba = clf.score(raw.Xv, raw.yv); auto pred_proba = clf.predict_proba(raw.Xv); clf.setHyperparameters({ @@ -101,7 +101,7 @@ TEST_CASE("Order asc, desc & random", "[BoostAODE]") {"maxTolerance", 1}, {"convergence", false}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states); auto score = clf.score(raw.Xv, raw.yv); auto scoret = clf.score(raw.Xt, raw.yt); INFO("BoostAODE order: " + order); @@ -133,52 +133,76 @@ TEST_CASE("Oddities", "[BoostAODE]") for (const auto& hyper : bad_hyper_fit.items()) { INFO("BoostAODE hyper: " + hyper.value().dump()); clf.setHyperparameters(hyper.value()); - REQUIRE_THROWS_AS(clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv), std::invalid_argument); + REQUIRE_THROWS_AS(clf.fit(raw.Xv, raw.yv, raw.features, raw.className, raw.states), std::invalid_argument); } } -TEST_CASE("Bisection", "[BoostAODE]") +TEST_CASE("Bisection Best", "[BoostAODE]") { auto clf = bayesnet::BoostAODE(); - auto raw = RawDatasets("mfeat-factors", true); + auto raw = RawDatasets("mfeat-factors", true, 500); clf.setHyperparameters({ {"bisection", true}, {"maxTolerance", 3}, {"convergence", true}, {"block_update", false}, + {"convergence_best", true}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.X_train, raw.y_train, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 217); REQUIRE(clf.getNumberOfEdges() == 431); REQUIRE(clf.getNotes().size() == 3); REQUIRE(clf.getNotes()[0] == "Convergence threshold reached & 15 models eliminated"); REQUIRE(clf.getNotes()[1] == "Used features in train: 16 of 216"); REQUIRE(clf.getNotes()[2] == "Number of models: 1"); - auto score = clf.score(raw.Xv, raw.yv); - auto scoret = clf.score(raw.Xt, raw.yt); + auto score = clf.score(raw.X_test, raw.y_test); + auto scoret = clf.score(raw.X_test, raw.y_test); REQUIRE(score == Catch::Approx(1.0f).epsilon(raw.epsilon)); REQUIRE(scoret == Catch::Approx(1.0f).epsilon(raw.epsilon)); } +TEST_CASE("Bisection Best vs Last", "[BoostAODE]") +{ + auto raw = RawDatasets("mfeat-factors", true, 1500); + auto clf = bayesnet::BoostAODE(true); + auto hyperparameters = nlohmann::json{ + {"select_features", "IWSS"}, + {"threshold", 0.5}, + {"bisection", true}, + {"maxTolerance", 3}, + {"convergence", true}, + {"convergence_best", true}, + }; + clf.setHyperparameters(hyperparameters); + clf.fit(raw.X_train, raw.y_train, raw.features, raw.className, raw.states); + auto score_best = clf.score(raw.X_test, raw.y_test); + REQUIRE(score_best == Catch::Approx(1.0f).epsilon(raw.epsilon)); + // Now we will set the hyperparameter to use the last accuracy + hyperparameters["convergence_best"] = false; + clf.setHyperparameters(hyperparameters); + clf.fit(raw.X_train, raw.y_train, raw.features, raw.className, raw.states); + auto score_last = clf.score(raw.X_test, raw.y_test); + REQUIRE(score_last == Catch::Approx(1.0f).epsilon(raw.epsilon)); +} TEST_CASE("Block Update", "[BoostAODE]") { auto clf = bayesnet::BoostAODE(); - auto raw = RawDatasets("mfeat-factors", true); + auto raw = RawDatasets("mfeat-factors", true, 500); clf.setHyperparameters({ {"bisection", true}, {"block_update", true}, {"maxTolerance", 3}, {"convergence", true}, }); - clf.fit(raw.Xv, raw.yv, raw.featuresv, raw.classNamev, raw.statesv); + clf.fit(raw.X_train, raw.y_train, raw.features, raw.className, raw.states); REQUIRE(clf.getNumberOfNodes() == 217); REQUIRE(clf.getNumberOfEdges() == 431); REQUIRE(clf.getNotes().size() == 3); REQUIRE(clf.getNotes()[0] == "Convergence threshold reached & 15 models eliminated"); REQUIRE(clf.getNotes()[1] == "Used features in train: 16 of 216"); REQUIRE(clf.getNotes()[2] == "Number of models: 1"); - auto score = clf.score(raw.Xv, raw.yv); - auto scoret = clf.score(raw.Xt, raw.yt); + auto score = clf.score(raw.X_test, raw.y_test); + auto scoret = clf.score(raw.X_test, raw.y_test); REQUIRE(score == Catch::Approx(1.0f).epsilon(raw.epsilon)); REQUIRE(scoret == Catch::Approx(1.0f).epsilon(raw.epsilon)); } \ No newline at end of file diff --git a/tests/TestFeatureSelection.cc b/tests/TestFeatureSelection.cc index e20299b..b2dd4ce 100644 --- a/tests/TestFeatureSelection.cc +++ b/tests/TestFeatureSelection.cc @@ -17,11 +17,11 @@ bayesnet::FeatureSelect* build_selector(RawDatasets& raw, std::string selector, double threshold) { if (selector == "CFS") { - return new bayesnet::CFS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights); + return new bayesnet::CFS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights); } else if (selector == "FCBF") { - return new bayesnet::FCBF(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, threshold); + return new bayesnet::FCBF(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, threshold); } else if (selector == "IWSS") { - return new bayesnet::IWSS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, threshold); + return new bayesnet::IWSS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, threshold); } return nullptr; } @@ -80,10 +80,10 @@ TEST_CASE("Oddities", "[FeatureSelection]") { auto raw = RawDatasets("iris", true); // FCBF Limits - REQUIRE_THROWS_AS(bayesnet::FCBF(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, 1e-8), std::invalid_argument); - REQUIRE_THROWS_WITH(bayesnet::FCBF(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, 1e-8), "Threshold cannot be less than 1e-7"); - REQUIRE_THROWS_AS(bayesnet::IWSS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, -1e4), std::invalid_argument); - REQUIRE_THROWS_WITH(bayesnet::IWSS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, -1e4), "Threshold has to be in [0, 0.5]"); - REQUIRE_THROWS_AS(bayesnet::IWSS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, 0.501), std::invalid_argument); - REQUIRE_THROWS_WITH(bayesnet::IWSS(raw.dataset, raw.featuresv, raw.classNamev, raw.featuresv.size(), raw.classNumStates, raw.weights, 0.501), "Threshold has to be in [0, 0.5]"); + REQUIRE_THROWS_AS(bayesnet::FCBF(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, 1e-8), std::invalid_argument); + REQUIRE_THROWS_WITH(bayesnet::FCBF(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, 1e-8), "Threshold cannot be less than 1e-7"); + REQUIRE_THROWS_AS(bayesnet::IWSS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, -1e4), std::invalid_argument); + REQUIRE_THROWS_WITH(bayesnet::IWSS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, -1e4), "Threshold has to be in [0, 0.5]"); + REQUIRE_THROWS_AS(bayesnet::IWSS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, 0.501), std::invalid_argument); + REQUIRE_THROWS_WITH(bayesnet::IWSS(raw.dataset, raw.features, raw.className, raw.features.size(), raw.classNumStates, raw.weights, 0.501), "Threshold has to be in [0, 0.5]"); } \ No newline at end of file diff --git a/tests/data/mfeat-factors.arff b/tests/data/mfeat-factors.arff index 6bcfcad..6f74a29 100755 --- a/tests/data/mfeat-factors.arff +++ b/tests/data/mfeat-factors.arff @@ -497,3 +497,1810 @@ 97,181,566,727,584,633,3,4,9,2,2,1,234,296,617,662,601,988,2,29,22,13,2,15,330,404,676,609,942,713,33,21,12,11,12,12,398,434,660,766,789,912,27,21,22,12,14,9,357,457,640,780,889,732,34,29,12,13,15,8,329,407,475,758,976,702,33,19,1,13,12,10,327,407,716,565,648,1058,8,37,22,12,12,12,333,321,653,536,634,900,5,31,15,15,5,10,380,280,800,688,728,982,21,16,14,12,10,7,360,350,540,822,919,747,25,23,20,5,11,10,319,357,418,701,829,713,24,28,6,5,7,16,295,211,625,760,606,739,12,7,9,6,3,11,293,161,635,776,658,671,10,17,11,11,0,12,313,355,603,610,696,966,13,30,7,13,12,7,319,355,540,611,884,742,16,18,4,6,13,12,449,471,654,902,1115,603,24,16,20,4,13,11,419,397,881,789,586,1194,9,15,14,14,13,3,218,338,533,638,635,672,13,31,18,11,14,9,1 81,127,553,644,591,647,2,5,5,3,6,3,268,426,620,627,606,1004,7,24,26,12,8,17,348,478,665,594,987,727,38,26,16,12,20,12,310,538,663,697,804,924,26,28,26,9,18,9,311,573,639,729,906,750,39,30,16,8,17,10,331,479,482,741,1029,720,38,24,3,14,18,10,331,471,721,502,677,1074,13,32,26,9,18,12,345,319,654,461,685,916,10,34,19,16,13,12,382,348,803,587,737,998,20,11,18,9,8,7,430,372,511,825,956,757,30,26,18,6,9,10,365,347,401,680,872,735,29,31,2,10,15,16,279,221,596,685,643,755,11,10,13,11,7,11,247,193,616,675,711,691,9,10,15,10,8,14,335,391,618,571,719,988,18,25,11,8,20,9,337,391,543,630,937,764,21,23,8,9,21,12,429,415,637,911,1164,615,29,9,16,3,11,11,383,339,890,702,591,1210,4,10,18,9,11,3,290,356,510,543,628,682,18,36,16,16,14,11,1 88,234,590,605,583,692,2,9,3,8,8,5,251,491,683,604,624,1061,3,22,34,11,10,19,329,499,700,629,1021,772,34,28,24,17,20,10,273,633,704,680,816,971,26,32,34,10,16,11,280,616,686,736,932,791,35,34,24,13,15,12,268,538,543,778,1063,771,34,28,11,15,16,8,266,518,782,537,703,1131,9,30,34,8,16,16,296,336,717,470,719,973,6,32,27,15,13,14,355,423,850,536,719,1055,20,9,26,8,8,11,373,433,538,858,986,784,26,24,20,9,9,8,302,360,460,717,906,786,25,31,6,15,15,14,282,294,623,642,677,812,11,8,9,16,9,9,224,282,641,624,745,744,9,6,9,9,10,16,310,416,673,592,747,1039,14,23,19,9,20,11,322,424,602,685,971,815,17,25,16,14,19,8,386,348,664,958,1198,644,25,7,8,8,9,7,332,344,949,663,577,1267,8,8,26,10,9,5,259,413,523,498,602,703,14,36,14,17,12,13,1 +116,188,618,657,594,660,9,5,9,4,6,1,189,291,597,600,607,983,4,24,22,9,4,13,255,419,640,563,948,734,27,26,12,15,8,14,335,413,706,706,791,935,33,30,22,12,10,9,272,386,680,734,889,753,28,30,12,11,9,6,214,308,499,708,980,713,27,24,1,15,8,12,220,340,710,505,660,1033,2,32,22,6,8,10,246,298,647,460,644,895,1,32,15,13,3,8,343,225,766,612,732,989,21,9,14,6,8,9,327,357,596,772,929,772,19,24,24,7,9,12,248,320,442,651,839,692,18,27,6,11,3,18,280,222,681,690,616,714,16,12,9,10,5,13,256,138,673,700,662,668,12,12,11,7,4,10,258,376,555,564,706,941,7,25,7,7,8,5,248,372,558,571,894,755,10,23,4,2,9,12,372,410,710,862,1119,626,18,7,20,4,11,11,372,318,841,715,594,1177,15,10,14,8,11,5,221,409,585,566,631,703,17,34,22,9,10,7,1 +75,107,609,654,613,694,2,8,1,0,3,4,280,378,680,613,662,1049,3,21,32,11,3,18,342,498,675,648,1017,774,34,29,22,15,15,11,292,534,739,733,796,957,26,31,32,10,13,12,321,561,707,789,908,793,35,33,22,11,12,11,305,441,562,813,1063,775,34,27,9,15,15,9,307,479,793,580,735,1117,9,29,32,10,15,17,339,339,718,483,761,969,6,31,25,15,8,13,366,306,817,589,731,1049,20,8,24,10,7,8,376,370,551,863,1010,778,28,23,18,3,10,9,321,309,451,748,928,794,25,30,4,7,10,15,289,201,636,683,713,810,11,7,11,8,4,10,257,165,644,677,761,752,9,7,11,9,3,15,331,399,668,641,787,1043,14,22,17,11,15,10,329,397,627,694,1011,819,19,26,14,6,16,11,423,361,689,969,1228,646,25,8,10,2,10,10,343,373,934,716,607,1265,8,7,24,12,10,4,258,394,520,525,582,689,14,35,12,13,17,12,1 +98,102,624,690,616,648,2,7,5,4,3,2,193,395,703,619,635,969,3,20,26,13,5,16,251,413,704,652,970,722,34,30,22,11,17,11,307,497,736,763,789,875,26,30,34,8,17,12,244,530,716,803,875,743,35,32,22,7,16,9,226,410,587,813,1016,735,34,28,9,13,17,9,222,392,818,586,700,1037,9,28,28,10,17,13,266,276,743,495,712,901,6,30,27,17,10,11,323,321,854,629,734,979,20,7,28,10,11,10,367,309,576,867,963,708,26,22,12,7,10,9,274,312,474,748,881,758,25,29,6,11,12,15,242,176,661,707,664,750,11,8,13,10,4,10,228,158,669,717,722,714,9,8,17,11,5,13,238,364,685,653,742,1003,14,21,21,9,17,8,260,366,642,702,964,781,17,27,16,6,18,9,392,312,702,975,1181,602,25,9,16,2,12,8,340,326,953,754,608,1197,8,6,24,8,12,2,273,415,555,549,595,607,14,34,8,13,15,10,1 +189,195,599,668,598,656,3,8,3,8,7,6,254,406,676,637,605,989,2,23,28,11,9,20,260,454,695,608,936,736,33,27,18,13,19,11,188,538,713,729,795,907,27,33,28,10,17,10,241,529,691,759,865,759,34,33,18,9,16,13,201,411,538,763,980,733,33,27,5,15,17,9,191,401,775,534,670,1057,8,31,28,8,15,13,281,259,710,471,670,915,5,31,21,15,12,15,338,340,847,611,722,993,21,8,20,8,7,14,322,354,549,831,929,752,25,25,18,11,10,9,289,271,457,700,839,748,24,30,0,15,16,15,269,225,634,701,624,758,12,9,15,14,8,10,235,191,646,699,680,704,10,5,15,9,9,17,287,299,674,603,712,999,13,24,13,7,19,12,267,301,601,644,922,775,16,24,10,10,20,7,337,301,677,921,1139,628,24,6,14,6,8,8,307,283,946,732,594,1215,9,9,20,6,8,6,340,352,526,557,607,663,13,37,16,17,11,14,1 +101,91,581,656,595,634,2,9,2,5,2,3,234,426,618,637,624,955,3,18,29,14,4,15,326,450,663,638,1001,712,34,32,19,12,14,10,334,498,679,717,820,903,26,32,29,9,16,11,293,537,657,759,924,735,35,28,19,10,15,8,313,473,486,783,1039,695,34,30,6,12,14,10,313,447,721,544,695,1027,9,26,29,11,14,14,321,319,656,487,695,869,6,28,22,18,7,10,360,346,789,599,739,957,20,11,21,11,10,7,400,346,555,861,974,744,26,20,15,6,11,10,347,349,419,724,888,686,25,27,1,12,9,14,281,191,640,697,661,702,11,12,14,13,1,9,257,175,638,687,721,654,9,10,14,12,2,12,313,399,598,603,737,937,14,19,14,10,14,7,319,399,551,674,947,733,17,29,11,11,15,12,403,395,671,955,1174,608,25,11,13,5,13,11,401,381,878,714,593,1163,8,10,21,11,13,1,252,382,550,537,626,669,14,32,11,14,16,9,1 +89,195,603,616,592,634,2,9,2,7,6,2,252,402,656,583,641,961,3,22,29,8,8,16,348,564,703,656,1020,712,34,28,21,16,20,11,336,556,707,693,815,913,26,32,33,13,14,10,279,565,685,765,931,731,35,34,21,16,13,9,285,493,526,811,1062,691,34,28,8,18,16,11,287,507,761,566,714,1031,9,30,29,9,16,13,287,341,694,499,738,873,6,32,26,12,13,11,346,332,845,537,714,965,20,9,27,9,8,6,366,472,565,847,989,748,26,24,15,8,9,11,301,335,435,746,909,686,25,31,5,14,15,15,267,279,650,627,690,712,11,8,14,15,7,10,271,213,664,625,744,650,9,6,14,8,8,13,339,415,638,621,766,939,14,23,20,10,20,8,321,415,591,714,990,729,17,25,15,13,19,13,371,423,687,987,1207,604,25,7,13,7,9,12,397,311,916,666,586,1167,8,8,23,11,9,2,230,378,550,467,593,671,14,36,9,16,12,10,1 +128,114,624,614,565,645,6,3,2,3,2,3,239,385,689,553,606,1012,1,24,29,14,4,17,277,399,642,608,963,725,30,26,21,12,16,10,371,461,736,691,758,922,30,28,33,9,16,11,312,504,714,741,874,744,33,28,21,10,15,10,260,386,571,765,1005,726,30,24,8,12,16,10,268,390,798,530,689,1082,9,32,29,11,16,16,296,282,731,443,713,924,6,32,26,18,9,12,351,331,798,551,671,1006,18,9,27,11,10,7,327,293,578,805,940,735,28,24,15,6,11,10,274,254,462,700,864,745,25,27,5,8,11,14,292,112,663,631,669,763,15,12,14,9,3,9,332,152,647,639,707,703,13,14,14,12,4,14,274,336,675,593,735,994,14,25,20,10,16,9,260,336,632,656,957,770,19,23,15,7,17,12,384,334,704,931,1162,597,25,9,13,3,13,11,382,364,947,678,555,1218,12,10,23,11,13,3,195,363,535,465,546,654,14,34,9,14,16,11,1 +220,390,757,924,582,761,21,26,28,13,16,10,243,143,742,791,617,978,20,25,23,8,14,8,175,233,649,738,920,767,17,3,33,8,4,15,355,149,855,997,705,744,25,13,23,11,8,2,380,188,821,1003,819,682,30,19,33,12,9,11,196,260,658,935,968,854,27,5,38,6,4,21,254,208,849,794,718,996,28,17,23,13,4,1,242,262,782,729,740,890,25,11,30,4,11,13,429,175,775,881,646,924,21,26,31,11,8,18,235,275,735,793,927,737,27,19,7,12,9,9,200,378,593,884,845,911,24,12,35,6,9,15,260,336,820,885,692,815,24,27,36,5,15,12,380,286,752,969,694,849,28,35,34,10,16,11,270,274,702,847,746,1048,33,18,38,12,4,12,166,290,699,682,962,852,30,6,41,7,3,19,314,500,859,955,1145,695,24,24,35,13,11,20,454,376,986,1006,564,1040,27,39,31,13,11,14,295,261,682,773,501,614,9,5,21,8,12,14,2 +238,554,932,747,584,834,38,31,23,7,10,12,307,243,719,650,621,933,33,22,24,14,14,10,271,169,834,633,1000,832,12,16,38,14,10,5,297,169,984,830,795,901,14,10,28,17,2,0,338,184,954,852,911,851,9,6,38,18,3,9,194,312,795,822,1042,799,4,12,33,12,10,13,278,360,866,637,712,903,27,14,28,17,10,3,292,492,823,540,732,865,30,24,35,10,13,15,431,317,792,684,694,967,30,37,36,17,8,16,183,313,918,840,965,890,10,20,2,6,3,1,196,418,764,753,885,718,11,25,30,0,11,5,242,458,1003,742,690,750,29,32,31,1,9,2,396,454,935,772,726,694,31,34,31,16,14,13,368,466,633,700,748,911,22,21,41,18,10,10,238,462,820,599,968,851,19,19,40,11,9,13,290,416,1022,886,1179,808,11,37,30,9,5,10,450,550,911,821,572,1011,44,36,36,19,13,14,299,451,869,594,573,763,22,8,22,10,14,16,2 +346,452,839,1134,652,817,25,16,32,16,11,9,291,227,758,987,693,1026,22,33,21,5,9,11,221,281,759,906,944,777,11,7,31,5,11,20,257,251,959,1193,705,686,21,23,21,8,1,1,318,276,923,1177,795,666,26,27,31,9,2,12,158,278,754,1075,1000,900,27,11,42,3,9,18,278,234,903,992,788,938,30,25,21,10,9,6,196,202,844,947,818,842,27,11,28,1,10,16,393,215,815,1099,708,824,7,28,29,8,1,17,153,275,797,855,999,753,35,29,9,13,8,18,254,262,651,1028,907,1001,36,12,39,9,12,24,360,372,882,1079,764,859,34,17,34,8,14,19,390,368,836,1187,752,821,32,25,32,7,9,16,366,156,714,1029,820,1006,35,22,36,9,11,11,160,152,813,820,1036,874,40,4,39,10,10,16,176,398,935,985,1141,751,36,14,37,16,14,17,392,338,992,1214,636,912,31,29,29,10,4,11,327,297,740,983,535,658,23,15,19,9,13,17,2 +258,410,870,674,619,634,30,32,17,16,11,12,141,399,753,609,646,913,25,21,28,11,9,10,141,203,750,586,865,668,6,15,24,3,3,1,431,251,892,747,632,785,28,11,26,6,15,6,394,270,864,777,744,689,21,7,24,7,16,11,224,358,725,759,921,691,22,13,23,1,9,3,232,426,836,556,753,975,19,13,26,16,9,3,210,542,793,469,787,841,22,23,25,7,10,15,387,483,806,621,651,923,12,36,24,6,15,16,369,229,864,801,904,724,28,19,20,17,16,1,258,284,752,692,826,740,25,24,20,11,10,5,328,308,949,699,739,730,21,33,13,10,10,0,292,494,867,709,713,662,23,35,15,5,9,13,208,414,737,625,769,935,14,20,25,15,3,10,172,404,740,606,977,719,19,18,22,12,4,3,422,280,950,885,1084,620,25,36,16,16,18,2,454,686,1017,744,591,1087,36,35,24,12,18,8,295,441,811,553,528,657,26,7,20,11,17,16,2 +303,445,1147,558,670,604,39,23,8,16,12,12,228,572,834,567,685,691,34,34,39,19,10,10,126,196,913,582,866,540,3,6,29,5,8,1,390,310,1099,641,621,651,25,22,39,8,20,16,411,265,1077,701,709,493,12,22,29,9,21,11,171,327,968,753,926,541,13,10,16,3,14,1,289,511,897,508,804,757,28,26,39,24,14,11,249,623,898,431,842,599,31,16,32,15,15,15,474,568,753,467,682,675,21,29,31,10,20,16,290,290,1151,837,881,672,21,26,25,15,21,1,283,285,1013,678,833,644,22,19,11,9,15,5,297,381,1236,591,794,630,30,18,12,8,11,0,359,523,1144,553,756,542,32,26,14,13,10,13,281,469,826,563,810,663,23,23,24,23,8,10,129,447,961,654,1002,533,20,3,21,16,9,3,343,321,1207,919,1043,588,22,15,3,16,23,2,521,749,940,608,638,887,45,30,31,20,23,8,354,498,1096,453,587,717,23,14,19,11,14,16,2 +265,359,755,933,689,559,15,34,24,13,18,15,104,200,536,798,644,796,10,7,15,2,14,7,118,324,725,737,733,551,21,17,3,6,4,2,400,276,729,924,724,752,27,23,7,13,8,7,333,293,711,886,836,566,22,23,3,10,9,12,187,301,580,748,721,528,21,17,16,8,12,4,161,223,585,755,615,858,4,9,7,5,4,2,169,139,554,780,575,708,7,3,0,2,11,12,298,200,627,932,785,796,29,14,1,5,8,13,334,324,759,730,750,673,13,11,37,10,13,4,165,321,613,727,658,585,12,8,21,12,17,2,329,291,844,982,551,583,10,29,20,11,17,3,317,271,824,1020,631,559,8,23,18,4,16,10,161,147,472,756,643,766,1,8,8,6,4,13,181,181,577,517,607,558,4,12,11,13,3,6,391,461,821,762,854,553,12,28,35,13,19,5,367,269,748,999,679,998,21,21,1,7,11,11,252,246,752,864,772,672,23,15,27,12,12,13,2 +257,363,1060,558,562,740,35,10,8,9,12,12,338,572,737,559,595,675,30,37,39,16,16,10,252,244,906,590,940,694,7,13,29,16,8,1,322,314,1020,639,735,829,19,29,39,19,6,16,379,321,992,701,851,637,14,35,29,20,7,11,197,361,887,753,982,645,9,17,16,14,8,1,319,469,830,508,696,749,24,39,39,19,12,11,305,565,813,435,722,647,27,21,32,12,15,15,486,570,734,481,638,713,25,22,31,19,18,16,182,220,1064,829,919,832,9,25,25,6,5,1,227,229,910,682,835,656,8,20,11,2,11,5,249,319,1149,593,674,718,26,13,12,3,11,0,411,455,1081,569,670,568,28,19,14,18,14,13,381,439,659,563,720,613,19,34,24,20,8,10,203,405,882,656,938,663,16,10,21,13,7,3,293,245,1128,923,1137,730,8,8,3,11,7,2,505,673,739,618,538,831,41,23,31,21,19,8,346,466,1019,459,515,855,19,21,19,10,14,16,2 +267,425,731,653,636,564,19,29,13,11,12,17,270,310,596,576,649,913,14,24,22,10,10,3,280,260,685,573,922,624,17,18,22,10,2,6,492,204,753,724,783,823,27,8,30,13,14,7,493,269,725,754,863,643,22,4,22,14,15,10,329,337,578,742,968,623,17,14,11,8,8,8,391,373,671,533,704,983,8,16,28,13,8,4,263,463,624,460,684,825,11,26,27,6,9,8,460,378,711,612,744,907,17,39,26,13,14,11,386,264,725,752,939,678,17,22,18,10,15,8,347,393,597,675,849,676,14,27,12,4,9,2,387,331,810,660,644,670,10,30,15,3,11,7,325,375,764,700,686,620,12,32,17,12,10,6,373,437,560,596,748,891,3,23,19,14,2,11,265,423,591,591,932,667,8,21,16,7,3,10,455,445,813,874,1119,550,14,39,20,11,17,9,587,589,850,729,626,1119,25,38,24,15,17,15,306,370,684,528,629,661,21,10,18,10,16,9,2 +167,511,741,635,663,652,30,29,7,13,13,11,226,336,694,576,708,993,25,24,38,8,11,3,310,298,653,563,1047,730,6,18,28,8,1,12,422,268,803,712,820,875,22,8,38,11,13,13,341,323,775,742,928,749,17,4,28,12,14,6,333,405,620,736,1095,739,18,14,15,6,7,14,343,425,795,521,787,1059,19,16,38,13,7,10,289,569,738,424,811,919,22,26,31,4,8,2,416,394,789,574,771,999,14,39,30,11,13,9,442,356,727,778,1042,748,26,22,24,12,14,14,351,433,591,669,966,754,27,27,10,6,8,8,307,445,812,660,767,764,27,30,11,5,12,13,251,501,752,662,811,712,25,32,13,10,11,0,317,573,654,590,835,1003,20,23,23,12,1,9,323,549,647,589,1059,779,23,21,20,7,2,16,437,457,831,868,1238,624,27,39,4,13,16,15,495,583,942,703,655,1189,36,38,30,13,16,11,246,482,684,512,642,661,26,10,18,8,15,3,2 +140,432,682,781,685,674,6,28,21,16,16,11,223,255,643,680,676,971,1,25,12,5,14,3,321,311,700,591,885,742,30,19,0,5,2,12,421,235,732,818,828,943,30,7,10,8,10,13,352,306,720,820,916,761,31,3,0,9,11,6,312,410,527,734,889,711,30,15,13,3,4,14,326,368,740,619,651,1017,5,17,10,8,4,10,284,392,691,596,565,885,2,27,3,1,9,2,321,315,790,748,825,983,20,40,2,8,10,9,421,359,676,776,904,790,22,23,40,13,11,14,338,524,522,693,800,676,21,28,18,9,9,8,320,414,761,806,571,698,15,29,17,8,15,13,280,348,735,836,651,654,13,31,15,7,14,0,306,488,587,656,709,925,10,24,5,9,2,9,312,500,594,545,797,755,13,22,8,10,1,16,458,564,764,844,1040,644,21,40,32,16,13,15,430,468,885,849,687,1161,12,39,2,10,13,11,215,379,657,686,748,715,14,11,24,9,14,3,2 +177,495,898,670,586,667,35,28,15,16,12,17,218,372,681,619,607,832,30,25,24,7,14,5,248,216,750,580,884,687,3,19,14,5,8,4,416,258,934,731,709,882,23,7,24,8,12,7,335,247,906,749,809,684,16,3,14,9,13,12,257,311,757,753,924,598,13,15,15,3,8,6,231,467,818,536,702,902,24,17,24,12,12,2,275,623,779,473,718,746,27,27,17,3,15,10,368,404,764,613,634,830,21,40,16,8,14,11,390,318,890,817,889,791,13,23,32,13,13,6,249,363,736,682,799,595,10,28,18,9,13,0,279,439,975,703,674,685,26,29,5,8,11,5,331,525,897,701,660,549,28,31,3,7,14,8,243,499,629,591,722,820,19,24,9,11,8,13,245,483,770,622,918,654,16,22,10,10,7,8,449,393,982,897,1095,661,10,40,18,16,15,7,413,675,877,734,564,1042,41,39,16,10,19,13,294,436,841,569,523,750,19,11,12,9,8,11,2 +232,480,989,630,583,679,35,31,8,14,7,15,221,461,712,571,586,802,30,22,33,13,11,7,173,235,793,618,849,677,1,16,31,7,13,2,385,279,1001,719,678,858,25,10,43,10,13,9,376,258,973,765,760,670,16,6,31,11,14,14,204,356,834,787,897,618,15,12,18,5,13,4,230,504,867,556,679,850,24,14,37,18,15,4,240,630,830,459,713,734,27,24,36,9,10,12,409,511,779,561,631,808,19,37,37,10,17,13,299,311,985,835,852,773,15,20,19,13,14,4,192,350,831,718,774,659,12,25,15,7,14,2,240,392,1070,649,669,687,26,32,16,6,6,3,346,566,982,649,651,551,28,34,16,9,9,10,248,496,710,621,691,798,19,21,30,17,13,13,180,484,841,680,895,664,16,19,25,10,12,6,380,326,1069,947,1056,665,12,37,9,14,16,5,432,766,906,698,567,1010,41,36,33,14,16,11,319,503,932,491,546,730,19,8,13,9,11,13,2 +224,442,940,577,707,613,33,32,9,16,10,8,219,443,887,554,734,982,28,23,40,21,8,6,323,299,784,575,953,693,3,23,30,3,4,15,423,283,1012,662,710,892,23,9,40,6,16,16,376,304,984,728,790,712,18,1,30,7,17,9,360,380,817,758,1015,692,19,19,17,1,10,17,322,524,1000,529,839,1052,22,15,40,24,10,13,278,644,943,422,871,894,25,25,33,17,11,1,337,471,912,490,747,976,15,38,32,12,16,6,513,309,924,840,940,729,27,21,26,17,17,17,384,362,786,681,910,707,28,26,12,11,11,11,380,396,1009,598,827,733,26,29,13,10,9,16,264,508,927,578,815,665,26,29,15,15,8,3,310,526,807,590,857,960,19,22,25,23,4,12,370,498,852,647,1061,736,24,24,22,16,5,19,534,410,1032,910,1094,587,28,38,2,16,19,18,400,756,1021,629,683,1188,39,37,32,22,19,8,273,399,869,444,654,678,27,9,20,13,16,0,2 +195,469,745,907,548,821,18,34,31,9,14,11,292,132,690,764,581,1050,17,19,20,12,10,7,266,214,657,679,942,843,24,13,30,12,8,12,320,92,841,972,737,808,22,13,20,15,4,3,309,185,807,964,853,750,29,9,30,16,5,12,219,331,636,882,984,922,24,15,41,10,8,20,255,259,801,771,682,1064,25,11,20,15,8,0,297,319,736,708,706,958,22,21,27,8,15,12,408,216,743,860,636,970,20,34,28,15,4,19,236,294,717,782,917,813,24,17,10,8,5,6,197,445,575,833,831,967,23,22,38,2,13,12,207,411,802,886,658,887,25,33,33,1,11,9,383,363,746,948,666,923,25,35,31,14,12,10,323,311,690,812,708,1120,30,18,35,16,8,13,243,333,683,627,926,928,31,16,38,9,7,20,323,551,841,898,1131,763,23,34,38,9,9,17,407,421,954,985,526,1070,24,33,28,17,7,15,294,286,664,760,515,676,10,5,18,12,14,13,2 +180,484,876,601,619,656,33,30,9,10,10,17,325,397,643,578,634,825,28,23,40,11,8,5,339,311,776,585,921,668,3,17,30,11,6,4,439,295,908,680,776,851,23,9,40,14,18,7,394,310,880,728,858,653,18,5,30,15,19,12,344,388,727,750,963,577,13,13,17,9,12,6,340,504,786,517,717,895,22,15,40,14,12,2,388,644,749,416,699,737,25,25,33,7,13,10,471,451,776,534,697,819,21,38,32,14,18,11,379,323,868,820,926,786,13,21,26,9,19,6,300,380,714,681,832,598,10,26,12,3,13,0,286,418,953,638,667,678,24,31,13,2,9,5,390,532,897,622,669,552,26,33,15,13,8,8,336,532,593,582,745,803,17,22,25,15,6,13,310,502,744,629,931,631,14,20,22,8,7,8,474,396,960,902,1122,650,10,38,2,10,21,7,496,712,841,663,609,1031,39,37,32,16,21,13,313,423,823,498,578,753,17,9,20,11,14,11,2 +188,528,814,805,628,722,30,28,25,15,12,11,193,223,781,696,649,953,25,25,26,14,10,7,175,191,730,655,910,740,6,19,36,6,2,8,399,141,904,894,699,789,30,7,26,9,14,3,356,186,876,904,815,695,21,3,36,10,15,12,216,318,699,854,956,787,22,15,35,4,8,16,244,328,880,693,760,999,19,17,26,19,8,0,252,414,819,602,800,883,22,27,33,10,9,12,411,297,872,744,664,943,12,40,34,9,14,17,339,281,796,826,919,772,26,23,4,14,15,4,244,412,656,799,843,814,23,28,32,8,11,8,264,434,881,802,756,776,21,29,33,7,11,5,298,426,815,832,730,772,23,31,33,8,10,10,232,412,769,752,772,1017,14,24,41,18,2,13,182,404,750,619,978,809,17,22,42,11,3,16,384,458,908,906,1117,694,23,40,32,15,17,13,466,494,1047,881,600,1059,36,39,34,15,17,15,317,355,747,654,575,657,24,11,24,10,16,13,2 +295,473,978,778,661,649,34,39,23,15,16,15,100,236,921,673,658,912,29,12,24,20,14,3,114,92,818,668,851,689,2,20,38,2,2,8,428,114,1038,877,602,752,22,20,28,5,10,7,361,131,1010,895,684,652,17,10,38,6,11,10,197,203,857,863,909,740,18,20,33,0,4,16,191,279,1018,682,785,966,23,4,28,23,4,4,141,403,961,579,855,848,26,14,35,16,9,8,288,288,944,715,663,918,16,27,36,11,10,15,354,224,966,825,846,705,26,16,2,18,11,8,193,295,828,800,804,767,27,15,30,12,7,8,363,365,1051,777,779,731,27,32,31,11,15,7,271,405,951,803,747,725,27,30,31,14,14,6,187,309,849,747,781,974,20,11,43,22,2,11,173,303,884,658,965,764,25,15,40,15,1,16,401,401,1066,941,990,625,27,41,30,15,13,13,379,509,1103,852,625,1048,40,26,36,21,13,17,274,298,909,621,614,600,26,2,22,14,12,9,2 +196,476,924,611,593,673,33,30,9,16,9,15,267,391,683,576,626,870,28,23,40,11,7,7,253,249,788,567,925,677,3,17,30,5,5,2,411,257,952,686,716,858,27,9,40,8,17,5,384,276,924,724,832,666,18,5,30,9,18,12,294,354,773,740,969,620,17,13,17,3,11,4,296,490,828,505,725,938,22,15,40,16,11,0,346,626,791,402,755,790,25,25,33,7,12,12,453,435,810,544,649,870,17,38,32,8,17,13,389,299,918,806,914,781,17,21,26,15,18,4,302,366,764,667,836,671,14,26,12,9,12,2,284,408,1003,646,711,695,24,31,13,8,8,3,352,516,917,632,709,609,26,33,15,7,7,10,276,496,667,576,751,866,17,22,25,15,5,13,250,474,788,601,961,656,14,20,22,10,6,6,434,370,1006,876,1128,661,14,38,2,16,20,5,480,716,925,673,573,1088,39,37,32,12,20,11,347,425,865,488,544,724,17,9,20,9,15,13,2 +191,483,942,588,605,630,33,31,7,14,10,17,218,416,727,577,628,873,28,22,38,15,8,3,266,266,792,576,893,636,3,16,28,7,6,6,476,274,970,671,668,825,31,10,38,10,18,7,403,291,942,715,784,643,18,6,28,11,19,10,317,365,787,745,943,605,19,12,15,5,12,8,315,515,842,508,737,941,22,14,38,20,12,4,321,641,807,417,775,793,25,24,31,11,13,8,438,452,828,509,643,873,15,37,30,10,18,11,420,316,936,819,902,738,21,20,24,13,19,8,299,355,790,674,824,660,18,25,10,7,13,2,325,413,1021,623,731,674,24,32,11,6,9,7,349,519,933,597,709,604,26,34,13,9,8,6,279,515,703,573,751,869,17,21,23,19,6,11,277,495,806,638,957,645,14,19,20,12,7,10,475,395,1024,905,1094,618,18,37,4,14,21,9,493,741,991,650,579,1091,39,36,30,16,21,15,322,426,883,479,552,681,19,8,18,11,14,9,2 +331,375,857,963,707,625,13,29,24,10,14,12,162,212,634,822,668,774,8,16,17,1,10,10,116,290,777,765,783,607,23,10,3,3,8,1,346,260,817,958,752,816,29,26,7,10,4,8,315,237,795,920,868,632,24,26,3,7,5,11,153,235,682,782,761,578,23,14,16,5,8,1,145,239,661,787,649,808,2,12,7,2,8,3,135,189,626,808,627,688,5,6,0,5,11,15,302,182,687,960,795,804,29,17,1,2,4,16,280,334,861,764,792,739,15,20,37,11,9,1,205,307,707,759,708,571,14,11,21,15,13,5,351,309,946,1008,565,573,12,24,20,14,15,0,313,271,914,1048,645,597,8,24,18,1,12,13,225,219,538,788,677,716,3,11,8,3,8,10,183,233,675,551,661,588,6,7,11,10,7,3,327,451,921,802,906,627,14,25,35,10,15,2,361,271,792,1031,693,960,19,26,1,4,7,8,310,358,842,890,782,758,23,18,29,13,16,16,2 +206,424,813,736,601,676,29,29,12,9,15,16,275,335,562,661,610,807,24,26,19,12,13,6,261,221,783,568,919,670,9,20,9,12,1,3,409,215,845,787,784,841,17,6,19,15,11,6,396,254,817,793,876,641,12,4,9,16,12,13,272,334,662,735,945,589,7,16,4,10,5,5,292,412,715,584,635,877,18,18,19,15,5,1,322,538,676,537,613,719,21,28,12,8,8,11,461,421,769,689,735,801,27,41,11,15,11,12,311,231,805,789,900,798,7,24,31,8,12,5,222,318,651,686,810,620,4,29,9,2,6,1,260,352,890,765,595,688,20,30,8,1,14,4,372,438,840,777,627,582,22,32,8,14,13,9,302,420,502,631,681,785,13,25,4,16,1,14,244,392,681,582,861,631,10,23,1,9,0,7,416,370,897,867,1088,672,4,41,23,9,14,6,480,638,752,802,597,1013,35,40,11,17,14,12,301,341,770,637,646,783,13,12,21,12,13,12,2 +223,447,805,729,602,604,22,29,11,13,11,18,182,302,684,660,615,939,17,24,20,8,9,4,242,244,767,581,906,652,14,18,10,8,3,5,502,214,839,784,759,853,28,8,20,11,15,6,421,271,815,798,829,671,23,4,10,12,16,11,313,361,654,742,952,649,18,14,3,6,9,7,293,391,765,581,656,1009,11,16,20,11,9,3,265,521,720,526,668,851,14,26,13,4,10,9,402,376,803,678,710,933,16,39,12,11,15,10,412,268,797,796,895,722,18,22,30,12,16,7,269,387,657,689,815,680,15,27,8,6,10,1,347,373,882,758,626,698,13,30,7,5,10,6,343,443,824,766,658,630,15,32,9,10,9,7,247,461,642,634,690,917,6,23,5,12,3,12,269,445,675,601,902,693,9,21,2,7,4,9,493,437,887,886,1113,588,15,39,22,13,18,8,479,601,938,793,594,1145,28,38,12,13,18,14,286,364,752,626,611,687,18,10,22,8,17,10,2 +154,486,852,633,596,695,35,28,4,9,14,16,297,327,701,584,629,922,30,25,31,12,12,2,341,307,720,635,970,741,5,19,27,12,0,7,433,265,914,724,765,906,21,7,39,15,12,8,368,312,882,778,881,762,16,3,27,16,13,9,334,394,723,814,1012,700,11,15,14,10,6,9,336,436,828,583,728,988,24,17,33,15,6,5,360,558,775,470,760,850,27,27,32,8,11,7,429,365,790,568,678,938,23,40,33,15,12,12,395,345,836,834,949,789,11,23,17,8,13,9,296,452,682,741,871,685,8,28,11,2,7,3,272,422,921,654,718,697,26,29,12,1,13,8,344,460,859,656,722,643,28,31,12,14,12,5,332,544,641,638,752,934,19,24,26,16,0,10,308,534,750,683,966,750,16,22,21,9,1,11,466,488,944,954,1159,665,8,40,11,9,15,10,464,584,923,701,578,1150,41,39,29,17,15,16,299,453,791,496,563,692,19,11,11,12,14,8,2 +267,403,807,619,636,555,31,29,7,15,10,17,234,348,654,578,647,886,26,24,34,10,8,5,246,226,695,545,858,597,5,6,24,6,4,4,476,212,809,694,733,796,29,10,34,9,16,5,471,275,781,724,807,616,20,16,24,10,17,12,289,297,644,718,904,596,21,8,11,4,10,6,331,379,697,503,714,956,20,16,34,15,10,2,265,523,654,410,698,798,23,14,27,6,11,10,440,418,695,562,710,880,13,27,26,9,16,11,392,230,805,768,893,665,27,16,24,14,17,6,323,335,677,651,803,663,24,15,6,8,11,0,369,329,890,646,658,647,22,30,11,7,9,5,327,431,834,650,668,607,24,34,13,8,8,8,317,445,612,572,746,864,15,17,19,14,4,13,243,425,651,571,920,640,18,9,16,9,5,8,447,355,885,850,1059,539,24,27,8,15,19,7,549,641,886,687,628,1092,37,38,26,11,19,13,314,388,762,504,613,656,25,2,20,8,16,11,2 +133,489,890,716,746,661,34,30,10,13,13,14,256,248,647,623,783,956,31,23,25,16,17,8,304,212,786,698,1068,717,18,17,33,8,7,1,308,168,942,813,831,826,12,9,41,11,5,2,263,193,912,869,925,734,17,5,33,12,6,11,221,265,749,883,1122,760,18,13,20,6,7,9,239,365,812,656,874,1020,39,15,39,21,9,1,285,491,771,537,898,890,36,25,38,12,14,13,362,308,734,651,822,970,16,38,39,11,11,14,266,278,878,827,1087,699,26,21,11,12,6,3,233,333,724,808,1009,783,27,26,17,6,12,3,257,381,963,711,854,751,29,31,18,5,12,2,325,403,893,739,874,739,33,33,18,10,15,11,301,427,575,727,912,1006,38,22,32,20,7,12,289,397,778,718,1128,792,35,20,27,13,6,9,309,447,978,995,1209,615,27,38,17,13,8,6,405,565,815,788,734,1172,40,37,35,17,16,12,222,350,833,555,705,550,18,9,9,12,13,14,2 +169,451,879,677,644,704,27,28,22,12,13,15,318,340,602,632,661,839,22,25,19,9,13,7,298,226,805,573,974,708,11,19,9,9,7,2,330,206,897,744,829,881,15,7,19,12,5,9,321,251,869,768,915,683,10,3,9,13,6,14,259,341,722,750,1002,631,9,15,14,7,7,4,301,423,757,547,734,909,16,17,19,12,7,4,347,565,722,464,714,751,19,27,12,5,14,12,450,422,749,616,744,839,29,40,11,12,7,13,294,242,875,816,963,820,5,23,39,11,6,4,265,365,721,681,877,646,2,28,19,5,12,2,239,375,960,710,684,706,18,29,12,4,12,3,361,483,914,704,706,574,20,31,12,11,15,10,337,463,548,612,774,817,11,24,6,13,7,13,251,433,737,601,958,683,8,22,9,6,6,6,357,353,959,876,1161,690,2,40,23,12,8,5,455,669,768,741,632,1045,33,39,11,14,12,11,326,402,836,570,627,793,13,11,21,9,13,13,2 +192,532,945,682,573,688,37,32,36,15,13,16,267,309,712,611,606,821,32,21,29,6,11,6,241,169,799,558,941,700,5,15,19,6,7,3,331,183,977,743,736,879,21,11,13,9,5,4,320,182,949,765,852,687,14,7,19,10,6,13,210,320,794,735,983,619,11,13,32,4,7,7,230,426,847,544,705,891,26,13,13,11,7,1,268,558,812,473,735,743,29,23,16,2,14,11,401,363,827,625,645,845,23,36,17,9,5,12,303,269,937,787,916,806,11,19,21,14,6,5,214,402,783,668,838,608,10,24,37,8,12,1,238,444,1022,705,691,678,28,33,24,7,12,4,336,522,944,713,693,548,30,35,24,8,13,9,302,452,608,607,731,799,21,20,24,10,7,14,216,444,813,566,947,677,18,18,27,9,6,7,354,364,1029,849,1134,674,10,36,29,15,8,6,404,628,900,746,553,1027,43,35,17,11,10,12,321,445,886,555,528,781,21,7,27,8,13,12,2 +245,451,877,651,610,566,29,30,6,10,10,17,248,346,658,604,613,823,24,23,37,11,8,5,254,256,791,605,866,574,7,17,27,11,4,4,492,236,889,730,723,765,27,9,37,14,16,5,435,281,861,768,795,575,22,5,27,15,17,12,303,355,718,774,918,533,17,13,14,9,10,6,313,429,739,547,690,893,18,15,37,14,10,2,329,575,706,442,688,735,21,25,30,7,11,10,474,438,781,588,682,817,17,38,29,14,16,11,392,268,873,828,885,688,17,21,23,9,17,6,267,341,737,707,791,604,14,26,9,3,11,0,301,361,958,680,650,620,20,31,10,2,9,5,371,473,886,676,632,562,22,33,12,13,8,8,289,469,624,618,712,801,13,22,22,15,4,13,263,443,729,643,894,577,10,20,19,8,5,8,477,361,957,918,1087,560,14,38,5,10,19,7,525,691,904,717,598,1029,35,37,29,16,19,13,350,398,828,536,549,679,15,9,17,11,16,11,2 +224,368,754,773,689,573,10,31,19,15,15,8,123,219,699,676,674,932,5,28,12,4,13,6,217,269,696,583,843,643,26,8,2,4,1,15,441,201,746,792,824,842,28,8,12,7,11,16,370,252,718,784,860,662,27,14,2,8,12,9,260,320,607,690,867,644,26,10,11,2,5,17,264,268,752,599,645,1002,7,20,12,7,5,13,162,280,711,596,599,844,4,16,5,0,8,1,303,245,778,748,803,926,22,29,4,7,11,6,389,301,754,752,868,655,18,18,38,12,12,17,266,424,604,657,770,699,19,17,16,10,6,11,372,314,839,816,581,683,19,32,15,9,14,16,242,258,799,836,647,615,17,32,13,6,13,3,246,346,599,622,705,910,12,21,3,8,1,12,248,362,630,495,815,686,15,11,6,11,0,19,434,536,826,796,1036,523,19,29,30,15,14,18,424,396,899,837,685,1138,16,42,4,9,14,8,201,257,729,704,730,610,12,2,22,10,13,0,2 +196,478,886,649,632,596,34,31,7,14,9,18,227,313,685,606,637,847,29,22,34,9,7,4,251,255,798,595,854,608,2,16,24,7,5,5,481,215,914,720,717,801,30,10,34,10,17,6,396,264,894,758,789,611,17,6,24,11,18,11,298,354,727,766,890,559,18,12,11,5,11,7,296,412,790,539,712,917,23,14,34,14,11,3,322,562,759,432,680,759,26,24,27,5,12,9,417,409,800,584,704,841,16,37,26,10,17,10,395,279,882,820,901,726,20,20,24,13,18,7,286,372,742,697,801,600,17,25,10,7,12,1,324,386,967,680,656,646,25,32,7,6,8,6,378,482,895,672,636,560,27,34,9,9,7,7,242,504,655,610,740,825,18,21,19,13,5,12,258,476,750,633,900,601,15,19,16,8,6,9,466,402,966,908,1067,590,17,37,8,14,20,8,476,654,947,709,624,1053,40,36,26,12,20,14,289,417,835,532,579,693,18,8,16,7,15,10,2 +130,506,853,696,628,753,36,29,17,10,14,18,289,325,658,629,665,892,31,26,28,11,12,4,309,249,773,610,1016,769,6,20,28,11,6,5,353,253,905,777,811,944,20,6,32,14,6,6,320,296,877,787,927,768,15,4,28,15,7,11,262,388,712,781,1058,692,10,16,27,9,6,7,286,426,793,580,756,952,25,18,32,14,6,3,308,588,754,485,780,812,28,28,31,7,13,9,433,389,789,635,712,920,24,41,30,14,6,10,311,349,841,809,983,863,10,24,22,9,7,7,234,398,687,712,907,653,9,29,22,3,11,1,238,440,926,713,736,727,27,30,21,2,13,6,312,528,878,723,756,605,29,32,19,13,14,7,336,568,556,633,794,878,20,25,23,15,6,12,280,540,741,642,1010,752,17,23,26,8,5,9,366,448,941,917,1205,733,9,41,14,10,9,8,464,612,848,764,616,1070,42,40,30,16,11,14,293,465,808,559,595,812,20,12,18,11,12,10,2 +211,501,904,628,721,593,35,29,8,16,15,9,184,396,809,601,754,962,30,26,39,17,13,5,266,270,762,598,1021,673,1,20,29,3,1,14,418,264,932,709,782,872,19,6,39,6,11,15,353,305,904,751,872,692,16,4,29,7,12,8,307,395,765,771,1077,672,17,16,16,1,5,16,307,495,908,542,849,1032,24,18,39,22,5,12,235,647,857,433,873,874,27,28,32,13,10,0,356,440,858,555,785,956,17,41,31,8,11,7,446,334,898,837,1030,697,25,24,25,17,12,16,341,387,756,698,968,697,26,29,11,11,6,10,345,417,983,659,829,713,30,30,12,10,14,15,241,549,903,643,841,651,28,32,14,11,13,2,279,557,737,607,881,940,23,25,24,21,1,11,289,535,776,642,1095,716,28,23,21,14,0,18,457,421,986,915,1160,551,26,41,3,16,14,17,461,705,1039,690,703,1168,41,40,31,18,14,9,254,462,849,507,674,648,23,12,19,13,13,1,2 +238,492,840,703,676,573,33,28,4,16,13,9,175,309,805,624,691,914,28,25,27,13,11,7,247,239,748,667,916,651,3,19,23,5,1,16,503,237,892,784,715,810,19,7,35,8,13,17,434,276,864,828,785,670,18,3,23,9,14,10,290,360,723,830,972,658,19,15,10,3,7,18,330,406,902,603,774,980,22,17,29,18,7,14,218,572,847,500,794,840,25,27,28,9,10,2,349,375,898,644,728,920,15,40,29,8,13,5,401,327,828,860,955,651,27,23,13,15,14,18,296,362,686,767,871,677,28,28,7,9,8,12,388,402,913,716,746,685,30,29,14,8,12,17,296,486,843,732,748,635,26,31,16,7,11,4,290,530,745,674,800,924,23,24,22,17,1,13,258,506,748,711,1006,700,28,22,17,10,2,20,472,450,928,988,1093,527,28,40,15,16,16,19,498,606,1037,769,660,1124,39,39,25,14,16,9,229,421,783,564,605,568,23,11,7,9,15,1,2 +333,465,1011,716,623,700,36,29,27,15,12,12,232,436,726,641,650,795,31,28,14,12,10,10,112,200,831,642,911,654,0,6,32,2,2,1,378,266,1013,789,704,763,28,10,22,5,14,6,389,251,985,815,820,633,15,16,32,6,15,11,181,395,848,815,957,623,16,8,33,0,8,3,261,445,851,600,755,835,25,20,22,17,8,3,237,593,822,513,793,699,28,14,29,8,9,15,440,512,775,661,663,781,18,29,30,5,14,16,286,280,1009,845,914,762,18,18,8,18,15,1,271,359,855,750,836,700,15,15,34,12,9,5,289,365,1094,737,749,688,27,30,23,11,11,0,383,549,1010,749,731,614,29,34,23,6,10,13,257,503,678,663,773,791,20,21,35,16,2,10,127,489,855,654,977,647,17,9,30,13,3,3,339,263,1089,937,1118,676,15,27,36,15,17,2,459,707,884,786,599,923,42,42,30,13,17,8,396,516,958,591,570,751,20,2,14,12,16,16,2 +223,461,851,599,621,643,31,32,6,16,11,17,182,350,734,558,634,948,26,21,37,17,9,3,244,236,715,555,897,685,5,15,27,5,3,6,490,236,903,686,684,836,31,11,37,8,15,7,403,275,875,722,798,714,20,7,27,9,16,10,307,355,710,734,945,694,21,13,14,3,9,8,289,443,827,507,751,1014,20,13,37,22,9,4,271,579,774,390,797,874,23,23,30,13,10,8,406,412,809,520,655,954,13,36,29,8,15,11,438,280,839,788,902,735,25,19,23,15,16,8,297,353,691,661,824,721,22,24,9,9,10,2,335,393,924,624,753,719,22,33,10,8,10,7,315,483,842,608,727,667,24,35,12,11,9,6,251,481,698,578,757,958,15,20,22,21,3,11,267,459,739,601,957,734,16,18,19,14,4,10,499,379,939,872,1088,617,22,36,5,16,18,9,461,671,988,661,595,1144,37,35,29,18,18,15,302,418,788,468,586,660,23,7,17,11,17,9,2 +214,460,965,566,611,602,35,24,9,14,9,12,237,499,766,547,632,859,30,29,40,17,7,6,241,253,809,560,887,618,1,3,30,7,5,3,443,273,967,651,668,811,29,15,40,10,17,14,386,292,939,709,782,629,16,21,30,11,18,11,284,356,802,741,937,581,17,5,17,5,11,5,296,538,853,504,743,929,24,21,40,22,11,11,312,644,824,407,787,771,27,9,33,13,12,11,441,509,815,483,645,853,17,28,32,10,17,12,385,303,963,825,900,702,21,21,26,13,18,5,262,326,817,662,822,634,18,12,12,7,12,5,302,404,1048,593,743,634,26,25,13,6,8,4,360,536,966,569,713,592,28,33,15,11,7,9,278,496,702,569,755,837,19,22,25,21,5,10,242,474,809,632,959,619,16,6,22,14,6,7,440,350,1043,895,1092,578,18,22,2,14,20,6,474,772,972,622,583,1065,41,37,32,18,20,10,341,445,910,443,558,687,19,7,20,13,15,12,2 +337,367,1050,595,530,690,36,14,7,8,9,12,324,488,733,568,565,751,31,33,38,13,7,10,208,202,860,577,932,640,6,9,28,13,5,1,382,270,1026,678,723,753,22,25,38,16,17,12,445,303,998,724,839,575,11,27,28,17,18,11,253,349,879,750,976,615,10,13,15,11,11,1,339,395,844,517,662,837,25,25,38,16,11,7,299,511,825,412,696,679,28,11,31,9,12,15,512,526,774,520,636,745,24,26,30,16,17,16,202,204,1054,816,907,752,18,29,24,7,18,1,231,239,900,677,829,708,15,12,10,1,12,5,297,275,1139,626,654,686,27,15,11,0,8,0,475,445,1049,608,670,582,29,23,13,15,7,13,321,419,699,582,692,735,20,20,23,17,5,10,201,399,878,633,910,635,17,6,20,10,6,3,313,261,1122,900,1123,660,15,12,4,8,20,2,525,653,807,657,518,957,42,27,30,18,20,8,328,460,997,478,513,779,20,17,18,11,15,16,2 +295,439,1002,691,550,701,36,28,9,11,11,13,278,394,715,610,579,766,31,19,24,10,15,9,212,162,812,671,898,695,6,19,32,10,9,0,378,204,1016,780,693,856,20,15,40,13,3,5,391,191,986,820,809,712,15,11,32,14,4,10,199,295,847,842,940,634,10,17,19,8,9,4,265,437,870,611,684,810,25,17,38,13,11,2,245,573,837,506,720,688,28,23,37,6,14,14,428,448,742,636,602,802,24,32,38,13,15,15,238,264,998,844,883,793,10,15,10,10,4,2,189,307,844,773,801,597,9,20,16,4,10,4,275,365,1083,702,672,673,27,29,19,3,10,1,427,495,999,724,646,557,29,31,19,12,13,12,315,431,673,676,702,766,20,22,31,14,9,11,207,417,856,693,914,676,17,22,26,7,8,4,333,321,1084,972,1101,693,9,32,18,11,6,3,461,709,863,769,522,952,42,31,34,15,18,9,332,448,945,552,487,722,20,11,10,10,15,15,2 +225,421,894,650,596,658,34,28,5,11,12,17,276,372,637,607,629,803,29,31,28,10,10,5,250,232,810,618,910,652,2,13,18,10,2,4,424,236,890,713,735,823,28,5,28,13,14,7,425,273,862,765,835,617,17,9,18,14,15,12,277,347,727,781,946,577,18,9,13,8,8,6,301,451,754,548,718,875,23,23,28,15,8,2,303,595,717,465,714,715,26,21,21,6,9,10,468,434,740,593,678,797,16,34,20,13,14,11,310,264,894,845,931,780,18,21,22,10,15,6,243,299,740,718,841,632,15,22,8,4,11,0,305,355,979,683,674,684,25,29,15,3,11,5,375,491,913,681,690,574,27,27,11,12,10,8,309,469,597,613,750,781,18,24,15,14,2,13,235,439,732,630,952,613,15,16,18,7,3,8,413,369,970,915,1125,654,15,34,14,11,17,7,501,695,827,714,590,1009,40,41,20,15,17,13,302,382,851,551,551,765,18,5,16,10,16,11,2 +228,492,856,689,633,626,33,29,7,17,11,14,155,311,757,642,642,951,28,26,24,10,9,0,231,239,756,609,877,690,3,20,14,4,3,9,483,231,902,748,700,863,25,6,24,7,15,10,404,278,874,778,778,713,18,4,14,8,16,7,302,362,711,760,931,697,19,16,1,2,9,11,280,398,844,551,715,1019,22,18,24,15,9,7,234,562,795,490,729,877,25,28,17,6,10,5,375,387,836,642,707,957,15,41,16,7,15,12,439,337,846,816,888,718,27,24,26,16,16,11,286,378,698,701,812,718,28,29,4,10,10,5,352,418,931,718,687,722,24,30,11,9,10,10,298,492,863,730,693,670,26,32,13,6,9,3,234,536,715,616,739,961,17,25,9,14,3,8,270,518,738,629,931,737,22,23,6,11,4,13,504,440,940,912,1038,596,28,41,18,17,18,12,446,610,1011,755,627,1167,39,40,16,11,18,14,287,439,803,590,632,661,29,12,24,10,17,6,2 +289,469,1049,620,604,657,36,20,8,15,11,14,230,518,738,593,609,700,31,33,39,16,9,8,156,214,855,586,826,611,0,3,29,2,3,1,384,278,1041,699,645,760,26,19,39,5,15,12,383,237,1013,739,745,574,15,25,29,6,16,13,177,339,882,757,866,566,16,7,16,0,9,3,247,503,869,524,720,774,25,25,39,21,9,7,249,625,844,423,744,612,28,11,32,12,10,13,432,562,737,551,620,702,18,32,31,7,15,14,320,296,1049,821,827,741,16,25,25,18,16,3,259,341,895,686,741,619,13,12,11,12,10,3,293,399,1134,653,702,641,27,21,12,11,10,2,349,547,1054,639,670,585,29,29,14,10,9,11,259,477,688,595,724,688,20,26,24,20,3,12,145,467,887,638,904,584,17,0,21,13,4,5,377,299,1125,911,1027,649,13,18,3,15,18,4,463,741,858,684,578,910,42,33,31,17,18,10,360,514,1000,509,543,760,20,11,19,12,17,14,2 +293,511,872,819,679,727,36,28,23,13,13,16,144,172,635,698,652,840,31,21,12,2,9,6,172,140,722,621,825,735,16,5,2,2,9,3,314,138,858,834,788,916,12,11,8,5,3,4,229,127,834,818,884,724,1,15,2,6,4,13,159,233,699,702,825,654,0,7,15,0,9,5,141,249,710,643,615,830,25,13,8,7,9,1,183,307,685,650,555,778,28,13,1,2,14,11,262,244,688,802,801,880,28,26,0,5,3,12,306,266,872,732,848,841,8,17,38,10,4,5,173,339,718,677,744,591,9,14,20,12,14,1,339,413,957,856,555,669,27,29,19,11,10,4,307,387,897,890,631,579,29,35,17,4,11,9,209,305,481,662,673,736,20,14,7,6,9,14,235,313,704,487,733,712,17,8,10,13,8,7,323,455,942,800,978,713,9,26,34,13,6,6,293,431,781,881,673,992,42,35,0,7,8,12,298,290,841,738,758,822,20,3,24,12,15,12,2 +264,334,981,657,589,657,33,16,17,15,4,14,261,439,674,626,606,680,28,41,24,6,4,8,185,185,847,561,885,611,3,7,14,6,14,1,373,239,965,718,740,746,25,23,24,9,14,12,396,274,937,736,822,554,18,29,14,10,15,13,204,314,810,736,923,562,15,11,9,4,14,3,284,384,787,521,687,758,22,33,24,11,14,7,266,472,766,460,667,634,25,17,17,2,7,13,469,485,739,600,669,668,19,28,16,9,12,14,253,161,985,806,898,749,15,31,34,14,13,3,242,210,835,661,802,649,12,20,14,8,9,3,292,266,1070,692,637,671,24,17,5,7,3,2,396,402,996,688,639,511,26,25,5,8,2,11,280,350,644,576,717,652,17,28,9,10,14,12,144,318,811,603,903,584,14,4,6,9,15,5,324,250,1053,880,1090,647,12,14,18,15,15,4,492,608,784,721,579,874,39,29,16,11,15,10,321,403,936,558,548,772,17,15,16,8,16,14,2 +235,377,717,563,647,588,21,31,6,14,9,9,330,396,674,542,692,957,16,22,37,13,7,5,412,394,695,537,1031,668,15,16,27,7,5,14,536,336,759,638,808,867,27,10,37,10,17,15,453,389,743,676,924,687,24,6,27,11,18,8,439,453,564,708,1079,667,25,12,14,5,11,16,441,521,749,469,771,1027,12,14,37,18,11,12,383,587,708,386,795,869,13,24,30,9,12,0,464,430,773,494,755,951,11,37,29,10,17,7,526,362,703,782,1026,704,29,20,23,13,18,16,441,403,577,635,950,682,26,25,9,7,12,10,377,355,788,600,751,708,22,32,10,6,8,15,365,421,726,582,795,640,20,34,12,9,7,2,405,521,642,530,819,935,15,21,22,17,5,11,401,501,597,599,1043,711,20,19,19,10,6,18,529,477,787,866,1234,558,26,37,5,14,20,17,577,659,940,629,639,1163,27,36,29,14,20,9,298,388,660,464,626,647,27,8,17,9,15,1,2 +224,460,1006,567,595,668,37,25,9,14,11,16,271,489,701,572,606,799,32,28,40,13,9,6,235,229,828,553,879,652,1,6,30,7,7,3,421,253,1004,646,698,813,27,14,40,10,19,12,394,274,976,692,786,611,14,20,30,11,20,13,268,346,841,720,925,589,15,6,17,5,13,5,290,524,850,483,699,869,26,20,40,18,13,7,322,644,815,398,729,711,29,14,33,9,14,11,451,501,778,490,653,793,19,29,32,10,19,12,361,307,1006,804,884,772,17,26,26,13,20,5,264,334,852,647,806,648,14,15,12,7,14,1,280,420,1091,606,685,678,28,26,13,6,10,4,376,532,1011,576,681,570,30,26,15,9,9,9,280,494,679,548,721,777,21,23,25,17,7,14,234,474,846,619,929,629,18,5,22,10,8,7,424,350,1082,886,1086,654,14,23,2,14,22,6,476,762,861,625,583,1005,43,30,32,14,22,12,343,451,957,474,560,765,21,14,20,9,13,12,2 +196,380,690,563,640,673,18,29,7,9,13,8,357,407,685,534,685,1042,19,24,38,12,11,6,439,421,606,547,1024,753,18,18,28,12,1,15,465,375,760,642,797,952,16,8,38,15,13,16,450,420,732,700,905,772,19,4,28,16,14,9,466,492,591,724,1072,752,18,14,15,10,7,17,466,528,792,495,764,1112,15,16,38,15,7,13,416,574,727,392,788,954,18,26,31,8,8,1,497,441,784,492,748,1036,18,39,30,15,13,6,459,411,676,798,1019,781,20,22,24,8,14,17,426,460,544,647,943,767,21,27,10,2,8,11,368,362,761,594,744,793,17,30,11,1,12,16,306,410,729,580,788,725,13,32,13,14,11,3,436,544,599,556,812,1020,16,23,23,16,1,12,444,542,632,609,1036,796,19,21,20,9,2,19,534,514,780,876,1217,635,21,39,4,9,16,18,530,646,899,625,632,1248,24,38,30,17,16,8,275,433,641,450,619,706,20,10,18,12,15,0,2 +152,534,909,624,597,717,36,29,7,11,17,18,275,395,694,597,630,866,31,24,38,10,15,4,301,263,775,606,965,737,4,18,28,10,3,5,425,291,949,707,760,918,22,8,38,13,9,6,352,308,921,753,876,734,15,4,28,14,10,11,290,390,758,777,1007,658,12,14,15,8,3,7,296,494,825,544,729,932,25,16,38,15,7,3,340,650,786,441,757,784,28,26,31,6,12,9,435,435,797,549,675,886,22,39,30,13,9,10,363,365,901,841,946,829,12,22,24,10,10,7,258,402,747,706,868,633,9,27,10,4,8,1,244,448,986,655,713,707,27,30,11,3,16,6,348,554,910,637,723,571,29,32,13,12,15,7,304,570,600,609,759,858,20,23,23,14,3,12,278,554,785,656,977,718,17,21,20,7,2,9,446,440,993,927,1164,701,9,39,4,11,12,8,474,708,882,686,581,1080,42,38,30,15,14,14,295,481,854,507,554,758,20,10,18,10,11,10,2 +257,403,995,585,543,706,33,13,5,10,11,15,336,530,684,582,580,695,28,38,36,17,15,7,304,250,879,601,945,678,9,12,26,17,9,2,388,292,987,664,742,835,17,24,36,20,5,13,385,317,959,714,856,623,12,30,26,21,6,14,253,367,828,762,987,615,7,12,13,15,9,4,321,497,815,517,665,747,22,36,36,20,11,8,333,573,790,442,693,655,25,22,29,13,14,12,474,550,737,508,649,731,27,23,28,20,17,13,226,238,995,844,922,814,7,26,22,7,4,4,217,257,841,693,836,618,6,25,8,3,10,2,293,349,1080,622,645,696,24,14,9,4,10,3,439,483,1012,596,671,544,26,20,11,19,13,10,371,429,602,572,709,639,17,33,21,21,9,13,263,399,833,659,931,645,14,9,18,14,8,6,359,291,1071,930,1136,700,6,13,6,12,6,5,501,705,754,643,533,867,39,24,28,22,18,11,324,450,952,486,534,819,17,22,16,11,15,13,2 +173,429,696,698,590,691,20,31,15,11,9,16,258,288,661,617,623,960,15,22,18,10,7,2,308,286,628,634,954,731,16,16,30,10,5,7,488,252,788,787,745,894,26,10,32,13,17,8,419,307,758,809,861,754,31,6,30,14,18,9,343,375,601,815,1000,738,26,12,23,8,11,13,333,395,782,592,720,1026,23,14,32,13,11,5,351,471,717,493,742,886,20,24,35,6,12,7,438,350,784,639,668,970,20,37,36,13,17,14,396,320,674,815,939,767,26,20,8,10,18,9,303,435,524,746,863,757,23,25,20,4,12,5,313,373,759,711,698,743,17,32,25,3,8,8,367,389,705,727,714,715,21,34,27,12,7,5,295,489,649,661,752,982,26,21,33,14,5,10,295,489,642,644,968,770,23,19,30,7,6,13,489,487,792,927,1161,659,23,37,26,11,20,10,473,545,921,772,574,1144,26,36,32,15,20,16,264,424,629,559,545,672,12,8,16,10,15,8,2 +218,488,865,684,638,648,32,28,9,14,11,16,207,329,698,627,663,929,27,25,30,9,9,6,231,257,771,628,954,660,4,19,24,7,3,3,465,251,905,763,765,849,32,7,30,10,15,4,406,314,877,795,869,685,19,3,24,11,16,13,282,398,716,797,1000,657,20,15,11,5,9,7,288,428,795,574,752,997,21,17,30,14,9,1,296,592,754,475,778,847,24,27,27,5,10,11,441,409,801,627,718,929,14,40,26,10,15,12,399,323,857,841,957,746,24,23,20,13,16,5,270,362,707,728,875,696,21,28,10,7,10,1,316,414,942,711,736,704,23,29,11,6,10,4,338,514,870,715,740,630,25,31,13,9,9,9,256,540,660,641,778,923,16,24,19,13,3,14,240,512,741,666,984,699,15,22,16,8,4,7,454,414,949,939,1145,622,21,40,12,14,18,6,504,652,956,752,624,1131,38,39,26,12,18,12,333,451,812,563,613,701,22,11,18,7,17,12,2 +184,442,789,718,602,637,23,29,10,13,9,18,253,269,566,625,595,814,18,24,21,8,7,4,279,263,781,562,854,649,13,18,11,8,5,5,445,175,807,751,761,832,19,8,21,11,17,6,378,226,781,751,811,634,14,4,11,12,18,11,292,318,632,687,884,558,13,14,2,6,11,7,296,380,687,554,616,884,12,16,21,11,11,3,320,474,656,531,576,726,15,26,14,4,12,9,419,357,747,683,712,808,31,39,13,11,17,10,375,251,785,741,859,767,5,22,29,12,18,7,264,344,631,638,761,585,4,27,7,6,12,1,288,332,870,747,570,659,14,30,8,5,8,6,366,380,844,771,578,541,16,32,10,10,7,7,278,368,488,585,656,792,7,23,6,12,5,12,258,346,647,552,822,612,4,21,3,7,6,9,450,464,869,843,1043,631,4,39,21,13,20,8,450,594,766,784,600,1020,29,38,13,13,20,14,299,287,770,631,631,734,17,10,23,8,15,10,2 +199,399,643,647,670,658,8,30,7,11,10,12,324,388,636,586,695,991,3,23,38,10,8,2,404,396,697,575,992,726,28,17,28,10,4,11,500,350,731,724,847,927,32,9,38,13,16,12,461,413,711,754,937,745,29,5,28,14,17,5,433,485,526,748,1020,701,28,13,15,8,10,13,433,497,741,533,758,1061,3,15,38,13,10,9,409,533,682,436,738,903,0,25,31,6,11,3,468,440,789,586,776,985,16,38,30,13,16,10,468,428,621,790,997,774,22,21,24,10,17,13,409,509,471,681,913,716,19,26,10,4,11,7,369,381,706,672,706,742,17,31,11,3,9,12,359,403,688,674,736,674,13,33,13,12,8,1,395,595,618,602,802,969,8,22,23,14,4,8,395,595,595,601,982,745,13,20,20,7,5,15,539,545,729,880,1189,628,19,38,4,11,19,14,523,615,900,715,658,1197,14,37,30,15,19,12,258,504,588,524,657,699,16,9,18,10,16,4,2 +265,387,998,606,582,761,33,23,3,10,10,15,326,476,697,583,613,728,28,34,34,17,14,7,328,226,834,588,982,729,19,14,24,17,10,2,340,254,984,675,805,886,9,16,34,20,4,9,343,281,956,723,905,674,4,22,24,21,5,14,251,337,829,747,1022,668,3,16,11,15,10,4,317,471,822,514,684,752,22,28,34,20,10,4,317,553,791,423,682,700,25,18,27,13,13,12,454,504,772,541,712,782,31,23,26,20,16,13,178,220,1000,819,955,865,5,22,20,7,3,4,219,261,846,682,869,603,6,17,6,3,9,2,327,327,1085,641,646,701,24,24,9,4,9,3,401,473,1037,629,698,601,26,26,9,19,12,10,395,421,593,575,726,592,17,25,19,21,10,13,307,387,830,628,932,696,14,13,16,14,9,6,307,291,1072,903,1159,753,6,21,8,12,5,5,487,687,779,666,574,836,39,36,26,22,17,11,280,420,965,507,597,876,17,10,14,11,14,13,2 +295,313,904,916,685,593,14,30,19,11,16,14,118,206,645,793,628,762,9,15,12,0,14,8,82,336,830,708,765,559,22,9,2,4,2,1,392,280,852,917,734,740,28,25,12,11,10,10,355,291,828,877,824,560,23,25,2,8,11,13,179,265,729,745,753,546,22,13,11,6,4,3,171,223,670,738,593,820,3,11,12,3,4,5,179,149,651,751,555,676,6,5,5,4,9,13,324,176,690,903,783,774,32,16,4,3,10,14,320,314,908,759,772,679,14,19,40,10,11,3,197,299,754,716,660,599,13,10,16,14,9,3,331,245,993,963,579,569,11,25,15,13,15,2,301,229,963,991,625,567,7,25,13,2,14,11,173,177,571,745,615,728,2,10,3,4,2,12,161,207,722,544,659,556,5,6,6,11,1,5,379,429,968,803,904,573,13,26,30,11,13,4,391,269,789,980,677,960,20,27,4,5,13,10,300,268,891,847,778,694,26,17,24,14,14,14,2 +217,449,892,638,587,667,33,24,1,11,12,14,272,356,627,605,610,838,28,29,32,10,10,8,254,238,798,606,933,663,3,15,22,10,2,1,440,236,900,707,758,844,23,5,32,13,14,10,425,283,872,755,858,650,18,7,22,14,15,13,293,355,727,765,969,594,13,11,9,8,8,3,301,445,768,534,699,908,22,21,32,13,8,5,331,597,731,445,703,750,25,23,25,6,9,13,468,422,788,581,673,838,21,36,24,13,14,14,330,302,892,829,918,777,13,27,18,10,15,3,261,339,738,702,836,633,10,24,4,4,9,3,277,375,977,671,667,667,24,25,11,3,11,2,375,491,909,669,679,573,26,35,11,12,10,11,289,511,597,599,731,816,17,24,17,14,2,12,247,483,738,638,933,640,14,18,14,7,3,5,437,393,968,917,1128,653,10,36,10,11,17,4,507,683,837,702,575,1044,39,35,24,15,17,10,316,404,849,539,556,760,17,13,14,10,16,14,2 +174,470,767,830,602,755,21,31,25,14,13,12,213,231,764,715,631,1014,18,22,22,7,11,10,211,213,711,710,928,793,15,16,32,7,1,5,405,133,853,913,715,842,25,10,22,10,13,0,382,220,825,929,829,748,30,6,32,11,14,9,234,290,666,891,974,854,31,12,35,5,7,13,230,278,873,712,734,1058,26,14,22,12,7,3,264,392,802,629,770,938,23,24,29,3,8,15,403,307,829,781,664,1016,15,37,30,10,13,16,343,261,759,843,933,775,33,20,8,13,14,1,248,386,619,830,855,887,30,25,32,7,10,5,262,358,844,821,726,839,22,32,33,6,12,2,306,370,768,869,714,845,20,34,33,9,11,13,240,394,730,771,756,1076,23,21,37,11,1,10,190,394,727,662,968,872,28,19,38,8,2,13,410,472,851,955,1135,703,30,37,36,14,16,10,448,516,1016,906,578,1132,27,36,30,12,16,14,285,337,708,687,549,650,17,8,20,7,15,16,2 +199,537,953,563,597,632,35,31,8,15,9,17,282,496,714,566,612,809,30,22,39,18,7,3,310,306,783,587,883,644,1,16,29,6,5,6,474,344,985,652,678,827,27,10,39,9,17,9,387,341,957,712,794,629,16,6,29,10,18,10,329,393,802,752,925,553,17,12,16,4,11,8,333,613,865,513,731,879,24,14,39,23,11,4,351,725,828,436,769,721,27,24,32,14,12,8,438,498,777,474,611,803,17,37,31,9,17,11,432,392,945,824,882,762,17,20,25,14,18,8,321,375,791,683,798,580,14,25,11,8,12,2,321,485,1030,594,721,650,26,32,12,7,8,7,383,577,950,562,683,540,28,34,14,12,7,6,303,553,666,572,737,787,19,21,24,22,5,11,295,537,821,661,937,607,16,19,21,15,6,10,485,431,1037,924,1092,626,14,37,3,15,20,9,487,793,914,619,565,1015,41,36,31,19,20,15,334,474,896,450,528,729,19,8,19,12,15,9,2 +305,451,974,717,664,628,34,35,29,12,15,13,144,346,823,618,667,889,29,18,20,15,13,9,110,164,796,625,858,650,2,20,30,1,1,0,408,194,996,796,615,733,26,14,20,2,11,5,385,195,968,820,709,655,17,10,30,3,12,10,205,335,833,798,920,689,18,18,39,3,5,4,233,387,916,599,794,941,23,10,20,20,5,2,145,523,867,516,844,823,26,20,27,11,8,14,352,426,854,668,662,903,16,33,28,6,11,15,346,232,968,792,893,704,26,16,10,15,12,2,301,333,842,733,827,742,27,21,36,15,6,4,367,347,1053,726,790,704,25,28,33,14,14,1,247,523,961,756,742,686,27,32,31,9,13,12,237,415,791,664,792,935,18,17,35,19,1,11,173,407,836,635,986,717,21,15,38,12,0,4,375,307,1056,920,1047,622,27,41,38,12,14,3,469,663,1067,793,628,1049,40,32,28,16,14,9,274,436,913,584,573,601,28,4,18,11,13,15,2 +247,457,819,709,566,689,27,36,24,15,11,16,162,232,744,592,589,930,22,15,25,14,9,6,164,172,675,613,854,723,9,15,35,6,3,3,474,114,883,796,637,818,25,17,25,9,15,4,401,181,855,814,753,744,24,11,35,10,16,13,251,239,700,798,904,742,25,15,34,4,9,7,237,273,855,599,698,990,28,7,25,19,9,1,251,391,800,506,740,872,25,17,32,10,10,11,390,288,811,650,604,952,17,30,33,9,15,12,370,228,807,754,863,753,27,13,5,14,16,5,221,317,659,727,785,769,24,18,31,8,10,1,309,339,892,700,696,731,18,29,34,7,10,4,349,365,798,738,670,725,20,33,34,8,9,9,195,385,728,664,712,984,23,14,40,18,3,14,199,363,733,629,918,768,20,12,41,11,4,7,437,431,907,912,1059,661,24,36,33,15,18,6,449,507,1008,787,540,1098,33,29,33,15,18,12,290,322,750,556,513,604,15,1,23,10,17,12,2 +124,470,643,862,682,634,15,28,23,15,15,13,191,217,554,749,681,941,10,25,12,4,13,1,269,279,691,654,864,686,21,19,2,4,1,10,399,189,705,885,807,887,27,7,8,9,11,11,326,264,677,867,923,701,22,3,2,8,12,6,282,402,508,757,868,651,21,15,15,4,11,12,270,330,657,694,658,1011,4,17,8,7,5,8,258,360,600,685,624,853,7,27,1,0,8,4,341,285,733,837,802,935,29,40,0,7,11,11,407,335,629,793,875,766,13,23,38,12,12,12,300,502,487,722,791,666,12,28,20,10,16,6,274,404,714,895,548,692,10,29,19,9,14,11,244,382,700,925,648,624,8,31,17,6,13,2,256,394,542,713,716,919,1,24,7,8,1,7,264,424,543,516,776,695,4,22,10,11,2,14,454,590,733,825,1011,618,12,40,34,15,18,13,396,472,824,930,676,1147,21,39,0,9,14,13,255,329,622,783,743,709,23,11,24,10,15,5,2 +173,459,849,615,618,730,31,28,1,9,16,17,354,340,626,558,661,925,26,25,32,16,16,5,382,314,789,621,1054,772,17,19,24,16,4,4,392,270,893,714,849,923,11,7,36,19,8,5,339,315,865,776,965,799,6,3,24,20,9,12,339,391,700,802,1096,737,5,15,11,14,4,6,353,463,767,575,740,957,20,17,32,19,12,2,399,567,728,456,758,867,23,27,29,12,17,10,492,390,769,548,748,963,33,40,30,19,14,11,284,312,841,820,1019,814,3,23,18,6,9,6,293,407,687,727,939,676,4,28,8,2,9,0,265,391,926,632,716,688,22,29,11,3,15,5,383,439,892,636,778,656,24,31,11,18,16,8,381,487,544,640,784,923,15,24,23,20,4,13,359,467,729,669,1008,785,12,22,18,13,3,8,379,463,935,938,1231,698,4,40,10,11,11,7,517,627,804,691,610,1119,37,39,26,21,19,13,286,406,812,468,627,713,15,11,12,10,10,11,2 +205,485,954,570,569,705,36,29,9,10,14,17,342,474,665,557,610,780,31,26,40,17,18,5,364,278,834,602,973,717,10,20,30,17,6,4,388,284,966,655,768,908,16,6,40,20,6,11,371,281,938,717,884,706,11,4,30,21,7,12,295,341,795,771,1015,630,6,16,17,15,6,6,331,553,814,526,701,834,25,18,40,20,14,6,359,675,781,451,727,724,28,28,33,13,17,10,486,488,728,493,667,832,28,41,32,20,16,11,302,344,950,837,948,831,8,24,26,7,7,6,245,359,796,698,862,561,9,29,12,3,11,0,285,445,1035,601,679,683,27,30,13,4,13,5,383,549,963,581,697,543,29,32,15,19,16,8,399,527,591,581,739,744,20,25,25,21,6,13,335,509,806,674,959,684,17,23,22,14,5,8,405,403,1034,939,1162,701,9,41,2,12,9,7,505,783,789,630,557,966,42,40,32,22,21,13,318,436,905,443,546,798,20,12,20,11,12,11,2 +157,453,718,660,639,674,20,30,9,13,13,17,242,322,657,593,670,1029,15,23,32,8,11,3,306,320,712,580,1007,744,16,17,22,8,1,6,468,292,792,729,816,943,26,9,32,11,13,7,419,343,764,759,918,763,21,5,22,12,14,10,361,417,599,753,1045,739,16,13,13,6,7,8,333,413,752,538,745,1099,13,15,32,11,7,4,347,527,697,451,743,941,12,25,25,4,8,8,436,416,794,603,755,1023,22,38,24,11,13,11,412,370,702,795,1000,780,16,21,26,12,14,8,321,445,554,686,918,754,13,26,12,6,8,2,321,389,787,685,707,780,11,31,5,5,12,7,343,441,727,691,751,712,13,33,7,10,11,6,299,551,619,607,787,1007,8,22,17,12,1,11,307,543,644,606,989,783,7,20,14,7,2,10,497,485,810,885,1182,636,13,38,10,13,16,9,457,613,907,724,629,1235,26,37,24,13,16,15,254,452,655,541,636,703,16,9,12,8,15,9,2 +234,522,950,627,663,634,38,29,9,17,11,14,231,413,701,584,690,841,33,26,40,14,9,8,205,227,790,589,903,622,2,20,30,4,7,1,389,261,962,708,666,787,26,6,40,7,19,8,382,258,934,746,772,629,13,4,30,8,20,13,246,348,791,760,959,607,14,16,17,2,13,3,310,490,812,531,797,905,27,18,40,19,13,3,298,644,779,420,827,767,30,28,33,10,14,13,473,469,750,560,691,845,20,41,32,7,19,14,355,331,946,814,942,734,22,24,26,16,20,3,314,396,814,691,862,678,23,29,12,10,14,3,316,444,1031,656,779,682,29,30,13,9,10,2,330,572,955,648,757,630,31,32,15,8,9,11,282,518,705,598,813,851,22,25,25,18,7,12,206,506,802,627,1017,627,19,23,22,11,8,5,378,378,1030,902,1106,634,23,41,2,17,22,4,512,738,953,693,635,1067,44,40,32,15,22,10,335,485,899,508,580,671,24,12,20,10,13,14,2 +260,496,500,971,556,663,4,32,27,14,10,13,229,233,627,792,513,912,9,5,4,3,8,1,311,493,642,851,852,705,40,19,20,7,6,14,523,307,634,990,641,760,28,21,20,14,18,11,424,408,606,954,753,678,41,17,20,11,19,12,366,580,489,860,884,766,40,19,19,9,12,22,352,414,734,807,562,958,15,3,20,6,12,8,328,342,657,838,644,850,12,7,25,1,13,4,429,327,818,962,652,924,22,20,26,6,18,11,503,549,440,816,807,681,32,17,10,11,19,12,374,666,410,821,727,805,31,8,24,11,13,14,392,548,523,964,562,743,13,31,23,10,9,11,350,420,561,1050,628,761,11,23,21,5,8,6,306,494,637,818,576,994,20,4,19,7,6,15,328,528,544,755,792,786,23,14,14,12,7,22,560,796,582,1016,1019,611,31,34,38,14,21,19,508,388,899,1047,546,1106,2,19,22,8,21,13,343,427,445,862,639,534,20,9,16,11,14,5,2 +236,386,902,665,621,633,31,19,14,14,11,14,271,363,591,624,618,748,26,36,17,7,9,8,207,195,806,537,853,605,5,6,7,7,7,1,397,201,894,722,766,762,25,16,17,10,19,12,392,254,866,742,802,550,20,22,7,11,20,13,240,302,735,706,901,554,15,4,6,5,13,3,294,360,738,521,645,818,20,28,17,10,13,7,322,460,711,464,633,668,23,20,10,3,14,13,467,397,706,616,709,742,19,29,9,10,19,14,327,143,902,772,856,741,15,32,31,13,20,3,258,314,752,643,766,629,12,21,11,7,14,3,260,316,987,698,601,655,22,20,10,6,10,2,384,390,935,704,615,553,24,26,8,9,9,11,286,334,601,580,683,726,15,27,2,11,7,12,198,320,740,561,871,576,12,3,1,8,8,5,382,338,978,840,1062,627,12,21,25,14,22,4,486,582,775,729,615,954,37,30,9,12,22,10,339,323,859,578,602,746,15,16,19,7,13,14,2 +163,399,771,781,601,702,17,32,20,8,15,14,274,232,708,672,634,953,14,21,21,15,13,4,316,306,697,695,989,746,23,15,41,15,5,9,424,194,873,876,776,789,25,11,31,18,7,6,373,255,839,906,890,719,30,7,41,19,8,11,297,355,666,890,1033,805,25,13,30,13,5,17,307,337,821,691,733,1005,22,13,31,18,5,3,325,391,754,578,757,893,19,23,38,11,12,9,436,264,771,718,693,971,19,36,39,18,7,16,310,322,739,824,964,722,25,19,1,5,8,7,227,425,587,819,886,838,24,24,27,1,10,9,283,351,824,768,713,784,26,33,28,2,14,6,371,315,776,806,727,794,24,35,28,17,15,7,327,369,686,758,761,1035,27,20,42,19,5,12,287,367,715,675,979,827,32,18,37,12,4,17,425,537,863,958,1184,652,24,36,27,10,10,14,483,471,958,859,583,1123,23,35,39,20,10,18,266,308,686,620,566,563,11,7,19,9,11,10,2 +217,483,818,636,563,684,34,33,7,10,16,16,270,262,649,559,596,845,29,20,26,11,14,6,272,202,676,614,935,702,4,14,30,11,4,3,438,184,868,731,730,845,22,12,42,14,8,4,409,217,840,785,846,745,17,8,30,15,9,13,283,289,673,791,977,663,12,14,17,9,4,5,293,369,778,570,695,909,23,12,36,14,6,1,313,507,727,457,725,775,26,22,35,7,11,11,458,342,734,579,641,869,22,35,36,14,8,12,316,290,808,785,912,768,12,18,12,9,9,5,227,363,654,722,836,642,9,23,14,3,9,1,293,391,893,645,681,658,25,34,17,2,15,4,405,433,807,667,685,606,27,36,17,13,16,9,299,473,577,641,723,871,18,19,29,15,4,14,265,449,706,638,939,707,15,17,24,8,3,7,429,445,904,919,1132,662,9,35,16,10,11,6,493,577,853,712,545,1041,40,34,32,16,13,12,298,384,753,495,516,677,18,6,8,11,10,12,2 +341,387,1022,708,596,669,34,16,18,14,10,10,180,438,845,637,607,818,29,29,15,13,8,12,58,156,850,628,814,625,2,13,35,1,4,3,408,238,1024,785,575,680,28,29,31,4,12,6,403,261,996,815,675,622,17,29,35,5,13,11,155,329,859,807,872,690,18,17,28,1,6,3,219,345,904,594,728,840,23,21,31,18,6,5,197,485,865,501,778,736,26,9,38,9,7,17,378,496,850,653,606,816,16,22,39,4,12,18,294,172,1020,831,853,717,26,25,7,17,13,1,225,267,890,744,777,771,25,14,25,13,7,7,297,283,1105,729,728,721,25,17,22,12,9,2,331,441,1007,741,678,629,27,27,22,7,8,15,191,399,809,663,732,850,18,16,34,17,4,10,105,389,866,630,932,686,19,10,29,14,5,3,359,215,1100,913,1017,663,25,16,27,14,15,0,441,593,1065,778,562,984,40,23,37,14,15,10,336,442,963,577,505,622,26,21,13,13,14,18,2 +164,462,874,595,590,672,34,29,7,10,15,17,307,379,623,596,595,819,29,24,38,11,13,5,341,319,792,557,904,684,4,18,28,11,1,4,427,285,886,670,741,867,22,8,38,14,11,11,394,300,858,708,815,669,17,4,28,15,12,12,346,372,715,722,946,593,12,14,15,9,5,6,344,488,758,489,680,889,23,16,38,14,9,6,386,596,719,400,696,731,26,26,31,7,14,10,479,429,756,522,670,813,22,39,30,14,11,11,391,311,870,806,897,802,12,22,24,9,12,6,320,392,716,649,815,596,9,27,10,3,6,0,272,430,955,636,648,686,25,30,11,2,14,5,340,466,905,610,666,550,27,32,13,13,13,8,336,516,567,560,710,797,18,23,23,15,1,13,314,482,726,619,926,647,15,21,20,8,0,8,464,414,954,888,1117,666,9,39,4,10,14,7,512,686,807,655,580,1025,40,38,30,16,16,13,329,407,835,508,549,769,18,10,18,11,13,11,2 +233,483,911,651,676,531,36,28,1,17,14,9,148,308,774,616,681,894,31,25,32,14,12,7,222,208,757,603,898,605,0,19,22,4,0,16,470,188,923,712,737,804,20,7,32,7,12,17,415,229,895,758,799,624,15,3,22,8,13,10,301,319,758,764,944,604,16,15,9,2,6,18,295,399,851,531,754,964,25,17,32,19,6,14,199,541,804,444,742,806,28,27,25,10,7,2,322,386,813,596,752,888,18,40,24,7,12,5,402,292,907,830,923,639,24,23,18,16,13,18,279,371,765,697,845,659,25,28,4,10,7,12,395,393,992,682,708,645,29,29,11,9,13,17,291,475,920,684,710,595,29,31,11,8,12,4,251,489,702,602,782,872,22,24,17,18,0,13,249,471,763,627,964,648,27,22,14,11,1,20,459,423,991,908,1039,509,25,40,10,17,15,19,463,643,992,713,670,1100,42,39,24,15,15,9,228,416,858,556,653,624,24,11,14,10,14,1,2 +177,405,645,753,605,548,11,32,21,11,16,14,208,294,550,664,624,909,6,21,14,10,14,0,296,278,621,585,953,620,25,15,4,10,2,9,462,208,675,800,812,819,31,11,10,13,10,10,397,285,655,812,912,641,26,7,4,14,11,7,307,367,488,756,975,621,25,13,17,8,6,11,347,331,625,597,671,979,0,13,10,13,4,7,277,395,584,554,633,821,3,23,3,6,9,5,410,354,667,706,749,903,25,36,2,13,10,12,350,256,635,798,942,668,17,19,36,10,11,11,289,439,505,697,848,648,16,24,18,4,11,5,347,311,720,778,623,660,14,33,21,3,15,10,299,367,688,794,657,602,10,35,15,12,14,3,313,423,508,644,719,887,5,20,9,14,2,8,279,427,511,561,883,663,8,18,12,7,1,13,407,463,719,860,1118,530,16,36,32,11,13,12,519,521,806,815,607,1115,17,35,2,15,13,14,206,330,616,644,656,631,19,7,22,10,14,6,2 +175,423,720,558,615,696,24,29,7,9,16,15,368,416,553,527,656,993,25,24,38,16,14,1,444,402,694,572,1053,764,28,18,28,16,2,8,436,356,782,649,848,971,4,8,38,19,10,9,415,395,754,703,964,787,13,4,28,20,11,8,447,465,585,739,1095,737,12,14,15,14,4,10,447,541,682,504,735,1039,27,16,38,19,8,6,455,633,641,413,753,907,28,26,31,12,13,6,504,438,712,481,747,1005,26,39,30,19,10,13,400,386,706,787,1018,812,10,22,24,6,11,10,391,425,552,670,938,698,11,27,10,2,7,4,309,399,791,581,709,720,15,30,11,3,15,9,361,469,765,569,777,680,17,32,13,18,14,4,433,565,469,563,781,949,22,23,23,20,2,9,433,541,620,634,1005,779,19,21,20,13,1,12,485,489,810,901,1230,668,11,39,4,11,13,11,511,653,755,622,607,1181,30,38,30,21,15,15,278,430,687,425,626,737,12,10,18,10,12,7,2 +165,467,720,658,689,687,20,30,5,11,13,18,260,336,569,597,718,990,15,23,36,10,11,4,306,328,696,586,1067,737,16,17,26,10,1,5,448,302,764,735,904,930,22,9,36,13,13,6,369,353,740,765,1012,748,17,5,26,14,14,11,333,423,573,759,1093,710,16,13,13,8,7,7,351,415,680,544,773,1050,9,15,36,13,7,3,359,527,637,447,753,904,12,25,29,6,8,9,476,438,722,597,827,990,28,38,28,13,13,10,366,380,710,801,1048,789,8,21,22,10,14,7,309,451,556,692,960,707,7,26,8,4,8,1,291,395,795,683,723,731,11,31,9,3,12,6,343,457,763,685,775,673,13,33,11,12,11,7,307,557,523,613,821,958,4,22,21,14,1,12,295,549,604,612,1001,756,1,20,18,7,2,9,411,493,806,891,1236,649,7,38,6,11,16,8,525,623,817,726,685,1190,26,37,28,15,16,14,266,462,691,535,712,724,20,9,16,10,15,10,2 +195,519,988,566,588,650,37,32,7,13,17,17,264,482,723,561,617,733,32,21,38,14,15,5,288,260,830,592,892,638,1,15,28,8,3,4,458,296,1000,651,687,815,25,11,38,11,9,9,403,293,978,713,803,607,14,7,28,12,10,12,287,359,823,759,934,565,15,13,15,6,3,6,309,577,858,516,722,807,26,13,38,19,11,4,317,699,829,439,756,651,29,23,31,10,16,10,454,492,804,483,626,731,19,36,30,11,13,11,374,362,984,839,895,758,15,19,24,12,10,6,267,373,830,686,811,594,12,24,10,6,8,0,309,465,1069,599,708,652,28,33,11,5,16,5,377,577,991,571,684,542,30,35,13,10,15,8,299,535,627,575,740,723,21,20,23,18,3,13,265,517,838,664,950,603,18,18,20,11,2,8,441,413,1062,927,1105,648,12,36,4,13,12,7,509,783,871,624,560,945,43,35,30,15,18,13,310,464,933,453,515,753,21,7,18,10,11,11,2 +149,493,762,636,580,737,34,30,9,9,15,17,254,312,623,579,623,904,29,23,32,12,13,3,312,278,726,564,986,761,12,17,28,12,1,6,442,252,826,719,781,896,14,9,38,15,11,7,381,299,798,753,897,786,9,5,28,16,12,10,313,369,625,745,1028,714,4,13,19,10,5,8,329,405,748,536,708,954,23,15,32,15,5,4,337,529,699,431,732,838,26,25,31,8,8,8,456,374,782,571,686,942,30,38,30,15,11,11,340,340,750,781,957,829,6,21,18,8,12,8,265,435,596,674,881,669,7,26,16,2,6,2,269,429,835,659,688,697,25,31,17,1,14,7,333,473,781,659,726,651,27,33,19,14,13,6,323,561,561,605,750,914,18,22,29,16,1,11,299,539,666,598,974,760,15,20,26,9,0,10,437,451,850,873,1179,715,7,38,10,9,14,9,491,565,855,704,570,1066,40,37,30,17,14,15,266,466,705,503,561,738,18,9,18,12,13,9,2 +241,417,952,690,614,679,33,32,18,12,10,15,284,376,677,641,623,720,28,25,13,9,14,7,248,148,856,582,884,657,7,9,3,9,10,2,360,192,944,753,797,828,19,9,13,12,2,9,357,231,918,777,859,622,14,13,3,13,3,14,221,309,781,757,916,588,9,11,10,7,10,4,285,417,788,556,676,798,22,17,13,12,10,4,267,527,759,485,642,658,25,17,6,5,13,12,428,440,778,637,714,740,25,30,5,12,10,13,240,196,952,815,893,787,9,15,37,11,3,4,207,297,798,690,793,601,6,18,15,5,9,2,285,339,1037,723,604,673,24,33,14,4,9,3,391,467,975,725,612,545,26,31,12,11,12,10,327,393,553,621,710,698,17,18,2,13,10,13,221,371,788,594,870,618,14,12,5,6,9,6,319,289,1024,877,1075,673,6,30,29,12,5,5,455,657,773,754,606,926,39,39,5,14,15,11,328,408,911,589,607,792,17,1,21,9,14,13,2 +197,477,689,677,641,654,25,29,13,16,13,9,232,316,696,602,686,995,20,24,28,11,11,5,310,306,637,575,1025,728,11,18,30,5,1,14,450,256,761,760,804,877,21,8,28,8,13,15,359,307,733,794,920,747,18,4,30,9,14,8,339,391,574,756,1073,739,19,14,23,3,7,16,369,435,785,579,765,1061,14,16,24,16,7,12,297,551,730,476,789,917,17,26,27,7,8,0,408,360,767,622,749,1001,15,39,28,8,13,7,422,300,673,772,1020,738,27,22,10,15,14,16,371,407,559,695,944,756,28,27,20,9,12,10,337,395,758,690,745,766,28,30,25,8,12,15,279,455,706,710,789,714,24,32,25,7,11,2,323,513,668,646,813,1003,19,23,35,15,1,11,305,487,609,593,1037,781,22,21,30,10,2,18,425,445,781,872,1228,608,28,39,20,16,16,17,515,567,950,751,633,1167,31,38,28,12,16,9,206,408,632,542,620,655,23,10,22,9,17,1,2 +185,499,944,642,571,687,34,33,7,14,10,18,218,350,721,587,600,840,29,20,34,11,8,4,230,212,770,578,895,691,2,14,24,7,4,5,432,234,986,719,690,848,26,12,34,10,16,6,367,257,958,745,806,678,17,8,24,11,17,11,263,339,797,747,939,622,16,14,15,5,10,7,265,453,864,526,703,906,23,12,34,16,10,3,279,601,825,437,739,768,26,22,27,7,11,9,398,396,826,577,623,850,18,35,26,10,16,10,346,302,934,791,892,787,16,18,24,13,17,7,225,373,780,678,814,665,13,23,10,7,11,1,283,419,1019,671,695,693,25,34,11,6,9,6,359,515,929,665,681,605,27,36,13,9,8,7,243,487,667,597,723,852,18,19,19,15,4,12,229,473,822,628,933,672,15,17,20,8,5,9,423,371,1030,899,1100,677,13,35,8,14,19,8,439,675,937,710,547,1068,40,34,26,12,19,14,284,444,877,519,518,702,18,6,14,7,16,10,2 +254,450,985,598,614,639,35,30,9,14,10,16,231,437,688,583,619,798,30,25,36,13,8,6,195,201,807,570,858,611,1,9,26,7,6,3,443,227,983,673,705,768,29,9,36,10,18,10,394,246,961,717,787,578,16,13,26,11,19,13,238,332,814,741,904,572,17,11,13,5,12,5,288,480,831,508,710,868,24,17,36,18,12,5,300,608,804,417,726,710,27,19,29,9,13,11,443,469,763,537,666,792,17,30,28,10,18,12,367,271,985,813,873,735,19,21,26,13,19,5,250,326,831,670,785,647,16,20,8,7,13,1,290,378,1070,635,686,659,26,31,9,6,9,4,364,512,994,625,668,579,28,31,11,9,8,9,254,462,676,571,724,776,19,22,21,17,6,14,210,446,823,618,914,592,16,12,18,10,7,7,430,342,1057,891,1065,623,16,30,6,14,21,6,484,734,886,662,598,1004,41,31,28,14,21,12,367,435,938,503,577,738,19,9,20,9,14,12,2 +178,522,930,603,628,624,39,29,8,15,11,16,197,357,769,590,655,905,34,24,39,18,9,2,261,265,788,613,882,652,3,18,29,6,3,7,471,269,982,682,645,851,25,8,39,9,15,8,398,288,954,732,741,663,12,4,29,10,16,9,322,368,791,776,938,625,13,14,16,4,9,9,296,492,882,537,760,975,28,16,39,23,9,5,302,608,839,450,792,817,31,26,32,14,10,7,409,395,832,534,670,899,21,39,31,9,15,12,431,355,918,854,901,738,21,22,25,14,16,9,306,426,774,707,833,640,22,27,11,8,10,3,336,470,1003,638,748,672,30,30,12,7,10,8,326,504,929,622,736,598,32,32,14,12,9,5,264,560,735,592,778,893,23,23,24,22,3,10,274,542,818,663,982,669,20,21,21,15,4,11,490,446,1018,936,1057,606,22,39,3,15,18,10,452,658,1027,667,608,1115,45,38,31,19,18,16,293,475,867,484,587,689,25,10,19,12,17,8,2 +341,407,1194,561,550,847,38,9,8,2,9,12,340,626,871,548,591,788,33,32,39,13,13,10,302,234,958,583,988,801,14,18,29,13,11,1,236,364,1156,646,783,932,14,34,39,10,9,14,285,293,1126,708,899,742,3,36,29,11,10,11,243,381,1021,754,1030,762,2,22,16,13,11,1,305,489,954,513,670,788,27,38,39,10,13,9,315,601,947,428,688,774,30,20,32,15,12,15,416,614,812,474,682,834,30,17,31,10,19,16,134,266,1198,826,953,927,10,20,25,5,2,1,269,285,1044,679,873,721,11,15,11,7,8,5,383,361,1283,588,644,775,29,16,12,6,8,0,385,485,1169,562,712,669,31,14,14,11,11,13,389,487,777,572,716,616,22,33,24,11,11,10,271,467,1018,649,940,784,19,15,21,4,10,3,227,221,1262,916,1165,827,11,3,3,2,4,2,409,669,833,617,542,874,44,18,31,12,16,8,332,548,1147,438,561,948,22,26,19,11,15,16,2 +338,420,1100,630,530,806,36,7,9,10,9,12,325,601,781,603,575,719,31,34,36,17,11,10,267,263,970,594,956,760,14,16,26,17,13,1,295,343,1082,713,751,901,12,32,36,20,1,12,360,306,1054,757,867,707,7,38,26,21,2,11,210,390,931,769,998,715,2,20,17,15,9,1,314,482,900,544,662,733,25,36,36,20,7,7,276,602,881,443,686,705,28,18,29,13,10,15,429,623,756,555,650,787,32,19,28,20,13,16,129,271,1102,833,929,890,8,22,22,7,0,1,212,300,948,696,843,670,9,17,12,3,6,5,326,344,1187,661,638,756,27,16,13,4,10,0,446,502,1105,643,680,646,29,16,15,19,11,13,402,492,693,609,700,583,20,31,23,21,13,10,246,478,932,648,924,731,17,13,22,14,12,3,244,206,1174,917,1139,798,9,5,6,12,2,2,438,654,813,692,518,821,42,20,28,22,14,8,321,565,1049,513,529,885,20,24,18,11,11,16,2 +288,482,1086,623,532,801,38,13,2,8,11,14,263,483,785,572,575,828,33,20,33,15,15,8,251,207,888,611,960,791,14,30,23,15,9,1,303,261,1088,712,755,942,14,30,35,18,3,10,328,228,1060,758,871,770,5,24,23,19,4,13,214,356,923,780,1002,734,2,28,10,13,9,3,258,500,926,549,662,792,27,28,33,18,11,5,256,616,897,446,684,788,30,30,28,11,14,13,399,527,784,554,654,878,32,17,29,18,15,14,159,293,1084,816,925,889,10,12,19,5,4,3,188,364,930,711,845,667,11,29,7,1,10,3,336,392,1169,644,640,729,29,16,10,2,10,2,384,558,1077,642,684,639,31,16,10,17,13,11,342,492,709,614,704,716,22,23,22,19,9,12,246,480,930,655,926,776,19,27,17,12,8,5,276,312,1164,930,1139,789,11,17,9,10,6,4,426,730,877,691,524,966,44,16,25,20,18,10,263,517,1029,488,533,814,22,26,13,9,15,14,2 +279,489,1001,683,542,707,37,38,22,15,8,16,254,306,816,622,555,822,32,15,23,18,12,6,228,142,825,603,800,717,1,19,39,6,8,3,430,146,1049,776,593,836,27,17,29,9,8,4,387,149,1021,816,709,732,14,11,39,10,9,13,255,227,856,796,846,646,15,19,32,4,12,9,249,371,945,603,674,884,26,7,29,23,8,1,269,503,904,484,728,760,29,17,36,14,11,11,382,336,849,610,554,840,19,30,37,9,12,12,306,240,991,828,823,803,17,13,5,14,9,5,187,349,837,723,739,645,14,18,29,8,13,1,307,407,1076,696,674,705,28,29,30,7,7,4,407,455,976,698,626,601,30,33,30,12,10,9,259,407,732,672,680,864,21,14,42,22,8,14,263,391,885,621,880,698,18,14,39,15,9,9,413,391,1087,896,1023,701,14,40,23,15,11,6,413,591,1008,751,508,1024,43,29,37,19,15,12,308,364,934,534,467,690,21,1,21,12,12,12,2 +228,462,902,593,588,578,30,30,9,14,10,16,223,407,753,564,613,861,25,23,40,15,8,2,293,293,778,587,874,592,6,17,30,7,4,7,519,285,936,678,647,803,32,9,40,10,16,8,434,294,916,722,757,615,21,5,30,11,17,9,358,364,743,752,922,581,22,13,17,5,10,9,338,496,834,513,722,931,19,15,40,20,10,5,322,616,797,434,766,773,22,25,33,11,11,7,447,455,848,522,616,855,12,38,32,10,16,12,449,297,896,818,891,702,22,21,26,13,17,9,320,356,762,683,807,620,19,26,12,7,11,3,354,404,981,630,718,644,21,31,13,6,9,8,374,478,895,610,680,580,23,33,15,9,8,5,296,490,717,578,736,849,14,22,25,19,4,10,310,464,772,649,942,625,13,20,22,12,5,11,518,356,980,920,1099,574,19,38,2,14,19,10,504,730,1015,659,558,1071,36,37,32,16,19,16,331,411,843,476,501,669,20,9,20,11,16,8,2 +219,467,888,700,651,612,32,28,20,16,10,16,200,296,641,631,650,833,27,25,11,9,8,6,190,178,778,590,807,602,4,19,1,5,4,3,428,166,910,751,734,785,30,7,11,8,16,8,393,195,882,779,778,595,19,3,1,9,17,13,261,309,733,753,839,565,20,15,12,3,10,5,251,389,768,552,695,903,21,17,11,14,10,3,279,535,733,499,629,745,24,27,4,5,11,11,410,390,752,651,721,827,14,40,3,8,16,12,374,246,882,811,870,730,20,23,39,15,17,5,237,357,740,692,764,636,17,28,17,9,11,1,299,385,967,731,611,658,23,29,16,8,9,4,347,487,899,739,601,594,25,31,14,7,8,9,221,437,643,617,725,811,16,24,4,13,4,14,213,423,748,590,851,589,13,22,7,10,5,7,439,387,970,879,1008,608,17,40,31,16,19,6,441,621,899,764,647,1039,38,39,3,10,19,12,318,406,839,603,616,723,18,11,23,9,16,12,2 +183,553,881,769,618,789,38,28,27,13,16,14,250,244,688,664,651,964,33,25,24,10,14,8,190,188,747,629,966,805,2,19,34,8,4,1,320,200,933,842,759,884,26,7,24,11,8,2,319,219,905,852,875,800,13,3,34,12,9,11,165,353,740,812,1010,798,14,15,37,6,4,9,239,387,823,639,750,1022,27,17,24,15,4,1,263,495,782,568,782,902,30,27,31,6,11,13,416,326,797,718,694,980,20,40,32,11,8,14,252,298,869,810,959,845,16,23,6,12,9,3,227,435,715,749,879,797,13,28,34,6,9,3,217,467,954,782,740,779,29,29,35,5,15,2,319,515,884,806,744,755,31,31,35,10,16,11,281,487,636,698,774,1020,22,24,39,14,4,12,151,477,769,623,988,836,19,22,42,7,3,9,313,417,969,906,1157,755,13,40,34,13,11,6,437,521,910,849,600,1094,44,39,32,13,11,12,320,476,824,636,585,730,22,11,22,8,12,14,2 +162,482,783,574,590,687,34,29,7,7,15,16,299,393,622,541,623,878,29,24,38,14,13,2,353,317,675,572,974,715,6,18,28,14,1,7,459,315,845,661,769,904,20,8,38,17,11,8,390,318,817,715,885,716,15,4,28,18,12,9,360,388,648,739,1016,634,10,14,15,12,5,9,364,510,751,504,722,948,23,16,38,17,7,5,382,626,710,409,750,790,26,26,31,10,12,7,469,415,727,505,670,884,24,39,30,17,11,12,409,369,769,795,941,807,10,22,24,6,12,9,310,424,615,670,865,603,7,27,10,0,6,3,282,462,854,603,706,687,25,30,11,1,14,8,356,498,792,593,708,561,27,32,13,16,13,5,338,580,526,567,748,856,18,23,23,18,1,10,328,552,685,620,962,698,15,21,20,11,0,11,484,464,873,891,1163,667,7,39,4,9,14,10,504,632,822,638,570,1084,40,38,30,19,14,16,309,465,726,453,549,758,18,10,18,10,13,8,2 +241,511,998,636,656,628,40,29,6,17,15,14,182,394,745,593,685,847,35,24,37,14,13,8,162,190,832,628,942,620,4,18,27,4,1,1,412,216,1010,719,703,759,24,8,37,7,11,8,393,237,982,773,801,635,11,4,27,8,12,13,203,351,839,799,998,627,12,14,14,2,5,3,257,465,870,572,788,913,29,16,37,19,5,3,239,617,837,463,826,779,32,26,30,10,8,13,430,448,790,569,708,857,22,39,29,7,11,14,332,306,994,849,945,702,20,22,23,16,12,3,247,387,844,730,881,690,21,27,9,10,6,3,283,423,1079,665,784,668,31,30,10,9,14,2,317,567,991,657,774,606,33,32,12,8,13,11,239,497,723,639,806,873,24,23,22,18,1,12,159,479,852,672,1010,651,21,21,19,11,0,5,387,387,1078,947,1081,606,21,39,5,17,14,4,491,719,973,702,636,1075,46,38,29,15,14,10,312,486,941,515,621,633,28,10,17,10,13,14,2 +199,457,686,714,701,633,18,29,19,16,16,9,178,284,679,625,722,1002,13,24,22,5,14,5,270,250,688,546,1001,713,18,18,12,5,2,14,470,224,724,763,834,912,30,8,14,8,10,15,385,287,710,773,924,732,31,4,12,9,11,8,297,345,565,719,1033,712,26,14,17,3,4,16,315,371,774,560,795,1072,7,16,14,8,4,12,237,469,725,521,777,914,10,26,9,1,9,0,314,358,816,673,791,996,8,39,10,8,10,7,426,312,680,761,1012,725,26,22,28,13,11,16,313,423,538,654,928,727,23,27,22,9,9,10,365,381,765,739,745,753,19,30,13,8,15,15,287,415,733,761,751,685,11,32,11,7,14,2,285,481,627,611,831,980,12,23,9,9,2,11,289,473,610,556,1003,756,17,21,12,10,1,18,465,469,768,841,1184,585,23,39,28,16,13,17,435,569,925,782,689,1208,24,38,10,10,13,9,200,418,639,603,672,644,24,10,18,9,14,1,2 +224,400,829,679,634,585,24,30,11,13,10,16,261,373,598,636,643,824,19,23,20,8,8,6,269,267,765,587,902,569,12,17,10,8,6,3,471,245,847,746,765,750,24,9,20,11,18,8,432,284,821,770,829,564,19,5,10,12,19,13,298,338,670,752,940,564,14,13,3,6,12,5,344,428,705,549,704,894,13,15,20,11,12,3,360,546,676,466,694,736,16,25,13,4,13,11,501,443,705,618,724,818,20,38,12,11,18,12,379,243,823,816,925,701,14,21,26,12,19,5,302,366,697,685,833,635,11,26,8,6,13,1,328,344,908,712,654,651,15,31,7,5,9,4,386,428,852,706,676,571,17,33,9,10,8,9,302,446,610,614,740,802,8,22,5,12,6,14,262,422,685,615,936,584,5,20,2,7,7,7,446,362,907,892,1121,581,11,38,22,13,21,6,558,664,862,743,622,1030,30,37,12,13,21,12,347,381,786,576,601,696,16,9,22,8,14,12,2 +301,427,1129,582,544,790,37,9,8,9,11,12,316,574,806,581,573,751,32,36,39,16,15,10,270,224,969,596,958,752,13,14,29,16,9,1,300,310,1101,665,757,901,13,30,39,19,5,14,353,271,1073,719,869,699,8,36,29,20,6,11,215,369,958,767,1000,711,3,18,16,14,9,1,305,487,909,524,668,761,26,36,39,19,11,9,287,603,896,437,688,729,29,18,32,12,14,15,436,586,761,505,660,799,31,21,31,19,17,16,166,270,1133,841,923,872,9,24,25,6,4,1,211,313,979,694,843,666,10,19,11,2,10,5,303,357,1218,617,644,724,28,14,12,3,10,0,419,521,1136,593,682,620,30,18,14,18,13,13,393,483,722,579,702,611,21,31,24,20,9,10,257,465,957,658,924,739,18,11,21,13,8,3,271,261,1201,925,1137,774,10,7,3,11,6,2,441,707,818,642,530,853,43,22,31,21,18,8,326,528,1080,467,543,885,21,22,19,10,15,16,2 +239,405,841,832,665,647,28,24,20,14,15,17,134,202,620,709,644,808,23,21,11,3,13,5,164,184,715,638,823,661,24,3,1,3,5,4,334,154,813,843,780,860,14,15,11,6,7,5,295,161,787,829,872,672,9,15,1,7,8,12,167,195,670,715,831,592,8,3,12,1,5,6,151,199,653,658,605,814,17,13,11,6,5,2,131,295,624,665,553,732,20,9,4,1,12,10,304,208,671,817,793,844,36,22,3,6,7,11,304,250,845,751,840,767,0,21,39,11,8,6,203,317,691,688,736,539,1,10,17,11,10,0,343,333,930,873,545,589,19,25,16,10,14,5,257,313,882,905,623,569,21,35,14,5,15,8,219,277,500,671,661,720,12,14,4,7,5,13,199,289,669,504,739,638,9,4,7,12,4,8,331,439,913,813,982,639,1,24,31,14,10,7,371,413,778,898,663,974,34,35,3,8,10,13,254,286,818,755,742,762,14,7,23,11,11,11,2 +180,462,806,661,659,593,32,28,5,13,10,16,267,343,653,610,664,880,27,25,34,10,8,2,317,317,742,609,889,621,4,19,24,8,6,7,475,271,844,734,756,818,30,7,34,11,18,8,414,312,824,772,826,632,19,3,24,12,19,9,344,390,651,784,925,590,20,15,11,6,12,9,350,442,746,553,737,950,21,17,34,15,12,5,366,566,713,446,699,792,24,27,27,6,13,7,447,411,768,598,731,874,14,40,26,11,18,12,413,329,796,840,930,725,20,23,20,12,19,9,338,416,664,711,830,605,17,28,6,6,13,3,338,390,881,690,675,653,23,29,11,5,9,8,358,476,833,686,663,563,25,31,13,10,8,5,318,542,631,624,767,858,16,24,19,14,6,10,308,522,680,647,927,634,13,22,16,7,7,11,484,456,882,922,1102,583,17,40,8,13,21,10,514,622,925,723,649,1086,38,39,26,13,21,16,305,439,761,548,608,678,18,11,18,8,14,8,2 +270,488,933,709,793,537,35,33,25,13,12,9,129,335,860,640,792,900,30,22,18,10,12,7,239,161,763,567,947,611,1,14,8,0,8,16,369,199,935,766,774,810,17,12,18,3,4,17,288,194,911,778,818,630,16,8,8,4,5,10,238,290,794,740,979,610,17,14,17,2,8,18,226,392,925,563,873,970,24,14,18,15,8,14,152,564,882,506,849,812,27,22,11,6,15,2,265,405,881,658,833,894,17,35,10,3,6,5,383,281,933,794,944,625,25,18,36,16,5,18,282,352,797,681,906,665,26,23,22,14,13,12,408,404,1018,738,825,651,32,34,17,13,11,17,216,510,946,746,785,583,28,36,17,4,14,4,270,458,736,616,889,878,25,19,9,14,8,13,306,444,795,579,1037,654,30,17,12,13,7,20,388,330,1009,858,1030,495,26,35,24,13,7,19,382,668,1044,775,779,1106,41,36,10,11,11,9,255,437,888,606,726,604,21,6,26,12,14,1,2 +274,316,804,619,640,540,23,26,6,13,11,1,233,337,703,576,651,845,18,31,37,8,9,15,229,233,722,541,896,566,13,3,27,8,3,12,487,281,764,690,759,751,31,13,37,11,15,9,494,292,736,720,839,573,28,19,27,12,16,8,300,280,637,718,932,599,25,5,14,6,9,10,362,338,666,499,718,905,12,23,37,13,9,12,226,420,639,402,690,747,15,11,30,4,10,10,439,327,710,552,720,829,9,32,29,11,15,7,341,205,808,786,915,594,25,21,23,12,16,10,314,318,676,647,825,680,22,12,9,6,10,16,378,264,893,654,660,628,18,27,10,5,10,11,334,322,837,640,660,578,16,35,12,10,9,12,334,368,613,568,750,813,11,24,22,12,3,7,212,356,626,567,912,609,16,6,19,7,4,12,418,326,872,846,1087,496,22,24,5,13,18,11,572,540,861,681,632,1041,29,39,29,13,18,3,285,329,763,514,617,621,23,5,17,8,17,9,2 +157,483,811,680,668,616,32,29,10,16,14,14,218,360,782,629,707,947,27,26,33,13,12,0,300,296,719,612,952,684,4,20,25,5,0,9,432,288,885,761,711,839,26,6,33,8,12,10,345,313,857,803,813,707,19,4,25,9,13,7,321,383,684,785,1010,693,20,16,18,3,6,11,323,445,861,584,798,1013,21,18,33,18,6,7,291,585,814,473,826,873,24,28,26,9,7,5,392,422,837,613,726,953,14,41,25,8,12,12,434,358,797,829,989,730,28,24,19,15,13,11,351,409,673,716,913,708,27,29,13,9,9,5,305,417,882,707,778,718,23,30,14,8,13,10,255,487,808,701,780,666,25,32,16,7,12,3,287,573,746,653,834,957,16,25,26,17,0,8,295,555,727,650,1048,733,21,23,23,10,1,13,457,459,899,925,1157,606,27,41,9,16,15,12,475,615,1038,746,652,1143,38,40,25,14,15,14,272,456,748,557,595,641,28,12,21,9,14,6,2 +135,465,645,763,645,694,9,31,23,15,18,13,202,252,598,660,642,991,4,22,16,6,14,1,292,268,629,595,945,762,27,16,6,6,4,10,418,216,707,798,810,963,29,10,8,9,8,11,343,271,681,800,908,781,28,6,6,10,9,6,285,357,510,726,963,731,27,12,15,4,6,14,275,353,703,599,663,1031,6,14,8,9,4,8,257,379,646,576,637,905,3,24,7,2,11,4,340,326,733,728,777,1003,23,37,6,9,8,11,408,338,631,758,934,810,19,20,34,14,9,12,297,487,477,683,840,692,20,25,20,8,11,6,291,403,716,784,619,712,18,32,19,7,15,11,267,361,680,816,645,676,16,34,19,8,16,2,287,489,556,634,711,939,11,21,11,10,4,7,283,493,557,543,871,775,14,19,12,9,3,14,451,557,735,852,1110,664,20,37,34,15,13,13,407,481,846,825,643,1179,15,36,6,11,11,13,222,384,608,660,706,735,13,8,28,8,12,5,2 +226,502,953,628,599,764,37,24,5,8,10,17,327,369,662,567,642,877,32,23,30,13,14,5,345,217,803,624,1037,782,15,25,28,13,10,4,337,221,985,721,832,943,13,11,40,16,4,7,296,228,957,771,948,791,2,9,28,17,5,12,276,322,802,793,1079,715,1,21,15,11,10,6,330,480,829,562,719,847,26,23,34,16,10,2,320,610,796,459,741,817,29,29,33,9,13,10,447,399,767,561,731,923,29,36,34,16,16,11,189,321,945,811,1002,866,9,19,16,7,3,6,238,378,791,724,922,614,10,24,12,1,9,0,320,408,1030,643,697,698,28,25,13,0,9,5,374,520,958,649,761,602,30,27,13,15,12,8,394,508,600,627,767,791,21,26,27,17,10,13,328,492,821,674,991,769,18,24,22,10,9,8,296,440,1037,945,1214,748,10,36,12,8,5,7,476,678,820,698,591,1037,43,35,30,18,17,13,277,439,902,485,610,767,21,17,10,11,14,11,2 +257,499,835,675,589,621,32,29,7,11,12,17,308,334,648,608,614,790,27,26,26,12,10,5,282,274,731,671,919,611,4,20,30,10,8,4,468,268,881,766,718,758,28,6,42,13,20,5,449,281,849,816,826,644,19,4,30,14,21,12,311,359,694,850,963,594,18,16,17,8,14,6,371,461,775,617,715,854,21,18,36,17,14,2,365,599,736,506,737,724,24,28,35,8,15,10,538,384,775,612,653,802,16,41,36,13,20,11,366,304,823,856,920,705,18,24,12,10,21,6,295,363,685,777,836,639,15,29,14,4,15,0,325,421,908,688,689,639,23,30,17,3,11,5,401,493,838,700,699,591,25,32,17,12,10,8,359,485,632,676,743,826,16,25,29,16,8,13,275,455,723,701,959,620,13,23,24,9,9,8,441,429,923,980,1134,617,15,41,16,11,23,7,573,629,898,745,575,1010,38,40,32,15,23,13,392,404,778,532,526,620,16,12,8,10,14,11,2 +240,384,686,597,631,664,24,29,5,10,11,8,335,395,723,560,664,1019,19,24,36,11,9,6,411,397,688,565,959,744,12,18,26,11,3,15,547,337,762,684,736,915,24,8,36,14,15,16,500,390,734,732,848,763,27,4,26,15,16,9,444,458,613,744,1009,745,28,14,13,9,9,17,448,506,826,517,763,1087,13,16,36,16,9,13,386,572,763,400,791,939,16,26,29,7,10,1,433,439,846,518,701,1019,6,39,28,14,15,6,495,361,674,800,970,748,32,22,22,9,16,17,412,442,546,671,892,762,29,27,8,3,10,11,388,360,759,622,747,780,25,30,9,2,10,16,360,424,715,606,749,720,17,32,11,13,9,3,412,504,697,588,789,1013,18,23,21,15,3,12,404,494,650,613,1003,789,23,21,18,8,4,19,574,480,774,882,1164,616,29,39,6,10,18,18,554,648,977,657,611,1235,30,38,28,16,18,8,285,425,631,466,582,643,28,10,16,11,17,0,2 +332,338,817,623,599,599,25,28,12,16,10,10,235,399,798,576,630,968,20,25,29,7,8,8,285,261,793,545,891,679,11,7,19,5,4,17,581,249,831,686,668,878,25,9,29,8,16,18,510,318,803,704,780,698,26,15,19,9,17,11,356,330,708,716,943,678,27,9,6,3,10,19,356,426,869,493,733,1038,14,17,29,12,10,15,258,530,824,432,759,880,17,15,22,3,11,3,377,429,887,568,643,962,7,30,21,8,16,4,463,231,815,780,922,691,31,23,31,13,17,19,326,272,703,645,838,705,28,16,9,9,11,13,408,278,900,654,711,719,24,29,6,8,9,18,366,390,834,656,697,651,18,33,8,7,8,5,320,414,748,550,753,946,17,22,14,11,4,14,318,386,721,595,963,722,22,10,11,10,5,21,552,370,891,866,1116,551,28,28,13,16,19,20,544,650,1032,689,573,1174,31,33,21,10,19,10,331,305,758,520,510,620,29,11,21,9,16,2,2 +249,445,953,643,609,658,34,31,10,16,9,16,242,408,670,602,628,827,29,22,33,9,7,6,202,210,791,589,903,642,2,16,23,5,5,3,432,248,969,712,728,805,28,10,33,8,17,8,403,265,941,750,828,611,17,6,23,9,18,13,245,351,792,756,939,591,18,12,12,3,11,5,271,475,821,541,723,897,23,14,33,14,11,3,291,613,790,446,737,739,26,24,26,5,12,11,442,460,775,582,665,821,16,37,25,8,17,12,362,284,949,820,906,762,18,20,27,15,18,5,251,311,795,687,822,658,15,25,13,9,12,1,295,379,1034,676,701,680,25,32,6,8,8,4,371,529,954,670,683,590,27,34,8,7,7,9,261,475,656,602,743,805,18,21,18,13,5,14,205,457,807,633,935,619,15,19,15,10,6,7,417,349,1031,908,1104,644,15,37,9,16,20,6,475,741,884,707,589,1033,40,36,25,10,20,12,348,438,900,540,566,755,18,8,13,9,15,12,2 +304,434,1093,635,630,668,38,28,8,15,10,14,205,499,820,588,627,819,33,17,35,22,8,8,147,165,873,583,800,676,2,29,27,2,6,1,355,237,1081,726,573,815,26,31,39,5,18,8,322,224,1043,752,687,675,13,21,27,6,19,13,174,310,948,766,848,609,14,29,18,0,12,3,202,466,985,541,758,883,27,9,35,23,12,3,264,570,950,432,814,753,30,15,32,18,13,13,373,527,779,560,618,831,20,16,31,13,18,14,333,227,1091,808,829,772,22,11,23,18,19,3,248,328,947,691,755,648,19,10,15,12,13,3,266,356,1176,658,740,694,29,27,16,11,9,2,348,510,1072,648,704,592,31,23,16,16,8,11,218,436,846,610,748,847,22,10,24,22,6,12,190,418,947,633,924,659,19,24,25,15,7,5,368,258,1175,902,1009,666,19,30,7,15,21,4,370,678,1012,697,592,1027,44,15,29,21,21,10,369,485,1034,498,553,673,22,13,15,14,14,14,2 +164,498,825,598,605,677,37,30,7,11,15,14,235,331,612,557,616,840,32,23,38,10,13,0,275,247,723,528,921,705,7,17,28,10,1,9,437,249,859,671,764,894,19,9,38,13,11,10,356,258,831,701,838,706,14,5,28,14,12,7,288,326,672,699,963,624,9,13,15,8,5,11,300,424,747,480,689,910,26,15,38,13,7,7,308,556,714,391,713,766,29,25,31,6,12,5,413,391,759,533,687,872,25,38,30,13,11,12,377,327,819,761,900,797,9,21,24,10,12,11,264,430,665,628,824,571,10,26,10,4,6,5,268,438,904,631,669,661,28,31,11,3,14,10,320,490,844,621,677,547,30,33,13,12,13,3,280,550,518,549,715,818,21,22,23,14,1,8,260,528,695,578,929,688,18,20,20,7,0,13,438,446,907,851,1122,657,10,38,4,11,14,12,462,608,814,662,595,1046,43,37,30,15,14,14,281,463,778,489,580,754,21,9,18,10,13,6,2 +289,413,995,665,624,620,34,24,9,17,10,14,234,388,686,616,627,733,29,35,22,10,8,8,158,128,813,573,836,580,2,1,12,4,6,1,404,160,977,730,707,733,28,15,22,7,18,10,403,205,951,756,775,539,17,21,12,8,19,13,197,267,826,746,880,537,18,3,9,2,12,3,263,381,807,541,704,803,23,27,22,15,12,5,265,523,782,452,690,645,26,13,15,6,13,13,446,428,733,604,676,727,16,36,14,7,18,14,318,190,997,806,873,718,18,25,28,16,19,3,245,287,843,681,777,620,15,14,12,10,13,3,275,337,1082,696,660,636,25,25,5,9,9,2,389,449,1006,692,634,558,27,33,3,6,8,11,261,379,668,602,724,711,18,28,7,14,6,12,155,363,827,601,894,549,15,4,4,11,7,5,379,303,1069,880,1053,610,15,22,20,17,21,4,475,651,836,727,612,939,40,37,14,11,21,10,372,390,950,558,573,735,18,9,16,10,14,14,2 +278,370,916,783,659,629,21,18,18,15,7,14,203,267,621,684,638,684,16,33,13,4,7,8,123,215,844,595,777,589,15,5,3,4,7,1,345,217,872,806,766,736,27,21,13,7,9,10,356,216,846,806,784,536,16,27,3,8,10,13,142,232,741,708,809,540,17,9,10,2,11,3,216,176,690,609,621,744,10,25,13,7,7,5,170,262,671,606,563,624,13,11,6,0,4,13,397,281,668,758,749,680,29,30,5,7,9,14,231,179,920,760,836,727,13,27,37,12,10,3,196,268,770,673,728,631,12,12,15,10,12,3,276,264,1005,818,559,647,12,19,14,9,6,2,358,306,961,846,593,507,14,27,12,6,5,11,248,202,571,638,673,652,5,24,2,8,7,12,130,204,734,519,785,562,4,2,5,11,8,5,298,380,980,824,986,619,12,16,29,15,12,4,416,392,733,845,651,880,27,31,5,9,12,10,305,237,891,704,662,744,19,13,21,10,13,14,2 +133,501,846,692,615,736,36,29,16,10,15,18,292,336,651,625,658,857,31,26,29,11,13,4,310,254,766,612,993,752,6,20,29,11,5,5,364,264,898,773,788,933,20,6,33,14,7,6,331,293,870,783,904,751,15,4,29,15,8,11,271,385,705,783,1035,665,10,16,26,9,5,7,297,437,786,576,745,921,25,18,33,14,5,3,319,599,747,481,773,773,28,28,32,7,12,9,444,400,782,631,693,887,24,41,31,14,7,10,322,346,834,811,974,858,10,24,23,9,8,7,245,389,680,716,892,622,9,29,21,3,10,1,241,435,919,709,725,722,27,30,20,2,14,6,315,533,871,719,735,596,29,32,18,13,15,7,337,565,549,629,787,847,20,25,24,15,5,12,281,537,734,646,1003,721,17,23,25,8,4,9,377,445,934,921,1194,728,9,41,13,10,10,8,475,623,841,760,605,1039,42,40,31,16,12,14,302,458,801,555,572,809,20,12,17,11,11,10,2 +241,501,898,760,629,709,37,30,18,14,12,13,206,216,805,663,644,906,32,23,19,19,10,7,180,166,750,664,853,737,1,17,41,1,2,4,374,112,962,855,642,816,27,9,31,4,14,3,329,163,934,899,758,746,14,5,41,5,15,12,195,269,779,861,911,728,15,13,28,1,8,12,247,319,928,682,761,964,26,15,31,22,8,0,291,445,867,567,801,850,29,25,38,15,9,12,386,294,848,697,653,930,19,38,39,10,14,13,344,262,884,831,872,775,21,21,1,17,15,4,277,363,730,804,806,739,18,26,25,13,9,4,289,395,969,757,757,717,28,31,28,12,11,3,349,439,895,785,729,695,30,33,28,13,10,10,211,413,727,751,769,970,21,22,40,21,2,13,161,389,810,652,961,762,18,20,35,14,3,12,399,455,990,931,1060,683,18,38,27,14,17,9,415,533,1001,834,601,1086,43,37,39,20,17,15,306,340,831,605,576,626,21,9,19,13,16,13,2 +232,486,931,543,674,577,38,27,7,16,14,16,175,455,754,536,691,906,33,26,38,17,12,6,213,221,775,551,950,617,2,4,28,5,0,3,457,247,933,628,713,816,20,12,38,8,12,10,416,290,905,682,807,636,13,18,28,9,13,13,262,368,770,722,1004,628,14,6,15,3,6,5,294,500,827,483,806,976,27,18,38,22,6,5,216,642,782,392,846,818,30,12,31,13,11,11,383,483,791,460,712,900,20,27,30,8,12,12,385,321,929,796,949,661,22,18,24,15,13,5,278,344,781,649,885,699,23,13,10,9,7,1,330,408,1014,576,804,673,29,28,11,8,13,4,276,540,934,548,784,613,31,36,13,11,12,9,274,524,674,542,814,884,22,19,23,21,0,14,232,502,775,613,1014,660,27,7,20,14,1,7,436,400,1009,880,1073,551,23,25,4,16,15,6,496,750,952,601,650,1112,44,40,30,18,15,12,275,465,880,430,639,666,24,4,18,11,14,12,2 +328,464,1058,646,602,682,40,38,3,13,11,16,159,379,825,591,591,883,35,11,34,18,9,6,111,135,862,604,812,680,4,21,24,0,3,3,451,171,1084,733,567,807,24,21,34,3,15,6,368,180,1056,779,661,699,11,11,24,4,16,13,220,268,913,781,872,663,12,21,11,2,9,5,210,372,984,562,722,947,29,3,34,21,9,1,254,538,935,449,794,817,32,13,27,14,10,11,333,419,874,583,606,895,22,26,28,9,15,12,377,273,1054,811,801,758,20,17,20,16,16,5,182,320,900,712,757,716,21,14,6,14,10,1,330,360,1139,671,710,698,31,33,9,13,10,4,344,502,1021,671,696,642,33,29,9,12,9,9,126,434,801,633,712,913,24,10,21,20,3,14,198,424,934,640,904,691,21,16,16,13,4,7,448,342,1144,917,951,658,21,40,8,13,18,6,386,642,1081,716,568,1099,46,25,26,19,18,12,323,435,997,515,573,663,24,3,14,12,17,12,2 +230,380,818,988,617,813,15,22,27,16,18,11,157,179,847,855,630,1016,16,23,24,15,14,7,141,295,712,770,817,809,21,3,34,3,4,18,335,229,938,1063,590,734,31,19,24,6,8,3,296,260,908,1061,702,702,36,19,34,7,9,12,146,270,767,969,875,910,37,7,37,1,12,22,150,218,986,860,751,994,24,15,24,20,4,0,192,178,917,787,795,898,21,5,31,11,11,12,325,163,872,937,617,894,9,24,32,6,8,19,301,321,774,821,878,769,43,25,6,17,13,12,190,334,650,914,792,971,40,6,34,11,17,18,266,310,859,957,741,855,24,23,35,10,17,15,302,276,799,1025,685,885,22,31,35,9,16,10,188,162,745,911,755,1068,29,16,39,19,4,13,166,196,828,712,955,898,34,0,42,12,3,20,348,468,910,935,1062,745,40,22,34,16,19,21,360,308,1029,1068,581,1006,21,33,32,16,11,15,287,241,717,831,486,630,23,11,22,11,12,13,2 +301,421,856,633,655,561,30,33,6,16,13,8,190,374,867,600,658,914,25,24,25,13,11,14,262,260,762,557,841,625,6,14,15,5,1,15,568,234,864,690,654,824,18,10,25,8,13,16,461,257,838,708,718,644,21,8,15,9,14,11,355,309,745,718,895,630,22,12,2,3,7,17,341,453,924,495,745,984,19,16,25,18,7,17,247,563,883,436,743,826,22,22,18,9,8,9,298,438,894,572,709,908,12,35,17,8,13,2,500,234,854,800,880,637,30,18,23,15,14,17,323,307,736,649,802,685,31,23,3,9,8,11,425,351,939,674,705,671,31,34,12,8,12,16,353,447,871,660,689,597,23,32,14,7,11,11,279,417,783,550,763,892,24,19,10,17,1,12,329,387,754,593,945,668,29,17,7,10,2,19,563,355,934,870,1008,515,31,35,17,16,16,18,461,685,1079,693,647,1120,36,38,17,14,16,8,272,334,805,550,606,594,22,6,21,9,15,8,2 +196,538,925,612,678,630,35,29,8,16,12,16,189,443,808,585,693,943,30,26,39,17,10,2,261,283,765,594,906,682,1,20,29,3,2,7,425,307,967,695,663,835,25,6,39,6,14,8,360,310,941,741,747,709,16,4,29,7,15,9,304,398,774,765,966,689,17,16,16,1,8,9,298,542,889,532,810,1009,24,18,39,22,8,5,266,694,842,429,850,871,27,28,32,13,9,7,395,473,841,537,702,949,17,41,31,8,14,12,435,369,917,829,909,734,25,24,25,17,15,9,332,406,783,694,861,716,26,29,11,11,9,3,344,454,1002,643,806,718,26,30,12,10,11,8,276,594,922,625,778,668,28,32,14,11,10,5,266,562,758,597,818,955,19,25,24,21,2,10,282,546,803,644,1012,731,22,23,21,14,3,11,468,424,1009,915,1061,618,26,41,3,16,17,10,454,746,1060,674,650,1171,41,40,31,18,17,16,291,499,868,495,625,639,29,12,19,13,16,8,2 +185,493,898,584,601,727,31,29,9,8,14,16,356,428,647,547,646,792,26,26,40,15,18,6,366,312,838,570,1013,721,13,20,30,15,6,3,386,306,930,665,808,888,13,6,40,18,6,6,375,327,902,715,924,686,8,4,30,19,7,13,329,401,747,745,1055,650,5,16,17,13,6,5,349,545,798,514,723,868,20,18,40,18,10,1,399,649,761,407,745,732,23,28,33,11,15,11,496,444,802,517,717,826,31,41,32,18,12,12,320,318,890,799,988,837,3,24,26,5,7,5,287,385,736,672,912,635,4,29,12,1,11,1,263,435,975,613,701,707,22,30,13,2,13,4,389,527,913,605,753,577,24,32,15,17,16,9,377,519,545,581,771,768,15,25,25,19,6,14,337,489,766,632,995,696,12,23,22,12,5,7,421,387,982,895,1210,713,4,41,2,10,9,6,513,717,805,650,593,996,37,40,32,20,17,12,306,442,845,465,586,820,15,12,20,9,12,12,2 +223,543,954,624,570,711,35,28,9,9,13,16,302,464,703,583,587,778,30,25,40,12,17,6,290,282,784,590,908,705,5,19,30,12,7,3,384,324,986,707,703,882,21,7,40,15,5,6,351,311,958,753,819,674,16,3,30,16,6,13,253,389,803,763,950,628,11,15,17,10,7,5,281,571,854,534,704,844,24,17,40,15,9,1,315,691,817,421,742,704,27,27,33,8,14,11,440,494,756,555,604,794,23,40,32,15,11,12,336,360,946,827,885,825,11,23,26,8,6,5,219,423,792,692,803,635,8,28,12,2,12,1,261,469,1031,653,694,711,26,29,13,1,12,4,367,621,951,643,656,581,28,31,15,14,15,9,329,533,601,605,712,768,19,24,25,16,7,14,257,521,822,628,916,670,16,22,22,9,6,7,413,353,1038,903,1105,709,8,40,2,9,8,6,457,765,861,688,538,990,41,39,32,17,16,12,352,512,897,503,513,780,19,11,20,12,13,12,2 +215,423,691,729,652,619,19,30,21,12,10,16,254,300,502,616,657,888,14,23,16,9,8,6,230,232,709,559,920,625,17,17,10,9,4,3,416,182,733,784,811,814,23,9,10,12,16,4,415,257,705,792,911,632,18,5,10,13,17,13,275,345,544,720,938,602,17,13,13,7,10,5,311,351,615,581,644,958,8,15,10,12,10,1,343,435,572,546,602,800,11,25,7,5,11,11,480,384,671,698,790,882,25,38,8,12,16,12,328,222,681,730,909,735,9,21,30,11,17,5,273,393,539,673,815,655,8,26,18,5,11,1,285,331,766,738,594,675,10,31,17,4,9,4,369,421,734,786,640,597,12,33,15,11,8,9,285,403,486,628,708,866,3,22,7,13,4,14,223,395,569,547,848,642,0,20,8,6,5,7,419,413,777,836,1085,605,8,38,32,12,19,6,515,575,768,803,652,1094,25,37,8,14,19,12,308,338,658,620,703,708,21,9,24,9,16,12,2 +230,488,987,604,567,718,35,27,9,9,14,13,319,473,692,579,604,711,30,32,40,16,18,9,287,235,885,586,961,682,13,4,30,16,6,0,377,275,983,687,786,853,13,12,40,19,6,11,398,286,955,733,884,653,8,18,30,20,7,12,236,352,820,761,1003,625,3,6,17,14,6,2,300,510,821,524,689,767,24,24,40,19,10,6,316,642,792,421,685,671,27,12,33,12,15,14,475,519,803,529,689,765,31,33,32,19,12,15,215,313,987,827,942,818,7,22,26,6,7,2,218,356,833,686,850,578,8,13,12,2,11,4,272,404,1072,635,647,676,26,28,13,3,13,1,398,562,998,617,679,576,28,36,15,18,16,12,374,494,598,589,721,645,19,25,25,20,6,11,268,484,825,636,929,649,16,7,22,13,5,4,360,340,1063,907,1142,710,8,25,2,11,9,3,514,774,814,666,563,875,41,40,32,21,17,9,287,479,938,487,572,833,19,6,20,10,12,15,2 +295,343,837,877,652,638,20,27,22,16,16,12,218,256,544,744,609,705,15,18,13,5,14,10,112,306,807,689,772,592,18,8,1,5,4,1,350,276,813,864,727,757,22,24,9,12,8,10,369,289,787,832,827,565,17,24,1,9,9,11,149,267,664,696,766,541,16,12,14,7,4,1,227,223,633,701,578,781,9,10,9,8,4,5,195,175,612,726,544,617,12,4,2,1,11,15,392,226,653,878,754,711,36,19,1,8,8,16,238,232,841,712,787,728,8,22,39,13,9,1,193,237,687,675,683,588,7,9,19,9,9,5,265,249,926,932,544,614,11,26,18,8,15,0,377,263,912,966,594,562,13,26,16,7,16,13,245,149,460,698,614,677,4,11,6,9,4,10,143,157,665,495,674,559,1,5,9,10,3,3,305,359,907,784,919,626,7,27,33,16,11,2,407,303,646,943,642,907,26,28,1,10,11,8,330,246,840,814,735,753,20,16,25,9,12,16,2 +168,462,768,741,692,546,26,31,24,15,13,16,173,257,651,642,691,885,21,22,15,4,11,2,243,253,710,599,868,598,10,16,3,4,1,7,443,173,786,786,819,803,26,10,7,7,13,8,364,250,766,810,859,617,17,6,3,8,14,9,290,346,603,754,878,595,18,12,16,2,7,9,286,336,712,585,708,955,15,14,7,9,7,5,268,408,675,554,618,797,18,24,0,0,8,7,377,327,732,706,796,879,16,37,1,7,13,12,399,267,762,786,927,678,26,20,37,12,14,9,302,412,638,699,821,626,25,25,21,10,10,3,328,364,847,758,618,644,23,32,20,9,12,8,296,388,803,794,644,588,19,34,18,6,11,5,240,448,609,642,754,863,14,21,8,8,1,10,248,450,622,577,854,639,17,19,11,11,2,11,448,466,840,872,1065,538,25,37,35,15,16,10,444,534,909,811,688,1091,32,36,1,9,16,16,259,393,733,638,673,643,28,8,27,10,15,8,2 +217,405,819,637,631,636,24,32,2,9,10,17,336,382,572,594,640,787,19,21,29,12,8,5,336,314,795,571,937,630,12,15,19,12,4,4,448,272,833,702,822,801,18,11,29,15,16,7,397,305,813,730,890,601,13,7,19,16,17,12,341,371,652,736,977,551,12,13,6,10,10,6,367,471,701,509,697,857,13,13,29,15,10,2,399,551,672,428,665,699,16,23,22,8,11,10,510,452,745,580,741,781,28,36,21,15,16,11,354,260,817,804,942,758,6,19,21,8,17,6,297,365,663,669,844,600,3,24,1,2,11,0,295,329,902,674,635,652,15,33,14,1,9,5,411,447,866,668,665,562,17,35,14,14,8,8,347,451,510,578,739,765,8,20,14,16,4,13,305,425,669,601,915,591,5,18,11,9,5,8,439,379,893,880,1128,632,3,36,13,9,19,7,547,671,768,701,623,993,30,35,21,17,19,13,332,354,784,542,634,743,16,7,19,12,16,11,2 +277,415,1078,562,570,673,36,10,8,14,3,13,282,590,755,559,597,708,31,37,39,15,7,9,210,228,856,592,852,635,0,13,29,7,17,0,376,320,1050,649,647,782,28,29,39,10,15,15,405,289,1022,711,763,580,15,31,29,11,16,12,211,355,911,759,896,580,16,17,16,5,17,2,275,507,882,514,704,778,25,29,39,20,17,10,287,603,863,437,740,652,28,11,32,11,10,14,456,586,758,479,600,694,18,22,31,10,13,15,264,262,1082,835,871,773,18,25,25,13,10,2,241,281,928,688,787,647,15,16,11,7,12,4,269,363,1167,591,692,681,27,13,12,6,4,1,411,499,1077,567,664,529,29,19,14,9,5,12,307,463,745,569,720,672,20,24,24,19,17,11,195,437,906,662,926,604,17,10,21,12,16,4,355,267,1150,925,1073,665,15,8,3,14,12,3,469,709,851,618,542,900,42,23,31,16,12,9,350,502,1027,449,495,788,20,21,19,11,15,15,2 +235,391,836,708,612,587,24,32,17,15,10,16,216,330,599,649,611,814,19,27,14,6,8,6,216,234,812,536,846,577,12,13,4,6,4,3,460,194,836,741,787,756,22,9,14,9,16,8,413,235,808,745,823,566,17,9,4,10,17,13,279,333,671,707,886,550,12,11,9,4,10,5,305,369,692,542,632,884,13,19,14,9,10,3,305,445,657,511,586,726,16,21,7,2,11,11,436,402,726,663,726,808,22,34,6,9,16,12,376,176,836,771,863,705,12,17,34,14,17,5,259,315,704,644,757,623,9,22,14,8,11,1,341,295,921,749,564,643,15,33,13,7,9,4,369,395,859,751,590,567,17,31,11,8,8,9,243,333,579,585,674,792,8,20,1,10,4,14,229,315,678,542,832,574,5,16,4,9,5,7,443,361,912,825,1045,583,9,34,28,15,19,6,479,571,829,768,608,1020,30,41,6,11,19,12,324,290,785,621,615,698,16,5,18,8,16,12,2 +257,441,797,643,584,661,30,30,2,9,10,16,268,306,618,570,617,880,25,23,31,12,8,6,244,224,677,585,944,679,6,17,25,12,4,3,470,204,827,730,739,812,26,9,37,15,16,4,425,231,799,770,855,698,21,5,25,16,17,13,287,303,672,768,986,644,16,13,12,10,10,5,335,393,761,553,716,944,19,15,31,15,10,1,357,539,714,444,740,810,22,25,30,8,11,11,486,394,753,578,656,892,18,38,31,15,16,12,342,258,791,770,927,753,16,21,17,8,17,5,261,339,643,697,851,659,13,26,9,2,11,1,295,359,876,658,696,685,21,31,12,1,9,4,425,451,794,666,702,617,23,33,12,14,8,9,287,451,612,622,742,904,14,22,24,16,4,14,235,429,687,621,956,686,11,20,19,9,5,7,433,389,885,896,1145,639,13,38,11,9,19,6,533,627,864,711,564,1058,36,37,27,17,19,12,324,380,740,492,535,662,14,9,11,12,16,12,2 +273,479,1071,615,629,844,38,24,7,14,12,14,270,570,772,588,650,803,33,35,38,19,16,8,244,258,855,597,1007,804,14,7,28,1,8,1,236,312,1053,698,848,961,14,15,38,4,4,10,267,281,1025,744,944,755,1,21,28,5,5,13,189,373,902,768,1033,747,2,11,15,1,8,3,265,541,873,535,713,797,27,27,38,22,12,5,257,661,852,432,693,775,30,17,31,15,15,13,416,600,727,540,769,857,26,28,30,10,14,14,168,302,1073,832,988,940,10,25,24,17,5,3,239,365,919,697,896,694,11,20,10,13,11,3,351,415,1158,646,669,778,29,25,11,12,11,2,323,577,1070,628,715,692,31,29,13,13,14,11,351,529,664,600,755,635,22,22,23,21,8,12,233,509,903,647,941,771,19,4,20,14,7,5,211,277,1145,918,1176,832,11,22,4,14,7,4,431,729,828,677,625,909,44,37,30,20,19,10,276,556,1020,498,652,959,22,9,18,13,14,14,2 +256,450,888,571,608,617,34,31,5,13,9,15,225,419,653,554,623,872,29,22,36,14,7,7,243,239,710,569,882,621,2,16,26,8,5,2,489,255,906,658,665,812,30,10,36,11,17,9,428,286,878,710,781,628,17,6,26,12,18,14,298,362,741,736,930,590,18,12,13,6,11,4,292,506,790,501,738,942,23,14,36,19,11,4,322,628,749,406,784,784,26,24,29,10,12,12,459,449,746,490,640,866,16,37,28,11,17,13,419,295,884,804,895,733,22,20,22,12,18,4,290,308,734,667,819,639,19,25,8,6,12,2,318,388,969,600,740,661,25,32,9,5,8,3,360,524,885,578,706,585,27,34,11,10,7,10,266,494,663,566,748,850,18,21,21,18,5,13,258,466,752,625,952,626,15,19,18,11,6,6,482,388,968,892,1087,603,19,37,6,13,20,5,510,738,915,631,578,1078,40,36,28,15,20,11,341,417,833,452,555,706,20,8,16,10,15,13,2 +261,305,772,917,657,545,13,27,21,15,11,14,150,290,593,788,612,744,8,18,14,4,9,8,108,378,762,721,741,519,23,6,0,4,3,1,396,330,746,912,726,694,29,20,10,11,13,8,385,343,720,884,812,492,24,20,0,8,14,13,187,333,601,754,733,532,23,8,13,6,11,3,219,219,614,737,569,812,2,10,10,7,7,3,203,143,581,760,513,662,5,4,3,0,8,13,378,266,658,912,771,740,31,19,2,7,13,14,318,290,776,768,768,665,15,22,40,12,14,3,225,305,674,731,654,619,14,5,18,10,16,3,299,249,861,968,541,629,12,28,17,9,10,2,313,235,847,1000,605,509,8,30,15,6,9,11,187,149,563,740,603,720,3,11,5,8,3,12,137,173,600,541,641,546,6,1,8,11,4,5,377,421,844,828,890,549,14,27,32,15,16,4,431,315,801,981,653,948,19,32,2,9,16,10,310,214,775,852,750,678,25,12,26,10,17,14,2 +219,509,1011,625,552,787,37,30,12,8,13,15,294,452,724,570,597,848,32,23,35,15,17,7,288,230,863,613,988,791,15,17,33,15,7,2,320,270,1033,714,783,956,13,9,35,18,5,3,329,253,999,760,899,774,6,5,33,19,6,12,211,353,856,782,1030,722,1,13,20,13,7,6,261,517,881,551,684,820,26,15,35,18,13,0,285,655,842,450,704,800,29,25,36,11,16,12,426,500,771,556,682,898,33,38,35,18,15,13,208,334,1005,816,953,887,9,21,21,5,6,4,185,375,851,713,873,645,10,26,15,1,12,2,265,417,1090,644,660,727,28,31,16,2,12,3,359,583,1014,644,712,621,30,33,18,17,15,10,353,517,654,616,724,756,21,22,28,19,7,13,273,507,871,645,948,772,18,20,25,12,6,6,331,363,1093,922,1165,777,10,38,7,10,8,5,439,779,866,693,544,994,43,37,35,20,20,11,270,498,956,486,561,818,21,9,17,9,13,13,2 +252,466,1109,626,781,678,42,28,8,14,15,17,129,485,900,581,782,1047,37,1,39,21,17,5,169,191,909,596,1005,758,10,23,29,1,5,4,331,243,1135,713,742,957,18,25,39,4,7,5,284,256,1107,759,808,777,9,21,29,5,8,12,208,374,952,779,1045,757,10,23,16,1,5,6,138,464,1035,552,907,1117,35,7,39,22,9,2,208,618,992,435,965,959,34,3,32,17,14,10,245,525,901,555,807,1041,24,16,31,12,11,11,391,311,1105,835,904,770,18,13,25,17,8,6,198,342,951,704,918,772,19,8,11,13,10,0,332,384,1190,651,873,798,33,27,12,12,14,5,272,558,1094,643,887,730,35,19,14,15,17,8,160,504,784,617,901,1025,30,6,24,21,5,13,258,490,971,636,1057,801,27,18,21,14,4,8,426,326,1189,909,1000,630,19,30,3,14,10,7,284,750,1022,692,757,1253,48,15,31,20,16,13,259,509,1048,497,770,689,26,13,19,13,11,11,2 +278,392,961,721,597,731,35,21,19,9,9,14,265,333,660,652,606,694,30,38,12,12,13,8,217,151,853,591,865,693,7,2,2,12,11,1,349,175,963,762,778,840,19,18,12,15,1,10,340,214,935,776,840,638,14,24,2,16,2,13,216,278,798,742,897,638,9,6,11,10,9,3,262,344,801,559,657,764,24,30,12,15,9,5,254,454,772,530,619,654,27,16,5,8,12,13,391,421,749,682,691,738,25,33,4,15,11,14,231,173,959,806,870,831,9,28,36,8,2,3,174,242,805,687,768,635,8,17,16,2,8,3,268,280,1044,754,597,705,26,22,15,1,8,2,414,394,990,770,589,571,28,30,13,14,11,11,318,368,572,606,693,642,19,27,3,16,11,12,230,340,805,579,851,662,16,1,6,9,10,5,322,326,1039,874,1050,723,8,19,30,9,4,4,404,586,752,783,591,870,41,34,4,17,16,10,329,371,922,640,604,846,19,12,20,12,13,14,2 +265,335,596,610,630,620,8,30,10,10,11,9,392,416,589,577,647,989,3,23,33,11,9,7,470,458,616,530,992,700,28,17,23,11,7,16,560,396,658,677,835,899,32,9,33,14,19,17,473,451,630,707,915,719,29,5,23,15,20,10,501,517,475,703,1036,699,28,13,10,9,13,18,501,517,678,486,698,1059,3,15,33,14,13,14,445,505,623,405,712,901,0,25,26,7,14,2,504,462,730,551,760,983,22,38,25,14,19,5,528,420,582,771,967,720,20,21,27,9,20,18,473,507,468,634,889,714,19,26,13,3,14,12,385,323,667,647,668,740,17,31,6,2,10,17,401,351,643,639,730,672,13,33,8,13,9,4,463,517,571,555,744,967,8,22,18,15,7,13,463,517,504,576,964,743,11,20,15,8,8,20,555,543,686,851,1185,574,19,38,9,10,22,19,613,627,855,672,626,1195,14,37,25,16,22,9,304,402,563,513,647,653,16,9,17,11,13,1,2 +196,416,963,636,580,752,30,22,7,10,13,15,301,377,650,593,583,745,25,31,24,11,17,7,289,199,869,548,946,724,16,11,14,11,7,2,325,199,953,693,779,877,12,9,24,14,5,13,322,228,925,715,857,669,7,11,14,15,6,14,228,318,796,703,988,671,6,7,1,9,7,4,284,420,799,498,642,811,19,23,24,14,13,8,320,498,766,443,658,717,22,23,17,7,16,12,439,415,793,581,714,791,34,32,16,14,15,13,237,205,965,775,911,848,2,29,24,9,6,4,220,278,811,636,831,638,3,24,4,3,12,2,246,330,1050,673,614,702,21,23,11,2,12,3,386,418,1016,667,670,588,23,33,13,13,15,10,346,372,590,557,684,677,14,24,9,15,7,13,248,342,797,588,908,705,11,14,6,8,6,6,328,342,1039,869,1125,736,3,32,18,10,8,5,448,632,766,696,578,911,36,31,16,16,20,11,279,349,936,545,613,851,14,17,22,11,13,13,2 +207,449,942,614,557,728,33,30,7,7,12,15,326,400,657,583,584,823,28,23,38,14,16,7,330,228,874,618,963,740,13,17,28,14,8,2,390,240,958,695,768,925,13,9,38,17,4,7,361,263,928,739,874,729,8,5,28,18,5,12,281,347,787,771,1005,663,3,13,15,12,8,4,287,475,808,532,667,855,22,15,38,17,12,2,339,611,773,453,685,767,25,25,31,10,15,12,448,444,778,547,675,869,31,38,30,17,14,13,260,270,938,843,928,838,5,21,24,6,5,4,223,343,784,708,850,600,6,26,10,0,11,2,269,387,1023,645,641,692,24,31,11,1,11,3,407,499,971,635,693,556,26,33,13,16,14,10,353,475,607,591,709,783,17,22,23,18,8,13,301,455,798,668,933,721,14,20,20,11,7,6,385,349,1026,939,1148,714,6,38,4,9,7,5,479,725,823,680,549,1005,39,37,30,19,19,11,264,422,895,495,562,781,17,9,18,10,14,13,2 +251,419,771,883,699,603,17,36,32,15,14,12,188,224,516,748,680,816,12,15,15,4,12,10,102,168,763,683,817,587,19,15,11,4,0,1,366,152,783,896,796,770,25,17,1,9,12,6,379,209,755,872,872,580,20,11,11,8,13,11,161,261,612,756,817,554,19,15,24,4,10,3,221,199,633,713,653,886,6,7,1,7,6,3,215,303,598,716,609,728,9,17,8,0,7,15,402,278,671,868,793,810,29,30,9,7,12,16,296,224,767,766,858,713,11,13,29,12,13,1,227,343,623,725,756,629,10,18,29,10,15,5,257,295,852,918,571,643,8,29,28,9,13,0,321,341,832,956,637,589,10,33,26,6,12,13,215,291,512,724,699,794,1,14,16,8,0,10,121,303,623,527,757,572,2,12,19,11,1,3,353,455,851,832,990,597,10,36,43,15,17,2,441,433,760,953,689,1022,23,29,9,9,15,8,330,226,760,798,732,716,23,1,33,10,16,16,2 +218,450,927,558,590,664,31,31,9,8,10,18,317,463,662,559,625,799,26,26,40,15,8,4,339,313,821,578,974,654,5,14,30,15,4,5,467,305,931,643,767,821,21,8,40,18,16,10,428,326,903,705,883,621,16,8,30,19,17,11,342,404,762,745,1020,585,11,10,17,13,10,7,384,546,783,504,720,869,20,18,40,18,10,5,376,650,750,425,742,711,23,22,33,11,11,9,513,489,799,477,688,795,23,35,32,18,16,10,337,315,927,821,959,770,11,18,26,5,17,7,278,346,773,674,883,632,8,23,12,1,11,1,314,402,1012,595,698,668,22,32,13,2,9,6,408,522,940,565,724,562,24,30,15,17,8,7,360,520,576,567,754,777,15,19,25,19,4,12,314,490,771,642,974,629,12,17,22,12,5,9,456,372,1003,911,1181,650,8,35,2,10,19,8,550,776,812,614,576,1005,37,40,32,20,19,14,329,401,882,455,557,761,15,6,20,9,16,10,2 +178,496,943,580,587,685,35,25,8,9,14,14,345,437,680,577,620,820,30,28,39,12,18,8,345,277,813,578,967,697,5,14,29,12,6,1,403,283,951,665,762,876,21,8,39,15,6,12,364,292,923,713,878,682,16,8,29,16,7,13,306,368,778,749,1009,616,11,10,16,10,6,3,320,538,819,510,719,890,24,20,39,15,10,7,380,660,780,419,745,736,27,22,32,8,15,13,463,467,763,497,667,832,23,35,31,15,12,14,337,331,943,825,938,803,11,26,25,8,7,3,276,370,789,676,862,603,8,23,11,2,11,3,256,424,1028,613,701,679,26,26,12,1,13,2,404,542,954,585,713,533,28,34,14,14,16,11,354,526,614,571,749,798,19,21,24,16,6,12,304,508,789,642,967,674,16,17,21,9,5,5,428,400,1019,907,1160,669,8,35,3,9,9,4,494,754,830,638,571,1026,41,34,31,17,17,10,309,441,894,469,548,768,19,14,19,12,12,14,2 +171,505,914,636,549,726,36,28,4,9,14,17,290,430,679,609,594,881,31,25,35,16,18,5,340,264,824,626,987,762,14,19,25,16,6,4,388,294,946,719,782,953,12,7,35,19,6,7,357,299,918,765,898,773,7,3,25,20,7,12,281,367,763,797,1029,685,2,15,12,14,6,6,273,527,826,564,673,895,25,17,35,19,10,2,317,681,787,463,699,811,28,27,28,12,15,10,416,460,750,561,681,923,32,40,27,19,12,11,258,350,906,847,954,850,8,23,21,6,7,6,217,367,752,728,872,572,9,28,7,2,11,0,279,441,991,667,651,688,27,29,8,3,13,5,359,583,917,649,711,586,29,31,10,18,16,8,343,529,571,623,719,821,20,24,20,20,6,13,329,513,782,678,943,737,17,22,17,13,5,8,415,409,998,949,1164,716,9,40,7,11,9,7,459,733,837,698,541,1045,42,39,27,21,17,13,222,464,857,511,560,771,20,11,15,10,12,11,2 +251,417,1001,565,587,759,34,19,7,8,11,15,312,496,692,562,610,722,29,40,38,15,15,7,292,204,849,553,985,713,16,6,28,15,9,2,344,258,983,646,808,854,10,20,38,18,5,13,357,277,961,692,902,666,5,26,28,19,6,14,223,345,826,726,1027,674,2,8,15,13,9,4,317,483,815,487,685,742,23,32,38,18,11,8,303,573,792,390,695,694,26,14,31,11,14,12,456,524,761,488,715,774,32,31,30,18,17,13,178,244,1003,804,952,839,6,28,24,5,4,4,199,289,849,653,870,637,7,19,10,1,10,2,307,353,1088,600,651,697,25,20,11,2,10,3,405,491,1036,576,711,595,27,28,13,17,13,10,383,425,592,548,725,604,18,31,23,19,9,13,277,411,829,611,945,696,15,7,20,12,8,6,303,297,1069,878,1166,739,7,17,4,10,6,5,497,711,760,625,579,842,40,32,30,20,18,11,272,456,960,464,602,860,18,14,18,9,15,13,2 +263,359,856,647,649,535,30,23,19,16,11,14,162,356,729,608,662,804,25,34,22,7,9,8,196,176,752,537,869,543,6,0,12,3,3,1,460,184,840,702,696,714,28,16,22,6,15,10,415,259,818,720,782,534,21,22,12,7,16,13,251,277,695,716,919,578,22,4,15,1,9,3,277,367,750,503,747,874,19,26,22,12,9,5,219,489,717,438,733,716,22,12,15,3,10,13,392,422,740,590,705,798,12,35,14,6,15,14,386,152,860,790,922,625,28,24,30,13,16,3,291,261,754,645,828,655,25,13,20,11,10,3,351,289,945,686,703,635,21,24,7,10,10,2,291,401,877,678,683,517,23,32,7,5,9,11,255,363,677,564,769,782,14,27,15,11,3,12,195,333,684,567,947,592,19,3,12,12,4,5,433,297,928,840,1080,517,25,21,20,14,18,4,493,611,945,707,635,1010,36,36,14,8,18,10,266,348,815,548,582,640,26,8,18,11,17,14,2 +231,465,948,632,585,660,35,34,4,10,10,17,244,382,703,587,618,835,30,19,35,11,8,5,222,228,784,606,925,664,1,13,25,11,4,4,462,240,976,723,712,839,27,13,35,14,16,7,415,283,948,765,828,645,16,9,25,15,17,12,285,371,799,785,975,597,17,15,12,9,10,6,305,469,856,554,717,903,24,11,35,16,10,2,311,605,813,443,749,755,27,21,28,7,11,10,446,438,836,559,663,835,17,34,29,14,16,11,330,296,942,819,932,768,17,17,21,9,17,6,219,343,788,712,854,644,14,22,7,3,11,0,281,387,1027,655,705,674,26,33,8,2,9,5,409,511,937,647,711,580,28,35,10,13,8,8,261,491,675,621,747,829,19,18,22,15,4,13,239,469,816,660,965,641,16,16,17,8,5,8,437,373,1034,929,1130,648,14,34,7,10,19,7,489,705,919,696,569,1051,41,33,27,16,19,13,294,430,885,493,542,713,19,5,15,11,16,11,2 +158,494,837,614,620,666,36,33,7,16,13,17,197,301,730,563,655,959,31,20,38,11,11,3,247,239,747,564,924,698,0,14,28,5,1,6,445,229,909,693,689,879,28,12,38,8,13,7,372,266,881,743,801,715,15,8,28,9,14,10,290,330,708,737,980,687,16,14,15,3,7,8,276,398,829,522,752,1027,25,12,38,16,7,4,302,516,780,413,782,879,28,22,31,7,8,8,395,375,811,551,688,959,18,35,30,8,13,11,395,333,821,789,931,768,24,18,24,15,14,8,292,434,671,670,863,702,23,23,10,9,8,2,320,440,906,645,740,720,27,34,11,8,12,7,328,468,836,639,746,660,29,36,13,7,11,6,236,540,692,591,778,953,20,19,23,15,1,11,242,524,749,590,988,729,17,17,20,10,2,10,460,456,929,869,1089,638,23,35,4,16,16,9,434,568,980,680,604,1175,42,34,30,12,16,15,249,469,766,489,589,691,24,6,18,9,15,9,2 +231,485,969,581,581,636,37,28,7,10,11,17,290,474,696,556,608,789,32,25,38,13,9,3,272,272,781,579,877,630,1,19,28,11,7,6,452,296,981,668,670,801,27,7,38,14,19,9,407,309,953,732,786,603,14,3,28,15,20,10,299,379,810,766,923,551,15,15,15,9,13,8,333,559,843,531,715,859,26,17,38,18,13,4,359,671,808,426,755,701,29,27,31,9,14,8,482,488,789,494,623,783,19,40,30,14,19,11,380,332,965,846,898,758,17,23,24,9,20,8,273,333,811,685,814,604,14,28,10,3,14,2,281,435,1050,602,707,656,28,29,11,2,10,7,391,549,966,582,675,562,30,31,13,13,9,6,309,509,656,596,731,767,21,24,23,17,7,11,261,489,821,649,943,591,18,22,20,10,8,10,463,393,1049,914,1100,632,14,40,4,10,22,9,499,783,884,635,551,995,43,39,30,16,22,15,356,442,914,448,504,745,21,11,18,11,13,9,2 +199,439,653,774,726,583,9,29,22,16,15,9,168,286,592,679,731,952,4,24,11,5,13,5,236,234,629,570,900,663,27,18,1,5,1,14,436,188,679,821,857,862,33,8,9,8,11,15,381,275,653,821,913,682,28,4,1,9,12,8,253,343,512,735,910,662,27,14,14,3,9,16,293,321,669,620,722,1022,2,16,9,8,5,12,199,377,624,581,658,864,1,26,2,1,8,0,358,340,711,733,824,946,21,39,1,8,11,7,374,260,647,773,933,683,19,22,39,13,12,16,287,453,527,694,841,701,18,27,19,9,14,10,343,371,732,799,628,703,16,30,18,8,14,15,237,395,700,821,680,635,12,32,16,7,13,2,281,437,560,661,782,930,7,23,6,9,1,11,241,465,523,520,874,706,10,21,9,10,0,18,411,473,735,817,1075,543,18,39,33,16,16,17,477,505,850,842,714,1158,15,38,1,10,14,9,222,356,628,671,739,644,17,10,23,9,15,1,2 +290,396,892,1031,669,805,22,20,31,17,14,9,195,163,825,902,698,1014,23,25,22,8,10,9,157,257,774,817,913,793,14,3,32,4,8,18,307,187,1008,1104,670,722,24,19,22,7,4,1,310,210,978,1100,752,686,29,19,32,8,5,10,140,244,805,1010,973,898,30,7,41,2,8,20,184,228,962,901,805,982,31,17,22,13,8,2,168,208,903,834,843,886,28,5,29,4,13,14,319,157,846,986,697,892,4,26,30,7,4,17,225,281,848,846,966,755,38,25,8,14,5,12,166,306,700,963,888,973,39,6,38,10,13,18,314,330,933,990,789,845,31,21,35,9,13,15,362,302,873,1074,749,873,29,31,33,6,12,12,258,186,753,950,821,1056,36,18,37,12,8,11,182,188,866,755,1031,884,41,0,40,11,7,18,280,438,980,984,1094,735,39,20,36,15,11,19,352,324,1041,1107,639,998,28,33,30,9,7,13,301,293,791,876,538,628,26,11,20,10,14,15,2 +167,485,814,632,669,666,35,29,2,15,13,16,212,276,589,573,684,939,30,24,33,10,11,6,214,234,708,566,939,676,1,18,23,6,1,3,416,204,844,701,810,867,29,8,33,9,13,8,359,239,816,739,892,685,16,4,23,10,14,13,261,327,663,727,957,655,17,14,10,4,7,5,275,355,732,510,747,1009,24,16,33,15,7,3,309,501,685,429,713,851,27,26,26,6,8,11,416,376,708,581,767,933,17,39,25,9,13,12,366,314,808,773,952,764,21,22,19,14,14,5,281,409,654,666,856,706,18,27,5,8,8,1,281,409,893,657,691,706,26,30,10,7,12,4,329,483,831,669,693,622,28,32,10,8,11,9,229,515,571,579,781,917,19,23,18,14,1,14,217,505,684,578,933,693,16,21,15,9,2,7,417,457,896,865,1092,638,18,39,9,15,16,6,453,575,841,696,667,1145,41,38,25,11,16,12,284,442,767,521,680,733,19,10,13,8,15,12,2 +242,490,936,659,615,631,37,36,12,15,12,16,189,315,831,592,640,858,32,17,23,14,10,6,197,205,810,637,853,629,1,17,35,6,2,3,461,201,998,750,614,770,27,15,39,9,14,4,416,228,970,796,708,674,14,11,35,10,15,13,274,280,801,818,913,666,15,17,22,4,8,9,270,392,914,587,749,924,26,9,39,19,8,1,276,528,871,476,789,796,29,19,40,10,9,11,429,381,884,592,645,876,19,32,41,9,14,12,389,291,922,836,892,709,23,15,9,14,15,5,260,366,794,747,820,693,24,20,19,8,9,1,332,412,1007,674,741,683,28,31,20,7,11,4,348,452,917,680,707,651,30,35,20,8,10,9,236,480,793,652,763,914,21,16,34,18,2,14,230,464,836,651,971,698,20,14,29,11,3,9,448,420,1026,930,1048,623,24,38,19,15,17,6,474,612,1087,729,585,1086,43,31,37,15,17,12,327,393,865,516,526,594,27,3,11,10,16,12,2 +226,378,882,965,622,778,24,28,27,14,16,9,215,147,845,838,651,987,23,17,26,11,12,9,173,255,738,765,890,790,16,7,36,7,6,14,353,177,980,1046,659,731,22,15,26,10,6,1,352,198,948,1044,763,689,27,15,36,11,7,10,170,248,773,970,942,883,28,7,37,5,6,20,214,250,970,843,758,985,31,9,26,16,6,2,234,218,899,762,796,891,28,9,33,7,13,14,363,123,840,910,650,923,18,22,34,10,6,17,255,307,856,850,939,750,30,21,4,13,7,8,172,334,702,917,847,934,27,10,34,7,11,14,234,326,941,936,742,830,27,29,33,6,13,11,380,262,861,998,702,874,31,33,33,9,14,12,246,220,777,892,774,1061,36,10,41,15,6,11,190,244,826,719,984,879,33,4,44,8,5,18,332,462,978,972,1135,718,27,28,32,14,11,19,388,334,1069,1043,592,1033,30,31,34,12,9,13,287,283,799,804,491,595,12,7,24,7,14,15,2 +192,516,875,670,562,755,36,28,14,10,16,16,303,321,678,605,607,900,31,25,21,17,16,6,323,249,751,634,1000,783,16,19,37,17,4,3,353,235,937,765,795,908,12,7,37,20,8,4,344,238,909,809,911,808,3,3,37,21,9,13,280,322,740,825,1042,762,0,15,24,15,4,9,298,418,833,602,682,898,25,17,37,20,8,1,348,554,790,485,704,836,28,27,42,13,13,11,459,375,771,601,694,944,30,40,43,20,10,12,235,305,861,843,965,833,8,23,7,7,9,5,254,398,707,752,885,673,9,28,21,3,9,1,286,446,946,683,656,685,27,29,22,4,15,4,336,484,886,689,724,675,29,31,22,19,16,9,350,494,586,667,732,896,20,24,36,21,4,14,316,472,775,650,956,794,17,22,31,14,3,9,376,438,965,927,1177,739,9,40,21,12,11,6,474,610,856,738,554,1070,42,39,39,22,15,12,255,409,812,525,573,686,20,11,13,11,10,12,2 +191,487,927,633,578,690,34,30,6,10,15,18,268,400,682,602,613,803,29,23,37,11,13,4,282,246,783,603,926,694,4,17,27,11,1,5,432,270,953,716,721,875,22,9,37,14,11,6,375,291,921,750,837,675,17,5,27,15,12,11,275,369,776,772,968,611,12,13,14,9,5,7,303,487,833,541,708,873,23,15,37,14,5,3,329,643,792,442,736,723,26,25,30,7,10,9,442,452,805,558,640,813,22,38,29,14,11,10,326,326,919,832,921,810,12,21,23,9,12,7,231,349,765,703,839,618,9,26,9,3,6,1,273,413,1004,664,688,690,25,31,10,2,14,6,383,539,928,646,684,582,27,33,12,13,13,7,293,525,614,606,738,797,18,22,22,15,1,12,243,505,793,653,952,657,15,20,19,8,0,9,421,389,1009,924,1139,688,9,38,5,10,14,8,477,733,864,695,556,1019,40,37,29,16,14,14,292,446,868,514,511,757,18,9,17,11,13,10,2 +219,471,834,672,654,568,30,29,6,14,10,16,216,310,673,617,659,851,25,24,25,11,8,2,272,272,728,610,884,582,6,18,15,7,6,7,488,234,872,737,751,787,32,8,25,10,18,8,387,283,852,765,821,601,21,4,15,11,19,9,315,365,679,769,920,561,22,14,2,5,12,9,309,425,764,540,732,921,19,16,25,16,12,5,319,571,725,467,694,763,22,26,18,7,13,7,416,388,784,619,730,845,12,39,17,10,18,12,458,286,824,825,925,698,22,22,19,13,19,9,313,365,688,704,825,600,19,27,3,7,13,3,323,379,909,701,670,632,21,30,12,6,9,8,341,473,837,707,658,562,23,32,14,9,8,5,267,501,651,609,762,829,14,23,10,15,6,10,293,475,708,632,922,605,13,21,7,8,7,11,507,413,910,915,1097,562,19,39,17,14,21,10,479,623,945,736,646,1057,36,38,17,12,21,16,330,402,779,569,617,665,20,10,17,7,14,8,2 +176,496,829,608,611,659,36,30,5,12,13,17,247,321,628,565,638,848,31,23,36,9,11,5,271,237,731,562,935,675,0,17,26,9,1,4,447,241,867,687,760,860,26,9,36,12,13,5,388,292,845,725,860,668,15,5,26,13,14,12,302,374,676,733,971,592,16,13,13,7,7,6,284,422,751,506,725,918,25,15,36,14,7,2,320,574,718,393,723,760,28,25,29,5,8,10,425,401,773,539,699,848,18,38,28,12,13,11,351,323,819,795,942,777,16,21,22,11,14,6,264,384,665,664,858,603,13,26,8,5,8,0,290,408,904,637,687,661,27,31,9,4,12,5,366,514,830,627,707,543,29,33,11,11,11,8,274,536,540,577,759,826,20,22,21,13,1,13,256,510,703,600,961,654,17,20,18,6,2,8,436,420,907,875,1136,643,13,38,6,12,16,7,472,650,834,672,601,1054,42,37,28,14,16,13,251,447,770,487,582,742,20,9,16,9,15,11,2 +198,416,856,631,566,668,28,29,1,8,14,17,309,393,593,600,577,767,23,24,30,13,14,3,343,289,808,571,904,662,10,18,20,13,6,6,449,265,878,688,761,839,16,8,30,16,10,9,394,294,848,716,837,631,11,4,20,17,11,10,324,370,707,730,950,585,8,14,7,11,6,8,336,492,748,495,646,841,17,16,30,16,10,4,362,574,711,434,634,681,20,26,23,9,15,8,465,441,768,570,688,767,28,39,22,16,12,11,327,257,850,810,901,790,6,22,20,7,11,8,264,316,696,663,809,606,3,27,2,1,11,2,298,340,935,670,596,678,19,30,13,0,13,7,398,472,889,658,642,556,21,32,13,15,14,6,348,442,539,560,684,749,12,23,15,17,6,11,310,410,718,605,884,627,9,21,12,10,5,10,452,368,942,884,1103,666,3,39,12,8,13,9,492,704,765,691,560,973,34,38,22,18,17,15,287,341,813,540,573,775,12,10,18,11,10,9,2 +197,525,984,596,576,709,37,28,13,16,14,15,264,448,709,561,607,760,32,25,36,7,18,7,252,234,810,564,898,703,3,13,26,5,6,2,368,280,992,667,693,886,23,13,36,8,6,11,337,269,964,711,809,676,14,11,26,9,7,14,223,353,829,735,940,630,13,11,13,3,6,4,259,529,860,502,710,824,26,17,36,12,10,6,293,669,823,419,742,698,29,19,29,3,15,12,412,488,778,539,620,780,21,32,28,8,12,13,338,340,984,799,899,819,13,23,30,13,7,4,233,391,830,664,815,631,10,20,16,9,11,2,271,441,1069,629,694,705,28,29,9,8,13,3,351,579,989,627,674,573,30,31,11,7,16,10,289,521,639,567,730,754,21,18,21,11,6,13,223,511,830,620,940,670,18,14,18,10,5,6,389,375,1062,887,1111,709,10,32,6,16,9,5,437,755,867,660,550,970,43,31,28,10,17,11,332,480,933,497,505,774,21,11,16,9,12,13,2 +242,452,931,715,599,698,34,26,15,12,7,13,307,309,666,632,632,815,29,21,24,11,5,9,211,145,795,649,935,692,2,21,36,9,7,0,351,155,953,806,728,805,26,11,34,12,9,5,404,190,925,838,844,715,17,7,36,13,10,10,190,298,776,834,981,645,16,17,25,7,7,4,312,384,813,621,731,875,23,19,34,16,7,2,278,530,776,510,753,755,26,25,37,7,4,14,505,371,765,652,665,837,18,36,38,12,9,15,229,235,925,830,934,770,16,19,4,11,10,2,254,314,771,763,856,682,13,24,22,5,4,4,270,358,1010,724,709,688,25,27,25,4,6,1,378,484,938,740,719,616,27,29,25,11,5,12,336,408,642,688,759,867,18,24,37,15,7,11,162,384,791,673,973,691,15,24,32,8,8,4,298,370,1013,950,1142,682,13,36,24,12,12,3,534,642,858,789,581,1019,40,35,34,14,12,9,341,393,878,568,552,657,18,13,16,9,13,15,2 +173,489,884,638,573,686,34,29,4,10,16,18,272,360,685,605,602,865,29,26,35,11,14,4,312,270,764,638,947,714,6,20,25,11,2,5,458,266,926,719,746,909,20,6,35,14,10,6,393,279,898,769,858,719,15,4,25,15,11,11,321,361,737,797,989,637,10,16,12,9,4,7,303,477,818,560,701,933,23,18,35,14,8,3,341,611,771,475,725,777,26,28,28,7,13,9,428,400,794,567,657,879,24,41,27,14,10,10,362,330,874,863,920,800,10,24,21,9,11,7,259,393,720,732,844,598,7,29,7,3,7,1,281,419,959,661,681,674,25,30,8,2,15,6,381,505,885,655,695,564,27,32,10,13,14,7,299,549,599,621,729,849,18,25,20,15,2,12,283,525,762,690,947,699,15,23,17,8,1,9,475,451,970,963,1140,668,7,41,7,10,13,8,471,659,879,698,559,1071,40,40,27,16,15,14,272,436,827,509,540,751,18,12,15,11,12,10,2 +200,464,929,620,594,671,33,30,13,16,9,15,251,391,674,583,627,862,28,23,36,11,7,7,235,239,797,566,926,669,3,17,26,5,5,2,401,245,951,687,717,850,27,9,36,8,17,5,382,272,923,723,833,658,18,5,26,9,18,12,274,354,774,739,970,614,17,13,17,3,11,4,292,484,817,504,726,930,22,15,36,16,11,0,328,620,780,413,756,782,25,25,29,7,12,12,451,439,799,557,650,862,17,38,28,8,17,13,375,293,923,801,915,773,17,21,30,15,18,4,290,348,769,666,837,675,14,26,16,9,12,2,286,392,1008,655,712,691,24,31,9,8,8,3,336,516,926,645,710,613,26,33,11,7,7,10,272,490,656,575,752,858,17,22,21,15,5,13,232,468,789,600,962,648,14,20,18,10,6,6,420,364,1011,875,1129,659,14,38,6,16,20,5,478,720,914,684,574,1080,39,37,28,12,20,11,351,431,870,499,545,726,17,9,16,9,15,13,2 +244,380,802,713,672,517,28,31,19,15,11,18,225,325,679,656,669,862,23,28,12,6,9,4,249,251,728,581,820,573,8,8,2,6,3,5,471,211,794,768,779,772,30,8,12,9,15,6,446,274,766,788,815,592,23,14,2,10,16,11,284,326,641,746,858,572,24,10,11,4,9,7,328,348,698,565,694,932,17,20,12,11,9,3,258,434,659,508,624,774,20,16,5,2,10,9,421,337,722,660,758,856,10,29,4,9,15,10,389,203,802,810,887,631,26,18,38,14,16,7,318,374,696,689,779,643,23,17,16,8,12,1,368,318,887,746,606,621,19,32,15,7,10,6,304,374,843,748,628,579,21,32,13,8,9,7,312,384,635,622,734,840,12,21,3,10,3,12,248,382,640,569,862,616,17,11,6,9,4,9,446,396,878,862,1031,503,23,29,30,15,18,8,542,558,901,773,666,1068,34,42,4,11,18,14,297,335,773,618,651,626,24,2,22,8,17,10,2 +226,432,870,599,592,661,32,33,0,9,15,16,275,365,607,560,601,768,27,20,31,12,17,6,267,201,772,559,926,665,8,14,21,12,5,3,449,217,884,668,785,838,18,12,31,15,7,8,410,250,868,706,863,640,13,8,21,16,8,13,266,332,701,718,952,588,8,14,8,10,5,5,274,438,744,487,680,840,21,12,31,15,9,3,308,592,717,402,664,686,24,22,24,8,14,11,441,421,734,538,698,786,26,35,23,15,11,12,295,265,868,782,909,777,8,18,17,8,8,5,210,298,714,653,821,577,5,23,3,2,10,1,282,360,953,632,638,645,23,34,12,1,14,4,408,490,889,626,646,513,25,36,12,14,17,9,286,462,501,552,712,742,16,19,16,16,5,14,256,440,720,597,900,640,13,17,13,9,4,7,422,362,942,874,1107,647,5,35,11,9,10,6,480,698,753,663,582,970,38,34,23,17,16,12,275,407,823,496,587,750,16,6,13,12,11,12,2 +227,469,936,652,569,686,32,29,3,9,10,17,240,394,679,603,592,821,27,24,28,12,8,5,234,234,778,582,899,680,4,18,18,12,4,4,458,266,964,713,724,847,22,8,28,15,16,7,375,287,934,735,824,645,17,4,18,16,17,12,287,377,785,749,935,609,12,14,5,10,10,6,269,489,834,524,683,891,21,16,28,15,10,2,301,625,797,451,695,733,24,26,21,8,11,10,398,440,796,595,655,817,22,39,20,15,16,11,332,310,928,813,896,796,12,22,22,8,17,6,185,339,774,682,814,650,9,27,0,2,11,0,249,403,1013,685,659,694,23,30,15,1,9,5,393,535,933,683,653,576,25,32,15,14,8,8,253,489,617,585,709,799,16,23,13,16,4,13,273,477,804,612,907,655,13,21,10,9,5,8,463,365,1020,889,1100,672,9,39,14,9,19,7,419,715,859,716,557,1027,38,38,20,17,19,13,280,456,879,553,548,779,16,10,20,12,16,11,2 +221,391,920,916,665,726,29,27,21,14,13,11,208,184,813,807,694,941,30,18,22,13,11,7,196,240,774,778,941,748,19,6,40,7,7,12,352,170,1020,1009,704,713,17,14,30,10,5,3,341,189,988,1037,798,671,22,14,40,11,6,12,175,231,813,977,995,833,23,6,31,5,7,20,209,231,942,822,799,963,38,10,30,18,7,0,209,275,885,713,835,869,35,10,37,9,14,12,366,168,824,859,701,921,11,23,38,10,5,19,240,244,894,855,974,710,31,20,0,13,6,6,157,317,740,922,890,882,32,11,28,7,12,12,273,333,979,883,787,782,34,28,29,6,12,9,375,287,905,947,761,832,36,34,29,9,13,10,265,237,737,885,817,1033,43,11,43,17,7,13,195,239,864,728,1025,837,40,5,38,10,6,20,311,441,1016,1009,1118,668,32,27,28,14,8,17,401,391,1029,994,637,1055,35,32,38,14,8,15,274,234,837,753,574,543,19,6,20,9,13,13,2 +206,460,861,643,609,667,33,24,6,16,4,17,249,371,636,606,622,912,28,23,29,9,4,5,241,231,729,593,911,687,3,25,19,3,12,4,383,249,883,710,722,878,29,11,29,6,14,7,360,258,855,750,820,684,18,9,19,7,15,12,282,324,714,742,955,638,19,21,6,1,12,6,276,454,781,525,723,982,22,23,29,14,12,2,324,608,738,454,751,824,25,29,22,5,7,10,425,435,745,586,667,906,15,36,21,6,12,11,407,305,855,812,908,781,19,19,23,15,13,6,276,334,709,681,830,667,16,24,9,11,7,0,278,382,940,676,707,709,24,25,6,10,3,5,326,494,872,674,705,605,26,27,8,5,2,8,266,496,650,592,745,898,17,26,14,13,12,13,240,480,731,627,953,686,14,24,11,12,13,8,450,388,947,906,1116,651,16,36,13,16,15,7,430,698,890,707,595,1120,39,35,21,10,15,13,353,403,812,544,574,738,17,17,19,11,16,11,2 +221,441,818,663,568,639,30,30,8,11,12,15,302,358,689,604,579,900,25,23,27,10,10,7,296,286,730,653,866,687,6,17,29,10,8,2,466,264,860,750,697,854,28,9,35,13,20,3,435,293,832,798,779,716,21,5,29,14,21,12,329,365,693,818,910,668,18,13,16,8,14,6,325,449,812,587,668,966,19,15,35,15,14,0,379,597,759,496,692,830,22,25,32,6,15,12,474,418,820,594,628,908,16,38,31,13,20,13,398,288,808,856,865,745,18,21,13,10,21,4,299,347,660,751,781,675,15,26,11,4,15,2,303,381,893,682,644,679,21,31,16,3,11,3,393,469,819,682,640,631,23,33,16,12,10,10,301,495,683,652,688,924,14,22,24,14,8,13,287,465,716,693,900,702,11,20,21,7,9,6,497,393,904,970,1081,627,15,38,15,11,23,5,511,665,951,729,552,1128,36,37,31,15,23,11,334,374,759,524,511,650,16,9,15,10,14,13,2 +221,437,733,647,635,584,27,30,3,14,10,17,248,310,628,602,646,927,22,23,34,9,8,3,308,294,683,575,887,638,9,17,24,7,4,6,504,232,777,720,766,839,33,9,34,10,16,7,441,293,755,754,840,657,24,5,24,11,17,10,343,365,580,744,929,637,23,13,11,5,10,8,341,401,707,529,711,997,16,15,34,14,10,4,311,519,664,436,687,839,19,25,27,5,11,8,442,382,737,586,717,921,11,38,26,10,16,11,426,290,723,798,910,704,23,21,20,13,17,8,335,397,587,681,818,658,20,26,6,7,11,2,357,359,808,672,651,680,18,31,9,6,9,7,329,437,754,674,665,610,20,33,9,9,8,6,313,497,596,598,747,905,11,22,19,13,4,11,299,485,613,597,917,681,14,20,16,8,5,10,497,437,809,880,1088,566,20,38,8,14,19,9,523,605,890,711,627,1133,33,37,26,12,19,15,282,410,686,528,614,661,21,9,14,7,16,9,2 +268,380,836,634,582,602,23,29,7,7,10,14,355,435,577,589,625,807,18,24,38,14,8,8,307,317,802,608,962,590,13,18,28,14,6,1,451,301,848,715,759,761,21,8,38,17,18,8,454,342,820,761,871,565,16,4,28,18,19,13,328,396,677,789,1008,559,13,14,15,12,12,3,394,458,700,562,700,877,12,16,38,17,12,3,418,536,665,445,724,719,15,26,31,10,13,13,565,497,712,567,692,801,23,39,30,17,18,14,319,253,832,845,965,718,11,22,24,6,19,3,316,356,694,716,883,630,8,27,10,0,13,3,312,306,917,663,676,652,14,30,11,1,9,2,412,450,869,655,722,566,16,32,13,16,8,11,374,428,589,619,750,785,7,23,23,18,6,12,290,408,688,656,974,581,4,21,20,11,7,5,426,354,916,927,1185,598,8,39,4,9,21,4,600,656,821,700,578,1013,29,38,30,19,21,10,369,383,797,515,553,713,17,10,18,10,14,14,2 +347,363,1174,555,582,684,36,9,9,16,4,11,272,586,851,560,605,689,31,34,40,15,4,13,140,226,928,559,830,620,0,16,30,5,16,4,414,380,1098,634,617,705,28,32,40,8,16,17,457,357,1088,680,733,557,15,32,30,9,15,10,171,321,995,728,882,599,16,20,17,3,16,2,295,451,878,483,716,771,25,28,40,20,16,14,237,541,897,406,756,631,28,10,33,11,9,18,476,548,776,476,606,637,18,19,32,8,12,19,260,214,1178,812,865,752,20,22,26,15,13,2,263,207,1024,653,783,696,17,17,12,9,11,8,297,293,1263,594,708,690,27,16,13,8,3,3,413,417,1165,564,672,564,29,20,15,9,4,16,279,423,831,540,728,669,20,23,25,19,16,7,107,407,984,631,932,591,17,13,22,12,17,0,319,177,1230,894,1055,668,17,9,2,16,15,1,493,605,849,613,552,817,42,20,32,16,15,11,390,494,1121,460,503,797,20,24,20,11,18,19,2 +158,536,762,657,695,691,33,29,10,15,16,12,181,357,735,592,728,1040,28,24,35,12,14,2,279,279,680,587,997,761,3,18,31,6,2,11,419,293,838,736,758,936,21,8,35,9,10,12,350,338,810,766,848,782,18,4,31,10,11,5,296,418,641,766,1053,768,19,14,18,4,4,13,292,426,836,545,825,1108,22,16,35,17,4,9,266,584,775,448,849,956,25,26,32,8,9,3,369,415,818,598,765,1040,15,39,33,9,10,10,427,395,746,802,992,787,27,22,21,14,11,13,316,424,600,697,936,783,28,27,13,8,7,7,314,474,831,678,807,801,28,30,14,7,15,12,244,522,775,686,819,741,26,32,16,8,14,1,286,600,659,614,851,1032,21,23,26,16,2,8,302,582,686,613,1061,810,26,21,23,9,1,15,462,476,854,890,1132,651,28,39,7,15,13,14,430,590,947,727,681,1226,39,38,33,13,13,12,249,509,701,530,672,716,25,10,21,8,12,4,2 +295,449,830,653,536,587,28,29,5,8,12,17,296,360,629,606,569,820,23,24,26,15,10,5,302,298,750,661,900,607,8,18,22,15,8,4,544,266,862,720,695,796,26,8,34,18,20,7,499,279,834,774,811,614,21,4,22,19,21,12,355,341,691,812,944,566,16,14,9,13,14,6,377,461,764,573,668,888,17,16,28,18,14,2,383,581,723,504,694,742,20,26,27,11,15,10,528,404,790,588,612,820,18,39,28,18,20,11,368,266,822,872,891,703,16,22,12,5,21,6,279,343,680,751,809,595,13,27,6,1,15,0,367,385,907,678,646,629,19,30,13,2,11,5,455,449,839,676,648,553,21,32,17,17,10,8,333,451,635,628,698,826,12,23,21,19,8,13,307,419,702,709,916,604,9,21,16,12,9,8,521,401,914,986,1111,583,13,39,16,10,23,7,581,657,889,711,520,1042,34,38,24,20,23,13,364,348,779,514,487,644,14,10,8,9,14,11,2 +235,379,965,582,716,545,35,24,9,16,12,13,210,442,858,571,737,790,30,33,40,15,10,15,192,214,763,562,934,529,1,1,30,5,2,6,404,266,919,663,715,682,23,15,40,8,14,15,405,293,897,709,789,502,16,21,30,9,15,12,237,247,808,737,994,586,17,3,17,3,8,4,315,415,811,500,832,846,24,25,40,20,8,14,215,543,802,397,840,686,27,11,33,11,9,20,448,446,773,505,756,766,17,34,32,8,14,17,318,234,969,811,965,597,25,23,26,15,15,4,321,269,853,662,899,683,26,12,12,9,9,10,349,329,1054,617,802,631,26,25,13,8,11,5,277,427,974,593,784,541,28,33,15,9,10,18,313,417,754,565,850,762,19,26,25,19,2,9,189,399,787,618,1042,582,24,4,22,12,3,2,333,291,1027,885,1099,513,26,22,2,16,17,3,543,657,986,642,696,978,41,37,32,16,17,13,260,368,922,475,635,642,27,7,20,11,16,21,2 +188,368,660,767,624,615,13,35,14,15,12,12,245,269,615,674,605,984,12,18,17,6,10,2,325,359,720,583,860,695,23,12,7,6,2,11,461,241,712,780,755,894,17,14,17,9,14,12,400,308,712,776,841,714,24,10,7,10,15,5,358,392,549,676,884,694,23,14,6,4,8,13,346,362,724,589,584,1054,14,10,17,9,8,9,322,388,687,592,574,896,15,20,10,2,9,3,311,303,778,744,754,978,31,33,9,9,14,10,461,357,654,742,849,707,15,16,33,14,15,13,358,434,500,639,753,709,14,21,11,8,9,7,348,314,739,814,554,735,4,32,10,7,11,12,344,290,713,832,604,667,8,34,8,8,10,1,306,366,549,612,636,962,9,17,2,10,2,8,314,366,602,517,792,738,6,15,1,9,3,15,502,562,738,816,1025,567,14,33,25,15,17,14,420,492,847,829,622,1190,19,32,9,11,17,12,241,283,641,704,695,626,15,4,19,8,16,4,2 +289,287,1060,682,543,747,31,9,3,3,8,13,342,506,737,663,560,648,26,32,34,10,12,9,288,254,972,652,887,701,13,18,24,16,12,0,292,320,1020,741,750,852,13,34,34,13,8,17,335,355,992,795,820,656,8,36,24,14,9,12,217,337,887,801,943,652,5,22,11,16,10,2,327,391,824,564,627,718,20,40,34,13,12,12,319,473,817,497,609,630,23,28,27,12,11,14,442,476,774,619,667,706,31,17,26,13,18,15,138,142,1064,879,878,853,3,20,20,2,1,2,253,183,910,740,782,639,4,23,6,4,7,4,297,239,1149,719,577,727,22,18,9,5,9,1,441,371,1097,707,603,587,24,14,9,12,10,12,393,369,665,635,663,582,15,33,19,14,12,11,231,327,882,688,857,662,12,15,16,7,11,4,243,183,1128,971,1074,751,4,3,8,5,3,3,443,545,729,734,543,796,37,18,26,15,15,9,334,394,1027,585,556,878,15,28,14,10,14,15,2 +227,283,903,631,589,634,26,3,6,6,3,13,270,548,622,584,612,783,21,30,37,11,3,9,166,296,815,617,923,606,10,20,27,13,15,0,356,358,875,718,740,771,26,28,37,12,17,13,425,385,847,764,840,563,21,34,27,13,16,12,181,379,746,786,969,615,16,18,14,13,15,2,321,423,729,555,705,815,15,38,37,12,15,8,275,473,708,452,717,723,18,26,30,11,8,14,498,496,693,560,671,773,18,15,29,12,11,15,214,184,907,836,926,740,16,24,23,5,12,2,257,193,781,717,840,692,13,21,9,5,10,4,261,221,992,654,669,694,17,12,10,4,4,1,343,375,924,648,687,532,19,14,12,11,3,12,313,375,674,620,733,727,10,31,22,13,15,11,133,343,737,667,945,625,7,17,19,6,16,4,303,173,977,938,1142,630,13,9,5,6,14,3,547,567,832,697,573,957,32,16,29,14,14,9,318,422,862,498,532,745,14,28,17,9,17,15,2 +220,502,809,712,681,584,33,29,8,14,14,9,187,325,774,641,712,939,28,26,23,11,12,7,257,255,717,660,961,662,3,20,19,7,0,16,491,247,861,771,744,843,19,6,31,10,12,17,436,280,833,815,824,681,18,4,19,11,13,10,310,362,692,815,1017,667,19,16,6,5,6,18,342,406,871,588,801,1007,22,18,25,16,6,14,226,550,816,509,813,857,25,28,24,7,9,2,357,383,873,661,751,939,15,41,25,10,12,5,397,339,797,867,1000,670,27,24,9,13,13,18,296,402,655,754,916,684,28,29,5,7,7,12,376,432,882,733,765,700,30,30,10,6,13,17,296,484,818,749,783,642,26,32,16,9,12,4,306,544,714,659,833,933,23,25,18,15,0,13,268,524,717,686,1043,709,28,23,13,8,1,20,458,466,897,967,1138,538,28,41,19,14,15,19,506,572,1012,778,671,1139,39,40,21,12,15,9,227,427,754,581,612,601,23,12,11,7,14,1,2 +240,452,983,634,638,661,37,25,9,16,6,16,243,427,686,595,661,738,32,30,30,13,10,6,205,199,831,568,902,645,1,10,20,5,10,3,387,225,983,693,721,816,27,12,30,8,10,10,354,240,955,717,821,604,14,12,20,9,11,13,206,322,824,733,946,576,15,6,7,3,12,5,268,466,835,502,754,814,26,22,30,18,10,5,268,612,808,439,772,666,29,22,23,9,9,11,425,471,755,575,686,738,19,35,22,8,16,12,331,283,983,801,927,777,17,24,26,15,11,5,234,314,829,662,841,619,14,23,6,9,9,1,264,370,1068,669,724,669,28,26,9,8,5,4,366,524,1000,663,724,549,30,30,11,7,8,9,274,480,638,565,778,718,21,23,15,17,10,14,192,458,829,612,982,610,18,13,12,10,11,7,370,360,1063,883,1123,659,14,31,12,16,13,6,456,738,824,696,618,944,43,34,22,14,13,12,357,461,940,533,575,772,21,12,24,9,12,12,2 +252,408,885,660,649,606,30,29,14,15,10,14,251,363,618,611,664,815,25,28,27,6,8,8,225,225,761,566,931,590,6,12,17,6,6,1,437,217,893,721,772,769,28,8,27,9,18,10,398,266,867,743,858,579,21,10,17,10,19,13,254,316,724,741,969,559,18,10,8,4,12,3,318,414,743,524,747,885,19,20,27,11,12,5,334,570,712,455,741,727,22,20,20,2,13,13,481,435,739,603,715,809,16,37,19,9,18,14,389,245,883,805,944,722,18,22,33,14,19,3,284,312,739,672,852,628,15,21,11,8,13,3,286,346,968,693,701,650,21,30,8,7,9,2,348,440,900,691,701,584,23,34,10,8,8,11,292,456,622,593,775,793,14,23,12,10,6,12,238,426,733,604,963,577,11,15,11,9,7,5,426,344,963,879,1146,602,15,33,15,15,21,4,528,686,856,724,635,1021,36,36,19,11,21,10,381,373,840,561,590,717,16,10,23,8,14,14,2 +154,538,896,545,571,737,37,33,7,7,16,17,251,431,671,538,610,810,32,20,38,14,16,3,311,259,788,553,979,741,13,14,28,14,4,6,437,301,918,630,774,914,13,12,38,17,8,7,368,310,898,684,890,716,8,8,28,18,9,10,286,384,733,724,1021,664,3,14,15,12,4,8,304,536,796,485,699,828,26,12,38,17,10,4,312,668,765,394,723,762,29,22,31,10,15,8,421,459,756,462,675,854,31,35,30,17,12,11,283,379,892,798,946,853,9,18,24,6,9,8,224,398,738,651,870,595,10,23,10,0,9,2,292,464,977,578,679,697,28,34,11,1,15,7,366,548,903,550,713,563,30,36,13,16,16,6,314,574,539,544,739,728,21,19,23,18,4,11,300,558,754,615,961,716,18,17,20,11,3,10,412,446,972,882,1168,723,10,35,4,9,11,9,470,744,831,603,561,956,43,34,30,19,17,15,213,489,845,432,552,826,21,6,18,10,10,9,2 +211,479,973,606,577,690,34,30,8,10,14,16,298,462,684,593,592,699,29,23,39,11,18,6,286,240,835,594,893,662,6,17,29,11,6,3,400,280,985,689,726,825,20,9,39,14,6,10,379,295,957,735,816,611,15,5,29,15,7,13,247,379,814,765,939,603,10,13,16,9,6,5,287,517,833,526,685,775,23,15,39,14,10,5,303,631,800,429,691,643,26,25,32,7,15,11,454,510,777,537,653,725,24,38,31,14,12,12,288,300,969,831,896,790,10,21,25,9,7,5,211,345,815,694,808,622,7,26,11,3,11,1,275,399,1054,639,651,684,25,31,12,2,13,4,383,553,980,625,653,552,27,33,14,13,16,9,331,481,594,591,709,687,18,22,24,15,6,14,253,471,825,644,913,633,15,20,21,8,5,7,385,347,1053,915,1102,686,7,38,3,10,9,6,485,767,806,670,565,909,40,37,31,16,17,12,310,488,922,497,528,795,18,9,19,11,12,12,2 +274,390,837,576,577,578,26,31,6,11,9,17,229,411,658,549,604,883,21,22,37,10,7,5,271,273,757,546,917,594,10,16,27,10,5,4,533,271,859,647,690,793,30,10,37,13,17,9,474,304,831,685,800,613,25,6,27,14,18,12,348,382,682,717,965,599,20,12,14,8,11,6,330,484,749,484,709,953,15,14,37,13,11,4,302,572,704,393,751,795,18,24,30,6,12,10,443,459,773,509,641,877,14,37,29,13,17,11,429,253,831,791,912,684,20,20,23,10,18,6,286,296,701,646,836,666,17,25,9,4,12,0,354,342,916,613,707,662,17,32,10,3,8,5,376,466,832,597,687,598,19,34,12,12,7,8,296,442,634,543,729,861,10,21,22,14,5,13,296,412,697,596,941,637,11,19,19,7,6,8,520,358,919,869,1116,564,17,37,5,11,20,7,526,698,912,638,551,1089,32,36,29,15,20,13,333,367,780,473,524,675,18,8,17,10,15,11,2 +188,400,678,599,641,631,18,29,11,11,11,14,323,369,605,574,672,962,13,24,34,10,9,0,401,387,668,517,991,675,18,18,24,10,3,9,481,339,750,666,794,876,24,8,34,13,15,10,432,384,722,696,898,694,19,4,24,14,16,7,432,456,549,694,1039,672,18,14,11,8,9,11,432,494,694,475,751,1032,7,16,34,13,9,7,408,534,639,390,755,874,10,26,27,6,10,5,493,393,736,540,749,956,22,39,26,13,15,12,475,375,662,768,994,751,12,22,28,10,16,11,410,492,528,623,912,687,9,27,10,4,10,5,342,392,747,636,713,713,9,30,7,3,10,10,344,400,725,628,757,645,11,32,9,12,9,3,394,514,583,544,791,940,2,23,19,14,3,8,394,512,590,551,1003,716,3,21,16,7,4,13,524,508,770,824,1192,611,9,39,8,11,18,12,532,596,869,661,633,1168,24,38,26,15,18,14,291,449,629,510,624,702,22,10,20,10,17,6,2 +289,419,818,918,722,663,18,31,26,13,18,13,168,184,561,767,691,820,13,14,17,2,14,9,100,204,768,718,830,655,18,10,5,4,4,0,320,178,810,927,793,830,24,18,5,11,8,5,315,191,784,891,907,638,19,18,5,8,9,10,127,243,649,763,818,584,18,10,18,6,6,4,177,191,658,748,666,870,7,6,5,5,4,2,169,241,627,759,640,732,10,6,2,2,11,14,350,230,684,911,820,828,34,19,3,5,8,15,252,266,820,741,847,767,10,18,35,10,9,2,191,335,666,736,753,619,9,7,23,12,11,4,279,327,905,949,592,633,9,32,22,11,15,1,329,331,879,999,666,581,11,30,20,4,16,12,233,235,471,755,702,778,2,7,10,6,4,11,151,251,654,538,724,630,1,5,13,13,3,4,307,453,892,813,975,647,9,31,37,13,13,3,367,379,731,990,710,1014,24,28,3,7,11,9,314,270,809,833,797,762,22,10,29,12,12,15,2 +224,432,826,577,580,650,31,30,6,10,11,17,293,383,597,562,603,879,26,23,37,11,9,5,291,263,692,545,930,670,5,17,27,11,7,4,483,261,848,654,741,855,25,9,37,14,19,9,414,280,820,692,841,663,20,5,27,15,20,12,326,346,679,716,972,597,15,13,14,9,13,6,322,480,744,481,696,949,20,15,37,14,13,4,368,612,697,384,722,791,23,25,30,7,14,10,459,421,726,506,656,873,19,38,29,14,19,11,395,289,820,790,907,770,15,21,23,9,20,6,286,334,666,643,831,624,12,26,9,3,14,0,296,388,905,614,678,676,22,31,10,2,10,5,404,482,833,594,684,562,24,33,12,13,9,8,294,494,585,546,722,857,15,22,22,15,7,13,288,468,686,603,936,649,12,20,19,8,8,8,486,382,908,872,1127,632,12,38,5,10,22,7,498,700,819,639,564,1085,37,37,29,16,22,13,315,385,773,470,539,727,15,9,17,11,13,11,2 +213,479,805,691,586,619,31,28,12,15,11,17,244,334,656,640,597,908,26,25,19,6,9,5,280,280,717,597,862,639,5,19,9,6,3,4,488,260,845,752,707,834,31,7,19,9,15,7,419,285,817,776,785,648,20,3,9,10,16,12,347,359,676,754,900,618,21,15,8,4,9,6,307,443,759,551,680,978,20,17,19,11,9,2,351,569,720,486,686,820,23,27,12,2,10,10,428,384,773,634,664,902,13,40,11,9,15,11,456,282,797,818,887,751,21,23,29,14,16,6,323,387,671,691,797,645,18,28,9,8,12,0,331,421,882,724,646,689,22,29,14,7,10,5,375,471,814,722,646,603,24,31,14,8,9,8,275,487,658,620,708,886,15,24,8,10,3,13,305,455,697,603,908,662,12,22,9,9,4,8,519,415,889,888,1081,611,18,40,23,15,18,7,459,615,928,755,576,1114,37,39,11,11,18,13,332,402,754,592,549,710,19,11,21,8,17,11,2 +194,462,884,617,706,638,33,29,7,16,13,8,231,379,827,584,727,979,28,24,38,19,11,6,323,313,776,615,916,718,3,18,28,5,1,15,449,281,966,704,671,871,17,8,38,8,13,16,400,296,938,770,739,739,18,4,28,9,14,9,348,370,789,800,978,719,19,14,15,3,7,17,338,494,990,571,840,1045,22,16,38,24,7,13,286,606,931,452,874,907,25,26,31,15,12,1,341,419,906,532,726,985,15,39,30,10,13,6,467,303,866,858,921,714,27,22,24,15,14,17,378,404,732,723,885,740,28,27,10,9,8,11,366,414,951,638,826,748,32,30,11,8,12,16,264,478,881,620,796,696,26,32,13,13,11,3,306,504,737,632,852,991,25,23,23,23,1,12,324,474,842,665,1050,767,30,21,20,16,2,19,518,414,978,934,1049,592,28,39,4,16,16,18,444,674,983,671,676,1207,39,38,30,20,16,8,235,411,815,480,615,605,21,10,18,11,15,0,2 +171,447,703,703,631,657,17,30,15,14,10,13,238,266,754,616,664,952,12,23,16,13,8,1,308,298,681,631,929,715,19,17,38,7,4,10,472,224,813,802,702,810,29,9,32,10,16,11,403,279,785,856,816,702,34,5,38,11,17,8,335,387,622,826,977,754,35,13,25,5,10,18,339,387,857,643,763,1012,20,15,32,18,10,8,325,427,792,528,787,888,17,25,39,9,11,4,428,308,851,640,687,970,7,38,40,10,16,11,416,310,665,808,942,717,39,21,2,13,17,12,335,461,549,769,866,779,36,26,22,7,11,10,339,393,750,704,743,753,26,31,27,6,9,11,323,365,712,728,747,737,22,33,27,9,8,2,303,399,680,714,789,998,25,22,37,17,4,11,297,409,683,625,999,782,30,20,32,10,5,18,473,527,793,906,1130,619,36,38,26,14,19,15,493,525,964,777,611,1130,23,37,40,14,19,13,260,330,618,552,582,598,25,9,18,9,16,5,2 +179,493,960,588,555,645,34,32,9,9,13,15,266,418,735,571,588,760,29,21,40,12,17,1,314,246,826,548,945,665,10,15,30,12,7,8,432,272,964,665,740,854,16,11,40,15,5,9,359,285,952,703,856,658,11,7,30,16,6,8,273,347,783,723,987,572,6,13,17,10,7,10,301,533,842,486,689,824,23,13,40,15,9,6,295,647,823,385,725,690,26,23,33,8,14,6,416,434,812,517,645,802,28,36,32,15,11,13,320,308,958,799,926,777,6,19,26,8,6,10,217,363,804,648,844,521,7,24,12,2,12,4,275,433,1043,625,677,629,25,33,13,1,12,9,373,529,965,605,679,505,27,35,15,14,15,4,321,491,589,555,717,732,18,20,25,16,7,9,287,473,800,610,939,630,15,18,22,9,6,12,417,361,1024,873,1146,637,7,36,2,9,8,11,471,723,877,650,535,960,40,35,32,17,16,15,256,442,909,485,518,746,18,7,20,12,13,7,2 +276,350,828,597,617,651,25,27,7,8,15,16,353,389,537,550,662,746,20,30,38,13,13,6,301,233,788,535,1043,619,13,4,28,13,1,3,443,233,816,674,838,776,17,12,38,16,11,10,420,296,796,702,954,580,12,18,28,17,12,13,286,332,653,710,1085,568,11,6,15,11,5,5,386,412,656,483,741,816,14,22,38,16,5,5,386,500,633,386,765,658,17,14,31,9,8,11,559,431,670,532,739,748,31,31,30,16,11,12,277,199,830,782,1010,743,3,20,24,7,12,5,278,302,676,641,932,615,2,15,10,1,6,1,280,278,915,622,721,639,16,28,11,0,14,4,440,392,883,620,771,549,18,32,13,15,13,9,372,396,453,554,789,724,9,23,23,17,1,14,258,374,658,577,1013,600,6,7,20,10,0,7,356,320,896,848,1228,633,2,25,4,8,14,6,612,620,669,661,609,952,31,40,30,18,14,12,319,349,807,478,616,752,15,4,18,11,13,12,2 +229,467,877,586,625,621,34,28,8,10,10,14,292,370,728,573,656,948,29,25,39,13,8,8,320,320,777,610,949,669,2,19,29,11,6,1,476,288,897,667,714,862,26,7,39,14,18,8,459,325,869,731,826,692,17,3,29,15,19,13,367,401,744,771,1001,672,18,15,16,9,12,3,355,489,841,538,757,1018,23,17,39,18,12,3,347,597,786,453,789,864,26,27,32,9,13,13,498,420,829,515,693,944,16,40,31,14,18,14,426,324,873,843,958,721,26,23,25,9,19,3,341,417,725,702,878,705,27,28,11,3,13,3,321,419,958,619,747,711,25,29,12,2,9,2,369,473,884,603,745,645,27,31,14,13,8,11,337,533,718,593,777,940,18,24,24,17,6,12,321,507,769,674,989,716,21,22,21,10,7,5,511,433,957,941,1116,599,27,40,3,10,21,4,543,673,982,648,605,1162,40,39,31,16,21,10,346,430,826,473,590,682,28,11,19,11,14,14,2 +286,338,1024,644,600,778,33,19,0,7,11,12,319,457,707,601,607,699,28,40,31,14,15,10,283,179,862,580,938,732,17,4,21,14,9,1,285,241,1010,705,799,867,9,20,31,17,3,12,338,262,982,741,879,675,4,26,21,18,4,11,200,330,855,737,972,683,3,8,8,12,9,1,306,398,832,514,660,727,22,32,31,17,11,7,294,498,811,441,640,683,25,18,24,10,14,15,453,497,776,591,730,761,31,31,23,17,15,16,145,181,1026,801,921,870,5,30,17,6,4,1,218,228,872,674,829,626,6,19,3,0,10,5,298,270,1111,677,610,720,24,20,12,1,10,0,402,424,1069,679,648,622,26,28,12,16,13,13,390,374,621,583,704,563,17,27,16,18,9,10,248,352,856,610,888,701,14,1,13,11,8,3,248,242,1098,891,1113,768,6,17,11,9,6,2,464,628,755,708,596,805,39,32,23,19,18,8,301,427,993,549,623,893,17,14,15,10,15,16,2 +144,534,872,689,679,637,36,29,13,17,16,18,179,339,755,644,710,958,31,26,32,14,14,4,253,249,750,597,957,675,0,20,22,4,2,5,399,269,926,766,720,876,26,6,32,7,10,6,316,300,898,782,816,694,15,4,22,8,11,11,270,386,731,768,1013,668,16,16,21,2,4,7,262,444,846,571,811,1028,25,18,32,19,4,3,276,610,795,476,839,870,28,28,25,10,9,9,385,399,824,622,727,952,18,41,24,7,10,10,395,375,860,828,976,757,24,24,24,16,11,7,288,400,718,699,904,683,25,29,16,10,9,1,292,446,945,718,795,713,27,30,17,9,15,6,280,536,875,710,791,641,29,32,17,8,14,7,246,568,713,628,833,936,20,25,21,18,2,12,270,550,770,635,1041,712,21,23,24,11,1,9,432,452,960,910,1132,617,25,41,10,17,13,8,428,630,1009,755,657,1164,42,40,24,15,13,14,273,485,815,570,632,708,28,12,16,10,14,10,2 +150,454,853,688,606,642,29,29,12,13,12,17,257,281,584,641,607,799,24,24,19,8,10,5,261,229,787,544,864,654,7,18,9,8,2,4,415,175,865,743,783,837,19,8,19,11,14,11,348,216,837,757,827,639,14,4,9,12,15,12,266,310,694,719,904,563,9,14,4,6,8,6,278,374,731,540,646,869,18,16,19,11,8,6,312,492,690,483,612,711,21,26,12,4,9,10,411,369,759,635,718,797,25,39,11,11,14,11,337,221,849,797,881,772,9,22,31,12,15,6,252,366,695,658,783,572,6,27,9,6,9,0,250,368,934,727,582,652,20,30,8,5,11,5,362,426,884,723,606,532,22,32,8,10,10,8,266,408,542,599,682,777,13,23,4,12,2,13,246,388,705,564,856,617,10,21,1,7,3,8,414,402,933,847,1067,636,6,39,23,13,17,7,460,610,776,752,600,1005,35,38,11,13,17,13,273,345,816,607,603,739,13,10,21,8,16,11,2 +269,433,925,639,572,732,32,17,8,11,12,15,358,424,630,586,621,757,27,22,25,18,16,7,338,202,857,647,1008,718,16,28,31,18,8,2,334,224,947,732,803,869,10,18,41,21,4,3,347,239,909,792,919,725,5,16,31,22,5,12,263,303,768,826,1050,663,4,26,18,16,8,6,355,469,787,595,694,753,21,24,37,21,12,0,335,569,754,484,720,695,24,30,36,14,15,12,502,466,745,568,702,805,32,29,37,21,14,13,172,232,921,856,973,816,4,16,11,8,5,4,247,291,767,753,893,596,5,25,15,4,11,2,311,371,1006,656,672,686,23,20,18,5,11,3,409,485,960,656,732,584,25,20,18,20,14,10,433,399,570,654,746,711,16,23,30,22,8,13,301,385,785,683,970,701,13,25,25,15,7,6,291,309,1005,956,1189,728,5,29,17,13,7,5,515,703,760,705,566,905,38,28,33,23,19,11,314,392,880,498,581,745,16,24,9,12,14,13,2 +215,527,928,688,588,816,36,29,18,9,12,15,292,322,689,623,629,923,31,24,19,12,16,7,296,186,786,624,1026,826,16,18,41,12,8,2,294,214,970,771,821,923,12,8,33,15,4,3,287,223,942,817,937,859,1,4,41,16,5,12,227,337,781,803,1068,777,0,14,28,10,8,6,271,431,846,598,708,883,25,16,33,15,8,0,297,583,807,487,726,859,28,26,40,8,15,12,422,368,808,629,720,967,28,39,41,15,10,13,176,298,918,825,991,890,8,22,3,8,5,4,221,403,764,734,911,662,9,27,25,2,11,2,295,445,1003,709,682,734,27,30,26,1,11,3,351,537,937,717,750,678,29,32,26,14,14,10,349,485,593,667,754,875,20,23,40,16,8,13,281,473,806,642,978,831,17,21,35,9,7,6,287,395,1014,921,1203,794,9,39,25,9,7,5,449,635,859,760,580,1041,42,38,41,17,15,11,250,470,873,557,599,763,20,10,17,12,14,13,2 +193,459,797,727,576,686,31,30,21,13,12,15,236,286,708,654,621,903,26,23,26,8,10,5,262,260,761,641,928,714,5,17,36,8,2,4,462,216,863,812,723,835,29,9,30,11,14,5,419,259,835,844,839,733,20,5,36,12,15,12,309,335,666,822,972,705,19,13,31,6,8,10,293,389,817,629,708,963,20,15,30,13,8,2,323,475,762,526,734,839,23,25,37,4,9,10,442,362,859,670,656,921,15,38,38,11,14,11,372,270,783,832,935,772,19,21,4,12,15,6,275,417,633,757,851,718,16,26,28,6,11,2,311,391,868,744,686,706,22,31,29,5,11,5,359,437,804,758,702,676,24,33,29,10,10,8,275,481,690,688,750,949,15,22,41,12,2,13,263,471,711,647,970,733,12,20,38,7,3,10,459,435,887,930,1147,668,16,38,28,13,17,7,501,571,972,799,568,1073,37,37,34,13,17,13,290,426,734,592,525,655,17,9,20,8,16,11,2 +144,494,804,695,632,702,35,28,5,14,10,16,245,375,685,650,665,965,30,25,32,11,8,2,301,307,732,653,952,738,1,19,22,7,4,7,443,311,878,762,737,931,29,7,32,10,16,8,390,334,850,814,853,745,16,3,22,11,17,9,326,404,685,808,998,677,17,15,13,5,10,9,310,456,812,581,760,1035,24,17,32,16,10,5,336,574,761,490,784,877,27,27,25,7,11,7,401,413,808,642,696,959,17,40,24,10,16,12,407,419,790,862,957,822,19,23,22,13,17,9,318,440,636,753,879,690,16,28,8,7,11,3,316,452,875,724,740,730,26,29,11,6,9,8,328,474,825,730,752,648,28,31,11,9,8,5,278,614,659,652,792,943,19,24,21,15,4,10,282,604,720,669,1006,725,16,22,18,8,5,11,480,538,896,962,1159,680,16,40,10,14,19,10,436,576,939,749,614,1171,41,39,24,12,19,16,261,501,753,590,585,767,19,11,16,7,16,8,2 +126,510,759,710,681,661,32,29,14,13,15,15,247,363,708,629,718,1000,27,26,27,10,13,3,319,323,729,616,1005,713,4,20,23,8,1,6,411,305,827,791,782,914,30,6,21,11,11,7,364,344,803,835,894,732,19,4,23,12,12,10,336,418,628,801,1057,710,20,16,22,6,5,12,334,458,797,610,809,1070,21,18,21,15,5,4,352,544,744,509,833,912,24,28,20,6,8,8,423,393,805,661,757,994,14,41,21,11,11,13,395,397,745,845,1022,781,26,24,17,12,12,8,328,462,603,738,944,725,23,29,17,6,10,4,292,458,830,723,789,751,23,30,22,5,14,7,312,462,786,749,809,683,25,32,22,10,13,6,302,580,674,681,847,978,16,25,28,14,1,11,296,578,671,628,1063,754,17,23,27,7,0,12,450,508,849,903,1210,637,23,41,21,13,14,9,460,570,962,782,669,1206,38,40,21,13,14,15,273,493,708,581,640,720,24,12,23,8,15,9,2 +226,332,893,694,604,702,25,23,12,9,14,13,311,383,582,629,609,669,20,34,19,12,18,9,263,215,821,560,918,656,19,0,9,12,6,0,347,209,879,731,785,805,17,16,19,15,6,11,376,274,855,757,871,621,12,22,9,16,7,12,198,290,720,711,944,607,11,4,4,10,6,2,304,362,713,530,624,753,14,26,19,15,10,6,308,412,686,503,604,623,17,12,12,8,15,14,479,389,717,653,752,731,37,35,11,15,12,15,189,147,893,775,899,794,3,24,31,8,7,2,216,218,739,658,807,594,2,13,9,2,11,4,262,242,978,727,584,666,16,24,8,1,13,1,388,350,968,741,630,572,18,32,8,14,16,12,360,272,488,587,668,637,9,27,4,16,6,11,222,240,725,574,852,625,6,3,1,9,5,4,304,312,963,863,1087,692,2,21,23,9,9,3,514,546,678,756,608,865,31,36,11,17,17,9,279,263,894,611,651,817,15,8,21,12,12,15,2 +253,501,1048,625,629,619,40,34,8,14,15,14,160,432,797,580,658,838,35,21,39,17,13,8,114,178,872,617,897,593,4,11,29,7,1,1,418,228,1036,706,654,762,24,11,39,10,11,8,413,229,1016,750,744,588,11,11,29,11,12,13,209,355,877,794,957,610,12,13,16,5,5,3,247,465,884,555,761,904,29,13,39,22,5,3,223,605,861,454,795,756,32,19,32,13,8,13,410,480,778,558,687,836,22,32,31,10,11,14,300,294,1052,848,888,697,20,15,25,13,12,3,205,379,904,725,842,687,21,20,11,7,6,3,301,407,1137,654,753,665,31,35,12,6,14,2,351,567,1049,646,747,587,33,33,14,11,13,11,229,487,741,610,779,832,24,16,24,21,1,12,161,473,876,667,983,626,21,14,21,14,0,5,367,337,1120,936,1024,597,21,32,3,14,14,4,469,735,995,691,617,1054,46,35,31,18,14,10,304,498,999,506,612,674,28,3,19,13,13,14,2 +195,447,844,802,608,741,30,34,27,14,15,12,116,266,799,695,629,1042,29,17,24,11,13,6,158,172,734,664,920,801,6,11,34,7,1,5,426,136,932,877,695,906,26,11,24,10,11,4,331,239,904,893,809,808,21,11,34,11,12,13,221,265,731,847,970,824,22,13,37,5,5,13,179,279,908,678,738,1104,27,9,24,16,5,1,227,393,839,603,788,976,30,19,31,7,8,11,320,334,870,753,660,1058,20,32,32,10,11,14,366,230,826,819,925,805,30,15,6,13,12,5,201,361,676,784,845,839,27,20,34,7,10,5,271,363,911,817,740,833,21,31,35,6,14,4,289,419,837,841,718,797,23,33,35,9,13,9,151,423,765,739,750,1078,22,16,39,15,1,14,207,417,780,652,958,858,21,14,42,8,0,13,435,401,938,937,1099,697,27,32,34,14,14,10,387,523,1053,884,582,1198,36,31,32,12,14,16,258,372,771,655,573,678,20,3,22,7,15,12,2 +304,388,1022,685,585,769,35,17,12,9,8,13,329,429,711,636,608,740,30,36,27,12,14,9,309,161,884,589,955,741,15,10,17,12,12,0,293,223,1014,756,808,898,11,18,25,15,0,11,312,246,986,788,896,686,6,24,17,16,1,12,228,328,855,762,983,678,1,10,16,10,8,2,318,412,842,569,679,772,24,32,25,15,8,6,320,520,817,470,657,712,27,18,18,8,11,14,439,491,784,622,717,794,33,25,17,15,10,15,151,197,1022,834,936,877,7,28,23,8,1,2,230,276,868,695,846,613,8,23,15,2,9,4,312,310,1107,716,623,723,26,18,14,1,9,1,434,454,1055,710,665,607,28,26,14,14,12,12,400,402,635,636,717,622,19,27,22,16,12,11,280,388,860,619,903,708,16,7,21,9,11,4,246,250,1098,896,1126,763,8,19,17,9,3,3,430,656,797,745,579,854,41,26,17,17,15,9,313,449,979,574,600,882,19,18,21,12,12,15,2 +182,470,887,562,692,616,38,23,7,14,15,15,243,409,698,539,725,935,33,30,38,15,13,7,247,247,725,548,974,648,2,10,28,7,1,2,395,265,881,645,733,849,24,6,38,10,11,11,384,276,853,695,819,667,13,12,28,11,12,14,268,326,736,721,1032,645,14,6,15,5,5,4,300,462,785,494,824,1005,27,22,38,20,7,6,292,598,734,389,848,847,30,18,31,11,12,12,477,455,725,479,748,929,20,33,30,10,11,13,357,343,889,793,971,736,22,24,24,13,12,4,312,374,749,648,925,670,23,19,10,7,6,2,292,402,974,589,804,696,29,24,11,6,14,3,274,488,902,567,808,618,31,32,13,9,13,10,308,556,620,555,850,913,22,27,23,19,1,13,250,538,731,610,1060,689,23,13,20,12,0,6,384,438,961,877,1111,598,23,31,4,14,14,5,520,694,900,620,672,1141,44,34,30,16,14,11,301,443,844,437,643,693,28,10,18,11,13,13,2 +287,459,768,860,635,717,35,25,32,6,9,9,318,248,551,709,632,908,30,20,15,17,15,11,282,152,754,724,911,761,13,22,11,7,11,8,182,150,822,901,814,960,17,12,1,6,1,1,245,157,786,907,900,772,4,8,11,7,2,8,175,293,633,857,913,690,5,18,24,9,9,16,255,273,700,702,653,952,24,18,1,14,9,4,309,379,651,685,583,832,27,24,8,15,12,16,328,308,730,837,777,944,29,35,9,10,9,17,270,190,754,811,916,849,9,18,29,9,2,2,333,311,600,808,814,609,8,23,29,11,10,8,279,355,839,851,595,697,26,26,28,10,8,5,331,459,837,925,615,597,28,28,26,13,13,14,361,297,515,739,701,858,19,19,16,13,11,9,255,311,658,672,821,738,16,25,19,6,10,16,267,365,860,959,1068,703,8,35,43,6,4,13,283,515,739,932,637,1090,41,34,9,12,14,11,402,274,759,739,698,790,21,14,33,13,13,17,3 +333,365,853,858,674,742,23,17,24,10,11,2,372,172,778,777,675,995,24,36,17,11,9,16,422,270,747,614,964,810,15,14,3,3,11,11,190,186,947,891,871,1017,7,16,11,0,1,10,123,195,927,865,945,833,14,24,3,1,2,9,339,259,746,763,966,761,13,14,16,5,9,9,285,235,925,694,706,1021,30,32,11,16,9,13,455,229,866,653,632,909,27,22,4,7,8,11,282,152,873,807,826,1021,15,25,3,2,1,10,384,290,825,795,967,886,21,24,37,15,10,9,405,351,671,712,861,686,22,27,21,17,12,15,297,317,910,855,632,722,24,12,20,16,12,10,331,249,848,893,668,692,30,22,18,5,9,13,337,237,670,723,748,929,33,29,8,15,11,8,437,251,815,566,874,795,30,11,11,10,10,9,295,479,939,761,1121,734,22,23,31,10,16,8,217,341,942,918,678,1177,29,22,3,12,4,2,486,270,770,747,717,815,11,24,29,9,13,10,3 +226,308,721,820,585,688,19,18,17,4,9,8,297,253,606,697,614,949,16,13,18,11,13,10,245,235,727,728,971,748,23,31,26,13,11,13,197,249,809,891,798,951,17,21,16,10,1,0,282,244,773,929,896,765,18,21,26,9,2,9,164,186,612,929,1005,697,17,27,23,15,9,19,232,212,747,706,691,1019,18,19,16,8,9,3,266,274,684,635,689,861,15,23,23,15,12,15,347,215,759,777,709,959,29,18,24,8,11,16,249,239,699,875,950,818,9,17,14,5,2,7,280,258,545,870,864,674,8,20,18,11,8,13,250,246,784,803,649,706,14,19,29,12,8,10,300,226,770,865,693,638,18,11,27,9,11,13,338,236,562,771,731,927,19,12,31,9,11,10,230,236,647,680,937,739,16,26,28,10,10,17,298,376,819,939,1154,670,8,18,28,4,4,18,314,394,822,892,577,1155,25,19,24,10,16,12,351,287,674,675,598,749,5,25,28,17,13,16,3 +208,310,655,817,636,769,14,21,20,7,15,11,355,305,548,712,677,1068,19,30,21,18,13,7,379,343,597,697,1074,837,26,16,39,6,5,20,265,277,777,912,869,912,14,10,29,9,7,3,314,322,743,942,985,842,27,12,39,10,8,12,328,350,574,898,1116,860,26,12,30,8,5,22,340,326,715,727,756,1128,25,22,29,15,5,2,390,326,656,618,772,1010,22,24,36,20,12,12,483,329,765,754,768,1090,14,29,37,15,7,19,335,317,605,860,1039,821,22,24,1,10,8,14,360,380,469,841,959,883,23,23,27,10,10,20,284,224,690,788,730,867,23,24,30,11,14,17,296,234,650,842,798,839,21,28,30,16,15,12,398,322,538,792,800,1122,30,23,42,14,5,13,378,326,635,651,1024,902,31,19,37,9,4,20,304,500,743,892,1251,725,23,27,29,7,10,21,440,466,768,891,628,1242,16,28,37,13,10,15,337,229,578,652,647,662,10,18,21,10,11,13,3 +189,335,669,917,682,677,11,14,31,6,12,9,326,170,640,784,697,1046,16,41,16,15,8,9,342,278,627,705,970,757,27,9,10,7,10,22,142,216,783,982,869,956,15,11,0,6,2,1,239,239,759,986,967,776,28,19,10,7,3,12,247,277,608,886,972,756,27,7,23,9,10,20,273,209,783,779,714,1116,22,33,0,14,10,6,357,273,718,728,642,958,19,23,7,11,9,14,336,200,819,880,826,1040,11,28,8,10,2,17,290,312,623,826,975,769,25,29,30,9,9,18,349,401,491,837,877,771,26,24,28,11,13,24,281,301,708,880,634,797,20,15,27,10,13,21,285,253,660,968,674,729,18,27,25,13,10,16,351,331,592,834,766,1024,27,34,15,13,10,11,309,343,675,641,880,800,30,8,18,6,9,18,295,509,751,788,1127,629,26,26,42,6,15,19,295,363,840,993,684,1252,15,27,8,12,5,13,366,286,572,772,727,690,13,19,28,7,14,15,3 +287,429,688,920,700,721,19,19,33,4,15,8,386,220,547,787,717,1090,24,36,14,15,9,10,368,204,642,708,1018,801,29,8,12,9,11,17,114,144,792,987,897,1000,11,8,2,6,1,0,227,231,756,987,995,820,24,14,12,7,2,9,281,277,585,903,1028,800,23,4,25,11,9,19,307,209,702,784,748,1160,30,28,2,12,9,3,387,339,645,727,694,1002,27,16,9,13,12,15,382,280,770,879,844,1084,17,33,10,10,1,16,288,242,656,823,1015,813,19,28,28,7,2,11,407,371,504,854,919,815,20,17,30,11,12,17,313,307,741,893,676,841,22,20,29,10,10,14,265,357,701,967,710,773,26,30,27,13,9,13,407,329,499,831,798,1068,31,29,17,11,11,10,345,349,634,644,936,844,28,11,20,4,10,17,261,463,784,889,1179,673,20,29,44,4,8,18,315,469,755,994,700,1296,19,32,10,10,6,12,436,264,629,777,735,732,11,12,34,9,13,16,3 +335,321,855,897,747,704,21,17,30,11,11,9,430,282,654,788,764,1073,26,22,31,20,11,11,398,228,787,725,1035,784,27,24,27,2,11,16,76,230,947,984,898,983,5,20,17,1,1,1,249,261,911,996,968,803,16,22,27,2,2,8,289,201,742,936,1085,783,15,20,38,4,9,18,333,219,841,785,819,1143,32,20,17,19,9,4,419,319,788,694,781,985,29,22,24,16,12,16,382,252,835,840,863,1067,17,19,25,11,5,17,300,210,831,862,1066,796,19,20,13,14,2,10,461,247,677,877,968,798,20,23,33,16,12,16,349,229,916,858,751,824,22,18,30,15,8,13,285,237,864,928,777,756,26,18,28,14,13,14,435,267,604,842,863,1051,31,15,32,18,11,9,345,263,787,679,1029,827,28,27,35,11,10,16,245,367,953,908,1254,656,20,17,25,11,4,17,291,437,784,973,745,1279,27,18,25,17,10,11,492,296,774,732,692,715,13,26,31,10,13,17,3 +346,430,830,891,777,708,23,14,32,12,10,9,381,233,619,764,786,1077,24,19,15,17,12,11,365,165,754,707,983,788,25,25,11,5,12,16,133,157,922,960,896,987,9,15,1,2,0,1,226,204,886,982,954,807,14,17,11,1,1,8,284,186,717,910,989,787,15,21,24,7,8,18,274,162,810,759,811,1147,30,21,1,16,8,4,410,338,757,696,739,989,27,23,8,13,11,16,287,283,770,848,877,1071,13,22,9,8,6,17,353,223,808,840,1034,800,23,17,29,15,1,10,434,278,654,859,934,802,24,24,29,19,11,16,382,314,893,858,727,828,26,23,28,18,9,13,292,354,841,936,739,760,30,21,26,11,14,14,362,318,577,818,859,1055,35,14,16,15,12,9,358,306,762,651,975,831,32,28,19,8,11,16,338,394,930,886,1168,660,24,22,43,10,3,17,202,466,751,963,769,1283,29,21,9,14,11,11,461,295,751,742,748,719,11,25,33,11,12,17,3 +241,355,767,842,596,746,18,19,17,3,12,11,326,190,562,743,637,985,23,22,18,14,14,7,334,288,697,742,1034,778,30,24,40,14,8,14,252,194,861,937,829,777,8,12,30,11,4,3,229,227,821,985,945,709,21,16,40,12,5,12,253,287,658,947,1076,849,20,20,27,12,8,22,279,237,751,772,716,1013,29,20,30,11,8,0,331,273,696,655,734,907,26,26,37,18,15,12,420,206,747,777,728,967,18,25,38,11,8,19,216,298,743,881,999,750,18,14,0,6,5,8,283,361,589,886,919,884,19,23,24,8,11,14,293,289,828,819,690,820,21,28,29,9,11,11,327,255,770,865,758,840,25,18,29,12,14,10,373,241,560,841,762,1061,30,21,39,12,8,13,319,255,699,700,986,863,27,27,34,7,7,20,233,483,869,975,1211,692,19,25,28,3,7,19,425,397,746,912,588,1117,22,28,38,13,13,15,298,210,710,675,607,601,10,18,20,14,14,13,3 +286,288,662,908,584,733,12,10,28,8,9,10,371,223,541,781,629,1060,17,19,17,11,13,12,333,351,684,758,1004,807,32,25,23,15,13,19,175,305,746,977,791,928,14,25,13,10,1,2,258,334,702,1015,905,826,27,25,23,11,0,9,204,270,557,973,1048,820,26,21,24,15,7,17,306,230,668,796,704,1124,23,25,13,8,7,5,348,148,603,721,724,990,20,27,20,15,10,17,387,185,714,865,710,1072,26,14,21,8,11,18,267,331,642,893,983,801,18,21,17,9,0,13,384,298,512,916,903,839,17,26,25,15,8,19,300,214,727,867,678,841,13,13,30,16,10,16,318,200,725,953,736,797,17,13,26,9,11,15,418,210,577,861,752,1084,22,18,28,7,13,8,266,222,582,720,976,862,19,28,29,14,12,15,246,424,768,925,1199,685,17,12,39,8,2,16,320,278,807,980,578,1236,16,13,21,8,14,10,435,309,629,753,581,678,6,31,27,15,11,18,3 +184,286,744,782,616,741,14,14,21,2,9,9,353,275,559,681,661,1068,17,13,18,13,13,9,327,245,736,714,1036,815,28,33,36,13,11,12,167,265,824,871,823,936,12,21,26,10,1,1,264,296,784,927,937,834,23,19,36,11,2,10,244,240,629,909,1080,828,22,29,27,13,9,20,294,260,706,714,738,1132,23,21,26,10,9,2,334,288,643,599,760,998,20,25,33,17,12,14,389,265,708,727,740,1080,24,18,34,10,13,17,235,245,724,865,1011,809,14,17,4,5,2,6,306,286,572,842,933,847,13,24,24,9,8,12,278,192,809,763,716,849,15,19,27,10,8,9,292,220,793,815,772,805,19,11,27,11,11,12,398,278,603,779,786,1092,24,14,37,11,11,11,300,276,660,674,1010,870,21,32,34,8,10,18,272,388,844,953,1229,693,13,18,26,2,4,17,344,412,811,854,608,1252,20,19,34,12,16,13,351,287,697,625,617,686,4,27,24,15,13,15,3 +289,505,824,887,732,747,30,29,32,10,13,9,374,204,627,752,733,938,25,24,15,13,9,11,326,124,704,703,956,791,22,18,11,3,11,10,106,86,900,944,899,990,12,8,1,0,1,1,237,169,868,962,985,802,7,4,11,1,2,8,239,285,699,894,946,720,6,14,24,5,9,18,277,253,792,741,726,944,19,16,1,18,9,4,347,391,745,702,622,862,22,26,8,9,12,16,368,310,780,854,876,974,34,39,9,4,3,17,228,264,808,832,975,879,2,22,29,13,2,4,363,381,654,843,871,613,3,27,29,17,12,10,351,395,893,876,632,701,21,30,28,16,8,7,273,457,827,942,704,627,23,32,26,7,11,14,387,393,553,794,782,848,14,23,16,17,11,9,293,395,738,637,852,768,11,21,19,10,10,16,241,453,920,922,1105,733,3,39,43,10,6,15,319,451,785,961,734,1104,36,38,9,14,8,11,406,360,757,756,783,820,16,10,35,9,13,17,3 +257,463,785,964,712,709,21,28,27,9,11,9,340,96,682,799,699,984,26,25,20,12,9,11,340,226,729,762,878,777,31,11,6,6,11,14,138,134,879,993,861,982,5,7,4,5,1,1,267,191,849,993,935,796,16,11,6,6,2,8,263,367,672,907,854,736,15,9,19,8,9,18,269,271,817,800,666,1016,26,17,4,15,9,4,353,303,766,799,540,898,29,19,3,8,12,16,306,202,851,951,860,1002,27,32,4,5,1,17,298,372,759,829,909,837,9,23,34,12,6,8,361,477,605,874,797,679,10,20,24,12,12,14,333,469,844,951,572,697,12,29,23,11,14,11,317,349,794,1039,682,673,16,33,21,8,9,14,353,337,602,823,726,924,21,22,11,14,11,9,309,337,725,670,756,776,18,14,14,7,10,16,321,611,877,919,1017,689,10,32,38,9,12,17,241,349,880,1038,718,1168,27,31,4,13,4,11,370,368,712,851,789,764,13,11,32,6,13,17,3 +257,415,828,789,672,713,26,22,22,4,9,10,406,286,577,670,681,1014,31,11,25,15,13,10,406,132,718,633,990,787,30,33,17,9,13,7,118,128,892,864,873,990,4,21,9,8,1,0,231,211,860,888,961,806,15,11,17,9,0,9,309,263,697,826,1000,756,14,29,28,11,7,15,333,255,762,667,720,1056,27,13,9,12,7,3,421,387,717,592,664,926,30,17,14,13,10,15,352,316,768,744,818,1026,26,26,15,12,7,16,282,172,812,832,987,835,10,11,23,7,0,1,413,309,658,769,887,717,11,22,23,9,10,7,327,309,897,782,652,737,17,27,28,8,10,4,307,389,839,832,682,705,19,17,18,13,15,13,425,329,539,732,766,964,22,12,22,11,13,10,373,319,728,581,908,794,19,32,25,4,12,15,271,369,920,872,1151,689,11,26,33,4,2,12,267,505,727,863,672,1204,28,25,15,10,12,12,428,290,757,652,707,760,18,19,27,9,11,16,3 +313,351,814,745,641,729,25,17,27,1,10,11,492,318,527,648,684,970,20,10,32,12,14,13,466,200,770,597,1079,781,23,38,28,12,14,6,210,198,850,826,874,978,17,28,18,11,2,3,281,251,814,840,990,796,12,18,28,12,1,10,329,269,671,794,1121,730,11,34,35,14,8,14,429,265,698,629,761,1002,14,18,18,11,8,6,477,355,651,532,781,890,17,22,25,16,9,18,478,314,696,676,773,994,39,19,26,11,10,19,244,178,804,838,1044,849,3,16,12,4,1,2,445,283,650,729,964,661,2,21,30,6,9,8,295,247,889,732,737,697,16,22,31,7,11,3,427,293,865,764,803,649,18,12,29,10,12,16,531,277,537,688,809,910,9,17,33,12,14,7,391,271,688,547,1033,778,6,37,36,5,13,14,185,385,904,834,1256,703,2,19,24,3,1,11,403,477,721,811,633,1148,31,18,26,13,13,13,434,264,789,582,652,782,15,24,28,12,10,19,3 +360,334,604,897,608,682,14,19,28,11,4,12,327,243,575,792,657,1021,19,22,25,12,10,14,257,353,668,723,1044,750,24,24,29,12,10,15,229,315,688,986,839,955,18,28,19,9,8,4,302,330,660,1004,955,769,25,30,29,8,7,11,172,270,511,940,1086,731,24,24,34,14,14,15,292,272,682,795,730,1091,13,24,19,9,10,7,286,190,625,698,754,933,16,22,26,16,3,19,451,199,766,842,738,1015,32,17,27,11,10,20,303,303,586,850,1009,810,16,20,11,12,7,9,358,262,454,881,929,746,15,21,31,18,15,15,298,252,671,870,706,772,5,18,32,19,5,12,310,242,667,930,768,704,7,16,30,10,8,17,398,134,573,852,782,999,8,17,34,8,10,8,228,158,552,683,1006,775,7,27,37,15,11,13,252,380,702,892,1225,662,15,13,31,11,7,14,382,288,845,969,602,1227,18,16,27,7,7,12,431,245,577,736,617,737,16,30,25,12,12,20,3 +250,372,671,883,718,718,18,26,34,2,11,8,403,285,510,750,733,1087,23,29,13,13,11,10,359,197,717,701,1006,798,30,17,13,11,11,11,143,189,739,944,905,997,10,3,3,8,1,0,270,284,701,966,1003,817,23,7,13,9,2,9,246,306,546,898,1008,797,22,13,26,13,9,19,346,222,647,741,748,1157,23,21,3,10,9,3,382,322,588,694,678,999,26,25,10,15,12,15,419,329,697,846,862,1081,30,38,11,12,5,16,253,199,655,840,1011,810,14,23,27,5,2,5,378,340,503,847,913,812,13,26,31,9,12,11,282,260,740,868,668,838,9,27,30,8,8,8,308,322,744,934,710,770,13,29,28,11,13,13,448,316,510,800,802,1065,18,26,18,9,11,10,298,314,575,643,916,841,15,20,21,4,10,17,248,412,769,918,1163,670,13,38,45,2,4,16,332,462,744,957,720,1293,20,39,11,10,10,12,433,265,658,746,759,729,10,9,33,11,13,16,3 +289,395,763,832,680,702,25,16,25,5,10,10,354,274,576,707,687,955,20,13,22,16,14,12,304,158,765,684,984,754,17,33,18,8,14,9,156,162,819,901,879,951,17,19,8,5,2,2,243,221,783,931,955,769,12,15,18,6,1,9,187,235,630,885,994,703,11,29,29,10,8,17,295,211,727,702,728,1025,14,19,8,13,8,5,323,329,670,639,672,869,17,25,15,16,9,17,382,304,741,791,814,967,35,24,16,13,10,18,238,156,751,841,983,822,3,15,22,8,1,3,371,243,597,828,885,680,2,26,24,12,9,9,295,277,836,821,658,714,16,25,31,11,11,6,299,351,818,879,682,640,18,15,21,14,12,15,401,265,536,771,774,933,9,16,23,12,14,8,245,245,655,630,916,751,6,36,26,5,13,15,213,353,857,909,1153,676,2,24,36,5,1,14,317,465,778,906,678,1161,31,23,16,11,13,10,436,246,738,691,713,755,15,25,30,12,10,18,3 +330,430,691,967,759,715,23,21,33,5,14,10,367,255,540,824,766,1062,28,34,14,12,10,12,319,185,661,743,983,795,29,10,12,12,12,17,135,163,787,1020,920,994,13,6,2,9,0,2,262,252,753,1022,1020,814,20,12,12,8,1,9,226,310,582,934,973,784,19,6,25,14,8,17,282,170,693,819,751,1124,34,26,2,9,8,5,344,336,640,782,653,974,31,18,9,12,11,17,363,323,737,934,899,1062,19,33,10,9,2,18,303,221,665,814,1000,819,19,28,28,8,1,11,394,368,513,889,902,781,18,19,30,12,11,17,328,310,750,932,657,805,20,22,29,11,9,14,258,402,736,1022,731,751,24,32,27,10,10,15,388,322,510,862,815,1032,29,27,17,8,12,8,306,334,629,675,877,824,26,13,20,1,11,15,266,456,789,918,1132,677,18,31,44,5,7,16,278,472,760,1041,761,1264,23,34,10,7,7,10,477,257,658,826,812,740,15,12,34,8,12,18,3 +274,380,844,893,680,728,28,9,17,4,15,9,289,211,671,792,713,979,25,28,16,11,13,11,241,271,784,799,998,772,14,18,38,11,5,20,205,233,956,986,761,791,18,18,30,10,7,1,266,238,918,1050,855,719,23,24,38,11,8,10,132,200,749,1016,1052,831,24,14,25,13,5,18,214,254,870,837,808,1023,33,28,30,10,5,4,260,238,811,720,832,917,30,28,37,15,12,16,377,155,780,830,752,977,10,21,38,8,7,17,269,273,812,946,1017,748,32,22,0,7,8,16,320,254,662,957,939,858,33,21,22,11,10,22,264,320,897,850,788,810,35,18,27,10,14,19,268,268,849,918,804,814,35,20,29,9,15,14,320,190,655,906,842,1061,38,21,37,9,5,9,186,192,800,767,1058,853,41,21,32,8,4,16,258,402,946,956,1139,678,33,19,28,2,10,17,366,348,833,961,664,1133,34,20,38,8,12,11,373,273,769,718,637,597,20,26,20,13,11,17,3 +199,269,745,826,625,697,13,19,25,4,14,9,350,222,640,729,666,1006,14,18,26,13,8,9,320,330,699,632,1063,771,25,22,32,13,10,16,190,276,853,911,858,952,15,22,22,10,2,1,249,293,827,927,974,794,24,22,32,11,3,10,227,249,652,853,1105,754,23,18,35,13,10,20,283,263,785,718,745,1056,20,18,22,10,10,2,333,223,732,613,761,926,17,16,29,17,13,14,416,190,823,753,757,1018,19,17,30,10,2,17,238,302,713,865,1028,799,17,24,8,5,3,10,319,309,559,792,948,733,18,19,30,11,13,16,239,235,798,797,719,749,20,20,31,12,11,13,301,179,788,841,787,707,20,20,33,11,10,12,391,219,604,777,789,984,25,11,37,11,10,11,293,233,707,594,1013,796,26,25,40,10,9,18,225,431,829,817,1240,665,18,19,26,4,9,19,395,339,860,892,617,1212,19,18,30,12,5,13,346,258,704,653,636,692,5,24,28,15,14,15,3 +193,227,689,841,609,659,10,15,24,7,15,8,304,280,696,736,642,984,5,20,29,14,11,10,272,320,749,663,1013,737,26,20,25,10,7,21,218,336,769,930,832,938,24,22,17,7,5,0,287,333,771,952,938,756,27,22,25,8,6,9,191,243,592,878,1047,716,26,18,32,12,7,19,249,307,799,743,713,1054,11,20,17,11,7,3,309,235,740,642,711,896,8,18,22,18,14,15,364,256,847,784,741,990,18,15,23,13,5,16,300,296,641,874,986,773,18,24,15,8,6,15,297,255,515,821,900,709,19,21,27,14,12,21,241,195,726,804,673,735,19,20,28,15,12,18,303,147,742,872,729,675,17,20,26,12,13,13,333,217,662,800,757,962,16,13,30,10,7,10,237,221,657,621,961,754,19,23,33,13,6,17,333,383,735,800,1188,629,19,17,25,7,10,18,353,371,946,911,603,1190,16,16,23,9,8,12,322,250,622,678,622,696,8,26,27,14,13,16,3 +193,313,699,766,637,702,16,17,21,3,8,8,412,290,586,657,654,983,17,10,24,14,12,10,360,230,753,660,997,770,24,34,30,10,12,9,168,238,777,853,848,975,14,22,20,11,0,0,283,301,749,891,934,789,21,14,30,12,1,9,273,297,576,861,1035,729,20,30,29,12,8,17,347,261,731,672,719,1047,17,18,20,11,8,3,389,345,682,567,699,895,20,22,27,18,11,15,438,298,759,713,767,995,32,25,28,11,12,18,254,230,681,837,984,830,12,12,10,6,1,3,355,305,527,798,892,702,11,27,24,8,7,9,261,219,766,749,669,728,7,26,25,9,9,6,333,251,754,801,711,674,9,16,27,12,10,13,447,309,562,739,761,955,12,17,35,12,12,10,323,309,627,612,947,769,11,37,34,7,11,17,279,411,793,897,1176,682,11,25,22,3,3,14,379,457,818,840,631,1183,22,24,28,13,15,12,378,276,668,615,656,757,12,24,30,14,12,16,3 +345,527,795,919,781,759,30,29,31,7,13,11,398,246,594,772,772,950,25,26,16,14,11,13,360,176,659,699,943,803,22,20,10,8,13,10,120,154,859,968,920,1002,12,6,0,5,1,3,223,185,827,972,1010,814,7,4,10,4,0,10,235,345,664,882,919,732,6,16,23,10,7,16,295,267,749,767,739,956,19,18,0,13,7,6,375,441,700,738,639,874,22,28,7,12,10,18,374,292,747,890,921,986,34,41,8,5,3,19,294,250,781,808,970,891,2,24,30,12,0,4,435,405,627,841,870,625,3,29,28,14,10,10,347,369,866,900,627,713,21,30,27,13,10,7,267,457,800,978,747,639,23,32,25,8,11,16,395,377,504,808,801,860,14,25,15,12,13,7,293,385,695,627,821,780,11,23,18,5,12,14,239,459,889,890,1082,745,3,41,42,7,6,15,291,439,768,993,783,1116,36,40,8,11,8,11,498,344,732,792,844,832,16,12,34,8,11,19,3 +209,337,762,721,587,674,22,22,20,6,2,13,304,328,577,642,638,897,17,9,21,13,6,11,212,182,742,653,981,702,14,37,37,15,12,2,228,204,792,812,768,871,20,23,27,8,10,1,329,241,764,872,884,711,15,15,37,11,11,8,149,251,627,854,1027,649,14,33,30,13,14,8,281,275,712,659,711,961,11,13,27,10,12,4,283,349,665,542,737,823,14,19,34,17,5,16,472,328,736,666,697,903,24,24,35,10,12,17,246,160,754,866,978,790,10,15,5,7,11,0,329,225,610,783,896,656,7,24,27,13,11,6,235,225,839,724,689,714,13,25,30,14,1,1,277,301,797,754,731,614,15,15,32,11,4,14,349,235,581,728,763,907,6,12,42,9,12,9,149,213,644,643,987,699,3,34,37,12,13,8,261,333,846,926,1198,668,7,24,23,6,13,5,457,481,833,795,581,1123,28,23,35,8,13,11,350,240,725,572,554,685,18,19,23,15,14,17,3 +244,310,818,883,737,724,27,15,17,3,9,8,357,207,615,784,792,969,24,14,18,14,13,10,315,309,748,785,1061,762,17,36,40,14,11,11,163,255,882,982,824,783,19,22,32,7,1,0,216,226,838,1012,918,711,24,22,40,10,2,9,206,246,693,986,1115,827,21,32,27,12,9,19,294,270,750,799,869,1009,32,22,32,11,9,3,334,230,687,682,903,901,29,28,39,16,12,15,403,161,748,810,815,969,21,17,40,11,13,16,221,303,802,938,1108,736,21,18,2,6,2,5,344,328,648,921,1016,858,22,25,24,10,8,11,248,316,887,852,849,802,24,18,27,9,8,8,322,212,851,898,857,814,28,8,27,12,11,13,400,252,607,868,921,1049,33,17,39,10,11,10,262,258,718,743,1141,845,30,33,34,5,10,17,212,464,916,1022,1274,672,22,17,26,3,4,16,366,314,857,953,737,1121,33,18,40,9,16,12,387,315,769,710,640,581,11,28,18,12,13,16,3 +253,341,785,769,632,700,23,18,23,5,8,13,354,336,558,668,657,953,24,9,24,14,12,11,316,144,755,653,986,760,21,35,26,10,12,4,140,182,821,850,841,963,11,25,16,7,0,1,227,239,787,888,927,777,14,15,26,6,1,8,201,243,644,846,1012,709,13,31,31,12,8,12,293,273,705,669,722,1023,20,17,16,11,8,4,349,379,662,568,702,869,23,19,23,18,11,16,364,346,693,720,748,971,33,22,24,11,12,17,238,130,775,850,973,830,5,13,14,8,1,0,367,211,621,787,881,678,4,24,26,12,7,6,273,231,860,766,668,714,14,25,29,13,9,1,299,325,826,808,700,640,16,15,27,12,10,14,393,277,550,736,766,931,15,16,31,10,12,9,263,251,659,615,950,751,12,34,34,11,11,12,245,301,873,904,1167,682,4,22,30,5,3,9,307,505,750,843,626,1159,29,21,24,9,15,15,410,296,752,626,635,761,11,23,26,14,12,17,3 +268,494,728,984,743,721,25,16,33,10,10,10,347,157,621,843,760,990,20,37,14,11,10,12,313,177,658,760,997,781,23,9,12,11,12,17,153,147,822,1039,912,980,15,9,2,10,0,2,228,180,794,1031,1020,798,12,15,12,9,1,9,192,316,615,925,993,740,11,7,25,9,8,17,264,234,758,836,751,1024,20,29,2,8,8,5,328,338,707,801,673,906,17,23,9,7,11,17,355,249,806,953,879,1008,33,28,10,8,0,18,231,333,702,853,1006,839,3,29,28,9,7,11,364,454,548,882,914,683,4,24,30,11,11,17,290,446,787,957,665,705,16,17,29,10,15,14,316,382,747,1041,721,671,22,29,27,9,10,15,370,384,557,879,817,932,15,30,17,7,12,8,246,390,672,670,899,786,12,10,20,4,11,15,204,558,818,867,1150,693,4,28,44,10,13,16,326,384,837,1058,743,1172,31,27,10,8,3,10,401,383,687,849,790,770,9,19,32,7,12,18,3 +251,275,681,876,617,754,15,18,20,11,12,8,350,242,540,775,658,1025,20,23,19,14,10,10,314,342,605,742,1055,810,29,23,37,14,8,21,178,312,795,969,850,849,17,21,27,7,4,0,259,315,761,1015,966,783,30,23,37,10,5,9,229,281,590,959,1097,853,29,19,28,12,8,19,283,259,727,804,737,1081,26,19,27,11,8,3,331,179,664,691,753,971,23,21,34,18,15,15,430,224,757,817,751,1037,15,18,35,13,4,16,284,292,641,911,1020,790,21,23,3,12,5,15,359,323,497,900,940,876,22,22,25,18,13,21,251,217,726,843,711,844,24,17,30,19,11,18,275,185,670,905,779,832,22,17,32,12,12,13,389,195,544,867,781,1099,31,16,40,10,8,10,293,223,651,708,1005,885,30,26,35,17,7,17,233,445,775,915,1232,708,22,18,31,11,7,18,395,317,736,948,609,1173,13,17,35,9,9,12,388,230,616,709,632,627,11,25,23,16,14,16,3 +284,416,660,959,695,727,18,21,33,3,13,9,365,223,553,824,720,1028,23,36,14,14,11,11,301,179,684,747,1013,801,36,10,12,10,13,16,127,165,760,1018,890,1004,14,6,2,7,1,1,286,240,726,1026,996,820,27,14,12,8,0,8,210,268,553,940,1023,770,26,6,25,12,7,18,314,176,674,815,743,1092,29,28,2,11,7,4,308,312,619,772,691,940,26,18,9,14,10,16,395,265,730,924,835,1040,24,35,10,11,3,17,235,227,634,844,1010,849,18,28,28,6,0,10,368,358,482,893,918,747,17,19,30,10,10,16,322,308,719,932,671,773,15,22,29,9,10,13,282,348,731,1012,705,719,19,32,27,12,11,14,424,316,511,868,797,1000,24,29,17,10,13,9,256,330,602,685,931,808,21,13,20,3,12,16,236,452,758,924,1174,703,17,31,44,3,6,17,322,442,779,1031,695,1228,16,34,10,9,8,11,431,267,633,818,730,774,10,12,34,10,11,17,3 +158,310,731,813,593,734,17,14,18,2,11,9,297,227,594,714,642,1019,14,21,17,11,15,9,269,307,701,713,981,796,23,21,39,15,9,20,217,257,845,910,760,855,21,17,29,10,3,1,284,268,807,948,872,785,26,19,39,13,4,10,192,258,638,918,1027,829,21,17,26,15,9,20,244,252,749,735,723,1077,22,23,29,10,9,2,272,226,684,618,751,963,19,25,36,15,14,14,385,205,687,738,695,1043,19,22,37,10,9,17,251,277,689,860,976,778,23,15,1,3,4,14,266,298,553,855,894,852,24,20,23,9,10,20,256,252,774,768,703,828,26,23,28,10,10,17,274,216,756,826,729,808,24,21,30,9,13,12,344,180,614,804,771,1083,27,16,38,11,9,11,260,194,689,673,993,867,32,24,33,8,8,18,280,428,825,916,1196,690,24,20,29,2,6,19,372,354,850,877,589,1197,23,23,37,12,14,13,311,235,646,632,542,615,11,21,21,15,15,15,3 +277,299,654,870,646,719,17,15,33,3,11,9,426,174,559,757,663,1088,22,30,28,12,11,11,392,320,676,634,1006,799,35,18,22,12,13,16,136,246,756,927,861,998,13,20,12,9,1,1,233,259,726,915,943,818,26,20,22,8,0,8,273,285,549,823,1032,798,25,16,35,14,7,18,361,251,682,724,732,1158,28,22,12,9,7,4,409,213,633,659,712,1000,25,24,19,14,10,16,388,168,700,811,768,1082,23,19,20,9,1,17,270,328,628,795,987,811,17,26,18,6,6,10,417,359,480,766,897,813,16,25,36,10,10,16,291,277,713,837,686,839,16,18,25,9,14,13,321,199,705,899,718,771,20,18,23,10,11,14,461,255,535,769,770,1066,25,23,27,8,13,9,343,273,604,562,960,842,22,17,30,3,12,16,237,487,752,765,1181,671,16,17,30,3,12,17,317,317,801,934,638,1294,17,18,20,9,2,11,450,268,609,705,655,730,9,26,26,10,11,17,3 +230,260,660,896,623,759,12,19,22,5,15,9,369,223,567,791,672,1046,17,26,23,12,9,9,335,315,658,698,1055,821,30,20,35,12,9,20,187,287,778,983,850,928,18,18,25,9,3,1,246,296,744,989,966,826,31,20,35,10,4,10,242,286,573,913,1097,838,30,16,32,14,9,20,308,268,708,784,745,1098,23,18,25,9,9,2,346,206,651,689,769,978,20,22,32,16,14,14,415,221,740,833,749,1066,20,21,33,11,3,17,267,321,614,877,1022,825,22,24,5,6,4,14,344,370,476,858,942,835,21,23,29,12,14,20,244,260,699,855,721,827,19,20,34,13,10,17,300,166,717,921,779,805,19,20,34,10,11,12,412,278,569,839,797,1074,28,19,40,10,9,11,312,284,630,658,1021,868,25,23,39,11,8,18,230,492,750,871,1238,719,21,19,33,5,8,19,378,338,825,968,617,1196,12,20,33,11,6,13,407,253,607,725,632,698,10,24,23,16,15,15,3 +264,368,855,743,600,724,28,20,19,10,9,9,371,331,562,646,641,915,23,7,20,13,13,11,325,197,745,683,1038,768,24,39,32,15,11,8,119,241,913,832,833,967,14,27,22,8,1,1,220,210,877,906,949,779,9,17,32,11,2,8,224,202,722,886,1080,697,8,35,27,13,9,16,286,290,763,695,720,925,17,15,22,10,9,4,338,340,720,578,736,839,20,19,29,17,12,16,365,303,745,688,732,951,36,20,30,10,13,17,219,179,841,878,1003,856,0,17,8,11,2,2,380,182,687,817,923,590,1,22,22,17,8,8,308,304,926,738,694,680,19,21,25,18,8,5,290,306,864,776,762,604,21,11,25,11,11,14,394,186,576,760,764,831,12,14,35,9,11,9,278,156,749,641,988,745,9,34,32,16,10,16,192,310,947,922,1215,710,1,22,24,10,4,13,338,470,720,811,592,1081,34,19,30,8,16,11,423,247,826,592,611,797,12,21,28,15,13,17,3 +352,246,789,791,698,724,19,17,23,7,8,10,429,319,524,690,733,1093,24,14,24,14,12,8,411,307,721,685,1068,804,31,30,36,12,12,15,155,343,879,886,877,1003,11,22,26,7,0,2,232,328,835,918,977,823,24,22,36,8,1,11,342,272,682,890,1118,803,23,26,33,12,8,21,328,270,739,703,806,1163,30,20,26,11,8,1,424,236,684,590,804,1005,27,26,33,18,11,13,399,293,717,722,816,1087,19,17,34,11,12,18,349,261,763,824,1069,816,17,16,6,10,1,9,464,236,611,823,981,818,18,21,30,14,7,15,362,172,848,744,766,844,20,18,31,13,9,12,272,180,778,810,812,776,24,12,33,12,10,11,428,192,560,772,848,1071,29,13,41,10,12,12,404,194,715,639,1054,847,26,27,40,11,11,19,264,370,891,912,1275,676,18,17,22,5,3,20,314,366,674,861,694,1299,19,18,34,9,15,14,475,227,730,612,667,735,11,26,24,16,12,14,3 +234,464,731,842,655,713,23,33,28,2,13,10,413,225,570,733,668,912,18,20,25,13,9,12,335,161,741,656,1001,757,19,24,23,11,11,7,195,105,793,921,864,956,19,12,13,12,1,2,306,190,765,933,954,768,14,2,23,13,2,9,222,270,596,861,1019,686,13,20,36,13,9,15,356,274,695,724,721,966,12,12,13,12,9,5,364,378,652,643,683,828,15,22,20,15,12,17,479,261,759,795,797,940,37,35,21,12,3,18,205,213,717,845,990,845,5,22,17,5,2,1,344,352,563,804,894,623,4,23,31,5,12,7,254,346,802,831,663,691,14,28,26,6,8,4,334,368,788,883,701,607,16,26,24,11,11,15,460,330,488,777,765,874,7,19,28,13,11,8,260,320,631,604,929,734,4,21,31,6,10,15,230,432,821,881,1166,699,4,35,33,4,6,12,428,496,776,912,651,1108,29,34,21,14,8,12,395,281,710,699,682,786,17,8,23,11,13,18,3 +203,359,724,780,664,694,16,23,22,4,9,8,324,302,575,665,673,1017,17,18,29,15,15,10,314,188,750,656,982,768,28,28,21,9,11,13,174,166,810,859,865,969,12,14,13,6,1,0,255,245,774,889,953,787,21,12,21,7,2,9,229,279,609,845,992,747,20,24,30,11,9,19,279,263,712,668,712,1081,23,12,13,12,9,3,343,379,651,581,656,929,20,20,18,19,12,15,314,330,732,733,810,1023,26,27,19,12,9,16,296,200,704,819,979,804,12,18,19,7,2,7,331,287,550,788,879,736,11,23,25,11,10,13,275,247,789,765,644,762,13,28,24,10,8,10,303,331,781,821,674,702,17,20,22,13,13,13,365,307,569,733,758,989,22,17,26,11,11,10,289,305,648,598,900,789,19,27,29,8,10,17,333,385,824,875,1143,660,11,27,29,4,4,18,281,505,819,852,664,1217,22,26,19,10,14,12,348,260,685,633,699,727,4,18,21,13,13,16,3 +225,287,796,795,574,708,16,14,19,7,14,10,360,294,635,692,617,971,15,21,22,16,14,12,336,258,676,693,1012,776,20,25,32,12,6,19,204,260,890,884,807,961,14,21,22,9,6,2,273,269,874,944,923,799,21,21,32,10,7,9,245,239,689,912,1054,739,20,21,27,10,6,17,293,257,828,731,694,1011,21,21,22,13,6,5,361,289,773,618,712,891,18,23,29,20,13,17,416,260,830,740,706,993,16,18,30,13,8,18,248,222,760,882,977,828,20,21,8,8,7,13,341,275,606,849,897,682,21,26,22,14,11,19,281,203,845,766,668,692,23,19,23,15,13,16,317,211,765,828,736,674,23,19,25,14,16,15,389,233,629,800,740,927,26,14,35,12,6,8,303,233,758,659,964,779,29,28,32,13,5,15,263,393,872,870,1189,690,21,18,22,7,9,16,405,411,815,867,566,1165,22,17,30,11,13,10,318,252,733,634,585,725,8,27,28,14,12,18,3 +191,365,583,811,619,699,11,23,27,4,7,9,394,240,540,676,628,1040,16,22,20,15,11,9,348,256,637,657,937,777,27,20,12,9,7,12,228,198,669,870,820,978,15,10,4,10,7,1,325,285,633,896,908,796,28,10,12,11,8,10,281,311,486,860,947,756,27,16,25,11,13,20,345,243,657,667,667,1110,22,18,4,12,7,2,407,299,590,624,611,952,19,24,9,17,6,14,408,272,733,776,767,1034,29,33,10,14,13,17,304,260,565,810,934,813,19,20,28,7,8,6,363,373,425,805,834,765,18,21,24,7,14,12,269,251,650,798,601,791,8,26,29,8,6,9,345,287,650,864,629,723,12,28,21,13,9,12,413,307,530,730,713,1018,17,21,17,11,7,11,303,325,517,605,855,794,14,23,20,6,8,18,347,477,683,872,1098,669,18,33,38,4,10,17,361,423,796,883,621,1246,15,32,10,12,10,13,364,246,556,676,662,736,7,14,30,13,11,15,3 +228,406,682,930,686,684,16,13,35,2,13,9,355,219,565,799,711,985,21,24,12,11,11,11,327,183,712,722,1000,758,34,18,14,13,13,16,161,171,776,995,877,961,10,16,4,10,1,1,246,204,742,1007,983,777,23,18,14,9,0,8,202,218,571,921,1010,727,22,14,27,15,7,18,296,190,688,794,736,1049,27,22,4,8,7,4,342,314,635,741,682,897,24,22,11,15,10,16,355,245,730,893,822,997,24,21,12,10,3,17,223,249,658,865,997,806,14,22,26,5,0,10,354,334,506,874,905,704,13,19,32,9,10,16,278,312,743,903,660,730,15,22,31,8,10,13,342,322,749,981,692,676,19,24,29,9,11,14,396,320,529,851,788,957,24,17,19,9,13,9,264,326,618,666,922,765,21,21,22,4,12,16,228,422,780,893,1161,660,13,21,46,2,6,17,326,434,789,1006,684,1185,20,22,12,10,8,11,379,303,651,789,717,731,8,24,30,11,11,17,3 +336,454,938,998,749,748,24,11,20,10,14,10,305,291,793,899,770,969,23,34,21,15,12,12,251,297,842,852,939,776,12,12,39,11,6,19,195,299,1052,1095,694,723,22,16,29,6,6,2,248,290,1018,1127,758,685,27,22,39,9,7,11,162,222,847,1075,1001,859,28,10,30,9,6,17,208,260,980,916,885,981,31,32,29,18,6,5,274,250,923,803,917,887,28,24,36,19,13,17,357,239,862,925,757,927,6,25,37,12,6,18,263,251,898,949,950,738,36,26,1,11,7,17,340,224,750,1016,920,896,37,19,27,15,11,23,318,378,983,947,863,810,33,14,30,14,13,18,274,364,911,1013,823,848,31,22,30,13,14,15,312,102,725,981,895,1057,36,27,42,17,6,10,200,96,904,820,1093,865,41,13,37,16,5,15,234,350,1032,977,1072,694,37,21,29,10,9,16,320,372,885,1062,717,1063,30,24,37,14,9,10,417,273,847,815,618,567,24,20,21,15,12,18,3 +334,368,761,779,651,756,31,27,26,8,10,10,397,293,546,678,692,1031,36,14,27,17,12,8,385,229,649,621,1089,830,29,32,31,7,10,9,159,207,839,868,884,989,7,18,21,4,2,2,238,202,803,890,1000,857,14,14,31,5,3,11,300,220,640,830,1131,807,13,28,36,9,10,17,322,284,731,677,771,1079,32,10,21,14,10,1,402,356,676,572,787,957,35,16,28,21,13,13,409,295,765,712,783,1053,21,25,29,14,6,18,315,205,743,836,1054,862,15,14,9,9,3,3,424,244,589,773,974,768,16,21,31,15,13,9,302,276,828,754,745,772,22,26,32,16,9,6,296,306,756,800,813,754,24,16,32,15,14,11,424,224,498,738,815,1015,27,13,36,13,10,12,364,202,675,583,1039,843,24,27,39,14,9,17,236,370,859,862,1266,736,16,27,25,8,5,14,332,486,690,849,643,1241,29,26,29,12,11,14,453,187,686,614,662,729,23,16,29,15,14,14,3 +249,311,762,875,637,724,16,16,20,5,10,8,296,218,589,774,688,1009,13,19,17,12,14,10,258,288,772,749,1023,780,26,23,37,14,10,21,170,256,874,966,796,843,16,21,27,9,2,0,219,267,836,1014,904,751,21,21,37,10,3,9,175,251,667,962,1071,823,20,19,26,14,10,19,229,203,770,799,761,1067,19,21,27,9,10,3,281,193,711,688,789,947,16,21,34,16,13,15,332,190,718,818,747,1017,18,18,35,9,8,16,258,264,730,906,1028,768,18,15,3,8,3,15,323,287,580,905,946,842,19,22,23,12,11,21,281,245,815,836,741,820,21,19,28,13,9,18,277,229,807,906,781,800,23,19,32,10,14,13,337,179,625,866,813,1065,24,14,38,8,10,10,243,195,718,711,1037,851,27,26,33,11,9,17,263,417,862,936,1248,678,19,16,31,5,5,18,329,315,839,945,631,1151,22,19,35,7,13,12,362,258,697,706,590,635,6,25,23,16,14,16,3 +254,322,747,740,618,733,26,23,26,9,12,9,409,291,572,639,665,912,21,10,27,12,14,11,361,277,727,650,1054,777,20,36,33,16,8,10,183,247,827,835,849,976,16,22,23,9,4,1,288,244,795,889,965,792,11,14,33,12,5,8,252,214,624,859,1096,710,10,32,34,14,8,18,352,308,725,676,740,964,15,12,23,9,8,4,380,366,674,561,760,842,18,18,30,16,15,16,469,275,741,679,748,952,38,25,31,11,8,17,251,243,729,863,1019,857,2,14,7,10,5,4,370,242,575,792,939,631,1,23,29,16,11,10,244,254,814,723,714,705,17,26,30,17,11,7,344,250,814,767,778,617,19,16,32,10,14,14,456,264,522,743,788,884,10,11,38,10,8,9,310,246,665,610,1012,758,7,33,39,15,7,16,218,366,841,873,1235,721,1,25,21,9,7,15,426,486,768,812,612,1106,32,24,31,11,13,11,407,235,726,583,627,768,14,18,27,16,14,17,3 +290,546,729,971,783,724,20,26,33,15,13,10,325,193,596,806,764,1045,21,27,14,6,11,12,281,223,709,761,917,794,24,15,12,6,13,9,205,159,795,1002,918,993,14,5,2,9,1,2,302,208,765,992,984,813,17,7,12,10,0,9,198,382,598,894,893,773,16,11,25,4,7,17,268,304,711,809,737,1115,17,19,2,9,7,5,294,382,664,804,651,957,20,23,9,2,10,17,355,291,747,956,897,1049,36,36,10,9,1,18,261,371,715,830,952,830,8,25,28,14,4,3,300,544,561,863,848,770,7,24,30,8,10,9,286,494,800,956,639,796,11,27,29,7,12,6,352,440,776,1044,729,728,13,33,27,8,11,15,374,426,542,832,795,1023,12,26,17,10,13,8,264,436,633,645,817,819,9,18,20,9,12,15,284,638,823,944,1062,686,7,36,44,15,10,14,284,344,828,1045,777,1251,26,35,10,11,4,10,383,439,696,856,836,753,12,11,34,8,11,18,3 +159,259,652,775,595,716,6,14,16,7,8,9,320,260,593,674,628,961,11,15,15,12,12,9,276,316,686,767,1025,764,30,31,33,14,12,14,242,300,740,862,820,849,18,17,31,9,10,1,289,297,698,924,936,755,31,17,33,10,11,10,221,311,541,956,1067,801,30,27,20,14,12,20,277,267,710,717,707,1011,17,21,31,9,12,2,337,271,641,636,725,905,14,27,38,16,11,14,440,254,774,724,729,987,24,22,39,9,18,17,260,294,628,900,990,756,22,17,1,8,11,8,327,351,476,895,910,806,21,28,17,14,9,14,225,239,713,762,681,776,9,23,22,15,7,11,285,209,715,812,749,768,13,17,28,10,10,12,349,259,585,774,753,1029,18,14,32,8,12,11,247,277,584,721,977,827,15,34,27,13,11,18,287,473,752,990,1202,676,21,22,27,7,13,19,427,361,847,847,587,1159,12,21,35,9,15,13,304,232,615,622,610,623,10,27,19,16,10,15,3 +312,564,735,1078,785,726,23,18,33,9,11,11,361,195,638,925,790,951,22,39,14,12,9,13,323,199,691,862,971,786,27,9,12,10,11,16,129,125,829,1121,914,995,7,7,2,7,1,3,226,188,799,1107,1030,807,14,17,12,6,2,10,202,354,622,997,949,727,13,5,25,10,9,16,268,268,771,922,771,973,24,31,2,11,9,6,336,404,718,905,717,867,25,23,9,8,10,18,351,305,833,1057,905,983,29,30,10,7,1,19,267,323,713,891,986,872,7,31,28,14,8,10,388,462,559,958,898,634,8,24,30,12,12,16,308,440,798,1053,651,698,14,19,29,11,14,13,300,456,766,1145,741,646,18,31,27,8,9,16,370,398,578,957,829,879,19,32,17,10,11,7,260,388,675,742,857,763,16,12,20,3,10,14,222,560,831,949,1110,720,8,30,44,9,14,15,290,382,858,1154,779,1127,29,29,10,9,4,11,455,371,702,953,834,805,9,19,34,4,13,19,3 +274,294,729,782,622,729,18,21,24,9,10,11,393,271,516,685,669,1028,23,14,25,10,14,7,367,311,703,662,1058,807,34,30,33,18,10,14,147,285,813,877,853,962,12,18,23,11,2,3,248,284,773,923,969,834,25,18,33,14,3,12,270,260,616,873,1100,794,24,26,34,16,10,22,326,250,699,710,744,1086,29,14,23,9,10,0,368,236,642,595,764,954,26,20,30,14,13,12,413,255,701,713,752,1044,24,19,31,9,8,19,281,283,713,859,1023,827,16,14,7,10,3,8,396,298,561,812,943,773,15,21,29,16,11,14,280,218,798,751,718,779,15,20,30,17,9,11,280,210,796,801,782,751,19,14,32,8,14,10,428,192,532,777,792,1022,24,13,38,10,10,13,330,192,651,620,1016,830,21,25,39,15,9,20,226,428,839,895,1239,703,15,23,23,9,5,19,346,366,736,848,616,1244,18,20,31,11,13,15,423,199,706,611,631,694,10,20,27,18,14,13,3 +244,428,721,891,694,693,20,19,32,3,14,9,421,197,588,764,701,968,23,34,15,12,12,11,387,189,703,685,982,761,28,10,11,12,14,14,167,125,817,956,885,966,10,6,1,11,2,1,268,202,785,972,971,780,17,12,11,12,1,8,262,248,610,888,984,720,16,6,24,14,8,18,360,218,715,759,724,1022,21,26,1,11,8,4,402,328,668,702,652,882,24,20,8,14,9,16,413,223,751,854,842,986,32,31,9,11,2,17,213,249,695,852,987,821,8,32,29,4,1,8,382,358,541,833,885,677,7,21,29,6,9,14,296,344,780,868,644,703,11,20,28,5,11,11,362,342,786,942,686,657,13,32,26,10,12,14,464,336,540,818,772,930,16,27,16,12,14,9,322,342,659,627,892,760,13,13,19,5,13,16,232,466,815,852,1139,673,7,31,43,3,7,17,342,450,794,965,696,1158,26,30,9,13,7,11,391,285,690,752,735,748,10,16,35,10,10,17,3 +218,418,733,810,708,706,20,24,30,4,13,10,387,245,590,695,713,987,19,11,25,13,15,12,317,187,719,630,994,766,16,33,21,11,9,7,147,153,795,885,909,965,18,21,11,8,3,2,282,250,765,899,965,783,17,11,21,7,4,9,214,246,600,831,1004,725,16,29,34,13,9,15,320,226,721,686,758,1057,13,11,11,10,5,5,358,352,662,605,702,899,16,15,18,13,8,17,427,281,753,757,830,993,34,26,19,10,9,18,269,237,719,823,999,824,8,13,19,7,4,1,370,334,565,776,903,712,7,20,33,11,10,7,248,312,804,795,688,738,11,27,24,10,12,4,304,332,778,845,702,672,13,17,22,11,13,15,418,360,540,741,800,965,8,10,26,9,9,8,254,360,631,576,946,771,5,30,29,2,8,15,268,440,823,861,1173,678,7,26,33,4,6,12,364,468,818,882,704,1193,26,25,19,8,12,12,419,297,698,661,719,753,16,17,25,9,9,18,3 +222,326,720,812,639,757,15,14,17,3,12,9,425,199,575,713,690,1042,14,21,18,8,16,9,365,309,704,702,1039,819,27,25,40,14,8,14,201,225,806,905,818,880,15,13,32,13,4,1,310,240,766,939,930,808,22,19,40,12,5,10,274,284,607,901,1085,852,21,21,27,16,8,20,364,278,714,722,765,1100,20,23,32,11,8,2,396,314,645,611,793,986,17,29,39,12,15,14,483,227,714,747,753,1066,23,26,40,11,10,17,233,303,700,869,1034,801,15,17,2,2,5,8,348,354,548,844,950,875,14,24,24,6,11,14,252,270,785,783,745,851,16,23,27,7,11,11,344,238,765,835,783,831,20,19,27,10,14,12,468,304,587,791,817,1106,25,18,39,12,8,11,312,308,642,654,1041,890,22,28,34,5,7,18,276,478,822,917,1250,713,14,24,26,3,7,19,430,426,827,884,635,1216,21,25,40,13,15,13,379,283,669,643,602,638,1,21,18,12,14,15,3 +273,465,625,862,656,663,14,31,30,9,13,13,388,184,526,721,659,1032,19,22,17,12,9,5,432,246,639,668,912,743,30,16,9,12,11,18,294,134,741,911,835,942,12,10,1,15,1,5,327,257,703,929,921,762,25,6,9,16,2,14,371,377,534,863,908,742,24,12,22,10,9,24,365,249,669,708,666,1102,25,14,1,15,9,2,389,339,610,691,578,944,22,24,6,8,12,10,302,266,721,843,802,1026,20,37,7,15,1,17,332,296,591,801,925,755,16,20,31,8,4,12,335,479,455,810,821,757,17,25,27,2,12,18,387,381,676,851,588,783,19,32,26,1,12,15,419,371,678,931,636,715,21,34,24,14,9,10,429,367,532,755,718,1010,28,21,14,16,11,15,417,397,591,612,814,786,25,19,17,9,10,22,405,567,725,853,1065,615,17,37,41,9,10,23,301,455,784,936,660,1238,18,36,7,17,4,17,272,300,584,745,713,674,6,8,29,12,13,11,3 +232,322,771,793,582,716,22,19,21,6,8,9,357,237,582,694,625,973,19,10,22,11,14,11,299,243,781,687,1020,776,20,34,30,15,12,12,169,241,839,878,815,965,14,22,20,10,0,1,254,238,801,934,931,797,15,16,30,11,1,8,186,210,646,892,1062,739,14,30,29,15,8,18,296,232,735,719,702,1023,17,16,20,8,8,4,316,260,670,608,722,895,20,20,27,15,11,16,397,215,753,742,714,995,36,21,28,8,10,17,201,237,755,886,985,826,6,14,10,7,1,6,332,260,601,831,905,700,5,23,24,13,9,12,248,242,840,780,678,716,13,22,27,14,9,9,316,240,826,830,744,674,15,12,27,9,12,14,408,204,568,786,750,951,12,15,35,9,12,9,236,206,675,643,974,785,9,31,34,12,11,16,216,380,867,908,1197,690,5,21,26,6,3,17,374,380,804,861,574,1179,28,22,28,10,15,11,383,255,742,644,593,725,12,22,30,17,12,17,3 +342,454,702,963,749,722,21,15,33,4,14,12,403,195,577,822,750,969,24,38,14,13,12,14,357,185,666,745,975,782,27,8,12,11,14,17,161,157,800,1020,918,985,13,10,2,8,2,4,266,230,770,1028,1004,799,16,16,12,7,1,11,228,256,593,936,965,731,15,6,25,13,8,15,328,142,712,817,741,1009,18,30,2,10,8,7,362,280,659,778,639,885,21,22,9,13,9,19,399,249,762,930,895,993,35,27,10,10,2,20,293,275,676,846,994,852,7,30,28,7,3,11,422,350,522,883,890,666,6,23,30,11,9,17,330,338,761,932,649,704,12,16,29,10,11,14,314,366,763,1018,723,656,14,28,27,11,12,17,438,264,523,868,799,917,13,31,17,9,14,8,294,272,644,673,869,773,10,9,20,2,13,13,218,448,796,852,1124,704,6,27,44,4,9,14,310,414,791,1039,753,1151,27,28,10,8,5,12,505,291,673,824,802,783,11,18,34,9,10,20,3 +328,480,781,934,719,732,29,25,33,5,11,10,359,227,578,795,728,951,24,28,14,14,11,12,311,127,723,720,963,784,23,14,12,10,13,11,153,139,851,989,888,985,13,4,2,7,1,2,240,180,815,997,980,799,8,8,12,6,0,9,210,290,656,915,959,723,7,10,25,12,7,17,276,202,727,786,731,977,18,20,2,11,7,5,330,384,680,747,645,871,21,22,9,14,10,17,363,331,741,899,849,981,35,35,10,9,5,18,257,239,763,845,976,864,1,24,28,8,0,5,382,342,609,868,876,636,2,23,30,12,10,11,326,356,848,913,645,702,20,26,29,11,10,8,288,458,836,987,687,636,22,30,27,12,13,15,386,342,540,833,789,883,13,27,17,10,13,8,252,330,687,656,877,767,10,17,20,3,12,15,216,442,875,915,1120,716,2,35,44,3,4,16,286,472,776,1004,717,1123,35,36,10,9,10,10,459,307,750,799,762,799,13,8,34,10,11,18,3 +330,306,781,914,578,705,15,15,20,3,14,12,395,255,612,803,617,1028,20,26,21,14,10,14,349,363,673,762,1014,779,27,20,29,14,12,17,173,335,885,991,809,980,9,28,19,7,0,4,248,322,851,1051,925,798,22,28,29,10,1,11,224,268,678,981,1056,758,21,18,28,12,8,15,302,228,799,840,696,1078,26,26,19,11,8,7,350,158,746,737,712,940,23,24,26,18,11,19,411,201,809,869,716,1034,21,15,27,11,0,20,275,305,749,935,979,815,15,18,11,6,3,15,406,276,595,920,899,737,16,21,23,10,11,21,328,224,834,873,670,759,18,16,30,11,11,16,288,208,750,957,738,713,22,14,30,12,10,17,412,206,596,897,740,986,27,19,34,10,12,8,272,210,729,724,964,800,24,17,33,9,11,13,220,386,871,869,1191,671,16,11,29,3,9,14,338,246,766,982,572,1222,21,16,27,9,5,12,455,315,716,759,599,738,7,28,27,14,12,20,3 +303,373,832,866,738,782,34,15,24,5,8,10,318,208,593,757,785,1033,29,14,25,12,14,12,282,228,774,700,1066,826,18,30,35,12,12,15,172,222,918,951,829,833,12,22,25,9,0,2,195,183,882,965,923,769,17,22,35,8,1,9,175,173,715,903,1120,885,18,26,34,14,8,17,253,193,796,752,868,1077,37,20,25,9,8,5,313,215,745,663,896,971,34,22,32,12,11,17,346,188,714,811,820,1019,16,15,33,9,8,18,248,302,812,855,1099,802,26,20,5,8,1,9,349,321,658,850,1015,912,27,23,31,12,11,15,273,323,897,841,848,864,29,16,34,11,9,12,315,269,861,899,866,868,33,14,34,10,14,15,365,267,613,811,914,1115,38,13,40,8,12,8,267,271,756,652,1134,907,35,29,41,1,11,15,209,443,930,897,1243,732,27,17,33,5,3,16,311,337,827,944,732,1143,40,16,33,7,13,10,444,316,775,707,673,643,18,26,23,8,12,18,3 +257,437,716,894,651,704,18,24,32,4,12,9,374,226,537,757,668,1073,23,29,15,15,10,9,360,178,668,728,969,784,30,13,11,9,10,14,144,120,808,949,848,983,6,3,1,8,2,1,259,219,772,973,946,803,19,9,11,9,3,10,283,253,603,923,979,783,18,9,24,11,10,20,301,225,708,746,699,1143,29,21,1,12,10,2,375,341,653,711,645,985,26,21,8,13,13,14,346,278,754,863,795,1067,20,34,9,12,4,17,298,216,692,859,966,796,16,25,29,7,3,8,379,361,538,872,870,798,17,22,29,9,13,14,347,323,777,881,631,824,19,25,28,8,9,11,295,359,735,951,661,756,23,31,26,13,12,12,399,327,509,805,749,1051,28,28,16,11,10,11,341,337,648,670,887,827,25,16,19,4,9,18,303,455,814,939,1130,656,17,34,43,4,5,19,295,463,739,966,651,1279,24,35,9,10,9,13,386,268,663,761,692,715,10,9,33,9,14,15,3 +243,269,664,845,600,715,13,15,20,10,9,10,382,264,515,742,643,1042,18,20,21,13,15,8,360,374,722,727,1038,793,31,26,33,15,11,21,152,348,780,934,833,910,15,20,23,8,1,2,235,361,738,990,949,814,28,22,33,11,2,11,275,309,573,942,1080,798,27,22,28,13,9,21,323,273,680,777,720,1106,24,22,23,10,9,3,367,163,613,662,738,976,21,24,30,17,12,13,396,248,692,790,732,1054,21,19,31,12,9,18,250,314,626,902,1003,783,19,18,7,11,2,15,371,307,500,883,923,821,18,25,23,17,10,21,301,219,711,818,694,821,18,18,28,18,8,18,291,179,733,878,762,777,20,18,28,11,13,13,429,185,577,844,766,1070,27,15,36,9,11,12,339,187,622,693,990,846,24,29,33,16,10,19,225,435,764,920,1215,667,18,17,27,10,4,20,339,315,779,917,592,1250,15,18,31,10,14,14,394,216,623,682,611,636,7,28,27,17,13,14,3 +274,336,736,801,636,782,22,25,20,1,9,9,409,243,531,700,677,949,17,10,21,12,15,9,343,219,740,687,1074,816,20,36,37,14,11,8,217,217,792,892,869,939,20,24,27,11,1,1,272,236,754,926,985,841,15,16,37,12,2,10,248,222,605,882,1116,783,14,32,30,14,9,16,364,240,688,713,756,969,11,12,27,11,9,2,364,324,621,606,772,881,14,18,34,16,12,14,473,239,722,746,768,991,38,23,35,11,9,17,205,209,722,862,1039,876,6,14,3,4,2,2,354,282,568,819,959,710,5,23,27,8,10,8,246,254,807,790,730,724,13,26,32,9,8,5,382,260,801,834,798,702,15,14,32,10,13,12,470,288,515,776,800,949,6,11,42,12,11,11,284,278,628,643,1024,817,3,31,37,7,10,16,168,398,832,928,1251,764,5,25,31,3,4,13,450,442,749,875,628,1077,28,24,35,13,14,13,385,283,711,646,649,763,18,18,23,14,13,15,3 +214,308,745,787,637,702,12,25,27,6,10,10,333,301,572,678,670,977,17,8,30,15,12,8,337,221,729,641,1041,770,30,34,28,9,10,15,187,241,843,876,860,975,12,24,18,8,2,2,220,250,803,898,966,789,25,14,28,9,3,11,246,244,640,844,1075,729,24,32,35,11,10,21,284,246,729,689,743,1027,23,10,18,12,10,1,336,316,676,588,741,891,20,14,25,19,13,13,355,297,733,730,769,995,24,23,26,14,6,18,299,217,715,842,1014,830,16,14,12,7,3,9,314,264,561,785,928,682,15,19,30,13,13,15,260,214,800,768,701,708,15,24,31,14,9,12,304,248,806,818,757,666,19,16,29,13,14,11,378,248,576,746,787,935,24,9,33,11,10,12,322,248,681,591,991,769,21,29,36,12,9,19,276,382,837,864,1216,682,15,27,24,6,5,20,308,436,802,861,631,1165,18,22,26,10,11,14,379,229,706,632,650,757,4,16,30,13,14,14,3 +311,453,748,893,693,700,20,22,31,4,12,11,386,220,569,758,690,1001,19,31,16,11,12,13,362,154,742,683,903,774,28,11,10,13,14,14,176,128,822,952,856,977,10,5,0,10,2,3,287,215,786,966,932,793,17,11,10,9,1,10,249,225,627,880,899,743,16,7,23,15,8,16,321,167,710,749,687,1061,25,23,0,8,8,6,369,327,657,706,583,913,22,19,7,13,9,18,348,274,694,858,823,1013,22,32,8,10,4,19,310,226,730,810,924,822,14,27,30,5,1,8,385,331,576,831,818,716,15,20,28,9,9,14,331,341,815,866,593,742,17,23,27,8,11,11,353,381,791,946,651,692,21,33,25,9,12,16,421,299,561,802,741,969,26,26,15,9,14,7,303,315,658,621,813,781,23,14,18,2,13,14,259,427,846,866,1056,676,15,32,42,4,5,15,249,451,789,965,691,1197,26,33,8,10,9,11,428,274,699,752,736,747,6,11,32,9,10,19,3 +231,405,706,839,694,704,19,18,31,3,10,9,400,248,583,712,697,961,20,19,16,14,14,11,352,178,744,677,964,764,23,27,10,10,14,12,154,158,782,910,877,967,15,13,0,7,2,1,261,247,754,930,953,781,18,15,10,8,1,8,237,249,589,878,978,713,17,23,23,12,8,18,335,225,726,709,724,1025,16,21,0,11,8,4,375,355,669,642,650,873,19,27,7,16,9,16,416,282,756,794,830,975,35,30,8,11,8,17,234,222,686,826,975,834,9,17,30,6,1,6,375,319,532,823,873,680,8,26,28,10,9,12,281,305,771,816,644,712,10,23,27,9,11,9,333,333,763,882,674,652,12,23,25,12,14,14,439,343,543,768,770,933,11,18,15,10,14,9,291,345,634,621,890,755,10,30,18,5,13,16,247,421,802,888,1131,686,8,30,42,3,1,17,341,473,805,913,694,1161,25,29,8,9,13,11,400,296,673,694,735,765,13,21,34,12,10,17,3 +230,494,705,946,682,706,17,27,33,10,12,9,343,157,608,801,691,981,16,26,14,11,10,9,343,205,697,736,932,774,27,12,12,11,12,16,237,125,809,989,851,979,13,6,2,14,0,1,284,180,775,1007,949,793,20,10,12,15,1,10,268,344,602,915,928,733,19,8,25,9,8,20,296,272,733,788,692,1019,22,18,2,14,8,2,352,362,678,771,606,895,19,20,9,7,11,14,355,253,785,923,818,999,23,33,10,14,0,17,237,345,677,857,943,834,13,24,28,9,5,10,278,502,523,864,845,676,14,21,30,3,11,16,294,486,762,929,610,700,16,28,29,2,13,13,386,396,754,1011,656,670,20,34,27,13,10,12,384,422,578,833,750,927,25,23,17,15,12,11,322,438,655,654,838,773,22,15,20,8,11,18,308,600,797,895,1085,686,14,33,44,10,11,19,326,406,856,1016,682,1165,23,32,10,16,3,13,291,399,664,823,731,761,3,12,34,11,12,15,3 +272,402,776,866,670,735,27,28,33,3,9,9,355,281,555,735,687,954,22,25,14,14,13,11,309,143,720,724,984,787,23,19,12,10,13,10,143,143,840,925,863,988,15,7,2,9,1,1,248,204,804,955,961,802,10,3,12,10,0,8,204,266,649,907,994,726,9,15,25,12,7,18,288,252,706,724,718,988,16,17,2,11,7,4,316,394,659,679,664,874,19,27,9,16,10,16,369,349,722,831,810,984,37,40,10,13,7,17,223,171,760,859,981,867,1,23,28,6,0,4,350,258,606,848,885,645,0,28,30,8,10,10,300,296,845,857,644,707,18,29,29,7,10,7,292,390,841,919,676,639,20,31,27,12,15,14,400,312,519,787,768,896,11,24,17,10,13,9,264,292,676,660,906,770,8,22,20,5,12,16,212,334,872,943,1145,719,0,40,44,3,2,15,318,524,743,936,668,1130,33,39,10,11,12,11,421,291,755,733,703,802,13,11,34,12,11,17,3 +298,484,760,929,765,712,21,32,29,9,13,13,291,321,545,764,736,819,16,21,18,10,13,13,263,277,774,723,861,724,19,15,8,12,15,4,225,227,798,954,860,907,21,11,2,11,3,3,252,324,770,936,962,709,16,7,8,10,2,10,162,390,609,818,833,633,15,13,21,10,9,12,226,168,684,763,697,871,10,13,2,7,9,6,280,328,641,762,637,749,13,23,5,8,8,18,343,383,746,914,885,841,37,36,6,9,3,19,243,239,752,766,886,842,7,19,32,10,2,2,310,440,598,791,796,604,6,24,26,12,8,8,302,366,837,930,613,710,12,33,25,11,12,3,354,492,825,1002,717,554,14,35,23,8,13,16,338,278,437,782,749,767,5,20,13,6,15,7,216,294,634,569,725,687,2,18,16,3,14,12,246,470,844,876,988,706,6,36,40,9,6,9,318,482,711,999,759,1003,27,35,6,7,8,15,369,309,751,822,844,809,19,7,32,8,9,19,3 +356,330,946,788,615,749,29,20,21,11,9,9,367,359,627,697,656,1090,32,13,18,22,11,9,317,195,792,732,1053,827,23,37,34,4,13,8,135,231,1000,873,848,972,5,27,24,1,5,1,210,262,958,939,964,846,10,25,34,2,6,10,256,208,815,927,1095,832,11,33,27,4,9,16,274,252,822,728,735,1156,36,21,24,19,9,2,362,310,787,613,751,1016,35,25,31,20,10,14,353,321,792,739,747,1096,17,14,32,15,17,17,289,147,932,849,1018,825,19,17,6,14,0,2,402,158,778,862,938,851,20,20,24,16,6,8,362,242,1017,765,709,861,22,19,25,15,10,5,250,272,937,827,777,809,26,7,27,18,11,12,386,232,609,787,779,1100,31,18,37,18,13,11,312,210,838,698,1003,876,28,32,34,11,12,16,252,270,1042,983,1230,701,20,16,24,11,2,13,262,442,691,858,607,1292,35,19,32,17,14,13,469,321,875,631,626,708,19,27,26,12,13,15,3 +249,485,701,930,729,716,23,21,31,11,13,9,430,152,592,803,744,985,18,32,16,10,11,11,394,224,689,690,1017,776,27,12,10,10,13,14,172,130,791,969,916,975,13,4,0,13,1,1,279,195,759,949,1014,793,14,10,10,14,0,8,273,343,586,851,1019,735,13,8,23,8,7,18,369,283,715,772,759,1025,18,24,0,13,7,4,409,367,658,733,689,901,19,20,7,6,10,16,438,230,781,885,873,1003,35,33,8,13,1,17,214,336,681,813,1022,834,5,28,30,10,4,8,373,471,527,802,924,682,4,21,28,4,10,14,271,463,766,903,679,706,14,22,27,3,12,11,367,395,756,973,721,666,18,32,25,12,11,14,469,401,542,801,813,933,13,27,15,14,13,9,337,421,633,592,927,781,10,15,18,7,12,16,237,561,801,829,1174,688,4,33,42,11,10,17,385,409,828,1000,731,1167,29,34,8,15,4,11,378,372,674,783,770,763,11,12,32,10,11,17,3 +263,387,783,806,711,716,28,26,31,3,10,9,390,298,552,687,718,963,25,17,16,14,12,9,372,156,693,642,999,776,28,27,10,10,12,8,108,138,845,881,902,979,12,15,0,7,0,1,205,215,809,891,988,793,13,5,10,8,1,10,269,295,654,827,1001,725,12,23,23,12,8,16,313,285,719,680,741,989,19,9,0,11,8,2,385,407,668,607,669,879,22,19,7,16,11,14,368,356,757,759,859,987,34,32,8,11,6,17,256,156,769,815,1004,846,4,15,30,6,1,2,405,275,615,772,902,650,3,20,28,10,11,8,291,287,854,793,661,688,19,33,27,9,9,5,307,405,816,847,703,650,21,23,25,12,14,12,413,339,514,735,789,897,14,16,15,10,12,11,331,323,681,584,909,767,11,28,18,5,11,16,221,333,879,877,1156,698,3,32,42,3,3,13,315,543,742,880,713,1141,30,31,8,9,11,13,426,294,754,663,752,777,16,15,32,12,12,15,3 +155,309,640,829,629,700,8,17,23,10,17,11,384,258,657,724,674,1055,13,32,26,21,15,7,364,382,652,659,1049,780,32,12,28,7,3,20,296,284,756,918,836,951,20,10,18,10,9,3,351,335,734,952,950,799,33,14,28,11,10,12,341,403,591,878,1093,781,32,8,31,5,9,22,375,377,798,745,749,1123,19,24,18,18,3,2,439,363,727,638,769,975,16,24,25,17,10,12,474,300,816,774,755,1055,14,29,26,16,9,19,330,386,594,894,1028,784,28,30,12,13,10,14,383,457,472,819,948,798,29,25,26,7,14,20,253,319,679,802,723,816,17,22,27,8,16,17,335,239,639,862,781,756,15,30,29,19,15,12,395,401,615,802,797,1049,24,25,33,17,3,13,335,401,660,621,1021,825,27,15,36,10,2,20,391,579,722,826,1244,652,29,29,26,10,16,21,429,447,879,901,623,1271,10,28,26,16,12,15,310,290,543,672,612,675,16,20,28,9,13,13,3 +252,324,686,819,638,756,20,24,18,6,11,9,375,237,523,724,679,937,25,15,19,11,13,9,315,281,708,697,1076,794,30,29,39,17,9,10,247,233,764,914,871,855,10,19,29,10,3,1,262,240,728,944,987,781,23,17,39,13,4,10,234,252,565,896,1118,801,22,25,28,15,9,18,320,230,674,731,758,969,21,15,29,10,9,2,334,270,605,620,774,875,24,19,36,15,14,14,463,219,724,756,770,965,32,20,37,10,7,17,243,249,668,878,1041,822,14,13,1,7,4,4,332,314,514,837,961,754,13,22,25,13,12,10,230,246,753,798,732,722,11,25,30,14,10,7,354,254,761,844,800,740,13,11,30,9,15,12,428,224,501,798,802,977,16,14,40,11,9,11,284,234,600,657,1026,825,13,24,35,12,8,18,192,436,784,938,1253,738,13,22,29,6,6,15,456,390,757,889,630,1059,20,25,37,12,12,13,367,225,665,654,651,667,12,21,21,17,15,15,3 +292,320,677,921,660,806,12,21,28,6,13,8,365,179,576,808,711,1077,17,26,21,13,9,10,315,285,697,709,1064,862,28,20,31,11,11,19,145,235,787,996,843,901,12,18,21,8,1,0,224,262,753,996,955,835,25,20,31,7,2,9,228,264,580,904,1110,905,24,16,38,13,9,19,306,190,711,795,784,1133,23,18,21,10,9,3,340,194,656,722,810,1023,20,22,28,17,12,15,399,171,721,874,778,1085,16,21,29,10,1,16,247,297,641,834,1057,842,20,26,9,9,4,13,386,360,497,853,975,928,21,23,35,13,12,19,286,264,726,888,762,896,21,20,34,12,12,16,290,230,724,962,808,884,19,20,32,11,9,13,414,238,580,846,836,1151,28,19,36,9,11,10,286,258,635,647,1060,937,29,23,39,6,10,17,210,480,773,856,1275,760,21,21,37,4,10,18,354,306,834,999,654,1203,18,20,29,8,4,12,423,259,618,764,625,679,8,22,19,13,13,16,3 +167,389,665,854,644,642,14,25,30,4,12,9,324,200,628,743,655,959,9,20,23,11,16,11,292,222,695,630,956,710,22,24,15,13,6,16,206,160,757,917,841,915,24,14,7,10,6,1,293,229,721,915,909,729,23,12,15,9,7,8,197,257,562,831,988,675,22,20,28,15,14,18,271,215,747,714,718,1029,11,12,7,8,2,4,337,311,692,651,678,871,8,20,12,13,5,16,366,226,819,803,762,953,24,25,13,8,8,17,298,238,641,827,963,770,14,24,25,5,7,10,325,357,491,782,863,684,13,23,33,9,17,16,225,289,726,831,654,710,9,26,20,8,11,13,309,303,714,891,672,642,11,24,18,9,14,14,351,319,610,761,756,937,14,15,20,9,6,9,247,331,623,574,924,715,11,23,23,2,5,16,333,463,757,815,1143,622,13,27,35,4,13,17,339,429,888,924,638,1165,20,24,13,10,9,11,326,278,616,701,643,697,10,16,27,9,10,17,3 +264,284,637,816,624,594,12,16,24,4,15,11,351,239,592,699,645,941,11,17,23,13,9,13,303,293,683,630,990,674,28,19,23,11,11,18,221,283,689,893,839,873,18,21,13,8,1,3,292,294,699,921,927,693,25,21,23,9,2,10,194,250,514,841,1026,663,24,17,28,13,9,16,280,190,711,712,708,1007,17,21,13,10,9,6,322,194,646,621,688,853,14,15,20,17,12,18,381,213,755,769,752,941,26,18,21,10,1,19,257,253,625,805,975,698,16,19,17,5,2,16,332,280,489,786,883,662,15,20,23,11,12,22,304,196,710,777,660,688,13,25,28,12,10,17,330,216,700,857,702,630,17,23,24,11,9,16,382,196,526,769,750,915,22,14,28,9,11,9,240,204,583,586,936,703,19,22,31,10,10,14,280,400,691,767,1167,556,15,16,35,4,8,15,366,322,848,888,618,1143,18,19,21,10,6,11,345,257,612,659,643,619,4,27,19,15,13,19,3 +298,252,694,911,716,724,11,16,26,3,13,8,379,227,559,802,727,1093,16,23,23,12,9,10,329,329,720,747,1000,804,29,23,29,12,11,21,129,305,810,994,863,1003,13,25,19,9,1,0,280,326,770,1032,935,823,26,27,29,8,2,11,224,246,603,964,1036,803,25,21,32,14,9,19,318,238,724,813,784,1163,22,23,19,9,9,5,340,194,657,708,746,1005,19,25,26,16,12,15,383,189,722,860,826,1087,17,16,27,9,3,16,271,293,656,878,1029,816,19,21,11,6,2,17,382,270,510,905,931,818,20,24,29,10,12,23,316,206,741,870,722,844,20,15,30,9,8,20,288,174,749,948,742,776,18,13,30,10,11,15,424,218,575,878,826,1071,27,16,34,8,11,10,288,238,654,703,992,847,28,26,37,5,10,17,272,394,794,892,1213,676,20,14,29,1,6,18,302,306,813,981,710,1299,17,15,27,9,8,12,461,287,637,748,681,735,7,29,27,12,13,16,3 +265,507,767,989,774,746,25,30,31,9,13,10,366,298,590,830,745,859,20,23,16,12,9,10,320,254,735,787,878,774,25,17,10,10,11,7,136,188,829,1020,877,973,17,9,0,7,1,0,245,293,797,1016,961,779,12,5,10,8,2,9,211,419,632,904,846,675,11,13,23,10,9,15,301,263,729,825,698,885,14,15,0,11,9,3,331,433,684,822,604,791,17,25,7,8,12,15,372,346,797,974,908,915,39,38,8,7,3,16,220,220,755,844,911,894,3,21,30,14,2,1,353,451,599,875,803,552,2,26,28,10,12,7,303,363,838,986,628,734,16,31,27,9,8,4,333,503,840,1062,734,588,18,33,25,8,11,13,399,357,486,852,746,787,9,22,15,10,11,10,263,367,665,673,748,729,6,20,18,3,10,15,229,471,857,984,1011,748,2,38,42,9,6,12,307,455,776,1061,776,1027,31,37,8,9,8,12,400,358,762,880,853,849,15,9,36,4,13,16,3 +226,290,808,781,653,720,26,16,17,5,11,9,307,319,663,682,692,1019,23,13,18,16,15,11,253,277,710,699,987,788,20,27,40,12,9,16,181,297,892,882,756,865,20,21,32,5,3,1,300,280,854,930,860,793,25,21,40,8,4,8,164,208,691,902,1037,811,22,23,27,10,9,18,240,260,792,717,783,1079,31,19,32,13,9,4,284,284,723,598,811,961,28,23,39,18,14,16,357,261,732,704,723,1041,18,16,40,13,11,17,283,209,790,844,1004,772,24,15,2,8,4,10,306,198,636,839,920,834,25,22,24,12,10,16,262,228,875,730,763,818,27,21,27,11,10,13,282,224,817,792,769,790,31,17,27,14,13,14,346,214,633,786,821,1073,36,12,39,12,9,9,230,198,730,657,1037,853,33,28,34,7,8,16,324,324,910,912,1196,676,25,18,26,5,6,17,314,406,903,849,639,1211,32,17,40,11,16,11,361,293,741,596,576,623,12,25,18,14,15,17,3 +322,360,663,949,721,705,12,19,34,4,14,10,371,205,580,828,738,980,17,26,13,13,10,12,301,235,709,735,1039,773,30,18,13,11,12,17,191,227,759,1022,918,978,12,22,3,8,0,2,250,246,725,1024,1016,792,25,22,13,7,1,9,186,206,552,938,1049,732,24,16,26,13,8,17,316,200,707,819,769,1036,21,20,3,10,8,5,316,246,638,750,715,894,20,20,10,17,11,17,423,203,769,902,865,998,30,19,11,10,0,18,259,267,639,848,1036,833,16,24,27,7,3,11,378,296,485,883,940,693,15,21,31,11,11,17,268,266,724,912,697,717,7,20,30,10,11,14,316,272,734,990,731,671,11,16,28,11,10,15,428,240,538,870,819,944,16,19,18,9,12,8,254,252,601,677,957,772,13,21,21,6,11,15,208,418,757,884,1200,685,15,17,45,2,9,16,364,380,818,1023,721,1176,18,20,11,8,5,10,433,279,638,794,756,760,8,26,33,13,12,18,3 +346,416,667,946,723,698,24,15,33,6,15,12,393,227,558,813,728,955,23,28,14,13,13,14,341,205,723,726,981,758,26,18,12,11,15,15,179,175,751,1013,904,961,14,18,2,8,3,4,286,234,719,1009,990,775,19,20,12,7,2,11,232,232,548,915,977,707,18,14,25,13,9,15,328,192,679,810,737,1025,17,22,2,10,9,7,356,292,630,753,647,867,20,26,9,17,8,19,409,243,737,905,871,969,36,21,10,12,3,20,317,231,649,837,994,828,10,22,28,9,2,9,420,282,495,862,890,680,9,21,30,13,8,15,316,308,734,915,649,714,15,20,29,12,12,12,314,348,734,993,705,642,17,20,27,11,13,17,438,242,490,859,787,933,12,21,17,9,15,8,294,248,591,654,883,749,9,21,20,8,14,13,244,394,763,855,1134,680,9,19,44,4,8,14,316,428,766,1022,727,1161,24,20,10,8,6,12,505,259,646,801,772,759,16,26,34,15,9,20,3 +309,357,773,849,606,784,27,23,26,5,10,11,404,216,578,744,651,1001,30,22,25,16,12,13,354,222,657,687,1044,842,29,24,31,8,10,12,166,182,853,934,839,959,7,16,21,7,2,3,257,199,823,948,955,877,14,18,31,8,3,10,245,175,650,892,1086,823,13,20,34,10,10,16,329,209,747,737,726,1035,24,16,21,13,10,6,357,309,700,642,746,939,27,22,28,20,13,18,448,204,775,788,738,1041,29,25,29,13,6,19,232,220,755,856,1009,876,7,18,9,8,3,6,389,295,601,837,929,766,8,23,31,10,13,12,293,287,840,824,700,752,18,24,32,11,9,9,307,275,776,876,768,758,20,18,32,14,14,16,441,271,530,796,774,1009,19,17,36,12,10,7,289,263,693,643,998,857,16,23,39,9,9,14,171,411,867,890,1221,766,8,21,31,5,5,15,405,427,750,923,598,1165,29,24,29,11,11,11,404,276,726,686,617,731,19,22,25,12,14,19,3 +191,251,743,768,618,726,12,13,21,3,9,10,364,248,602,665,663,1067,13,14,20,12,13,8,342,308,723,700,1014,806,30,30,34,14,11,19,178,296,845,857,801,949,16,18,24,9,1,2,269,315,801,925,915,827,25,18,34,12,2,11,261,279,642,909,1058,807,24,26,29,14,9,21,305,267,743,714,742,1133,19,22,24,9,9,1,357,267,672,595,766,995,16,26,31,16,12,13,400,232,745,711,726,1073,22,19,32,9,13,18,268,284,715,871,997,802,16,18,6,6,2,13,345,311,569,842,921,828,15,27,24,10,8,19,287,205,800,745,722,836,17,20,25,11,8,16,297,163,796,799,766,784,19,16,27,10,11,11,405,267,612,781,790,1079,24,15,37,8,11,12,309,267,683,660,1014,855,23,33,34,9,10,19,303,431,849,915,1217,678,15,19,22,3,4,20,343,373,848,838,610,1295,18,18,32,9,16,14,352,278,690,607,599,665,4,28,26,16,13,14,3 +290,366,769,801,577,737,27,19,22,10,8,9,363,263,562,700,620,958,24,14,21,13,14,11,315,219,769,681,1015,797,21,32,31,13,12,12,129,217,839,890,810,964,11,18,21,8,0,1,228,204,801,938,926,822,10,18,31,9,1,8,196,190,644,890,1057,754,9,28,30,13,8,18,306,252,719,723,697,1016,20,16,21,10,8,4,334,304,666,612,715,888,23,22,28,17,11,16,391,229,719,748,709,992,33,21,29,12,10,17,215,207,753,876,980,851,3,16,9,11,1,6,382,234,599,831,900,701,4,23,25,17,9,12,286,286,838,786,671,721,18,22,28,18,9,9,288,276,828,836,739,677,20,14,28,11,12,14,416,206,552,790,743,952,15,13,36,9,12,9,256,190,675,639,967,794,12,29,35,16,11,16,200,354,867,900,1192,723,4,21,27,10,3,17,340,424,768,871,569,1170,33,20,29,8,15,11,415,233,740,646,588,724,11,22,29,15,12,17,3 +301,327,820,877,653,688,22,18,33,12,12,9,362,296,645,760,682,1057,19,19,24,17,10,11,346,208,746,659,1031,768,20,25,18,5,12,20,118,228,928,942,868,967,10,23,8,2,0,1,215,243,890,942,976,787,15,23,18,1,1,8,265,181,721,860,1057,767,14,21,31,7,8,18,255,213,826,739,737,1127,25,17,8,16,8,4,375,293,769,672,717,969,22,17,15,13,11,16,298,266,830,824,791,1051,14,14,16,8,4,17,314,190,788,810,1012,780,22,25,22,15,1,14,405,199,638,811,924,782,23,20,36,19,11,20,343,237,873,834,687,808,25,17,21,18,9,17,291,257,815,912,739,740,29,19,21,11,12,14,351,229,587,788,785,1035,30,12,23,15,12,9,325,205,770,603,965,811,31,26,26,8,11,16,293,317,906,820,1200,640,23,20,34,10,5,17,223,415,761,945,649,1263,28,15,16,14,9,11,440,292,731,714,676,699,10,23,28,11,12,17,3 +273,557,700,977,744,739,22,23,33,6,14,8,366,186,563,830,745,986,23,30,14,15,10,10,322,178,638,763,962,799,26,10,12,9,12,15,118,86,792,1022,899,1002,10,6,2,8,0,0,235,175,756,1030,999,816,15,12,12,9,1,9,225,335,587,942,952,748,14,6,25,11,8,19,291,247,704,821,728,1008,23,22,2,12,8,3,337,393,647,802,638,902,22,18,9,11,11,15,378,290,784,954,880,1010,30,31,10,8,0,16,218,294,678,856,979,869,6,28,28,9,3,9,361,445,522,897,881,673,7,19,30,9,11,15,323,415,761,960,642,709,15,24,29,8,11,12,295,447,711,1042,710,673,19,36,27,11,10,13,397,389,499,862,794,916,18,23,17,11,12,10,281,387,632,685,856,790,15,13,20,4,11,17,233,539,796,930,1111,721,7,31,44,6,9,18,313,417,783,1049,744,1164,28,30,10,10,5,12,400,356,651,852,801,800,12,14,34,7,12,16,3 +321,417,739,841,701,743,29,30,30,12,15,9,416,250,584,728,724,1068,34,25,31,17,9,11,390,198,631,647,1079,821,31,21,29,1,11,12,140,142,827,924,918,1022,5,7,19,2,1,1,265,213,795,926,1020,840,16,7,29,3,2,8,301,263,622,846,1105,800,15,17,40,3,9,18,337,283,735,723,785,1120,28,17,19,20,9,4,407,381,682,638,765,980,31,19,26,13,12,16,432,276,761,788,841,1074,25,32,27,8,1,17,316,224,717,814,1060,857,11,25,11,15,2,6,447,329,563,791,970,779,12,22,35,15,12,12,327,299,802,822,737,801,20,23,32,14,10,9,293,327,752,876,787,759,22,27,30,11,9,14,445,311,490,774,831,1028,23,22,34,19,11,9,363,309,667,591,1013,838,20,18,37,12,10,16,237,443,833,864,1248,713,12,32,27,12,8,17,357,499,734,917,697,1264,27,31,27,18,6,11,456,260,664,688,724,780,21,11,29,11,13,17,3 +295,305,692,852,667,752,21,23,25,2,12,10,458,284,505,745,708,1079,26,24,26,13,10,12,414,252,684,678,1105,826,35,20,36,11,12,13,194,256,774,933,900,947,9,14,26,10,0,2,299,271,738,955,1016,845,22,14,36,11,1,9,295,273,573,879,1147,839,21,16,35,13,8,17,393,259,658,740,787,1143,26,16,26,10,8,5,425,287,605,643,803,1009,29,20,33,17,11,17,488,278,704,791,799,1091,27,25,34,10,4,18,266,250,670,843,1070,820,13,22,4,5,1,7,425,301,516,826,990,858,12,25,32,7,11,13,279,203,755,821,761,860,12,24,33,8,9,10,367,237,761,879,829,816,16,22,33,11,12,15,503,245,491,801,831,1103,21,19,41,11,12,8,357,243,610,628,1055,881,18,21,42,6,11,15,197,427,786,879,1282,704,12,23,26,2,5,16,417,419,723,924,659,1255,21,26,34,12,9,10,462,224,663,687,678,697,13,20,24,13,12,18,3 +303,359,806,851,677,720,27,23,27,12,9,9,380,270,601,742,710,1089,32,20,26,19,13,11,338,194,696,705,1085,800,29,26,30,1,11,14,122,216,894,940,902,999,3,20,20,2,1,1,239,243,862,962,1012,819,14,22,30,3,2,8,259,207,689,904,1119,799,13,22,35,3,9,18,303,227,784,747,779,1159,30,18,20,20,9,4,367,329,731,648,777,1001,33,22,27,15,12,16,412,266,800,798,813,1083,23,21,28,10,7,17,258,226,786,852,1058,812,13,16,10,15,2,8,401,261,632,851,974,814,14,19,30,15,12,14,329,259,871,828,741,840,18,22,31,14,8,11,263,269,815,886,801,772,20,16,31,13,15,14,415,289,541,808,825,1067,25,15,35,19,11,9,315,281,736,655,1027,843,22,23,38,12,10,16,229,387,904,916,1258,672,14,19,28,12,4,17,355,447,717,927,671,1295,29,22,28,18,12,11,426,286,729,696,694,731,19,24,28,11,13,17,3 +320,310,749,872,626,764,20,17,25,11,15,8,407,225,620,771,667,1053,25,24,26,22,9,10,371,303,665,682,1064,834,26,20,34,4,9,19,167,249,859,961,859,935,10,16,24,1,3,0,252,266,825,973,975,857,23,16,34,2,4,9,304,266,652,901,1106,845,22,16,35,4,9,19,320,244,789,766,746,1117,31,18,24,19,9,3,408,252,728,663,762,989,28,22,31,20,14,15,421,215,801,803,758,1075,14,23,32,15,3,16,303,279,713,859,1029,832,22,18,6,14,4,13,430,330,563,844,949,842,23,19,30,16,14,19,312,244,798,829,720,834,25,22,31,15,10,16,304,212,734,891,788,810,27,22,33,18,11,13,422,220,542,823,790,1087,34,17,39,18,9,10,368,226,707,646,1014,879,31,23,40,11,8,17,258,452,845,869,1241,726,23,21,28,11,8,18,384,374,722,940,618,1235,20,22,32,17,6,12,437,227,656,695,637,681,12,22,26,12,15,16,3 +229,233,667,824,626,706,11,20,27,6,14,9,398,298,588,723,675,1019,16,23,28,13,12,9,344,330,699,678,1060,784,29,23,34,11,6,20,208,334,783,915,855,963,15,17,24,8,6,1,303,339,747,945,971,807,28,19,34,9,7,10,265,305,576,895,1102,767,27,19,35,13,6,20,339,303,721,730,748,1085,22,17,24,10,6,2,367,241,658,621,772,937,19,21,31,17,13,14,476,282,753,757,754,1029,21,22,32,12,6,17,296,300,627,845,1025,812,19,21,6,7,7,14,367,309,491,836,945,752,18,22,30,13,11,20,249,193,712,785,724,770,18,21,31,14,13,17,301,153,726,845,784,724,18,21,33,11,14,12,451,259,586,793,800,1005,27,16,39,9,6,11,311,259,631,638,1024,805,24,26,40,12,5,18,253,437,755,861,1241,678,18,20,22,6,9,19,415,375,842,894,620,1227,15,21,32,10,9,13,390,232,616,651,633,705,7,23,26,15,12,15,3 +245,385,638,971,689,662,8,19,31,4,12,9,366,144,625,836,690,1009,9,34,16,11,10,11,344,252,712,751,915,742,28,10,10,13,12,20,208,168,748,1028,858,941,20,10,0,10,0,1,303,245,722,1034,944,761,29,16,10,9,1,10,245,323,551,940,905,731,28,8,23,15,8,18,315,179,730,825,683,1077,15,26,0,8,8,4,363,269,663,788,579,921,12,22,7,13,11,16,350,200,784,940,835,1009,22,27,8,10,0,17,250,308,594,854,934,766,20,28,30,5,5,16,343,435,470,889,830,732,19,23,28,9,11,22,319,331,679,934,589,758,17,20,27,8,13,19,373,295,691,1028,663,698,15,28,25,9,10,14,403,329,613,878,739,985,20,27,15,9,12,9,293,357,608,679,809,771,23,9,18,2,11,16,305,537,716,856,1064,624,19,27,42,4,11,17,329,369,891,1043,693,1213,14,26,8,10,3,11,318,268,579,832,742,687,8,18,30,9,12,17,3 +227,367,680,816,645,669,14,22,25,1,11,9,406,266,551,701,658,970,19,25,22,12,11,11,398,228,742,640,993,743,30,19,14,12,13,14,190,174,770,891,856,946,10,9,6,9,1,1,265,251,734,907,946,762,23,9,14,10,0,8,297,285,565,831,1011,712,22,15,27,14,7,18,363,233,686,698,711,1036,23,17,6,9,7,4,421,323,625,621,673,882,22,25,11,16,10,16,364,290,738,773,789,982,30,30,12,11,5,17,270,216,658,827,982,791,14,23,26,4,0,8,385,327,508,782,886,691,13,24,28,8,10,14,303,245,743,803,655,717,9,29,21,7,10,11,367,313,749,861,693,661,13,29,19,10,13,14,445,283,543,751,755,944,18,20,19,10,13,9,357,299,608,582,919,750,15,22,22,5,12,16,287,431,776,845,1158,645,13,30,36,1,4,17,331,451,793,888,643,1172,20,29,12,11,10,11,362,234,659,671,674,716,6,17,24,12,11,17,3 +320,350,823,760,629,749,27,23,21,5,10,10,421,309,548,663,670,962,22,8,22,16,14,12,375,185,741,662,1067,793,23,36,36,8,10,7,165,195,871,851,862,988,15,24,26,7,2,2,264,214,839,877,978,804,10,14,36,8,3,9,256,208,682,861,1109,732,9,32,31,10,10,15,350,286,735,660,749,988,16,12,26,13,10,5,380,374,688,555,765,886,19,18,33,20,13,17,455,313,727,697,761,992,37,23,34,13,12,18,243,171,811,839,1032,869,1,14,8,8,3,1,418,206,657,792,952,647,0,23,26,12,9,7,292,244,896,745,723,711,18,24,27,13,9,4,326,306,876,785,791,645,20,14,29,14,12,15,462,262,534,729,793,896,11,11,39,12,10,8,312,238,707,614,1017,784,8,33,36,11,9,15,154,326,913,901,1244,725,0,25,20,5,5,12,394,504,716,832,621,1132,33,22,34,11,17,12,427,247,804,601,640,808,13,18,24,12,14,18,3 +279,353,855,767,614,739,22,15,22,12,9,9,374,276,596,664,657,1094,25,16,21,23,13,9,372,200,771,699,1034,819,26,30,31,3,11,14,114,194,935,854,821,990,6,16,21,2,1,1,237,233,893,920,935,840,15,18,31,3,2,10,295,233,740,900,1078,818,14,26,30,3,9,20,295,267,795,705,734,1162,31,20,21,20,9,2,401,353,742,590,754,1014,28,26,28,19,12,14,384,276,763,716,738,1094,16,21,29,14,11,17,280,206,835,866,1009,823,20,16,9,15,2,8,369,287,681,831,931,837,21,25,25,15,8,14,357,251,920,758,710,853,23,22,26,14,8,11,265,277,856,804,770,793,27,16,28,17,11,12,393,277,564,774,782,1090,32,13,36,19,11,11,357,271,771,653,1006,866,29,31,35,12,10,18,307,407,957,924,1227,691,21,21,25,12,4,19,305,475,690,839,606,1312,28,20,29,18,16,13,392,250,778,614,613,712,12,26,29,11,13,15,3 +248,410,705,820,680,713,23,26,25,3,12,10,385,259,568,699,689,908,18,15,22,12,10,12,327,189,725,648,998,757,19,31,14,12,12,11,139,129,777,897,881,956,19,17,6,9,0,2,246,196,745,917,969,768,14,9,14,8,1,9,230,250,580,847,1008,686,13,27,27,14,8,17,322,276,699,702,728,974,12,9,6,9,8,5,356,376,642,619,672,828,15,17,11,16,11,17,409,295,755,771,826,940,37,30,12,11,4,18,247,197,689,829,995,845,5,15,26,6,1,5,380,272,535,790,895,629,4,20,26,10,11,11,258,284,774,801,660,701,14,31,25,11,9,8,316,352,776,859,690,603,16,21,19,10,12,15,422,286,480,761,774,882,7,14,19,8,12,8,278,270,615,590,916,734,4,30,22,9,11,15,236,392,801,863,1159,699,4,30,36,3,5,16,352,502,764,894,680,1110,29,29,12,9,9,10,405,231,690,673,715,786,17,15,28,16,12,18,3 +314,398,693,917,672,702,22,17,32,5,13,11,339,223,626,798,679,955,17,26,21,14,9,13,281,211,733,693,980,762,20,18,19,10,11,16,175,169,789,986,867,965,18,18,9,7,1,3,274,190,759,974,951,779,15,18,19,6,2,10,172,172,584,888,994,711,14,14,32,12,9,16,280,188,735,783,722,1019,17,18,9,11,9,6,322,290,686,716,664,867,14,22,16,18,12,18,375,215,789,868,808,973,30,19,17,13,1,19,281,233,667,834,977,832,6,26,21,8,4,10,348,286,513,831,877,674,5,25,35,12,12,16,274,306,752,886,646,708,13,20,22,11,12,13,298,302,746,956,672,646,15,20,20,12,9,16,390,244,560,828,766,927,14,19,24,10,11,7,254,244,633,625,908,753,11,21,27,9,10,14,266,404,787,822,1143,684,5,19,37,3,10,15,304,410,842,991,668,1157,28,20,17,9,4,11,451,279,648,764,697,763,10,24,27,14,13,19,3 +296,378,897,658,641,764,33,25,19,12,12,12,391,373,628,595,682,1011,32,14,24,23,16,10,391,225,719,616,1079,824,23,32,38,5,8,1,195,203,931,745,874,1027,9,18,28,2,4,4,274,258,903,801,990,841,8,10,38,3,5,9,322,300,744,815,1121,773,7,28,29,3,8,5,324,420,803,592,761,1033,26,10,28,20,12,3,410,528,762,473,777,927,29,20,35,21,15,15,455,435,725,589,773,1035,27,29,36,16,14,16,321,189,891,853,1044,894,9,18,10,15,5,1,402,294,737,734,964,698,10,21,24,15,11,5,308,328,976,667,735,734,24,30,25,14,11,0,320,430,892,677,803,698,26,20,27,19,14,13,420,396,554,661,805,941,21,17,37,19,8,10,386,364,767,636,1029,815,18,31,34,12,7,5,282,330,979,915,1256,746,10,29,18,12,7,2,402,652,732,724,633,1189,35,28,36,18,19,8,405,339,834,505,652,825,23,16,22,13,14,16,3 +296,364,817,902,667,743,20,15,23,9,11,10,325,273,606,785,712,1084,25,20,14,18,15,12,287,197,741,770,1069,813,30,24,34,6,9,15,137,233,907,979,848,966,4,22,24,3,3,2,232,226,875,1019,960,816,17,22,34,2,4,9,180,156,702,973,1115,830,16,20,23,8,9,17,226,170,799,792,791,1150,31,22,24,15,9,5,308,282,748,703,815,1004,28,22,31,16,14,17,353,269,777,855,783,1088,20,17,32,13,9,18,275,257,795,893,1054,819,16,18,6,12,4,9,360,254,641,922,978,845,17,23,20,16,10,15,304,274,880,871,771,855,19,18,25,15,10,12,244,272,816,943,819,803,23,16,33,16,13,15,338,274,584,863,839,1088,28,15,35,14,9,8,242,274,749,722,1063,868,25,27,30,7,8,15,248,386,915,953,1276,695,17,15,34,7,6,16,308,402,754,974,659,1256,26,18,32,13,14,10,439,295,738,747,656,726,12,28,24,12,15,18,3 +284,436,774,871,653,724,24,22,31,6,8,9,367,239,541,740,662,1049,29,21,16,17,14,9,345,143,680,733,971,802,34,23,16,7,12,12,105,117,860,932,854,1003,6,11,6,6,0,1,232,210,824,958,942,821,19,9,16,7,1,10,270,228,657,928,981,781,18,19,29,9,8,20,294,210,734,729,701,1101,31,19,6,14,8,2,364,346,681,684,645,961,32,25,13,19,11,14,373,271,748,836,801,1055,22,32,14,14,8,17,267,191,754,872,968,838,14,17,24,9,1,6,382,318,600,871,868,760,15,26,28,11,11,12,358,312,839,862,635,782,17,27,33,10,9,9,248,372,787,924,663,740,21,23,25,15,14,12,404,300,525,792,747,1009,26,20,21,13,12,11,330,314,698,675,889,819,23,26,24,8,11,18,258,412,872,958,1132,694,15,32,42,6,3,17,298,464,711,943,655,1245,24,31,14,12,13,13,423,257,701,736,696,761,16,15,30,13,12,15,3 +344,430,936,1003,744,780,27,16,23,12,11,10,291,279,759,892,769,985,26,27,24,13,11,12,247,293,810,827,948,780,15,7,38,9,11,19,205,273,1048,1098,703,699,19,23,28,8,1,2,246,270,1010,1108,771,669,24,29,38,9,2,11,150,252,841,1042,1010,881,25,11,33,7,9,17,234,260,954,901,880,959,34,27,28,18,9,5,252,220,895,800,914,863,31,13,35,15,12,17,335,239,814,940,758,895,9,28,36,10,5,18,233,227,904,912,959,742,33,21,2,11,2,17,310,200,754,985,929,936,34,10,30,11,12,23,320,352,989,960,860,826,36,23,31,10,8,18,334,352,937,1028,820,850,34,25,31,11,13,15,332,122,703,958,892,1033,39,28,43,17,11,10,204,130,892,789,1096,871,42,4,40,12,10,15,208,334,1038,974,1071,716,34,14,30,12,4,16,318,354,919,1079,712,1017,33,29,36,14,10,10,413,281,851,830,613,597,21,15,22,13,13,18,3 +210,334,706,759,668,698,13,27,25,3,9,11,423,297,547,666,689,949,18,14,24,10,13,7,391,255,752,651,1046,758,29,32,28,14,11,10,253,255,780,848,887,961,11,18,18,13,1,3,288,318,740,884,983,775,24,10,28,14,2,12,322,326,585,850,1072,707,23,28,33,16,9,18,374,316,688,669,752,1003,20,8,18,13,9,0,424,368,621,568,732,861,21,16,25,14,12,12,479,287,742,708,808,969,31,29,26,13,11,19,273,235,690,850,1027,828,15,16,12,2,2,4,344,348,536,787,935,660,14,19,28,8,8,10,228,260,775,758,708,692,6,30,31,9,8,7,374,268,777,796,754,640,10,20,29,12,11,10,456,332,529,734,794,911,15,13,33,14,11,13,338,330,616,613,980,749,12,29,36,7,10,18,284,430,806,900,1215,680,14,29,30,5,4,15,432,476,773,833,664,1145,19,28,26,15,16,15,381,311,687,614,691,759,9,14,26,14,13,13,3 +235,417,726,794,645,716,23,32,29,5,12,8,422,268,583,691,686,907,18,19,30,16,10,10,354,216,716,606,1083,760,21,27,26,8,10,9,224,142,798,865,878,959,19,13,16,11,2,0,287,197,766,873,994,771,14,5,26,12,3,9,267,275,601,807,1125,689,13,23,37,10,10,17,361,323,710,664,765,959,12,11,16,13,10,3,389,395,661,579,781,831,15,21,23,16,13,15,480,310,770,727,777,943,39,34,24,13,4,18,252,218,710,833,1048,848,5,21,14,8,3,3,363,325,556,750,968,616,4,22,32,6,13,9,213,309,795,777,739,690,14,29,29,7,9,6,371,345,793,815,807,602,16,25,27,14,12,13,469,307,495,719,809,867,7,18,31,12,10,10,303,287,636,554,1033,737,4,24,34,5,9,17,211,431,820,841,1260,702,4,34,28,5,5,14,455,517,779,860,637,1101,29,33,24,13,9,12,412,246,707,631,656,789,17,9,26,12,14,16,3 +218,266,721,780,671,722,15,17,21,1,10,8,405,251,550,679,722,1063,20,18,26,12,14,10,371,297,711,658,1057,802,33,26,32,14,10,15,155,281,811,873,830,945,11,16,22,9,2,0,276,290,775,907,938,823,24,16,32,10,3,9,272,278,608,861,1105,803,23,22,29,14,10,19,348,282,707,692,797,1129,26,18,22,9,10,3,394,300,646,579,825,991,23,22,29,16,13,15,421,237,695,711,781,1069,23,21,30,9,8,16,285,283,701,853,1062,798,15,16,8,4,3,9,376,314,547,802,980,824,14,23,24,8,11,15,260,222,786,745,777,832,16,22,25,9,9,12,318,186,768,799,815,780,20,18,27,10,14,13,446,288,564,759,849,1075,25,15,37,10,10,10,332,288,651,614,1073,851,22,27,34,7,9,17,274,434,823,871,1282,674,14,21,22,1,5,18,352,402,802,850,667,1291,19,22,30,11,13,12,405,285,676,605,624,659,7,24,28,14,14,16,3 +192,472,703,873,713,695,18,29,32,7,11,8,363,221,568,728,714,948,21,24,15,12,11,10,295,177,739,707,933,755,22,18,11,12,13,9,183,137,777,922,878,958,16,8,1,9,1,0,308,258,745,930,962,772,21,4,11,10,0,9,216,312,578,868,927,704,20,14,24,12,7,17,296,218,703,721,707,1008,15,16,1,9,7,3,334,354,642,694,603,860,18,26,8,10,10,15,401,291,761,846,853,966,36,39,9,9,5,18,247,243,685,826,954,825,12,22,29,6,0,3,320,420,531,821,848,665,11,27,29,8,10,9,266,380,770,864,619,695,9,30,28,7,10,6,314,406,764,934,681,639,11,32,26,10,13,13,396,368,520,762,763,916,10,23,16,10,13,10,256,396,615,637,833,746,7,21,19,3,12,17,298,480,797,930,1084,677,11,39,43,7,4,14,350,466,800,947,715,1148,22,38,9,11,10,12,361,325,678,750,770,756,14,10,33,6,11,16,3 +189,419,735,789,676,694,24,21,28,5,10,10,400,282,558,680,685,913,19,16,19,10,14,10,360,198,755,671,988,746,22,28,15,14,10,7,188,148,797,862,873,947,18,16,5,11,2,0,291,247,765,898,959,761,13,10,15,12,3,9,267,285,604,858,1002,685,12,24,28,14,10,15,343,279,697,671,724,973,13,14,5,11,10,3,387,419,646,594,668,833,16,18,12,12,13,15,432,310,729,746,816,943,40,31,13,11,8,16,222,224,721,836,985,826,4,14,25,4,3,1,337,315,567,797,885,628,3,23,31,6,11,7,263,307,806,788,652,686,15,30,24,5,9,4,353,363,800,834,680,600,17,22,22,10,14,13,443,365,506,738,770,881,8,15,20,12,10,10,317,349,633,621,912,729,5,31,23,5,9,15,279,401,829,914,1151,678,3,31,39,5,5,12,393,537,758,861,674,1109,30,30,13,13,13,12,348,310,718,652,705,761,16,20,29,8,14,16,3 +203,313,747,842,591,707,14,20,25,5,12,9,350,214,584,731,632,1020,19,15,24,12,10,9,328,260,711,690,1019,785,30,29,28,14,10,16,156,244,849,925,816,964,10,17,18,11,2,1,245,251,815,971,930,808,23,17,28,12,3,10,225,237,642,909,1061,768,22,25,33,14,10,20,281,225,757,760,707,1068,25,15,18,11,10,2,339,255,702,655,729,938,22,19,25,16,13,14,382,212,763,791,721,1030,22,20,26,11,4,17,248,282,719,891,984,813,14,19,12,6,3,10,323,315,567,850,904,747,15,22,28,12,13,16,259,253,804,821,681,761,17,21,29,13,9,13,293,223,796,879,743,727,21,17,29,10,12,12,385,261,586,819,757,996,26,12,33,12,10,11,289,273,693,654,981,804,23,26,36,11,9,18,245,435,845,891,1200,679,15,22,28,5,5,19,339,367,808,914,585,1224,20,19,26,13,9,13,368,274,708,689,606,708,6,21,28,16,14,15,3 +193,259,701,858,614,711,11,14,21,6,14,10,332,224,556,745,659,1010,16,17,14,13,12,12,292,326,733,764,1014,779,31,27,36,15,6,19,176,308,809,937,793,854,13,21,26,8,6,2,275,319,773,993,905,784,26,21,36,11,7,9,181,279,602,981,1060,802,25,23,23,13,6,17,271,229,727,790,732,1070,22,21,26,10,6,5,309,179,662,695,756,952,19,21,33,17,13,17,374,200,723,811,732,1032,21,16,34,10,6,18,254,284,669,919,1007,763,17,21,4,7,7,15,323,321,521,922,925,825,16,26,20,13,11,21,257,219,754,827,708,809,18,17,25,14,13,18,297,185,764,899,758,781,18,17,33,11,14,15,375,221,590,845,784,1064,27,14,35,9,6,8,249,233,653,730,1008,844,24,30,30,12,5,15,269,443,801,941,1225,667,16,16,32,6,9,16,349,283,812,930,610,1196,17,15,34,10,11,10,360,278,656,701,589,608,5,27,24,15,12,18,3 +279,363,820,905,695,756,26,19,23,11,13,9,324,236,681,806,742,1027,23,24,24,22,9,11,278,234,742,721,1023,812,12,20,36,4,11,20,138,214,938,996,786,851,20,20,26,1,1,1,233,203,900,1010,880,785,25,20,36,2,2,12,185,197,731,940,1077,855,26,16,33,4,9,18,235,227,852,799,825,1083,31,18,26,19,9,6,299,263,791,700,853,973,28,20,33,20,12,16,358,188,830,840,777,1037,8,19,34,15,3,17,276,218,778,894,1056,792,34,24,4,14,2,18,361,251,632,883,972,878,35,21,30,16,12,24,301,291,863,858,805,846,35,20,33,15,8,19,241,269,799,928,823,834,33,18,33,18,11,16,349,203,599,860,871,1101,36,17,41,18,11,11,253,201,786,685,1091,887,41,23,40,11,10,16,265,371,916,880,1200,710,35,19,32,11,6,17,323,387,791,977,689,1165,32,20,34,17,8,11,436,258,721,726,632,629,22,24,24,12,13,17,3 +258,240,642,885,652,714,11,21,29,4,13,8,425,223,561,778,693,1027,16,24,30,15,9,10,373,349,618,671,1090,792,31,20,32,9,9,19,197,305,754,964,885,971,19,18,22,10,3,0,302,330,724,964,1001,815,32,18,32,11,4,9,280,322,553,878,1132,775,31,16,37,11,9,19,358,266,708,763,772,1087,22,16,22,12,9,3,388,226,649,676,788,945,19,22,29,17,12,15,461,207,770,824,784,1037,17,21,30,12,3,16,287,311,604,826,1055,820,23,24,8,7,6,13,390,354,456,823,975,754,22,21,32,7,14,19,260,250,689,846,746,768,20,22,33,8,14,16,324,164,689,912,814,732,18,20,33,13,11,13,466,240,545,814,816,1003,27,17,37,11,9,10,342,258,616,621,1040,813,28,23,40,6,8,17,228,478,734,830,1267,686,22,21,28,4,12,18,414,318,803,957,644,1233,11,22,30,12,6,12,435,241,597,716,663,713,11,22,28,13,15,16,3 +347,463,827,908,711,770,30,30,30,12,13,10,434,244,606,783,718,995,35,27,17,13,11,12,426,152,721,708,999,830,28,21,9,1,13,7,96,108,885,977,902,1039,6,5,1,2,1,2,213,163,855,985,988,851,13,5,9,3,0,9,313,293,690,905,1001,771,12,17,22,3,7,15,349,303,771,774,741,1013,31,19,1,18,7,5,453,447,722,713,669,911,34,29,6,9,10,17,378,356,797,865,859,1027,22,42,7,4,3,18,298,220,811,883,1004,916,14,25,31,15,0,1,479,337,657,852,902,678,15,30,27,15,10,7,333,363,896,895,665,740,21,31,26,14,10,4,329,461,840,953,703,690,23,33,24,7,11,15,439,369,516,827,789,919,26,26,14,17,13,8,373,355,721,648,909,807,23,24,17,12,12,15,239,401,915,929,1156,764,15,42,41,12,6,12,281,537,760,980,713,1171,30,41,7,14,8,12,492,320,760,769,756,849,22,13,35,11,11,18,3 +247,363,782,889,662,767,23,15,21,4,13,10,330,180,615,790,709,1018,20,24,22,13,9,12,278,262,732,719,1018,811,23,20,38,11,11,17,162,192,876,984,787,818,17,18,28,8,1,2,253,199,840,1006,891,754,22,18,38,7,2,9,159,221,671,934,1068,870,17,16,31,13,9,17,269,231,776,793,792,1062,28,22,28,10,9,5,297,235,725,688,820,956,25,22,35,15,12,17,390,150,726,826,752,996,19,21,36,10,3,18,202,274,758,868,1033,787,23,18,2,7,2,11,325,307,604,879,951,897,24,19,28,11,12,17,269,321,843,854,772,849,26,22,31,10,8,14,295,253,809,914,794,853,30,20,31,11,11,15,381,221,605,854,838,1100,33,17,43,9,11,8,219,229,716,679,1060,892,32,23,38,4,10,15,217,433,882,898,1227,717,24,19,30,2,6,16,359,349,859,963,656,1126,29,22,36,8,8,10,386,274,717,720,601,628,11,24,22,11,13,18,3 +206,206,675,842,634,729,12,16,22,3,14,9,389,277,550,739,677,1070,17,19,23,12,12,9,347,363,687,714,1068,809,30,25,35,14,6,22,207,371,793,927,863,952,16,23,25,11,6,1,318,386,755,959,979,830,29,23,35,12,7,10,268,338,586,919,1110,810,28,21,30,14,6,20,336,304,711,744,754,1136,23,21,25,11,6,4,362,238,652,629,774,998,20,21,32,16,13,14,475,257,713,773,762,1076,20,16,33,11,6,17,299,307,633,863,1033,805,20,19,5,4,7,16,346,316,503,860,953,831,19,22,25,10,11,22,256,184,718,799,730,839,19,17,26,11,13,19,292,140,728,861,792,787,19,15,28,10,14,14,440,282,586,813,802,1082,28,14,38,12,6,11,324,286,641,670,1026,858,25,28,35,9,5,18,280,448,771,897,1247,681,19,16,23,3,9,19,418,356,816,912,626,1298,14,17,33,13,11,13,389,269,620,667,641,666,8,27,25,16,12,15,3 +217,355,816,819,677,702,26,20,22,4,11,9,328,244,613,714,726,1043,21,19,25,15,11,9,336,214,752,657,1025,782,20,27,31,11,11,16,130,202,910,908,790,925,12,17,21,6,1,1,195,209,872,926,890,803,15,19,31,7,2,10,249,189,707,862,1077,783,16,23,30,11,9,20,253,207,802,715,805,1109,29,17,21,12,9,2,351,299,747,612,833,971,26,23,28,15,12,14,312,226,764,756,769,1049,16,22,29,12,5,17,292,238,792,866,1050,778,24,17,9,7,2,10,353,293,638,805,966,804,25,22,25,11,12,16,295,287,877,790,785,812,27,21,28,10,8,13,269,261,807,844,811,760,31,17,28,13,13,12,339,287,591,776,855,1055,34,14,36,11,11,11,319,279,750,611,1077,831,33,26,35,4,10,18,271,409,918,868,1218,654,25,20,27,4,4,19,279,411,781,891,673,1271,32,21,29,10,10,13,394,294,755,650,622,639,12,23,27,11,13,15,3 +267,321,843,776,664,732,27,16,15,6,9,14,366,380,538,675,683,979,28,11,18,17,13,10,338,182,719,716,1028,792,27,31,34,7,11,1,118,216,871,847,871,995,9,21,24,4,1,0,219,261,839,887,971,809,12,15,34,5,2,9,243,307,694,871,1054,741,11,27,23,9,9,9,279,311,729,656,734,1001,22,19,24,14,9,3,359,395,686,583,714,895,25,23,31,17,12,15,384,416,741,735,806,1003,31,26,32,14,13,16,254,122,837,863,1009,862,5,9,6,9,2,1,379,201,683,814,919,666,6,28,18,13,8,5,301,221,922,777,686,702,18,25,25,12,8,0,271,345,852,823,736,666,20,19,25,15,11,13,385,299,510,725,780,909,17,18,31,13,11,10,303,275,709,696,962,783,14,34,28,6,10,9,235,279,931,987,1197,714,6,26,24,6,4,6,337,547,664,846,662,1157,31,25,32,12,16,12,412,334,780,641,693,793,19,23,24,13,13,16,3 +340,386,843,853,691,727,24,23,37,8,9,10,395,247,586,732,722,1096,29,16,20,13,15,12,351,175,755,703,1059,807,30,26,18,11,11,11,123,171,905,932,868,1006,2,20,8,8,1,2,242,206,869,956,970,826,15,20,18,7,2,9,244,180,712,898,1097,806,14,24,31,13,9,17,304,172,769,735,803,1166,29,16,8,10,9,5,372,316,722,652,801,1008,32,20,15,13,12,17,395,273,743,804,807,1090,24,19,16,10,9,18,287,221,829,814,1052,819,12,16,22,11,2,5,430,254,675,845,970,821,13,19,36,15,10,11,348,278,914,818,765,847,15,22,25,14,8,8,256,310,854,892,803,779,19,14,25,11,13,15,410,282,554,800,841,1074,24,15,23,9,11,8,294,270,741,643,1047,850,21,21,26,4,10,15,240,386,939,918,1262,679,13,21,38,6,4,16,296,438,732,929,683,1302,28,22,16,8,14,10,487,281,772,698,680,738,16,22,28,9,13,18,3 +123,299,683,765,614,699,13,14,20,0,12,10,318,230,574,648,655,998,10,17,11,11,16,8,312,292,691,719,990,767,27,25,33,15,8,21,282,262,799,842,767,848,19,15,27,10,4,2,329,279,755,894,871,772,24,17,33,11,5,11,263,285,592,918,1038,790,23,21,20,15,8,21,261,285,709,687,730,1058,16,21,27,10,10,3,313,307,632,604,756,940,13,23,34,15,15,13,394,220,721,718,724,1020,21,22,35,10,12,18,284,258,645,842,995,751,15,15,3,3,5,15,275,343,499,853,913,813,16,24,17,7,11,21,271,243,730,738,708,797,18,23,22,8,11,18,303,225,732,806,752,769,20,19,30,9,14,13,345,313,576,742,780,1052,21,16,32,11,8,12,289,313,639,675,1004,832,24,28,27,6,7,19,355,459,775,936,1215,655,16,22,31,2,7,20,377,405,828,837,610,1194,19,23,35,12,17,14,268,306,620,612,577,596,3,23,21,13,14,14,3 +269,349,662,807,643,740,18,29,34,7,14,10,428,274,547,704,684,1075,23,22,31,18,10,8,452,330,620,599,1081,820,30,24,27,8,8,15,222,232,768,872,876,997,14,10,17,11,4,2,311,283,734,874,992,843,27,8,27,12,5,11,369,363,561,808,1123,813,26,20,40,8,8,21,365,315,694,669,763,1145,29,14,17,15,8,1,437,319,639,596,779,993,26,18,24,20,15,13,470,292,756,744,775,1079,18,31,25,17,4,18,344,320,626,804,1046,836,18,22,13,10,5,9,401,419,476,749,966,810,19,21,37,10,13,15,321,281,711,786,737,826,21,26,30,11,11,12,329,267,671,832,805,778,25,22,28,16,12,11,457,323,503,722,807,1061,30,21,32,14,8,12,435,333,614,553,1031,853,27,21,35,9,7,19,299,539,754,820,1258,704,19,31,27,7,7,20,401,445,763,879,635,1287,16,30,25,13,7,14,412,234,601,646,654,727,10,12,29,10,14,14,3 +197,481,714,870,685,718,21,29,31,6,12,9,342,220,579,729,694,965,20,24,16,13,10,9,336,160,730,702,939,778,27,18,10,11,10,10,190,98,796,923,858,981,9,8,0,10,2,1,257,197,762,933,956,795,16,4,10,11,3,10,241,285,595,871,935,727,15,14,23,13,10,18,289,267,698,722,695,1021,24,16,0,10,10,2,347,407,653,685,609,881,23,26,7,11,13,14,356,318,740,837,825,989,29,39,8,12,4,17,244,248,696,827,950,848,7,22,30,5,3,4,315,395,542,822,852,676,8,27,28,7,13,10,295,385,781,859,613,716,12,30,27,6,9,7,335,443,775,925,663,652,14,32,25,11,12,12,377,403,521,767,753,929,19,23,15,11,10,11,309,409,634,634,841,769,16,21,18,4,9,18,287,459,812,925,1092,700,8,39,42,6,5,15,321,501,791,944,687,1157,27,38,8,12,9,13,318,354,685,741,738,779,7,10,32,7,14,15,3 +277,401,672,899,694,726,18,21,31,3,13,9,390,182,547,772,701,1027,23,26,16,12,9,11,366,234,652,701,982,800,34,18,10,12,11,18,102,148,770,962,885,1003,14,14,0,9,1,1,247,205,734,990,971,819,27,12,10,8,2,8,249,267,565,904,984,769,26,14,23,14,9,18,323,199,684,765,724,1075,29,18,0,9,9,4,381,289,629,712,652,939,26,24,7,16,12,16,376,232,746,864,842,1039,22,25,8,9,1,17,272,276,644,856,987,848,18,24,30,6,4,12,399,377,496,851,885,732,17,23,28,10,12,18,303,299,729,874,644,756,17,24,27,9,12,15,291,301,729,952,686,718,21,26,25,10,9,14,419,311,517,830,772,983,26,19,15,8,11,9,319,333,612,645,892,807,23,21,18,5,10,16,267,491,770,870,1139,702,17,25,42,1,10,17,293,409,781,971,696,1217,16,24,8,9,4,11,430,254,641,760,735,773,10,20,34,12,13,17,3 +195,513,680,917,700,694,17,31,32,12,13,9,364,174,573,770,691,945,22,22,15,9,9,9,336,204,722,741,912,754,27,16,11,9,9,12,228,104,764,958,855,957,13,10,1,12,3,1,309,223,728,968,941,771,22,6,11,13,4,10,257,339,565,888,902,703,21,12,24,7,9,20,309,241,692,759,678,1001,18,14,1,12,9,2,357,367,637,738,582,857,21,24,8,5,14,14,396,286,762,890,840,965,35,37,9,12,3,17,242,288,660,834,931,824,13,20,29,11,4,6,299,461,506,847,827,658,12,25,29,5,14,12,263,427,745,904,598,690,8,32,28,4,10,9,365,419,753,978,666,636,10,34,26,11,11,12,399,399,519,798,736,909,13,21,16,13,9,11,297,419,602,673,806,745,10,19,19,6,8,18,321,539,780,954,1061,676,12,37,43,12,6,17,353,473,797,985,702,1141,21,36,9,14,8,13,318,366,659,792,763,755,11,8,33,9,15,15,3 +391,347,629,1007,740,708,18,20,32,7,9,11,380,198,588,874,745,1009,23,31,15,14,11,13,326,274,671,773,992,782,24,19,11,10,13,18,182,218,739,1058,917,985,10,23,1,7,1,3,283,259,705,1036,1001,801,23,25,11,6,0,10,239,239,532,930,992,751,22,19,24,12,7,16,323,149,695,857,754,1073,29,27,1,11,7,6,359,199,638,814,664,921,26,21,8,14,8,18,388,200,765,966,882,1021,16,18,9,9,1,19,322,312,595,818,1005,830,20,21,29,10,10,16,415,331,445,879,901,728,21,26,29,14,10,22,337,269,680,964,664,754,23,13,28,13,12,17,325,269,696,1054,716,700,25,17,26,12,11,16,435,239,554,892,804,981,32,24,16,10,13,9,307,261,589,677,900,789,29,16,19,5,12,14,259,449,721,822,1147,684,21,18,43,5,14,15,287,323,828,1079,742,1209,20,17,9,9,2,11,512,294,594,856,785,755,10,25,35,12,11,19,3 +279,471,829,914,668,734,28,26,29,4,13,8,402,164,658,789,669,981,27,19,18,13,9,10,368,168,711,728,958,794,24,25,12,11,11,11,90,80,917,981,865,997,10,13,2,8,1,0,243,165,885,1007,939,811,9,5,12,7,2,9,261,243,712,937,960,743,8,21,25,13,9,19,311,215,817,786,700,1003,21,11,2,10,9,3,381,321,770,723,626,897,24,21,9,17,12,15,384,230,851,875,820,1005,32,34,10,10,3,16,244,270,811,903,961,864,4,17,28,7,2,5,387,351,657,880,855,668,5,22,30,11,12,11,343,393,896,897,626,704,19,35,25,10,8,8,297,369,832,963,662,668,21,25,23,11,11,13,415,345,590,851,742,911,16,18,17,9,11,10,319,349,757,676,868,785,13,28,20,6,10,17,253,475,923,931,1115,716,5,34,40,2,6,16,299,451,834,986,672,1159,34,33,10,8,8,12,424,298,784,777,711,795,16,15,34,13,13,16,3 +237,279,606,934,664,720,8,16,30,1,12,9,402,234,615,823,677,1045,13,31,23,12,8,11,372,308,664,706,1012,798,34,17,19,12,10,20,138,270,728,999,875,999,22,17,9,9,2,1,287,313,700,989,965,817,35,19,19,10,3,10,259,297,539,903,1030,777,34,15,32,14,10,18,345,253,724,796,730,1101,19,23,9,9,10,4,393,241,653,735,692,957,16,25,16,16,13,16,414,204,786,887,808,1051,20,20,17,11,2,17,272,312,562,865,1001,834,26,27,21,4,5,16,379,401,436,846,905,758,25,28,33,8,13,22,281,269,647,895,674,782,17,19,22,7,13,19,317,213,665,975,712,736,15,21,20,10,10,14,441,321,599,841,774,1009,24,24,24,10,10,9,317,339,600,640,938,815,25,18,27,5,9,16,277,519,694,787,1177,690,25,20,35,1,11,17,329,317,869,1006,662,1241,8,19,17,11,5,11,420,266,551,779,693,757,14,25,27,12,14,17,3 +257,413,645,953,735,727,14,19,32,11,11,9,404,142,570,816,750,1096,19,38,15,10,9,11,350,262,667,731,1023,807,32,8,11,10,11,16,166,166,747,1014,922,1006,16,8,1,13,1,1,311,209,715,1004,1020,826,29,16,11,14,2,8,247,347,540,908,1025,806,28,4,24,8,9,18,353,245,687,811,765,1166,25,30,1,13,9,4,373,311,632,764,695,1008,22,18,8,6,10,16,438,232,759,916,879,1090,22,33,9,13,1,17,256,350,613,828,1028,819,20,30,29,10,8,10,347,487,459,855,930,821,19,19,29,4,12,16,271,407,698,928,685,847,17,20,28,3,14,13,315,329,710,1004,727,779,21,30,26,12,9,14,461,405,544,860,819,1074,26,31,16,14,11,9,299,427,593,649,933,850,23,11,19,7,10,16,265,585,737,866,1180,679,19,29,43,11,14,17,365,389,818,1029,737,1302,14,32,9,15,4,11,426,344,602,812,778,738,8,14,35,10,13,17,3 +240,400,787,844,652,716,21,20,22,2,9,11,369,273,596,719,653,917,16,13,17,11,15,9,305,165,811,750,968,760,19,37,19,13,13,6,163,143,841,901,855,959,21,21,9,10,1,1,278,226,807,927,931,771,16,15,19,9,0,10,220,268,652,913,978,689,15,33,24,15,7,14,314,246,749,698,698,971,10,15,9,8,7,2,336,346,686,661,642,831,13,23,16,15,10,14,407,295,795,813,806,943,37,28,17,8,9,15,229,155,775,893,963,848,7,15,21,5,0,2,336,296,621,858,861,628,6,28,19,9,10,6,274,280,860,847,638,692,12,29,34,8,10,3,330,348,850,901,660,612,14,19,26,9,13,12,416,294,546,761,738,879,5,14,24,9,13,11,256,286,677,710,886,737,2,38,27,6,12,14,264,382,881,1001,1129,702,6,28,33,0,2,11,346,470,800,918,658,1111,27,27,17,10,14,13,403,251,772,717,703,789,19,23,27,13,11,15,3 +270,312,732,810,688,703,19,20,22,3,11,8,399,253,557,703,705,1072,24,17,27,14,11,10,379,245,714,650,1032,783,35,29,25,10,11,15,119,239,824,897,879,982,11,17,15,9,1,0,266,262,790,931,963,802,24,17,25,10,2,9,264,242,619,865,1060,782,23,25,30,12,9,19,336,246,722,718,776,1142,30,15,15,11,9,3,394,286,669,617,756,984,27,21,22,18,12,15,365,259,716,759,804,1066,23,22,23,11,5,16,301,265,710,863,1023,795,15,19,15,6,2,9,398,316,556,808,933,797,14,24,25,8,12,15,288,224,795,791,730,823,16,23,28,9,8,12,314,236,783,847,756,755,20,19,26,12,13,13,434,286,555,779,814,1050,25,12,30,10,11,10,340,286,666,610,1004,826,22,28,33,7,10,17,288,436,832,851,1219,655,14,22,27,3,4,18,302,404,779,884,680,1278,19,21,23,11,10,12,433,257,691,657,685,714,11,21,25,14,13,16,3 +303,453,928,940,708,718,25,17,20,11,13,8,188,258,803,829,729,933,20,24,21,16,11,12,188,288,842,794,898,740,11,14,39,10,7,21,260,260,1042,1035,653,683,21,14,29,5,5,4,235,259,1024,1057,717,641,26,20,39,6,6,15,159,217,865,1007,960,827,27,10,30,8,7,19,129,243,1000,844,844,937,28,26,29,17,7,9,225,237,935,737,876,843,25,22,36,20,14,15,272,228,880,873,716,897,7,25,37,13,5,16,314,234,880,925,905,700,35,20,1,14,6,19,247,229,752,950,879,870,36,13,27,18,12,25,329,383,965,895,822,776,34,20,30,17,12,20,275,365,883,961,782,822,30,28,30,14,13,19,203,133,743,909,854,1013,33,19,42,16,7,14,233,123,926,756,1052,829,38,17,37,15,6,17,313,377,1006,963,1031,662,36,23,29,11,8,18,309,371,893,1012,676,1031,31,26,37,13,10,12,346,256,823,761,577,537,23,18,21,16,13,16,3 +291,355,672,952,654,814,12,21,28,3,12,10,382,158,597,831,705,1065,13,28,23,14,10,12,324,286,686,728,1050,858,28,18,33,10,12,19,180,212,784,1025,829,865,16,18,23,7,0,2,243,243,748,1013,941,801,25,20,33,8,1,11,205,271,577,921,1096,917,24,14,38,12,8,17,319,191,718,822,780,1109,19,20,23,11,8,5,329,183,653,753,808,1003,16,22,30,14,11,17,418,150,734,905,764,1033,18,21,31,11,0,18,228,308,636,845,1045,834,18,28,7,6,5,17,381,357,492,868,963,944,19,25,35,10,11,23,265,289,721,911,760,896,21,18,36,9,13,18,325,261,715,993,798,900,19,20,34,12,10,15,435,207,585,867,832,1147,24,21,38,10,12,10,257,233,632,664,1056,939,27,21,41,3,11,15,181,479,770,849,1265,764,19,21,35,3,11,16,385,299,853,1032,650,1139,18,20,31,9,3,10,420,270,609,791,611,675,6,22,21,10,12,18,3 +257,315,823,778,698,708,30,14,19,6,9,9,326,256,568,679,745,1021,25,13,20,13,11,11,314,266,777,672,1026,782,14,31,38,13,13,20,156,258,925,873,789,877,16,21,28,8,1,1,205,259,883,907,883,803,21,21,38,11,2,8,225,191,720,877,1080,795,22,27,29,13,9,18,261,211,791,694,828,1083,33,21,28,10,7,4,341,249,738,577,856,959,30,21,35,17,10,16,312,216,699,711,780,1039,12,16,36,10,13,17,304,240,795,837,1059,768,30,19,2,9,0,14,367,249,643,814,975,818,31,26,26,13,6,20,305,259,880,737,808,810,33,19,29,12,10,17,293,221,860,799,826,774,35,15,31,11,11,14,353,223,608,763,874,1063,38,14,41,9,13,9,311,219,763,630,1094,841,39,32,36,8,12,16,281,377,923,865,1203,662,31,16,26,4,2,17,277,367,762,846,692,1215,36,15,36,8,14,11,404,304,760,601,633,615,18,27,22,15,11,17,3 +236,388,703,877,667,684,18,16,25,2,10,9,365,205,576,754,684,963,15,21,22,13,12,11,325,195,731,681,1013,744,22,21,16,11,14,14,185,179,787,950,872,943,16,13,6,8,2,1,248,214,749,964,972,761,19,15,16,9,1,8,204,240,590,886,1031,703,18,17,29,13,8,18,294,186,715,755,733,1025,15,19,6,10,8,4,338,282,650,680,695,875,18,21,13,17,9,16,395,233,753,832,807,971,34,24,14,10,6,17,237,229,683,864,1002,802,10,19,24,5,1,8,360,324,529,835,908,680,9,20,24,9,9,14,266,280,768,856,671,706,9,25,25,8,11,11,340,316,768,920,713,648,11,23,19,11,14,14,398,272,532,808,781,933,10,18,21,9,14,9,262,292,623,631,941,749,7,24,24,6,13,16,218,442,803,872,1178,656,9,24,36,2,3,17,348,406,796,951,663,1163,24,25,14,10,11,11,373,247,676,730,694,731,14,21,24,13,10,17,3 +234,246,640,844,643,760,16,21,24,6,12,8,397,297,527,745,684,1073,21,24,25,13,10,10,383,359,604,702,1081,834,30,22,35,13,8,21,217,355,764,933,876,929,16,18,25,10,4,0,324,370,726,957,992,855,29,20,35,11,5,11,306,340,557,907,1123,847,28,18,34,13,8,19,344,322,686,744,763,1135,27,16,25,10,8,5,384,242,623,635,779,1011,24,22,32,17,15,15,485,297,748,775,775,1091,18,21,33,12,4,16,333,327,586,857,1046,820,20,24,5,7,5,17,376,354,460,848,966,870,19,21,31,13,13,23,278,220,671,801,737,862,21,20,32,14,11,20,308,160,651,863,805,826,23,20,34,11,12,15,438,274,527,807,807,1115,30,17,40,11,8,10,370,278,612,658,1031,893,27,25,41,12,7,17,282,478,726,877,1258,714,19,21,25,6,7,18,426,400,763,914,635,1261,14,20,33,12,9,12,397,227,575,667,654,667,8,22,25,15,14,16,3 +344,346,660,1003,707,707,15,16,35,5,11,10,355,191,559,880,724,1032,20,29,12,10,11,12,297,285,636,785,1025,785,31,19,14,14,13,19,157,245,770,1072,904,986,15,25,4,11,1,2,240,260,734,1068,1002,804,28,25,14,10,0,9,204,232,563,974,1035,764,27,19,27,16,7,17,284,206,698,873,755,1090,26,23,4,7,7,5,326,198,639,812,701,944,23,23,11,14,10,17,373,167,758,964,851,1038,21,16,12,9,1,18,263,319,622,860,1022,821,19,27,26,8,6,15,382,322,476,919,926,745,18,24,32,12,10,21,320,274,707,966,683,771,18,17,31,11,14,18,290,250,711,1052,717,723,22,13,29,8,11,15,392,242,537,922,805,998,27,22,19,6,13,8,270,262,616,715,943,802,24,18,22,9,12,15,214,452,752,884,1186,677,18,14,46,3,12,16,296,324,793,1075,707,1228,15,17,12,7,2,10,473,313,625,856,742,744,7,29,32,16,11,18,3 +300,424,706,927,678,730,22,21,29,4,15,9,421,197,549,800,697,1055,27,34,18,15,9,11,383,195,644,717,1026,808,32,12,18,9,11,18,109,135,804,992,885,1009,10,4,8,8,1,1,254,208,766,1004,985,827,23,12,18,9,2,8,286,258,599,922,1044,787,22,8,31,11,9,18,332,210,706,799,744,1107,33,26,8,12,9,4,396,308,651,736,706,967,30,20,15,13,12,16,423,249,766,888,820,1061,20,35,16,12,1,17,231,235,682,854,1015,844,16,28,22,7,2,12,398,384,528,869,921,766,17,21,32,9,12,18,354,326,767,902,684,788,19,22,27,8,10,15,298,326,717,976,726,746,23,32,23,13,9,14,438,328,495,850,792,1015,28,27,23,11,11,9,344,352,644,663,952,825,25,15,26,4,10,16,240,476,808,904,1191,700,17,33,40,4,8,17,342,430,733,999,676,1251,20,34,16,10,6,11,427,277,629,782,707,767,14,12,28,9,13,17,3 +264,488,763,897,693,728,27,31,31,5,11,9,353,213,586,756,704,919,22,22,16,10,11,11,327,135,709,711,947,772,21,16,10,14,13,12,167,89,841,946,866,971,15,10,0,11,1,1,234,172,807,968,964,783,10,6,10,10,0,8,220,286,640,896,943,701,9,12,23,14,7,18,286,230,721,743,705,947,16,14,0,9,7,4,332,388,672,718,619,843,19,24,7,12,10,16,351,309,759,870,833,955,37,37,8,9,5,17,207,239,745,836,958,860,1,20,30,4,0,6,340,358,591,851,860,606,0,25,28,8,10,12,316,370,830,884,617,692,18,32,27,7,10,9,342,430,824,958,671,608,20,34,25,8,13,14,386,360,526,794,763,855,11,21,15,10,13,9,280,350,679,645,851,749,8,19,18,3,12,16,228,444,855,918,1100,714,0,37,42,5,4,17,330,466,782,967,693,1091,33,36,8,11,10,11,351,315,740,772,738,801,13,8,34,8,11,17,3 +285,395,669,972,671,693,19,21,32,3,11,9,384,150,600,845,680,968,14,34,15,14,9,11,334,244,627,754,989,761,19,12,15,10,11,18,152,178,767,1039,872,966,17,20,5,9,1,1,257,177,739,1035,960,780,18,20,15,10,2,8,217,233,560,945,999,720,17,10,28,12,9,18,319,215,731,838,719,1010,18,26,5,11,9,4,329,259,674,781,663,882,15,20,12,16,12,16,428,150,803,933,817,986,25,23,13,13,1,17,210,302,643,871,986,821,11,24,25,6,6,12,373,353,489,888,886,667,12,23,29,8,12,18,309,347,728,941,651,691,16,14,30,7,14,15,283,291,716,1021,681,657,26,22,26,12,9,14,431,287,544,889,765,918,23,25,20,10,11,9,273,297,627,682,907,760,20,9,23,5,10,16,185,469,763,865,1150,673,12,17,43,3,12,17,373,377,826,1044,671,1152,25,24,13,11,4,11,410,284,642,827,710,750,3,20,31,12,13,17,3 +205,291,671,818,675,700,10,17,17,4,16,8,356,226,596,699,688,975,15,24,22,11,12,10,328,312,627,676,1023,768,28,22,24,13,6,17,166,270,775,897,886,973,16,20,14,10,6,0,277,299,751,933,976,787,29,20,24,9,7,9,235,261,574,883,1041,727,28,18,25,15,6,19,289,289,733,710,741,1021,21,18,14,8,6,3,361,301,676,621,703,889,18,22,21,15,13,15,410,226,791,773,819,993,20,19,22,10,6,16,338,284,633,833,1012,828,20,26,16,5,7,11,371,311,479,828,916,676,19,25,20,11,11,17,233,239,718,791,685,702,19,20,29,12,13,14,273,201,716,861,723,664,17,20,25,9,14,13,379,289,556,781,785,929,26,17,29,9,6,10,299,289,639,630,949,767,25,25,30,10,5,17,299,431,755,847,1188,680,19,19,28,4,9,18,365,403,812,894,673,1159,14,18,22,10,9,12,386,290,636,671,706,755,8,24,28,17,12,16,3 +170,386,766,805,658,750,18,23,20,2,10,11,349,207,591,704,703,1049,17,18,17,13,14,7,327,225,746,695,1042,818,30,28,37,13,10,12,195,191,852,894,815,893,12,14,27,10,2,3,256,232,812,936,923,823,19,14,37,11,3,12,234,256,653,894,1090,841,18,24,26,13,10,20,294,246,740,721,782,1109,23,14,27,10,10,0,334,314,677,612,806,991,20,20,34,15,13,12,401,247,740,750,766,1071,22,25,35,10,8,19,221,259,746,878,1037,802,14,14,3,5,3,6,292,364,592,833,961,864,15,25,23,7,11,12,264,304,831,792,762,848,17,26,28,6,9,9,310,286,815,838,806,820,21,16,32,11,14,10,394,358,587,788,830,1103,26,17,38,11,10,13,292,358,688,651,1054,883,23,27,33,4,9,20,266,478,868,932,1233,706,15,25,31,2,5,17,382,420,839,877,650,1223,24,26,35,12,13,15,329,295,719,648,641,643,4,20,23,11,14,13,3 +261,511,705,939,677,656,26,16,31,4,14,10,320,186,620,790,678,875,21,37,16,13,12,12,308,154,703,729,903,708,20,11,10,11,14,15,224,114,781,984,846,909,16,11,0,8,2,2,239,189,759,998,932,723,11,15,10,7,1,9,183,305,576,910,893,647,10,9,23,13,8,17,265,189,745,785,671,935,15,29,0,10,8,5,323,331,690,760,567,795,18,23,7,13,9,17,342,268,801,912,823,905,38,28,8,10,2,18,244,246,687,818,922,788,2,27,30,7,3,9,321,375,533,865,818,590,1,24,28,11,9,15,281,387,772,910,579,646,17,17,27,10,11,12,375,421,772,1000,651,568,19,29,25,11,12,15,357,293,528,826,727,843,10,30,15,9,14,8,233,287,627,653,797,691,7,10,18,2,13,15,245,477,793,850,1052,642,1,28,42,4,9,16,311,433,816,1011,681,1073,32,27,8,8,5,10,356,256,684,810,734,729,14,19,28,9,10,18,3 +192,292,719,778,684,680,13,17,21,3,10,11,411,265,562,671,705,1049,16,16,24,10,14,7,409,301,743,668,1020,760,29,28,30,14,10,18,219,293,825,865,859,959,13,16,20,13,2,3,310,312,783,909,945,779,24,16,30,14,3,12,324,318,620,869,1062,759,23,24,29,16,10,22,362,322,709,692,770,1119,22,18,20,13,10,0,414,344,646,585,750,961,19,22,27,14,13,12,413,267,723,725,802,1043,21,21,28,13,10,19,289,285,687,831,1029,772,15,16,10,2,3,12,336,342,541,810,935,774,16,23,24,4,9,18,280,230,772,755,720,800,18,22,25,5,9,15,344,216,776,813,756,732,20,18,27,12,12,10,450,324,582,761,812,1027,27,13,35,14,10,13,376,324,665,620,998,803,24,29,34,7,9,20,342,458,817,879,1223,632,16,21,22,5,5,21,362,448,822,852,678,1255,19,20,28,15,15,15,347,307,668,621,657,691,3,24,30,10,14,13,3 +249,465,670,779,668,721,18,29,28,5,14,10,390,220,543,666,701,990,21,24,29,16,8,8,382,220,636,597,1076,781,32,18,29,10,10,11,270,148,758,866,893,980,8,8,19,13,2,2,285,211,726,880,1003,798,19,4,29,14,3,11,283,303,553,806,1110,740,18,14,38,10,10,19,343,303,674,669,770,1030,25,16,19,13,10,1,393,397,623,576,768,906,24,26,26,14,13,13,476,284,734,726,804,1008,28,39,27,13,2,18,226,286,652,808,1049,839,10,22,11,8,3,5,311,387,498,751,965,687,9,27,33,4,13,11,261,373,737,764,732,711,11,30,32,5,9,8,373,365,723,814,792,671,15,32,30,14,10,11,445,377,487,726,816,938,20,23,34,14,10,12,353,381,600,549,1018,786,17,21,37,7,9,19,255,495,768,822,1249,693,9,39,29,5,7,16,461,513,763,855,662,1172,24,38,27,15,7,14,320,322,645,630,685,768,8,10,27,10,14,14,3 +272,344,808,834,684,696,23,21,29,2,9,15,387,353,565,715,683,873,18,14,18,9,15,11,331,185,826,708,932,740,23,34,8,15,13,2,155,201,842,895,861,945,19,18,2,12,1,1,276,262,810,915,931,755,14,12,8,11,0,8,214,338,665,881,942,661,13,30,21,17,7,10,324,272,720,692,698,937,12,14,2,10,7,4,360,374,679,647,608,797,15,20,5,13,10,16,389,375,742,799,826,909,41,29,6,10,9,17,247,121,800,865,945,844,5,12,32,3,0,0,362,264,646,826,835,592,4,25,26,7,10,6,268,256,885,835,612,700,14,30,25,8,10,1,348,382,869,887,656,564,16,20,23,9,13,14,424,276,517,747,742,845,7,13,13,11,13,9,268,264,680,668,850,703,4,35,16,6,12,10,266,278,896,961,1087,694,4,29,40,2,2,7,300,518,733,906,688,1073,29,28,6,12,14,13,423,315,795,707,733,787,17,20,34,13,11,17,3 +205,327,569,915,695,721,8,14,34,4,10,8,334,236,560,776,720,1062,13,23,13,13,12,10,274,252,653,743,1013,799,34,21,13,11,4,15,168,248,663,972,890,1000,22,13,3,8,8,0,289,301,627,986,996,818,35,17,13,7,9,9,201,293,484,938,1023,778,34,17,26,13,12,19,277,247,677,769,743,1132,19,21,3,10,4,3,327,301,604,728,691,974,16,25,10,17,5,15,428,262,761,880,835,1056,26,24,11,12,12,16,310,278,545,852,1010,835,26,19,27,7,9,9,355,371,401,887,918,787,25,20,31,11,15,15,231,263,630,888,675,813,7,23,30,10,9,12,247,267,646,968,705,745,11,25,28,11,10,13,361,339,556,818,797,1040,16,16,18,9,4,10,241,341,527,685,931,816,17,24,21,6,5,17,321,455,669,938,1174,691,25,24,45,2,11,18,359,407,822,987,695,1268,8,23,11,8,11,12,390,296,552,776,738,758,14,21,33,13,12,16,3 +235,261,664,874,643,746,12,20,27,5,17,8,370,244,599,767,684,1101,17,29,28,16,13,10,350,320,612,684,1081,826,30,17,30,8,5,21,184,296,784,957,876,997,18,15,20,9,7,0,299,329,752,971,992,845,31,17,30,10,8,9,275,333,583,899,1123,827,30,13,37,10,5,19,317,293,754,762,763,1169,23,21,20,13,5,3,377,269,697,665,779,1021,20,25,27,20,12,15,470,248,802,811,775,1101,12,24,28,13,7,16,306,322,616,857,1046,830,26,25,10,8,8,15,371,377,476,842,966,844,27,24,32,10,10,21,273,233,701,837,737,862,21,21,33,11,14,18,275,171,651,899,805,802,19,23,31,14,15,13,413,305,573,819,807,1095,28,22,35,12,5,10,331,309,652,642,1031,871,31,20,38,9,4,17,273,499,748,845,1258,698,27,22,26,5,12,18,401,379,819,944,635,1317,12,23,28,11,10,12,376,242,589,705,654,721,14,23,30,12,13,16,3 +303,303,867,680,623,727,23,14,18,11,9,12,412,400,542,599,664,962,26,13,25,14,11,10,404,224,785,642,1061,787,29,37,35,14,13,5,134,272,895,769,856,976,11,29,25,7,5,0,183,289,853,835,972,808,14,19,35,10,6,9,297,243,724,841,1103,740,13,35,26,12,9,13,335,341,713,622,743,998,20,21,25,11,9,3,425,363,678,503,759,884,23,25,32,18,10,15,378,362,701,621,755,990,33,18,33,11,17,16,280,188,859,847,1026,849,5,15,11,12,0,1,445,141,705,764,946,665,4,20,21,18,6,5,283,233,944,679,717,697,14,19,22,19,10,2,337,291,894,709,785,663,16,9,24,12,11,13,431,219,578,693,787,914,15,20,34,10,13,10,363,183,737,626,1011,782,12,34,31,17,12,13,195,259,959,909,1238,711,4,18,17,11,2,10,305,503,654,752,615,1150,29,17,33,9,14,14,466,254,848,527,634,750,15,27,25,14,13,16,3 +312,326,770,826,690,765,23,22,25,2,9,10,435,259,527,719,733,1092,28,19,26,13,13,12,391,207,736,666,1110,839,33,27,36,11,13,11,167,223,838,907,897,960,7,15,26,8,1,2,260,248,800,929,1011,858,20,17,36,9,0,9,268,234,643,861,1154,852,19,23,35,13,7,17,366,228,698,714,810,1156,24,15,26,10,7,5,400,296,651,617,830,1022,27,21,33,15,10,17,449,269,708,765,814,1104,29,24,34,10,7,18,259,229,754,835,1085,833,11,17,4,5,0,5,434,286,600,808,1007,871,10,24,32,9,10,11,286,238,839,799,786,873,14,23,33,8,10,8,336,260,829,853,846,829,16,17,33,11,15,15,476,258,529,775,858,1116,19,16,41,9,13,8,326,256,674,614,1082,894,16,24,42,4,12,15,166,400,864,879,1303,717,10,22,26,2,2,16,374,416,733,898,682,1268,23,23,34,10,12,10,457,251,735,663,687,710,15,21,24,11,11,18,3 +215,237,657,811,606,733,15,21,21,5,9,9,406,248,550,710,653,1022,20,16,20,12,13,9,322,336,693,701,1040,803,31,30,36,14,11,12,208,322,747,908,835,904,13,20,26,11,1,1,299,327,709,944,951,826,26,22,36,12,2,10,261,295,548,904,1082,814,25,26,29,14,9,20,343,277,683,729,728,1086,24,18,26,11,9,2,369,243,620,614,748,960,23,24,33,16,12,14,462,230,725,742,734,1044,29,19,34,11,11,17,282,294,635,862,1007,801,17,16,4,6,2,6,343,317,497,845,927,819,16,19,26,12,8,12,217,211,720,776,702,813,10,20,27,13,8,9,323,169,714,830,764,779,14,12,29,10,11,12,439,219,558,798,776,1064,19,13,39,12,11,11,281,223,583,657,1000,848,16,25,36,11,10,18,261,441,753,928,1223,695,16,19,26,5,4,17,423,345,808,881,600,1218,17,20,34,13,16,13,408,254,622,636,615,650,7,24,24,16,13,15,3 +228,400,864,944,677,723,26,15,23,4,14,9,275,181,789,849,716,1008,21,24,24,11,10,9,285,249,796,738,995,785,10,24,36,11,8,22,201,173,956,1033,758,842,20,24,26,10,4,1,212,192,952,1035,852,774,25,24,36,11,5,12,184,218,805,955,1049,818,26,22,33,13,8,20,224,236,960,832,807,1066,25,20,26,10,8,6,300,266,899,737,835,952,22,22,33,15,13,14,313,149,916,877,749,1032,8,17,34,8,4,17,271,259,820,909,1028,767,34,28,4,7,5,18,294,302,690,898,944,841,35,25,30,11,13,24,248,344,905,893,787,817,35,18,33,10,13,21,312,278,847,965,795,797,27,18,33,9,12,16,300,242,749,887,845,1072,30,17,41,9,8,11,252,240,864,700,1063,856,35,27,40,6,7,18,248,430,924,843,1178,679,35,17,32,4,11,19,312,386,973,1012,663,1154,32,16,34,8,7,13,337,251,779,767,602,604,22,26,24,11,14,15,3 +328,480,878,915,722,732,29,30,30,4,11,9,409,215,643,776,715,951,24,27,17,13,11,11,365,135,766,713,918,784,23,21,9,11,13,8,115,105,936,968,885,985,13,5,1,8,1,1,262,172,900,986,957,799,8,5,9,7,0,8,266,332,747,910,904,723,7,17,22,13,7,16,314,260,804,765,700,969,18,19,1,10,7,4,370,412,759,734,578,871,21,29,6,13,10,16,357,313,814,886,872,981,35,42,7,10,5,17,293,227,862,864,945,864,1,25,31,7,0,2,426,376,708,857,833,632,2,30,27,11,10,8,374,382,947,908,600,694,20,31,26,10,10,5,316,470,905,974,694,636,22,33,24,11,13,14,410,374,591,816,752,877,13,26,14,9,13,9,312,364,772,649,808,767,10,24,17,2,12,16,250,428,970,936,1063,716,2,42,41,4,4,13,248,480,819,989,728,1123,35,41,7,8,10,11,469,323,845,790,781,799,13,13,35,9,11,17,3 +269,419,741,859,631,735,28,28,25,4,14,9,348,218,616,748,674,976,23,15,24,15,8,11,310,182,693,667,1063,787,24,31,22,9,10,12,160,152,825,942,858,984,14,17,12,6,2,1,227,153,797,956,974,802,9,9,22,7,3,8,183,185,618,874,1105,736,8,27,33,11,10,18,281,229,739,747,751,1018,17,7,12,12,10,4,319,347,694,660,771,896,20,17,19,19,13,16,388,242,777,810,757,1000,36,30,20,12,2,17,250,244,723,888,1028,855,0,17,18,7,3,6,363,287,569,821,948,675,1,18,28,11,13,12,255,333,808,840,727,717,19,31,25,12,11,9,295,325,802,898,787,655,21,21,23,13,10,14,387,299,524,804,799,926,12,14,27,11,10,9,257,273,669,619,1023,784,9,28,30,10,9,16,215,407,835,852,1244,709,1,30,34,4,9,17,349,471,804,933,623,1156,34,29,20,10,5,11,418,250,716,712,636,788,12,13,22,13,14,17,3 +216,248,699,847,623,752,11,15,22,3,8,9,383,251,610,742,666,1039,12,18,23,10,14,11,331,287,721,685,1061,812,29,26,37,14,12,16,181,313,793,940,856,919,17,22,27,11,0,1,258,320,755,954,972,819,26,22,37,10,1,8,226,242,596,896,1103,829,25,22,32,16,8,18,326,262,733,745,743,1101,18,22,27,9,8,4,356,216,666,644,763,973,15,22,34,14,11,16,429,231,765,784,755,1059,25,17,35,9,8,17,231,285,671,858,1026,816,17,18,3,4,1,10,332,290,533,841,946,836,16,23,29,10,11,16,230,186,756,814,719,830,14,18,32,11,9,13,330,166,750,872,785,794,18,16,32,8,14,14,432,234,606,802,791,1075,23,15,42,10,12,9,272,242,631,645,1015,861,20,29,39,9,11,16,226,410,795,876,1238,708,16,15,31,3,3,17,384,350,866,921,615,1195,17,18,35,11,13,11,401,283,648,680,634,689,5,28,23,16,12,17,3 +204,406,633,894,712,684,12,23,31,6,10,10,373,187,576,747,709,999,17,32,16,9,14,12,327,231,669,708,922,758,28,14,10,15,8,15,183,175,721,945,871,961,16,6,0,12,4,2,318,266,685,953,951,777,29,10,10,11,5,9,230,312,530,887,920,727,28,10,23,13,12,17,312,220,693,744,700,1069,21,24,0,8,6,5,368,324,630,713,596,911,20,22,7,11,9,17,375,245,759,865,846,997,30,35,8,8,8,18,291,263,613,797,945,806,20,30,30,5,5,9,354,422,461,838,839,724,19,23,28,9,15,15,260,346,698,869,612,750,7,24,27,8,9,12,336,338,698,953,674,684,11,36,25,7,14,15,400,382,542,787,756,977,16,25,15,9,8,8,262,406,561,644,826,765,13,17,18,2,7,15,328,496,733,891,1077,660,19,35,42,6,7,16,322,420,818,970,714,1205,14,34,8,10,13,10,361,321,604,761,767,731,8,16,32,9,10,18,3 +217,241,641,691,546,667,12,14,16,3,10,10,396,286,548,582,583,1036,13,15,19,12,14,8,368,328,639,649,954,747,26,29,33,14,10,13,298,344,717,770,757,946,16,21,23,9,4,2,319,355,671,830,865,766,25,19,33,10,5,11,327,305,542,850,996,746,24,25,24,14,10,21,361,301,657,617,662,1106,19,23,23,9,10,1,419,265,598,538,680,948,16,25,30,16,13,13,422,278,693,640,664,1030,28,18,31,9,16,18,328,288,621,816,931,759,16,15,7,4,3,7,363,285,513,785,849,761,15,24,19,10,9,13,303,191,706,676,632,787,11,23,24,11,9,10,383,177,696,728,690,719,15,13,24,10,12,11,401,221,572,676,708,1014,20,16,32,10,10,12,323,223,553,603,932,790,17,32,29,9,9,19,355,409,743,882,1149,619,15,18,23,3,5,18,387,397,816,759,542,1242,18,21,31,11,17,14,332,234,600,538,547,678,4,23,27,16,14,14,3 +293,325,834,803,712,712,31,20,25,5,11,9,362,258,617,704,747,1081,28,19,26,16,11,11,324,248,762,653,1032,792,17,27,28,12,11,16,118,234,924,894,795,991,15,21,18,7,1,1,261,229,886,924,889,811,20,23,28,8,2,8,209,193,721,866,1086,791,21,23,33,10,9,18,283,195,812,715,840,1151,36,19,18,13,9,4,339,255,759,606,864,993,33,23,25,16,12,16,344,208,738,742,786,1075,13,20,26,13,5,17,284,246,812,840,1051,804,29,17,12,8,2,10,377,285,658,803,973,806,30,20,28,10,12,16,315,267,897,772,820,832,32,19,29,9,8,13,265,227,861,830,838,764,36,15,29,14,13,14,387,255,603,776,876,1059,41,12,33,12,11,9,285,255,762,613,1092,835,38,26,36,5,10,16,269,411,934,850,1173,664,30,18,26,5,4,17,263,373,817,869,698,1287,37,19,26,11,10,11,448,296,775,636,669,723,17,25,30,10,13,17,3 +222,268,770,733,714,715,20,17,21,3,11,9,381,259,569,634,763,1070,19,14,26,12,15,9,353,321,728,643,1062,795,28,28,34,12,9,14,159,287,858,830,827,966,14,18,24,9,3,1,282,272,820,874,927,816,21,18,34,12,4,10,262,266,657,850,1114,794,16,24,29,14,9,20,326,302,742,661,842,1138,27,18,24,9,9,2,374,310,683,542,870,990,24,22,31,16,14,14,405,233,698,656,806,1070,20,19,32,9,11,17,313,295,750,836,1087,799,20,14,10,6,4,8,366,294,596,783,1003,813,21,21,24,10,10,14,276,246,835,694,822,829,23,22,25,9,10,11,292,174,807,744,848,769,27,16,27,10,13,12,422,292,577,730,892,1066,32,13,37,8,9,11,318,286,696,601,1114,842,29,27,34,7,8,18,310,426,872,868,1255,667,21,19,18,1,6,19,338,404,811,799,710,1288,26,20,32,9,16,13,403,285,717,554,655,688,8,24,26,14,15,15,3 +284,378,795,793,676,737,21,24,26,11,10,9,391,217,602,684,721,1092,26,17,27,20,12,9,383,223,711,639,1078,817,29,29,31,2,10,12,123,173,881,874,857,988,3,15,21,1,2,1,228,210,847,898,969,838,16,13,31,2,3,10,298,244,678,840,1124,816,15,25,36,4,10,20,308,250,773,681,798,1160,32,11,21,19,10,2,406,338,722,584,820,1012,29,19,28,16,13,14,403,243,777,734,792,1092,19,26,29,11,6,17,293,241,777,822,1063,821,17,17,9,14,3,6,412,332,623,783,987,835,18,22,31,16,13,12,316,286,862,772,776,851,20,27,32,15,9,9,272,284,810,822,828,791,24,17,32,14,14,12,408,304,540,744,846,1088,29,16,36,18,10,11,360,304,721,585,1070,864,26,26,39,11,9,18,260,446,895,860,1285,689,18,26,25,11,5,17,334,456,742,865,668,1310,27,25,29,17,11,13,421,273,720,634,661,710,13,17,29,10,14,15,3 +162,290,725,722,575,678,12,20,22,2,10,12,349,301,670,619,618,1025,7,9,29,13,12,6,349,269,731,586,1001,756,24,31,25,11,8,13,271,261,821,811,796,957,22,23,19,8,4,4,302,302,781,839,912,775,25,13,25,9,5,13,294,312,622,791,1043,745,24,27,30,13,8,21,324,282,787,624,695,1095,13,15,19,10,6,1,362,304,718,525,715,937,10,15,22,17,9,11,361,311,817,669,699,1025,26,24,23,10,12,18,305,253,699,835,970,780,18,9,15,5,5,7,338,340,555,730,892,750,15,20,25,9,7,13,300,198,784,711,671,776,13,29,26,10,9,10,346,238,774,757,731,710,17,19,26,11,10,9,368,302,644,687,743,1003,18,14,30,9,8,14,316,306,659,542,967,787,19,30,33,8,7,21,360,446,819,819,1188,638,15,24,23,2,7,18,332,434,924,796,567,1231,18,23,23,10,13,16,287,249,668,575,578,701,6,21,27,15,10,12,3 +321,349,840,782,708,745,26,22,28,3,8,12,402,334,549,663,717,908,21,9,19,10,14,14,372,142,754,650,1026,781,24,37,19,14,12,5,162,180,876,861,909,978,16,23,9,11,0,4,207,239,844,887,997,788,11,15,19,10,1,11,243,263,693,843,1036,700,10,33,26,16,8,13,331,279,730,666,756,916,15,13,9,7,8,7,385,383,689,581,700,836,18,19,16,14,11,19,400,358,736,733,854,950,38,24,17,7,10,20,258,130,830,829,1023,877,2,15,21,6,1,3,423,195,676,788,923,581,1,24,25,10,9,9,275,237,915,771,688,697,17,25,26,9,9,4,353,353,887,821,718,601,19,15,28,8,12,17,433,299,535,735,802,824,10,12,24,8,12,8,305,269,712,594,944,754,7,34,27,5,11,13,179,295,926,885,1187,733,1,24,33,1,3,10,353,527,727,858,708,1072,32,23,17,9,15,14,462,306,807,639,743,824,14,19,27,12,12,20,3 +250,422,716,888,699,701,20,19,32,3,14,9,429,201,583,761,706,976,25,34,15,12,12,11,395,197,702,682,987,769,30,10,11,12,14,14,163,135,812,955,890,974,6,6,1,11,2,1,274,214,780,969,976,788,19,12,11,12,1,8,270,240,605,885,989,728,18,6,24,14,8,18,368,218,710,758,729,1030,25,26,1,11,8,4,410,330,663,699,657,890,28,20,8,14,9,16,425,227,746,851,847,994,28,31,9,11,2,17,221,249,690,849,992,829,10,32,29,4,1,8,390,356,536,830,890,685,9,21,29,6,9,14,296,334,775,865,649,711,11,20,28,5,11,11,358,334,781,939,691,665,15,32,26,10,12,14,472,340,535,815,777,938,20,27,16,12,14,9,332,350,654,624,897,768,17,13,19,5,13,16,234,462,810,849,1144,681,9,31,43,3,7,17,344,454,789,964,701,1166,24,30,9,13,7,11,401,289,685,749,740,756,12,16,35,10,10,17,3 +240,322,862,790,683,739,23,20,21,11,11,14,331,293,635,685,734,1066,22,17,22,20,15,4,351,215,786,700,1051,813,21,29,38,4,9,15,123,231,964,885,820,936,13,17,28,1,3,6,194,234,920,923,924,832,18,19,38,0,4,13,290,190,761,893,1101,826,19,25,31,6,9,23,224,260,842,706,809,1130,30,17,28,17,9,3,352,360,783,591,837,996,27,23,35,20,14,9,319,271,782,727,785,1078,9,22,36,15,11,16,341,209,832,833,1066,807,27,15,6,14,4,9,376,228,682,832,984,845,28,22,26,18,10,15,354,252,917,753,789,847,30,21,27,17,10,12,202,246,855,815,823,803,30,15,29,18,13,7,324,274,593,775,861,1090,35,14,39,16,9,16,356,254,802,654,1085,868,36,26,36,9,8,23,320,348,966,935,1260,691,28,20,22,9,6,20,258,478,717,864,679,1250,29,21,36,15,16,18,413,255,775,621,630,684,15,23,22,12,15,10,3 +233,253,711,769,650,742,19,19,13,5,8,9,410,228,520,656,671,1089,24,12,18,10,12,9,350,342,695,747,1028,820,33,36,32,12,12,12,202,302,777,840,869,1021,13,24,22,11,6,1,345,311,735,884,965,839,26,24,32,12,7,10,275,279,588,894,1054,809,25,32,21,14,10,20,359,311,659,663,734,1149,24,20,22,11,10,2,383,267,602,598,714,1001,27,26,29,12,11,14,468,234,679,728,792,1089,29,15,30,11,18,17,306,338,697,850,1009,844,17,18,8,4,1,6,353,323,549,837,917,806,16,21,16,6,7,12,275,213,782,758,690,830,10,18,23,5,9,9,315,165,778,816,736,774,14,6,25,10,10,12,457,289,548,728,776,1057,19,15,29,12,12,11,303,291,613,705,962,851,16,31,26,5,11,18,309,449,815,984,1197,702,16,17,24,5,3,17,383,387,770,843,646,1289,17,18,30,13,15,13,424,288,672,624,677,765,11,26,22,10,14,15,3 +218,458,696,1023,728,678,8,14,30,11,12,8,355,127,691,876,721,955,7,39,17,10,8,10,323,257,718,797,926,750,28,11,9,10,10,17,117,127,794,1070,893,953,22,11,1,9,2,0,254,216,772,1054,965,773,29,19,9,8,3,9,226,368,593,946,910,711,28,9,22,8,10,19,290,224,806,871,704,997,13,33,1,9,10,3,338,304,743,840,584,867,10,25,6,6,9,15,363,221,872,992,880,975,18,26,7,9,2,16,255,367,668,868,953,822,20,27,31,10,11,11,360,504,514,901,841,656,19,26,27,10,13,17,288,442,753,1000,606,678,17,15,26,9,13,14,288,360,755,1080,702,654,15,27,24,10,10,13,388,364,653,904,758,905,18,34,14,8,10,10,290,374,662,691,812,743,21,8,17,5,9,17,268,612,786,882,1071,670,19,26,41,11,17,18,310,384,935,1097,736,1143,14,25,7,9,5,12,385,353,665,890,789,751,8,21,35,6,14,16,3 +257,285,722,860,647,742,15,24,24,2,14,9,362,220,577,755,676,1065,20,19,25,13,10,9,308,294,718,686,1051,816,33,27,33,11,12,14,172,272,818,953,870,1017,9,19,23,8,0,1,285,277,786,975,976,835,22,21,33,9,1,10,229,259,611,901,1085,795,21,23,34,13,8,20,321,239,730,764,749,1119,26,17,23,10,8,2,323,233,677,659,747,977,23,21,30,17,11,14,432,212,736,799,779,1071,21,20,31,10,2,17,232,308,700,825,1024,852,15,15,7,5,1,8,331,317,548,842,938,776,16,20,31,9,11,14,303,239,785,825,711,800,18,23,34,10,9,11,301,195,785,887,767,750,22,15,34,11,10,12,427,237,575,823,793,1027,27,16,38,9,12,11,279,249,664,644,997,837,24,22,41,8,11,18,231,449,822,903,1224,708,16,20,27,2,7,19,369,349,817,932,639,1259,21,23,31,10,7,13,388,260,691,693,660,775,7,23,27,15,12,15,3 +333,319,813,906,709,680,27,18,27,5,14,10,346,248,660,805,746,1049,26,23,28,12,10,12,312,314,749,696,1031,760,15,21,32,12,12,19,162,294,921,985,794,959,19,27,22,9,0,2,249,299,883,989,888,779,24,27,32,8,1,9,205,213,714,905,1085,759,25,19,35,14,8,17,257,229,831,786,837,1119,34,21,22,9,8,5,341,211,776,693,861,961,31,21,29,14,11,17,334,174,791,839,785,1043,9,14,30,9,0,18,306,282,777,881,1050,772,33,25,8,8,3,15,375,237,629,848,972,774,34,20,30,12,11,21,317,253,862,865,817,800,36,17,31,11,11,18,269,215,818,927,837,732,34,15,33,10,10,15,367,211,618,841,875,1027,39,16,37,8,12,8,295,207,763,648,1091,803,42,20,40,3,11,15,269,359,909,819,1172,632,34,16,28,5,9,16,269,299,842,974,697,1255,33,15,30,7,5,10,464,330,738,731,668,691,21,27,28,8,12,18,3 +344,368,827,810,662,744,27,22,29,3,8,12,451,273,536,707,683,985,22,9,26,12,14,14,399,169,739,672,1040,796,23,35,24,12,12,7,163,179,865,897,881,993,15,23,14,9,0,4,256,206,831,909,977,811,10,13,24,8,1,11,274,220,682,869,1066,745,9,31,37,14,8,15,376,230,721,696,746,1013,16,13,14,9,8,7,402,318,676,611,726,905,19,19,21,16,11,19,453,281,721,759,802,1009,37,24,22,9,10,20,245,151,817,837,1021,864,1,13,16,6,1,3,438,240,663,806,929,672,0,24,32,10,9,9,336,250,902,801,702,710,18,25,27,11,9,4,332,320,880,847,748,664,20,15,25,10,12,17,482,258,528,755,788,921,11,12,29,8,12,8,322,236,701,618,974,793,8,34,32,9,11,13,160,354,915,899,1209,718,0,24,32,3,3,12,370,444,708,882,658,1161,33,23,22,9,15,12,457,259,802,661,685,797,13,19,24,16,12,20,3 +239,321,825,839,619,702,19,16,24,5,10,8,320,284,608,734,662,1057,16,15,23,16,14,10,288,208,775,699,1035,782,25,27,33,10,10,17,144,232,921,930,822,953,13,23,23,7,2,0,223,245,881,954,936,801,18,23,33,8,3,9,197,197,718,906,1079,783,17,23,32,10,10,19,247,229,803,739,739,1125,22,21,23,13,10,3,303,291,748,634,763,977,19,19,30,20,13,15,352,270,761,778,741,1057,19,16,31,13,8,16,234,214,797,864,1010,786,17,19,7,8,3,11,333,231,645,847,932,800,18,22,29,12,11,17,285,235,882,804,719,818,20,17,30,13,9,14,279,249,850,866,771,758,24,15,32,14,14,13,351,231,634,806,787,1051,27,14,38,12,10,10,257,221,759,655,1011,827,26,28,39,11,9,17,231,351,907,894,1228,654,18,16,25,5,5,18,321,411,824,909,611,1273,25,17,31,11,13,12,380,270,770,672,618,677,5,27,27,12,14,16,3 +202,260,696,886,623,729,9,17,24,1,14,8,349,207,587,783,664,1046,14,20,23,12,10,10,323,345,650,734,1061,803,27,22,31,12,8,21,199,295,806,973,856,954,15,22,21,11,4,0,274,306,782,1015,972,826,28,22,31,12,5,9,226,288,611,947,1103,802,27,18,32,14,8,19,286,280,752,802,743,1102,20,18,21,11,8,3,336,220,693,693,759,972,17,18,28,16,15,15,435,201,790,829,755,1058,19,15,29,11,4,16,247,333,654,923,1026,813,19,22,9,4,5,15,318,346,510,892,946,799,18,21,27,6,13,21,240,236,739,855,717,807,18,18,28,7,11,18,304,168,725,917,785,767,16,18,30,10,12,13,392,256,591,863,787,1048,25,13,36,12,8,10,296,270,672,694,1011,840,26,25,37,5,7,17,252,466,776,897,1238,689,18,19,27,3,7,18,416,334,829,954,615,1236,15,16,29,13,7,12,337,277,641,723,634,698,7,24,29,12,14,16,3 +331,453,708,872,682,718,24,19,28,3,14,12,460,200,535,751,691,993,29,34,19,14,10,14,432,168,624,638,1000,786,32,10,15,10,12,13,126,94,788,929,883,991,4,6,5,7,0,4,233,167,760,923,971,805,17,12,15,8,1,11,309,239,583,837,1010,745,16,6,28,12,8,15,365,229,692,726,730,1025,27,26,5,11,8,7,447,349,645,671,674,907,30,18,12,16,11,19,404,250,744,823,828,1011,26,31,13,13,2,20,278,216,692,797,997,846,10,30,25,6,1,7,459,329,538,786,897,688,11,19,31,10,11,13,337,339,777,845,662,706,15,20,24,9,9,10,337,371,723,911,692,682,17,32,22,12,10,17,465,311,475,769,776,933,22,27,20,10,12,8,369,311,630,578,918,785,19,13,23,5,11,13,217,445,804,805,1161,698,11,31,39,3,7,14,337,477,723,942,682,1177,26,30,13,9,7,12,466,248,667,721,717,773,16,14,29,12,12,20,3 +191,393,762,777,589,666,21,28,21,4,11,10,362,276,593,672,630,941,16,19,24,15,13,8,366,240,694,645,1027,734,25,25,32,13,9,13,246,162,858,868,822,939,13,13,22,14,3,2,277,193,822,902,938,753,16,3,32,15,4,11,281,271,653,852,1069,693,15,21,29,11,9,21,313,297,748,691,709,979,22,11,22,14,9,1,371,387,695,582,725,855,19,21,29,19,14,13,414,298,774,716,721,959,23,34,30,14,7,18,252,228,736,886,992,794,13,17,8,7,4,7,299,339,582,793,912,636,14,22,24,11,12,13,253,301,821,760,683,660,16,33,27,12,10,10,351,331,783,804,751,630,20,25,27,13,15,11,405,305,567,754,753,887,25,18,37,15,9,12,345,301,698,605,977,733,22,26,34,10,8,19,293,451,848,874,1204,646,14,34,26,6,6,18,397,507,807,847,581,1125,27,33,30,16,12,14,302,256,723,618,602,721,5,13,28,13,15,14,3 +240,454,700,893,679,712,15,21,31,5,14,9,409,205,563,760,694,1013,20,32,16,14,10,11,387,201,704,685,963,786,33,12,10,10,12,16,139,109,794,956,862,989,9,6,0,11,0,1,268,210,758,970,960,805,22,10,10,12,1,8,268,272,589,888,965,755,21,8,23,12,8,18,352,208,692,753,711,1065,26,24,0,11,8,4,402,346,641,704,639,925,23,20,7,12,11,16,361,279,728,856,819,1025,25,33,8,13,2,17,243,259,676,818,968,834,13,30,30,6,1,10,386,398,524,837,870,722,12,21,28,6,11,16,302,354,761,866,631,746,14,22,27,5,9,13,348,370,767,944,667,704,18,34,25,12,10,14,446,354,537,806,763,973,23,25,15,12,12,9,340,378,634,629,877,793,20,15,18,5,11,16,262,482,798,870,1120,688,12,33,42,5,7,17,316,472,795,967,679,1205,21,32,8,13,7,11,383,297,669,752,722,759,7,14,32,8,12,17,3 +285,239,714,916,644,704,17,17,27,11,12,9,390,270,603,809,675,1073,22,26,30,20,8,11,362,330,634,714,1052,784,25,18,26,4,10,20,104,326,832,999,869,983,13,22,16,1,2,1,247,331,798,1007,977,803,26,22,26,0,3,10,263,275,627,921,1086,783,25,16,35,6,10,18,297,235,768,800,746,1143,28,20,16,17,10,4,387,195,711,711,744,985,25,22,23,18,13,16,378,242,816,857,780,1067,13,17,24,13,2,17,312,268,670,871,1025,796,23,26,14,14,5,16,431,253,524,866,939,798,24,23,30,18,13,22,323,161,755,869,710,824,26,18,29,17,13,19,263,155,699,945,768,756,24,16,27,16,10,14,399,205,547,855,790,1051,33,19,31,16,10,9,323,207,684,664,994,827,32,21,34,9,9,16,273,379,806,837,1225,656,24,17,28,9,11,17,307,325,741,988,638,1279,17,18,24,15,5,11,460,262,613,745,661,715,11,26,26,10,14,17,3 +213,565,736,1006,758,673,25,26,31,11,11,9,372,188,639,857,741,842,20,27,16,10,9,11,358,232,682,788,894,717,25,17,10,10,11,12,184,122,814,1051,893,922,17,9,0,11,1,1,259,237,788,1053,969,732,12,5,10,12,2,8,237,413,609,947,862,638,11,13,23,8,9,18,321,273,768,852,700,856,14,19,0,11,9,4,377,415,709,831,582,766,17,25,7,6,10,16,358,298,800,983,904,886,39,38,8,11,1,17,216,330,720,875,927,821,3,25,30,10,8,6,347,495,564,904,819,517,2,26,28,6,12,12,269,459,803,985,606,637,16,27,27,5,14,9,381,461,777,1071,726,541,18,31,25,10,9,14,405,411,563,891,758,764,9,22,15,12,11,9,297,397,656,692,764,680,6,20,18,5,10,16,237,591,826,921,1027,671,2,38,42,11,14,17,341,387,857,1080,764,1006,31,37,8,13,4,11,334,374,711,883,829,766,15,13,28,8,13,17,3 +249,271,724,709,614,709,18,20,24,7,9,8,440,354,529,616,663,1056,23,7,25,16,13,10,390,286,736,651,1038,789,30,37,35,12,11,9,178,306,798,806,833,988,10,25,25,9,1,0,297,327,760,872,949,808,23,15,35,10,2,9,315,289,601,856,1080,778,22,33,32,10,9,17,383,317,684,659,736,1126,25,15,25,13,9,3,419,343,631,540,760,968,26,19,32,20,12,15,454,344,678,644,734,1056,28,22,33,13,13,18,304,246,706,840,1011,813,14,15,9,8,2,3,399,267,554,781,929,781,13,24,27,14,8,9,285,183,791,694,712,807,11,23,28,15,8,6,337,237,779,732,762,745,15,13,30,14,11,13,485,247,555,728,788,1034,20,14,40,12,11,10,353,249,634,615,1012,818,17,34,37,13,10,17,273,393,818,896,1229,671,13,22,19,7,4,14,383,469,749,781,608,1262,20,21,33,11,16,12,438,224,693,546,611,734,10,21,25,14,13,16,3 +209,241,689,843,652,704,10,17,21,3,14,9,360,244,560,730,671,1073,15,22,22,12,12,9,326,298,687,717,1022,784,28,22,32,12,6,20,156,316,803,926,869,983,14,18,22,9,6,1,305,337,767,974,959,803,27,18,32,10,7,10,237,289,596,932,1048,783,26,18,29,14,6,20,299,279,721,759,736,1143,21,18,22,9,6,2,339,251,662,652,716,985,18,20,29,16,13,14,426,236,729,790,784,1067,18,19,30,9,6,17,298,296,651,870,1003,796,18,22,8,4,7,14,351,315,505,871,911,798,19,21,24,10,11,20,285,201,736,810,690,824,19,20,25,11,13,17,263,165,740,878,730,756,17,20,27,10,14,12,403,267,582,824,778,1051,26,15,37,10,6,11,303,267,651,675,964,827,27,25,34,9,5,18,305,435,785,898,1193,656,19,19,24,3,9,19,359,357,820,917,646,1279,16,20,30,11,11,13,384,274,634,682,669,715,6,24,28,16,12,15,3 +191,439,645,897,682,678,15,20,31,3,15,9,340,194,570,754,687,953,18,23,16,14,15,11,290,202,703,703,940,738,21,19,10,10,7,12,186,128,723,948,863,941,19,9,0,7,7,1,285,237,691,968,949,755,22,13,10,8,6,8,201,289,532,892,936,687,21,15,23,12,11,18,279,209,687,747,694,1015,12,19,0,11,1,4,329,325,626,714,606,865,15,25,7,14,8,16,394,256,765,866,830,955,33,30,8,11,9,17,260,240,629,838,953,808,13,21,30,6,6,6,345,399,475,845,849,672,12,18,28,10,14,12,243,339,714,880,610,696,6,25,27,9,14,9,303,353,718,954,664,642,8,29,25,12,13,14,369,339,526,798,746,923,7,20,15,10,7,9,241,359,569,641,842,729,4,22,18,3,6,16,281,481,743,910,1093,660,12,30,42,3,12,17,371,445,806,969,686,1155,21,29,8,9,8,11,344,280,628,764,733,739,17,17,32,10,9,17,3 +239,367,898,894,685,637,24,20,18,11,14,8,160,338,803,795,712,842,19,27,19,16,12,12,192,280,834,830,891,615,12,3,41,10,0,21,362,290,1010,995,646,606,22,19,35,9,12,4,367,259,994,1049,714,558,27,25,41,10,13,15,199,243,855,1035,953,730,28,7,28,8,6,19,237,287,1010,838,821,832,25,23,35,21,6,9,179,313,947,717,853,736,22,9,42,16,7,15,354,304,862,813,701,814,6,26,43,9,12,16,274,206,848,925,918,581,36,19,5,10,13,19,217,211,736,966,872,799,37,10,25,8,7,25,361,291,933,837,799,677,33,23,24,7,13,20,299,301,885,901,763,699,27,29,24,10,12,19,275,161,761,909,835,892,30,24,40,20,0,14,191,129,922,792,1039,708,35,6,35,17,1,17,323,349,970,1021,1058,567,37,18,23,11,15,18,439,443,963,958,655,980,30,33,43,17,15,12,242,208,795,703,554,470,24,11,15,12,14,16,3 +231,267,689,824,576,703,13,16,20,4,13,10,418,250,570,715,621,1072,18,23,25,13,9,12,386,302,725,684,992,783,33,21,25,15,9,19,190,286,789,905,779,982,11,17,15,10,3,2,317,293,755,969,893,802,24,17,25,11,4,9,263,289,582,907,1036,782,23,17,28,13,9,17,361,243,713,760,694,1142,24,19,15,10,9,5,399,237,650,651,720,984,21,21,22,17,14,17,402,236,725,777,700,1066,21,20,23,10,3,18,276,268,663,871,971,795,15,19,15,5,4,13,381,323,511,846,891,797,16,20,23,11,14,19,295,215,748,795,672,823,18,21,28,12,10,16,345,197,744,865,724,755,20,21,26,11,11,15,459,221,582,821,746,1050,27,16,30,11,9,8,319,235,633,652,970,826,24,24,33,10,8,15,293,445,789,865,1187,655,16,20,27,4,6,16,359,357,826,896,572,1278,19,19,23,12,8,10,396,236,644,665,557,714,5,25,25,15,15,18,3 +242,470,758,831,673,725,28,31,33,5,13,9,361,193,635,722,686,916,23,20,28,16,9,11,333,167,674,611,1017,769,24,26,24,8,11,12,149,101,842,896,880,968,14,12,14,9,1,1,220,134,818,896,970,780,9,4,24,10,2,8,228,234,635,814,1037,698,8,22,37,10,9,18,286,260,766,693,739,930,17,12,14,13,9,4,346,370,719,624,701,840,20,22,21,18,12,16,389,253,806,776,813,952,36,35,22,15,1,17,253,241,738,816,1006,857,0,20,16,8,4,6,360,336,584,757,910,591,1,23,36,8,12,12,254,372,823,814,679,685,19,30,27,9,12,9,294,368,779,864,717,605,21,26,25,14,9,14,390,336,549,744,783,836,12,19,29,12,11,9,294,320,688,553,947,746,9,25,32,7,10,16,212,452,848,812,1182,711,1,35,30,5,10,17,360,480,829,903,669,1082,34,34,22,11,4,11,413,279,723,678,698,798,12,10,26,12,13,17,3 +263,381,781,815,664,691,21,18,25,2,9,9,348,250,568,694,669,960,20,13,20,13,13,11,346,192,749,649,974,751,27,31,14,11,13,14,188,176,867,892,863,950,9,19,6,8,1,1,235,237,829,916,945,768,16,17,14,9,0,8,225,213,664,850,984,710,15,27,23,13,7,18,307,187,741,695,712,1002,26,17,6,10,7,4,367,317,690,618,656,876,23,21,11,17,10,16,310,262,715,770,802,978,27,20,12,10,7,17,286,212,761,826,971,809,9,17,26,5,0,8,355,279,607,799,871,659,10,24,22,9,10,14,279,261,846,792,642,683,12,21,27,8,10,11,355,321,834,858,666,641,16,17,19,11,15,14,387,291,580,760,756,910,21,10,19,9,13,9,311,299,703,613,900,756,18,30,22,6,12,16,279,407,879,846,1135,663,10,20,36,2,2,17,269,433,792,891,660,1144,27,19,12,10,12,11,372,248,740,668,695,738,7,23,22,13,11,17,3 +223,265,701,783,607,706,13,22,25,5,12,10,400,260,572,684,654,1031,16,17,26,12,14,8,376,342,739,651,1043,784,31,29,32,16,8,15,204,302,799,880,838,985,13,15,22,13,4,2,303,303,763,910,954,803,24,17,32,14,5,11,285,283,594,872,1085,763,23,25,35,14,8,21,351,295,707,699,729,1093,22,13,22,13,8,1,391,283,648,586,749,943,19,19,29,16,15,13,464,254,737,708,737,1037,23,22,30,13,8,18,286,306,675,852,1008,820,15,19,8,6,5,9,325,319,525,807,928,748,14,24,30,12,11,15,237,233,760,754,703,774,16,23,31,13,11,12,323,195,770,796,767,722,20,17,33,12,14,11,455,239,568,764,777,1001,25,14,37,14,8,12,337,243,641,615,1001,801,22,24,40,11,7,19,285,449,801,870,1224,676,14,24,24,5,7,20,395,395,812,847,601,1229,19,21,30,15,13,14,394,226,668,610,616,743,3,19,28,16,14,14,3 +189,271,760,653,623,708,24,17,15,5,10,15,394,452,525,584,670,903,19,10,30,14,14,7,398,260,766,607,1051,752,20,40,36,12,10,2,226,276,796,742,846,951,18,26,30,9,2,3,251,343,758,784,962,763,13,18,36,10,3,12,323,351,621,798,1093,681,12,36,23,12,10,10,359,381,682,569,745,973,13,18,30,11,10,0,413,425,629,452,765,825,16,24,37,18,13,12,428,428,696,580,749,935,38,21,38,11,14,13,302,188,750,836,1024,840,4,18,16,6,3,4,365,265,596,719,944,628,3,23,18,12,9,2,241,203,835,658,719,704,15,22,19,13,9,3,365,357,821,668,777,596,17,12,21,12,12,10,431,317,523,640,793,881,8,17,31,10,10,13,361,303,636,617,1017,729,5,37,28,11,9,10,267,321,852,898,1240,694,3,21,12,5,5,7,385,555,719,715,617,1109,30,20,38,11,17,13,362,308,745,498,624,781,16,24,20,14,14,13,3 +254,262,727,809,601,704,14,14,23,7,11,9,433,301,546,710,642,1059,19,21,24,10,13,11,403,317,693,689,1039,784,28,25,32,18,9,20,157,325,835,902,834,955,10,19,22,11,3,1,304,332,797,948,950,805,23,21,32,14,4,8,294,302,628,904,1081,783,22,21,31,16,9,18,362,280,733,735,721,1127,25,21,22,11,9,4,418,278,676,618,737,979,22,23,29,14,14,16,449,273,727,738,733,1059,18,18,30,11,7,17,235,263,695,870,1004,788,18,19,8,8,4,14,384,276,551,843,924,802,19,24,26,14,12,20,302,192,780,768,695,818,21,19,27,15,10,17,330,192,748,826,763,758,21,19,29,10,15,14,458,220,574,804,765,1055,30,14,37,12,9,9,360,212,677,653,989,831,27,28,36,13,8,16,264,406,825,868,1216,656,19,18,22,7,6,17,386,404,760,871,593,1277,20,17,30,13,12,11,381,245,676,632,612,677,6,27,28,18,15,17,3 +186,256,722,765,637,676,14,21,25,4,15,11,365,239,627,666,680,1023,13,20,26,11,13,7,353,369,646,649,1073,754,22,22,36,17,5,18,273,309,820,866,868,955,16,16,26,14,7,3,316,326,800,910,984,773,23,16,36,15,8,12,288,330,631,870,1115,743,22,18,33,15,5,22,322,334,784,697,757,1083,19,14,26,14,5,0,368,318,727,580,777,935,16,20,33,15,12,12,485,245,820,694,767,1023,22,21,34,14,7,19,315,351,696,856,1038,782,14,20,8,3,8,12,308,352,546,805,958,740,15,23,28,9,10,18,218,246,781,736,733,764,17,24,29,10,14,15,308,170,735,782,797,708,21,22,31,13,15,10,412,308,603,766,805,991,24,15,41,15,5,13,336,308,698,613,1029,785,23,23,38,8,4,20,296,488,812,858,1250,638,15,23,20,6,10,21,454,416,849,835,629,1223,20,22,34,16,10,15,343,265,685,594,646,705,2,20,24,15,11,13,3 +224,340,854,814,672,726,28,6,18,1,8,8,351,251,609,715,713,1025,23,21,19,10,12,10,327,247,778,702,1006,794,16,23,41,10,12,19,133,213,954,911,771,869,18,19,31,11,0,0,240,214,912,951,871,799,21,25,41,14,1,9,220,162,751,913,1058,817,20,19,28,12,8,19,280,220,828,738,802,1085,31,29,31,9,8,3,340,296,773,621,830,967,28,27,38,14,11,15,347,207,710,745,750,1047,14,18,39,9,12,16,241,221,826,879,1031,778,28,19,1,4,1,13,348,248,674,852,947,840,29,22,25,8,7,19,290,280,911,775,782,824,31,15,28,7,9,16,296,240,873,833,792,796,33,19,28,8,10,13,378,244,641,807,842,1079,36,22,40,10,12,10,282,228,792,664,1060,859,37,26,35,7,11,17,232,374,956,889,1199,682,29,18,27,1,3,18,304,414,813,884,660,1209,34,19,39,11,15,12,381,277,781,639,599,619,16,27,19,14,12,16,3 +265,283,719,869,659,702,17,19,26,3,14,8,402,242,558,762,680,1003,22,22,27,14,10,10,354,288,639,689,1037,776,31,24,27,10,12,19,120,258,825,956,878,979,13,20,17,9,0,0,255,277,787,982,974,795,26,22,27,10,1,9,257,249,618,910,1063,745,25,20,34,12,8,19,321,227,731,775,743,1047,28,18,17,11,8,3,367,241,672,674,723,915,25,20,24,18,11,15,412,212,773,816,799,1015,21,19,25,11,2,16,244,264,687,858,1018,824,17,22,13,6,1,13,393,289,535,849,926,706,16,21,29,10,11,19,299,215,772,838,699,728,18,18,30,11,9,16,275,211,734,904,745,694,22,18,28,12,10,13,429,205,546,832,785,955,27,15,32,10,12,10,317,219,667,649,971,783,24,27,35,9,11,17,207,407,815,872,1206,678,16,19,27,3,7,18,349,361,770,943,655,1193,17,18,25,11,7,12,434,248,676,710,682,749,9,24,29,14,12,16,3 +300,502,709,928,773,704,23,21,31,7,13,10,387,207,576,785,770,1005,28,32,16,14,9,12,369,157,657,698,967,778,33,12,10,10,11,15,83,75,801,979,928,981,7,4,0,7,1,2,228,198,769,967,1016,797,20,10,10,6,2,9,262,298,594,873,951,747,19,8,23,12,9,17,304,206,721,778,745,1047,30,24,0,11,9,5,396,362,668,739,631,917,31,20,7,12,12,17,341,291,795,891,917,1017,23,33,8,7,1,18,311,239,687,793,992,826,13,30,30,10,4,9,426,406,533,826,888,708,14,21,28,14,12,15,314,372,772,901,647,728,16,22,27,13,12,12,288,424,728,979,743,696,20,34,25,10,9,15,400,340,504,815,809,955,25,25,15,10,11,8,332,348,643,612,853,785,22,15,18,3,10,15,286,496,805,851,1112,680,14,33,42,5,10,16,270,468,774,1000,777,1195,23,32,8,9,4,10,463,289,638,789,832,751,15,14,32,8,13,18,3 +338,376,911,755,703,727,30,22,23,11,9,11,389,279,608,660,752,1082,29,11,24,20,13,11,341,185,783,635,1051,807,22,31,34,8,13,6,115,209,959,850,816,978,8,23,24,1,1,1,208,182,923,876,916,828,13,21,34,4,0,8,260,188,772,840,1103,806,14,27,33,6,7,14,278,218,809,663,831,1150,37,19,24,17,7,4,382,312,768,550,859,1002,34,21,31,24,10,16,341,275,741,684,795,1082,14,16,32,17,11,17,303,175,899,802,1076,811,22,11,6,14,0,0,432,228,745,773,992,825,23,18,28,18,8,6,352,292,984,722,811,841,25,23,29,17,10,3,246,292,900,772,837,781,29,9,31,18,11,14,388,226,576,730,881,1078,34,16,39,16,13,9,326,198,795,605,1103,854,31,28,38,13,12,14,274,350,1003,888,1244,679,23,18,24,9,2,11,260,430,690,819,699,1300,36,23,32,15,14,13,493,269,842,582,644,700,16,23,26,16,11,17,3 +202,304,743,835,602,717,16,19,28,3,13,8,369,233,600,734,643,992,17,20,29,10,9,10,355,281,703,635,1040,791,28,24,27,14,11,17,155,231,845,924,835,950,12,18,17,11,1,0,226,254,811,924,951,818,21,18,27,12,2,9,246,228,638,850,1082,768,20,20,36,16,9,19,310,242,753,723,722,1042,23,16,17,11,9,3,370,258,700,630,738,918,20,18,24,14,12,15,379,211,789,772,734,1014,22,19,25,11,3,16,231,263,715,862,1005,823,14,24,13,4,2,11,356,290,561,793,925,729,15,21,31,10,12,17,246,250,800,808,696,735,17,20,30,11,8,14,336,212,790,860,764,715,21,20,28,10,11,13,406,220,586,774,766,978,26,13,32,12,11,10,310,232,689,595,990,804,23,27,35,9,10,17,212,418,823,822,1217,697,15,21,27,3,6,18,354,378,830,903,594,1202,22,18,25,13,8,12,365,251,708,670,613,690,4,22,29,16,13,16,3 +243,341,716,838,684,696,12,19,37,8,13,9,404,278,613,721,703,1065,17,36,26,13,9,9,414,308,648,676,1038,776,24,10,22,7,9,22,200,232,836,915,885,975,12,6,12,10,3,1,301,281,816,937,969,795,25,14,22,11,4,12,355,327,651,875,1078,775,24,6,35,9,9,20,353,315,782,718,768,1135,23,28,12,14,9,6,421,349,721,635,748,977,20,20,19,9,14,14,452,294,810,787,810,1059,14,31,20,12,3,17,304,286,662,813,1033,788,22,32,18,9,4,18,371,371,538,820,941,790,23,21,40,7,14,24,327,257,747,809,718,816,21,20,25,6,10,21,305,265,699,875,760,748,19,32,25,15,11,16,425,335,583,779,810,1043,28,29,27,13,9,11,415,341,710,620,996,819,31,13,30,6,8,18,323,483,792,833,1225,648,23,31,32,8,6,19,397,471,805,912,676,1271,18,30,20,12,8,13,352,274,611,679,671,707,10,16,24,7,15,15,3 +188,314,709,820,587,761,15,17,25,3,9,8,391,179,638,723,632,1064,14,20,24,12,13,10,331,307,681,680,987,835,23,24,32,14,11,15,193,239,803,913,782,958,19,16,22,11,1,0,322,264,767,939,898,860,26,16,32,12,2,9,260,296,600,883,1029,838,21,20,33,14,9,19,332,266,761,726,713,1128,22,18,22,11,9,3,372,294,694,615,737,998,19,24,29,14,12,15,461,205,769,753,695,1082,25,23,30,11,7,16,269,311,687,863,966,837,21,14,8,4,2,9,338,378,541,826,890,843,18,23,30,6,12,15,246,272,772,795,693,845,18,22,31,5,8,12,318,222,742,841,735,801,22,20,33,10,15,13,426,312,628,789,759,1092,27,15,37,12,11,10,280,316,643,634,983,876,24,27,40,5,10,17,306,496,809,893,1186,721,18,21,26,3,4,18,404,392,896,888,579,1272,21,22,30,13,12,12,377,289,652,653,566,692,3,22,28,10,13,16,3 +295,375,710,896,665,728,15,22,27,5,13,8,362,204,553,779,684,1029,20,23,24,12,9,10,312,212,700,708,1013,802,33,23,24,12,11,15,106,180,804,971,872,1005,9,15,14,9,1,0,231,191,768,995,972,821,22,17,24,8,2,9,221,209,599,919,1031,771,21,19,33,14,9,19,303,183,698,780,731,1075,26,17,14,9,9,3,333,275,645,701,693,941,23,23,21,16,12,15,392,208,728,853,807,1041,23,26,22,9,3,16,224,252,688,855,1002,850,13,17,16,8,2,9,381,325,536,864,908,734,14,22,30,12,12,15,317,293,773,871,671,756,16,25,29,11,8,12,273,289,779,941,713,720,20,19,25,10,11,13,415,263,541,841,779,983,25,18,29,8,11,10,273,285,644,660,939,809,22,24,32,9,10,17,217,447,810,905,1178,704,14,22,34,3,6,18,321,391,789,968,663,1219,21,25,22,7,8,12,412,266,681,747,694,775,7,21,24,16,13,16,3 +225,343,740,745,624,712,17,27,20,6,11,11,400,288,573,640,669,1081,22,16,27,17,13,7,420,308,686,633,1024,792,29,28,27,11,9,14,220,234,844,834,803,991,9,16,19,10,3,3,301,279,808,880,915,811,22,6,27,11,4,12,353,321,637,838,1070,791,21,24,28,9,9,22,365,325,742,669,742,1151,28,8,19,14,9,0,423,371,687,556,766,993,25,18,24,17,14,12,384,300,756,688,742,1075,17,31,25,14,7,19,340,284,712,852,1017,804,19,14,13,9,4,8,391,361,560,773,935,806,20,19,23,7,12,14,347,255,797,728,718,832,22,32,24,8,10,11,335,265,749,776,768,764,24,22,26,15,15,10,435,325,547,734,794,1059,31,15,32,13,9,13,411,325,686,591,1018,835,28,29,33,6,8,20,363,475,840,852,1235,664,20,31,23,6,6,19,351,493,767,815,620,1287,21,30,25,12,12,15,346,262,679,590,597,723,9,14,27,11,15,13,3 +281,537,808,984,744,705,22,32,30,12,15,11,300,218,635,813,715,812,17,21,15,9,11,13,294,210,756,782,842,725,22,15,9,9,13,8,230,146,860,1007,853,914,20,11,1,8,1,3,243,249,836,997,935,718,15,7,9,7,0,10,197,369,663,883,810,632,14,13,22,7,7,16,249,229,764,818,668,838,11,13,1,10,7,6,303,375,723,825,578,750,14,23,6,5,10,18,308,290,818,977,878,860,40,36,7,8,1,19,234,242,796,813,875,837,6,19,31,13,2,2,309,443,642,856,771,539,5,24,27,11,10,8,293,399,881,985,596,667,13,33,26,10,10,5,399,481,859,1065,704,537,15,35,24,9,11,16,339,317,519,835,722,746,6,20,14,9,13,7,241,315,698,640,702,690,3,18,17,6,12,14,245,511,892,955,967,697,5,36,41,12,8,13,295,415,825,1058,746,984,28,35,7,8,6,11,334,330,791,881,827,796,18,7,27,5,11,19,3 +293,449,760,875,688,725,26,22,30,6,13,8,408,230,589,754,707,1000,31,25,17,17,9,10,378,166,660,665,1036,793,30,19,15,7,11,13,144,106,848,944,895,998,4,7,5,4,1,0,227,185,812,946,995,812,15,9,15,5,2,9,279,223,645,870,1054,752,14,15,28,9,9,19,321,239,742,741,754,1032,27,17,5,14,9,3,399,373,689,674,716,914,30,23,12,17,12,15,422,270,802,826,830,1018,26,32,13,12,3,16,238,228,736,838,1025,853,10,23,25,9,2,7,395,321,582,817,931,695,11,26,31,13,12,13,309,329,821,852,694,713,17,29,26,12,8,10,307,365,765,914,736,689,19,27,24,15,11,13,431,347,513,790,802,940,22,24,20,13,11,10,347,335,686,611,962,792,19,22,23,6,10,17,215,433,856,866,1201,705,11,32,41,6,6,18,357,499,767,949,686,1184,28,31,13,12,8,12,410,298,683,726,717,780,18,15,31,13,13,16,3 +223,301,798,720,574,728,19,19,20,3,10,11,394,326,519,633,619,1003,22,10,21,12,14,7,370,218,782,682,1012,796,29,36,35,16,10,6,152,236,850,809,807,1001,7,22,25,13,2,3,281,283,810,873,923,815,18,18,35,14,3,12,275,265,663,885,1054,755,17,32,28,14,10,14,335,275,700,670,694,1039,28,16,25,13,10,0,377,341,655,551,716,917,25,22,32,16,13,12,430,316,660,663,706,1021,25,21,33,13,14,15,248,194,786,847,977,856,11,16,7,4,3,4,335,287,632,806,897,700,12,23,23,10,9,6,297,209,871,709,668,720,14,22,24,11,9,3,301,251,843,751,736,692,18,12,26,12,12,10,437,277,567,729,744,947,23,13,36,14,10,13,341,275,686,666,968,795,20,33,33,9,9,14,277,381,894,949,1189,708,12,21,21,5,5,11,359,461,737,790,568,1187,25,20,33,15,17,15,372,268,763,563,587,783,9,22,25,16,14,13,3 +202,408,743,808,640,675,19,26,19,7,13,9,359,251,596,693,661,976,24,27,22,18,9,9,341,223,667,674,1018,749,29,19,26,6,9,16,193,147,843,885,859,952,7,7,16,9,3,1,278,210,807,937,955,768,20,7,26,10,4,10,266,272,636,871,1044,718,19,15,25,8,9,20,296,274,751,712,724,1018,30,19,16,15,9,2,350,362,698,619,704,888,27,21,23,16,14,14,413,269,807,765,780,988,23,32,24,15,3,17,255,235,719,859,999,797,13,25,14,10,4,10,330,362,565,818,907,679,14,26,20,8,14,16,284,300,804,795,680,699,16,25,31,7,10,13,296,326,748,853,726,667,20,29,27,16,11,12,392,324,538,783,766,926,25,22,31,14,9,11,326,330,685,622,952,756,22,22,30,7,8,18,280,466,833,887,1187,651,14,32,30,7,6,19,384,480,782,882,636,1166,23,31,24,13,8,13,315,273,668,663,663,722,11,15,24,10,15,15,3 +233,225,628,775,577,698,13,19,22,5,13,9,438,230,539,672,616,1023,18,18,23,12,15,9,382,400,700,671,1013,776,33,22,33,16,7,16,256,344,726,866,808,977,15,18,23,13,5,1,351,371,690,926,924,795,28,18,33,14,6,10,303,305,521,894,1055,755,27,18,30,14,7,20,377,335,666,715,695,1083,24,18,23,13,7,2,415,257,597,596,711,935,21,22,30,16,14,14,502,234,736,714,713,1029,27,21,31,13,9,17,292,374,604,858,978,812,19,12,7,6,6,10,359,327,456,829,898,740,18,21,25,12,12,16,251,243,689,748,669,764,12,24,26,13,12,13,357,147,705,802,737,714,16,20,28,12,15,12,473,251,527,782,739,991,21,15,38,14,7,11,335,257,568,637,963,793,18,25,35,11,6,18,301,459,730,878,1190,668,18,19,21,5,8,19,447,375,791,845,571,1223,15,22,31,15,14,13,374,236,603,610,594,735,7,22,27,16,13,15,3 +273,435,663,901,719,700,20,19,32,6,12,11,346,206,546,762,730,981,19,24,15,13,14,13,274,182,697,703,959,760,20,22,11,11,6,10,180,152,731,954,890,963,18,10,1,8,6,3,307,241,699,974,976,777,21,14,11,7,7,10,173,291,538,898,955,709,20,18,24,13,12,16,279,149,667,751,731,1051,13,18,1,10,2,6,311,291,614,720,645,893,16,26,8,15,5,18,414,282,727,872,851,981,38,29,9,10,10,19,288,226,647,828,980,830,12,18,29,9,7,4,367,363,493,849,880,706,11,21,29,13,15,10,285,313,732,886,643,732,11,28,28,12,11,7,269,375,728,960,691,670,13,22,26,11,12,16,387,289,506,804,789,959,8,21,16,9,6,7,217,315,573,641,877,751,5,25,19,4,5,14,291,453,755,904,1124,682,11,27,43,4,11,15,339,425,778,975,719,1187,22,28,9,8,9,11,432,250,644,770,760,761,16,18,35,11,10,19,3 +328,422,736,859,675,731,25,28,33,4,12,8,425,247,533,744,688,1032,30,17,22,15,10,10,399,165,648,653,1023,805,33,29,22,9,12,11,123,127,814,922,886,1008,5,15,12,6,0,0,228,206,780,922,976,824,18,7,22,7,1,9,306,252,613,850,1041,774,17,25,35,11,8,19,342,240,706,719,741,1074,28,9,12,12,8,3,418,352,653,656,703,944,31,19,19,17,11,15,419,275,750,808,819,1044,25,32,20,12,4,16,277,181,718,822,1012,853,11,17,18,7,1,5,438,320,564,795,916,735,12,20,36,11,11,11,330,298,803,842,685,755,16,33,25,10,9,8,306,360,747,896,723,723,18,23,23,13,12,13,446,306,489,768,785,982,23,16,27,11,12,10,370,306,652,593,949,812,20,28,30,6,11,17,218,414,832,874,1188,707,12,32,36,4,5,16,326,476,715,931,673,1222,25,31,20,10,9,12,455,249,691,710,706,778,17,13,24,13,12,16,3 +265,537,776,926,725,775,30,29,32,12,15,9,346,208,619,771,732,938,25,24,15,9,11,11,322,166,664,720,949,811,22,18,11,5,13,10,148,134,858,965,886,1008,12,8,1,8,1,1,227,197,830,975,986,818,7,4,11,9,0,8,229,365,653,895,939,730,6,14,24,7,7,18,267,325,766,768,715,936,19,16,1,12,7,4,339,421,719,751,619,866,22,26,8,5,10,16,350,302,762,903,865,980,34,39,9,8,1,17,226,284,758,837,966,907,2,22,29,13,2,4,343,445,604,854,868,609,3,27,29,9,10,10,319,427,843,913,623,727,21,30,28,8,10,7,319,441,785,991,697,631,23,32,26,7,11,14,371,433,531,803,781,838,14,23,16,13,13,9,285,433,700,642,843,784,11,21,19,8,12,16,247,511,870,919,1098,763,3,39,43,12,8,15,319,393,811,998,727,1098,36,38,9,14,6,11,370,400,713,807,780,854,14,10,35,7,11,17,3 +261,387,712,822,728,727,21,28,30,1,10,9,412,238,555,707,735,1024,22,15,27,10,12,11,350,220,726,656,1036,795,23,31,27,14,12,10,168,194,782,899,927,996,15,17,17,11,0,1,279,265,746,905,1007,814,20,9,27,10,1,8,257,271,587,847,1046,764,19,27,40,16,8,18,355,249,698,698,776,1084,16,7,17,9,8,4,377,343,633,619,720,938,19,17,24,14,11,16,460,270,734,769,864,1036,37,30,25,9,6,17,258,242,694,811,1033,843,11,17,13,4,1,4,373,343,540,786,933,739,10,18,37,8,11,10,279,289,779,803,706,765,12,31,30,7,9,7,331,309,773,857,730,709,14,21,28,8,14,14,463,355,523,751,822,992,11,14,32,10,12,9,305,361,618,598,964,808,8,28,35,5,11,16,235,443,806,883,1201,697,10,30,31,1,3,15,385,455,783,898,726,1220,23,29,25,11,11,11,434,298,687,671,757,768,13,13,25,12,12,17,3 +315,449,734,860,666,646,26,25,31,5,14,9,324,236,543,729,669,863,21,16,12,14,14,7,338,148,742,654,922,690,16,22,10,10,16,8,280,136,790,921,845,889,20,16,0,7,4,3,257,193,756,939,931,703,11,12,10,6,3,8,243,295,599,843,918,631,10,18,23,12,10,16,303,199,686,718,676,915,15,16,0,11,10,4,347,355,627,673,588,783,18,20,7,16,9,12,338,308,728,825,812,889,34,31,8,11,4,17,306,200,722,811,935,766,6,14,30,8,3,4,359,311,568,794,831,574,5,25,28,12,9,8,359,333,807,845,596,620,17,28,27,11,13,5,437,435,789,913,646,554,19,28,25,12,14,10,365,297,497,771,728,825,10,19,15,10,16,9,297,299,626,616,824,683,7,25,18,5,15,16,295,393,828,867,1075,622,5,31,42,3,7,13,327,487,755,932,670,1055,32,30,8,9,7,11,322,252,711,731,719,705,18,14,24,12,10,13,3 +202,364,866,710,626,660,28,18,14,14,11,13,317,303,615,643,635,995,33,33,17,11,9,9,273,157,710,598,968,736,26,17,11,1,5,0,239,187,840,769,827,927,4,17,23,4,11,13,246,250,810,785,915,761,11,19,11,5,12,12,238,244,697,769,1002,739,10,15,10,1,5,2,276,300,686,566,676,1055,35,27,17,16,3,8,374,422,647,513,658,907,36,25,16,7,6,14,369,319,688,665,772,995,18,24,17,4,13,15,343,159,870,845,949,750,18,21,21,17,8,2,344,294,716,700,857,736,19,26,15,13,2,4,226,266,955,737,630,738,21,19,10,12,10,1,322,352,913,753,684,702,25,25,8,5,9,12,310,362,533,627,720,983,30,28,10,15,5,11,252,340,696,636,910,775,27,14,5,14,4,4,352,338,940,911,1139,620,19,24,25,14,10,3,364,540,781,778,626,1199,32,23,13,12,10,9,357,327,823,587,661,671,20,21,15,13,9,15,4 +259,339,802,700,599,662,24,9,10,16,9,10,300,288,649,649,592,1025,27,36,21,7,11,20,284,312,616,566,943,742,20,14,11,5,13,11,294,298,816,731,778,935,14,22,21,8,9,12,241,291,760,721,866,763,19,30,11,9,10,17,221,205,705,683,985,741,20,18,2,3,9,9,251,307,656,536,633,1095,33,42,21,12,13,17,343,271,601,521,645,937,30,24,14,3,10,19,338,238,668,667,739,1019,14,23,13,8,17,12,346,264,806,767,910,748,28,24,23,13,0,9,243,197,660,622,828,762,29,27,7,9,6,15,205,273,891,737,599,776,21,10,8,8,10,10,363,249,843,755,667,718,25,18,10,7,11,21,299,153,577,567,675,1013,30,37,6,11,13,14,291,127,702,564,893,789,27,11,3,10,12,7,337,343,930,845,1120,614,29,15,21,16,2,8,299,393,743,764,601,1235,28,22,13,10,14,10,368,222,761,623,662,667,22,24,21,9,13,18,4 +245,459,907,945,760,739,31,31,26,15,14,11,182,232,756,812,775,966,32,20,21,14,12,7,174,128,729,795,964,773,21,18,31,2,6,8,282,122,969,1018,723,776,15,16,21,5,6,3,243,147,931,1024,809,734,20,6,31,6,7,12,117,255,780,976,1024,850,21,18,36,0,6,16,159,279,885,815,896,1014,40,12,21,19,6,0,221,409,830,746,932,916,37,18,28,10,13,12,322,330,799,898,762,984,13,31,29,5,6,17,266,204,891,860,1025,739,29,18,9,18,7,4,209,283,737,915,941,891,30,19,33,12,11,8,259,335,976,914,878,803,32,34,34,11,13,5,303,433,902,986,830,843,36,32,32,8,14,10,231,313,648,868,900,1064,41,15,36,18,6,13,191,311,805,753,1100,860,38,15,39,13,5,16,299,367,1005,1044,1143,685,30,31,37,15,9,13,337,521,942,1025,726,1098,37,34,29,15,9,15,306,296,836,788,629,558,17,10,19,12,12,13,4 +344,342,961,665,639,779,36,14,11,11,11,9,405,327,712,630,646,962,31,31,20,14,13,15,333,189,815,555,977,823,16,19,10,4,15,10,219,235,941,722,830,1028,12,21,20,1,9,11,200,210,905,742,916,838,1,23,10,0,10,8,250,168,836,724,1015,756,0,17,3,6,9,8,284,246,721,527,679,976,25,31,20,17,13,14,414,364,704,460,671,888,28,27,13,10,10,16,407,325,725,610,787,998,28,18,12,5,15,17,331,183,965,802,954,903,8,21,28,14,2,8,408,200,811,655,864,649,9,28,8,18,8,14,258,270,1050,702,637,729,27,11,7,17,12,9,322,278,972,698,697,663,29,17,9,8,13,14,380,272,598,586,723,884,20,30,5,16,15,7,314,242,833,593,923,804,17,16,2,9,14,6,254,330,1077,870,1150,767,9,16,22,9,0,7,346,486,754,727,641,1134,42,17,12,15,12,9,481,307,908,576,680,842,20,29,22,10,11,17,4 +229,353,963,650,605,683,32,9,7,17,8,12,364,340,640,619,620,958,33,36,26,14,12,10,308,170,773,598,1009,751,20,14,18,4,12,1,224,214,921,711,818,958,8,16,30,7,10,16,229,229,893,739,920,776,5,22,18,8,11,11,229,201,788,757,1051,716,4,12,9,2,10,1,299,309,727,528,691,992,29,36,26,19,14,11,361,431,716,479,707,872,32,24,23,10,11,15,410,338,673,595,751,976,24,21,24,7,18,16,258,160,967,841,974,811,12,24,22,16,1,1,345,253,813,688,894,659,13,29,14,10,7,5,199,297,1052,683,665,671,23,10,5,9,9,0,355,335,990,683,733,651,25,22,5,8,10,13,389,335,558,587,735,904,24,37,17,18,12,10,267,305,781,656,959,754,21,11,12,11,11,3,231,309,1027,927,1186,665,13,21,16,17,3,2,405,549,692,712,605,1142,38,22,20,15,15,8,382,322,922,523,640,738,20,24,16,10,14,16,4 +269,223,847,701,661,685,21,11,11,15,8,5,344,406,622,616,708,1014,26,34,22,6,12,19,348,246,673,603,1083,759,27,16,16,6,12,10,282,302,921,758,870,896,15,22,28,9,6,13,199,353,855,780,984,780,20,28,16,10,7,12,283,315,760,774,1127,772,21,14,17,4,10,8,301,313,745,567,783,1080,32,36,22,9,10,14,393,329,688,518,803,942,29,20,21,2,11,14,352,376,643,664,787,1020,21,19,22,9,18,11,354,150,803,820,1062,749,23,22,26,14,1,8,297,195,687,705,982,795,22,27,18,8,7,14,191,155,888,722,757,787,18,8,7,7,9,9,397,279,842,752,815,751,22,18,5,8,10,16,367,245,660,626,831,1040,27,33,15,10,12,11,347,229,775,651,1055,818,24,13,12,9,11,8,323,247,925,922,1278,639,22,17,20,15,3,7,337,463,830,773,655,1242,25,20,18,11,15,5,392,310,748,586,640,610,13,24,8,8,14,13,4 +293,333,842,733,669,713,29,8,17,15,3,11,370,310,521,638,688,1032,28,33,16,4,7,11,268,184,692,569,1039,783,15,17,8,4,11,2,256,214,820,770,876,962,23,17,20,7,11,9,309,267,788,768,976,804,18,25,8,8,12,10,229,239,675,726,1081,790,19,15,15,2,11,0,309,269,664,571,735,1092,22,39,16,7,11,4,367,381,631,548,737,948,25,27,13,0,6,16,448,316,590,700,811,1034,31,20,14,7,13,17,352,170,844,776,1010,791,23,21,28,12,6,0,339,255,690,661,924,787,22,32,20,10,6,6,201,221,929,758,695,787,20,9,11,9,4,1,339,299,863,788,763,757,22,21,9,6,5,14,399,317,557,608,783,1032,17,34,7,8,11,9,267,301,676,591,989,824,14,14,10,11,12,2,309,339,918,866,1216,673,22,20,26,15,8,1,397,499,703,801,667,1240,27,19,10,9,10,9,434,314,801,626,698,708,17,27,14,10,13,17,4 +344,402,1015,707,667,814,38,19,15,11,15,10,289,337,742,662,686,1027,33,34,20,18,13,12,229,91,773,579,1017,858,14,12,10,2,5,3,235,141,963,772,874,1057,14,16,20,1,7,14,262,198,939,776,974,871,1,18,10,2,8,9,214,238,840,754,1049,799,2,12,15,4,5,1,226,314,779,575,733,1039,27,26,20,19,5,9,302,476,756,500,707,951,30,24,13,14,12,17,375,381,685,652,809,1057,26,27,12,9,7,18,371,193,1019,822,1004,934,10,24,32,14,8,1,362,252,865,687,910,710,11,21,14,16,10,7,302,304,1104,740,675,766,29,20,13,15,14,2,240,414,1012,740,731,712,31,22,9,12,15,15,290,358,630,622,781,947,22,27,7,18,5,8,284,334,833,587,957,849,19,15,10,11,4,1,310,322,1079,874,1188,790,11,21,22,11,10,0,360,594,858,769,665,1197,44,26,12,17,10,10,431,361,964,610,696,873,24,20,14,10,11,18,4 +311,377,927,727,693,653,31,15,17,14,8,12,324,304,612,610,736,1004,32,34,18,5,12,10,266,138,715,607,1113,731,17,16,16,1,12,1,258,166,895,782,900,914,17,16,28,2,8,12,217,211,863,792,1014,750,16,20,16,3,9,11,227,229,758,776,1157,742,17,14,19,3,10,1,243,281,715,599,815,1074,32,30,22,10,12,7,369,383,692,560,833,924,35,26,21,5,11,15,368,314,575,698,817,1004,23,23,22,2,18,16,334,180,931,830,1088,733,25,22,26,11,1,1,317,231,777,707,1010,761,26,29,24,15,7,5,191,277,1016,730,791,765,22,16,9,14,9,0,345,337,932,786,851,719,24,24,7,1,10,13,325,279,602,634,859,1004,27,31,15,9,12,10,271,251,757,665,1083,782,24,13,14,12,11,3,297,339,1001,932,1304,605,26,23,24,12,3,2,365,509,752,803,685,1220,31,22,18,6,15,8,450,272,880,602,692,646,19,24,8,11,14,16,4 +308,354,917,710,626,663,32,16,15,13,11,11,377,291,692,655,633,998,37,37,16,10,9,13,299,199,679,584,984,743,22,13,6,6,3,4,269,213,849,755,817,926,12,13,18,3,15,17,240,196,835,765,905,766,11,15,6,2,16,10,262,204,740,747,1026,736,12,11,7,8,9,2,276,270,669,572,674,1068,33,29,16,15,9,12,442,356,666,531,682,916,36,25,11,10,10,18,421,295,643,673,774,1002,16,24,12,3,15,19,423,169,921,821,953,759,20,25,22,16,16,2,398,224,767,678,869,733,21,26,12,20,10,8,204,274,1006,735,640,749,23,17,11,19,10,3,294,292,920,761,708,701,25,25,9,4,9,16,310,232,548,609,716,984,28,30,5,14,3,7,280,214,731,630,934,776,27,10,2,9,4,0,350,352,977,905,1161,627,21,24,26,11,18,1,384,480,746,778,628,1210,32,23,8,11,18,11,495,231,866,597,667,672,24,21,18,12,17,19,4 +317,415,818,782,636,685,29,24,21,8,9,12,352,236,519,669,675,846,30,23,12,15,13,6,316,172,746,762,1072,703,25,23,34,15,11,5,348,142,868,857,867,824,15,23,28,18,3,4,301,173,828,895,983,714,12,19,34,19,4,13,247,191,685,927,1114,708,13,25,23,13,11,13,351,235,716,696,754,852,24,23,28,18,9,1,311,359,667,625,770,774,27,25,35,11,12,11,480,254,678,741,772,882,29,24,36,18,15,14,238,208,806,865,1037,749,11,11,8,5,2,5,251,291,652,860,957,659,10,22,28,1,8,5,265,311,891,771,728,617,20,25,21,2,8,4,417,321,845,829,796,659,22,25,21,17,11,9,433,329,549,751,798,846,19,24,33,19,11,14,295,307,706,756,1022,726,16,24,28,12,10,13,225,413,916,1041,1249,665,10,24,30,10,4,10,493,477,709,858,630,992,31,25,36,20,16,16,382,282,765,641,653,634,21,15,12,9,13,12,4 +333,395,882,683,661,777,32,19,15,10,16,7,296,242,739,648,668,1024,29,40,16,11,14,17,274,172,680,517,967,837,16,6,6,3,2,12,236,174,884,724,852,1040,8,10,16,0,10,9,243,173,852,726,938,854,9,18,6,1,11,10,259,209,765,696,1001,786,10,6,7,5,4,10,235,241,820,527,691,1046,35,32,16,16,4,12,401,357,763,478,659,940,32,18,9,7,9,14,378,270,760,630,809,1048,18,33,8,2,10,15,428,208,886,774,954,907,18,30,34,15,11,10,369,287,732,625,856,711,19,19,12,17,7,16,255,299,971,724,629,747,23,20,11,16,15,11,249,325,909,718,687,711,29,28,9,5,14,14,267,289,585,568,739,954,30,33,1,15,2,9,329,271,766,535,909,828,27,9,2,10,1,8,351,407,1006,814,1140,759,19,27,26,10,13,9,311,477,827,743,663,1202,38,32,8,12,13,7,456,264,833,600,702,838,16,14,18,9,12,15,4 +192,300,833,661,650,711,22,11,8,16,8,5,313,347,672,610,675,994,25,34,29,13,12,9,359,229,751,609,1060,781,14,16,19,3,12,10,299,273,935,728,869,968,10,16,31,6,8,11,184,318,915,760,977,810,15,20,19,7,9,2,300,302,740,774,1102,760,16,14,10,1,10,8,296,332,797,547,746,1034,31,34,29,18,12,14,360,430,748,474,758,910,28,26,24,9,11,8,313,361,767,606,790,1008,12,23,25,6,18,9,397,211,801,838,1025,817,24,22,25,17,1,8,328,302,647,707,945,721,25,29,13,11,7,14,232,242,886,690,716,725,27,12,4,10,9,9,338,324,834,694,784,709,29,24,4,7,10,6,346,374,612,612,790,968,36,35,18,17,12,3,360,362,803,659,1010,794,33,13,13,12,11,10,358,330,919,930,1237,689,25,23,13,16,3,9,330,548,830,727,646,1190,28,22,21,14,15,5,357,333,750,536,673,738,14,24,15,11,14,9,4 +310,418,1051,685,819,631,37,23,14,11,17,12,299,341,728,574,832,994,34,30,19,12,15,10,231,93,805,589,1049,711,15,20,15,2,3,1,235,155,1003,746,856,904,13,20,27,1,9,16,228,170,979,762,922,732,14,20,15,2,10,11,214,206,878,758,1107,716,15,18,20,4,3,1,178,304,789,567,917,1064,40,24,21,17,9,11,348,434,796,514,923,906,39,22,20,8,14,15,311,377,667,650,879,988,19,19,21,3,11,16,371,179,1055,810,1080,717,23,18,27,14,10,1,304,234,901,689,1010,739,24,25,21,16,8,5,224,310,1140,696,875,745,28,14,10,15,16,0,280,392,1040,738,885,695,30,24,8,6,15,13,240,300,640,608,941,986,35,25,14,16,3,10,290,274,873,641,1145,762,32,17,15,11,2,3,356,334,1119,912,1190,583,24,25,23,11,12,2,272,566,806,765,807,1202,43,18,17,13,16,8,429,329,998,564,750,636,21,18,7,10,11,16,4 +245,447,908,637,654,679,34,20,3,16,5,17,260,302,637,572,685,854,29,29,32,13,3,5,248,202,738,611,1078,697,10,21,26,3,9,4,378,188,910,720,881,898,18,15,38,6,11,9,271,223,872,752,989,704,5,11,26,7,12,12,235,273,751,774,1120,630,6,19,13,1,9,6,301,395,798,541,760,894,23,25,32,18,9,4,323,513,755,472,776,768,26,31,31,9,6,10,454,338,702,582,790,866,24,32,32,6,11,11,364,248,904,846,1043,787,14,17,18,17,12,6,299,341,750,703,963,599,15,26,10,11,6,0,227,375,989,654,734,629,25,21,11,10,4,5,341,421,913,670,802,573,27,23,11,7,3,8,287,449,619,604,804,824,18,26,25,17,9,13,225,425,758,679,1028,684,15,18,20,12,10,8,327,395,990,944,1255,663,15,32,10,16,14,7,475,597,841,711,648,1046,40,31,28,14,14,13,328,372,857,500,671,744,26,19,12,11,13,11,4 +230,322,728,718,606,672,23,15,15,13,4,15,361,337,503,677,611,1041,28,34,16,2,6,7,325,303,636,542,932,752,19,16,6,2,10,2,273,289,712,755,787,951,15,16,16,5,14,13,324,332,684,753,873,771,20,22,6,6,15,14,312,340,565,719,974,751,19,14,7,0,10,4,334,332,588,566,626,1111,22,30,16,7,10,8,414,348,529,527,630,953,25,24,9,2,7,12,425,323,614,677,754,1035,27,21,8,5,12,13,395,253,732,801,901,764,21,22,28,10,13,4,410,342,586,654,817,766,22,25,12,12,7,2,276,244,817,757,590,792,14,16,11,11,3,3,312,264,779,765,660,724,16,24,9,4,4,10,356,274,487,597,670,1019,17,31,1,6,10,13,302,278,566,580,882,795,16,13,2,13,11,6,402,440,806,857,1109,624,22,21,26,13,15,5,406,478,713,782,610,1247,23,20,8,7,15,11,379,257,699,651,653,683,21,24,18,12,16,13,4 +286,328,905,734,638,671,28,9,11,14,8,11,401,267,584,661,649,1038,33,36,20,7,12,13,339,231,753,612,990,751,20,14,10,7,12,4,257,245,841,761,835,948,18,18,20,10,6,17,282,240,823,759,913,770,15,26,10,11,7,10,218,200,728,739,1028,752,16,14,3,5,10,2,318,248,627,566,706,1108,27,40,20,12,10,12,394,302,632,551,704,950,30,24,13,3,11,18,405,249,557,701,768,1032,26,23,14,10,18,19,317,231,909,809,977,761,22,24,20,13,1,2,328,228,755,676,891,769,21,29,8,7,7,8,194,252,994,769,674,789,19,10,7,6,9,3,352,228,934,789,722,727,21,20,9,9,10,16,420,220,564,601,752,1020,22,37,7,11,12,7,270,206,719,606,956,796,19,11,2,8,11,0,290,358,965,889,1181,623,21,19,22,14,3,1,360,422,632,798,638,1244,28,22,12,12,15,11,407,241,868,635,661,680,20,24,18,7,14,19,4 +363,407,826,861,701,667,35,20,32,11,15,10,330,292,705,736,706,1018,32,39,1,8,11,10,338,148,658,657,959,741,17,11,11,4,7,5,282,142,830,906,882,928,19,7,11,1,5,16,239,237,802,898,968,762,14,17,11,0,6,9,345,275,665,818,979,758,13,7,24,6,7,7,253,287,806,709,713,1088,30,31,5,13,7,11,355,445,743,680,635,930,29,23,8,8,14,9,380,348,744,832,849,1012,17,32,9,1,5,10,450,176,824,844,972,741,21,31,29,14,6,7,411,319,670,769,868,781,22,24,29,18,12,7,367,311,909,876,627,769,30,21,28,17,12,6,239,417,825,920,697,737,28,33,26,2,13,7,285,379,593,740,765,1022,33,32,16,12,7,8,433,365,688,635,887,800,30,14,19,9,6,9,365,335,904,920,1116,623,22,32,43,13,8,8,337,563,893,937,705,1228,29,31,9,9,8,6,418,334,773,748,748,660,27,19,21,10,13,10,4 +342,408,908,771,653,715,32,16,22,12,16,10,331,239,593,652,676,1016,33,39,15,1,14,12,255,171,720,571,1031,789,14,7,5,1,2,3,245,155,860,792,870,992,18,13,15,4,10,16,258,162,832,770,972,814,11,19,5,3,11,9,220,170,733,698,1071,764,12,5,18,3,4,1,252,218,672,605,737,1058,27,31,15,6,4,11,360,346,655,596,727,928,30,19,8,5,9,17,417,247,600,748,793,1028,22,28,7,2,10,18,365,223,912,752,1012,837,20,31,35,11,11,1,402,260,758,643,922,725,21,20,23,15,9,7,234,320,997,804,689,739,23,17,12,14,15,2,244,316,925,836,753,713,25,27,10,1,14,15,322,294,589,620,783,972,22,32,10,5,2,8,266,268,726,567,979,798,19,6,13,12,1,1,268,378,972,812,1206,693,21,24,27,10,13,0,392,472,729,843,649,1206,34,29,7,4,13,10,429,261,867,684,676,762,24,15,19,11,14,18,4 +338,380,1073,628,614,763,36,13,9,14,9,11,353,391,750,613,629,926,31,28,26,17,11,13,337,143,873,572,1020,799,16,22,16,1,13,4,223,207,997,687,825,1002,12,22,26,4,11,17,134,212,987,711,931,810,1,20,16,5,12,10,224,162,894,731,1062,722,0,20,3,1,9,2,282,344,775,498,702,926,25,34,26,22,15,14,400,442,790,455,718,854,28,32,19,13,12,18,363,379,765,569,760,968,28,19,18,8,17,19,277,207,1077,815,985,895,8,16,22,17,0,2,360,180,923,662,905,601,9,31,6,13,6,8,234,320,1162,669,676,715,27,10,9,12,10,3,378,338,1078,657,744,623,29,20,11,11,11,16,370,276,636,559,746,830,20,29,11,21,13,7,312,256,883,630,970,776,17,19,8,14,12,0,194,302,1129,901,1197,753,9,19,16,14,2,1,338,566,706,690,614,1086,42,18,18,18,14,11,449,335,1022,525,649,842,20,28,20,13,13,19,4 +223,321,837,685,635,668,27,13,10,14,7,12,364,304,608,630,644,1013,32,36,21,9,5,10,280,202,677,591,997,746,25,14,11,1,7,1,228,238,797,746,836,945,7,14,23,4,11,16,281,269,769,766,924,771,14,20,11,5,12,11,243,259,664,762,1031,741,13,12,12,1,7,1,319,301,639,553,691,1073,28,32,21,14,7,11,399,391,604,494,689,925,31,26,16,5,6,15,446,304,663,636,781,1013,21,23,17,4,11,16,328,188,841,838,970,768,15,24,27,15,12,1,397,301,687,689,884,738,16,27,15,13,6,5,203,235,926,710,657,754,18,14,6,12,6,0,311,297,884,724,713,704,20,26,4,3,5,13,361,323,524,610,733,989,23,33,10,13,7,10,235,321,659,641,939,781,20,11,7,14,8,3,305,355,905,914,1170,630,16,23,21,14,14,2,425,511,742,753,635,1213,29,22,13,10,14,8,406,306,794,566,670,689,23,22,13,13,13,16,4 +198,266,777,682,564,692,19,9,8,15,3,8,323,277,632,641,567,1001,24,34,23,8,5,14,305,301,605,566,938,766,17,16,13,6,17,5,297,299,753,715,761,969,15,16,23,9,15,16,318,304,701,719,855,785,20,22,13,10,14,7,262,258,636,703,980,735,21,14,0,4,17,3,310,300,713,516,624,1053,26,36,23,13,17,15,360,304,648,501,636,913,27,24,16,4,10,13,359,259,709,637,710,1007,15,21,15,9,9,14,399,279,781,787,903,814,29,22,23,14,10,3,306,272,627,644,823,712,30,29,5,8,12,9,182,214,866,723,594,734,12,10,10,7,4,4,354,172,810,725,662,692,16,22,12,8,5,11,324,256,574,553,666,961,21,35,8,12,17,6,288,254,637,590,888,773,22,13,5,9,18,5,418,400,869,873,1115,668,30,21,19,15,12,4,336,424,826,742,568,1197,25,20,15,11,12,6,299,263,738,611,625,739,23,24,21,8,15,14,4 +245,399,902,719,595,699,31,9,13,13,8,11,320,240,639,652,592,956,32,36,18,8,12,13,286,182,742,567,925,763,21,14,8,0,12,4,232,166,842,758,764,954,7,16,18,3,8,15,193,165,822,758,852,796,6,22,8,4,9,10,203,161,727,710,967,736,7,12,5,2,10,2,247,195,660,561,619,996,32,36,18,13,12,10,373,339,635,532,623,870,35,24,11,4,11,18,354,250,692,680,739,972,21,23,10,3,18,19,328,210,906,792,894,807,15,24,24,14,1,2,303,263,752,649,810,679,16,27,10,14,7,8,193,311,991,748,583,673,22,10,9,13,9,3,327,305,941,768,651,671,24,22,7,2,10,16,313,295,531,598,661,924,27,35,3,12,12,7,253,271,720,589,875,772,24,11,0,13,11,0,309,391,966,870,1102,683,16,21,24,13,3,1,341,461,741,785,599,1146,37,22,10,9,15,11,420,278,859,616,654,734,19,22,20,12,14,19,4 +340,480,1003,732,639,740,38,17,12,15,9,14,321,269,674,623,654,845,33,28,19,14,11,8,229,133,825,704,1047,748,14,22,25,2,13,1,303,163,1009,811,852,935,14,18,35,5,11,4,238,118,969,843,958,799,1,14,25,6,12,11,192,178,850,859,1089,713,2,20,16,0,9,5,298,312,805,632,729,843,27,28,31,19,15,1,274,448,790,577,745,781,30,32,30,10,12,13,427,307,709,687,783,891,26,29,31,5,17,14,243,251,999,869,1012,818,10,16,15,18,0,3,308,282,845,794,932,610,11,29,19,12,6,3,274,380,1084,727,703,656,29,18,14,11,10,2,370,420,1004,775,771,632,31,20,14,8,11,11,376,326,622,695,773,799,22,29,24,18,13,12,236,316,857,766,997,747,19,19,19,13,12,5,184,398,1089,1035,1224,730,11,29,23,15,2,4,434,542,774,808,637,1017,44,28,27,15,14,10,349,317,950,591,668,751,24,22,9,12,13,14,4 +241,275,820,649,644,646,25,10,10,15,9,10,374,378,603,622,665,1015,28,31,27,8,13,20,404,270,644,581,1050,726,27,19,17,6,11,11,254,304,856,704,863,925,17,19,27,9,9,12,247,313,790,728,963,745,22,23,17,10,10,17,309,277,721,750,1092,725,23,17,10,4,11,9,359,333,680,519,734,1085,36,37,27,13,13,17,403,379,613,476,748,927,33,29,20,4,12,19,348,358,652,594,784,1009,17,22,21,9,19,12,388,232,788,834,1015,738,31,19,27,14,2,9,345,227,650,677,935,742,30,34,13,8,8,15,207,201,873,680,706,766,24,11,2,7,8,10,389,275,843,682,774,698,28,23,2,8,11,21,421,237,583,580,776,995,33,32,14,12,11,16,361,231,724,645,1000,771,30,16,9,9,10,9,347,347,922,912,1227,598,30,22,15,15,4,8,331,505,741,711,640,1221,23,21,19,11,16,10,344,216,741,530,667,659,19,29,15,8,15,18,4 +311,333,969,634,637,780,40,7,9,15,8,3,346,322,690,587,648,1009,35,34,28,10,12,11,346,222,729,544,1033,832,12,16,18,6,12,14,316,266,963,673,846,1035,16,20,28,9,10,7,257,251,915,689,944,851,3,26,18,10,11,4,275,189,848,699,1075,785,4,14,5,4,10,12,303,251,753,486,715,1029,29,38,28,15,14,10,387,349,722,469,731,935,32,24,21,6,11,10,356,316,651,591,783,1037,24,19,20,9,18,11,374,230,973,777,998,892,12,22,26,14,1,12,253,243,819,630,918,712,13,29,6,8,7,16,219,255,1058,671,689,738,31,8,9,7,9,13,427,273,980,679,757,702,33,20,11,8,10,8,351,311,654,537,759,953,24,35,13,14,12,3,335,295,845,594,983,833,21,13,10,9,11,10,343,351,1089,867,1210,756,13,17,14,15,3,11,295,461,788,696,637,1195,46,20,20,11,15,5,370,308,920,551,672,821,26,24,24,8,14,11,4 +336,480,991,726,571,744,37,15,18,10,8,10,351,229,660,643,612,817,32,22,13,13,12,12,269,129,835,726,1009,742,15,28,25,11,12,3,297,145,997,793,804,895,13,20,29,14,10,4,280,110,963,829,920,787,0,16,25,15,11,9,190,208,832,867,1051,699,1,26,12,9,10,5,336,284,807,628,691,801,26,30,29,18,14,5,288,386,786,603,707,749,29,36,30,9,11,17,453,267,711,683,709,863,27,27,31,14,18,18,189,229,987,895,974,816,9,10,3,9,1,1,258,290,833,810,894,580,10,31,15,3,7,7,254,380,1072,741,665,662,28,16,14,2,9,2,422,402,992,771,733,604,30,18,22,13,10,15,424,274,650,683,735,791,21,29,24,17,12,8,236,278,841,776,959,743,18,25,19,10,11,5,180,418,1071,1051,1186,738,10,27,29,10,3,2,458,496,760,800,565,975,43,26,27,16,15,10,405,269,938,593,596,727,21,24,15,11,14,18,4 +205,327,771,774,587,650,20,10,20,16,9,8,342,276,544,707,580,1003,25,33,11,5,13,14,344,238,663,610,889,730,24,17,1,5,11,5,224,234,765,807,758,911,14,17,13,8,5,16,259,239,703,811,844,751,19,21,1,9,6,13,243,241,632,761,931,731,20,15,12,3,11,3,313,249,607,608,597,1071,31,35,11,10,9,13,357,307,542,579,591,923,28,27,6,1,12,15,312,258,643,731,727,1003,20,22,7,8,17,14,320,212,775,835,862,732,24,21,27,13,2,3,325,279,621,704,774,754,23,32,17,9,8,9,257,239,860,803,549,762,19,11,16,8,8,4,371,265,846,819,615,710,23,23,14,7,11,17,373,221,498,647,645,1003,28,34,4,9,11,12,301,211,627,612,839,779,25,14,7,10,10,5,357,395,873,899,1066,602,23,22,31,16,4,4,299,427,688,834,589,1221,24,21,3,10,16,6,330,222,734,653,650,643,12,27,13,9,13,14,4 +287,383,980,608,663,789,38,22,17,13,13,7,324,336,743,589,684,980,33,33,32,12,13,11,314,178,754,528,1051,833,14,15,22,0,7,8,254,198,942,665,882,1032,14,15,32,3,11,13,211,201,898,687,978,844,1,15,22,4,12,6,239,203,829,703,1085,762,2,13,9,2,5,6,255,357,784,472,747,986,27,25,32,17,11,16,395,481,735,413,743,904,30,25,25,8,12,14,370,342,730,547,803,1016,26,28,24,3,13,15,386,212,984,785,1024,921,10,23,34,16,6,6,347,241,830,628,938,655,11,30,14,14,6,12,173,311,1069,649,711,743,29,17,5,13,14,7,331,379,989,635,767,669,31,27,7,6,13,12,327,377,575,537,789,890,22,26,17,16,7,3,323,351,820,584,993,810,19,16,14,13,6,4,295,339,1066,853,1224,775,11,28,10,13,8,5,345,583,803,668,659,1146,44,27,24,13,14,7,444,310,929,521,686,862,24,19,16,12,9,15,4 +295,387,789,831,605,617,29,17,22,14,7,11,284,194,532,708,596,876,26,32,9,7,9,11,198,204,659,707,955,663,15,18,17,7,17,2,332,156,781,876,784,808,25,18,25,10,15,5,317,185,745,870,874,690,18,22,17,11,16,10,149,217,644,832,997,688,19,16,14,5,15,4,267,197,689,679,641,942,20,28,23,10,19,4,281,277,646,664,659,812,23,28,22,3,14,16,440,200,633,806,745,892,31,21,23,10,13,17,266,228,789,874,920,671,23,20,11,13,6,0,235,317,635,775,840,707,22,29,19,7,12,6,211,301,874,836,611,671,20,18,18,6,8,1,361,307,812,894,681,663,22,22,16,9,9,14,315,237,608,712,683,924,15,29,16,11,17,9,177,251,641,721,905,714,14,15,11,8,16,4,283,433,871,1002,1132,585,22,21,33,14,8,1,449,393,748,907,607,1104,27,20,19,12,10,9,410,246,748,704,668,564,17,22,11,7,11,17,4 +241,369,865,733,708,719,31,13,16,10,10,10,296,328,630,632,757,1046,32,36,17,9,14,12,298,122,667,605,1056,797,21,14,13,3,10,3,204,150,881,792,821,914,11,14,25,0,2,12,153,219,823,802,921,818,16,18,13,1,3,9,237,259,726,776,1108,806,17,12,22,5,10,3,229,327,715,589,836,1110,40,32,19,14,10,7,365,449,654,546,864,980,37,26,18,7,13,13,292,392,681,698,800,1058,13,25,19,0,14,14,364,150,865,820,1081,787,25,24,29,15,3,3,329,233,711,709,997,829,26,27,23,17,9,7,209,275,950,748,816,825,28,14,12,16,9,2,297,391,886,786,842,785,32,26,10,3,12,13,287,327,518,640,886,1074,37,33,14,13,10,10,329,301,731,643,1108,852,34,11,17,10,9,5,325,295,969,918,1249,673,26,25,25,12,5,4,281,579,758,807,704,1254,35,24,15,10,17,6,402,334,814,612,649,640,19,22,9,9,14,14,4 +247,345,845,738,602,700,25,11,12,15,4,12,308,228,638,679,593,1023,30,38,19,4,6,14,268,278,713,572,914,774,25,12,9,2,10,5,236,260,777,769,763,975,3,18,19,1,12,16,229,261,759,765,851,793,12,24,9,2,11,11,183,201,666,705,948,753,11,10,4,4,10,3,239,263,639,576,612,1073,34,36,19,9,10,13,353,267,600,551,616,935,33,22,12,6,5,19,374,194,719,701,742,1029,19,25,11,1,12,20,294,280,849,779,887,810,17,26,23,12,5,3,319,253,695,648,801,732,18,23,9,16,5,9,219,289,934,777,576,754,20,12,8,15,5,4,307,235,902,789,640,708,24,22,8,0,6,17,321,211,492,613,656,981,29,31,4,8,10,8,225,193,655,576,856,795,26,9,1,11,11,1,299,399,901,863,1087,666,18,19,23,11,7,2,345,371,720,802,604,1217,31,24,11,5,9,12,404,270,808,657,665,733,17,20,21,10,12,20,4 +278,318,865,619,649,704,31,14,14,14,11,12,397,381,612,580,690,1017,36,41,31,9,9,10,317,233,669,547,1087,782,23,9,21,1,3,1,241,261,829,676,882,969,11,13,31,4,11,14,322,298,801,700,998,805,12,19,21,5,12,11,290,292,692,720,1129,765,13,7,12,1,5,1,352,386,663,493,769,1079,34,33,31,14,5,9,444,488,622,438,785,935,37,23,24,5,8,15,487,387,621,566,781,1027,19,26,23,4,11,16,407,199,869,790,1052,810,21,29,31,15,12,1,440,270,715,647,972,744,22,24,17,13,6,5,210,254,954,656,743,758,22,15,4,12,10,0,310,348,874,654,811,722,24,25,6,3,9,13,400,374,530,552,813,993,29,32,16,13,3,10,282,350,689,609,1037,803,26,6,13,14,4,3,348,330,933,874,1264,676,22,24,11,14,14,2,432,608,760,683,641,1223,31,27,23,10,14,8,455,283,820,528,660,727,23,19,13,13,13,16,4 +260,430,755,836,665,776,27,30,38,10,13,13,297,263,564,683,706,1053,28,23,13,1,13,9,245,171,613,652,1103,832,19,17,23,1,7,0,269,121,783,871,898,935,21,9,13,6,5,3,220,212,753,861,1014,833,22,5,23,3,6,10,244,278,604,793,1145,859,23,13,36,3,7,6,228,286,683,676,785,1105,30,15,13,4,7,2,364,424,620,667,801,985,33,25,20,5,14,14,361,339,637,819,797,1073,25,38,21,2,7,15,399,221,747,805,1068,834,29,21,17,11,6,2,320,340,601,736,988,860,26,26,41,15,12,4,188,316,832,843,759,840,18,31,30,14,12,1,280,404,760,907,827,830,20,33,28,1,15,12,276,374,548,703,829,1087,25,22,28,3,7,11,286,368,621,632,1053,885,22,20,31,10,6,6,348,414,839,911,1280,738,26,38,45,10,8,3,368,542,824,912,657,1203,25,37,21,4,12,9,409,317,702,723,676,705,13,9,23,11,13,15,4 +275,323,866,652,719,700,33,18,13,10,14,12,294,348,711,605,736,1057,36,41,28,9,12,10,224,192,644,560,1039,780,21,5,18,3,0,1,270,208,832,703,868,967,13,11,28,0,12,14,297,269,804,723,956,801,14,19,18,1,13,11,277,271,693,731,1087,779,15,7,15,5,6,1,267,341,746,516,807,1127,36,33,28,14,6,9,377,449,691,469,803,975,39,19,21,7,9,15,436,362,664,607,827,1055,15,32,20,0,12,16,450,186,870,803,1046,784,23,31,30,15,13,1,387,269,716,660,960,798,24,20,16,17,7,5,225,235,955,687,763,814,24,19,5,16,13,0,249,341,867,695,805,754,26,27,3,3,12,13,265,349,563,571,845,1051,31,34,13,13,0,10,283,335,688,610,1051,827,32,8,10,10,1,3,413,337,934,881,1230,652,24,26,14,12,15,2,393,569,839,716,711,1273,33,31,20,10,15,8,432,308,817,565,706,699,25,15,10,9,14,16,4 +330,402,1001,766,648,744,38,15,21,10,17,10,297,301,684,689,663,991,37,38,10,15,15,12,237,89,767,608,950,804,18,8,0,3,3,3,211,161,957,823,835,1013,14,12,10,0,9,16,216,204,931,819,933,825,5,18,0,1,10,9,182,250,826,781,976,757,6,6,13,5,3,1,196,286,769,622,678,1013,31,30,10,18,3,11,330,418,750,567,634,907,34,20,3,11,10,17,359,369,627,719,792,1015,22,27,4,6,9,18,331,157,1005,841,941,874,14,30,30,13,10,1,344,242,851,720,845,682,15,21,18,17,8,7,248,290,1090,793,612,714,29,16,17,16,16,2,242,408,1002,807,662,682,31,28,15,9,15,15,284,322,614,663,732,925,26,31,5,17,3,8,262,302,819,598,884,797,23,7,8,10,2,1,296,316,1065,885,1117,728,15,25,32,10,12,0,340,558,808,832,650,1169,40,28,2,16,12,10,441,341,952,657,689,805,26,16,14,9,11,18,4 +227,325,877,715,709,638,30,12,15,14,11,7,326,326,644,648,708,995,27,33,16,11,13,17,334,178,711,627,931,718,16,17,8,1,15,8,240,216,903,786,786,905,16,17,20,4,7,13,229,225,839,806,834,739,21,21,8,5,8,14,253,219,776,786,989,719,22,15,7,1,9,6,303,295,701,587,769,1065,35,33,16,16,11,16,339,401,654,518,757,911,32,25,13,7,8,16,296,334,703,664,795,991,12,22,14,4,15,11,342,132,881,864,978,720,30,21,20,17,2,6,341,223,733,719,882,742,31,30,12,13,8,12,279,263,966,736,717,750,33,13,11,12,12,7,365,327,930,752,735,698,37,23,9,5,13,18,353,279,566,650,799,991,40,34,7,15,15,13,303,255,773,657,995,767,39,14,2,14,14,8,355,301,1013,936,1104,590,31,22,26,14,0,7,265,523,722,785,701,1209,36,21,10,12,12,7,356,288,830,588,670,637,18,25,18,13,11,15,4 +247,395,870,714,712,682,27,17,14,11,7,12,320,302,623,615,763,1003,30,32,19,8,9,10,262,154,676,622,1080,756,15,18,17,2,7,1,246,142,870,775,849,885,15,18,29,1,9,8,227,213,840,789,953,777,16,14,17,2,10,11,251,271,707,791,1130,771,17,16,20,4,7,1,251,335,740,582,838,1069,30,28,23,13,7,3,385,459,691,539,866,935,33,30,22,6,8,15,368,372,648,681,814,1013,19,29,23,1,15,16,392,184,868,827,1095,742,25,20,25,14,10,1,353,301,714,722,1013,794,26,29,21,16,4,5,187,303,953,725,818,784,18,18,10,15,6,0,275,383,869,769,852,750,20,24,8,2,7,13,295,367,581,633,890,1037,25,29,16,12,7,10,271,345,714,672,1114,815,22,15,15,11,8,3,357,373,948,943,1289,636,26,29,23,13,12,2,373,579,831,790,708,1231,31,28,19,9,12,8,420,320,817,591,659,599,19,22,5,10,13,16,4 +273,337,902,671,689,656,27,15,13,10,14,6,336,370,673,592,740,983,32,32,22,15,12,14,348,162,740,595,1075,734,21,18,16,3,6,7,220,186,914,740,848,875,5,18,28,0,10,14,171,257,854,764,956,755,10,16,16,1,11,7,281,291,763,764,1123,741,11,16,19,5,6,5,261,337,740,549,813,1049,36,26,22,18,6,11,381,439,689,490,839,917,35,28,21,11,11,11,320,392,748,622,799,995,17,21,22,6,14,12,388,120,904,814,1080,724,19,22,28,13,7,5,391,249,750,695,998,764,20,27,20,17,5,11,241,253,989,692,791,762,22,18,9,16,13,6,317,371,929,710,833,720,26,24,7,9,12,11,305,329,535,608,865,1011,31,27,15,17,6,6,351,303,764,651,1089,787,28,15,14,10,5,7,329,293,1006,924,1300,608,20,21,20,10,9,6,327,559,735,743,683,1211,33,20,18,16,13,4,394,320,849,546,642,597,19,26,8,9,12,12,4 +268,454,881,724,598,730,31,15,14,16,7,10,343,219,646,633,607,929,26,30,17,11,5,12,323,155,703,626,1004,774,7,20,7,5,7,3,315,141,821,767,803,945,21,20,17,8,7,10,262,164,801,771,915,793,8,18,7,9,6,9,238,192,712,769,1046,715,9,18,6,3,7,1,304,230,725,588,686,967,20,32,17,16,7,5,390,374,700,555,702,857,23,30,10,7,2,17,403,267,721,685,746,957,21,27,9,8,5,18,383,239,885,817,969,846,17,18,25,15,12,1,310,290,731,712,889,658,18,33,11,9,6,7,198,336,970,751,660,676,22,16,14,8,6,2,376,362,906,773,728,658,24,22,16,7,5,15,356,370,608,619,730,903,15,33,10,15,7,8,274,342,713,612,954,757,16,17,9,10,8,1,342,416,951,895,1181,720,18,27,25,16,10,0,392,484,800,790,602,1133,37,26,9,12,8,10,405,299,842,625,645,737,27,26,15,9,9,18,4 +281,437,897,795,577,675,37,22,21,11,10,13,286,192,564,680,604,882,38,25,10,10,14,9,242,156,811,745,1001,711,19,25,22,10,10,0,286,116,921,842,798,842,13,23,26,13,8,1,241,131,885,848,912,736,6,19,22,14,9,10,171,201,748,866,1043,730,7,23,13,8,10,8,275,215,749,675,683,916,32,23,26,15,12,2,267,305,716,670,699,824,35,29,27,6,13,14,390,234,715,770,725,920,21,24,28,13,20,15,224,226,889,896,966,729,15,13,6,10,3,2,217,325,735,811,886,705,16,24,18,4,9,4,233,341,974,804,657,657,28,23,17,3,9,1,367,343,920,858,725,685,30,25,19,12,12,12,359,287,584,696,727,914,27,24,21,14,10,11,245,295,761,773,951,756,24,22,16,7,9,8,215,451,983,1052,1178,645,16,24,32,11,5,5,415,427,700,871,581,1088,39,23,24,15,17,11,380,268,852,670,630,608,27,17,12,10,16,15,4 +307,445,902,702,633,722,36,18,12,15,11,13,388,256,585,599,664,849,31,27,21,10,15,9,306,200,800,694,1061,740,16,23,29,6,9,0,356,156,912,785,860,913,12,17,37,9,7,3,335,165,874,821,972,785,1,13,29,10,8,10,261,201,749,855,1103,713,0,21,20,4,9,6,383,301,746,620,743,855,25,27,35,15,11,2,337,429,701,559,759,785,28,33,34,6,14,14,530,308,716,653,769,895,28,30,35,9,19,15,254,244,898,863,1026,800,8,15,13,14,4,2,331,309,744,788,946,616,9,28,19,8,10,4,267,353,983,699,717,644,27,19,16,7,10,1,425,365,923,741,785,630,29,21,16,8,13,12,425,379,587,677,787,823,20,28,28,14,9,11,255,353,756,762,1011,745,17,20,23,9,8,6,207,427,988,1029,1238,712,9,30,21,15,6,3,549,523,753,778,627,1029,42,29,31,11,18,9,360,302,857,559,650,719,20,21,7,8,15,15,4 +334,450,949,725,642,760,37,17,15,17,9,12,329,275,622,616,673,899,32,28,16,8,11,10,245,97,791,675,1066,772,15,22,24,4,13,1,295,127,947,800,867,933,13,20,32,7,7,4,244,150,911,826,977,817,0,16,24,8,8,9,178,196,792,838,1108,739,1,20,21,2,9,5,314,292,757,617,748,887,26,28,30,13,11,3,292,452,734,556,764,829,29,30,29,4,10,15,457,331,673,684,778,937,27,27,30,7,17,16,209,231,947,840,1031,836,9,16,16,14,0,1,308,268,793,771,951,642,10,29,22,10,6,5,258,332,1032,724,722,680,28,18,13,9,10,0,396,428,952,772,790,652,30,20,13,6,11,13,386,356,590,678,792,849,21,29,23,12,13,10,220,340,797,725,1016,783,18,19,18,11,12,5,182,374,1033,998,1243,738,10,27,26,15,2,2,456,554,742,801,636,1057,43,26,26,9,14,8,351,345,898,588,659,751,21,22,4,10,13,16,4 +326,502,1000,755,640,823,37,20,18,17,8,14,297,277,671,646,661,902,32,23,13,12,12,10,213,115,830,711,1054,807,15,27,25,4,12,1,269,151,1024,832,855,954,13,15,29,7,8,0,226,134,988,860,965,848,0,13,25,8,9,9,156,248,851,866,1096,774,1,25,18,2,10,9,278,334,842,649,736,852,26,27,29,17,12,3,264,480,815,582,752,826,29,33,30,8,11,15,403,337,738,710,782,936,27,32,31,7,18,16,203,269,992,878,1019,883,9,15,11,16,1,1,280,332,838,803,939,681,10,28,21,10,7,5,268,388,1077,758,710,735,28,21,18,9,9,0,362,452,993,798,778,669,30,23,18,6,10,13,366,392,645,708,780,826,21,28,24,16,12,10,222,380,864,749,1004,818,18,24,19,11,11,9,196,378,1086,1034,1231,805,10,32,29,17,3,6,416,576,811,831,638,1026,43,31,27,13,15,12,367,391,941,618,669,804,23,21,9,10,14,16,4 +304,332,1054,612,653,800,39,15,10,16,9,10,377,373,737,599,674,1011,34,28,35,15,11,12,337,157,804,564,1055,844,13,22,25,3,13,3,253,229,990,679,872,1049,15,22,35,6,11,18,222,258,972,711,968,861,2,24,25,7,12,9,246,236,877,735,1097,789,3,20,12,1,9,1,292,320,770,500,739,1023,28,30,35,20,15,13,418,442,781,435,753,935,31,24,28,11,12,17,359,387,638,553,793,1041,25,17,27,6,17,18,353,173,1058,819,1020,918,11,16,29,17,0,1,330,238,904,662,940,700,12,29,7,11,6,7,176,280,1143,649,711,750,30,6,8,10,10,2,390,366,1047,641,779,702,32,20,10,9,11,15,378,362,643,565,781,937,23,29,20,19,13,8,318,334,868,628,1005,839,20,19,17,12,12,1,300,298,1114,895,1232,778,12,21,7,16,2,0,306,556,777,674,649,1181,45,16,27,16,14,10,421,363,1001,511,676,857,25,24,23,11,13,18,4 +261,261,849,658,652,640,25,10,7,17,9,12,400,396,622,593,683,1003,28,35,26,12,13,10,354,242,625,604,1066,720,19,15,20,4,11,1,278,264,799,719,879,913,17,15,32,7,7,16,273,307,773,749,983,741,20,23,20,8,8,11,285,291,680,771,1108,721,21,13,13,2,11,1,343,323,653,538,754,1073,30,37,26,17,11,11,445,373,620,493,764,915,33,25,25,8,12,15,412,380,591,611,788,997,23,22,26,7,19,16,408,184,853,833,1033,726,29,23,22,16,2,1,369,229,707,702,951,744,28,30,14,10,8,5,171,185,938,681,722,754,16,11,7,9,8,0,367,293,856,699,790,700,20,23,7,6,11,13,387,249,558,601,796,993,25,36,19,16,11,10,315,231,669,668,1016,769,22,12,14,11,10,3,369,327,915,933,1243,592,28,22,16,17,4,2,383,497,760,724,646,1211,25,21,22,13,16,8,416,234,802,529,669,645,15,25,12,10,15,16,4 +274,352,882,706,646,720,28,11,11,15,12,8,385,279,625,635,661,1043,31,30,20,6,14,12,391,199,736,572,994,794,22,20,10,2,16,5,241,211,870,747,835,995,4,20,20,5,8,14,212,226,816,761,935,813,9,20,10,6,9,7,286,210,737,729,1028,773,10,18,3,0,10,3,348,254,676,544,698,1093,35,34,20,11,12,9,394,382,637,511,686,955,34,28,13,2,9,15,321,291,698,663,790,1049,18,23,12,5,14,16,371,213,886,785,973,830,18,18,26,12,3,3,376,266,732,666,883,752,19,33,8,12,9,9,256,262,971,741,654,774,21,12,7,11,13,4,402,308,927,751,710,728,25,22,9,4,14,13,406,342,561,601,744,1001,30,31,5,10,16,6,354,336,736,594,936,815,27,17,2,13,15,3,322,360,980,875,1167,686,19,23,22,13,1,2,302,502,747,768,648,1237,34,22,12,7,11,8,393,293,839,611,687,753,18,28,22,12,10,16,4 +284,360,752,903,677,670,25,27,21,13,10,11,327,221,551,774,726,885,30,30,12,8,14,7,283,215,666,851,1081,678,29,10,34,8,10,14,349,185,842,974,860,715,15,12,28,11,2,3,278,212,796,1008,972,639,20,18,34,12,3,12,234,236,643,1024,1127,761,21,12,29,6,10,22,324,208,706,795,799,929,36,22,28,11,10,0,280,300,641,722,823,819,33,14,35,4,13,12,463,233,676,866,795,895,17,25,36,11,14,19,269,229,728,898,1074,650,25,20,8,12,3,8,264,326,574,955,992,824,24,15,28,6,9,14,242,262,813,868,775,724,22,28,21,5,9,11,390,274,775,954,825,760,26,30,21,10,12,10,368,268,551,860,851,963,31,23,33,12,10,13,246,278,678,801,1075,763,28,13,28,7,9,20,230,444,854,1088,1292,602,24,25,30,13,5,19,484,418,791,979,671,1061,23,38,36,13,17,15,341,241,683,756,642,523,17,4,12,8,14,13,4 +412,448,778,691,492,601,24,23,14,14,17,13,279,375,455,624,429,588,19,22,17,7,13,13,161,371,728,535,692,549,18,14,7,7,9,4,439,405,696,658,579,692,18,30,17,10,13,15,472,366,702,616,627,520,13,30,7,11,12,12,240,266,597,486,722,502,12,18,6,5,5,2,286,326,524,507,432,642,13,16,17,10,13,14,286,244,531,538,494,532,16,10,10,3,14,18,451,311,522,690,572,618,36,21,9,10,13,19,261,317,782,574,663,695,4,26,29,13,10,2,250,218,628,459,573,527,3,15,11,7,8,8,332,356,867,766,462,591,15,20,10,6,16,3,422,358,847,778,468,509,17,28,8,9,15,16,230,136,403,498,454,560,8,15,2,11,9,11,196,140,586,387,654,508,5,11,1,8,8,4,334,312,832,654,871,603,3,21,25,14,12,3,490,320,505,745,478,784,30,22,9,12,16,11,399,321,775,658,551,722,16,22,19,7,5,19,4 +196,444,838,697,664,746,33,25,16,16,15,14,257,305,669,646,695,1043,34,28,25,13,13,8,309,239,672,573,1072,814,17,16,15,3,5,1,277,215,846,756,889,1015,15,4,25,6,7,10,292,274,818,762,997,833,8,6,15,7,8,13,280,336,675,748,1106,783,9,12,24,1,5,3,286,376,784,553,766,1083,28,20,25,18,5,5,308,508,719,490,764,957,31,24,18,9,12,13,445,373,730,636,800,1055,19,37,17,6,7,14,387,295,836,814,1045,862,17,26,29,17,8,3,366,378,682,675,959,744,18,25,19,11,10,3,274,372,921,734,730,764,24,26,14,10,14,2,216,420,841,724,788,726,26,34,12,7,15,11,332,484,583,606,810,991,25,25,16,17,5,12,328,472,690,617,1014,827,26,19,19,12,4,5,348,436,916,892,1245,716,18,37,17,16,10,4,422,604,877,763,658,1231,35,36,17,14,10,10,281,383,787,588,681,787,27,14,13,11,11,14,4 +365,361,848,719,752,691,32,17,20,12,17,10,320,324,729,656,763,1060,33,40,19,11,15,12,302,144,634,529,1018,771,16,6,9,5,3,3,254,184,836,756,877,970,16,12,19,2,9,16,263,213,808,756,949,790,15,18,9,1,10,9,289,233,683,702,1056,770,16,6,12,7,3,1,233,295,790,557,826,1130,33,32,19,16,3,11,413,385,747,520,786,972,36,20,12,9,10,17,378,360,748,672,854,1054,14,29,11,2,9,18,466,130,852,772,1057,783,24,32,39,15,10,1,361,193,698,643,959,787,25,21,17,19,8,7,293,255,937,756,762,811,23,18,16,18,16,2,269,343,849,760,774,743,25,26,14,5,15,15,245,273,539,594,864,1040,30,33,4,15,3,8,353,239,708,533,1032,816,33,7,7,8,2,1,393,291,912,812,1215,643,25,25,23,10,12,0,279,515,819,781,746,1266,34,30,11,12,12,10,480,310,799,618,711,702,26,16,23,11,11,18,4 +196,290,768,686,625,665,29,13,10,13,7,9,297,365,653,655,638,1030,34,40,23,12,5,15,277,225,614,596,989,745,23,10,13,0,7,6,227,269,796,743,836,940,9,16,23,3,7,15,226,278,732,765,926,766,14,22,13,4,8,14,236,240,663,763,1029,744,15,8,8,2,7,4,264,344,730,546,693,1100,40,34,23,17,7,16,374,384,663,489,685,942,37,22,16,8,2,18,369,339,738,633,769,1024,13,25,15,3,7,13,389,183,772,847,968,753,23,28,27,16,10,4,336,210,622,694,876,763,24,23,13,14,4,10,192,236,857,721,649,781,26,14,4,13,6,5,266,298,821,721,711,719,30,24,4,6,5,18,300,258,499,611,735,1016,35,31,8,16,7,13,294,230,660,634,937,792,32,7,5,13,8,6,374,282,906,913,1164,617,24,21,19,13,10,5,332,512,767,750,623,1238,31,26,15,13,10,9,383,239,723,581,654,672,21,18,17,12,9,17,4 +287,259,963,596,645,707,34,18,6,11,6,3,304,384,792,573,686,1004,29,31,37,20,4,15,294,246,731,572,1083,775,14,19,27,2,8,12,330,310,923,675,878,976,10,23,37,1,10,9,225,317,877,713,994,794,7,23,27,2,11,8,261,239,820,743,1125,744,8,17,14,4,8,10,249,283,837,502,765,1044,33,25,37,19,10,12,407,369,780,429,781,918,30,21,30,16,5,10,386,356,753,535,777,1016,20,18,29,11,10,11,438,156,967,821,1048,823,16,23,23,14,11,10,325,213,813,668,968,705,17,26,9,16,5,16,169,203,1052,627,739,725,25,13,10,15,5,11,341,257,966,623,807,687,31,17,12,14,4,12,269,309,630,565,809,952,28,24,22,18,8,7,305,289,809,644,1033,788,25,16,19,11,9,8,363,281,1055,909,1260,677,17,18,5,11,13,9,357,489,842,666,637,1192,40,17,29,17,13,3,442,352,910,493,656,748,18,25,17,10,12,11,4 +375,475,995,764,635,788,38,14,21,15,8,10,340,292,670,665,656,865,33,31,12,10,12,12,238,84,819,696,1045,784,14,19,26,2,12,3,312,150,983,829,854,911,14,19,28,5,8,6,277,141,951,849,956,823,1,21,26,6,9,11,165,207,832,857,1087,743,2,17,23,0,10,3,309,287,797,642,727,817,27,31,28,15,12,5,297,433,776,607,743,799,30,27,31,6,11,17,466,350,687,725,775,907,26,22,32,5,18,18,234,228,997,881,1010,854,10,19,14,16,1,1,327,299,843,790,930,646,11,32,28,12,7,7,259,357,1082,773,701,702,29,15,15,11,9,2,399,449,1006,813,769,634,31,23,13,4,10,15,377,335,616,695,771,813,22,32,25,14,12,10,195,335,833,756,995,791,19,16,20,13,11,3,195,355,1075,1027,1222,772,11,22,30,15,3,0,467,543,774,838,631,1001,44,21,28,11,15,10,374,368,950,631,658,757,22,25,8,12,14,18,4 +240,360,950,647,720,674,32,11,12,14,7,11,357,323,627,594,757,1041,37,36,27,11,11,11,291,157,742,569,1062,754,20,14,17,1,7,2,179,191,904,712,853,951,8,14,27,4,11,17,260,240,878,736,947,775,9,22,17,5,12,10,222,228,775,740,1112,755,10,12,14,1,9,0,294,312,712,525,836,1111,35,36,27,16,9,12,368,440,699,464,848,953,38,26,20,7,10,16,411,339,610,594,822,1035,18,23,19,4,17,17,339,149,954,820,1077,764,18,24,29,17,6,0,366,274,800,669,995,778,19,29,15,13,6,6,198,282,1039,676,800,792,23,12,4,12,6,1,286,350,959,682,842,734,25,24,2,5,9,14,378,356,581,584,874,1027,30,37,12,15,7,9,270,332,768,635,1096,803,27,11,9,14,8,2,310,320,1014,900,1271,626,19,23,15,14,8,1,362,558,739,715,716,1247,38,22,19,12,14,9,421,327,905,536,671,683,24,24,11,13,13,17,4 +323,495,1022,734,619,810,36,22,21,13,12,13,308,298,693,637,616,807,31,33,10,8,10,9,208,156,846,636,981,798,16,17,14,0,6,0,310,162,1010,791,802,983,12,15,26,3,14,7,263,151,972,803,892,809,1,15,14,4,15,12,219,275,859,779,1023,739,0,15,13,2,8,2,297,401,826,606,663,811,25,29,20,13,12,2,337,513,801,577,679,751,28,33,19,4,13,14,450,362,740,693,773,875,28,34,20,3,16,15,320,218,1020,849,946,908,8,21,14,14,7,2,321,373,866,720,866,624,9,30,18,14,5,4,245,409,1105,751,637,742,27,23,17,13,11,1,339,497,1029,781,707,690,29,25,15,2,10,12,331,391,657,645,707,747,20,30,13,12,6,11,221,395,862,694,931,769,17,16,8,13,5,4,257,349,1102,967,1158,822,9,34,32,13,9,3,457,607,823,806,627,973,42,33,16,9,15,9,370,392,973,617,674,865,24,23,12,12,12,15,4 +265,445,830,832,636,671,32,28,19,15,12,12,290,200,565,697,661,888,37,29,12,6,16,8,244,178,742,776,1054,697,26,15,28,6,8,5,328,136,888,897,855,816,12,15,28,9,4,2,273,177,852,923,965,694,13,17,28,10,5,11,185,229,697,937,1096,738,14,17,23,4,8,13,287,235,744,722,736,924,35,21,28,11,12,1,259,339,695,671,752,818,38,19,33,2,15,13,442,236,716,795,776,912,18,26,34,9,16,14,268,238,816,897,1019,705,18,17,12,14,5,3,233,333,662,870,939,745,19,14,26,8,11,5,229,341,901,809,710,683,23,29,17,7,11,2,359,339,853,883,778,721,25,27,17,8,14,11,355,341,571,775,780,926,30,20,27,10,8,12,231,331,724,798,1004,752,27,18,22,9,7,13,237,455,924,1093,1231,631,19,26,30,15,7,10,477,455,795,908,632,1072,32,33,30,11,19,14,330,296,775,693,659,592,22,7,8,8,14,14,4 +316,328,813,634,671,679,27,24,15,14,13,13,311,441,748,587,702,1040,30,29,30,17,11,9,359,303,615,550,1079,759,15,15,20,1,1,0,335,291,805,701,898,950,21,11,30,4,13,13,354,352,777,707,1002,780,16,11,20,5,14,12,384,358,680,721,1115,758,17,11,23,1,7,2,352,446,831,504,773,1110,24,21,30,22,7,8,390,512,762,445,771,954,27,19,23,13,8,14,473,459,727,573,807,1034,11,26,22,8,13,15,523,251,813,783,1052,763,25,29,28,17,14,2,470,308,679,650,966,777,26,24,18,13,8,4,336,268,898,667,739,793,24,19,15,12,12,1,252,376,802,661,797,733,20,27,13,11,11,12,360,382,618,555,815,1030,29,22,17,21,1,11,444,360,695,610,1023,806,32,18,20,14,2,4,444,372,883,877,1252,631,26,26,12,14,16,3,434,636,912,704,665,1252,27,27,22,18,16,9,379,281,756,529,688,682,29,17,12,13,15,15,4 +234,368,764,748,624,706,25,23,20,14,11,4,303,323,593,641,665,1033,30,30,15,5,15,14,331,191,676,582,1062,780,23,16,11,1,9,9,259,173,828,795,857,915,7,16,21,2,3,14,198,258,768,795,973,799,14,12,11,3,4,9,286,262,663,747,1104,793,13,14,24,3,9,9,278,324,708,596,744,1099,36,22,15,10,9,11,336,426,629,569,760,963,33,24,14,5,14,9,309,341,748,721,756,1045,15,31,15,2,9,8,385,181,762,787,1027,774,21,22,29,11,4,9,358,290,616,682,947,812,22,25,27,15,10,13,272,254,847,767,718,814,24,24,14,14,10,8,322,338,821,809,786,770,28,26,12,1,13,11,332,344,515,635,788,1057,33,23,16,9,9,10,356,330,670,606,1012,835,30,13,19,12,8,11,354,376,888,883,1239,658,22,31,27,12,6,10,336,550,783,824,616,1229,29,30,11,6,14,0,339,303,717,639,635,651,17,16,15,11,15,8,4 +249,459,879,869,763,811,30,32,29,11,15,14,282,250,720,730,810,1060,31,21,18,12,13,10,298,162,689,709,1033,863,20,25,28,2,5,1,200,134,915,928,790,876,16,11,18,1,7,0,193,183,885,932,876,834,21,3,28,2,8,9,223,331,732,878,1093,916,22,21,39,4,5,9,203,329,845,727,895,1114,39,13,18,17,5,3,357,479,794,682,929,1016,36,23,25,8,12,15,294,352,783,834,817,1084,12,36,26,3,7,16,384,216,871,846,1092,833,30,23,12,14,8,1,333,353,717,823,1008,943,31,24,36,16,10,5,241,367,956,868,875,889,33,29,31,15,14,0,265,509,872,922,867,895,37,27,29,6,15,13,263,395,600,770,937,1156,42,20,33,16,5,10,317,395,751,679,1151,946,39,22,36,11,4,9,357,357,967,972,1210,765,31,36,40,11,10,6,277,527,896,949,753,1198,36,35,26,13,10,12,380,364,814,742,652,642,18,9,18,10,11,16,4 +308,314,900,701,655,718,26,17,16,11,8,6,327,325,719,622,678,1015,31,34,21,8,10,16,285,207,718,559,1041,790,18,16,11,4,10,11,235,249,940,744,872,991,8,20,21,1,6,10,176,262,886,752,974,817,13,22,11,0,7,9,244,224,789,730,1083,767,14,14,16,6,8,9,208,240,796,547,739,1057,37,30,21,13,6,13,382,340,735,516,739,927,34,20,14,8,9,13,337,317,728,662,795,1027,14,21,13,1,16,14,385,169,872,790,1014,836,22,22,33,14,3,9,334,198,718,661,926,728,23,29,19,18,5,15,204,220,957,730,697,738,25,8,6,17,7,10,282,274,887,750,765,716,29,18,4,2,8,13,278,246,617,590,785,975,34,27,8,12,10,8,324,234,804,597,991,801,31,13,11,9,9,7,322,320,990,872,1218,696,23,19,21,13,5,8,294,468,837,767,651,1205,32,20,13,9,13,6,463,285,815,608,678,761,18,24,13,10,10,14,4 +261,381,964,678,639,736,36,12,14,14,10,11,322,336,649,629,660,917,31,35,23,11,14,11,294,108,788,572,1027,780,16,15,13,1,10,2,206,154,928,735,858,989,12,15,25,4,6,15,183,207,900,749,954,797,1,21,13,5,7,10,205,207,791,745,1067,715,0,13,12,1,10,0,265,325,736,532,723,931,25,33,23,16,10,10,347,473,721,485,723,845,28,25,18,7,13,16,392,368,704,627,779,955,28,22,19,4,18,17,258,186,968,819,1000,860,8,23,27,17,3,0,337,255,814,672,914,608,9,28,17,13,9,6,219,305,1053,703,687,686,27,13,4,12,9,1,349,377,989,715,749,622,29,25,2,5,12,14,351,365,553,591,765,843,20,34,12,15,10,9,273,337,786,626,975,761,17,12,7,14,9,2,225,329,1032,895,1202,724,9,22,19,14,5,1,391,583,719,744,635,1091,42,21,15,12,17,9,356,336,921,555,662,797,20,23,13,13,14,17,4 +250,236,867,620,653,657,27,12,10,16,5,10,355,383,658,601,684,960,28,31,31,9,7,12,313,245,627,566,1067,717,9,19,21,5,19,3,315,309,815,683,880,920,19,19,31,8,15,16,274,318,791,715,984,736,12,25,21,9,16,9,260,266,708,739,1109,678,13,17,10,3,15,1,306,326,739,500,755,1030,22,33,31,14,17,11,412,394,698,439,765,872,25,21,24,5,12,17,413,333,655,561,789,954,23,18,23,8,11,18,395,187,871,819,1034,775,21,19,27,15,6,1,322,206,717,664,952,687,22,30,13,9,12,7,128,192,956,657,723,711,18,7,4,8,6,2,384,272,864,649,791,643,20,21,6,7,7,15,352,292,624,567,797,940,17,32,16,13,19,8,292,266,695,630,1017,724,14,16,13,10,18,1,352,270,931,895,1244,629,22,22,11,16,8,0,398,516,820,682,647,1166,33,17,23,10,8,10,399,295,814,519,670,704,23,27,15,9,13,18,4 +251,405,879,735,617,649,37,21,12,14,8,12,302,268,580,640,630,950,38,32,19,13,6,10,230,176,687,693,1011,711,21,14,23,1,6,1,264,154,863,816,828,880,13,14,35,4,10,8,225,163,827,846,922,734,6,14,23,5,9,11,197,213,716,848,1053,734,7,12,18,1,6,1,245,303,701,637,693,1022,32,24,29,18,10,3,335,435,680,560,709,870,35,26,28,9,9,15,424,328,623,686,761,954,21,29,29,4,10,16,312,174,879,898,976,711,15,24,13,17,7,1,321,241,725,785,896,733,16,27,15,13,1,5,187,289,964,740,667,711,28,22,16,12,7,0,297,371,876,774,735,701,30,28,16,7,6,13,321,321,518,698,737,966,27,25,22,17,6,10,235,299,719,749,961,762,24,11,17,14,7,3,275,351,959,1022,1188,611,16,29,23,14,9,2,425,559,772,811,615,1166,37,28,25,14,9,8,378,274,826,594,646,626,27,18,7,13,8,16,4 +261,317,908,680,703,682,30,12,14,13,6,11,314,336,697,627,716,1045,33,39,23,10,6,13,274,164,682,582,1027,762,20,11,13,0,8,4,272,218,846,739,850,955,8,17,23,3,12,15,225,255,826,759,930,781,13,25,13,4,11,10,213,225,733,749,1075,763,14,13,8,2,8,2,261,273,690,542,779,1115,39,39,23,15,8,10,381,399,655,487,791,957,36,23,16,6,5,18,370,336,686,633,811,1039,14,26,15,3,12,19,348,142,912,819,1022,768,22,27,27,16,5,2,315,213,758,680,946,780,23,26,13,14,3,8,195,237,997,709,747,798,25,13,4,13,5,3,347,325,929,721,793,738,29,21,4,4,6,16,315,311,545,603,819,1031,34,34,8,14,8,7,255,287,724,628,1039,807,31,8,5,13,9,0,317,299,970,901,1218,634,23,20,19,13,7,1,339,519,769,746,693,1253,36,25,15,11,9,11,424,326,861,571,696,687,22,21,17,12,10,19,4 +311,459,924,737,640,695,34,18,13,16,10,13,310,242,601,630,661,810,29,29,18,7,14,9,210,110,768,683,1046,701,10,21,22,3,10,0,334,106,924,804,859,872,18,19,34,6,8,7,301,163,888,828,957,748,5,15,22,7,9,12,183,213,765,846,1088,660,6,19,19,1,10,2,301,271,768,629,728,846,23,27,28,12,12,2,289,425,729,586,744,744,26,31,27,3,13,14,484,288,662,700,780,848,28,28,28,6,20,15,270,224,922,870,1011,769,14,17,18,13,3,2,307,299,768,779,931,593,15,28,20,11,9,4,243,347,1007,744,702,617,25,19,11,10,9,1,365,401,935,788,770,589,27,21,11,5,12,12,329,363,623,682,772,814,18,28,21,11,10,11,177,339,772,747,996,708,15,18,16,12,9,4,259,401,1006,1016,1223,677,15,28,24,14,5,3,495,529,769,813,636,1020,40,27,24,8,17,9,358,314,877,606,663,696,28,21,6,11,16,15,4 +306,436,903,727,650,705,37,20,14,14,12,14,261,257,622,602,671,858,32,33,21,11,10,8,189,149,701,657,1046,735,15,15,23,1,2,1,351,119,899,800,869,918,13,15,35,4,14,8,272,182,865,826,965,780,0,13,23,5,15,13,204,218,742,826,1088,694,1,13,24,1,8,3,284,282,771,619,734,876,26,25,29,16,8,3,322,440,726,546,744,792,29,29,28,7,11,13,463,329,665,682,790,898,27,30,29,4,14,14,325,223,903,826,1011,803,9,23,21,17,15,3,304,308,749,757,931,603,10,26,21,13,9,3,216,322,988,718,702,635,28,21,18,12,11,2,336,400,900,770,770,613,30,27,16,5,10,11,290,408,594,674,776,828,21,26,22,15,2,12,212,380,747,717,996,730,18,12,23,14,3,5,268,396,985,984,1223,691,10,30,21,14,17,4,478,544,836,803,646,1050,43,29,25,12,17,10,343,341,850,586,673,724,23,19,3,13,16,14,4 +326,360,957,683,777,699,39,16,20,11,15,11,339,327,714,642,786,1068,38,37,23,12,13,13,279,137,715,529,1025,779,17,13,13,4,1,4,221,161,901,730,878,978,15,15,23,1,11,17,290,224,877,736,948,798,12,21,13,0,12,10,254,238,780,706,1081,778,13,11,16,6,5,2,226,304,743,527,853,1138,38,29,23,17,5,12,398,422,708,482,829,980,41,21,16,8,8,18,385,361,657,632,869,1062,21,22,15,3,11,19,451,139,961,784,1072,791,21,25,37,14,12,2,388,238,807,635,972,793,22,26,21,18,6,8,286,262,1046,720,791,819,30,13,8,17,14,3,220,352,954,720,815,751,32,25,8,6,13,16,284,310,608,574,889,1046,33,30,8,16,1,7,322,286,771,565,1073,822,30,10,11,9,0,0,408,328,1017,842,1214,651,22,24,19,9,14,1,304,546,836,745,769,1274,41,23,15,13,14,11,473,311,906,606,730,710,23,21,17,10,13,19,4 +262,356,954,647,634,716,34,10,12,12,7,11,339,269,695,612,643,985,31,35,25,7,9,13,295,213,780,509,1018,776,18,15,15,1,9,4,241,219,878,686,835,975,10,15,25,2,13,17,204,200,868,688,929,793,3,21,15,3,14,10,220,172,775,668,1060,735,2,13,4,3,7,2,266,242,702,499,700,1015,27,35,25,12,11,14,394,340,677,474,716,901,30,25,18,5,8,18,387,255,742,604,780,1003,26,22,17,2,15,19,343,215,958,752,983,834,10,23,29,13,4,2,350,252,804,597,903,678,11,30,9,15,4,8,190,290,1043,686,674,696,25,11,8,14,6,3,324,254,989,692,742,666,27,23,8,1,7,16,328,298,573,530,744,923,22,36,10,11,9,7,250,276,764,563,968,781,19,12,7,12,8,0,290,384,1010,834,1195,688,11,22,17,14,6,1,372,456,783,709,634,1167,40,21,17,8,12,11,427,285,913,566,669,763,18,25,21,11,11,19,4 +240,356,889,700,682,669,33,12,12,14,12,11,321,327,614,633,725,1024,36,37,23,9,16,11,275,129,697,586,1102,749,25,13,15,1,8,2,239,169,861,753,889,928,9,13,27,4,4,13,216,236,833,767,1003,768,12,19,15,5,5,10,216,234,718,757,1146,752,13,11,14,1,8,0,254,306,677,550,802,1092,38,33,23,14,12,8,374,446,656,515,822,944,41,25,20,5,15,16,361,355,627,659,806,1024,15,24,21,4,16,17,353,165,893,821,1077,753,21,25,27,15,5,0,318,238,739,688,999,771,22,26,19,13,11,6,148,264,978,727,778,785,24,13,4,12,11,1,312,350,902,747,838,729,28,25,2,3,14,14,326,344,508,609,850,1020,33,34,14,13,8,9,286,316,717,640,1074,796,30,10,9,14,7,2,316,310,961,907,1295,621,22,24,19,14,7,1,346,570,738,768,674,1240,33,23,17,10,19,9,401,313,846,577,679,660,23,21,11,13,14,17,4 +256,328,806,654,643,650,25,13,12,16,11,14,411,379,547,627,658,1019,30,36,25,9,15,8,375,279,636,576,1043,730,19,14,15,3,9,1,299,273,782,711,856,929,13,14,27,6,7,14,306,320,754,729,954,749,16,18,15,7,8,13,332,312,639,741,1085,729,17,12,10,1,9,3,376,392,640,524,725,1089,30,32,25,14,11,9,434,446,589,481,741,931,33,28,20,5,14,13,427,375,574,603,787,1013,23,25,21,6,19,14,449,225,810,825,1008,742,25,24,25,15,4,3,392,320,660,668,928,746,24,29,15,11,10,3,220,262,895,685,699,770,16,14,2,10,10,2,372,318,825,691,767,702,20,26,2,5,13,11,420,328,517,575,769,999,25,33,14,13,9,12,358,306,636,636,993,775,22,11,9,12,8,5,396,390,880,905,1220,602,24,25,17,16,6,4,424,572,735,720,641,1225,27,24,17,10,18,10,397,281,765,531,672,661,17,24,15,11,15,14,4 +240,290,886,660,558,676,27,17,1,12,13,11,313,423,663,643,599,1017,32,32,32,19,11,13,319,267,734,664,996,756,25,14,22,1,3,4,247,311,812,733,791,947,3,16,32,2,11,17,264,320,800,791,907,779,12,18,22,3,10,10,256,262,709,805,1038,749,11,12,9,3,3,2,280,368,684,572,678,1087,34,24,32,20,11,12,386,394,645,511,694,929,35,18,25,15,12,18,371,387,730,593,690,1015,19,23,24,10,11,19,329,221,890,887,961,772,17,28,18,15,10,2,374,126,736,760,881,746,18,15,4,15,4,8,292,224,975,695,652,762,20,20,11,14,12,3,340,316,915,681,720,714,24,28,11,13,11,16,330,242,469,643,722,997,29,25,17,19,3,7,280,210,698,700,946,789,26,11,14,12,2,0,326,258,944,999,1173,640,18,21,10,12,12,1,348,530,673,700,550,1223,31,22,24,18,14,11,325,255,835,551,569,693,19,22,12,11,11,19,4 +347,413,876,859,611,642,37,27,19,12,9,14,348,248,607,728,616,833,40,30,12,11,11,10,256,184,700,819,1009,678,25,16,24,1,7,1,336,142,896,928,816,775,13,20,28,2,11,0,275,171,856,952,920,699,10,16,24,3,12,9,239,207,727,964,1051,715,9,14,19,3,9,9,313,263,746,761,691,907,34,22,28,16,9,3,375,387,701,720,707,777,37,24,29,7,10,15,472,274,660,822,763,883,19,27,30,2,17,16,318,164,866,970,974,692,17,22,12,15,6,1,327,267,712,903,894,696,18,19,24,15,6,5,249,307,951,840,665,624,28,28,15,14,8,0,375,351,869,910,733,682,30,28,15,5,9,13,343,291,549,804,735,889,29,19,23,15,7,10,243,277,740,877,959,721,26,13,18,12,6,9,249,377,962,1150,1186,626,18,27,30,12,8,6,477,505,813,935,615,1053,33,30,26,12,14,12,392,266,813,718,654,547,27,12,8,11,13,16,4 +235,413,849,712,571,685,28,11,16,15,2,11,302,206,612,647,564,916,29,36,15,8,4,13,234,202,677,576,909,743,16,14,9,2,12,4,266,172,785,753,744,938,12,14,21,5,10,17,261,159,767,753,834,774,9,20,9,6,9,10,153,189,672,713,951,706,10,12,8,0,12,2,225,219,655,556,601,948,27,34,15,13,12,12,327,303,620,533,611,836,30,26,14,4,5,18,406,216,665,679,711,942,20,23,15,5,10,19,296,230,853,791,878,801,18,24,19,14,7,2,303,309,699,652,794,631,19,29,13,12,7,8,211,337,938,741,567,645,19,12,12,11,3,3,321,301,874,767,633,629,21,24,10,4,4,16,295,269,538,593,643,874,22,35,8,12,12,7,185,251,669,592,859,742,19,11,3,13,13,0,303,433,909,875,1086,671,19,23,27,15,9,1,403,419,746,780,573,1102,34,22,11,9,9,11,352,250,808,593,634,728,24,24,17,12,14,19,4 +351,393,826,927,600,632,30,22,26,14,8,8,314,250,533,788,607,829,31,31,5,7,12,10,220,178,684,849,994,642,24,15,23,7,12,9,346,162,882,988,801,711,14,17,21,10,6,0,303,193,842,1000,905,621,19,23,23,11,7,9,191,209,695,996,1036,713,20,17,18,5,10,17,285,195,726,803,676,883,37,27,21,12,10,3,255,301,677,768,692,767,36,19,28,3,11,15,416,258,638,894,748,851,20,20,29,10,18,18,252,176,812,952,959,626,24,19,9,13,1,3,239,249,658,935,879,758,23,14,23,7,7,9,253,293,897,894,650,664,23,23,22,6,9,6,415,337,825,982,718,726,27,25,20,9,10,13,337,243,573,848,720,899,32,24,22,11,12,10,219,229,718,871,944,713,29,16,17,8,11,17,249,371,922,1160,1171,578,23,20,37,14,3,14,435,423,771,1003,602,1023,30,33,25,12,15,12,404,264,761,784,641,517,16,9,15,7,14,16,4 +280,316,911,680,588,764,34,7,4,12,10,11,361,317,602,609,619,1015,35,34,27,11,12,13,329,227,757,620,1014,828,20,16,17,9,14,4,257,255,877,719,813,1011,10,20,27,12,8,11,290,254,847,733,925,857,11,28,17,13,9,10,232,182,738,741,1056,797,12,16,4,7,8,2,306,234,677,534,696,1043,37,42,27,16,12,6,376,346,668,523,712,937,38,26,20,7,9,18,375,297,629,647,728,1039,16,21,19,12,16,19,295,225,915,799,979,874,20,22,19,11,1,2,302,214,761,688,899,740,21,29,1,5,7,8,218,244,1000,709,670,742,25,8,14,4,11,3,400,258,938,735,738,734,27,18,16,11,12,16,396,320,560,575,740,985,32,35,12,15,14,7,310,310,737,632,964,833,29,13,9,8,13,0,290,342,981,915,1191,746,21,17,15,12,1,1,326,464,712,748,584,1207,38,20,19,14,13,11,369,313,874,591,629,791,24,26,17,9,12,19,4 +304,338,938,697,666,661,37,9,10,14,10,12,365,349,615,634,675,1010,36,34,23,9,14,10,297,151,744,603,1022,741,19,16,15,7,10,1,275,193,910,734,863,910,19,18,27,10,8,12,284,240,878,754,929,762,14,24,15,11,9,11,240,218,769,750,1066,744,15,14,8,5,10,1,290,298,712,543,728,1078,34,36,23,14,12,7,364,398,695,528,742,930,37,24,20,5,13,15,379,351,582,662,802,1010,25,19,21,10,20,16,331,137,942,824,1001,739,23,22,21,13,3,1,278,182,788,681,921,767,22,29,13,7,9,5,190,242,1027,730,696,771,28,10,4,6,9,0,386,330,947,750,760,723,30,22,4,9,12,13,380,278,593,600,770,1016,29,35,14,13,10,10,296,248,768,641,994,792,26,13,9,8,9,3,316,280,1012,914,1217,613,22,19,19,14,5,2,342,528,683,763,664,1230,35,20,17,12,17,8,389,319,893,580,671,642,21,24,17,7,16,16,4 +225,391,803,762,711,687,32,22,19,11,17,10,252,304,688,635,760,1008,33,27,14,16,15,12,262,190,645,678,1059,755,22,15,22,2,3,3,260,164,833,837,824,888,12,15,30,1,9,8,223,239,805,859,924,774,17,9,22,2,10,9,251,233,636,851,1111,784,18,13,29,4,3,1,245,291,783,638,839,1072,41,19,26,19,3,5,369,427,736,565,867,938,38,25,25,12,10,17,334,330,771,717,803,1020,14,28,26,7,9,18,394,206,803,809,1084,749,26,25,18,14,10,1,371,281,649,782,1000,803,27,28,26,16,8,7,265,273,888,757,819,791,29,25,25,15,16,2,251,351,838,805,845,761,33,27,23,10,15,15,243,385,536,703,889,1036,38,20,27,18,3,8,289,363,685,698,1111,816,35,18,30,11,2,1,369,377,879,981,1252,643,27,28,28,11,12,0,377,557,814,840,707,1202,36,27,22,17,12,10,342,330,746,621,652,626,18,19,10,10,11,18,4 +279,349,884,710,625,729,28,11,12,10,6,11,350,284,577,629,642,958,23,36,19,1,6,11,262,180,736,562,997,781,8,14,9,1,8,2,272,202,850,739,822,982,24,14,19,6,12,13,285,237,822,739,920,800,11,20,9,3,13,10,211,215,713,707,1039,724,12,12,4,3,8,0,283,265,682,556,685,996,17,34,19,4,8,8,391,385,655,535,695,876,20,26,12,5,5,16,446,298,616,683,769,974,26,23,11,2,12,17,370,208,888,767,964,853,16,24,27,11,11,0,353,273,734,638,882,677,15,27,9,15,5,6,167,263,973,747,653,701,19,12,8,14,5,1,303,293,907,771,721,665,21,24,8,1,4,14,349,329,599,581,729,924,12,35,4,3,8,9,235,319,712,584,947,766,9,11,1,10,9,2,337,377,956,853,1174,715,15,23,23,10,13,1,423,503,725,776,625,1156,34,22,11,4,13,9,452,300,845,633,660,780,24,22,21,11,14,17,4 +350,438,1008,707,594,729,36,12,16,14,9,12,365,301,683,636,615,758,31,33,15,11,11,10,257,115,820,671,1012,719,16,17,17,7,13,1,315,155,990,778,809,900,12,17,29,10,11,10,268,160,956,796,923,728,1,21,17,11,12,11,206,212,841,812,1054,662,0,15,8,5,9,1,340,312,790,583,694,770,25,35,23,16,15,5,302,424,775,556,710,702,28,27,22,7,12,15,485,337,674,660,742,812,28,24,23,10,17,16,225,177,1010,882,977,823,8,21,11,13,0,1,318,248,856,755,897,577,9,32,13,7,6,5,276,326,1095,724,668,657,27,13,12,6,10,0,402,402,1015,748,736,599,29,25,14,9,11,13,392,278,653,638,738,706,20,34,16,15,13,10,208,272,842,719,962,698,17,14,11,8,12,3,204,348,1084,996,1189,725,9,24,27,14,2,2,480,556,735,781,596,928,42,23,19,12,14,8,371,311,961,570,639,780,22,27,17,7,13,16,4 +237,249,887,634,701,669,27,8,15,16,9,7,352,356,658,605,732,1038,30,33,26,9,11,19,400,234,727,534,1051,749,17,17,16,5,13,10,252,284,945,683,854,948,11,17,26,8,9,11,189,293,881,703,952,770,16,25,16,9,10,14,315,255,792,707,1095,748,17,15,9,3,9,8,335,319,739,488,811,1108,36,39,26,14,13,16,389,393,696,455,811,950,33,27,19,5,10,16,284,320,727,587,809,1032,11,20,18,8,17,9,396,188,843,791,1054,761,25,21,30,15,0,8,345,217,705,634,972,767,26,32,14,9,6,14,247,201,928,673,775,789,28,9,3,8,10,9,363,269,894,675,813,723,32,21,3,7,11,18,401,283,634,547,849,1020,37,34,11,13,13,13,389,261,807,596,1059,796,34,14,8,10,12,10,347,301,963,863,1238,621,26,20,16,16,2,9,247,515,784,696,693,1244,31,19,18,10,14,7,354,270,796,545,684,680,19,27,16,9,13,15,4 +290,514,905,796,649,767,36,24,22,12,9,14,341,219,662,701,688,878,31,25,13,15,13,6,293,155,809,784,1085,771,16,23,33,9,11,3,367,133,967,869,880,860,12,17,29,12,5,4,306,158,929,903,996,784,1,13,33,13,6,13,256,244,776,941,1127,750,0,19,20,7,11,11,348,304,811,706,767,836,25,25,29,20,9,1,316,420,766,651,783,808,28,27,36,11,12,11,505,269,781,753,791,910,28,30,37,12,17,12,277,255,893,947,1050,823,8,19,11,11,2,5,300,364,739,876,970,657,9,22,25,5,8,3,264,404,978,809,741,677,27,25,18,4,8,4,434,406,918,841,809,667,29,25,20,11,11,9,374,406,620,761,811,854,20,24,32,19,11,14,224,394,803,796,1035,790,17,22,27,12,10,11,246,444,995,1073,1262,745,9,30,29,12,4,8,516,478,868,870,645,1002,42,33,35,16,16,14,305,365,850,661,676,694,24,15,11,11,13,12,4 +287,365,824,746,652,706,26,11,14,14,6,8,272,248,709,679,659,1049,29,38,17,5,4,16,250,204,612,554,956,784,20,12,7,1,8,7,288,216,798,783,815,981,12,18,17,2,8,14,241,211,742,781,913,807,17,26,7,3,9,13,205,177,683,711,990,777,18,14,6,3,8,5,203,225,748,584,662,1109,35,40,17,10,8,15,355,299,683,557,648,961,32,22,10,5,3,15,338,226,712,709,792,1049,10,25,9,2,8,16,392,234,828,779,933,804,26,26,29,11,11,5,267,251,674,656,843,774,27,27,11,15,5,11,205,281,913,779,620,790,21,12,10,14,5,6,331,271,835,797,678,742,25,20,8,1,4,17,245,241,561,621,710,1025,30,35,2,9,8,10,285,223,684,558,898,817,31,9,1,12,9,3,365,383,920,843,1129,668,27,19,25,12,11,4,295,421,819,810,654,1249,30,24,9,6,11,8,390,254,779,659,705,725,26,22,19,11,10,16,4 +312,328,903,710,609,638,31,13,14,12,5,11,385,333,622,633,618,981,36,36,19,11,7,13,305,197,675,600,995,718,21,14,11,1,11,4,261,235,843,769,810,889,11,18,23,2,11,15,246,228,823,781,906,739,10,24,11,3,10,10,236,202,728,757,1037,721,9,12,12,3,11,2,274,280,663,574,677,1049,30,32,19,16,11,10,412,338,650,539,693,907,33,22,16,7,6,18,419,309,591,669,755,985,23,21,17,2,11,19,363,151,907,825,960,714,17,24,25,15,6,2,380,174,753,690,880,744,18,25,17,15,6,8,208,254,992,729,651,748,22,14,8,14,6,3,326,276,904,757,719,700,24,24,6,5,7,16,358,214,556,619,721,993,25,33,10,15,11,7,270,188,721,652,945,769,22,11,7,12,12,0,314,288,967,925,1172,590,18,19,23,12,6,1,382,468,724,782,609,1207,33,22,13,12,8,11,479,253,854,581,644,621,23,22,13,11,13,19,4 +247,277,839,663,615,667,29,9,13,12,5,10,340,384,684,628,628,1036,32,36,26,9,7,20,344,256,635,587,999,747,21,14,16,1,11,11,286,300,849,714,818,946,9,18,26,2,13,12,239,293,797,734,902,768,14,24,16,3,12,17,289,241,742,746,1043,746,15,12,5,3,11,9,287,325,705,545,703,1106,40,36,26,14,11,17,375,357,642,502,719,948,37,22,19,5,8,19,306,336,709,614,747,1030,13,23,18,2,13,12,424,198,843,830,978,759,23,24,28,15,4,9,321,161,697,677,898,765,24,25,10,15,6,15,231,213,928,696,673,787,26,10,5,14,6,10,351,263,886,702,737,721,30,22,7,3,7,21,325,217,552,584,747,1018,35,33,11,13,11,16,343,183,739,647,971,794,32,11,8,12,12,9,415,293,969,918,1194,619,24,19,16,12,6,8,267,481,756,727,611,1242,31,22,18,10,10,10,352,252,790,570,612,678,21,22,20,11,13,18,4 +242,358,851,714,639,670,27,14,16,16,9,11,371,309,556,641,658,969,32,35,17,9,13,11,295,173,705,608,1035,738,21,15,13,3,11,2,245,203,827,771,846,921,7,15,25,6,7,11,250,242,797,787,948,763,10,19,13,7,8,10,234,232,684,769,1077,735,9,13,12,1,11,0,312,302,665,570,717,1019,30,31,19,14,11,6,394,432,628,527,733,885,33,27,18,5,12,16,437,323,631,669,781,977,23,24,19,6,19,17,307,157,855,831,1000,760,17,23,21,15,2,0,366,286,701,702,920,714,18,28,17,11,8,6,186,274,940,737,691,712,18,15,10,10,8,1,342,340,886,757,759,694,20,25,8,5,11,14,378,358,532,627,761,959,25,32,12,13,11,9,250,336,683,656,985,767,22,12,7,12,10,2,280,336,927,929,1212,640,18,24,25,16,4,1,432,548,720,782,637,1171,33,23,15,10,16,9,411,321,810,591,668,679,21,23,13,11,15,17,4 +283,361,776,718,640,721,28,19,16,13,13,14,336,340,613,629,681,1062,33,34,21,6,11,8,326,222,574,568,1078,801,22,10,11,2,1,1,272,188,778,759,873,944,12,10,21,1,13,10,247,247,750,761,989,822,17,12,11,2,14,13,325,287,613,733,1120,802,18,8,20,4,7,3,287,361,716,560,760,1128,35,26,21,11,7,5,409,439,653,535,776,990,36,22,14,6,8,13,346,390,674,687,772,1068,16,31,15,1,13,14,486,188,774,797,1043,797,26,28,33,12,14,3,407,271,620,664,963,823,27,23,19,16,8,3,249,265,859,745,734,831,21,20,10,15,12,2,299,347,793,775,802,779,25,32,8,0,11,11,301,321,487,601,804,1074,30,27,12,10,1,12,389,295,622,598,1028,850,27,13,15,11,2,5,415,373,854,873,1255,673,27,31,21,13,16,4,331,565,791,790,632,1290,28,30,13,7,16,10,428,266,721,623,651,658,22,18,13,10,15,14,4 +323,407,865,864,737,602,35,25,21,15,8,10,294,244,580,723,774,857,38,32,14,6,12,10,194,146,705,786,1081,626,23,16,28,2,12,7,310,158,911,923,870,755,11,16,30,5,8,0,249,143,871,941,964,623,12,20,28,6,9,9,181,179,728,955,1131,697,13,18,23,0,10,15,257,243,733,746,853,921,38,24,30,11,12,3,269,353,698,701,867,791,41,20,33,2,11,15,396,260,645,831,839,873,17,23,34,5,18,16,258,208,853,895,1096,610,21,20,14,12,1,1,259,257,699,886,1014,748,22,15,28,12,7,7,239,323,938,833,819,674,26,26,13,11,9,4,363,341,864,919,861,698,28,24,13,4,10,13,309,261,574,795,893,911,33,19,27,10,12,10,215,241,749,830,1115,707,30,15,22,13,11,15,245,379,959,1111,1290,542,22,23,28,13,3,12,417,471,790,940,733,1067,35,32,30,7,15,12,382,256,802,719,688,509,23,8,6,12,14,16,4 +346,450,1110,632,622,829,38,14,8,11,16,11,339,363,793,603,629,964,33,39,23,14,16,13,255,137,874,520,1008,857,14,9,13,2,4,4,275,197,1030,677,819,1050,14,11,23,1,8,17,258,172,1022,685,919,858,1,17,13,2,9,10,194,160,929,673,1050,766,2,7,0,4,4,2,240,370,800,478,690,954,27,31,23,19,12,14,354,484,823,455,706,896,30,23,16,10,17,18,409,355,688,579,770,1010,26,26,15,5,14,19,365,277,1114,757,973,961,10,29,25,14,9,2,338,240,960,606,893,633,11,24,5,16,9,8,216,376,1199,673,664,781,29,15,10,15,15,3,308,392,1115,667,732,661,31,27,12,8,16,16,318,334,671,523,734,856,22,32,8,18,4,7,258,318,918,572,958,826,19,8,5,11,3,0,292,378,1162,845,1185,819,11,26,19,11,11,1,374,584,771,692,624,1118,44,27,15,15,19,11,453,325,1063,555,663,914,24,19,23,10,10,19,4 +362,408,830,749,670,621,27,19,19,12,5,14,345,189,573,616,699,816,22,30,16,3,7,10,259,231,676,667,1072,633,9,20,22,3,17,1,385,147,832,804,883,802,25,16,32,8,15,0,340,168,788,814,983,674,12,12,22,7,16,9,248,246,689,820,1114,640,13,18,19,3,15,9,344,258,724,633,774,882,16,26,28,6,19,3,360,344,691,612,790,746,19,32,27,5,12,15,509,217,660,728,794,826,27,31,28,6,13,16,351,255,826,832,1045,675,17,18,18,11,6,1,324,336,672,751,967,653,16,27,24,11,12,5,244,328,911,746,746,611,18,20,11,10,6,0,414,308,839,816,808,609,20,22,9,5,7,13,366,298,621,664,818,856,11,27,21,7,17,10,244,300,686,725,1042,666,8,17,16,10,16,9,306,452,918,990,1263,593,16,31,26,12,8,6,512,454,767,825,662,1044,33,30,24,8,10,12,433,241,781,630,671,586,23,20,6,11,13,16,4 +257,307,793,711,663,661,20,14,11,16,5,12,312,296,632,644,662,1030,23,41,20,5,3,10,250,228,637,575,983,741,18,9,10,5,9,1,332,246,759,742,848,940,20,17,20,8,9,14,301,267,731,736,914,760,23,25,10,9,10,11,233,231,620,702,1013,740,24,13,3,3,9,1,269,277,681,549,711,1100,25,37,20,10,9,9,379,333,616,528,691,942,26,23,13,1,4,15,400,286,663,672,797,1024,18,28,12,8,9,16,370,226,797,772,974,753,30,29,22,13,10,1,279,259,643,641,884,755,27,24,8,9,4,5,161,207,882,748,673,781,11,15,7,8,4,0,353,235,810,760,707,713,15,23,9,7,3,13,297,257,560,578,753,1008,20,32,5,9,9,10,251,253,621,579,941,784,21,6,2,10,10,3,389,377,863,862,1168,613,27,20,22,16,12,2,389,455,810,773,665,1236,24,27,12,10,12,8,366,258,752,628,710,672,18,19,20,9,11,16,4 +282,238,842,619,702,677,26,10,13,16,5,10,373,391,691,586,725,1038,25,37,30,9,7,12,327,247,606,539,1048,757,14,13,20,5,17,3,305,311,782,674,853,948,18,19,30,8,13,16,296,324,762,694,941,778,21,27,20,9,12,9,272,274,667,706,1096,758,22,15,7,3,13,1,320,332,690,485,796,1108,31,41,30,14,17,11,424,360,637,448,812,950,30,23,23,5,10,17,401,347,648,570,812,1032,18,24,22,8,13,18,409,177,846,788,1053,761,30,25,30,15,4,1,316,188,692,633,971,779,27,28,10,9,10,7,188,182,931,652,764,789,17,11,5,8,6,2,396,278,843,658,814,735,21,19,7,7,7,15,368,248,571,540,838,1030,26,36,15,13,17,8,300,224,660,603,1062,806,23,10,12,10,16,1,370,272,906,870,1273,629,27,18,12,16,6,0,340,482,801,683,698,1248,28,23,22,10,10,10,367,287,793,528,663,680,16,23,20,9,15,18,4 +202,372,789,701,595,690,23,18,13,13,11,11,287,259,664,648,600,971,28,35,18,12,9,11,247,253,643,617,973,758,19,13,8,0,3,2,297,211,781,764,788,949,9,13,20,3,15,13,312,246,755,784,884,785,14,13,8,4,16,10,260,296,624,764,1015,735,13,11,5,2,9,0,294,304,769,563,655,1011,24,27,18,17,9,8,376,374,702,520,671,889,27,25,13,8,10,16,419,285,733,648,743,985,19,30,14,3,15,17,363,237,793,844,938,792,17,25,20,16,16,0,384,368,639,703,858,696,18,26,10,14,10,6,264,286,878,724,629,700,18,19,9,13,10,1,298,300,826,736,697,676,16,29,7,6,9,14,280,350,534,622,699,943,21,28,7,16,3,9,234,354,661,665,923,777,24,12,2,13,4,2,376,448,859,942,1150,664,18,30,24,13,18,1,450,488,836,767,599,1169,29,29,10,13,18,9,337,309,746,572,642,715,23,21,18,12,17,17,4 +238,394,897,702,693,661,33,15,12,13,10,12,313,283,654,609,736,990,30,34,19,12,12,10,269,135,709,648,1057,733,19,16,21,0,8,1,243,133,875,777,826,886,9,16,33,3,8,10,188,192,843,803,930,754,14,18,21,4,9,11,210,206,732,815,1107,754,15,14,20,2,10,1,258,290,697,584,819,1058,36,30,27,17,8,5,370,434,674,529,843,916,33,28,26,8,11,15,375,327,697,657,791,994,15,25,27,3,16,16,307,169,901,839,1062,723,23,22,19,16,5,1,326,270,747,746,984,777,24,29,19,14,7,5,206,284,986,711,799,761,26,16,10,13,9,0,332,362,936,745,835,733,30,26,10,6,10,13,308,344,532,653,865,1014,35,31,20,16,8,10,256,320,731,710,1087,794,32,13,15,13,7,3,296,362,975,977,1232,617,24,25,23,13,7,2,380,552,776,778,685,1216,39,24,23,13,15,8,373,307,848,567,666,608,17,24,5,12,14,16,4 +223,363,867,742,686,673,36,8,13,15,8,11,320,306,600,669,705,1000,35,33,18,10,12,11,282,128,685,680,1022,747,22,17,16,6,12,2,264,180,853,799,809,892,12,17,28,9,6,9,283,231,823,819,895,766,13,23,16,10,7,10,217,201,700,823,1072,762,14,15,5,4,10,0,271,259,689,598,792,1066,39,37,22,15,10,4,349,405,654,565,808,930,40,27,21,6,11,16,348,328,631,697,786,1012,18,20,22,9,18,17,310,168,867,867,1037,741,22,21,12,14,1,0,277,261,713,768,955,781,23,32,10,8,7,6,185,275,952,767,764,781,27,9,9,7,9,1,365,343,876,785,802,739,29,21,13,8,10,14,341,353,544,659,832,1024,34,34,15,14,12,9,267,329,703,706,1056,802,31,14,10,9,11,2,335,343,943,989,1231,625,23,20,24,15,3,1,327,525,770,810,676,1212,36,19,18,11,15,9,320,328,820,611,655,620,22,27,16,8,14,17,4 +184,348,785,735,615,681,21,18,9,11,10,15,381,337,514,672,632,1006,26,33,22,10,14,7,361,241,703,627,969,759,23,17,12,10,10,2,293,221,791,778,820,960,17,11,22,13,2,9,316,288,759,798,920,778,18,13,12,14,3,14,302,296,624,776,1003,738,19,15,1,8,10,4,336,338,639,575,679,1064,24,27,22,13,10,4,386,420,598,540,661,918,27,27,15,6,13,12,369,341,611,692,759,1012,29,30,14,13,12,13,343,227,783,840,950,795,19,21,20,10,3,4,310,326,637,721,858,721,18,28,6,4,9,2,224,262,868,768,631,745,12,19,9,3,9,3,384,308,820,780,685,697,14,27,11,12,12,10,398,358,536,630,727,972,19,28,7,14,10,13,322,354,635,629,911,776,16,14,4,7,9,6,390,410,863,920,1142,651,18,30,20,11,5,5,380,538,740,795,615,1204,25,29,14,15,17,11,297,327,750,640,658,718,15,19,18,10,14,13,4 +206,314,841,706,622,644,28,9,10,16,8,6,295,337,646,647,621,995,31,34,21,9,12,16,275,199,661,586,958,724,22,16,11,5,12,7,277,237,833,747,789,905,10,20,21,8,8,14,246,250,769,747,857,745,15,26,11,9,9,13,228,204,704,731,1004,725,16,14,2,3,10,5,252,274,669,556,684,1065,37,36,21,14,12,15,346,356,618,535,700,915,34,22,14,5,11,15,319,295,685,665,746,995,14,19,13,8,18,12,359,171,845,807,951,724,24,22,21,15,1,5,276,204,691,668,869,746,25,27,7,9,7,11,190,228,930,739,658,754,23,10,8,8,9,6,334,254,874,753,710,702,27,22,10,7,10,17,292,252,544,593,728,997,32,35,6,13,12,12,282,228,699,624,952,773,29,13,3,10,11,7,376,308,945,903,1169,596,25,17,21,16,3,6,308,478,750,770,622,1213,32,20,13,10,15,6,341,269,800,605,631,637,22,24,19,9,14,14,4 +275,355,870,728,597,740,28,9,13,13,6,11,354,288,553,639,612,961,27,32,18,8,10,11,258,138,718,642,1005,790,12,18,12,8,14,2,294,176,852,765,806,969,24,18,24,11,10,9,277,217,820,773,916,825,15,24,12,12,11,10,199,207,705,765,1047,757,16,16,5,6,12,0,273,253,694,584,687,989,21,38,18,13,14,4,341,371,663,567,703,883,24,28,17,4,9,16,402,308,610,699,739,985,28,21,18,11,16,17,292,170,872,823,970,844,22,20,16,12,3,0,255,251,718,706,890,696,21,33,10,6,9,6,159,251,957,755,661,694,19,10,9,5,7,1,369,313,883,787,729,690,21,22,9,10,8,14,361,297,581,621,731,939,16,33,11,12,14,9,249,277,706,656,955,793,13,15,6,7,13,2,299,349,948,937,1182,722,21,21,24,13,5,1,389,491,721,796,599,1153,30,20,14,13,13,9,378,286,825,619,644,757,20,28,16,8,16,17,4 +309,399,983,678,656,727,40,21,17,11,16,11,318,336,680,621,677,1050,39,36,24,14,14,11,276,136,741,526,1036,801,20,10,14,2,4,2,192,130,939,729,875,1004,16,14,24,1,8,17,233,193,911,717,971,822,7,16,14,2,9,10,235,245,808,699,1078,782,8,10,21,4,4,0,235,349,753,534,740,1100,33,28,24,19,4,12,365,461,734,477,734,962,36,22,17,10,11,16,378,376,625,623,796,1056,22,27,16,5,8,17,374,174,987,777,1015,837,16,28,32,14,9,0,371,241,833,634,923,761,17,25,20,16,9,6,245,289,1072,711,696,781,31,14,11,15,15,1,235,401,980,711,760,735,33,24,9,8,16,14,321,337,578,565,782,1010,28,29,13,18,4,9,323,311,801,570,986,824,25,13,16,11,3,2,307,327,1047,843,1213,693,17,23,18,11,11,1,331,591,798,744,652,1244,38,26,16,15,11,9,434,322,932,583,679,760,28,20,14,10,10,17,4 +228,308,775,667,575,638,21,15,11,15,0,8,357,247,602,614,584,953,22,36,20,10,4,12,319,275,671,583,973,716,17,14,12,6,14,5,311,231,743,700,782,905,11,14,24,9,12,16,312,250,695,708,884,743,16,20,12,10,11,7,268,252,628,712,1015,703,15,12,3,4,14,3,342,260,645,515,655,1013,26,30,20,15,14,13,388,308,588,508,671,865,25,26,17,6,7,13,421,243,699,630,723,957,21,23,18,9,10,14,373,259,779,794,938,740,23,24,16,14,9,3,350,318,625,649,858,682,24,27,8,8,9,9,226,252,864,700,629,688,12,16,7,7,1,4,394,218,842,718,697,660,16,24,9,8,2,11,356,276,522,558,699,931,21,31,11,14,14,6,258,274,623,613,923,739,18,11,6,9,15,5,368,444,867,888,1150,612,24,23,22,15,11,4,426,426,744,731,577,1153,27,22,14,11,11,6,361,261,742,548,620,663,21,22,14,8,16,14,4 +270,414,902,690,639,685,33,15,14,11,15,11,339,237,687,653,644,1010,38,40,17,10,13,13,245,187,676,548,971,763,23,8,7,2,1,4,249,163,830,741,820,964,9,10,17,1,11,17,270,146,816,749,906,784,8,18,7,2,12,10,212,194,723,715,1013,744,7,6,6,4,5,2,254,276,674,538,669,1062,32,32,17,15,5,14,380,396,645,493,669,922,35,22,10,6,10,18,427,267,634,643,787,1016,21,29,9,1,11,19,395,193,906,799,944,799,15,30,25,16,12,2,372,264,752,646,856,723,16,23,11,16,6,8,192,318,991,723,631,743,24,16,10,15,14,3,240,336,911,731,695,701,26,28,8,4,13,16,314,294,539,587,713,972,27,33,2,14,1,7,244,274,712,584,921,782,24,9,1,11,0,0,328,390,958,861,1148,655,16,27,25,11,14,1,402,504,769,756,643,1206,35,28,9,11,14,11,439,239,857,591,686,722,25,18,19,10,13,19,4 +289,395,790,994,585,610,29,26,19,15,11,10,312,268,545,873,608,821,34,29,12,12,15,8,252,222,708,992,997,628,27,11,32,6,9,11,340,190,870,1073,808,657,7,13,28,9,5,2,295,177,832,1115,908,595,12,19,32,10,6,11,193,231,671,1145,1039,713,13,13,25,4,9,19,295,267,738,922,679,863,38,21,28,17,11,1,271,333,683,855,695,765,37,15,35,8,14,13,462,268,738,953,727,847,15,24,36,9,17,18,242,206,770,1043,962,592,21,17,6,14,4,5,265,267,616,1082,882,768,22,12,24,8,10,11,249,313,855,959,653,662,24,27,23,7,10,8,379,335,807,1041,721,712,28,29,23,8,13,11,357,201,519,975,723,917,33,22,31,16,9,12,231,195,706,948,947,717,30,14,26,9,8,19,227,391,888,1235,1174,548,22,24,30,15,6,16,499,463,753,1070,583,1025,31,35,34,13,18,14,316,190,723,841,610,461,21,5,14,8,15,14,4 +356,400,989,829,544,723,29,25,13,12,16,11,217,373,690,740,475,684,24,20,18,1,14,13,121,331,859,653,726,669,23,12,8,1,6,4,373,353,903,802,617,814,13,28,18,6,10,17,352,328,901,746,691,650,8,28,8,5,9,10,106,222,808,606,728,618,7,16,5,1,2,2,172,310,691,645,462,722,18,14,18,4,2,14,206,284,710,672,502,636,21,8,11,3,9,18,357,273,711,826,636,736,35,21,10,4,10,19,289,237,993,682,693,815,1,24,34,9,7,2,190,188,839,583,589,563,2,13,10,13,7,8,296,326,1078,902,496,663,20,22,9,12,15,3,354,306,1034,912,498,627,22,26,7,3,14,16,224,174,590,640,482,626,13,13,3,5,6,7,156,152,797,489,636,624,10,9,0,12,5,0,334,266,1041,746,869,721,2,23,24,12,9,1,390,336,736,887,530,850,35,24,10,6,9,11,355,323,964,800,637,856,15,20,20,13,8,19,4 +223,541,904,736,676,806,36,21,18,12,14,13,226,226,661,673,681,935,31,34,13,9,12,9,248,154,718,554,946,828,16,12,3,1,6,0,232,146,884,777,857,1021,12,4,13,2,6,13,193,143,856,779,943,829,1,12,3,3,7,12,213,261,733,727,964,737,0,8,10,3,6,2,187,359,754,576,688,925,25,26,13,14,6,8,275,465,717,533,626,867,28,20,6,5,13,14,344,310,712,685,824,981,28,35,5,2,6,15,342,262,908,797,947,938,8,28,35,15,7,2,323,397,754,668,843,614,9,21,15,15,11,4,269,445,993,769,614,758,27,22,14,14,13,1,199,433,917,773,668,644,29,32,12,3,14,12,265,419,563,617,740,827,20,27,2,13,6,11,301,421,736,544,872,797,17,15,5,12,5,4,311,407,976,829,1111,798,9,33,29,12,9,3,369,537,833,798,680,1089,42,34,5,10,9,9,338,392,861,637,723,897,20,12,19,11,12,15,4 +296,382,1038,653,649,744,33,20,15,10,15,10,361,315,783,646,654,991,34,35,28,13,13,12,313,173,786,571,1021,804,19,15,18,3,1,3,247,189,962,708,856,1011,9,15,28,0,11,18,240,190,952,730,938,821,4,19,18,1,12,9,256,182,859,740,1063,755,3,13,7,5,5,1,266,332,780,523,711,1015,28,29,28,18,9,15,434,444,763,472,719,907,31,25,21,9,14,17,393,323,730,598,799,1015,25,26,20,4,11,18,409,177,1042,834,986,874,11,23,30,13,12,3,374,244,888,665,906,680,12,30,12,17,6,7,180,298,1127,692,677,714,24,15,3,16,14,2,298,342,1031,686,745,678,26,27,5,7,13,15,316,334,611,576,749,925,23,30,13,17,1,8,302,306,848,633,971,797,20,14,10,10,0,1,324,338,1094,900,1198,726,12,26,14,10,14,0,346,556,825,715,651,1169,39,25,20,14,16,10,467,291,985,576,686,805,25,23,18,9,13,18,4 +236,410,830,746,626,682,31,16,17,12,13,13,291,263,617,649,645,1023,36,37,14,7,11,9,225,159,664,600,998,758,25,11,8,3,1,0,237,149,806,797,833,955,7,11,20,0,13,13,238,216,776,803,933,781,10,17,8,1,14,12,234,246,663,773,1040,757,9,9,13,5,7,2,236,284,686,604,692,1083,32,29,14,12,7,8,372,400,631,563,696,935,35,21,13,7,8,14,391,287,676,715,768,1023,21,26,14,0,13,15,373,173,834,837,967,778,15,27,24,13,14,2,366,316,680,706,883,754,16,22,18,17,8,4,204,306,919,763,654,764,22,17,13,16,12,1,250,352,853,803,722,722,24,29,11,1,11,12,256,350,525,645,740,1001,27,30,7,11,1,11,238,330,662,630,948,793,24,8,8,10,2,4,366,384,906,911,1175,642,16,26,28,14,16,3,382,522,781,820,624,1223,33,25,10,8,16,9,395,303,789,635,655,699,23,19,12,9,15,15,4 +278,416,862,757,724,686,34,16,27,10,17,7,233,315,705,624,755,973,29,31,16,17,15,13,245,99,688,643,966,744,14,19,26,3,3,10,239,159,876,824,723,825,12,19,20,0,9,11,230,188,816,834,807,751,17,15,26,1,10,8,180,240,725,816,1028,789,18,17,33,5,3,8,180,284,792,621,858,1033,33,23,20,18,3,12,308,416,735,562,884,915,30,29,27,13,10,14,315,371,756,714,760,995,16,22,28,8,9,15,323,171,864,782,995,726,26,23,14,13,10,8,302,258,710,751,935,812,27,24,30,17,8,14,292,316,949,758,836,776,29,21,29,16,16,9,306,420,881,802,822,768,33,23,27,11,15,12,238,298,553,678,878,1031,38,24,31,17,3,7,232,294,726,643,1086,817,35,16,34,10,2,6,338,310,968,930,1115,640,27,22,38,10,12,7,316,558,797,837,698,1157,40,21,24,16,12,7,325,351,807,620,635,567,18,25,16,9,11,15,4 +367,431,1083,679,604,803,37,8,13,14,9,11,370,388,758,596,631,820,32,35,18,13,13,13,270,100,885,663,1028,777,15,15,24,1,11,4,302,174,1061,756,825,932,13,17,34,4,9,9,271,175,1029,790,939,782,0,23,24,5,10,10,185,249,914,818,1070,742,1,13,19,1,11,2,345,363,853,597,710,788,26,37,30,18,13,6,297,479,848,540,726,766,29,23,29,9,12,18,478,426,741,634,744,866,27,22,30,4,19,19,202,198,1085,862,993,867,9,23,16,17,2,2,349,293,931,755,913,679,10,28,20,13,8,8,297,337,1170,692,684,717,28,9,13,12,8,3,397,451,1086,722,752,655,30,21,13,7,11,16,407,347,676,644,754,734,21,36,23,17,11,7,203,335,915,727,978,776,18,12,18,14,10,0,163,299,1157,996,1205,789,10,20,24,14,4,1,477,615,774,755,600,956,43,21,26,14,16,11,370,386,1034,550,627,822,21,23,6,13,15,19,4 +285,375,930,693,647,704,31,13,15,11,10,11,358,352,623,598,694,1043,34,38,20,10,14,11,322,118,730,573,1069,782,21,12,12,2,10,2,166,150,898,752,856,925,7,12,24,1,2,13,213,215,870,762,970,803,6,20,12,2,3,10,225,239,759,744,1113,787,7,10,23,4,10,0,265,351,716,549,769,1109,32,34,20,15,10,8,375,461,693,506,789,971,35,26,17,6,13,16,380,408,638,658,773,1049,21,25,18,1,14,17,290,164,934,788,1048,778,15,26,30,16,3,0,389,231,780,675,968,810,16,27,22,16,9,6,239,287,1019,712,743,812,22,14,13,15,9,1,277,395,935,746,801,766,24,26,11,4,12,14,367,323,529,602,817,1059,27,35,15,14,10,9,307,301,756,615,1041,835,24,9,18,11,9,2,247,297,1002,886,1264,656,16,25,22,11,5,1,355,591,723,769,641,1271,37,24,14,11,17,9,430,338,883,576,626,639,21,22,12,10,14,17,4 +250,372,953,691,607,739,36,8,11,17,10,11,327,269,634,652,604,954,31,35,20,8,14,11,249,167,771,555,967,783,16,15,10,4,10,2,233,195,901,726,790,982,12,17,20,7,8,17,236,178,877,724,882,796,1,23,10,8,9,10,170,182,778,692,1009,724,0,13,3,2,10,0,238,234,701,531,653,974,25,37,20,13,12,12,334,352,692,512,665,876,28,25,13,4,13,16,385,279,621,648,751,982,28,20,12,7,20,17,295,201,957,776,932,859,8,23,22,14,3,0,284,250,803,629,852,643,9,30,8,10,9,6,188,290,1042,730,623,691,27,9,7,9,9,1,294,294,970,736,691,641,29,21,9,6,12,14,334,270,598,566,695,884,20,36,5,12,10,9,226,250,771,581,917,776,17,12,2,11,9,2,300,376,1017,860,1144,715,9,20,22,15,5,1,384,470,724,753,611,1130,42,21,12,9,17,9,417,265,912,604,666,798,22,25,20,10,16,17,4 +264,306,903,670,660,686,27,10,8,16,10,11,323,333,652,623,657,1055,32,37,23,9,12,11,287,203,709,550,968,766,19,13,13,3,14,2,263,239,851,711,825,965,9,21,23,6,8,17,238,256,827,717,893,785,14,29,13,7,9,10,214,212,728,705,1006,765,15,17,0,1,8,0,268,264,665,516,718,1125,34,41,23,14,12,12,374,346,642,481,702,967,35,23,16,5,9,16,351,303,649,621,782,1049,19,24,15,6,16,17,327,171,907,785,969,778,23,25,23,15,1,0,286,196,753,640,881,780,24,28,5,11,7,6,200,230,992,711,680,806,20,11,10,10,11,1,378,260,920,709,712,738,24,19,12,5,12,14,340,250,558,555,758,1033,29,36,8,13,14,9,272,228,721,580,952,809,26,10,5,12,13,2,318,300,967,861,1169,638,24,16,19,16,1,1,300,464,748,730,660,1261,33,23,15,10,13,9,379,285,862,593,691,697,21,23,21,11,12,17,4 +262,378,884,711,661,704,35,12,17,12,12,13,325,317,603,664,670,1069,36,39,18,7,16,9,259,139,698,551,1003,784,21,11,8,1,8,0,239,147,862,756,862,979,15,13,18,2,4,15,254,232,834,762,950,805,14,19,8,3,5,12,256,258,713,724,1033,783,15,9,9,3,8,2,248,310,692,559,711,1139,36,33,18,12,12,10,376,418,663,516,691,981,39,23,11,5,15,14,353,339,606,668,807,1063,21,26,10,2,14,15,403,159,888,804,984,792,23,27,28,13,5,2,332,290,734,655,892,802,24,24,14,15,11,4,206,280,973,742,665,820,26,13,9,14,11,1,290,364,893,756,715,758,28,25,7,1,14,12,306,330,549,600,755,1055,31,32,3,11,8,11,302,310,712,589,941,831,28,8,4,12,7,4,382,346,956,864,1172,656,24,24,24,14,7,3,314,542,763,777,661,1277,33,25,10,8,19,9,393,287,839,618,696,711,21,19,16,11,14,15,4 +243,505,949,725,670,798,38,16,18,14,15,12,250,238,648,678,675,935,33,37,13,7,13,10,216,108,779,545,936,810,14,7,3,1,5,1,216,96,923,764,851,989,14,9,13,4,7,14,223,149,895,770,937,795,1,15,3,5,8,11,161,239,778,722,958,729,2,5,10,1,5,1,193,307,751,563,682,947,27,29,13,12,5,9,297,425,722,526,618,861,30,19,6,3,12,15,364,304,685,678,818,967,26,30,5,4,7,16,332,236,953,792,941,916,10,31,37,13,8,1,299,359,799,657,837,658,11,20,15,13,10,5,197,407,1038,766,604,742,29,17,14,12,14,0,255,435,966,766,664,658,31,29,12,3,15,13,283,379,598,608,734,853,22,30,2,11,5,10,251,373,777,541,866,787,19,10,5,14,4,3,311,405,1021,828,1101,782,11,28,29,14,10,2,361,521,786,789,674,1105,44,29,5,8,10,8,388,350,908,634,717,881,22,15,21,13,11,16,4 +272,372,995,792,529,728,33,27,11,15,16,11,215,285,724,701,498,759,28,18,20,6,16,13,165,251,851,634,769,712,19,6,10,2,8,4,305,255,913,791,668,901,9,22,20,5,8,17,336,218,907,751,740,703,4,22,10,6,9,10,120,154,814,675,791,627,3,10,3,0,4,2,192,242,747,612,495,771,22,10,20,11,6,14,182,292,744,621,495,701,25,2,13,2,11,18,333,237,757,775,661,817,31,19,12,5,10,19,263,235,999,751,756,850,5,22,32,12,7,2,214,226,845,628,652,544,6,7,8,12,9,8,306,318,1084,847,489,678,24,28,7,11,15,3,322,270,1028,861,503,608,26,28,9,4,16,16,258,212,600,619,537,653,17,11,5,10,8,7,166,184,803,530,697,661,14,3,2,13,7,0,308,356,1047,821,932,732,6,27,22,13,7,1,370,410,800,854,523,915,39,30,12,7,11,11,311,277,962,745,622,861,17,14,22,12,10,19,4 +253,401,1011,697,616,794,36,16,5,15,10,9,366,284,720,648,629,929,31,29,26,12,12,11,346,210,861,619,998,822,16,21,16,6,14,10,256,224,985,746,827,1015,12,19,26,9,10,11,209,165,947,764,923,823,1,19,16,10,11,8,231,159,870,770,1038,731,0,19,3,4,8,8,323,299,771,551,692,925,25,33,26,17,14,12,399,419,754,514,694,861,28,31,19,8,11,16,388,290,771,650,762,975,28,28,18,9,16,17,292,256,1015,844,971,926,8,17,20,14,1,8,331,255,861,709,885,598,9,34,2,8,7,10,209,337,1100,730,660,746,27,17,13,7,11,9,397,323,1036,738,720,626,29,21,15,8,12,14,393,361,658,608,734,827,20,34,11,16,14,5,281,339,867,657,946,791,17,18,8,9,13,6,235,379,1113,936,1173,784,9,28,16,15,1,7,359,509,814,759,616,1087,42,27,18,13,13,9,418,278,970,618,659,879,22,27,18,8,12,17,4 +280,340,895,731,751,727,31,19,25,11,15,5,267,409,746,626,786,1046,28,32,8,12,13,17,257,133,663,623,1013,799,17,18,18,2,5,8,267,227,935,800,772,914,15,20,22,1,9,13,214,268,869,818,860,820,20,22,18,2,8,10,220,284,792,796,1073,820,21,16,31,4,1,6,194,334,829,599,881,1110,36,28,16,17,1,10,348,416,766,538,909,980,33,20,15,8,8,12,315,425,745,690,797,1058,13,19,16,3,9,13,391,141,865,798,1048,787,29,20,22,14,8,6,278,206,723,731,978,843,30,29,32,16,6,12,220,252,950,742,861,827,32,10,21,15,14,7,302,388,894,778,855,799,36,20,19,6,13,14,244,308,612,662,911,1080,41,27,23,16,5,9,304,294,795,645,1121,860,38,15,26,11,4,6,366,224,1003,922,1168,683,30,21,34,11,10,5,276,564,858,807,729,1254,37,18,16,13,10,5,407,401,808,604,666,640,17,22,12,10,9,13,4 +269,363,780,756,621,664,22,14,17,11,10,11,346,222,605,667,618,1003,27,39,14,2,8,13,256,260,626,560,901,744,18,9,4,2,6,4,244,198,716,781,776,933,16,11,14,5,18,17,309,225,694,765,864,767,19,17,4,2,19,10,255,273,617,703,941,741,18,7,9,4,12,2,277,235,646,600,607,1075,25,31,14,5,12,12,405,289,583,585,597,917,28,21,7,6,13,18,428,226,650,737,765,1003,20,28,8,1,18,19,424,266,784,763,878,760,26,29,26,12,19,2,411,339,654,642,788,738,27,22,14,16,13,8,253,273,869,793,565,750,13,15,13,15,9,3,243,273,815,825,647,706,15,27,11,0,8,16,299,235,541,615,657,989,20,32,1,4,6,7,249,237,596,556,849,779,21,8,4,11,7,0,411,461,836,817,1076,630,27,26,28,9,21,1,415,415,771,828,625,1211,24,27,6,3,21,11,462,198,747,673,680,679,22,17,16,10,14,19,4 +235,355,863,695,619,670,33,14,11,14,11,10,290,274,662,658,614,1037,34,41,20,9,9,12,224,208,667,571,963,750,23,9,10,1,3,3,276,208,807,736,804,947,9,15,20,4,11,18,263,205,783,742,874,771,14,21,10,5,12,9,205,199,686,722,1007,749,15,9,3,1,5,1,241,251,665,543,671,1107,40,35,20,14,9,13,363,351,626,514,683,949,39,21,13,5,10,17,372,258,671,648,751,1031,15,28,14,4,11,18,358,204,867,806,938,760,23,29,20,15,12,1,295,241,713,659,860,768,24,22,8,13,6,7,171,275,952,732,641,788,26,15,7,12,10,2,325,269,882,736,701,724,30,23,9,3,9,15,277,263,494,582,713,1021,35,30,7,13,3,8,235,241,677,609,935,797,32,6,2,14,4,1,365,365,923,888,1156,622,24,22,22,14,14,0,341,471,740,757,621,1243,33,27,12,10,14,10,384,236,822,588,670,679,21,17,18,13,13,18,4 +316,426,1077,670,603,831,37,16,5,16,13,10,361,297,754,645,598,906,32,41,26,11,11,12,243,207,875,552,953,843,15,9,16,3,3,3,287,207,1007,709,796,1032,13,11,26,6,11,18,328,156,991,713,878,832,0,21,16,7,10,9,214,154,898,703,995,744,1,9,3,1,3,1,310,348,785,512,649,912,26,35,26,16,11,13,374,450,798,487,651,834,29,25,19,7,12,17,453,299,695,623,755,958,27,30,18,6,11,18,349,269,1081,793,922,977,9,29,26,17,10,1,358,258,927,640,838,625,10,26,2,11,4,7,218,350,1166,711,613,793,28,17,13,10,12,2,326,332,1094,709,677,693,30,29,15,5,11,15,376,356,672,551,687,802,21,36,11,15,3,8,218,328,887,590,903,792,18,10,8,12,2,1,308,404,1133,869,1130,837,10,28,16,16,12,0,416,546,750,730,611,1064,43,27,18,12,14,10,453,277,1036,615,670,946,25,21,24,11,11,18,4 +358,302,918,678,717,681,34,12,14,14,8,12,459,369,705,663,720,1044,39,33,29,11,10,14,393,259,688,584,999,763,28,17,19,1,12,5,209,301,830,733,862,954,10,19,29,4,12,16,288,278,830,755,914,784,13,25,19,5,13,11,308,218,737,755,1057,762,12,15,6,1,10,3,356,324,656,538,771,1114,35,35,29,16,12,15,488,372,637,477,761,960,38,23,22,7,9,19,393,323,686,621,835,1042,18,20,21,4,14,20,413,199,922,845,1018,767,18,21,31,17,3,3,422,184,768,680,924,781,19,30,11,13,5,9,262,234,1007,719,715,795,25,7,4,12,9,4,366,274,951,709,763,735,27,19,6,5,10,17,450,234,537,601,809,1034,30,34,14,15,12,8,364,202,726,632,1011,810,27,14,11,14,11,1,334,302,970,903,1228,635,19,18,13,14,3,2,296,496,745,738,713,1258,30,19,21,12,11,12,481,247,865,595,666,686,26,27,19,13,12,20,4 +235,371,855,765,607,683,27,6,15,16,2,11,268,242,612,698,594,1002,32,33,16,5,6,11,204,192,695,609,911,755,13,17,6,3,12,2,276,188,827,798,766,934,15,19,18,6,12,13,263,221,799,788,854,780,14,25,6,7,13,10,171,187,684,728,953,758,15,15,7,1,12,0,187,179,689,601,613,1062,28,39,16,10,12,8,301,297,646,582,625,922,31,25,11,1,5,16,322,244,665,734,743,1006,17,20,12,6,12,17,328,218,859,804,884,761,23,21,22,11,7,0,239,277,705,673,796,755,24,30,12,11,7,6,183,277,944,796,581,755,18,7,11,10,3,1,317,291,876,822,639,719,20,19,9,5,4,14,259,275,574,630,659,1004,23,34,5,9,12,9,235,271,683,593,861,798,20,14,2,12,13,2,357,391,927,880,1088,641,24,18,26,14,9,1,321,417,800,831,607,1216,33,19,8,8,9,9,342,272,816,660,678,678,21,25,18,11,14,17,4 +309,423,836,794,617,669,34,27,16,15,14,14,310,242,561,669,630,824,29,28,15,10,12,8,228,182,698,740,1007,697,18,14,21,2,0,1,354,148,844,869,828,860,10,16,31,5,12,4,313,161,804,897,922,740,3,16,21,6,13,11,225,197,685,893,1049,678,2,12,20,0,6,5,325,269,704,692,693,840,23,20,27,15,8,1,311,385,659,615,705,760,26,24,26,6,13,13,514,282,654,749,761,868,30,27,27,5,12,14,254,208,830,879,972,751,6,24,13,16,13,3,333,285,676,830,892,601,7,19,17,12,7,3,279,311,915,771,663,597,25,28,16,11,13,2,377,353,843,837,731,603,27,28,16,4,12,11,329,357,533,749,735,808,18,19,20,14,0,12,185,333,692,790,957,706,15,11,15,13,1,5,249,409,922,1063,1184,657,7,27,27,15,15,4,527,499,791,870,615,1014,40,28,23,11,15,10,314,290,781,647,646,658,20,12,7,12,14,14,4 +250,306,911,656,728,627,29,8,8,13,8,11,359,355,672,579,779,968,28,33,27,12,12,11,317,181,691,622,1096,703,15,17,21,0,12,2,243,229,859,731,865,876,17,17,33,3,10,13,248,272,835,763,969,724,18,23,21,4,11,10,232,262,740,789,1146,714,19,15,18,2,10,0,304,306,685,556,854,1036,32,37,27,17,14,8,400,392,670,499,882,890,33,27,26,8,11,16,403,357,649,607,830,968,19,20,27,3,18,17,345,141,915,835,1111,697,27,21,23,16,1,0,362,220,761,720,1029,737,26,32,15,14,7,6,184,214,1000,671,834,731,20,9,10,13,9,1,332,312,918,695,868,693,22,21,8,6,10,14,374,278,586,617,906,982,27,34,20,16,12,9,266,256,735,692,1130,760,24,14,15,13,11,2,288,306,981,957,1305,581,26,20,15,13,3,1,386,522,774,728,724,1190,31,19,23,13,15,9,421,281,864,521,675,608,17,27,7,12,14,17,4 +269,401,935,809,563,687,37,12,16,14,4,11,326,232,622,740,556,922,34,33,15,7,8,11,244,210,757,689,911,753,21,17,9,1,12,2,268,166,879,860,740,940,13,17,21,4,14,15,241,169,857,866,822,790,6,21,9,5,13,10,173,193,762,834,953,722,5,15,8,1,12,0,253,225,699,669,595,976,28,33,15,12,12,10,351,319,686,646,609,838,31,25,14,3,7,16,416,228,647,770,715,956,25,22,15,4,14,17,298,204,939,924,876,813,11,21,19,13,7,0,303,301,785,773,796,645,12,28,13,13,7,6,173,317,1024,832,567,653,28,13,12,12,3,1,331,313,948,858,637,645,30,25,10,3,6,14,327,253,610,708,637,892,23,34,8,11,12,9,213,251,755,739,861,750,20,14,3,14,13,2,293,417,1001,1016,1088,685,12,22,27,14,9,1,409,435,740,879,571,1114,37,21,11,8,11,9,432,252,892,684,624,738,25,25,17,13,14,17,4 +290,278,1026,633,691,681,36,14,3,11,16,11,379,439,703,604,728,1048,39,29,34,22,14,11,285,201,778,623,1043,761,22,21,24,4,2,2,193,263,974,706,846,958,12,23,34,1,10,17,268,318,950,762,944,782,7,23,24,2,11,10,252,280,851,796,1095,760,8,19,11,4,4,0,276,352,770,557,803,1118,33,23,34,19,8,12,416,454,765,456,805,960,36,25,27,20,13,16,389,435,590,560,801,1042,20,16,26,15,10,17,393,127,1030,850,1056,771,16,25,20,14,11,0,370,182,876,725,968,781,17,24,6,16,7,6,208,240,1115,662,763,799,27,15,9,15,15,1,262,354,1007,648,807,737,29,15,9,18,14,14,344,338,623,616,843,1032,28,24,19,18,2,9,288,302,844,671,1055,808,25,18,16,11,1,2,366,218,1090,944,1266,633,17,16,8,11,13,1,322,578,787,691,687,1254,36,15,26,17,15,9,445,357,973,504,650,690,28,27,14,12,12,17,4 +292,248,924,598,681,680,28,17,12,13,10,11,395,435,705,569,726,1049,33,30,31,14,12,19,373,245,742,552,1083,760,22,20,21,0,14,10,245,319,928,667,862,959,10,26,31,3,12,11,198,328,880,695,974,781,15,26,21,4,13,16,304,286,823,721,1129,759,16,18,16,2,8,8,316,332,698,490,803,1119,39,28,31,19,16,16,454,366,679,429,825,961,36,22,24,10,13,20,369,389,720,539,797,1043,12,15,23,5,16,13,401,151,928,805,1068,772,24,20,29,16,1,8,382,138,780,648,992,778,25,23,15,14,7,14,216,186,1013,631,781,800,27,10,6,13,11,9,362,270,955,627,833,734,31,14,6,8,12,22,382,256,597,547,851,1031,36,25,16,18,14,13,364,216,820,622,1075,807,33,17,13,13,13,6,318,246,1056,887,1290,632,25,15,11,13,1,7,304,492,731,664,673,1255,30,16,23,15,13,11,461,285,871,495,666,691,20,28,11,12,12,19,4 +265,269,920,686,717,681,29,15,10,12,8,3,272,442,691,621,766,1036,26,30,25,11,12,17,314,202,738,598,1065,761,15,20,17,1,12,12,280,276,1018,743,830,932,17,22,29,2,6,11,173,323,952,765,930,780,22,28,17,3,7,10,303,299,835,769,1117,764,23,18,16,3,10,10,237,347,828,546,845,1104,34,32,25,16,10,16,341,401,775,497,873,956,31,20,22,7,11,12,252,412,708,641,809,1036,11,17,23,2,18,7,402,136,872,829,1090,765,31,18,27,15,1,10,267,175,736,700,1006,783,32,27,17,15,7,16,261,209,957,711,825,797,34,8,6,14,9,11,347,325,905,729,851,741,36,20,4,5,10,14,287,287,651,613,895,1032,39,31,16,15,12,9,379,257,866,646,1117,808,40,17,11,12,11,12,381,215,1002,917,1258,633,32,21,17,12,3,11,227,537,839,754,713,1252,31,16,19,12,15,3,354,358,815,565,658,656,21,26,9,11,14,11,4 +354,452,1019,716,652,784,37,12,16,13,13,10,311,283,696,667,659,915,32,39,15,6,11,12,227,125,803,562,980,812,15,11,5,2,7,3,281,169,959,759,843,1011,13,15,17,1,11,18,228,120,937,759,929,817,0,21,5,2,10,9,166,134,842,733,1014,725,1,9,8,4,3,1,244,272,749,560,690,911,26,33,15,11,3,13,324,408,750,527,672,847,29,23,10,6,6,17,431,325,653,679,800,963,27,24,11,1,11,18,293,237,1023,811,961,912,9,27,23,12,6,1,320,266,869,662,867,592,10,24,13,16,4,7,230,364,1108,745,640,732,28,13,12,15,12,2,322,374,1028,767,696,620,30,25,10,0,11,15,318,298,614,603,734,815,21,32,4,10,7,8,226,282,833,592,922,785,18,8,3,11,6,1,232,386,1079,869,1153,776,10,22,27,13,8,0,412,516,728,784,654,1071,43,25,7,7,8,10,389,317,974,609,693,865,23,19,17,10,7,18,4 +277,357,978,666,684,626,33,11,9,14,9,12,320,384,655,601,733,993,38,36,24,11,13,10,298,128,758,596,1088,706,21,14,16,1,11,1,200,164,938,735,867,903,9,16,28,4,7,16,181,229,910,759,979,727,8,22,16,5,8,11,219,229,805,767,1134,705,9,12,15,1,11,1,255,363,740,540,806,1063,34,34,24,16,11,11,361,453,731,483,830,905,37,24,21,7,12,15,354,402,608,617,802,987,19,21,22,4,19,16,308,134,982,835,1081,716,17,24,26,17,2,1,337,211,828,696,999,726,18,27,16,13,8,5,203,285,1067,685,782,744,24,12,5,12,8,0,311,371,979,705,832,682,26,24,3,5,11,13,349,293,561,607,858,977,29,35,15,15,11,10,315,277,800,660,1082,753,26,11,10,14,10,3,269,275,1046,923,1299,578,18,21,18,14,4,2,339,581,697,738,678,1199,37,22,18,12,16,8,426,338,929,533,649,635,25,22,10,13,15,16,4 +273,411,885,727,660,734,33,13,18,15,8,10,320,256,610,626,679,951,34,32,13,4,12,12,286,144,715,589,1040,782,15,18,13,0,12,3,266,162,857,776,867,973,13,18,25,3,6,12,205,187,829,784,967,819,6,20,13,4,7,9,229,205,714,756,1082,753,7,16,14,2,10,1,275,247,693,583,730,971,28,34,19,9,10,7,387,379,656,544,738,873,31,28,18,4,11,17,378,306,647,694,802,979,23,25,19,3,18,18,344,208,889,812,1009,838,15,20,19,10,1,1,337,303,735,689,925,678,16,33,19,14,7,7,191,315,974,744,696,686,24,14,14,13,9,2,343,365,904,782,764,678,26,24,12,2,10,15,329,393,564,626,776,915,23,33,12,8,12,8,275,365,713,629,990,785,20,15,9,13,11,1,291,385,957,904,1217,714,16,25,29,11,3,0,377,505,776,799,658,1137,39,24,15,5,15,10,424,338,844,616,689,763,25,28,11,12,14,18,4 +252,340,777,748,652,675,23,14,20,12,8,11,357,285,622,661,667,1030,28,37,11,7,6,11,287,201,587,596,976,755,19,13,5,3,6,2,241,201,739,799,835,934,15,13,17,0,14,13,270,244,709,807,909,774,20,19,5,1,15,10,266,250,606,765,1020,758,19,11,12,5,8,0,302,282,667,600,692,1098,28,33,11,12,8,8,440,370,602,561,696,950,31,27,10,7,9,16,419,305,651,713,786,1030,21,26,11,0,14,17,401,193,781,819,957,759,27,25,23,13,15,0,398,306,627,704,875,777,28,28,17,17,9,6,218,234,866,769,652,791,14,15,16,16,7,1,296,302,812,801,714,735,18,27,14,1,6,14,322,310,514,645,738,1026,23,34,4,11,6,9,256,304,607,626,948,802,22,10,7,10,7,2,374,390,847,905,1171,627,28,26,31,14,17,1,380,490,772,818,652,1246,23,25,7,8,17,9,449,273,734,631,665,666,21,23,13,9,16,17,4 +341,421,1022,690,646,784,38,13,15,11,14,11,320,332,699,605,677,943,33,40,20,8,18,11,234,86,804,562,1056,820,14,10,12,4,6,2,268,126,982,741,871,1025,14,14,24,1,6,15,211,173,954,751,979,833,1,20,12,0,7,10,191,199,849,733,1098,745,2,8,19,6,6,0,239,319,792,546,748,941,27,34,20,13,10,10,329,481,775,511,754,871,30,22,17,8,15,16,414,370,656,655,782,985,26,27,18,1,12,17,302,210,1026,801,1027,912,10,28,32,14,7,0,347,255,872,664,941,624,11,23,22,18,11,6,233,319,1111,711,712,732,29,14,9,17,13,1,309,415,1027,743,780,646,31,24,7,2,16,14,311,349,619,591,792,853,22,31,11,12,6,9,255,331,844,610,1006,795,19,7,14,9,5,2,241,343,1090,881,1233,774,11,23,22,13,9,1,407,585,763,760,640,1103,44,26,14,9,17,9,398,364,975,579,663,859,22,18,12,10,12,17,4 +343,481,972,741,653,765,38,17,20,13,10,10,304,266,647,626,674,866,33,32,13,10,14,12,200,100,782,659,1057,775,14,18,23,0,10,3,306,128,964,810,872,942,14,18,29,3,8,6,283,133,930,828,968,820,1,16,23,4,9,11,175,223,809,826,1099,738,2,16,24,2,10,3,291,313,776,621,739,852,27,30,29,15,12,5,295,447,751,574,755,800,30,32,28,6,13,17,464,320,682,700,793,912,26,29,29,3,20,18,272,222,972,846,1022,841,10,20,19,16,3,1,325,319,818,757,942,623,11,31,27,14,9,7,239,365,1057,736,713,685,29,18,14,13,9,2,357,453,977,788,781,645,31,24,12,4,12,15,345,351,609,672,783,828,22,31,22,14,10,10,195,349,814,725,1007,776,19,15,19,13,9,3,217,383,1052,992,1234,755,11,29,29,13,5,0,475,547,791,817,649,1030,44,28,25,11,17,10,366,350,923,604,676,758,24,24,7,12,16,18,4 +281,413,902,694,622,754,31,21,14,8,16,11,324,296,673,637,639,853,26,32,17,17,16,13,290,166,718,594,980,772,21,12,7,5,4,8,268,194,856,761,819,967,11,4,17,4,8,13,285,167,842,785,917,769,6,10,7,5,9,10,203,225,727,765,1020,683,5,8,6,7,4,6,273,339,738,568,676,835,20,24,17,16,8,14,317,483,713,493,676,791,23,20,10,13,13,18,460,348,700,645,766,903,33,33,9,8,10,19,224,218,906,837,953,878,3,28,27,11,9,6,305,243,752,698,867,572,4,21,11,13,9,12,331,327,991,721,638,702,22,22,10,12,15,7,305,399,905,733,702,596,24,34,8,11,16,16,355,335,525,629,722,747,15,25,2,15,4,7,259,317,728,630,928,739,12,15,1,8,3,4,241,337,958,907,1155,750,4,33,25,8,11,5,479,595,791,764,622,1003,37,32,9,14,15,11,322,316,853,587,657,845,15,12,19,11,10,19,4 +294,366,934,648,638,756,37,12,10,14,8,5,343,299,687,571,669,957,32,39,25,11,12,9,331,207,754,588,1064,808,15,11,15,1,12,10,311,235,932,673,865,1003,13,15,27,4,10,11,188,210,882,697,975,831,0,23,15,5,11,2,268,166,813,721,1106,755,1,11,12,1,10,8,260,264,718,518,746,977,26,37,25,16,14,14,408,366,691,515,762,883,29,25,20,7,11,10,369,287,728,619,774,991,27,26,21,4,18,11,391,213,938,795,1029,874,9,27,27,17,1,8,300,224,784,652,949,664,10,26,15,13,7,14,194,296,1023,683,720,708,28,13,2,12,9,9,390,276,965,707,788,666,30,23,2,5,10,8,316,304,569,549,790,903,21,34,14,15,12,1,332,276,810,628,1014,797,18,8,9,14,11,8,336,332,1052,893,1241,744,10,22,17,14,3,7,334,484,743,712,632,1141,43,25,17,12,15,5,457,287,889,551,655,801,23,21,13,13,14,11,4 +241,215,831,683,676,667,22,9,2,17,9,3,328,388,680,604,727,1014,27,34,31,12,11,15,330,258,641,651,1050,743,22,16,25,4,13,10,304,308,855,768,829,910,16,18,37,7,7,11,213,351,793,802,941,762,21,24,25,8,8,8,249,303,730,820,1096,754,22,14,12,2,9,8,309,313,727,589,802,1082,33,36,31,17,11,14,377,361,672,500,830,934,30,24,30,8,10,10,394,374,681,630,778,1014,18,19,31,7,17,11,354,188,835,830,1059,743,30,22,17,16,0,8,321,193,693,751,977,773,31,29,9,10,6,14,181,165,920,696,782,777,21,10,12,9,10,9,381,271,872,718,816,731,25,22,12,6,11,12,347,259,602,654,854,1018,30,35,24,16,13,7,283,251,723,701,1078,796,27,13,19,11,12,8,311,277,965,972,1273,619,31,19,11,17,2,7,379,493,806,759,672,1230,24,20,27,13,14,3,404,304,782,540,623,634,20,24,11,10,13,11,4 +243,441,904,700,610,775,37,14,13,13,9,6,278,250,679,653,611,928,32,39,18,10,7,8,252,186,758,560,948,811,15,11,8,0,7,9,254,200,900,745,789,1016,13,13,18,3,9,12,163,137,854,753,877,822,0,19,8,4,8,3,199,143,771,717,990,734,1,9,5,2,5,7,205,257,772,546,642,930,26,31,18,15,9,15,341,379,721,509,646,860,29,23,11,6,8,11,364,256,748,655,756,972,27,24,10,3,9,12,340,264,890,791,919,899,9,27,24,16,8,7,287,297,736,654,833,613,10,24,10,14,2,13,191,373,975,737,608,723,28,15,9,13,8,8,299,339,909,743,672,635,30,27,7,4,7,9,259,347,575,591,684,842,21,32,3,14,7,2,255,321,774,594,898,788,18,8,0,13,6,7,313,429,998,875,1125,765,10,24,24,13,8,6,345,457,821,764,614,1096,43,25,10,11,8,6,392,300,841,597,663,838,21,19,20,12,7,12,4 +305,369,916,673,667,741,33,22,18,11,14,12,300,340,731,594,708,1014,36,33,25,12,12,10,272,134,688,549,1105,809,19,13,15,4,0,1,282,168,896,720,900,1014,9,15,25,1,12,14,237,237,868,730,1016,834,10,17,15,0,13,11,297,269,745,718,1147,774,11,11,16,6,6,1,231,325,802,531,787,1046,36,25,25,17,6,9,417,483,749,486,803,928,35,21,18,8,9,15,344,386,704,630,799,1032,17,24,17,3,12,16,482,204,920,782,1070,867,19,25,35,14,13,1,363,261,766,649,990,717,20,26,21,18,7,5,237,285,1005,702,761,727,24,13,6,17,13,0,275,391,909,718,829,711,26,23,6,6,12,13,219,391,565,576,831,962,31,26,10,16,0,10,341,367,746,599,1055,810,28,16,11,9,1,3,413,347,988,870,1282,723,20,24,17,9,15,2,315,603,853,741,659,1198,39,23,17,13,15,8,442,358,863,576,678,794,23,19,15,10,14,16,4 +314,398,855,846,636,678,35,25,20,16,8,10,317,251,556,725,659,879,40,28,11,13,12,10,263,179,703,812,1056,696,25,20,29,5,12,7,265,159,901,925,853,799,11,20,27,8,6,0,238,164,861,955,967,679,10,20,29,9,7,9,186,178,718,965,1098,747,11,20,20,3,10,15,308,234,737,738,738,913,36,24,27,18,10,3,310,366,694,671,754,809,39,24,34,9,11,15,423,257,655,797,778,901,17,23,35,8,18,16,239,209,843,909,1021,702,19,16,7,15,1,1,282,254,689,904,941,760,20,19,23,9,7,7,218,306,928,827,712,688,26,26,22,8,9,4,392,318,856,885,780,740,28,24,22,7,10,13,392,280,544,801,782,923,31,19,28,17,12,10,242,252,739,784,1006,751,28,19,23,10,11,15,196,370,949,1073,1233,640,20,23,31,16,3,12,428,488,756,922,634,1057,33,28,31,14,15,12,389,249,792,695,665,599,25,12,13,9,14,16,4 +309,427,851,725,655,692,33,26,9,14,11,13,228,268,646,586,696,905,28,27,22,15,9,9,212,198,653,649,1093,736,13,17,20,1,3,0,362,158,849,794,888,941,15,15,32,4,15,9,291,197,821,806,1004,769,4,7,20,5,16,12,255,235,688,816,1135,695,3,13,19,1,9,2,301,309,777,623,775,925,22,19,26,20,9,4,345,425,724,552,791,821,25,25,25,11,10,14,456,320,683,678,787,927,25,30,26,6,15,15,360,242,853,798,1058,804,11,23,20,17,16,2,351,323,699,751,978,620,12,28,16,13,10,4,285,331,938,712,749,638,24,23,17,12,10,1,309,353,842,766,817,620,26,27,15,9,9,12,275,399,584,664,819,859,17,20,19,19,3,11,267,379,711,709,1043,729,18,20,22,14,4,4,299,427,931,978,1270,676,12,30,20,14,18,3,509,537,884,805,647,1085,39,29,22,16,18,9,300,320,796,582,666,739,25,15,2,13,17,15,4 +231,363,793,781,637,649,21,10,18,13,3,11,252,244,658,700,638,1016,26,35,13,6,3,11,176,188,631,607,947,729,17,15,5,0,11,2,298,192,757,816,796,926,23,15,17,3,13,15,305,213,729,812,894,748,20,23,5,4,12,10,185,223,638,744,983,732,21,13,10,2,11,0,187,225,735,617,649,1086,20,37,13,11,11,10,303,307,668,594,647,928,23,25,10,4,4,16,370,252,701,746,773,1010,15,22,11,3,9,17,370,200,797,814,922,739,29,23,23,12,8,0,273,279,651,689,834,751,30,30,15,14,6,6,209,257,882,806,609,767,18,11,14,13,2,1,237,291,810,834,667,709,14,23,12,2,3,14,235,253,608,652,697,1000,21,36,4,10,11,9,225,241,643,599,891,776,24,12,5,13,12,2,397,395,861,886,1120,601,30,22,29,13,10,1,375,425,868,847,637,1222,25,21,7,7,10,9,386,244,752,664,694,658,23,25,15,12,13,17,4 +241,301,920,667,724,631,30,14,7,12,2,11,342,322,701,612,747,992,33,35,26,13,4,13,278,208,686,639,1040,711,18,15,20,1,12,4,244,250,856,740,829,902,10,17,32,2,10,17,257,245,838,776,911,732,15,21,20,3,9,10,215,213,743,804,1092,712,16,13,17,3,12,2,281,277,686,577,832,1062,37,31,26,18,12,12,395,371,675,514,848,906,38,23,25,9,5,18,404,312,666,618,816,986,12,20,26,4,10,19,364,184,924,870,1065,715,24,23,22,15,9,2,357,229,770,733,981,735,25,28,14,15,7,8,183,225,1009,686,800,745,23,11,7,14,1,3,291,271,919,706,834,691,27,23,7,7,2,16,333,287,569,630,870,984,32,32,19,17,12,7,233,265,736,705,1092,760,29,12,14,12,13,0,333,329,980,972,1233,583,25,20,16,12,11,1,387,489,773,739,718,1204,36,21,22,14,11,11,422,290,869,532,673,634,20,23,8,11,14,19,4 +339,439,937,722,606,677,37,17,16,12,3,11,312,278,630,637,619,754,32,32,15,17,3,11,200,148,741,682,1010,649,15,18,21,1,11,2,350,164,913,797,815,834,13,18,31,2,7,7,299,149,887,823,921,672,0,14,21,3,8,10,171,217,774,833,1052,622,1,16,14,3,11,2,281,309,799,614,692,776,26,28,27,20,11,4,279,411,768,563,708,682,29,30,26,13,6,16,478,330,657,677,752,788,27,29,27,8,7,17,282,182,939,887,975,755,9,20,13,15,10,0,329,249,785,772,895,583,10,29,19,15,6,6,249,321,1024,731,666,597,28,18,14,14,4,1,343,391,936,765,734,609,30,24,14,11,3,14,315,277,634,671,736,724,21,29,20,19,11,9,163,261,785,738,960,636,18,15,15,12,12,2,253,355,1017,1011,1187,673,10,29,27,12,10,1,509,543,834,798,606,940,43,28,23,18,10,9,312,292,886,587,641,732,21,22,11,11,13,17,4 +272,468,900,845,761,796,35,32,29,13,14,14,243,221,697,702,788,1047,32,21,20,12,8,12,225,143,708,653,1015,840,17,23,30,0,10,3,213,141,940,906,776,855,11,11,20,3,2,2,212,166,912,894,866,789,16,5,30,4,3,9,158,322,751,822,1071,899,17,19,39,2,10,9,184,340,830,705,895,1093,40,13,20,17,10,5,286,450,781,654,925,985,37,23,27,8,13,17,295,287,722,806,789,1031,17,36,28,3,2,18,293,213,892,776,1054,816,25,19,10,16,3,1,282,370,738,769,970,926,26,24,36,14,13,7,234,376,977,836,877,878,28,25,33,13,9,2,318,454,881,894,855,882,32,27,31,6,10,15,278,388,623,744,911,1129,37,20,35,16,10,8,252,396,776,605,1115,921,34,18,38,13,9,9,308,378,984,898,1174,746,26,38,38,13,7,6,296,504,925,925,733,1139,41,35,28,13,7,12,357,373,835,712,670,657,19,7,18,12,14,18,4 +291,279,849,622,635,678,26,12,11,15,8,11,438,378,638,593,668,1047,31,37,32,10,8,13,356,292,645,592,1041,758,16,13,22,2,14,4,272,326,773,691,840,957,18,17,32,5,10,17,339,301,763,725,942,777,17,23,22,6,9,10,285,267,682,759,1085,757,16,11,13,0,16,2,385,347,617,532,745,1117,25,33,32,15,14,14,449,379,612,469,761,959,28,21,25,6,13,18,516,352,603,569,761,1041,22,24,24,5,8,19,396,248,853,843,1020,770,24,25,28,16,15,2,439,223,723,686,940,774,25,22,14,12,15,8,215,217,938,649,715,798,17,13,5,11,9,3,353,265,862,657,779,730,19,25,7,4,8,16,451,241,594,579,789,1027,20,30,17,14,14,7,271,223,665,662,1013,803,21,10,14,13,13,0,333,339,905,927,1236,630,25,20,10,15,13,1,449,505,746,690,629,1253,26,23,24,11,11,11,486,202,806,511,618,689,20,21,12,12,14,19,4 +296,270,937,649,639,742,28,7,4,16,10,11,413,399,622,604,680,985,33,34,35,13,12,13,341,247,729,621,1077,806,16,16,25,5,14,4,257,313,887,726,872,965,16,20,35,8,8,13,274,332,861,762,988,839,13,28,25,9,9,10,214,250,764,790,1119,779,14,16,12,3,8,2,342,348,689,557,759,1033,27,42,35,18,12,8,380,386,684,466,775,911,30,26,28,9,9,18,457,367,563,588,771,1011,26,21,27,8,16,19,313,161,941,844,1042,846,22,22,21,15,1,2,390,162,787,721,962,732,23,29,7,9,7,8,204,226,1026,676,733,728,19,8,8,8,11,3,352,300,942,676,801,718,21,18,10,7,12,16,452,270,612,618,803,979,22,35,20,17,14,7,276,246,757,671,1027,815,19,13,17,10,13,0,218,220,1003,942,1254,726,23,17,7,16,1,1,416,512,698,717,631,1195,30,20,27,14,13,11,461,327,890,530,650,717,22,26,15,9,12,19,4 +332,526,906,793,609,718,38,23,23,15,8,12,299,169,605,660,614,809,33,28,8,8,12,10,183,121,754,693,993,718,14,22,18,2,12,1,339,105,926,848,802,875,14,16,24,5,10,2,280,88,890,856,904,759,1,12,18,6,11,9,184,234,755,834,1035,691,2,20,15,0,10,7,266,276,770,665,675,813,27,22,24,13,14,3,292,360,733,642,691,739,30,28,23,4,11,15,445,259,674,764,757,851,26,31,24,5,18,16,287,255,898,864,958,782,10,16,10,14,1,1,292,348,744,775,878,602,11,23,20,12,7,5,246,414,983,790,649,630,29,24,19,11,9,0,344,408,907,852,717,618,31,26,17,4,10,13,296,342,621,698,719,799,22,23,17,12,12,10,188,346,768,739,943,725,19,19,12,13,11,7,286,428,990,1016,1170,708,11,31,34,15,3,4,464,460,805,869,613,987,44,30,20,9,15,10,377,307,851,668,656,691,24,16,12,12,14,16,4 +349,387,958,694,666,797,37,15,22,11,15,10,354,318,667,627,707,1032,36,40,23,8,13,12,282,118,730,532,1104,857,17,8,13,4,1,3,256,142,918,737,899,1046,13,10,23,1,11,14,271,209,890,741,1015,878,4,18,13,0,12,9,255,237,785,707,1146,810,5,6,14,6,5,1,253,319,740,536,786,1050,30,32,23,13,5,9,417,479,715,503,802,954,33,22,16,8,8,17,410,366,646,655,798,1060,23,29,15,1,11,18,426,196,962,771,1069,919,13,30,37,14,12,1,405,239,808,638,989,735,14,23,19,18,6,7,221,291,1047,727,760,763,28,16,10,17,14,2,263,393,959,743,828,735,30,28,10,2,13,15,293,361,595,579,830,978,25,33,8,12,1,8,303,333,780,564,1054,850,22,9,9,9,0,1,329,339,1026,839,1281,781,14,27,19,13,14,0,367,595,807,760,658,1218,41,28,15,9,14,10,472,336,909,609,677,822,27,18,19,10,13,18,4 +259,377,918,704,612,729,35,9,10,14,8,8,332,290,613,659,609,972,34,36,21,7,12,10,292,154,756,562,946,789,17,14,11,1,12,5,210,190,892,747,789,996,11,16,21,4,8,16,181,181,842,753,879,810,4,24,11,5,9,7,213,157,767,717,980,742,5,12,2,1,10,3,259,229,696,550,644,1000,30,38,21,12,12,15,367,373,663,509,638,888,33,24,14,3,11,13,338,298,668,659,756,996,23,23,13,4,18,14,294,204,922,793,919,855,13,24,23,13,1,3,307,241,768,654,833,667,14,29,7,13,7,9,199,301,1007,737,608,695,26,10,8,12,9,4,333,307,943,747,664,665,28,22,10,3,10,11,351,301,549,593,688,910,25,37,6,11,12,6,281,275,760,590,888,784,22,11,3,14,11,5,275,359,1006,873,1119,713,14,21,21,14,3,4,317,489,719,768,616,1152,41,22,13,8,15,6,424,290,875,607,671,786,21,24,21,13,14,14,4 +287,425,847,752,611,684,31,21,14,12,9,13,342,228,536,649,626,847,32,24,17,9,13,9,288,194,759,720,1019,710,21,26,27,9,11,0,336,152,873,827,824,859,11,18,33,12,9,1,293,169,837,857,930,743,6,14,27,13,10,10,227,201,698,871,1061,711,5,22,18,7,11,8,329,253,713,652,701,873,26,24,33,14,13,2,319,363,668,599,717,783,29,30,32,5,12,14,476,268,681,711,757,889,27,29,33,12,19,15,248,212,841,897,984,750,9,12,13,11,2,2,273,309,687,808,904,648,10,25,21,5,8,4,235,325,926,755,675,616,22,22,16,4,8,1,405,345,868,799,743,646,24,24,16,11,11,12,393,351,570,705,745,855,21,25,26,13,11,11,259,331,713,778,969,735,18,23,21,6,10,8,219,429,935,1049,1196,670,10,29,25,12,4,5,509,483,740,828,611,1043,37,28,29,14,16,11,350,288,798,613,646,649,21,18,7,9,15,15,4 +276,372,970,728,570,796,38,17,6,15,9,8,307,273,703,679,569,921,33,26,25,10,11,6,315,289,830,636,926,832,14,24,15,6,13,11,291,295,982,749,771,1043,14,20,25,9,11,10,238,218,938,749,853,853,1,20,15,10,12,3,224,154,831,739,962,757,2,22,2,4,9,9,270,304,776,558,624,943,27,34,25,15,15,13,344,360,753,563,620,851,30,36,18,6,12,11,323,239,798,697,724,979,26,29,17,9,17,12,311,329,958,827,897,928,10,14,23,14,0,9,260,288,804,684,811,616,11,35,3,8,6,11,222,330,1043,767,594,746,29,18,12,7,10,10,404,276,987,785,644,650,31,20,14,8,11,9,322,360,671,581,662,847,22,33,10,14,13,2,300,328,848,628,870,801,19,21,7,9,12,7,308,420,1058,913,1099,802,11,29,17,15,2,8,290,420,847,790,578,1089,44,28,17,11,14,8,357,299,917,653,643,875,26,28,21,8,13,12,4 +301,375,985,720,736,667,38,14,17,13,9,11,304,370,666,625,785,998,35,31,16,12,11,11,280,108,763,620,1084,745,18,19,12,0,13,2,192,178,967,793,849,894,14,19,24,3,3,11,167,209,939,811,949,766,13,21,12,4,4,10,203,269,816,793,1136,754,14,17,23,2,9,0,221,341,785,592,864,1066,39,31,18,17,7,6,347,465,766,527,892,928,40,25,17,8,10,16,308,430,621,675,828,1006,20,20,18,3,15,17,306,162,987,825,1109,735,22,19,30,16,0,0,327,261,833,726,1025,777,23,32,24,14,6,6,219,305,1072,735,844,773,29,9,13,13,10,1,301,429,980,763,870,733,31,21,11,6,11,14,315,337,578,655,914,1022,34,32,15,16,13,9,311,323,817,668,1136,800,31,16,18,13,12,2,267,267,1059,937,1277,621,23,20,26,13,2,1,297,605,758,796,732,1226,40,19,14,13,14,9,442,382,932,587,677,616,22,25,10,12,11,17,4 +242,362,1024,671,752,637,36,18,8,15,8,13,313,367,701,590,771,992,33,27,23,12,12,9,245,119,794,639,1032,717,16,23,19,2,12,0,193,153,996,752,835,902,12,23,31,5,8,13,234,224,964,786,909,738,15,21,19,6,9,12,210,232,855,802,1086,722,16,21,14,0,10,2,228,324,788,583,854,1062,41,27,25,17,12,8,342,456,783,496,862,908,38,27,24,8,11,14,301,395,620,622,834,988,18,18,25,5,18,15,323,145,1028,850,1067,717,24,15,17,18,1,2,304,222,874,733,981,745,25,28,11,12,7,4,224,278,1113,686,814,747,27,11,12,11,9,1,294,376,1013,710,840,701,31,19,12,6,10,12,310,326,627,642,884,992,36,28,18,16,12,11,284,298,854,689,1100,768,33,20,15,13,11,4,348,300,1098,962,1209,589,25,20,19,15,3,3,278,578,771,747,744,1206,42,17,21,13,15,9,371,345,971,538,695,634,20,23,5,12,14,15,4 +351,433,948,766,641,696,36,17,17,13,9,12,330,250,627,639,660,893,31,32,14,8,11,10,216,88,760,670,1037,726,12,18,18,0,13,1,310,114,934,827,850,917,16,18,30,3,7,8,245,153,900,841,956,765,3,18,18,4,8,11,183,189,785,831,1079,711,4,16,17,2,9,1,285,255,764,640,725,921,25,28,24,13,11,3,315,401,729,589,735,821,28,28,23,4,10,15,436,308,644,729,783,923,28,25,24,3,17,16,264,200,950,855,1004,778,12,20,18,14,0,1,309,259,796,766,922,654,13,29,22,14,6,5,243,321,1035,759,693,630,27,18,13,13,10,0,373,395,951,817,761,642,29,24,11,2,11,13,337,315,615,683,769,869,20,29,17,12,13,10,211,293,786,714,987,743,17,15,12,13,12,3,231,375,1028,987,1214,670,13,25,28,13,2,2,439,515,763,842,639,1085,42,24,20,9,14,8,396,304,899,633,670,703,24,22,8,12,13,16,4 +301,375,846,657,672,724,34,22,21,13,12,11,398,330,643,624,685,1071,33,25,24,14,16,5,428,248,632,533,1024,804,26,21,14,6,8,12,214,202,824,714,883,1003,10,7,24,3,4,9,303,245,800,724,973,823,11,11,14,4,5,4,373,283,669,712,1058,793,10,17,15,6,8,10,341,387,724,515,738,1133,27,17,24,15,8,10,383,491,683,452,716,983,30,23,17,10,15,10,464,374,710,600,816,1071,26,30,16,11,10,13,376,204,850,786,1009,828,10,19,38,12,5,8,447,291,696,639,913,790,11,24,20,14,11,8,407,293,935,696,686,814,25,31,9,13,11,11,219,355,883,688,740,760,27,23,9,10,14,8,413,363,477,568,782,1041,22,24,9,14,8,5,433,339,676,569,966,833,19,24,10,7,7,8,315,359,902,846,1197,686,11,30,18,13,7,9,393,611,743,723,670,1273,32,31,16,13,15,11,390,278,795,570,701,749,24,15,18,6,14,11,4 +258,352,916,692,634,679,29,12,16,11,11,12,311,351,667,617,665,1004,32,37,21,10,15,10,291,127,692,570,1046,757,23,13,11,2,9,1,235,163,884,749,859,958,5,13,23,1,3,14,182,240,856,761,967,780,10,19,11,2,4,11,244,258,745,743,1088,740,11,11,18,4,9,1,242,334,724,552,736,1056,36,33,21,15,11,9,374,442,683,503,744,916,35,25,16,6,14,15,329,385,674,651,770,1010,17,24,17,1,15,16,377,143,920,813,1015,793,19,25,33,16,4,1,352,228,766,674,931,719,20,26,21,16,10,5,200,262,1005,715,702,737,22,13,8,15,10,0,298,364,935,739,770,699,26,25,6,4,13,13,282,328,525,601,780,968,31,34,10,14,9,10,310,300,740,616,996,776,28,10,13,11,8,3,328,298,986,887,1223,651,20,24,21,11,6,2,330,570,773,764,628,1200,35,23,13,11,18,8,413,313,867,579,651,716,19,21,13,10,15,16,4 +276,398,954,710,676,687,36,23,10,17,14,10,353,337,655,631,725,980,39,30,23,18,12,12,271,135,738,706,1080,745,20,18,33,4,8,3,257,165,936,801,859,856,12,18,39,7,10,6,258,192,902,851,971,762,11,12,33,8,9,11,176,214,791,887,1126,790,12,16,20,2,2,3,276,354,770,652,798,1044,37,22,39,23,10,5,338,466,747,547,822,918,40,28,38,14,9,17,417,373,658,655,794,998,18,27,39,9,10,18,323,195,956,861,1073,729,20,20,9,16,7,1,340,220,802,818,991,813,21,25,17,10,5,7,164,292,1041,721,774,777,27,18,20,9,13,2,332,380,949,743,824,769,29,24,20,12,12,15,368,314,563,711,850,1032,32,23,32,22,8,10,240,298,792,724,1074,818,29,15,27,15,7,3,250,322,1034,1003,1291,641,21,27,19,17,7,0,400,598,809,784,670,1202,38,26,35,19,11,10,433,313,901,563,641,580,24,16,11,12,6,18,4 +293,353,1035,637,764,641,37,12,9,16,10,10,346,358,728,588,787,992,32,31,26,13,12,12,286,126,789,607,1056,719,15,19,22,3,14,3,266,178,975,708,831,902,13,21,34,6,10,14,247,225,957,740,915,740,14,29,22,7,11,9,219,217,862,770,1110,726,15,17,15,1,8,1,267,299,755,537,884,1062,36,35,28,18,14,9,375,435,764,480,904,908,33,21,27,9,11,17,358,372,643,586,832,988,19,18,28,6,16,18,334,158,1039,838,1075,717,23,19,22,17,1,1,303,201,885,701,999,749,24,28,16,11,7,7,193,267,1124,662,860,749,28,7,7,10,11,2,355,345,1028,674,874,705,30,19,7,7,12,15,351,317,650,594,912,996,35,32,21,17,14,8,263,285,855,669,1126,772,32,16,16,12,13,1,297,305,1101,936,1197,593,24,20,16,16,1,0,325,555,786,707,752,1208,43,17,24,14,13,10,404,332,982,508,725,634,21,29,10,11,12,18,4 +216,224,855,640,655,652,20,12,11,11,1,5,291,399,776,597,686,1013,21,33,30,14,3,19,283,237,695,576,1005,732,16,17,20,2,15,10,257,307,875,705,814,923,18,21,30,1,15,11,204,346,813,735,914,753,23,21,20,2,14,12,240,302,754,749,1047,731,24,15,19,4,15,8,262,318,833,522,765,1083,27,33,30,19,15,14,374,366,760,451,763,927,24,25,23,10,8,14,367,377,791,589,763,1007,14,20,22,5,9,11,377,167,859,819,1008,736,32,21,28,14,8,8,334,192,711,676,926,750,31,28,14,16,10,14,218,166,944,673,729,766,19,9,9,15,2,9,292,276,890,677,765,706,23,19,7,8,3,16,288,258,640,587,803,1003,28,30,15,18,15,11,264,242,761,628,1011,779,25,14,14,11,16,8,368,262,977,897,1206,604,31,16,12,11,10,7,346,494,874,708,647,1225,26,19,22,15,10,5,387,307,804,539,638,655,20,25,10,10,17,13,4 +252,264,834,626,656,684,31,10,12,16,9,7,381,413,621,605,677,1031,36,37,29,9,13,15,359,229,626,558,1058,764,25,13,19,3,11,6,271,273,824,685,875,963,9,15,29,6,9,15,254,328,762,711,971,785,14,23,19,7,10,14,302,302,695,727,1100,755,15,11,12,1,11,4,344,352,644,502,742,1093,40,37,29,14,13,16,428,400,595,447,756,943,39,25,22,5,12,16,385,391,640,573,796,1031,13,24,21,6,19,13,415,179,838,811,1023,788,23,25,29,15,2,4,370,232,684,654,943,752,24,28,15,11,8,10,198,194,923,659,714,774,26,11,2,10,8,5,378,316,873,661,782,720,30,23,4,5,11,18,386,276,509,563,784,1003,35,36,14,13,11,13,342,256,688,618,1008,795,32,10,11,12,10,6,358,298,934,887,1235,646,24,22,13,16,4,5,346,528,713,690,652,1233,29,23,21,10,16,7,397,275,785,519,679,709,23,23,13,11,15,15,4 +315,407,731,865,670,682,28,33,22,12,12,8,360,220,554,730,711,897,31,26,13,9,16,10,280,238,659,807,1108,696,24,10,31,9,8,9,378,150,801,930,903,775,18,10,29,12,4,0,345,189,767,956,1019,665,19,12,31,13,5,9,231,271,604,976,1150,761,20,12,26,7,8,17,345,291,707,751,790,933,29,18,29,12,10,3,321,361,644,690,806,821,32,18,36,5,15,15,512,256,661,828,802,905,26,31,37,12,12,18,318,252,715,896,1073,688,22,16,13,11,5,3,283,353,563,907,993,796,21,19,29,5,11,9,229,315,800,842,764,720,19,34,16,4,11,6,407,311,742,916,832,766,21,32,16,11,14,13,401,315,552,810,834,949,24,19,30,13,8,10,259,301,637,777,1058,763,21,13,25,6,7,17,267,473,825,1070,1285,630,21,31,29,12,7,14,551,485,788,941,662,1063,26,40,33,14,17,12,390,252,670,720,681,583,16,2,7,9,14,16,4 +315,419,982,680,592,751,38,11,10,16,7,12,342,248,671,637,595,860,33,30,21,9,9,14,294,214,794,566,972,763,14,20,11,5,13,5,282,232,914,721,789,948,14,20,21,8,11,16,249,183,910,725,885,748,1,22,11,9,10,11,177,155,803,713,1014,672,2,18,2,3,13,3,271,273,694,522,656,874,27,36,21,14,13,15,353,323,713,503,670,786,30,30,14,5,10,19,412,236,692,633,738,900,26,23,13,8,11,20,306,270,986,789,937,881,10,18,21,15,6,3,293,261,832,650,857,585,11,35,7,9,8,9,217,365,1071,719,628,703,29,12,8,8,8,4,373,311,995,721,696,611,31,22,10,7,9,17,365,251,647,563,698,778,22,31,6,13,13,8,255,223,800,606,922,726,19,17,3,10,14,1,263,395,1034,885,1149,745,11,23,21,16,4,2,395,427,727,742,596,1030,44,22,13,10,8,12,450,250,939,583,651,848,24,30,19,9,15,20,4 +281,367,925,708,652,700,36,11,13,14,9,12,360,322,602,637,683,987,39,34,20,7,11,10,288,126,759,586,1064,772,22,16,12,1,13,1,232,164,899,753,877,959,12,16,24,4,7,12,217,219,869,763,985,799,7,20,12,5,8,11,207,215,756,753,1106,749,8,14,15,1,9,1,279,291,717,556,754,1025,33,34,20,12,11,7,373,435,692,529,762,905,36,26,17,3,10,15,390,344,607,671,788,1003,20,23,18,4,17,16,312,168,929,817,1033,812,16,22,28,13,0,1,345,225,775,682,949,710,17,29,20,13,6,5,183,273,1014,735,720,718,27,12,7,12,10,0,337,343,944,759,788,698,29,24,5,3,11,13,369,329,574,605,798,957,28,35,11,11,13,10,279,301,755,630,1014,783,25,13,10,14,12,3,275,319,999,901,1241,678,17,23,22,14,2,2,381,553,688,776,646,1185,36,22,14,8,14,8,444,312,884,589,669,729,28,24,10,13,13,16,4 +315,381,966,696,784,673,37,15,15,11,6,10,322,320,689,603,827,1030,34,32,22,8,6,12,248,112,730,570,1090,751,15,18,12,2,8,3,236,158,918,751,851,940,13,18,24,1,12,14,231,201,892,759,941,770,14,20,12,2,11,9,185,213,793,741,1146,756,15,16,19,4,8,1,213,279,748,556,914,1100,40,30,22,13,8,9,353,435,729,513,942,944,39,24,17,6,5,17,372,372,646,661,854,1024,19,19,18,1,12,18,350,176,970,799,1129,753,23,20,32,14,7,1,335,207,816,674,1045,775,24,31,20,16,3,7,225,267,1055,719,894,785,28,10,9,15,5,2,287,367,963,749,904,733,30,20,7,2,4,15,295,327,623,601,956,1024,35,31,11,12,8,8,255,301,788,616,1172,800,32,15,14,11,9,1,305,325,1034,887,1261,625,24,19,20,13,9,0,335,559,807,770,774,1240,43,18,14,9,9,10,468,334,915,583,711,672,21,24,12,10,10,18,4 +288,376,713,789,664,622,26,35,20,13,13,10,325,249,604,658,705,841,27,24,15,8,17,8,321,309,607,751,1102,648,20,12,29,8,7,7,447,197,793,858,897,761,22,12,31,11,5,2,360,256,755,886,1013,659,23,10,29,12,6,11,300,330,600,918,1144,697,24,14,24,6,7,15,336,336,735,693,784,903,29,16,31,11,13,1,348,380,674,642,800,783,32,20,34,4,16,13,499,275,675,752,796,863,26,33,35,11,15,16,419,297,695,876,1067,650,28,16,15,12,6,3,292,386,557,849,987,728,25,21,27,6,12,7,254,306,780,770,758,662,17,36,14,5,12,4,398,296,718,840,826,684,19,34,14,10,15,11,370,328,608,740,828,907,24,17,28,12,7,12,308,318,629,783,1052,705,21,15,23,7,6,15,384,508,807,1076,1279,588,25,33,27,13,8,12,548,488,854,865,656,1063,24,38,31,13,20,14,413,271,648,650,675,515,12,4,5,8,13,14,4 +307,483,834,733,609,682,29,18,22,16,2,12,294,214,569,608,618,739,24,29,9,11,4,12,188,122,696,655,1001,636,7,21,21,5,12,3,376,116,846,786,814,781,21,17,25,8,8,2,323,119,818,796,918,681,8,13,21,9,7,9,155,251,681,796,1043,641,9,19,14,3,12,7,275,293,732,605,689,751,18,27,25,16,12,5,257,387,691,580,699,661,21,33,26,7,5,17,466,294,664,704,757,767,19,30,27,8,8,18,292,204,830,818,968,732,17,17,7,15,9,1,293,303,676,737,886,626,18,28,19,9,7,7,227,365,915,736,657,592,24,19,18,8,3,2,323,433,843,792,725,646,22,21,18,7,4,15,299,295,567,638,731,737,15,28,20,15,12,8,153,295,698,693,951,643,18,18,15,10,13,7,279,401,918,968,1178,680,18,30,33,16,9,4,523,505,811,809,613,917,35,29,23,12,9,10,328,272,785,614,656,679,29,21,11,9,14,18,4 +243,327,949,623,732,668,36,11,17,12,7,10,350,314,714,586,773,1037,31,38,30,9,9,12,306,180,719,531,1076,748,16,12,20,1,11,3,206,202,881,674,841,947,12,14,30,2,9,18,221,235,865,692,941,769,15,22,20,3,10,9,243,215,772,704,1128,747,16,10,15,3,7,1,295,291,697,481,860,1107,35,36,30,14,9,13,403,419,676,440,884,949,32,26,23,5,8,17,374,330,673,574,820,1031,18,25,22,2,15,18,356,174,953,782,1089,760,24,26,34,15,2,1,385,237,799,631,1011,766,25,27,20,15,4,7,209,239,1038,658,840,788,27,12,5,14,8,2,313,323,956,662,868,722,31,24,5,3,9,15,353,335,588,538,902,1019,36,35,15,13,11,8,273,313,763,591,1122,795,33,9,12,12,10,1,303,325,1009,856,1235,620,25,23,12,12,4,0,331,537,790,687,724,1243,42,24,22,10,12,10,434,294,902,536,699,679,20,22,14,11,11,18,4 +249,417,976,834,782,658,35,18,12,16,10,13,292,272,661,721,833,951,36,33,19,11,12,9,272,142,790,796,1074,722,17,17,25,3,14,0,222,152,978,915,833,819,11,17,35,6,6,5,205,155,940,955,919,745,16,19,25,7,7,10,189,147,819,965,1132,769,17,15,20,1,8,4,271,255,780,738,914,1015,42,27,31,16,10,2,317,421,763,647,948,895,41,29,30,7,9,14,348,322,690,789,848,981,17,24,31,6,16,15,220,204,974,907,1135,700,25,21,13,17,1,2,281,231,820,896,1043,792,26,28,17,11,7,4,277,313,1059,823,894,742,28,19,16,10,11,1,351,357,981,877,894,744,32,25,16,5,12,12,345,315,611,809,962,1011,37,28,24,15,14,11,239,297,826,832,1178,795,34,14,19,12,13,4,237,359,1060,1113,1253,614,26,24,23,16,1,3,329,533,815,910,778,1193,41,23,27,12,13,9,380,298,923,687,677,523,19,21,7,11,12,15,4 +275,365,905,761,616,682,29,9,18,10,8,11,360,254,582,682,617,1043,34,36,13,1,12,11,308,198,767,567,900,762,21,14,3,1,12,2,162,186,871,776,785,953,15,16,13,6,4,15,207,191,843,756,871,783,14,22,3,3,5,10,241,181,732,676,942,763,15,12,10,3,10,0,257,219,673,587,614,1113,30,36,13,4,8,10,389,311,660,584,598,955,33,24,6,5,11,16,318,228,605,736,762,1037,23,23,7,2,16,17,332,188,909,756,881,766,17,24,27,11,1,0,337,255,755,619,787,784,16,27,15,15,7,6,243,285,994,792,566,794,20,10,14,14,9,1,311,289,934,824,638,740,22,22,12,1,10,14,355,239,556,604,666,1035,25,35,2,3,12,9,327,227,727,533,850,811,22,11,5,10,11,2,341,373,973,800,1077,634,16,21,29,10,3,1,259,429,654,825,620,1253,31,22,5,4,15,9,416,264,868,674,669,685,21,22,15,11,12,17,4 +225,391,882,700,612,693,28,13,14,14,8,13,302,270,631,653,617,966,29,36,17,7,6,9,222,168,718,560,942,761,16,14,7,1,6,0,256,180,852,733,793,966,12,16,17,4,10,15,239,229,824,735,879,786,9,22,7,5,11,12,203,229,709,701,980,726,8,12,6,1,6,2,235,253,698,540,648,1002,25,32,17,12,6,10,347,369,653,521,636,880,28,24,10,3,5,14,396,278,682,667,760,984,22,21,9,4,10,15,362,180,886,783,923,819,16,24,25,13,11,2,327,301,732,632,831,669,17,25,11,13,5,4,189,295,971,737,608,679,19,14,10,12,7,1,269,315,905,755,662,661,21,26,8,3,6,12,279,343,563,573,690,914,20,33,2,11,6,11,229,323,706,574,888,764,17,11,1,14,7,4,355,387,950,853,1115,675,17,21,25,14,13,3,395,487,803,764,616,1150,34,22,9,8,13,9,400,316,843,607,659,746,24,22,19,13,12,15,4 +221,345,838,670,673,686,29,15,9,15,13,11,324,272,651,637,664,1055,34,40,22,8,11,11,292,256,660,532,929,766,21,8,12,2,3,2,256,238,786,713,784,965,7,12,22,5,11,17,323,237,762,721,830,785,12,18,12,6,10,10,255,237,663,683,981,765,13,6,1,0,3,0,309,293,664,510,711,1125,38,32,22,13,7,12,371,367,611,475,715,967,37,22,15,4,10,16,342,268,682,617,773,1049,15,27,14,5,11,17,402,244,842,767,950,778,21,30,26,14,10,0,353,289,688,620,862,780,22,23,6,12,4,6,237,297,927,711,677,806,24,16,9,11,12,1,325,253,871,705,709,738,28,26,11,4,11,14,329,319,495,557,747,1033,33,33,7,12,3,9,275,297,656,564,963,809,30,7,4,13,2,2,439,403,902,847,1138,638,22,25,20,15,12,1,287,481,757,728,669,1261,35,28,14,9,12,9,354,268,799,601,662,697,21,18,24,12,11,17,4 +266,424,956,643,640,796,36,18,15,14,16,12,285,343,663,600,681,957,31,37,28,13,14,10,241,157,730,545,1078,832,16,9,18,1,2,1,265,165,916,702,873,1035,12,7,28,4,10,16,268,198,888,716,989,843,1,15,18,5,11,11,208,222,783,720,1120,755,0,5,19,1,4,1,262,378,730,501,760,959,25,29,28,18,4,11,336,516,711,442,776,885,28,21,21,9,9,15,439,373,648,586,772,999,28,30,20,4,10,16,357,233,960,794,1043,926,8,31,32,17,11,1,368,312,806,647,963,634,9,22,18,13,7,5,196,350,1045,680,734,746,27,19,9,12,15,0,264,420,957,674,802,656,29,31,7,7,14,13,324,430,577,562,804,863,20,30,13,17,2,10,268,402,778,597,1028,809,17,12,14,14,1,3,294,372,1024,864,1255,786,9,30,14,14,13,2,440,618,801,709,632,1117,42,29,20,14,13,8,369,349,907,550,651,873,22,17,12,13,12,16,4 +196,344,790,736,606,679,20,15,9,11,10,13,383,325,521,667,623,1004,25,36,22,10,14,9,347,233,712,624,960,757,24,14,12,10,10,0,291,213,788,773,811,958,16,14,22,13,2,11,330,284,760,791,911,776,19,16,12,14,3,12,294,282,623,767,994,736,20,12,1,8,10,2,330,318,634,572,670,1062,23,30,22,13,10,6,390,400,593,547,652,916,26,26,15,6,13,14,373,329,610,699,750,1010,30,27,14,13,12,15,339,225,790,831,941,793,18,24,20,10,3,2,310,318,640,712,849,719,17,27,6,4,9,4,222,252,875,769,624,743,11,16,9,3,9,1,384,294,831,787,676,695,13,28,11,12,12,12,396,342,531,621,718,970,18,31,7,14,10,11,314,342,630,620,902,774,15,11,4,7,9,4,390,412,866,911,1133,649,17,27,20,11,5,3,380,518,731,800,608,1202,24,26,14,15,17,9,299,315,761,647,653,716,14,22,18,10,14,15,4 +327,457,898,777,626,720,38,21,20,16,9,12,296,248,579,652,645,871,33,26,11,9,13,10,226,90,730,701,1034,740,14,24,23,3,11,1,302,114,914,842,837,897,14,20,27,6,5,2,243,135,880,860,945,771,1,16,23,7,6,9,167,197,745,860,1076,725,2,22,20,1,11,7,273,279,746,655,716,869,27,24,27,14,9,3,291,419,711,608,732,801,30,30,28,5,12,15,416,320,658,740,768,911,26,27,29,6,17,16,252,206,894,876,999,798,10,14,13,15,2,1,265,273,740,795,919,648,11,25,25,11,8,5,235,337,979,770,690,648,29,22,16,10,8,0,377,427,901,828,758,652,31,24,14,5,11,13,345,321,553,706,760,851,22,25,22,13,11,10,233,307,756,747,984,751,19,21,17,12,10,7,227,371,984,1022,1211,706,11,27,31,16,4,4,437,535,745,853,624,1037,44,26,25,10,16,10,364,326,845,642,655,695,22,18,9,11,13,16,4 +269,223,847,701,661,685,21,11,11,15,8,5,344,406,622,616,708,1014,26,34,22,6,12,19,348,246,673,603,1083,759,27,16,16,6,12,10,282,302,921,758,870,896,15,22,28,9,6,13,199,353,855,780,984,780,20,28,16,10,7,12,283,315,760,774,1127,772,21,14,17,4,10,8,301,313,745,567,783,1080,32,36,22,9,10,14,393,329,688,518,803,942,29,20,21,2,11,14,352,376,643,664,787,1020,21,19,22,9,18,11,354,150,803,820,1062,749,23,22,26,14,1,8,297,195,687,705,982,795,22,27,18,8,7,14,191,155,888,722,757,787,18,8,7,7,9,9,397,279,842,752,815,751,22,18,5,8,10,16,367,245,660,626,831,1040,27,33,15,10,12,11,347,229,775,651,1055,818,24,13,12,9,11,8,323,247,925,922,1278,639,22,17,20,15,3,7,337,463,830,773,655,1242,25,20,18,11,15,5,392,310,748,586,640,610,13,24,8,8,14,13,4 +287,363,897,704,644,707,32,11,15,11,6,10,298,282,634,629,657,956,29,38,20,8,4,12,210,168,687,588,1010,767,12,12,10,2,8,3,278,182,845,759,855,962,20,14,22,1,10,16,271,209,821,775,945,792,9,20,10,2,11,9,191,203,724,763,1052,728,10,10,15,4,8,1,255,269,705,568,710,996,23,34,20,13,8,11,347,393,680,517,708,876,26,24,15,6,5,17,436,296,653,667,788,978,18,25,16,1,10,18,356,172,901,837,981,829,18,26,30,14,11,1,369,255,747,692,895,671,19,25,20,16,5,7,189,263,986,727,666,677,23,12,7,15,5,2,267,319,906,755,734,663,25,24,5,2,4,15,299,321,606,619,754,916,20,33,9,12,8,8,207,301,723,632,960,766,23,9,10,11,9,1,295,353,961,903,1187,693,19,23,22,13,13,0,445,509,800,776,642,1150,34,24,12,9,13,10,382,294,852,593,673,752,28,20,12,10,12,18,4 +304,278,672,894,631,721,14,20,23,9,8,9,283,225,635,773,682,1062,11,11,22,12,8,9,247,405,678,762,1033,801,22,29,32,16,10,10,229,331,754,951,812,944,18,25,26,9,2,1,294,332,726,849,924,822,23,25,32,12,3,10,242,302,551,831,1079,802,22,27,33,14,8,18,268,284,746,774,755,1128,19,19,26,9,8,2,288,156,675,687,783,990,16,23,33,16,5,14,399,203,770,821,747,1068,26,14,34,9,2,17,345,341,656,737,1026,797,18,17,16,10,15,4,372,280,512,756,944,823,15,18,30,16,9,10,340,228,741,847,735,831,13,19,27,17,9,7,206,188,709,909,777,779,17,11,25,10,8,12,322,162,625,789,807,1074,22,12,29,8,10,11,286,178,600,660,1031,850,19,24,32,15,9,18,318,432,770,883,1244,673,15,18,24,9,13,15,362,256,895,964,625,1290,20,17,32,7,5,13,399,287,621,713,594,658,2,25,20,14,10,15,4 +271,325,922,682,608,651,30,7,7,16,9,11,314,340,721,647,619,1020,31,34,24,13,11,11,304,214,692,586,976,731,18,16,14,5,13,2,310,258,858,721,811,930,10,20,24,8,13,17,253,247,842,727,889,750,15,26,14,9,12,10,229,197,747,735,1020,730,16,14,1,3,11,0,253,273,694,528,688,1090,35,40,24,18,13,12,351,327,675,503,696,932,32,24,17,9,10,16,328,306,676,633,744,1014,14,21,16,8,13,17,352,166,926,819,955,743,24,22,20,15,4,0,237,165,772,670,873,745,25,29,4,9,8,6,189,247,1011,723,656,771,23,8,11,8,10,1,401,255,927,721,714,703,27,18,13,7,11,14,305,215,581,571,730,998,32,35,9,17,13,9,309,191,740,622,948,774,29,13,6,10,14,2,347,291,986,901,1169,603,25,17,18,16,2,1,291,459,793,742,608,1226,36,20,16,14,10,9,348,280,875,593,653,662,20,24,18,9,13,17,4 +349,503,983,765,594,785,36,19,22,11,10,12,330,268,660,634,601,822,31,30,9,8,14,10,224,146,819,673,988,773,16,20,17,4,10,1,294,152,981,820,791,926,12,16,25,1,6,6,257,129,947,830,899,810,1,12,17,0,7,11,191,255,824,820,1030,724,0,18,14,6,10,3,281,351,797,655,670,770,25,26,23,13,10,3,285,461,770,612,686,758,28,32,22,8,13,15,456,334,719,736,742,872,28,31,23,1,18,16,250,250,981,864,953,863,8,18,11,14,3,1,339,349,827,761,873,627,9,27,19,18,9,5,287,391,1066,758,644,705,27,20,18,17,9,0,347,457,990,824,712,647,29,22,16,2,12,13,333,359,592,686,714,734,20,27,16,12,10,10,193,361,829,719,938,762,17,17,11,9,9,3,235,349,1065,994,1165,783,9,31,33,13,5,2,465,565,810,841,596,954,42,30,19,9,17,8,334,368,934,642,635,786,20,20,11,10,14,16,4 +314,380,973,716,650,744,38,7,15,13,8,11,347,311,650,653,667,1035,35,34,16,6,12,11,273,85,779,556,1002,812,16,16,6,0,12,2,221,137,937,757,847,1013,18,18,16,3,4,13,220,214,909,761,945,835,7,24,6,4,5,10,208,224,802,721,1042,785,8,14,7,2,10,0,262,270,753,556,704,1075,29,38,16,11,8,8,358,422,732,525,698,949,32,24,9,4,11,16,373,355,627,677,794,1047,24,21,10,3,16,17,307,153,977,795,977,854,16,22,24,12,1,0,314,240,823,654,889,746,17,29,12,14,7,6,214,286,1062,749,660,758,29,8,11,13,9,1,340,376,986,765,724,728,31,20,9,2,10,14,362,326,614,599,752,993,24,35,3,10,12,9,276,298,797,580,950,827,21,13,2,13,11,2,282,320,1043,857,1177,716,17,19,26,13,3,1,344,538,696,782,650,1225,38,20,8,7,15,9,443,325,930,615,685,779,28,24,18,12,12,17,4 +319,381,899,741,641,754,35,12,13,13,11,12,390,262,606,648,656,1009,38,39,18,6,15,14,314,170,697,565,987,818,23,11,8,4,9,5,224,168,839,776,828,1007,11,15,18,1,3,14,231,177,817,768,926,847,8,21,8,0,4,11,249,171,724,718,1029,787,7,9,5,6,9,3,269,237,659,579,681,1039,32,35,18,11,11,9,427,373,632,556,685,929,35,23,11,8,14,19,414,288,613,708,785,1031,21,26,10,1,15,20,386,200,903,780,956,866,15,27,28,14,4,3,367,249,749,655,872,730,16,24,10,18,10,9,211,281,988,766,643,732,26,13,9,17,10,4,313,313,914,796,711,724,28,23,7,2,13,17,343,303,528,610,729,975,27,32,3,10,9,8,289,285,715,577,937,823,24,8,0,9,8,1,339,371,961,858,1164,736,16,22,24,13,6,2,347,493,726,809,643,1201,35,25,10,7,18,12,488,272,856,646,682,787,27,19,20,10,15,20,4 +325,371,944,732,730,728,32,20,32,12,9,10,342,344,635,623,779,1025,33,27,13,7,11,12,318,118,724,604,1078,794,20,23,23,3,13,3,190,180,936,789,843,881,8,23,19,0,1,8,147,211,908,799,943,807,13,19,23,1,2,9,227,283,777,773,1130,823,14,21,36,5,9,1,221,287,764,586,858,1087,39,25,19,12,7,5,387,447,739,551,886,967,38,25,22,7,10,17,308,430,640,703,822,1047,14,20,23,0,13,18,322,182,944,785,1103,778,22,15,17,13,0,1,351,237,790,708,1019,846,23,26,39,17,6,7,237,291,1029,741,838,824,25,11,26,16,10,2,325,427,933,791,864,802,29,21,24,1,11,15,313,345,553,639,908,1079,34,26,28,11,13,8,329,329,782,618,1130,861,31,20,31,10,12,1,281,271,1020,899,1271,684,23,24,39,14,2,0,281,589,763,808,726,1213,38,19,21,8,14,10,456,374,887,611,671,619,22,19,17,9,11,18,4 +310,352,970,692,646,698,38,12,9,16,3,10,359,303,675,637,673,891,33,35,28,17,3,12,261,223,748,690,1064,752,20,15,26,3,11,3,305,223,920,769,869,929,14,15,38,6,9,14,298,210,896,809,975,795,5,19,26,7,8,9,182,174,797,849,1106,719,4,13,15,1,11,1,310,296,754,612,746,941,27,33,32,22,11,9,358,408,743,561,762,815,30,27,31,13,8,17,485,301,680,641,788,935,26,24,32,8,9,18,307,197,974,919,1029,816,10,23,20,17,8,1,346,226,820,780,949,624,11,28,16,11,6,7,214,276,1059,717,720,648,29,13,9,10,4,2,348,302,971,729,788,630,31,25,9,11,3,15,392,300,607,665,790,863,22,34,25,21,11,8,228,268,792,766,1014,745,19,12,20,14,12,1,224,342,1038,1029,1241,698,11,24,14,16,10,0,488,522,821,762,644,1085,38,23,28,18,10,10,375,255,921,551,671,737,26,23,10,13,13,18,4 +339,275,1081,591,823,624,24,21,3,10,8,14,206,542,924,552,790,989,19,6,34,21,12,6,316,280,977,627,941,704,12,40,24,7,12,13,362,372,1193,690,672,899,22,38,36,0,10,14,279,377,1171,752,710,727,27,28,24,3,11,13,375,325,1018,798,859,709,28,40,11,5,10,15,225,449,1137,563,921,1059,27,14,34,18,14,11,279,437,1096,474,1025,901,24,20,29,23,11,7,98,460,897,512,777,983,6,9,30,18,18,8,536,232,1039,824,786,732,36,8,20,13,1,15,313,129,929,727,828,726,37,15,8,17,7,9,453,229,1124,606,749,740,33,20,9,16,9,14,327,339,1042,600,885,682,29,12,9,19,10,9,211,303,914,618,883,977,32,13,23,17,12,14,431,287,1081,697,909,753,37,35,18,12,11,17,547,195,1165,962,800,596,37,23,8,10,3,16,207,533,968,657,775,1197,30,8,26,16,15,12,260,374,982,442,746,655,24,20,14,15,14,6,4 +287,357,912,700,736,645,31,14,15,10,10,10,300,308,739,641,739,1006,34,41,20,9,8,12,264,136,680,542,984,725,19,9,10,3,6,3,258,180,860,743,857,916,7,15,20,0,10,16,217,207,836,751,917,746,12,23,10,1,9,9,229,195,737,715,1036,724,13,11,7,5,4,1,209,265,752,542,788,1076,38,37,20,14,4,11,371,399,703,501,762,920,35,23,13,7,3,17,326,328,704,653,838,1000,15,28,12,0,10,18,400,154,916,793,1017,729,21,29,28,15,7,1,297,213,762,648,921,743,22,24,12,17,1,7,197,275,1001,733,728,759,24,15,7,16,9,2,289,333,913,741,756,699,28,23,7,3,8,15,243,287,551,591,828,996,33,32,5,13,6,8,303,259,730,574,1010,772,30,6,2,10,5,1,367,317,976,849,1187,597,22,22,22,12,9,0,287,519,817,762,728,1218,37,27,12,10,9,10,416,312,863,613,699,648,23,19,18,9,8,18,4 +276,362,823,701,665,634,23,15,14,15,3,12,371,259,596,626,672,985,28,36,17,4,1,10,311,245,641,601,1037,712,17,14,13,0,13,1,283,203,787,748,866,895,17,14,25,3,9,12,272,230,757,756,940,733,18,16,13,4,10,11,286,262,656,746,1081,721,19,12,10,2,13,1,308,288,661,579,741,1055,26,30,19,9,13,7,432,350,626,550,757,901,29,28,18,4,6,15,419,267,631,672,799,981,21,27,19,3,9,16,417,229,827,826,1012,710,27,24,19,10,10,1,352,320,677,681,934,744,28,29,15,14,8,5,196,260,912,722,713,742,14,16,10,13,4,0,336,284,836,760,775,700,16,28,8,2,1,13,346,290,576,608,785,989,21,31,12,8,13,10,300,278,655,651,1009,767,20,11,7,13,14,3,390,436,897,922,1230,588,28,27,25,11,12,2,412,474,790,773,663,1201,25,26,15,5,12,8,439,247,780,586,690,627,19,24,15,12,15,16,4 +321,319,986,675,688,656,32,13,10,10,11,11,344,370,699,604,733,1013,35,30,21,13,13,13,310,176,736,585,1072,736,20,20,13,3,15,4,210,232,922,738,845,923,8,24,25,0,7,17,171,247,904,758,953,757,11,24,13,1,8,10,215,197,809,754,1120,735,12,18,20,5,9,2,241,277,712,539,812,1083,37,34,21,18,11,12,381,363,713,488,836,931,38,26,18,9,8,18,352,370,646,628,796,1011,16,17,19,4,15,19,320,138,990,810,1067,740,20,18,27,13,2,2,349,159,836,685,991,756,21,25,17,17,8,8,233,247,1075,696,792,770,23,6,10,16,12,3,325,299,985,716,836,712,27,14,8,7,13,16,347,273,573,602,860,1007,32,31,12,17,15,7,307,241,800,641,1084,783,29,17,15,10,14,0,251,261,1046,908,1263,608,21,13,21,10,0,1,305,491,743,745,680,1229,38,16,15,14,12,11,474,352,933,556,667,655,24,28,7,9,11,19,4 +276,334,893,696,730,670,29,13,15,12,8,11,287,339,742,625,759,1031,28,40,22,9,6,11,247,157,667,562,1060,750,17,10,12,5,6,2,273,201,847,741,859,941,13,18,22,2,10,13,216,250,823,749,953,769,18,24,12,1,11,10,230,230,722,733,1108,751,19,10,15,7,6,0,208,282,759,546,842,1101,34,36,22,14,6,8,382,398,706,517,844,945,31,22,15,9,5,16,351,347,707,659,828,1025,11,25,16,2,10,17,403,157,897,799,1073,754,27,28,32,15,11,0,308,202,743,662,989,768,28,23,18,19,5,6,180,244,982,725,804,786,24,14,5,18,7,1,292,322,894,747,838,726,28,22,3,3,6,14,238,292,566,587,880,1019,33,31,9,13,6,9,272,268,719,612,1088,795,30,7,10,8,7,2,372,314,965,883,1233,622,28,19,20,12,13,1,316,524,822,764,720,1241,35,26,14,10,13,9,429,309,844,593,707,673,21,18,12,11,12,17,4 +277,439,908,761,612,674,36,25,13,15,10,15,294,250,607,646,629,843,35,28,18,14,14,7,224,150,758,743,1024,700,20,18,26,2,10,2,316,146,930,842,825,857,12,18,34,5,8,3,249,141,888,878,935,737,5,16,26,6,9,12,193,185,763,894,1066,701,4,16,19,0,10,8,287,285,748,669,706,873,29,20,32,19,12,0,273,423,713,606,722,777,32,26,31,10,13,12,444,296,706,712,756,883,24,27,32,5,20,13,264,206,900,884,989,742,12,20,12,18,3,4,287,253,746,833,909,648,13,21,18,12,9,2,247,325,985,746,680,604,27,26,17,11,9,3,347,373,913,800,748,646,29,28,17,8,12,10,337,321,543,730,750,843,24,21,25,18,10,13,213,301,774,801,974,721,21,15,20,13,9,8,219,375,998,1074,1201,656,13,27,24,15,5,5,461,527,779,837,610,1041,38,26,28,15,17,11,326,282,849,612,641,645,24,14,8,12,16,13,4 +297,347,978,676,651,730,38,17,12,12,10,11,334,316,711,623,672,1023,39,40,25,11,8,13,250,156,738,592,1041,800,20,10,15,1,6,4,252,202,918,735,870,977,14,18,25,2,10,15,243,235,898,755,966,827,9,22,15,3,9,10,189,209,803,763,1083,787,10,10,12,3,4,2,239,249,706,540,735,1071,35,32,25,16,8,10,365,397,715,493,739,951,38,20,18,7,7,18,408,332,650,629,791,1039,20,25,17,2,10,19,356,174,982,827,1010,820,18,28,29,15,7,2,337,209,828,692,926,766,19,23,15,15,1,8,199,257,1067,709,697,772,29,14,2,14,9,3,303,331,975,717,765,736,31,22,0,5,8,16,319,331,587,601,777,1015,30,27,10,15,6,7,243,303,796,644,991,831,27,7,7,12,5,0,299,313,1042,915,1218,694,19,19,17,12,9,1,369,515,785,742,647,1237,38,26,17,12,9,11,464,324,927,569,674,731,26,18,13,11,8,19,4 +312,326,1052,664,657,735,37,10,5,5,8,13,397,349,729,601,698,900,32,29,30,12,12,9,329,205,852,728,1095,773,15,21,28,12,12,0,273,253,1008,743,890,974,13,21,40,11,12,13,304,242,982,821,1006,806,0,27,28,10,13,12,242,202,883,879,1137,728,1,19,15,14,10,2,380,336,796,632,777,930,26,37,34,15,16,8,358,416,791,577,793,830,29,33,33,16,13,14,479,335,690,585,789,946,27,22,34,9,18,15,207,195,1056,903,1060,843,9,21,16,4,1,2,334,216,902,814,980,621,10,34,12,8,7,4,258,270,1141,671,751,671,28,11,13,7,9,1,436,286,1061,673,819,631,30,21,13,10,10,12,466,320,703,685,821,856,21,30,27,14,12,11,280,288,880,798,1045,766,18,18,22,11,11,4,176,324,1126,1065,1272,725,10,22,12,5,3,3,474,528,739,718,649,1082,43,21,30,11,15,9,403,283,1007,499,668,780,25,33,10,12,14,15,4 +274,398,872,733,669,654,31,14,17,14,13,10,281,267,657,666,672,1011,34,41,14,3,11,12,231,145,666,553,957,734,23,9,4,3,5,3,245,165,830,764,848,921,7,15,14,2,9,16,218,164,802,758,908,755,12,21,4,1,10,9,212,200,697,710,1001,733,13,9,9,5,7,1,186,266,686,571,687,1081,38,35,14,8,5,11,356,366,637,552,677,929,39,23,7,7,8,17,333,283,666,704,805,1009,15,26,8,0,13,18,377,175,876,782,944,738,21,29,26,13,8,1,296,234,722,645,856,752,22,24,14,17,4,7,194,310,961,760,641,768,24,15,13,16,12,2,272,342,881,792,699,708,28,23,11,1,11,15,234,254,515,602,733,1005,33,32,1,7,5,8,276,236,690,561,929,781,30,6,4,10,4,1,364,358,936,838,1150,606,22,22,28,10,10,0,316,492,773,801,671,1227,35,27,6,4,12,10,419,263,827,642,710,653,23,19,16,9,11,18,4 +243,235,870,647,642,652,23,5,9,9,10,2,332,330,629,614,665,937,18,30,28,12,12,14,416,272,778,601,1054,726,15,20,18,12,14,13,316,328,946,706,861,911,15,20,30,15,10,8,189,337,926,736,965,753,16,28,18,16,11,7,325,259,739,762,1096,703,17,18,7,10,8,11,335,303,796,529,736,989,22,38,28,15,14,11,363,333,763,484,752,853,19,30,23,8,11,9,370,292,758,594,786,949,23,17,24,15,16,10,314,220,854,840,1019,762,15,22,22,8,1,11,309,243,700,695,939,664,14,29,12,2,7,17,253,189,939,680,710,668,20,6,3,1,11,12,403,219,897,682,778,650,28,18,5,14,12,11,395,295,697,588,780,911,25,31,17,16,14,6,399,289,804,659,1004,739,22,17,12,9,13,9,253,321,958,930,1231,634,14,17,14,9,1,10,373,453,771,711,640,1137,29,16,20,17,13,4,338,332,817,524,671,689,9,30,18,12,12,10,4 +283,379,1012,649,598,784,37,9,7,16,11,8,342,306,697,610,601,941,32,28,24,9,13,10,340,212,860,541,974,812,15,22,14,5,15,7,238,252,962,684,795,1001,13,22,24,8,11,14,169,197,926,690,891,813,0,24,14,9,12,7,215,125,859,680,1016,731,1,20,1,3,9,5,283,277,734,495,662,943,26,36,24,14,15,17,377,343,729,474,672,873,29,30,17,5,12,15,350,278,738,608,744,979,27,19,16,8,15,16,284,262,1016,764,941,904,9,16,24,15,2,5,317,227,862,615,859,616,10,31,4,9,8,11,219,315,1101,690,630,728,28,10,11,8,12,6,377,265,1043,696,698,632,30,20,13,7,13,13,367,285,645,532,704,849,21,29,9,13,15,4,309,259,848,569,924,795,18,19,6,10,14,3,223,373,1094,846,1151,764,10,19,18,16,0,4,313,453,727,709,602,1101,43,18,16,10,12,8,428,282,973,580,651,855,21,30,22,9,11,16,4 +263,345,924,697,610,684,31,9,17,15,3,11,350,286,619,632,615,987,34,32,14,10,5,11,256,172,726,615,990,752,17,18,12,2,17,2,248,198,874,758,805,941,17,18,24,5,13,13,227,217,850,776,905,781,12,22,12,6,12,10,165,231,753,764,1032,751,13,16,9,0,15,0,259,249,712,571,676,1037,28,36,18,15,17,8,337,333,697,526,688,901,31,26,17,6,10,16,414,276,610,654,758,993,23,21,18,5,11,17,292,156,928,846,955,774,21,20,16,16,6,0,309,253,774,703,875,730,22,31,14,12,12,6,185,253,1013,718,646,724,22,10,13,11,4,1,307,315,927,742,714,704,24,22,11,4,5,14,361,263,611,616,718,973,23,33,11,14,17,9,221,251,750,661,940,785,20,15,6,13,18,2,263,353,994,936,1167,650,22,21,28,15,8,1,391,455,749,767,614,1189,31,20,14,11,8,9,434,262,875,572,657,697,23,26,16,12,15,17,4 +304,392,987,683,589,729,39,11,9,15,5,10,295,301,666,630,590,844,34,38,22,10,5,12,193,139,785,561,953,723,13,12,12,2,9,3,325,179,923,722,778,910,15,16,22,5,9,16,290,182,909,728,870,712,2,22,12,6,8,9,130,146,812,706,995,666,3,10,1,0,9,1,250,252,747,525,641,868,28,36,22,15,9,11,274,382,738,502,651,770,31,24,15,6,4,17,437,313,693,640,735,878,25,25,14,5,9,18,295,207,991,780,920,843,11,26,24,16,8,1,264,218,837,643,838,623,12,25,6,12,4,7,212,322,1076,720,609,675,30,12,9,11,4,2,336,322,1000,728,677,649,32,22,11,4,5,15,318,290,648,566,683,782,23,33,7,14,9,8,172,260,805,595,903,692,20,9,4,13,10,1,264,352,1049,872,1130,727,12,21,20,15,8,0,440,488,786,745,593,1026,45,24,14,11,8,10,401,309,944,582,642,818,23,20,22,12,11,18,4 +359,443,1004,734,626,790,38,15,18,16,8,11,354,318,675,637,649,815,33,28,13,11,12,11,246,100,826,686,1046,766,14,22,25,5,12,2,314,146,1004,805,841,909,14,20,29,8,8,5,271,169,970,829,957,791,1,16,25,9,9,10,173,249,843,841,1088,721,2,20,18,3,10,4,323,337,818,624,728,785,27,30,29,16,12,4,309,493,793,571,744,741,30,30,30,7,11,16,460,378,704,693,768,855,26,27,31,8,18,17,220,214,1002,871,1011,868,10,16,11,15,1,0,307,307,848,778,931,634,11,31,23,9,7,6,233,343,1087,745,702,712,29,16,14,8,9,1,411,473,1007,781,770,656,31,20,14,7,10,14,379,373,657,677,772,739,22,31,24,15,12,9,207,363,850,734,996,753,19,19,19,10,11,4,191,323,1084,1009,1223,788,11,27,29,16,3,1,457,603,783,810,624,927,44,26,27,12,15,9,392,392,953,605,655,809,22,24,7,9,14,17,4 +279,475,836,757,625,696,32,19,20,17,7,13,310,204,571,640,638,851,27,26,13,6,11,9,240,162,732,677,1035,712,12,24,21,4,13,0,312,94,852,806,834,853,16,16,29,7,11,3,265,173,816,812,946,755,5,12,21,8,12,10,195,223,683,814,1077,697,4,22,16,2,13,6,291,245,730,641,717,883,21,26,27,11,15,2,341,357,687,620,733,791,24,32,26,2,10,14,464,268,664,730,771,887,24,31,27,7,17,15,304,240,832,850,1000,760,12,14,13,12,6,2,281,349,678,753,920,654,13,27,21,10,10,4,211,371,917,770,691,630,23,20,14,9,6,1,347,373,853,818,759,642,25,22,12,6,9,12,333,369,581,662,761,875,16,27,20,10,13,11,211,373,694,721,985,733,13,21,15,11,12,6,285,455,922,994,1212,674,13,31,29,15,8,3,467,483,781,831,625,1051,38,30,23,9,14,9,390,324,789,638,660,655,26,20,9,10,13,15,4 +256,356,886,667,636,731,30,13,9,14,9,9,359,297,637,628,643,974,31,34,22,11,11,13,347,191,720,569,1014,791,22,16,12,1,13,4,247,221,868,716,837,998,6,16,22,4,9,17,204,216,816,728,937,812,7,20,12,5,10,8,270,206,739,724,1048,744,6,14,1,1,9,4,312,288,682,523,708,1002,31,34,22,16,13,14,378,410,641,486,706,890,34,28,15,7,10,12,337,307,680,616,784,998,22,25,14,4,17,13,373,207,890,800,987,857,14,22,22,17,0,4,344,278,736,657,901,669,15,31,6,13,6,8,204,298,975,704,674,697,21,14,9,12,10,3,364,310,923,704,730,667,23,26,11,5,11,10,368,354,535,568,750,912,26,35,7,15,13,7,324,330,734,613,956,786,23,13,4,14,12,6,328,362,980,888,1187,715,15,25,20,14,2,5,328,526,749,729,638,1154,36,24,14,12,14,5,393,287,843,568,677,788,18,26,20,13,13,13,4 +238,408,848,747,647,667,31,17,17,11,13,12,287,273,639,650,664,1022,36,36,14,10,11,10,213,137,666,623,997,747,21,12,10,2,1,1,239,145,824,808,850,932,7,12,22,1,13,12,252,210,794,816,926,766,8,18,10,2,14,11,206,214,681,794,1041,752,9,10,15,4,7,1,228,270,702,607,713,1092,34,28,16,15,7,7,360,404,649,558,717,942,37,20,15,6,8,15,385,303,678,710,777,1022,19,25,16,1,13,16,355,183,852,854,976,751,17,26,24,16,14,1,348,302,698,729,894,771,18,21,18,16,8,5,206,312,937,762,673,783,22,18,13,15,12,0,258,370,867,798,735,729,24,30,11,4,11,13,258,374,535,656,761,1018,29,29,9,14,1,10,222,346,680,655,969,794,26,9,10,11,2,3,360,374,924,934,1190,619,18,25,28,11,16,2,384,528,793,823,643,1238,37,24,12,11,16,8,395,325,803,626,664,664,23,20,10,10,15,16,4 +405,291,862,713,618,468,23,16,10,10,4,4,168,290,759,650,583,811,18,31,21,1,4,14,168,402,774,543,760,508,13,19,11,1,12,11,512,336,794,722,673,707,33,23,21,8,16,12,433,341,778,706,695,527,28,29,11,5,15,7,311,251,695,634,804,533,23,21,2,3,12,13,265,341,670,551,608,867,12,35,21,2,12,15,165,267,669,552,666,709,15,23,14,5,7,9,254,224,728,690,674,791,11,18,13,2,12,4,462,362,866,678,771,546,23,19,27,11,13,13,323,217,760,585,689,624,20,18,7,15,7,13,467,233,951,768,584,562,16,19,8,14,3,12,277,193,897,776,628,530,16,21,10,1,2,11,251,215,669,576,620,775,9,30,6,3,12,8,255,193,672,515,800,551,14,16,3,10,13,15,491,363,918,770,979,438,20,14,21,10,15,14,445,335,879,775,606,1003,29,29,13,4,15,4,310,286,829,674,603,565,21,17,23,11,16,8,5 +423,427,918,760,682,571,30,23,20,13,5,8,216,258,891,661,663,916,25,24,11,8,7,6,274,138,832,548,800,649,6,10,1,6,9,15,408,164,934,797,663,822,16,16,11,3,5,16,285,169,936,775,705,670,21,18,1,2,4,9,381,225,797,709,856,654,22,12,12,8,9,17,259,247,996,614,724,984,23,16,11,13,11,13,233,349,953,577,742,836,22,14,4,10,10,1,118,292,936,729,722,916,12,21,5,3,5,6,508,174,918,735,799,645,30,22,29,16,12,17,303,235,778,670,751,677,31,17,17,20,6,11,521,307,1003,787,698,677,33,24,16,19,10,16,331,373,923,817,684,633,25,30,14,4,7,3,229,241,785,631,736,926,28,13,4,12,9,12,381,229,834,546,904,702,33,13,7,9,10,19,507,357,990,799,927,523,31,21,31,13,10,18,221,481,1059,830,670,1136,36,28,3,9,6,8,272,266,863,667,669,554,18,8,13,12,11,0,5 +361,361,760,762,707,512,24,17,11,11,3,10,160,264,821,677,672,877,19,32,20,2,3,8,224,424,736,546,779,590,12,18,10,2,15,17,432,356,732,771,720,783,22,24,20,5,11,18,339,353,752,743,734,611,27,28,10,2,10,11,311,297,643,661,769,595,28,20,3,4,15,19,231,381,810,598,667,943,15,32,20,5,15,15,163,309,781,595,729,785,16,26,13,6,8,3,182,212,820,735,757,867,6,17,12,1,9,4,460,422,764,689,802,596,34,20,30,12,10,19,295,311,648,620,724,632,31,23,8,16,10,13,469,327,849,809,603,624,27,18,7,15,4,18,263,233,799,823,703,578,17,16,9,0,3,5,235,261,707,613,687,861,20,27,5,4,15,14,309,245,662,526,791,637,25,15,2,11,16,21,477,437,816,765,934,462,31,15,22,9,12,20,309,315,1005,826,695,1083,30,24,12,3,12,10,254,328,731,705,690,515,26,16,22,10,17,2,5 +378,398,1010,680,614,547,34,25,20,11,5,17,141,333,847,601,601,858,29,26,27,8,1,5,163,135,834,510,796,581,2,10,17,2,13,4,421,183,996,719,619,778,26,18,27,1,9,9,348,184,968,701,689,608,17,22,17,2,10,12,264,208,857,689,854,592,18,12,18,4,13,6,202,298,882,548,690,928,23,18,27,13,13,4,214,416,839,497,732,772,26,8,20,6,8,10,235,369,844,641,654,852,16,21,19,1,9,11,435,181,1012,735,813,639,26,18,35,14,12,6,254,202,876,632,749,657,27,13,23,16,8,0,432,284,1097,713,688,627,25,26,8,15,6,5,270,364,1001,729,660,599,27,28,8,2,3,8,188,288,797,565,700,854,18,15,12,12,13,13,258,264,850,556,894,630,21,7,13,11,14,8,448,318,1084,813,973,535,27,25,15,13,12,7,360,546,1051,748,596,1070,40,28,19,9,12,13,353,317,955,595,585,634,28,12,17,10,15,11,5 +404,440,846,960,782,643,24,11,31,15,9,3,287,199,815,853,753,1012,19,32,16,4,11,11,353,177,772,740,774,723,12,18,10,4,13,12,303,153,934,977,777,922,22,22,0,1,1,9,208,162,934,923,793,742,27,24,10,0,0,4,368,204,765,795,736,722,28,16,23,6,7,10,226,200,954,792,744,1082,23,34,0,9,9,14,282,276,881,783,670,924,20,28,7,8,6,8,111,221,908,935,818,1006,6,21,8,1,1,9,469,261,798,789,849,735,36,20,30,14,14,10,296,304,658,760,739,737,37,31,28,18,10,16,450,346,883,985,652,763,33,12,27,17,10,11,412,346,851,1023,690,695,25,20,25,2,11,8,232,242,739,805,774,990,28,33,15,8,13,5,452,246,830,628,770,766,33,15,18,9,12,10,444,428,894,789,881,595,37,19,42,11,14,9,134,400,1023,1030,770,1218,30,22,8,5,2,3,333,291,751,863,753,654,24,28,28,10,11,9,5 +440,450,712,957,763,584,21,17,32,11,9,9,283,151,777,822,722,953,16,20,11,4,11,5,349,203,732,751,697,664,15,30,11,4,13,14,343,147,778,968,760,863,25,24,1,5,5,15,262,184,782,906,772,683,30,20,11,2,4,8,408,262,633,766,675,663,31,26,24,6,11,18,274,200,868,791,707,1023,16,28,1,5,9,12,264,256,827,794,653,865,13,28,8,8,6,0,113,207,878,946,797,947,3,23,9,1,1,7,517,281,694,764,780,676,35,8,29,14,16,16,320,350,578,743,678,678,32,25,29,18,10,10,480,384,779,982,627,704,28,18,28,17,10,15,376,350,729,1034,665,636,18,20,26,2,11,2,266,238,723,798,729,931,21,27,16,4,13,11,450,244,688,597,669,707,26,27,19,9,12,18,500,476,778,752,834,536,32,23,43,9,14,17,160,384,1001,1033,751,1159,27,22,9,1,2,9,315,289,651,868,746,595,27,22,23,10,15,1,5 +388,330,1051,678,674,562,34,29,20,10,8,11,195,381,1006,633,633,927,29,16,27,15,6,9,259,163,901,520,772,644,4,22,17,3,8,18,393,219,1031,725,623,837,14,24,27,0,4,19,284,252,1025,701,669,665,17,24,17,1,5,12,310,208,900,705,830,643,18,22,16,5,6,20,218,280,1065,542,728,997,23,10,27,18,10,16,192,372,1026,471,758,841,26,10,20,11,9,4,121,375,999,619,692,923,16,13,19,6,4,3,465,137,1055,767,775,652,26,18,37,13,11,20,246,160,913,640,721,662,27,11,21,17,7,14,474,240,1140,719,724,678,31,26,8,16,11,19,302,306,1050,707,666,616,27,26,8,9,6,6,210,264,880,569,718,915,28,7,12,17,8,15,362,232,913,560,876,691,33,17,11,10,7,22,466,256,1119,825,883,518,27,27,15,10,11,21,238,500,1154,740,658,1139,40,16,19,16,7,11,273,345,998,595,659,575,18,16,17,9,8,3,5 +417,329,894,684,595,495,30,20,9,10,5,7,184,338,823,617,584,836,25,33,22,3,3,13,178,288,786,522,799,547,6,17,12,3,13,18,510,288,844,695,642,746,26,19,22,6,15,15,413,253,824,675,680,566,21,25,12,3,14,8,309,177,741,649,853,562,22,19,1,5,13,16,235,275,778,540,643,906,19,31,22,4,13,12,201,333,761,529,673,748,22,21,15,7,8,8,252,264,810,657,655,830,12,20,14,0,13,7,474,260,898,699,832,577,30,21,28,13,14,16,319,167,790,586,748,639,27,16,6,17,8,18,449,267,983,731,631,593,23,21,9,16,4,17,279,217,911,745,623,547,23,23,11,1,3,10,217,219,735,547,661,814,16,26,7,3,13,11,283,201,726,542,873,590,21,14,4,10,14,18,511,315,954,789,1012,459,27,18,20,8,16,17,433,447,971,746,587,1042,36,33,14,2,16,9,352,242,851,635,558,588,28,13,24,9,15,7,5 +407,247,716,831,688,496,8,27,8,10,5,10,184,350,653,730,617,865,3,10,23,3,3,8,200,520,676,701,826,576,28,24,13,11,15,17,536,458,672,810,617,775,32,32,23,18,13,18,417,485,646,752,731,595,29,32,13,15,12,11,321,391,563,632,788,575,28,24,0,13,15,19,269,389,630,655,664,935,3,18,23,0,15,15,187,233,595,688,730,777,0,12,16,7,8,3,222,298,704,830,738,859,24,5,15,0,9,4,478,416,720,652,699,598,20,12,27,13,12,19,289,313,618,609,663,626,19,7,5,17,10,13,475,241,805,898,566,616,17,26,10,16,6,18,295,181,787,918,674,556,13,16,12,1,3,5,225,301,559,654,648,843,8,15,8,1,15,14,277,293,544,567,686,619,11,19,5,8,16,21,529,361,780,756,857,450,19,19,19,8,12,20,407,249,827,895,666,1071,14,14,15,2,12,10,320,336,707,788,729,565,18,24,25,15,15,2,5 +389,393,967,728,712,586,34,26,22,10,13,8,184,318,910,637,701,943,29,21,21,11,11,6,250,104,831,528,862,666,4,9,11,3,7,15,412,154,959,767,689,853,14,13,21,0,7,16,305,195,935,733,747,685,17,15,11,1,6,9,329,217,828,707,914,667,18,11,16,5,1,17,235,295,983,574,788,1013,23,13,21,16,3,13,199,451,940,535,808,861,26,13,14,7,6,1,130,374,931,685,742,941,16,24,13,2,7,6,468,192,969,749,861,670,26,19,37,15,10,17,293,219,823,644,811,684,27,18,21,17,4,11,505,281,1054,759,766,702,31,27,10,16,12,16,289,393,972,773,738,642,27,31,10,5,11,3,249,325,792,599,798,935,28,14,8,15,7,12,359,305,843,564,964,711,33,12,11,10,6,19,455,313,1041,821,971,538,27,24,21,10,8,18,247,579,1078,796,692,1157,40,29,13,12,8,8,264,350,914,633,683,585,18,5,19,9,7,0,5 +436,314,688,854,711,524,17,28,26,11,12,12,225,185,719,729,652,885,12,7,5,4,10,10,263,327,674,648,733,602,19,23,5,4,4,19,453,267,688,853,702,795,29,29,11,9,8,20,328,256,696,809,708,623,26,29,5,6,9,13,366,214,563,679,725,607,27,23,18,6,4,21,268,204,756,676,641,955,10,15,11,1,2,17,234,198,721,691,641,797,9,9,4,8,5,5,137,145,778,843,745,879,7,8,3,1,10,4,533,337,692,693,732,610,29,9,33,14,9,21,310,360,556,652,634,630,26,10,23,18,5,15,516,302,777,893,623,636,22,27,22,17,11,20,350,214,733,931,635,586,16,19,20,2,10,7,240,300,609,681,655,879,15,10,10,0,4,16,356,320,588,496,701,655,20,18,13,7,3,23,562,446,754,703,834,480,26,22,37,9,11,22,276,272,923,920,689,1093,23,15,3,1,11,12,279,363,659,779,708,531,23,21,23,12,12,4,5 +403,313,830,817,676,493,20,25,12,9,6,15,170,312,661,722,625,784,15,16,19,2,4,7,164,414,754,619,736,505,16,22,9,4,16,2,452,356,790,810,695,704,30,38,19,11,12,11,363,365,762,770,729,530,23,38,9,8,11,14,275,277,657,672,736,520,24,26,4,6,16,4,199,307,642,651,624,848,9,24,19,1,16,6,191,251,613,658,690,696,12,14,12,6,9,12,232,214,672,806,728,776,18,3,11,1,8,13,432,326,834,666,727,583,16,18,29,12,13,4,281,261,712,639,659,613,15,13,9,16,11,2,445,241,919,876,536,567,13,24,8,15,7,3,275,205,871,894,662,545,13,12,8,0,4,10,207,239,603,662,632,772,4,17,4,2,16,13,249,237,652,541,694,548,7,19,1,9,15,6,453,325,898,736,891,483,15,13,23,9,11,5,379,269,831,885,658,994,26,14,11,3,11,11,334,346,801,770,685,596,22,30,21,14,14,13,5 +426,314,766,851,765,579,21,19,15,11,5,10,235,305,803,778,706,948,16,16,16,4,7,8,281,459,774,635,773,659,15,32,6,4,11,17,399,403,782,848,756,858,25,38,16,9,7,18,292,378,796,804,770,678,30,38,6,6,6,11,380,348,641,678,703,658,31,32,7,6,11,19,250,358,844,669,697,1018,16,24,16,1,11,15,240,264,811,678,753,860,13,14,9,8,4,3,121,217,864,832,801,942,3,1,8,1,7,4,521,385,764,696,730,671,35,18,34,14,10,19,284,328,624,645,674,673,32,13,12,18,6,13,512,304,849,910,609,699,28,18,11,17,6,18,344,206,805,918,727,631,18,12,9,2,7,5,234,274,695,676,709,926,21,17,1,0,11,14,390,284,684,493,665,702,26,27,2,7,12,21,522,356,822,666,798,531,32,13,26,9,8,20,202,214,1011,911,745,1154,27,6,8,1,6,10,285,385,727,816,796,590,27,30,18,12,13,2,5 +365,255,843,696,586,515,11,27,6,4,2,9,194,404,692,625,557,830,6,14,25,9,4,7,188,534,747,638,872,537,25,20,15,11,16,4,510,494,767,685,657,738,31,36,25,12,10,17,429,479,757,643,769,560,26,36,15,13,9,8,247,409,666,609,864,560,25,24,2,13,16,6,251,429,601,538,640,866,0,22,25,6,16,14,141,277,606,589,724,718,3,12,18,13,9,10,294,350,671,685,674,806,25,5,17,6,8,11,398,420,847,693,771,589,17,16,23,7,9,6,271,281,699,568,741,635,16,11,3,11,11,8,421,243,932,763,490,563,14,26,12,10,3,5,311,207,900,771,694,589,10,14,14,7,4,8,297,327,586,527,648,774,5,15,10,7,16,7,245,317,653,548,758,568,8,17,7,8,17,8,445,321,899,807,977,487,16,15,17,2,9,7,467,259,788,756,574,1006,17,16,17,8,9,7,294,360,828,669,669,608,19,28,21,15,16,11,5 +448,340,996,686,583,552,31,15,9,15,5,11,223,357,805,587,574,797,26,30,22,4,3,13,171,183,830,558,815,534,5,8,12,4,11,4,503,243,960,713,624,693,29,24,22,1,13,13,422,234,932,711,696,551,20,30,12,0,14,10,282,192,825,687,867,585,21,12,1,6,11,2,224,252,818,558,673,849,20,28,22,9,11,8,230,340,797,543,711,707,23,10,15,8,8,18,331,341,786,655,637,785,13,23,14,1,13,19,449,167,1000,739,832,598,27,18,26,14,14,2,302,148,868,630,756,676,24,13,6,18,8,8,416,268,1085,717,667,614,22,20,9,17,4,3,314,290,1001,743,653,570,24,24,11,2,3,16,202,232,765,573,687,801,15,29,7,8,11,7,224,212,826,588,893,591,18,9,4,9,12,0,478,268,1064,857,1012,532,24,13,20,11,16,1,432,468,971,752,573,1007,37,28,14,5,16,11,395,337,947,603,570,609,25,16,24,10,15,19,5 +364,220,719,754,618,520,6,25,2,2,4,9,215,403,690,647,571,889,1,12,29,11,2,7,251,461,681,702,882,600,30,26,19,13,10,16,575,501,667,717,653,799,30,34,29,10,12,17,446,492,647,687,751,619,31,34,19,9,13,10,336,386,562,663,858,599,30,26,6,15,10,18,316,364,653,590,664,959,5,20,29,8,10,14,190,228,622,611,722,801,2,14,22,15,3,2,255,337,719,757,666,883,22,3,21,8,8,5,447,357,723,727,755,616,22,14,21,5,9,18,248,302,607,626,719,636,21,9,1,9,5,12,448,202,808,825,578,640,15,24,14,10,3,17,372,164,788,845,652,576,13,16,14,9,2,4,262,316,580,593,662,867,10,13,14,9,10,13,282,320,555,562,756,643,13,21,11,8,11,20,512,316,779,825,909,474,21,17,13,2,11,19,404,278,848,814,590,1095,12,12,21,10,11,9,271,345,716,715,671,549,16,26,19,15,12,1,5 +429,339,923,772,630,557,31,19,10,10,5,12,196,310,720,683,605,824,26,30,21,3,3,10,146,272,793,588,784,543,5,14,11,3,9,1,472,276,883,781,659,742,29,20,21,6,13,14,395,261,855,751,701,566,20,26,11,3,14,11,271,151,752,661,818,570,21,16,2,5,9,1,215,211,717,600,628,894,20,32,21,4,9,9,229,305,696,603,696,736,23,18,14,7,8,15,302,228,711,747,680,818,13,23,13,0,13,16,436,276,927,687,779,623,27,18,29,13,14,1,293,237,787,612,705,661,24,13,7,17,8,5,417,269,1012,815,592,615,22,20,8,16,4,0,301,223,956,835,646,589,24,26,10,1,3,13,185,287,672,613,638,802,15,31,6,3,9,10,229,253,745,540,820,580,18,17,3,10,10,3,471,347,991,791,963,533,24,17,21,8,16,2,415,379,874,836,618,1030,37,32,13,2,16,8,378,306,890,705,641,658,25,14,23,9,15,16,5 +428,530,785,941,759,525,28,24,31,12,16,13,203,153,814,800,716,894,23,21,4,3,12,11,259,139,785,729,673,607,8,25,10,3,6,20,457,75,837,964,740,804,18,11,8,4,6,21,348,154,833,920,720,630,23,9,10,1,7,14,360,320,706,806,681,606,24,21,23,5,6,22,264,276,929,779,693,964,19,21,2,6,6,18,236,360,880,772,613,806,20,29,7,7,13,6,129,255,935,924,793,892,10,36,8,0,6,5,519,279,777,818,778,617,32,19,30,13,7,22,300,420,651,771,656,631,33,24,28,17,11,16,524,440,862,958,639,645,31,25,27,16,15,21,316,418,810,1012,655,583,21,27,25,1,14,8,240,374,758,792,713,882,24,20,15,5,6,17,372,366,749,593,695,658,29,28,18,10,5,24,518,516,869,828,814,479,33,36,42,8,13,23,274,394,1038,1017,753,1102,34,35,8,2,9,13,307,329,736,844,708,536,22,17,20,9,14,5,5 +443,347,744,859,765,563,20,15,17,13,10,10,278,264,783,774,718,932,15,18,14,6,10,8,328,404,744,647,715,643,16,32,4,6,12,17,374,338,736,856,764,842,26,38,14,9,2,18,293,317,754,814,776,662,31,34,4,6,1,11,393,319,623,686,695,642,32,30,9,8,8,19,263,331,802,677,705,1002,13,26,14,3,10,15,259,245,771,690,715,844,12,16,7,10,7,3,130,176,824,842,799,926,4,3,6,3,0,4,528,370,748,700,768,655,32,16,34,16,15,19,297,335,604,653,672,657,29,15,14,20,11,13,505,313,833,916,617,683,25,20,13,19,11,18,373,235,787,930,701,615,15,10,11,4,10,5,247,249,665,684,725,910,18,19,1,2,12,14,433,253,646,477,685,686,23,29,4,9,11,21,529,391,802,628,842,515,29,11,28,11,15,20,191,209,981,919,749,1138,26,8,6,1,3,10,312,376,707,812,752,574,28,30,18,12,12,2,5 +385,457,889,815,719,545,29,26,14,14,12,11,222,220,858,726,682,914,24,31,17,5,10,9,300,172,827,617,745,625,7,11,7,3,2,18,436,126,957,848,684,824,17,15,17,0,10,19,357,153,965,836,670,644,22,15,7,1,11,12,371,227,810,754,795,624,23,9,6,5,4,20,235,261,999,655,693,984,22,23,17,10,4,16,263,401,932,634,671,826,21,25,10,7,5,4,152,278,951,786,751,908,11,28,9,0,10,3,552,222,863,790,816,637,31,25,27,13,11,20,301,285,721,699,708,639,32,22,11,17,5,14,467,347,948,842,681,665,34,27,10,16,11,19,369,385,888,874,619,597,24,29,8,1,10,6,187,313,778,686,699,892,27,20,2,9,2,15,385,295,871,595,827,668,32,10,1,10,3,22,591,411,939,876,902,497,32,28,25,12,13,21,257,509,1062,885,713,1120,35,31,9,6,13,11,278,256,816,732,660,556,19,13,19,9,12,3,5 +367,413,914,835,742,632,26,23,18,14,11,2,252,224,861,772,721,1001,21,30,13,5,9,14,358,212,830,599,746,712,10,14,3,1,11,11,358,150,1000,860,731,911,20,14,13,2,1,10,303,179,1002,826,727,731,25,18,3,3,2,7,387,223,833,748,792,711,26,12,10,3,9,11,271,247,1002,665,714,1071,25,22,13,10,9,15,285,327,937,642,620,913,22,24,6,5,8,9,94,218,934,794,792,995,8,25,5,2,1,6,522,204,868,796,837,724,34,24,39,11,10,11,333,301,726,687,721,726,35,23,15,15,12,15,485,321,953,876,632,752,35,24,14,14,12,10,387,329,913,882,656,684,27,26,12,1,9,11,273,245,787,688,748,979,30,23,2,9,11,6,455,245,896,543,820,755,35,11,5,12,10,13,527,419,946,790,891,584,35,25,29,12,16,12,195,445,1071,897,742,1207,32,24,5,6,4,2,294,232,817,750,681,643,22,16,23,11,13,8,5 +333,277,699,866,737,547,5,20,13,11,5,8,150,302,686,761,680,916,0,17,18,4,3,6,210,510,659,662,861,627,31,31,8,6,9,15,444,444,653,857,716,826,29,39,18,13,13,16,325,449,627,809,822,646,32,39,8,10,12,9,297,389,546,669,843,626,31,31,5,8,9,17,223,383,673,686,667,986,6,25,18,1,9,13,171,243,640,705,707,828,3,15,11,8,4,1,196,246,719,857,817,910,21,2,10,1,9,6,452,418,703,655,758,645,23,19,32,14,10,17,295,389,581,648,708,651,22,14,10,18,4,11,441,291,788,925,617,667,14,19,9,17,4,16,241,165,756,945,691,603,12,11,7,2,3,3,217,329,580,689,677,894,11,18,3,0,9,12,311,331,549,530,691,670,14,26,0,7,10,19,463,413,763,713,892,503,22,12,24,9,12,18,317,229,862,930,723,1122,11,7,10,1,12,8,258,378,684,815,820,568,15,31,20,14,13,0,5 +405,375,799,799,658,499,24,19,16,10,9,10,164,192,722,698,629,852,19,32,15,1,5,8,206,268,723,581,710,577,12,18,5,1,13,17,470,200,789,812,713,760,30,20,15,8,5,18,363,221,765,768,729,598,25,26,5,5,6,11,311,221,652,684,746,584,22,22,8,3,13,19,243,247,753,635,612,920,13,30,15,2,13,15,181,251,716,624,620,766,16,24,8,5,6,3,176,168,777,776,726,846,12,17,7,2,5,4,462,266,799,686,751,585,26,20,33,11,16,19,283,275,685,645,653,633,23,19,13,15,10,13,487,319,884,842,532,607,19,20,12,14,10,18,303,263,830,864,626,561,17,20,10,1,7,5,253,199,650,642,648,850,12,25,0,3,13,14,305,197,643,493,746,626,17,15,3,10,12,21,479,413,873,698,911,455,23,17,27,10,14,20,357,363,936,865,650,1066,30,28,7,4,8,10,298,250,758,730,641,556,24,12,17,11,15,2,5 +472,442,906,946,759,595,28,15,32,14,10,7,323,263,895,853,732,964,23,20,11,7,12,11,411,171,846,734,783,675,8,30,11,7,14,12,393,161,984,965,734,874,18,20,1,4,2,15,296,206,980,903,744,694,23,18,11,3,1,12,440,250,833,783,767,674,24,28,24,9,8,16,296,168,1038,784,749,1034,23,28,1,10,8,14,332,334,973,777,649,876,20,36,8,11,7,8,129,321,962,929,801,958,10,27,9,4,2,5,535,197,892,787,838,687,32,12,29,17,13,12,352,264,756,740,736,689,33,31,29,21,9,12,532,322,977,979,671,715,35,16,28,20,11,11,434,394,905,1017,675,647,25,18,26,5,12,10,292,276,795,793,771,942,28,27,16,9,14,13,512,274,892,628,813,718,33,27,19,10,13,16,504,362,984,793,882,547,33,27,43,12,13,13,174,466,1071,1022,757,1170,34,26,9,6,1,7,389,281,841,853,732,606,20,26,23,13,10,9,5 +411,289,913,674,552,536,26,24,4,3,6,13,250,410,646,605,523,719,21,17,27,8,8,9,138,378,809,648,710,478,10,23,17,8,20,0,498,390,877,677,581,671,28,39,27,13,18,15,483,383,849,645,655,497,23,39,17,12,17,12,251,269,742,667,722,523,18,27,4,10,20,2,297,317,695,514,606,779,15,25,27,7,20,10,271,323,680,577,690,633,18,15,20,12,13,14,408,294,671,653,592,721,16,10,19,7,12,15,362,242,917,747,695,606,18,19,21,6,13,2,261,201,781,626,633,618,15,14,1,10,15,4,369,219,1002,727,460,574,17,23,14,9,7,1,379,213,952,741,628,544,19,15,16,6,8,12,239,261,650,515,602,711,10,18,12,8,20,11,179,245,739,590,712,517,9,20,9,7,21,4,417,237,981,877,891,526,15,12,15,3,15,3,495,347,814,734,534,931,32,13,19,9,15,9,408,362,884,603,559,633,16,31,19,14,18,15,5 +352,308,617,726,620,581,14,28,22,5,6,11,169,317,574,601,575,848,9,15,11,10,4,3,205,317,629,588,782,641,22,23,1,14,8,12,455,303,607,659,647,844,32,27,9,11,8,13,354,312,617,697,729,658,29,27,1,10,9,6,298,232,442,595,736,592,24,23,14,14,8,14,242,196,605,546,592,894,5,13,9,7,8,10,146,220,572,579,562,760,6,11,2,12,3,2,229,265,667,731,696,860,10,10,1,7,10,9,449,197,621,647,671,711,24,17,39,8,7,14,234,270,467,578,629,553,21,2,19,12,3,8,434,204,706,789,572,575,17,25,18,11,5,13,322,248,684,819,560,539,7,19,16,8,4,0,240,208,460,547,606,802,10,6,6,6,8,9,268,228,481,444,666,632,15,18,9,1,9,16,492,334,671,739,805,563,21,24,33,5,9,15,294,310,768,776,610,1038,20,15,1,7,9,11,219,283,616,673,685,642,22,19,23,8,10,3,5 +352,300,1089,618,644,540,32,30,14,12,7,12,125,431,1060,577,635,899,27,15,33,17,5,10,209,187,929,564,810,622,4,19,23,1,7,19,481,247,1085,681,565,809,18,23,33,2,11,20,362,300,1063,699,647,645,19,23,23,3,12,13,320,254,952,733,872,621,20,19,20,3,7,21,246,374,1113,522,768,969,21,9,33,20,11,17,212,454,1070,465,840,815,24,7,26,13,8,5,179,427,1047,559,628,897,14,14,25,8,11,4,493,139,1089,811,833,630,28,19,31,15,12,21,282,170,963,664,779,644,29,10,17,15,6,15,448,244,1174,655,756,650,31,27,10,14,6,20,280,370,1076,647,714,602,25,27,8,11,5,7,192,314,952,561,758,897,24,6,18,19,7,16,310,278,953,646,946,673,29,14,15,12,8,23,516,246,1165,905,967,500,29,28,9,12,14,22,336,580,1234,686,602,1115,38,19,25,18,14,12,277,337,1032,525,561,555,22,15,13,11,13,4,5 +430,466,754,940,729,524,22,18,32,11,13,12,211,175,837,823,692,893,17,15,5,4,11,10,289,185,780,732,679,604,14,29,11,4,7,19,415,101,794,951,740,803,24,19,7,7,9,20,328,176,794,897,728,623,29,15,11,4,8,13,390,256,677,779,697,603,30,25,24,6,7,21,276,212,898,772,669,963,15,23,1,3,7,17,250,312,857,775,579,805,14,25,8,8,6,5,119,213,912,927,783,887,4,28,9,1,5,4,525,239,750,805,784,616,34,11,29,14,14,21,336,356,654,746,660,620,31,28,29,18,10,15,542,368,835,971,605,644,27,21,28,17,12,20,340,364,785,1015,637,576,17,21,26,2,11,7,260,292,789,779,699,873,20,22,16,2,7,16,388,292,712,604,703,649,25,32,19,9,6,23,528,452,834,789,868,476,31,28,43,9,12,22,250,434,1083,1012,723,1099,28,27,9,1,8,12,295,265,709,861,680,535,26,21,21,10,13,4,5 +355,355,992,757,726,596,29,25,19,14,11,8,176,346,949,708,713,965,24,20,18,13,9,6,280,146,910,573,840,676,7,14,8,1,11,15,400,178,1032,812,689,875,17,16,18,4,1,16,327,235,1040,794,727,695,22,16,8,5,2,9,335,233,885,760,870,675,23,14,11,1,9,17,275,317,1094,609,788,1035,22,12,18,18,9,13,221,439,1041,544,768,877,21,14,11,9,10,1,124,362,986,696,760,959,11,21,10,4,1,6,470,134,986,824,863,688,31,22,40,17,8,17,289,227,840,689,795,690,32,17,16,13,12,11,477,269,1071,790,742,716,34,26,15,12,14,16,325,369,995,784,692,648,24,30,13,7,9,3,257,313,847,650,800,943,27,13,3,17,11,12,363,283,938,587,934,719,32,13,6,14,10,19,479,285,1058,864,955,548,32,25,24,14,14,18,239,567,1119,821,710,1171,35,24,10,14,4,8,260,330,931,652,667,607,19,8,24,13,13,0,5 +371,261,692,874,716,593,17,17,14,10,4,9,166,224,747,773,673,962,12,14,17,3,4,7,262,390,738,666,768,673,19,34,7,3,10,16,404,324,716,869,745,872,29,36,17,10,12,17,321,329,720,815,775,692,32,36,7,7,13,10,337,271,589,715,768,672,27,34,6,5,10,18,227,307,798,702,670,1032,8,22,17,0,10,14,231,241,757,709,722,874,9,12,10,7,3,2,116,144,842,861,750,956,7,1,9,0,10,5,518,352,692,697,753,685,27,16,33,13,9,18,283,303,572,682,683,687,24,11,11,17,5,12,471,247,777,925,594,713,20,16,10,16,3,17,305,153,743,949,666,645,10,14,8,1,2,4,203,257,671,705,688,940,13,15,2,1,10,13,365,263,622,550,726,716,18,29,1,8,11,20,527,399,768,719,917,545,24,15,25,8,11,19,245,285,973,940,694,1168,23,4,9,2,11,9,264,332,663,813,701,604,25,28,19,13,12,1,5 +435,379,960,734,582,593,32,17,9,11,9,11,224,324,731,627,577,818,27,30,22,4,7,11,134,138,812,592,804,551,4,10,12,4,5,2,470,204,942,755,633,720,30,22,22,5,17,11,413,215,914,743,697,576,19,28,12,2,18,10,255,197,795,711,856,598,20,12,1,6,11,0,221,243,792,598,642,870,21,32,22,5,11,6,265,383,759,579,678,728,24,14,15,8,12,16,350,360,744,715,642,808,14,25,14,1,17,17,414,188,962,741,821,655,26,18,26,14,18,0,289,175,824,654,745,683,23,13,6,18,12,6,387,269,1047,771,636,641,23,20,9,17,8,1,339,337,967,803,632,593,25,26,11,2,7,14,169,269,721,617,662,812,16,31,7,4,5,9,213,249,794,594,872,602,17,13,4,9,6,2,465,311,1034,855,1005,573,23,15,20,9,20,1,427,513,933,804,572,1018,38,30,14,1,20,9,422,324,913,653,579,652,24,14,24,10,15,17,5 +423,379,910,750,705,581,28,21,16,13,9,7,270,266,889,691,690,950,23,30,15,6,9,11,346,226,848,524,783,661,8,18,5,6,11,14,340,224,936,769,682,860,18,20,15,3,3,15,279,197,950,735,714,680,23,24,5,2,2,8,385,175,783,679,825,660,24,16,8,8,5,16,259,251,992,578,731,1020,23,22,15,11,7,12,247,283,959,561,707,862,20,22,8,10,6,6,116,216,944,713,743,944,10,19,7,3,3,7,514,214,912,723,826,673,32,20,35,16,12,16,307,213,764,614,738,675,33,21,13,20,8,16,493,315,997,793,683,701,35,20,12,19,10,15,373,273,923,801,657,633,25,20,10,4,9,8,251,185,783,597,751,928,28,21,0,10,11,11,441,179,840,502,879,704,33,15,3,9,10,18,507,347,968,739,922,533,33,19,27,13,12,17,159,401,1067,810,695,1156,34,20,7,7,4,7,298,252,859,683,662,592,20,14,19,12,9,5,5 +356,314,776,885,730,513,12,29,21,9,8,12,117,249,667,756,689,876,7,6,12,2,10,2,169,267,714,677,798,587,24,22,0,4,8,11,425,263,764,890,757,786,30,28,10,11,4,12,328,258,742,854,783,606,25,28,0,8,5,5,254,192,613,720,794,586,24,22,13,6,8,13,188,210,698,711,680,946,1,14,10,1,6,9,162,210,663,720,680,788,4,8,3,6,7,3,217,201,740,872,778,870,22,9,2,1,14,10,417,313,776,704,811,629,16,8,40,12,5,13,230,310,654,693,717,641,15,11,18,16,7,7,436,254,861,928,648,627,13,28,17,15,7,12,264,214,829,960,646,581,9,18,15,0,8,1,206,256,589,718,702,854,4,13,5,2,8,8,272,264,608,543,764,630,7,17,8,9,7,15,444,428,846,768,955,497,15,23,32,9,7,14,348,332,879,953,708,1082,18,16,2,3,11,12,289,303,757,810,725,616,20,20,24,14,8,4,5 +375,417,923,854,736,622,29,29,32,10,11,8,248,262,880,779,719,991,24,24,15,9,9,6,348,104,821,618,850,702,7,20,11,3,11,11,312,106,1001,893,707,901,17,20,3,0,1,12,249,181,1001,877,757,721,22,16,11,1,2,5,357,231,842,771,868,701,23,20,24,5,9,15,217,243,1021,694,796,1061,24,16,3,14,9,13,267,405,958,659,770,903,21,22,8,7,8,3,88,334,923,811,766,985,11,27,9,0,1,6,474,170,905,787,895,714,31,12,29,15,10,13,293,257,759,724,807,716,32,17,29,17,12,11,437,299,990,883,752,742,34,26,24,16,12,12,393,401,916,899,684,674,26,30,22,3,9,3,235,323,776,727,806,969,29,17,16,13,11,8,445,305,907,582,926,745,34,21,19,10,10,15,493,355,995,819,979,574,32,29,39,12,16,14,163,525,1056,920,718,1197,35,26,9,10,4,8,284,300,850,741,677,633,19,10,27,9,13,4,5 +437,375,799,880,719,553,23,13,17,12,10,11,238,256,820,777,678,922,18,30,14,5,10,9,276,328,753,660,671,633,13,20,4,5,12,18,416,262,777,881,722,832,25,28,14,6,4,19,299,289,755,831,734,652,28,32,4,3,3,12,371,205,676,729,685,632,29,20,9,7,10,20,253,265,837,700,663,992,12,38,14,4,10,16,243,245,802,703,643,834,15,28,7,9,7,4,124,154,851,855,753,916,5,15,6,2,0,3,502,292,803,737,736,645,31,18,36,15,17,20,273,253,691,686,634,647,28,25,14,19,11,14,521,305,888,921,577,673,24,16,13,18,11,19,353,265,832,943,629,605,16,12,11,3,10,6,243,185,716,709,685,900,17,31,1,3,12,15,393,195,677,510,673,676,22,17,4,10,11,22,509,355,871,685,824,505,28,11,28,10,15,21,221,311,1022,940,707,1128,29,18,6,0,3,11,312,286,758,811,702,564,29,24,20,11,14,3,5 +360,354,908,711,628,531,28,19,13,14,1,13,119,299,807,644,619,886,23,32,18,3,5,7,195,203,798,497,790,597,8,18,8,1,13,14,445,215,890,724,681,796,26,20,18,2,13,15,336,212,862,694,719,616,23,26,8,3,12,14,290,226,749,660,844,596,24,20,5,3,13,16,200,268,820,561,632,956,17,30,18,8,13,12,198,358,781,534,660,798,20,22,11,5,6,6,203,297,816,678,696,880,10,17,10,2,11,7,473,201,910,692,809,625,30,20,32,11,10,16,282,220,772,605,735,669,27,17,10,15,8,10,442,282,995,756,618,641,23,20,9,14,0,15,230,280,925,764,636,581,21,22,7,1,3,8,198,246,717,574,668,864,16,25,3,7,13,15,310,228,742,519,862,640,21,15,0,12,14,18,478,368,982,744,981,495,27,17,24,10,12,17,360,480,987,775,624,1092,34,30,10,4,12,11,317,229,863,662,631,616,28,12,20,11,15,5,5 +363,419,787,934,750,589,22,12,31,11,11,9,196,196,852,827,721,958,17,21,14,4,9,5,284,210,819,724,746,669,14,25,10,4,5,14,376,130,847,941,761,868,24,21,0,7,11,15,297,177,849,895,767,688,29,19,10,4,10,8,353,233,712,799,776,668,30,21,23,6,3,18,231,223,943,762,704,1028,17,29,0,3,3,12,265,325,900,767,650,870,14,27,7,8,4,0,122,204,957,919,798,952,4,24,8,1,7,7,518,240,773,797,835,681,36,17,30,14,10,16,313,319,657,752,717,683,33,28,28,18,6,10,485,329,858,969,638,709,29,15,27,17,10,15,345,315,812,1007,656,641,19,21,25,2,9,2,195,289,800,769,740,936,22,22,15,2,5,11,387,287,763,618,794,712,27,26,18,9,4,18,511,437,857,815,949,541,33,24,42,9,10,17,203,443,1080,1004,738,1164,28,23,8,1,10,9,296,252,732,849,691,600,26,27,26,10,11,1,5 +426,402,991,689,584,575,33,26,9,15,9,12,239,325,764,626,569,778,28,33,22,4,7,10,161,123,829,551,800,523,3,3,12,2,5,1,521,171,963,720,617,684,29,13,22,1,17,14,456,176,935,708,677,526,18,19,12,2,18,11,296,200,820,664,850,574,19,5,1,4,11,1,258,316,797,535,646,838,22,25,22,9,11,9,302,440,774,530,682,690,25,11,15,6,12,15,393,341,743,652,644,770,15,34,14,1,17,16,423,219,995,736,815,631,27,23,26,12,18,1,288,208,855,607,741,673,24,12,6,16,12,5,386,306,1080,722,640,627,24,27,9,15,8,0,354,362,996,740,634,561,26,35,11,0,7,13,210,304,732,556,666,766,17,26,7,8,5,10,246,282,819,561,874,568,18,6,4,11,6,3,514,354,1063,842,991,553,24,24,20,11,20,2,474,566,932,753,578,988,39,39,14,5,20,8,435,287,944,612,589,648,25,7,24,10,15,16,5 +404,298,862,749,618,471,29,21,10,10,5,11,177,279,827,662,587,828,24,30,21,3,5,9,203,331,764,561,744,551,7,20,11,3,13,18,517,285,834,754,635,726,25,20,21,6,15,19,406,294,806,728,631,574,22,24,11,3,14,12,334,200,719,660,794,558,23,22,2,5,13,20,248,266,812,593,608,886,18,30,21,4,13,16,212,288,779,600,650,742,21,24,14,7,8,4,209,203,828,722,674,826,11,19,13,0,13,3,497,289,866,692,793,565,31,18,29,13,14,20,336,226,764,617,701,607,28,19,7,17,8,14,472,242,951,792,604,575,24,22,8,16,4,19,284,194,895,810,624,539,22,20,10,1,3,6,228,256,727,598,626,826,17,25,6,3,13,15,312,234,706,565,832,602,22,17,3,10,14,22,528,356,934,798,967,433,28,19,21,8,16,21,418,394,1001,811,614,1044,35,30,13,2,16,11,325,281,829,688,565,516,29,12,23,9,15,3,5 +431,403,920,901,771,614,27,18,26,15,9,6,338,246,855,824,744,983,22,31,15,4,11,14,410,188,810,681,781,694,9,19,5,4,13,9,314,166,1036,926,736,893,19,19,5,1,1,14,255,185,1002,886,740,713,24,25,5,0,0,7,411,207,831,768,787,693,25,17,18,6,7,11,265,191,994,735,763,1053,28,27,5,9,9,15,325,299,933,724,663,895,25,23,2,8,6,9,114,246,914,876,807,977,9,18,3,1,1,6,520,194,876,782,862,706,33,19,35,14,12,11,341,259,728,727,752,710,34,28,23,18,10,11,465,313,961,938,683,734,36,17,22,17,10,10,423,335,911,964,677,666,30,19,20,2,11,11,271,233,763,754,781,963,33,28,10,8,13,8,503,229,890,595,827,739,38,16,13,9,12,13,499,375,1010,796,896,566,34,18,37,11,14,12,133,415,1049,971,765,1189,33,17,3,5,2,2,358,278,825,808,704,625,21,21,27,10,11,8,5 +369,349,773,820,702,567,26,21,14,13,4,11,172,216,804,725,677,936,21,32,17,2,2,9,264,324,731,598,776,647,10,18,7,2,10,18,396,266,771,837,709,846,22,22,17,3,8,19,311,255,765,805,739,666,25,24,7,2,9,12,341,209,646,711,780,648,26,16,6,4,10,20,229,303,841,646,666,1006,15,26,17,7,10,16,221,283,806,641,722,848,18,24,10,6,3,4,112,140,843,793,748,930,8,19,9,1,8,3,508,336,777,735,799,659,34,20,31,12,11,20,283,271,657,674,719,665,31,23,11,16,5,14,473,321,862,861,590,687,27,22,10,15,5,19,307,219,806,881,684,623,19,20,8,0,2,6,205,257,708,671,700,916,20,23,2,6,10,15,355,243,659,526,806,692,25,15,1,11,11,22,519,411,845,767,933,519,31,19,25,9,11,21,247,355,1016,882,688,1142,32,22,9,3,11,11,242,274,736,751,677,580,26,16,19,10,12,3,5 +471,397,930,796,648,459,28,30,27,11,14,14,234,294,923,667,621,828,23,17,6,8,12,12,276,154,852,594,718,541,8,17,12,4,4,21,508,152,948,837,613,738,22,19,16,1,8,22,383,217,920,819,647,564,23,15,12,0,9,15,385,285,813,749,782,550,24,17,25,6,2,23,295,263,984,642,694,898,17,13,10,13,4,19,247,369,943,617,666,740,20,19,9,8,7,7,158,352,960,769,672,826,10,28,10,1,8,6,552,134,924,759,805,555,32,11,28,14,11,23,343,239,824,696,691,583,31,16,30,18,7,17,553,283,1009,809,636,579,27,27,21,17,13,22,339,399,927,857,592,533,21,31,19,2,12,9,263,291,873,665,696,816,20,18,17,12,4,18,359,279,824,586,826,592,25,18,20,9,3,25,563,313,1008,851,919,417,31,30,36,13,11,24,337,505,1171,874,636,1036,34,27,10,9,11,14,324,300,867,685,561,484,26,7,18,10,12,6,5 +373,291,661,929,682,506,8,25,13,9,2,9,166,388,628,798,607,875,3,14,18,2,4,7,188,466,637,751,824,586,28,26,8,10,12,16,510,484,629,888,615,785,32,36,18,17,10,17,375,483,607,818,717,605,29,36,8,14,11,10,307,389,516,650,764,585,28,26,5,12,12,18,227,345,623,751,620,945,3,22,18,1,12,14,191,199,590,784,660,787,0,12,11,6,5,2,202,316,695,936,736,869,22,1,10,1,10,5,452,354,665,626,669,600,20,16,32,12,9,18,259,339,573,663,637,640,19,11,10,16,7,12,441,245,750,992,608,626,17,24,9,15,1,17,289,205,736,1024,606,558,13,14,7,0,2,4,191,269,538,740,604,853,8,15,3,2,12,13,275,275,501,583,636,629,11,21,0,9,13,20,521,333,727,720,795,464,19,15,24,9,11,19,359,225,824,987,662,1081,14,12,10,3,11,9,296,324,664,876,761,571,16,28,20,16,14,1,5 +433,347,890,733,613,550,26,20,15,12,8,10,200,324,893,654,606,919,21,25,16,7,8,8,228,234,790,503,761,630,10,17,6,3,12,17,456,262,852,758,622,829,24,21,16,0,4,18,333,227,840,720,686,649,25,21,6,1,3,11,363,205,755,672,815,629,26,17,7,5,10,19,267,259,898,575,675,989,15,17,16,12,12,15,217,297,865,542,695,831,18,17,9,7,5,3,154,276,886,694,645,913,8,16,8,0,2,4,510,180,894,684,806,642,32,15,34,13,15,19,283,173,780,619,716,644,29,12,12,17,9,13,519,279,979,768,647,670,25,23,11,16,9,18,327,273,901,782,619,602,19,27,9,1,8,5,237,177,777,586,689,897,18,12,1,11,12,14,343,159,746,497,861,673,23,16,2,10,13,21,531,303,954,730,970,502,29,20,26,14,13,20,283,421,1083,797,593,1125,32,21,8,8,5,10,296,252,837,648,554,563,28,13,18,9,14,2,5 +430,298,742,852,729,545,10,22,14,11,3,11,213,271,765,765,686,914,5,13,17,4,5,9,267,439,708,644,765,625,26,29,7,4,17,18,441,365,708,841,746,824,32,35,17,11,11,19,332,360,686,789,776,644,27,35,7,8,10,12,356,332,615,685,719,624,26,29,6,6,17,20,264,366,764,682,679,984,1,21,17,1,15,16,218,236,735,687,743,826,2,13,10,8,10,4,123,191,798,839,767,908,16,2,9,1,7,3,509,397,746,675,758,637,18,15,31,14,10,20,314,302,634,656,694,647,17,10,11,18,12,14,538,280,831,913,569,665,15,21,10,17,4,19,320,182,793,927,709,597,11,15,8,2,5,6,258,248,653,681,701,892,6,14,2,0,17,15,372,248,614,542,699,668,9,24,1,7,18,22,508,386,808,697,884,497,17,16,25,9,8,21,270,236,953,916,705,1120,16,9,9,1,8,11,283,347,719,809,718,556,18,27,19,14,15,3,5 +407,285,712,891,659,545,15,25,21,10,4,10,180,260,725,776,616,914,10,12,12,3,4,8,224,374,724,693,749,625,21,26,0,9,10,17,478,342,678,868,694,824,33,34,10,16,8,18,349,369,656,810,768,644,28,34,0,13,9,11,337,273,581,702,761,624,23,26,13,11,10,19,247,259,728,713,613,984,4,20,10,0,10,15,197,181,693,736,623,826,7,14,3,7,3,3,158,198,802,888,711,908,11,3,2,0,10,4,500,320,716,692,738,637,23,14,40,13,9,19,279,283,622,677,648,657,20,9,18,17,7,13,495,203,801,944,579,665,16,24,17,16,3,18,291,193,775,976,575,597,8,16,15,1,2,5,213,203,627,712,631,892,9,13,5,1,10,14,315,205,582,571,687,668,14,21,8,8,11,21,517,385,780,726,900,497,20,17,32,8,11,20,309,275,925,955,635,1120,21,12,2,2,11,10,288,306,683,830,666,564,23,26,24,15,12,2,5 +372,380,854,738,570,531,29,19,14,11,5,15,175,267,747,621,569,864,24,22,17,2,3,1,169,169,776,626,816,595,7,24,15,2,9,8,543,165,866,761,629,762,29,18,27,5,13,9,424,178,838,749,699,614,22,18,15,2,14,8,292,182,703,715,868,612,23,20,6,4,9,10,256,254,804,594,650,930,18,26,21,5,9,6,230,392,765,585,678,782,21,28,20,6,8,6,305,285,822,719,632,862,11,25,19,1,13,13,453,189,852,771,847,631,27,12,19,12,14,10,268,242,732,660,763,651,24,23,11,16,8,4,390,288,937,769,636,629,20,20,14,15,4,9,314,312,869,807,630,613,22,22,14,0,3,4,206,310,707,611,674,872,13,25,12,4,9,9,264,284,712,610,888,650,18,25,9,11,10,12,522,360,932,885,1039,515,24,25,25,9,16,11,444,512,991,808,560,1078,35,28,17,3,16,15,353,259,807,649,533,584,25,16,19,10,15,7,5 +355,369,946,724,689,610,30,24,8,13,8,10,234,272,915,669,660,979,25,29,23,6,6,8,320,232,874,542,795,690,6,15,13,4,6,17,410,206,992,749,670,889,16,15,23,1,8,18,325,185,994,743,686,709,21,15,13,0,9,11,367,187,827,683,855,689,22,13,0,6,6,19,211,295,1052,566,717,1049,25,21,23,11,8,15,273,391,993,549,719,891,22,27,16,8,5,3,124,274,984,685,731,973,12,28,15,1,8,4,550,236,938,743,836,702,30,23,29,14,9,19,283,225,796,628,754,704,31,22,5,18,3,13,439,289,1023,765,701,730,33,25,10,17,7,18,361,285,953,773,661,662,27,27,12,2,6,5,185,289,817,595,721,957,30,22,8,10,6,14,425,263,888,564,893,733,35,12,5,9,7,21,577,365,1010,837,938,562,31,28,19,13,11,20,227,505,1101,786,685,1185,36,27,15,7,11,10,280,194,887,655,662,623,18,15,25,10,10,2,5 +426,284,911,704,559,556,26,15,8,9,13,10,227,361,652,631,536,757,21,26,23,2,11,12,141,319,819,570,795,498,10,14,13,4,9,3,479,339,869,705,666,685,28,24,23,11,21,16,438,314,841,677,704,511,23,30,13,8,22,9,280,214,738,629,841,539,18,16,0,6,15,1,252,286,689,552,583,827,15,34,23,1,15,11,280,300,676,567,627,669,18,18,16,6,16,17,379,279,685,689,635,751,16,23,15,1,21,18,433,247,915,665,794,632,18,14,27,12,22,1,312,136,785,574,712,636,15,13,5,16,16,7,396,212,1000,763,563,606,17,24,10,15,12,2,344,208,938,777,599,558,19,24,12,0,11,15,210,212,648,559,607,735,10,27,8,2,9,8,230,182,733,538,821,537,9,17,5,9,10,1,478,280,975,773,1014,542,15,13,19,9,24,0,470,402,810,768,551,963,32,28,15,3,24,10,433,269,874,665,548,671,16,18,25,14,15,18,5 +360,404,734,961,737,552,16,17,31,10,11,10,173,139,813,850,702,921,11,16,10,1,9,8,263,249,780,753,719,632,20,30,10,3,7,17,395,151,774,976,780,831,30,20,2,10,9,18,326,192,774,932,782,651,31,16,10,7,8,11,338,278,651,822,751,631,26,26,23,5,7,19,254,218,872,793,683,991,7,24,0,2,7,15,218,286,831,796,627,833,8,26,7,5,4,3,131,163,914,948,793,915,8,27,8,2,5,4,475,281,730,836,810,646,26,10,30,11,14,19,306,390,636,781,698,646,23,29,28,15,8,13,478,356,815,998,613,672,19,20,27,14,10,18,336,300,783,1036,645,604,9,20,25,1,9,5,254,278,769,804,715,899,12,23,15,3,7,14,362,300,688,617,739,675,17,31,18,10,6,21,500,506,814,818,936,504,23,27,42,10,12,20,256,380,1065,1033,721,1127,22,26,8,4,8,10,253,275,697,878,688,565,24,22,22,13,13,2,5 +380,278,742,871,662,538,12,25,11,10,4,13,159,375,577,768,607,825,7,16,20,3,6,9,121,487,716,683,818,536,24,22,10,9,18,0,437,457,714,858,617,737,30,38,20,16,16,11,384,472,688,804,733,555,25,38,10,13,17,12,260,368,575,660,784,559,24,26,3,11,18,2,208,364,586,693,626,895,1,24,20,0,18,6,214,252,557,726,724,737,4,14,13,7,11,14,273,305,626,866,718,819,28,5,12,0,10,15,413,373,746,644,685,624,16,18,30,13,11,2,280,294,638,647,661,646,15,13,8,17,13,4,404,254,831,934,532,614,13,24,7,16,5,1,282,218,811,954,680,570,9,12,9,1,6,12,186,268,539,694,624,803,4,17,5,1,18,11,222,272,566,575,700,579,7,19,2,8,19,4,444,322,810,734,871,522,15,13,22,8,13,3,412,256,769,935,640,1031,18,14,12,2,13,9,351,299,739,824,709,649,22,30,22,15,16,15,5 +386,488,755,912,744,587,22,17,30,13,10,8,223,179,798,799,721,956,17,22,11,2,10,6,303,161,743,694,736,667,14,28,9,2,12,15,361,71,833,933,749,866,24,18,1,3,2,16,306,162,835,885,757,686,29,14,9,2,1,9,378,268,698,769,730,666,30,26,22,4,8,17,266,230,935,748,708,1026,17,28,1,7,10,13,258,346,862,737,626,868,14,34,6,6,7,1,97,245,893,889,786,950,4,29,7,1,0,6,517,219,725,797,835,679,36,12,31,12,15,17,312,358,607,726,715,681,33,29,27,16,11,11,492,362,810,931,614,707,29,18,26,15,11,16,360,398,762,977,648,639,19,20,24,0,10,3,254,312,742,761,744,934,22,29,14,6,12,12,412,314,753,592,756,710,27,25,17,11,11,19,526,454,813,801,909,539,33,29,41,9,15,18,194,474,1022,984,734,1162,28,28,7,3,3,8,259,263,678,811,679,598,26,22,23,10,12,0,5 +407,321,769,843,618,487,20,19,32,12,7,9,190,252,708,714,577,826,15,20,1,5,5,7,200,280,733,689,720,549,16,28,11,5,7,16,538,234,761,846,679,736,32,28,15,12,11,17,411,271,733,808,707,570,29,28,11,9,10,10,293,173,612,722,762,578,24,30,24,7,7,18,249,147,733,677,584,896,9,28,9,2,7,14,163,257,696,690,572,738,12,20,8,9,4,2,222,232,779,842,672,820,10,9,9,2,9,5,464,250,769,780,769,571,24,10,25,15,10,18,283,255,657,681,663,627,21,17,29,19,6,12,453,233,854,880,556,579,17,24,28,18,6,17,289,239,810,930,552,561,13,12,26,3,5,4,235,285,644,692,612,832,10,21,16,1,7,13,259,287,611,577,744,612,15,27,19,8,8,20,507,375,845,820,931,451,21,9,43,10,12,19,403,375,928,915,602,1036,26,20,9,0,12,9,314,314,732,766,607,536,22,20,21,13,13,1,5 +373,371,845,857,716,583,24,17,15,13,5,9,192,218,906,778,693,952,19,32,16,2,3,7,290,274,851,631,740,663,12,18,6,2,9,16,394,204,867,868,711,862,22,20,16,3,9,17,323,221,879,822,717,682,27,22,6,2,8,10,357,207,744,762,788,662,28,16,7,4,9,18,247,275,955,683,680,1022,17,30,16,7,9,14,241,293,920,674,658,864,16,30,9,6,2,2,120,186,945,826,762,946,6,21,8,1,7,5,522,260,849,776,811,675,36,20,34,12,12,18,319,269,721,707,705,677,33,29,12,16,6,12,489,319,934,900,622,703,29,18,11,15,6,17,323,255,872,914,640,635,19,22,9,0,3,4,225,215,826,698,718,930,22,29,1,6,9,13,389,207,781,571,824,706,27,15,2,11,10,20,517,397,913,796,945,535,33,21,26,9,10,19,223,411,1118,921,708,1158,30,22,8,3,10,9,268,212,806,782,653,594,24,22,18,10,11,1,5 +411,411,993,838,714,562,30,25,25,10,10,10,260,280,942,753,687,931,25,20,12,9,10,8,338,112,897,606,826,642,6,16,14,3,12,17,328,142,1039,883,689,841,16,18,12,0,0,18,269,185,1043,865,731,663,21,16,14,1,1,11,367,217,884,769,866,641,22,16,27,5,8,19,251,231,1081,684,774,1001,25,12,8,14,8,15,241,393,1024,647,752,843,22,16,11,7,11,3,96,330,973,799,742,925,12,21,12,0,0,4,462,166,985,775,863,654,30,20,26,15,7,19,303,231,839,716,785,662,31,15,32,17,11,13,465,293,1070,859,740,682,33,26,19,16,15,18,379,379,1000,887,660,614,27,28,17,3,10,5,261,297,842,715,774,915,30,11,19,13,12,14,429,283,943,586,904,691,35,15,22,10,11,21,483,337,1061,841,941,514,31,25,34,12,13,20,199,511,1126,908,700,1137,36,22,12,10,3,10,298,304,928,733,657,573,18,8,22,9,12,2,5 +395,321,645,959,797,581,4,15,17,9,10,5,226,282,742,844,728,950,1,16,14,2,10,15,302,524,723,757,789,661,32,34,4,8,12,12,358,426,671,950,748,860,28,38,14,15,6,13,283,455,683,896,830,680,33,38,4,12,5,8,359,417,550,754,745,660,32,32,9,10,12,14,245,379,767,781,723,1020,7,24,14,1,10,18,239,215,734,800,725,862,4,14,7,6,7,10,114,216,831,952,833,944,20,1,6,1,0,5,482,428,641,726,730,673,24,18,36,12,17,14,269,421,559,733,668,675,23,13,14,16,11,14,481,341,726,1014,637,701,13,14,13,15,11,13,351,225,706,1040,709,633,11,12,11,0,10,12,221,287,658,782,729,928,12,17,1,2,12,9,399,307,585,543,639,704,15,31,4,9,11,16,501,427,705,656,798,533,23,13,28,9,15,15,179,161,964,1025,773,1156,10,2,6,3,3,5,294,372,622,902,810,592,12,30,20,16,16,9,5 +423,243,701,786,609,511,11,29,10,9,9,13,198,366,552,683,550,800,6,12,21,2,7,9,158,414,667,642,787,513,25,18,11,10,5,0,516,420,679,767,596,718,31,34,21,17,17,11,435,419,651,723,698,536,26,34,11,14,18,12,293,313,532,589,781,538,25,22,2,12,11,2,255,303,555,604,577,870,0,20,21,1,11,6,263,237,522,635,635,712,3,12,14,6,12,14,332,294,609,783,669,794,25,9,13,1,17,15,444,314,705,605,710,603,17,14,27,12,18,2,307,267,581,564,630,627,16,9,7,16,12,4,395,189,790,851,551,595,14,28,8,15,8,1,309,163,766,871,585,539,10,16,10,0,7,12,201,263,500,601,573,778,5,13,6,2,5,11,241,267,533,504,687,554,8,15,3,9,6,4,509,305,773,719,900,499,16,17,21,9,20,3,447,291,740,846,591,1006,17,18,13,3,20,9,390,302,694,741,646,626,19,26,23,16,15,15,5 +380,384,1042,810,672,679,31,29,23,11,11,9,211,299,1013,721,669,980,26,16,22,18,9,7,295,173,958,594,818,755,5,28,24,2,11,16,333,191,1090,875,573,824,15,30,22,1,1,17,250,206,1086,853,647,778,20,20,24,2,2,10,328,212,947,763,880,768,21,28,31,4,9,18,230,234,1164,672,802,1040,24,8,20,19,9,14,218,370,1101,605,858,928,23,14,21,14,10,2,113,343,1010,757,648,1014,13,17,22,9,1,5,429,151,1038,753,863,735,29,12,16,14,8,18,276,186,902,704,799,795,30,11,26,16,12,12,426,274,1123,835,786,773,32,28,27,15,14,17,356,334,1035,845,730,747,26,24,25,12,9,4,242,266,915,713,790,1040,29,9,29,18,11,13,400,240,998,606,974,818,34,23,32,11,10,20,444,324,1122,851,987,639,30,31,24,11,14,19,220,496,1155,884,632,1182,37,16,22,17,4,9,261,311,981,691,543,554,17,12,16,10,13,1,5 +445,319,788,844,675,484,14,28,12,11,2,13,202,346,719,763,612,823,9,13,19,4,4,9,216,484,728,648,747,534,22,23,9,6,16,12,522,416,734,829,650,733,28,35,19,13,14,13,373,425,714,775,710,553,23,35,9,10,13,16,345,357,631,635,713,535,22,23,4,8,16,14,247,345,676,662,609,893,3,21,19,1,16,10,235,247,651,701,703,735,6,13,12,8,9,10,214,268,730,837,711,817,20,2,11,1,10,5,508,370,792,621,670,574,14,15,31,14,9,14,291,291,686,612,626,620,13,10,9,18,11,8,483,265,877,911,527,584,11,27,8,17,3,13,313,237,845,925,667,530,7,15,8,2,4,12,209,225,611,661,617,801,2,14,4,0,16,17,297,231,608,536,671,577,5,18,1,7,17,16,537,319,846,675,846,448,13,16,23,9,11,15,365,239,873,906,653,1029,20,15,11,1,11,9,356,324,765,811,678,575,22,27,21,14,16,9,5 +394,260,825,749,605,541,15,27,8,10,8,14,199,381,642,678,554,794,10,14,23,3,6,8,133,447,757,613,741,507,21,20,13,5,12,1,491,417,781,740,636,712,27,36,23,12,16,14,418,428,753,694,694,534,22,36,13,9,17,13,280,300,652,604,759,550,21,24,0,7,12,3,238,350,619,577,601,864,4,22,23,0,12,9,270,302,600,608,683,706,7,12,16,7,11,13,333,285,655,734,657,788,23,7,15,0,16,14,437,331,829,646,714,625,13,16,27,13,17,3,288,232,709,561,654,647,12,11,5,17,11,3,402,212,914,812,511,611,10,26,10,16,7,2,328,186,876,820,637,557,8,14,12,1,6,11,196,260,600,576,603,772,1,15,8,1,12,12,244,250,643,531,727,552,4,17,5,8,13,5,500,294,889,754,926,527,12,15,19,8,19,4,444,322,802,809,587,1000,21,16,15,2,19,10,395,309,804,716,618,656,23,28,25,15,16,14,5 +450,324,843,761,638,472,24,22,8,12,5,9,215,389,740,678,591,829,19,19,23,5,7,7,213,415,771,627,706,536,12,27,13,5,19,16,523,413,791,752,679,735,32,33,23,10,17,17,402,412,767,708,705,555,27,33,13,7,16,10,316,288,680,630,724,539,24,29,0,7,17,18,232,362,687,599,628,895,13,27,23,2,17,14,204,324,662,618,688,737,16,17,16,9,12,2,235,299,735,750,674,819,10,6,15,2,9,5,483,321,847,656,725,574,24,13,27,15,8,18,286,192,739,587,651,622,21,16,5,19,14,12,472,264,932,824,526,576,17,21,10,18,6,17,318,264,882,838,634,540,17,13,12,3,7,4,222,240,660,598,630,803,10,20,8,1,19,13,282,210,661,549,708,579,15,22,5,8,20,20,520,278,907,766,889,446,21,10,19,10,10,19,384,328,892,825,622,1031,30,19,15,0,10,9,357,301,806,720,629,573,22,25,25,13,13,1,5 +430,406,952,747,661,488,33,23,10,14,3,13,211,331,959,688,630,847,28,32,21,3,3,11,249,295,850,553,731,568,3,18,11,3,11,20,477,301,896,764,638,749,17,20,21,2,9,21,338,242,912,754,634,589,18,22,11,1,8,14,356,146,847,682,773,571,19,20,2,5,11,22,248,334,992,589,643,911,22,28,21,8,11,18,212,354,957,586,679,765,25,24,14,7,4,6,141,253,978,714,701,847,15,21,13,0,9,5,517,307,956,726,780,572,27,20,31,13,8,22,290,210,828,635,696,612,28,19,7,17,6,16,516,340,1041,792,629,598,32,24,8,16,2,21,316,288,977,802,655,544,26,22,10,1,3,8,230,228,845,612,665,839,25,23,6,7,11,17,346,190,852,567,831,615,30,15,3,10,12,24,528,362,1012,828,896,440,28,21,21,10,10,23,296,440,1145,811,657,1063,39,30,13,4,10,13,297,239,909,692,600,507,21,12,23,9,13,5,5 +427,365,751,1060,768,545,17,17,31,10,9,9,236,146,800,933,727,914,12,10,10,3,11,7,318,268,781,858,712,625,19,38,10,3,13,16,360,198,769,1059,801,824,29,30,2,10,7,17,255,217,769,993,801,644,32,20,10,7,6,10,369,253,660,849,716,624,27,34,23,5,13,18,247,187,867,888,710,984,8,18,0,0,9,14,251,197,824,901,648,826,9,20,7,7,6,2,106,148,911,1053,812,908,7,17,8,0,1,5,474,312,747,843,811,637,27,14,30,13,16,18,301,345,641,830,703,639,24,19,28,17,12,12,491,321,832,1097,622,665,20,22,27,16,10,17,357,281,796,1141,670,597,10,12,25,1,11,4,255,213,754,893,736,892,13,17,15,1,13,13,417,237,687,680,694,668,18,35,18,8,12,20,467,465,831,787,897,497,24,19,42,8,14,19,187,309,1052,1130,750,1120,23,16,8,2,2,9,298,316,714,979,717,556,25,24,22,13,15,1,5 +327,421,820,928,790,627,19,24,21,11,13,4,216,118,817,821,753,996,14,29,14,2,9,10,318,254,782,698,738,707,17,7,0,2,9,13,350,150,940,941,805,906,27,9,10,5,3,10,305,197,910,917,791,726,32,15,0,2,4,3,341,301,745,809,732,706,33,5,13,4,11,11,231,285,946,750,730,1066,18,21,10,5,9,11,237,265,873,741,638,908,15,21,3,6,10,5,116,160,912,893,840,990,7,28,2,1,3,8,492,346,776,849,845,719,35,27,40,12,12,11,281,381,630,764,721,721,34,22,18,16,14,15,429,381,861,951,654,747,28,25,17,15,14,12,371,301,827,981,694,679,20,29,15,0,11,7,241,247,767,769,758,974,23,22,5,4,9,6,415,261,814,576,730,750,28,10,8,11,8,13,517,517,882,817,885,579,34,28,32,9,18,12,193,361,1049,986,784,1202,25,29,2,3,6,4,246,276,731,833,739,638,23,15,26,10,15,6,5 +394,296,784,830,652,516,11,19,12,10,5,11,201,351,609,733,623,787,6,22,19,3,7,11,199,463,736,630,788,508,25,24,9,9,19,2,393,439,744,807,729,705,31,32,19,16,17,15,344,458,716,745,787,525,26,32,9,13,16,10,252,354,615,647,828,551,25,26,4,11,19,0,230,326,602,660,592,857,0,30,19,0,19,10,186,204,585,683,650,699,3,20,12,7,12,16,277,291,646,825,750,781,27,11,11,0,9,17,395,357,788,641,777,582,17,14,31,13,10,0,342,286,678,622,711,642,16,19,9,17,14,6,436,244,873,893,544,594,14,20,8,16,6,1,252,220,849,913,670,548,10,16,8,1,7,14,266,224,573,655,632,775,5,23,4,1,19,9,272,230,606,570,776,557,8,25,1,8,20,2,384,328,852,683,993,500,16,7,23,8,12,1,420,232,773,894,644,997,17,20,11,2,12,9,343,299,775,785,679,621,21,24,21,15,15,17,5 +425,285,626,891,701,578,6,19,15,9,6,11,204,330,679,796,636,947,1,12,16,2,4,9,262,524,688,693,735,658,30,32,6,6,16,18,430,468,632,864,668,857,30,34,16,13,12,19,347,481,644,808,760,677,31,34,6,10,11,12,381,421,509,664,691,657,30,32,7,8,16,20,283,369,704,709,625,1017,5,20,16,1,16,16,249,183,671,736,667,859,2,14,9,6,9,4,124,274,766,890,753,941,18,3,8,1,6,3,546,410,630,652,662,670,22,14,34,12,13,20,313,367,534,645,610,672,21,9,12,16,11,14,527,307,715,964,545,698,15,18,11,15,7,19,335,191,691,976,647,630,13,16,9,0,4,6,249,259,601,702,635,925,10,13,1,2,16,15,377,281,538,491,587,701,13,27,2,9,15,22,553,387,692,588,776,530,21,17,26,9,11,21,257,201,907,949,679,1153,12,6,8,3,9,11,286,328,617,858,734,589,14,26,18,16,14,3,5 +409,359,807,785,688,572,25,14,12,11,1,2,246,304,842,690,659,927,20,31,19,4,5,16,312,344,797,571,760,652,11,19,9,4,13,11,346,314,817,790,691,829,21,23,19,5,11,10,285,321,829,752,705,673,26,29,9,2,10,9,343,213,692,676,774,651,27,17,4,6,13,11,223,299,889,623,646,995,18,35,19,5,13,15,209,277,854,622,704,847,17,29,12,8,6,11,164,220,891,764,732,927,7,16,11,1,11,6,502,312,811,686,785,656,35,19,31,14,8,11,275,227,671,633,703,670,34,26,9,18,8,15,469,285,896,832,604,686,30,15,8,17,2,10,375,251,844,852,678,626,20,15,8,2,3,13,217,205,744,630,674,923,23,32,4,4,13,8,391,191,727,545,804,699,28,16,1,9,14,13,499,349,871,750,919,524,34,14,23,9,10,12,191,323,1058,851,678,1145,31,17,11,1,10,2,300,300,768,724,665,561,23,25,21,10,15,10,5 +436,346,842,921,784,548,24,19,15,11,7,9,255,271,861,822,731,917,19,16,16,4,7,7,297,409,822,709,750,628,12,32,6,4,9,16,361,345,826,922,773,827,24,38,16,7,5,17,290,336,840,888,783,647,27,38,6,4,4,10,334,292,717,762,726,627,28,32,7,6,9,18,248,318,874,743,720,987,15,24,16,3,9,14,218,248,841,752,736,829,16,14,9,8,4,2,147,177,888,904,818,911,6,1,8,1,3,5,457,355,846,772,769,640,32,18,36,14,14,18,266,328,696,729,685,642,29,13,12,18,8,12,468,316,931,972,632,668,27,18,11,17,8,17,358,224,881,992,716,600,17,12,9,2,7,4,224,280,739,750,736,895,20,17,1,2,9,13,382,282,748,545,694,671,23,27,2,9,10,20,466,378,904,738,845,500,29,13,26,9,12,19,224,230,1049,985,764,1123,30,6,8,1,6,9,311,379,813,868,777,559,28,30,20,10,11,1,5 +445,297,711,962,650,480,9,27,31,11,3,11,224,312,722,835,579,805,4,14,0,4,7,9,236,366,733,788,692,542,27,24,10,10,11,18,512,340,711,947,643,715,33,36,14,17,9,19,379,381,685,889,679,565,28,36,10,14,8,12,331,265,592,755,700,575,27,24,23,12,11,20,245,245,753,792,566,875,2,22,8,1,11,16,197,247,716,815,562,725,1,12,7,8,4,4,188,244,825,967,694,811,23,1,8,1,9,3,484,264,709,801,673,536,19,16,26,14,8,20,279,275,651,740,571,624,18,11,28,18,12,14,511,193,794,1017,560,560,16,26,27,17,4,19,331,213,770,1055,578,546,12,14,25,2,5,6,239,253,674,791,570,827,7,15,15,0,11,15,327,263,593,618,622,607,10,19,18,7,12,22,517,331,787,817,801,430,18,15,42,9,8,21,361,299,964,1032,632,1029,15,14,8,1,8,11,340,332,684,897,663,501,17,28,20,14,13,3,5 +349,379,777,941,743,600,20,15,28,10,11,9,186,158,840,836,708,969,15,22,13,3,9,5,270,258,821,731,749,680,16,22,7,3,7,14,356,178,833,948,774,879,26,22,3,8,9,15,297,191,837,902,788,699,31,24,7,5,8,8,335,243,684,806,763,679,32,20,20,5,3,16,223,221,915,769,689,1039,15,30,3,2,3,12,239,279,874,774,647,881,12,24,4,7,4,0,124,166,937,926,797,963,4,19,5,0,7,7,490,286,765,810,810,692,34,12,33,13,10,16,303,353,641,759,702,694,31,25,25,17,4,10,475,331,850,976,635,720,27,16,24,16,10,15,333,269,806,1014,653,652,17,20,22,1,9,2,209,275,786,776,721,947,20,23,12,1,7,11,371,293,739,619,763,723,25,25,15,8,6,18,497,471,845,820,930,552,31,19,39,8,8,17,209,387,1076,1011,731,1175,26,18,5,2,8,9,272,272,730,856,726,611,28,24,25,11,9,1,5 +421,407,898,746,676,537,29,23,13,14,3,11,220,292,897,673,657,906,24,36,18,3,5,9,254,310,784,518,754,617,7,14,8,3,13,18,436,286,834,763,677,816,19,22,18,2,7,19,321,269,820,733,695,636,22,22,8,1,6,12,333,177,767,667,772,616,23,14,5,5,13,20,251,315,872,582,648,976,18,28,18,8,13,16,189,319,839,559,666,818,21,24,11,7,6,4,142,224,858,711,726,900,11,21,10,0,7,3,488,302,902,701,785,629,31,24,32,13,10,20,283,227,766,620,703,633,32,21,10,17,8,14,511,343,987,787,590,657,30,24,9,16,4,19,293,289,923,799,658,591,22,22,7,1,5,6,239,205,763,601,686,884,23,23,3,7,13,15,343,177,766,506,816,660,28,11,0,10,14,22,489,383,954,745,909,489,32,21,24,10,8,21,257,375,1045,808,668,1112,35,28,10,4,8,11,292,256,853,681,647,548,23,14,20,9,15,3,5 +408,384,926,817,737,616,28,22,15,14,9,11,285,199,857,772,712,985,23,31,16,3,11,9,371,267,844,583,729,696,8,15,6,3,13,18,377,207,1008,836,716,895,18,15,16,2,1,19,324,214,1008,808,706,715,23,19,6,1,0,12,426,220,837,720,777,695,24,13,7,5,7,20,286,318,996,641,695,1055,27,23,16,8,7,16,318,272,935,626,649,897,24,27,9,7,8,4,103,159,936,782,787,979,10,24,8,0,1,3,567,305,888,768,804,708,32,23,36,13,10,20,352,292,742,673,694,710,33,24,12,17,10,14,516,342,973,864,621,736,35,23,11,16,12,19,400,262,931,866,675,668,29,25,9,1,11,6,280,212,779,666,731,963,32,24,1,7,13,15,478,198,896,493,823,739,37,12,2,10,12,22,568,440,954,736,876,568,33,24,26,10,14,21,190,380,1063,875,737,1191,34,23,8,4,2,11,309,245,839,762,680,627,20,17,20,9,11,3,5 +414,356,988,660,559,516,31,26,6,15,11,12,231,371,851,615,544,739,26,33,25,4,9,10,155,223,842,546,741,474,5,3,15,2,7,1,521,255,942,689,560,629,29,13,25,1,19,16,470,232,914,697,604,475,20,19,15,2,20,11,288,168,819,679,797,535,21,5,2,4,13,1,276,336,804,518,631,785,20,25,25,9,13,11,284,440,797,517,659,639,23,11,18,6,14,15,387,351,804,619,605,727,13,34,17,1,19,16,431,241,992,759,800,588,27,23,27,12,20,1,312,162,886,622,708,636,24,12,3,16,14,5,390,294,1077,701,617,600,22,27,12,15,10,0,346,314,1005,707,605,518,24,35,14,0,9,13,236,272,785,553,647,715,15,26,10,8,7,10,240,246,806,582,855,523,18,6,7,11,8,3,506,330,1052,859,976,510,24,24,17,11,22,2,492,560,997,718,557,937,37,39,17,5,22,8,415,249,945,603,502,607,25,7,25,10,13,16,5 +390,396,926,876,754,564,28,25,32,11,13,3,253,293,901,789,733,933,23,24,9,8,13,13,323,131,858,656,806,644,8,20,11,4,9,10,337,141,986,909,715,843,18,18,3,1,3,15,268,206,990,871,737,663,23,14,11,0,4,10,360,262,857,777,836,643,24,18,24,6,5,12,240,262,1046,716,784,1003,23,20,1,13,7,12,258,412,979,693,714,845,20,26,8,8,10,8,105,367,974,845,788,927,10,29,9,1,3,5,491,159,912,817,883,656,32,18,29,14,8,12,308,248,774,728,777,658,33,23,29,18,10,14,484,288,997,897,706,684,35,26,28,17,14,11,374,410,925,933,672,616,25,28,26,2,13,10,238,328,805,737,794,911,28,21,16,12,9,11,418,310,908,604,880,687,33,19,19,9,8,14,486,314,996,865,945,516,33,29,43,13,12,13,182,538,1085,948,748,1139,34,28,9,9,6,3,311,323,861,767,673,575,20,14,21,10,13,7,5 +313,501,772,794,684,632,24,29,21,14,15,11,194,208,825,725,677,1001,19,24,12,3,11,9,328,222,772,558,786,712,12,18,0,1,7,18,442,120,844,821,731,911,22,8,10,4,5,19,371,185,838,799,763,731,27,4,0,5,6,12,365,317,699,701,790,711,28,14,13,1,9,20,275,317,936,626,690,1071,17,16,10,8,7,16,249,397,887,599,600,913,16,26,3,3,12,4,164,280,906,751,754,995,6,39,2,4,5,3,540,256,760,773,857,724,36,22,40,9,10,20,341,399,644,652,747,726,33,27,18,13,14,14,461,399,845,827,608,752,29,30,17,12,16,19,327,409,795,839,608,684,19,32,15,3,13,6,281,369,775,651,728,979,22,23,5,7,7,15,405,369,752,512,808,755,27,21,8,14,6,22,565,461,856,781,945,584,33,39,32,12,16,21,313,499,1053,856,680,1207,30,38,2,6,8,11,240,310,709,695,651,643,24,10,24,13,15,3,5 +320,190,590,806,662,601,3,17,7,11,2,10,195,393,665,709,593,970,2,10,24,4,4,8,269,505,678,700,906,681,33,34,14,12,14,17,457,547,620,781,651,880,27,36,24,17,14,18,390,556,632,715,755,700,34,32,14,16,15,11,352,438,491,611,854,680,33,34,1,14,14,19,272,422,716,630,662,1040,8,18,24,1,14,15,254,274,679,661,722,882,5,14,17,8,7,3,187,323,784,805,726,964,21,5,16,1,10,4,519,419,594,677,739,693,25,12,26,14,11,19,302,324,514,590,719,695,24,9,4,18,9,13,420,244,679,873,600,721,12,16,11,17,1,18,346,158,661,893,668,653,10,14,13,2,2,5,228,358,603,625,658,948,13,11,9,0,14,14,368,362,530,564,718,724,16,29,6,7,15,21,580,372,658,775,863,553,24,19,18,9,13,20,308,286,907,868,644,1176,9,4,16,1,13,10,255,351,591,763,745,612,13,24,24,14,16,2,5 +427,295,879,770,592,565,25,19,9,10,7,11,222,354,656,673,545,776,20,22,22,3,9,11,130,332,799,636,764,517,11,16,12,3,9,2,478,344,851,773,651,680,29,32,22,10,15,13,421,341,823,733,689,530,24,32,12,7,16,10,265,235,708,649,800,578,19,20,1,5,11,0,225,247,689,612,592,828,14,30,22,0,9,8,253,283,666,637,672,688,17,20,15,7,10,16,342,260,693,761,648,766,15,17,14,0,15,17,414,228,883,673,741,613,19,12,28,13,16,0,293,219,747,606,673,675,16,17,6,17,10,6,391,201,968,823,562,619,16,20,9,16,6,1,327,215,918,849,620,563,18,16,11,1,7,14,181,253,622,615,596,772,9,23,7,1,9,9,205,249,707,572,768,574,10,19,4,8,10,2,471,277,951,803,961,545,16,7,20,8,18,1,437,325,822,840,578,988,31,20,14,2,18,9,406,348,850,711,621,634,17,24,24,13,13,17,5 +397,331,1005,669,624,499,31,19,15,12,2,13,168,374,862,600,611,810,26,32,24,9,2,9,152,168,829,505,790,527,5,8,14,1,12,0,476,226,959,706,623,708,27,20,24,2,10,13,401,247,933,708,683,548,20,26,14,3,9,12,265,207,838,682,846,552,21,10,7,3,12,2,227,299,831,527,696,870,20,24,24,14,12,8,173,403,816,482,726,722,23,12,17,5,5,14,256,370,807,620,660,802,13,21,16,2,8,15,426,168,1009,744,833,577,29,22,34,15,9,2,293,147,889,625,749,637,26,17,12,15,7,4,439,267,1094,702,678,585,22,20,9,14,3,1,271,297,1012,708,656,553,24,28,9,3,2,12,231,263,786,566,704,798,15,19,9,13,12,11,245,231,829,559,900,574,20,11,6,12,13,4,457,281,1069,826,995,481,26,17,18,12,11,3,429,531,1006,733,608,1020,37,32,16,10,11,9,326,314,956,584,565,590,27,12,18,11,14,15,5 +351,237,695,976,662,571,5,23,17,10,11,10,164,270,690,861,581,872,0,6,14,3,9,4,238,468,721,784,754,647,31,28,4,11,3,13,430,398,695,939,595,848,29,30,14,18,11,14,351,431,699,875,703,670,32,28,4,15,12,7,359,365,518,715,686,618,31,28,9,13,7,15,241,307,717,798,570,918,6,14,14,0,5,11,253,133,682,827,580,784,3,8,7,7,6,1,174,210,783,979,724,886,21,9,6,0,11,8,536,348,699,699,641,715,23,16,38,13,12,15,307,339,557,714,559,579,22,7,14,17,8,9,457,259,784,1047,592,599,14,22,13,16,10,14,309,157,764,1067,596,571,12,22,11,1,9,1,159,201,596,789,568,826,11,7,1,1,3,10,335,233,563,600,592,650,14,23,4,8,4,17,557,435,757,731,785,563,22,23,28,8,14,16,273,245,904,1036,648,1066,11,10,6,2,14,10,260,282,694,935,753,646,15,20,22,15,15,2,5 +356,306,724,948,708,578,10,8,18,11,13,11,207,193,809,855,679,947,5,21,13,0,9,9,321,439,820,748,738,658,26,29,3,4,9,18,367,293,748,943,815,857,32,31,13,11,7,19,288,334,760,899,809,677,27,29,3,8,6,12,338,352,631,767,784,657,26,27,10,6,13,20,228,322,844,768,646,1017,3,29,13,3,9,16,244,188,811,791,558,859,2,19,6,4,10,4,109,159,910,943,796,941,14,8,5,3,3,3,477,413,728,751,819,670,22,19,39,10,20,20,296,362,656,742,699,672,19,18,15,14,14,14,452,302,813,1011,558,698,15,17,14,13,14,19,364,208,789,1031,640,630,11,11,12,2,11,6,264,200,745,771,692,925,8,22,2,4,9,15,426,238,666,574,734,701,13,26,5,11,10,22,492,480,794,691,941,530,19,8,29,11,18,21,234,258,1047,1012,704,1153,16,9,5,5,6,11,283,311,697,905,683,589,18,33,23,14,17,3,5 +322,422,750,904,761,602,20,17,23,12,11,4,177,117,801,801,732,971,15,36,12,1,9,10,285,231,768,680,759,682,16,14,2,1,11,11,333,151,804,925,798,881,26,14,8,4,1,10,264,154,806,891,814,701,31,20,2,3,2,5,314,282,647,771,731,681,32,12,15,3,9,11,220,224,874,734,715,1041,15,28,8,6,11,13,228,260,831,723,641,883,12,26,1,5,8,5,135,173,892,875,819,965,4,23,0,2,1,6,437,291,740,787,838,694,34,24,38,11,14,11,270,394,604,732,728,696,31,29,20,15,12,15,410,372,825,933,617,722,27,18,19,14,12,10,362,306,777,963,675,654,17,24,17,1,9,7,238,266,739,753,751,949,20,29,7,5,11,6,390,282,706,564,743,725,25,11,10,12,10,13,470,526,820,771,900,554,31,23,34,10,16,12,202,352,1031,970,753,1177,26,22,0,4,4,4,255,293,699,815,742,613,28,22,24,11,13,6,5 +424,354,870,837,680,510,28,20,16,10,5,17,183,237,727,748,639,849,23,31,15,3,3,5,209,271,776,617,706,560,8,17,5,3,11,4,465,229,852,848,707,759,30,19,15,6,9,9,340,232,826,796,731,581,23,25,5,3,8,12,322,170,699,714,730,565,24,19,8,5,11,6,234,220,742,667,622,919,17,29,15,4,11,4,226,250,705,660,662,761,20,21,8,7,4,10,211,165,756,812,728,843,10,18,7,0,7,11,469,277,872,726,711,612,26,19,33,13,12,6,254,254,740,671,635,638,23,16,13,17,6,0,486,300,957,880,564,610,19,21,12,16,6,5,320,232,889,900,646,568,21,23,10,1,3,8,210,218,653,678,646,829,12,24,0,3,11,13,300,208,698,517,722,605,17,16,3,10,12,8,482,370,940,720,875,492,23,18,27,8,10,7,344,354,921,901,670,1055,34,31,7,2,10,13,353,277,827,772,701,611,24,11,17,9,13,11,5 +367,303,941,736,437,675,35,17,4,13,8,13,352,370,626,645,488,658,30,24,27,20,6,9,258,236,869,788,875,641,17,26,17,20,6,0,428,266,929,741,670,796,11,26,27,23,12,11,465,285,897,807,786,618,4,30,17,24,11,12,285,229,774,837,917,594,1,24,4,18,6,2,345,261,767,632,557,708,24,28,27,23,6,6,331,349,740,671,585,600,27,20,20,16,7,14,498,346,785,717,569,720,31,11,19,23,12,15,168,150,941,901,840,769,7,12,15,10,9,2,205,211,787,800,760,531,8,21,1,6,3,4,313,221,1026,783,531,619,26,10,14,7,7,1,519,277,982,805,599,583,28,20,16,22,6,12,341,283,594,651,613,634,19,23,12,24,6,11,275,257,779,750,837,610,16,23,9,17,7,4,313,315,1017,1045,1052,687,8,17,15,15,11,3,517,473,774,798,435,848,41,10,19,25,11,9,306,300,912,657,450,728,19,22,13,14,10,15,5 +370,298,682,749,574,551,10,29,12,12,12,11,269,279,593,680,569,916,5,22,19,1,10,9,283,457,654,569,856,627,26,8,9,5,8,18,533,337,644,754,725,826,32,16,19,12,20,19,510,386,616,726,781,646,27,16,9,9,21,12,360,358,541,656,898,626,26,8,4,7,14,20,390,368,590,575,582,986,1,18,19,4,14,16,284,286,541,584,590,828,2,12,12,3,15,4,415,295,662,726,696,910,24,23,11,4,20,3,487,431,686,704,843,661,18,16,29,9,21,20,426,372,590,615,759,661,17,15,9,13,15,14,448,310,771,804,548,667,15,22,8,12,11,19,342,204,751,812,616,617,11,30,8,3,10,6,372,286,559,590,622,894,6,17,4,5,8,15,302,292,526,543,842,670,9,11,1,12,9,22,540,518,750,794,1059,521,17,21,23,12,23,21,594,448,779,809,574,1122,16,34,11,6,23,11,349,207,679,710,607,624,18,10,21,13,14,3,5 +336,378,858,691,609,541,29,29,11,14,5,11,131,245,797,640,602,910,24,28,20,3,3,9,217,237,754,487,815,621,7,14,10,1,9,18,525,183,840,722,680,820,23,14,20,4,13,19,428,200,818,716,718,640,22,16,10,5,14,12,328,248,701,664,869,620,23,14,3,1,9,20,290,290,824,539,631,980,18,20,20,8,11,16,194,372,789,508,651,822,21,18,13,3,8,4,235,263,830,648,695,904,11,27,12,4,13,3,475,257,860,734,834,639,31,18,30,9,14,20,304,306,730,615,756,651,30,19,8,13,8,14,460,310,945,732,609,661,26,30,7,12,4,19,312,276,893,736,635,593,22,28,9,3,3,6,228,298,691,576,661,888,19,15,5,7,9,15,270,278,698,531,875,664,24,11,2,14,10,22,524,444,930,804,996,495,30,27,22,12,16,21,424,488,997,753,609,1116,35,34,12,6,16,11,261,233,815,630,618,588,27,6,22,13,15,3,5 +407,287,681,827,682,522,8,24,11,11,2,11,176,300,714,712,625,891,3,15,20,4,2,9,224,492,691,623,720,602,28,27,10,8,14,18,490,410,653,806,673,801,32,37,20,15,16,19,379,439,625,748,721,621,29,37,10,12,15,12,345,353,568,638,726,601,28,27,3,10,14,20,253,345,717,651,620,961,3,23,20,1,14,16,217,233,682,666,668,803,0,13,13,8,7,4,172,220,783,818,720,885,18,0,12,1,10,3,514,356,685,608,701,616,20,17,32,14,11,20,299,325,611,615,629,638,19,12,8,18,9,14,479,241,770,880,538,642,17,23,7,17,3,19,297,191,742,906,622,574,13,13,9,2,2,6,205,253,624,650,626,869,8,16,5,0,14,15,315,261,567,513,660,645,11,22,2,7,15,22,553,357,753,656,851,474,19,14,22,9,13,21,323,237,914,887,660,1097,14,11,12,1,13,11,296,342,660,766,649,543,16,29,22,14,16,3,5 +385,251,846,813,634,461,21,27,7,10,2,17,174,348,767,734,573,808,16,12,24,3,4,5,198,412,784,673,712,519,15,24,14,3,14,10,540,368,818,816,649,718,31,34,24,10,16,11,415,391,790,782,649,538,24,34,14,7,15,12,329,271,693,684,732,518,25,24,1,5,14,12,259,311,750,633,614,878,10,20,24,0,14,8,245,291,719,664,658,720,13,14,17,7,7,10,244,244,798,796,672,802,15,3,16,0,10,9,480,306,850,724,721,575,19,14,28,13,11,12,277,215,760,641,639,589,16,9,4,17,9,6,441,169,935,872,544,569,14,26,11,16,1,11,319,175,887,884,600,513,14,16,13,1,2,8,199,269,691,644,606,786,5,15,9,1,14,13,293,249,674,583,698,562,10,19,6,8,15,14,547,307,918,834,891,443,16,17,18,8,13,13,419,345,957,875,618,1014,27,14,16,2,13,13,348,312,817,770,607,570,23,26,26,13,16,11,5 +439,341,916,720,576,550,30,16,8,13,8,10,236,346,735,615,573,801,25,31,23,4,6,12,154,176,792,568,782,528,6,9,13,4,12,3,500,230,894,745,633,709,30,23,23,3,16,12,443,233,866,735,685,551,21,29,13,0,17,9,285,199,749,693,830,579,22,11,0,6,12,1,253,261,768,580,634,859,19,31,23,7,12,7,269,367,739,559,664,711,22,13,16,8,11,17,358,332,746,695,626,791,12,24,15,1,16,18,438,194,918,735,811,624,26,19,27,14,17,1,325,147,806,636,727,664,23,14,5,18,11,7,387,261,1003,751,622,626,21,19,10,17,7,2,331,311,931,783,616,558,23,25,12,2,6,15,205,231,723,601,654,795,14,32,8,6,12,8,229,219,752,578,864,585,17,12,5,9,13,1,495,285,986,847,1007,542,23,14,19,9,19,0,467,501,941,788,564,1005,36,29,15,3,19,10,424,298,871,637,547,639,24,15,25,10,16,18,5 +351,445,887,794,579,536,25,19,20,13,3,10,138,220,812,687,562,849,20,22,11,2,1,4,170,170,833,652,777,600,11,28,13,0,13,13,502,110,913,835,630,745,29,16,25,3,11,14,421,145,885,833,662,621,26,12,13,4,10,7,291,241,746,783,829,627,27,24,12,2,13,15,255,277,887,658,611,915,14,26,19,7,13,11,187,385,844,645,649,781,17,32,18,4,6,1,260,274,909,771,641,859,7,31,19,3,9,8,448,194,881,827,804,608,27,14,15,10,10,15,263,305,769,732,720,664,24,27,17,14,8,9,423,333,966,819,589,630,20,20,16,13,4,14,291,369,902,859,613,610,18,22,14,2,1,1,201,301,780,691,633,881,13,27,12,6,13,10,263,287,755,678,845,661,18,25,7,13,14,17,513,425,969,955,994,502,24,31,31,11,12,16,415,503,1070,870,573,1077,31,30,15,5,12,10,302,246,832,697,552,543,25,20,13,12,15,2,5 +418,322,860,834,674,473,18,22,12,10,6,11,177,255,831,771,631,842,13,27,19,1,4,9,233,389,782,612,684,553,18,23,9,1,16,18,509,307,808,833,713,752,30,25,19,8,10,19,386,320,784,793,699,572,25,23,9,5,9,12,352,280,705,697,708,552,20,23,4,3,16,20,286,370,800,658,602,912,7,31,19,2,16,16,220,268,771,655,620,754,10,29,12,5,9,4,151,187,834,809,736,836,14,20,11,2,8,3,507,407,864,721,735,589,20,15,33,11,13,20,312,310,770,656,641,573,17,24,9,15,11,14,524,282,949,887,546,593,13,23,8,14,7,19,314,198,911,895,634,529,11,21,8,1,4,6,250,214,723,671,632,820,6,26,4,3,16,15,330,222,682,530,712,596,11,20,1,10,15,22,522,420,924,731,889,437,17,20,23,10,11,21,356,314,1005,894,664,1048,24,27,11,4,11,11,297,297,829,793,637,536,22,17,21,11,14,3,5 +384,366,894,728,625,533,29,22,10,14,4,10,193,317,873,637,620,896,24,35,21,5,2,8,227,231,790,538,805,613,7,15,11,5,12,17,505,259,850,747,644,790,23,19,21,2,8,18,368,236,822,727,692,632,22,23,11,1,9,11,314,156,761,683,859,616,23,17,2,7,12,19,228,268,862,576,677,956,18,27,21,8,12,15,170,356,825,557,713,808,21,23,14,9,5,3,209,263,860,699,665,888,11,20,13,2,8,4,469,245,898,713,840,617,31,23,29,15,11,19,282,170,772,626,756,655,30,18,7,19,7,13,460,300,983,767,671,649,26,23,8,18,5,18,296,274,909,787,653,591,22,21,10,3,2,5,210,230,757,589,691,882,19,22,6,7,12,14,312,202,752,560,897,658,24,12,3,8,13,21,512,318,958,813,1010,485,30,20,21,10,11,20,340,470,1035,792,609,1104,35,29,13,4,11,10,295,239,849,657,580,546,27,11,23,11,14,2,5 +388,292,798,822,587,530,17,23,12,11,9,13,163,281,581,721,544,791,12,18,19,0,7,9,141,379,784,618,721,510,19,20,9,6,11,0,493,327,784,823,628,723,25,36,19,13,17,15,432,350,756,781,706,537,20,36,9,10,18,12,276,250,629,665,763,551,19,24,4,8,11,2,248,284,658,648,541,861,6,26,19,3,11,10,262,268,629,667,617,703,9,16,12,4,12,14,349,201,682,805,665,785,23,11,11,3,17,15,431,303,802,683,702,626,11,16,29,10,18,2,280,258,678,632,638,630,10,15,9,14,12,4,406,216,887,873,507,604,8,22,8,13,8,1,334,182,849,893,603,548,10,16,8,2,7,12,204,216,585,651,553,779,1,19,4,4,11,11,226,216,636,554,705,565,2,19,1,11,12,4,488,348,870,757,920,526,10,11,23,11,20,3,456,336,807,886,573,999,23,16,11,5,20,9,365,263,775,763,624,641,23,28,21,14,15,15,5 +356,390,798,855,718,606,26,19,20,11,10,6,217,175,809,746,717,975,21,36,11,4,10,12,313,231,794,639,840,686,10,14,1,4,12,11,301,181,838,872,771,885,20,16,11,5,0,14,250,178,844,838,817,705,25,22,1,2,1,7,344,202,683,726,864,685,26,12,12,6,8,13,218,228,898,685,720,1045,21,28,11,5,10,15,244,252,857,682,660,887,18,24,4,8,7,7,119,149,896,834,790,969,8,21,3,1,0,4,459,293,794,728,883,698,34,24,35,14,13,13,312,326,650,685,785,702,35,27,17,18,11,11,474,342,879,890,644,726,33,20,16,17,11,12,350,274,823,922,674,660,23,22,14,2,10,9,246,274,743,700,770,953,26,27,4,4,12,8,400,276,736,539,882,729,31,11,7,9,11,15,466,442,866,736,985,558,35,21,31,9,15,14,162,374,1027,923,714,1181,32,22,3,1,3,4,265,281,751,774,721,617,22,20,19,10,12,6,5 +430,494,841,958,698,509,24,21,31,10,12,12,223,217,834,791,675,872,19,18,2,3,10,10,261,131,805,754,728,589,12,30,10,3,6,19,443,95,879,975,733,782,26,14,10,6,10,20,322,186,853,933,751,610,27,14,10,3,9,13,326,280,718,829,734,604,28,26,23,5,6,21,234,214,917,796,660,942,13,22,4,4,2,17,184,362,870,797,582,784,16,28,7,7,5,5,129,293,935,949,754,866,6,33,8,0,8,4,477,239,831,831,801,601,30,16,30,13,9,21,288,370,719,792,689,625,27,29,28,17,7,15,520,364,916,975,576,623,23,22,27,16,11,20,308,436,860,1037,620,583,17,24,25,1,10,7,254,342,794,803,698,864,16,21,15,3,6,16,358,326,739,656,744,640,21,33,18,10,5,23,482,456,923,887,889,469,27,33,42,8,9,22,292,458,1090,1036,690,1080,30,32,8,2,9,12,291,307,788,861,673,526,28,22,20,9,10,4,5 +384,442,875,869,786,624,27,19,20,14,9,2,271,193,804,776,761,993,22,34,11,5,11,14,341,219,803,639,776,704,9,12,1,3,13,11,303,181,981,894,759,903,19,14,11,0,1,10,230,178,955,862,767,723,24,20,1,1,0,7,358,204,784,776,778,703,25,10,12,5,7,9,216,268,943,701,748,1063,26,26,11,10,7,13,256,290,884,682,694,905,23,26,4,7,8,9,109,181,905,834,826,987,9,23,3,0,1,10,487,261,835,798,831,716,33,26,37,13,10,9,288,282,687,719,737,718,34,27,17,17,10,15,452,384,920,898,660,744,36,20,16,16,12,10,386,322,884,922,702,676,28,24,14,1,11,11,220,226,714,722,782,971,31,27,4,9,13,6,438,226,845,535,826,747,36,9,7,10,12,9,478,416,935,780,879,576,34,23,31,12,14,8,136,408,1000,935,776,1199,33,24,3,6,2,2,315,243,790,782,759,635,21,20,21,9,11,10,5 +356,346,767,915,686,490,16,17,26,9,6,13,151,167,740,810,631,859,11,10,9,2,4,11,227,263,737,717,706,570,20,38,9,4,8,20,479,197,789,920,709,769,30,28,9,11,10,21,358,216,763,886,691,591,25,22,9,8,11,14,330,228,646,786,748,569,20,34,18,6,8,22,238,208,815,745,616,929,5,18,5,1,8,18,212,264,770,754,600,771,8,22,8,6,5,6,159,159,857,906,734,853,14,19,9,1,10,5,493,279,761,770,761,592,20,12,29,12,11,22,292,350,659,739,647,592,17,21,23,16,5,16,452,300,846,954,620,610,13,18,22,15,5,21,282,260,808,994,592,550,9,12,20,0,4,8,206,280,700,760,626,843,6,17,10,2,8,17,328,294,651,619,718,619,11,33,13,9,9,24,512,466,849,850,911,446,17,23,37,9,13,23,334,370,994,987,672,1065,22,18,9,3,13,13,265,303,732,836,651,535,24,22,19,14,14,5,5 +443,363,940,757,645,491,31,19,14,11,5,3,196,300,831,668,634,824,26,34,17,4,3,11,200,230,800,541,751,535,5,14,7,4,9,10,470,240,890,764,676,734,25,20,17,5,11,11,381,203,868,732,700,554,20,26,7,2,10,4,311,161,773,668,809,556,21,16,6,6,9,10,239,239,784,593,631,894,20,30,17,5,9,14,215,313,769,578,625,736,23,18,10,8,4,6,218,256,786,730,709,818,13,21,9,1,9,7,466,232,944,694,798,575,29,22,33,14,10,10,313,203,828,609,708,635,28,19,11,18,4,14,469,301,1029,802,595,589,24,22,10,17,4,9,297,271,955,818,613,543,24,26,8,2,3,8,223,207,735,596,675,802,17,25,2,4,9,5,273,203,756,523,835,578,22,13,1,9,10,12,473,333,1002,742,950,465,28,17,25,9,12,11,383,433,977,819,641,1030,37,32,9,1,12,3,370,244,895,692,616,594,29,12,19,10,11,7,5 +351,243,821,761,627,531,20,23,10,11,2,12,136,340,660,688,580,844,15,18,21,4,4,2,148,412,745,619,771,567,16,22,11,6,16,11,474,406,777,754,680,768,30,34,21,13,16,12,367,407,749,722,732,586,25,34,11,10,15,5,273,287,650,638,777,554,20,22,2,8,16,13,211,303,637,593,615,914,9,26,21,1,16,9,183,241,602,620,693,756,12,16,14,8,9,3,252,248,689,748,691,838,20,3,13,1,10,10,438,304,825,670,758,639,20,14,27,14,11,13,257,257,683,593,698,627,17,15,7,18,11,7,403,199,910,822,537,595,17,22,8,17,3,12,239,157,866,836,655,581,15,16,10,2,4,1,167,261,590,604,623,822,10,19,6,0,16,8,249,261,641,549,743,598,11,21,3,7,17,15,485,305,885,782,938,509,17,11,21,9,13,14,381,275,824,821,611,1050,26,16,13,1,13,12,314,348,796,724,660,632,20,26,23,14,16,4,5 +395,303,723,779,654,544,17,18,11,12,4,10,184,278,806,670,613,897,12,21,20,5,6,8,254,438,769,633,740,624,19,29,10,5,18,17,472,362,753,774,683,795,29,29,20,10,14,18,331,365,763,734,703,645,34,29,10,7,13,11,339,295,624,650,748,631,31,31,3,7,16,19,217,333,839,621,638,955,12,29,20,2,16,15,213,247,806,648,708,813,9,19,13,9,11,3,150,208,873,766,698,891,7,8,12,2,10,4,514,366,719,660,759,620,31,11,28,15,7,19,263,277,603,617,685,678,28,18,8,19,13,13,485,235,804,828,540,654,24,23,7,18,5,18,335,201,768,854,674,610,14,11,9,3,6,5,201,215,720,618,654,897,17,22,5,1,18,14,353,213,663,577,752,673,22,26,2,8,19,21,553,357,783,790,917,496,28,8,22,10,9,20,287,267,1028,843,640,1113,23,19,12,0,9,10,262,304,682,718,639,537,25,21,22,13,14,2,5 +438,394,1077,742,717,504,31,22,14,11,7,12,245,343,1034,703,680,875,26,23,17,10,7,10,285,167,899,536,775,584,5,13,7,4,9,19,423,225,1019,771,666,783,17,21,17,1,3,20,294,210,1001,751,684,603,20,21,7,0,4,13,328,182,932,717,833,583,21,13,6,6,9,21,238,290,1037,586,741,943,20,15,17,15,11,17,198,350,1002,541,737,785,23,11,10,8,8,5,137,321,983,693,743,867,13,20,9,1,3,4,451,181,1081,785,782,598,29,23,35,16,12,21,292,168,939,658,732,618,30,16,11,18,8,15,518,312,1166,785,711,624,32,23,10,17,10,20,318,320,1080,781,663,562,24,29,8,4,7,7,250,212,894,607,741,851,25,14,2,14,9,16,372,192,933,554,883,627,30,10,1,9,10,23,434,290,1137,817,890,456,30,22,25,11,12,22,248,478,1186,802,707,1079,37,25,9,11,6,12,331,321,1026,657,676,521,21,13,19,10,11,4,5 +385,475,1053,848,654,713,31,31,32,10,9,11,196,256,1004,725,653,980,26,18,19,13,11,3,264,130,955,644,830,771,5,30,29,3,13,12,376,166,1107,905,583,814,15,26,19,0,1,13,213,169,1093,883,657,770,20,18,29,1,0,10,321,247,946,799,890,814,21,28,42,5,7,20,203,213,1159,706,782,1038,22,14,19,18,7,10,227,359,1098,659,844,932,23,20,26,9,10,2,142,328,995,811,648,1018,13,21,27,4,1,9,426,216,1041,785,839,747,29,6,11,13,8,14,239,273,905,736,797,841,30,15,39,17,10,12,451,353,1126,861,776,795,32,22,32,16,14,13,331,421,1046,899,728,793,24,24,30,7,11,4,197,273,908,739,778,1064,27,15,34,17,13,13,365,273,995,622,966,850,32,25,37,10,12,20,419,365,1137,899,967,675,30,35,39,10,14,17,191,487,1154,926,616,1162,37,20,27,14,2,11,300,294,984,725,567,556,19,10,17,9,11,3,5 +366,284,821,774,660,559,26,14,8,12,6,8,179,281,822,671,625,928,21,27,23,5,4,6,229,299,759,628,820,639,10,23,13,5,8,15,485,293,781,781,689,838,20,27,23,8,10,16,350,296,789,751,735,658,25,31,13,5,9,9,296,166,684,683,830,638,26,27,0,7,8,17,228,210,839,608,664,998,17,35,23,2,8,13,172,274,802,605,676,840,18,25,16,9,1,1,201,213,851,757,720,922,8,12,15,2,8,6,459,275,825,711,839,651,34,15,27,15,9,17,224,228,683,628,745,677,33,24,5,19,3,11,454,228,910,817,660,679,29,21,10,18,5,16,320,196,860,845,620,615,19,13,12,3,4,3,210,282,700,625,680,906,22,28,8,1,8,12,314,264,701,548,836,682,27,20,5,8,9,19,514,340,889,809,969,511,33,12,19,10,9,18,304,360,1004,836,652,1134,32,23,15,0,9,8,255,313,782,703,681,574,24,19,25,11,10,0,5 +352,300,791,702,571,499,9,25,3,2,2,5,201,453,678,623,544,816,4,16,28,11,4,19,177,535,725,660,841,509,27,22,18,13,16,10,521,557,715,681,646,688,33,38,28,10,16,11,462,564,703,631,738,508,28,38,18,11,15,12,262,452,620,633,831,560,27,26,5,15,16,8,282,468,577,538,629,848,2,24,28,8,16,14,168,288,588,581,717,690,1,14,21,15,9,14,321,401,665,695,629,772,25,5,20,8,10,11,387,449,795,713,764,543,19,18,22,5,11,8,238,302,675,592,722,655,18,13,0,9,11,14,404,280,880,771,493,591,16,24,15,8,3,9,336,266,850,781,657,551,12,12,15,9,4,16,266,350,588,531,637,760,7,17,13,9,16,11,194,350,605,552,763,558,10,19,10,6,17,8,434,302,843,825,968,475,18,13,14,0,13,7,474,274,786,762,545,984,15,14,20,10,13,5,323,375,778,671,590,594,19,30,20,13,16,13,5 +404,406,874,803,695,585,30,21,14,14,10,8,221,277,873,714,662,954,25,36,17,3,8,6,265,235,788,575,763,665,6,14,7,3,4,15,399,233,836,824,678,864,16,20,17,2,10,16,312,222,844,796,710,684,21,24,7,1,9,9,330,162,737,702,785,664,22,12,6,5,4,17,226,248,894,633,663,1024,21,30,17,8,4,13,192,320,857,618,711,866,22,24,10,7,3,1,177,207,886,770,723,948,12,21,9,0,10,6,493,271,878,728,768,677,30,24,33,13,9,17,250,244,736,661,688,679,31,25,11,17,3,11,470,336,963,838,641,705,33,22,10,16,9,16,340,282,901,858,645,637,23,20,8,1,8,3,208,240,739,656,679,932,26,25,2,7,4,12,348,212,754,515,803,708,31,11,1,10,5,19,506,372,942,774,888,537,31,19,25,10,11,18,232,408,1047,867,675,1160,36,24,9,4,11,8,291,265,831,728,700,596,20,18,19,9,10,0,5 +319,483,794,806,766,639,25,30,18,15,12,9,206,180,745,727,749,1008,20,23,13,4,8,7,342,224,750,570,808,719,11,17,3,0,10,16,376,136,898,839,791,918,21,9,13,3,2,17,357,213,878,817,807,738,26,5,3,4,3,10,383,355,709,727,826,718,27,13,10,2,10,18,283,337,882,642,738,1078,26,15,13,9,10,14,273,381,815,613,664,920,23,25,6,4,11,2,166,220,854,765,828,1002,7,38,5,3,2,5,530,318,754,785,883,731,35,21,37,10,7,18,361,451,606,680,771,735,36,26,15,14,13,12,465,437,839,837,634,759,34,31,14,13,15,17,317,391,805,853,692,691,28,33,12,2,10,4,307,375,683,669,782,988,31,22,2,8,10,13,431,387,772,498,852,764,36,20,5,13,9,20,553,533,854,781,943,591,36,38,29,11,13,19,249,437,965,870,762,1214,31,37,5,5,5,9,274,336,711,715,741,650,23,9,21,12,14,1,5 +406,330,1001,689,725,597,30,26,22,11,13,7,285,381,872,648,700,966,25,13,23,18,11,7,369,201,863,497,849,677,10,25,15,4,13,16,311,255,1077,750,624,876,16,27,23,1,1,13,252,270,1075,744,680,696,21,25,15,0,0,6,386,186,902,674,905,676,22,23,28,6,7,14,240,254,1031,547,829,1036,29,11,23,17,7,10,262,340,976,480,883,878,26,9,16,14,10,2,107,331,865,632,703,960,12,12,15,9,1,9,505,163,967,722,834,689,30,19,25,14,4,14,300,126,815,607,810,691,31,8,25,18,10,12,454,246,1052,722,821,717,33,25,18,17,12,15,386,274,974,720,769,649,31,25,16,12,11,4,244,230,776,594,809,944,34,4,20,16,13,9,458,202,959,533,971,720,39,20,23,9,12,16,510,236,1031,794,946,549,31,26,19,9,10,15,146,468,1002,757,689,1172,36,13,15,15,4,7,309,347,910,572,648,608,18,17,19,10,11,3,5 +336,262,637,891,722,592,1,17,16,11,7,4,211,343,732,776,663,961,4,12,15,4,5,16,269,499,735,699,822,672,35,30,5,10,7,9,343,461,671,866,703,871,25,34,15,17,9,12,286,490,689,800,787,691,36,34,5,14,10,9,322,402,538,662,798,671,35,28,8,12,9,9,184,330,761,711,652,1031,10,20,15,1,7,15,224,200,732,736,666,873,7,10,8,8,4,11,159,249,825,888,780,955,19,5,7,1,11,8,501,377,623,638,767,684,27,20,35,14,10,9,268,386,529,647,679,686,26,11,13,18,6,13,416,296,708,952,654,712,10,16,12,17,6,8,334,194,688,976,644,644,8,16,10,2,5,13,160,282,646,706,662,939,15,13,0,0,7,8,360,306,583,545,720,715,18,27,3,7,8,11,524,384,675,690,909,544,26,17,27,9,12,10,192,182,956,953,704,1167,7,6,7,1,12,2,273,351,612,838,749,603,15,26,19,14,13,10,5 +365,335,748,808,659,494,16,14,17,9,7,9,152,204,723,723,644,863,11,23,14,2,3,7,230,364,684,590,793,574,20,27,4,2,13,16,422,276,690,813,768,773,30,33,14,9,9,17,325,265,672,769,788,593,25,27,4,6,8,10,321,287,579,655,845,573,20,27,9,4,13,18,251,341,692,630,623,933,5,31,14,1,13,14,177,231,669,633,599,775,8,21,7,6,6,2,162,150,734,785,755,857,14,10,6,1,7,5,452,402,752,663,820,608,20,11,32,12,14,18,301,319,644,618,726,588,17,20,14,16,8,12,487,295,837,859,543,614,13,21,13,15,8,17,293,205,799,873,637,546,9,11,11,0,5,4,257,223,607,641,677,841,6,24,1,2,13,13,325,241,560,486,817,617,11,24,4,9,14,20,479,445,804,659,1014,460,17,10,28,9,12,19,313,281,901,870,653,1069,22,17,6,3,10,9,226,316,717,755,650,543,24,25,16,12,13,1,5 +359,233,724,762,633,555,11,24,6,7,1,10,136,326,709,651,604,892,6,13,25,8,5,8,206,426,694,696,807,623,25,25,15,8,15,17,496,398,720,759,664,778,31,35,25,13,15,18,357,415,692,723,728,644,30,35,15,12,14,11,261,301,603,679,795,638,25,27,2,10,15,19,223,313,746,608,673,950,6,21,25,5,15,15,161,239,705,641,755,812,3,15,18,12,8,3,208,232,784,751,685,890,17,4,17,5,11,4,448,312,724,739,786,619,23,15,23,10,8,19,225,247,610,642,726,685,22,14,3,14,10,13,437,199,809,813,511,655,18,23,12,13,2,18,287,161,771,839,699,609,12,11,14,6,3,5,211,257,641,601,675,900,11,14,10,4,15,14,287,251,608,610,765,676,14,20,7,9,16,21,489,307,794,869,954,505,22,16,17,5,10,20,363,275,925,828,615,1112,17,13,17,5,10,10,282,348,695,699,636,534,19,27,21,16,17,2,5 +355,269,847,822,681,555,21,19,10,9,7,10,148,238,858,731,652,924,16,32,21,2,5,8,216,350,799,606,805,635,15,18,11,2,7,17,458,296,819,829,724,834,25,26,21,7,11,18,357,285,823,797,740,654,30,26,11,4,12,11,327,231,720,707,855,634,31,20,2,4,7,19,237,285,885,650,651,994,12,34,21,3,7,15,213,259,846,649,685,836,13,30,14,6,6,3,172,166,909,797,745,918,3,17,13,1,11,4,494,336,851,727,834,647,31,20,31,12,12,19,305,279,711,662,744,657,28,25,7,16,6,13,451,239,936,865,637,675,24,20,8,15,6,18,273,151,892,885,661,607,14,18,10,0,5,5,201,273,740,663,673,902,17,29,6,2,7,14,325,273,737,574,855,678,22,15,3,9,8,21,519,403,919,803,992,507,28,17,21,9,14,20,329,349,1046,886,671,1130,27,26,13,3,14,10,264,304,816,757,664,568,29,18,23,10,13,2,5 +423,325,847,797,665,498,26,13,13,11,4,11,196,298,780,724,630,867,21,28,18,4,4,9,214,342,755,579,703,578,10,22,8,4,14,18,490,300,819,796,682,777,28,28,18,7,10,19,339,309,791,754,696,597,25,32,8,4,9,12,331,213,692,660,727,577,26,26,5,6,14,20,227,263,777,623,619,937,15,36,18,3,14,16,209,253,742,622,661,779,18,26,11,8,7,4,162,194,793,772,711,861,8,13,10,1,6,3,504,282,851,678,738,610,28,16,30,14,11,20,263,215,733,621,650,620,25,25,10,18,9,14,497,255,936,852,559,618,21,20,9,17,5,19,299,215,880,860,635,560,19,12,7,2,4,6,211,209,682,632,641,845,14,29,3,2,14,15,331,205,675,513,741,621,19,19,0,9,15,22,509,321,919,716,886,462,25,11,24,9,9,21,311,325,960,857,655,1073,32,22,10,1,9,11,318,298,808,754,646,567,26,20,20,10,16,3,5 +372,352,906,762,614,530,29,23,20,13,6,9,141,329,823,645,615,875,24,20,17,6,4,5,191,179,804,558,814,604,7,24,7,4,16,14,425,223,918,791,627,781,27,24,17,1,10,15,312,222,890,749,717,623,22,20,7,0,9,8,270,216,765,715,868,617,23,26,14,6,16,16,184,262,882,610,712,941,18,22,17,11,16,12,168,350,839,581,740,793,21,28,10,8,9,0,191,347,870,731,642,873,11,23,9,1,6,7,441,155,902,721,853,628,29,8,33,14,13,16,248,174,796,658,769,656,26,23,19,18,11,10,440,250,987,789,692,638,22,22,10,17,7,15,248,302,907,819,670,606,22,24,8,2,4,2,194,252,787,625,724,877,15,23,6,10,16,11,296,226,764,584,914,655,20,27,9,9,15,18,458,288,986,809,1033,500,26,23,25,13,11,17,324,484,1073,832,590,1089,35,22,9,7,9,9,301,305,845,667,541,587,27,16,17,10,14,1,5 +392,294,925,711,569,651,28,15,6,12,10,11,249,355,610,618,566,772,23,26,25,5,8,11,119,241,821,611,891,605,8,10,15,5,6,2,435,263,897,720,712,748,26,26,25,10,18,13,416,282,869,692,802,570,19,30,15,7,19,10,212,202,754,670,933,598,16,14,2,7,12,0,258,226,719,569,643,836,17,34,25,2,12,8,306,340,698,572,669,684,20,24,18,9,13,16,441,321,673,696,661,768,18,25,17,2,18,17,361,197,929,722,876,723,16,16,25,15,19,0,298,168,775,615,798,677,13,15,3,19,13,6,320,194,1014,764,617,657,19,24,12,18,9,1,368,234,964,784,655,591,21,22,14,3,8,14,238,284,622,578,679,758,12,27,10,1,6,9,172,256,753,577,901,598,9,13,7,8,7,2,422,314,997,834,1092,633,13,11,17,10,21,1,470,454,764,775,559,980,34,26,17,0,21,9,455,295,894,654,584,728,18,20,23,13,14,17,5 +400,286,758,877,739,584,23,23,12,12,9,10,169,245,773,760,690,953,18,12,19,5,7,4,247,371,774,675,823,664,13,28,9,5,5,13,425,347,784,872,740,863,23,34,19,10,11,14,314,308,794,826,770,683,28,34,9,7,10,7,360,256,629,692,805,663,29,28,4,7,5,15,234,274,826,701,697,1023,16,20,19,2,5,11,240,244,789,718,767,865,15,14,12,9,4,1,171,173,852,870,771,947,7,3,11,2,11,8,531,355,756,670,766,676,29,14,31,15,10,15,282,332,604,665,708,678,26,9,9,19,4,9,482,296,841,926,611,704,28,22,8,18,8,14,318,180,799,958,707,636,18,16,8,3,7,1,184,324,663,702,703,931,21,13,4,1,5,10,338,324,680,569,761,707,26,23,1,8,6,17,544,416,820,740,902,536,26,17,23,10,12,16,238,260,977,943,717,1159,29,10,11,0,12,10,267,365,727,810,762,595,25,26,21,13,11,2,5 +403,421,855,896,711,529,25,17,29,13,12,13,210,258,906,787,690,898,20,26,8,2,10,11,286,140,837,676,723,609,11,24,8,2,10,20,414,116,873,919,722,808,23,20,8,3,4,21,317,191,871,877,720,630,26,16,8,2,3,14,331,235,774,783,743,608,27,22,21,4,6,22,241,239,979,730,683,968,14,28,2,7,8,18,213,375,934,719,569,810,17,32,5,6,5,6,108,290,981,871,765,892,7,27,6,1,2,5,474,166,851,813,824,621,33,14,32,12,15,22,289,267,739,734,698,629,30,29,26,16,9,16,503,301,936,921,595,649,26,18,25,15,11,21,327,387,878,959,621,581,18,20,23,0,10,8,253,299,846,747,719,882,19,29,13,6,10,17,391,285,795,608,761,658,24,21,16,11,9,24,483,361,935,839,902,481,30,27,40,9,13,23,267,497,1142,966,711,1104,31,26,6,3,5,13,300,282,804,809,650,540,27,22,22,10,10,5,5 +402,354,845,798,711,512,28,20,17,13,7,11,235,211,820,713,700,867,23,33,14,4,9,9,307,283,725,574,813,592,8,17,4,4,15,18,385,239,803,809,758,777,22,23,14,3,3,19,270,226,779,763,782,613,23,25,4,0,2,12,344,198,694,687,863,595,24,19,9,6,9,20,256,272,819,628,695,937,17,31,14,7,11,16,216,240,786,615,657,787,20,27,7,8,8,4,149,145,809,767,785,867,10,18,6,1,3,3,433,309,849,697,866,602,32,21,34,14,14,20,340,270,721,644,766,618,31,22,14,18,10,14,504,320,934,841,619,626,27,21,13,17,8,19,304,238,872,855,693,568,21,19,11,2,9,6,298,232,690,641,745,863,20,26,1,6,15,15,390,232,687,518,887,639,25,14,4,9,14,22,432,410,911,717,1000,468,31,18,28,9,12,21,272,340,988,860,707,1085,34,27,6,3,4,11,297,287,806,735,686,523,26,15,18,10,13,3,5 +443,357,882,770,628,473,28,19,10,10,2,9,206,288,799,669,593,820,23,30,21,3,4,5,204,296,776,578,724,543,8,20,11,3,12,14,526,268,836,775,641,714,28,20,21,6,12,15,393,263,810,751,655,564,23,26,11,3,11,8,327,157,717,659,754,550,24,22,2,5,12,16,247,241,762,604,606,874,17,32,21,4,12,12,207,309,733,613,676,732,20,24,14,7,5,0,234,198,776,747,670,810,10,17,13,0,10,7,492,282,886,671,743,563,28,18,29,13,11,16,301,223,766,622,665,627,25,19,7,17,7,10,467,299,971,809,574,575,21,20,8,16,1,15,287,235,909,835,628,549,21,20,10,1,2,2,205,239,691,623,616,816,14,27,6,3,12,11,269,209,702,546,778,592,19,17,3,10,13,18,521,331,946,787,917,449,25,17,21,8,13,17,393,383,949,836,616,1032,34,30,13,2,13,9,350,266,841,697,607,544,26,14,23,9,14,1,5 +387,389,886,776,632,543,25,25,17,15,13,13,182,240,899,723,615,912,20,30,14,4,9,11,254,254,826,546,704,623,11,18,4,0,9,20,430,192,870,797,673,822,23,20,14,3,3,21,339,215,862,759,685,642,26,20,4,4,4,14,343,231,743,689,752,622,27,16,9,2,11,22,265,271,920,614,622,982,14,22,14,9,9,18,213,287,887,585,576,824,17,24,7,4,10,6,114,206,924,737,698,906,7,23,6,3,3,5,488,248,890,727,769,641,33,20,38,10,14,22,287,279,780,644,655,637,30,19,14,14,14,16,495,323,975,819,546,663,26,26,13,13,14,21,337,293,917,825,594,595,18,24,11,2,11,8,251,191,803,625,654,890,19,19,1,8,9,17,363,185,746,496,776,666,24,15,4,13,8,24,513,403,954,725,901,497,30,23,28,11,18,23,271,409,1113,840,634,1118,31,26,6,5,6,13,258,194,839,729,607,566,27,12,22,12,15,5,5 +390,294,702,936,783,553,7,19,17,11,5,9,197,283,715,821,716,922,2,14,14,4,5,7,245,463,674,736,801,633,29,32,4,8,9,16,413,411,670,921,734,832,31,36,14,15,11,17,288,414,666,867,806,652,30,36,4,12,10,10,328,352,557,723,765,632,29,32,9,10,9,18,222,316,726,756,709,992,4,22,14,1,9,14,200,220,693,779,721,834,1,12,7,8,2,2,139,205,772,931,821,916,19,1,6,1,7,5,481,363,706,695,726,651,21,16,36,14,10,18,256,360,600,704,668,647,20,11,14,18,6,12,484,284,791,993,643,673,16,18,13,17,4,17,300,210,759,1019,697,605,14,14,11,2,5,4,202,284,613,755,715,900,9,15,1,0,9,13,358,294,560,554,663,676,12,27,4,7,10,20,484,364,770,671,826,507,20,15,28,9,8,19,230,168,917,1000,761,1128,13,6,6,1,8,9,267,379,687,879,794,576,15,28,20,14,11,1,5 +396,230,636,888,686,565,6,18,12,10,6,10,179,345,709,787,617,934,1,15,19,3,4,8,245,493,658,702,818,645,30,33,9,9,8,17,459,467,642,859,637,844,30,37,19,16,14,18,364,482,650,797,747,664,31,37,9,13,13,11,366,372,535,641,784,644,30,33,4,11,8,19,248,366,736,706,628,1004,5,23,19,0,8,15,242,228,699,735,692,846,2,13,12,7,7,3,161,273,788,887,740,928,18,0,11,0,12,4,533,371,640,631,701,657,22,17,31,13,13,19,292,326,530,636,649,659,21,12,9,17,7,13,476,246,725,955,582,685,15,17,8,16,5,18,324,156,697,975,646,617,13,13,8,1,4,5,184,294,611,701,616,912,10,16,4,1,8,14,336,290,558,566,660,688,13,28,1,8,9,21,574,352,708,725,853,517,21,14,23,8,15,20,284,232,919,948,666,1140,12,5,11,2,15,10,277,323,629,845,731,576,14,29,21,15,14,2,5 +430,316,875,770,635,515,21,26,8,10,5,9,207,351,742,683,582,824,16,15,23,3,3,13,179,433,781,630,739,525,15,21,13,5,13,4,507,405,811,761,672,724,31,37,23,12,9,17,404,398,793,723,702,546,26,37,13,9,8,8,282,298,700,633,751,564,21,25,0,7,13,6,222,324,665,594,623,882,10,23,23,0,13,14,208,286,660,619,693,724,13,13,16,7,6,10,283,265,727,753,689,806,13,6,15,0,7,11,443,333,879,659,714,575,21,17,27,13,12,6,266,278,745,592,654,659,18,12,5,17,8,8,436,252,964,823,521,599,14,25,10,16,6,5,316,206,910,841,641,563,14,13,12,1,3,12,212,280,648,605,619,790,7,16,8,1,13,7,228,266,691,540,695,568,12,18,5,8,14,8,486,306,935,773,880,487,18,14,19,8,10,7,402,264,856,830,619,1018,27,15,15,2,10,5,361,369,842,717,668,612,19,29,25,15,15,11,5 +389,439,931,912,783,624,26,22,31,12,10,6,298,246,864,819,774,993,21,31,14,7,10,8,366,124,835,682,847,704,10,15,10,3,12,11,284,112,1025,947,750,903,20,15,0,0,0,10,249,165,1015,925,772,723,25,17,10,1,1,3,363,229,844,813,853,703,26,13,23,5,8,11,247,233,1003,750,811,1063,25,23,0,12,8,13,293,383,946,725,739,905,22,25,7,7,9,7,114,298,933,877,819,987,8,26,8,0,0,8,468,182,889,807,912,716,34,23,30,13,9,9,327,263,743,772,818,718,35,24,28,17,11,13,433,317,974,939,735,744,35,23,27,16,13,10,395,399,924,965,703,676,27,27,25,1,10,5,271,301,764,779,833,971,30,24,15,11,12,4,451,287,907,604,913,747,35,12,18,10,11,11,475,369,971,829,970,576,35,26,42,14,15,10,157,505,1050,980,773,1199,32,25,8,8,3,6,336,278,838,805,700,635,22,17,26,9,12,8,5 +392,304,745,844,734,521,17,20,11,10,3,10,197,347,754,741,669,890,12,15,20,3,7,8,243,425,691,652,802,601,19,31,10,5,13,17,437,403,711,827,719,800,31,37,20,12,11,18,296,414,691,779,729,620,30,37,10,9,12,11,320,298,602,653,756,600,25,31,3,7,13,19,196,308,753,664,688,960,6,23,20,0,13,15,192,274,722,679,744,802,9,13,13,7,6,3,161,249,795,831,760,884,9,0,12,0,13,4,487,309,749,631,739,619,25,17,30,13,6,19,226,276,643,628,681,631,22,12,8,17,8,13,468,238,834,899,610,641,18,19,7,16,4,18,322,218,798,919,674,573,10,13,9,1,5,5,188,264,638,669,676,868,11,16,5,1,13,14,348,260,599,544,692,644,16,26,2,8,14,21,500,290,813,733,843,475,22,14,22,8,8,20,250,266,944,906,710,1096,23,7,12,2,10,10,277,369,720,789,729,552,23,29,22,15,15,2,5 +408,358,823,912,710,514,24,19,17,9,10,12,207,185,862,821,679,883,19,30,14,2,10,10,273,283,801,696,710,594,12,20,4,2,12,19,403,199,811,923,741,793,22,26,14,7,4,20,320,220,815,879,731,613,27,24,4,4,3,13,362,220,716,769,776,593,28,18,9,4,10,21,270,264,901,742,654,953,15,32,14,3,10,17,220,250,862,739,598,795,16,30,7,6,7,5,111,139,919,891,778,877,6,19,6,1,0,4,475,297,825,783,803,608,34,18,34,12,17,21,316,300,701,736,677,610,31,27,14,16,11,15,518,304,910,953,588,634,27,20,13,15,11,20,330,246,866,979,636,566,17,20,11,0,10,7,272,222,772,751,694,863,20,27,1,2,12,16,382,236,729,578,774,639,25,17,4,9,11,23,488,422,897,759,929,466,31,19,28,9,15,22,262,356,1076,980,704,1089,30,24,6,3,3,12,279,261,782,843,663,527,26,20,18,10,14,4,5 +399,307,742,875,674,483,10,25,14,9,7,9,168,292,661,786,623,844,5,14,17,2,9,5,218,478,714,671,732,561,26,26,7,8,21,14,474,400,714,864,697,752,32,36,17,15,19,15,347,417,692,810,761,582,27,36,7,12,18,8,317,345,577,674,716,564,26,26,6,10,19,16,237,341,652,695,606,912,1,22,17,1,19,12,187,221,621,718,670,756,2,12,10,6,14,0,164,228,716,866,740,836,24,1,9,1,9,7,468,366,746,662,697,595,18,16,33,12,10,16,269,313,644,653,645,619,17,11,11,16,16,10,469,255,831,938,524,597,15,24,10,15,8,15,283,211,799,954,662,557,11,14,8,0,9,2,235,225,587,698,626,832,6,15,2,2,21,11,315,235,564,541,654,608,9,21,1,9,20,18,487,351,808,658,865,457,17,15,25,9,12,17,339,227,863,939,656,1054,16,12,9,3,12,9,306,326,721,832,701,568,18,28,19,16,15,1,5 +361,451,880,944,762,609,27,14,31,15,9,4,262,222,889,831,749,978,22,37,16,4,11,10,330,144,854,720,810,689,9,13,10,4,13,11,278,134,944,967,765,888,19,17,0,1,1,10,197,175,948,929,789,708,24,23,10,0,0,7,335,219,789,811,796,688,25,11,23,6,7,11,187,197,1022,776,748,1048,20,31,0,9,9,13,269,331,963,763,648,890,19,23,7,8,6,9,110,260,982,915,812,972,9,22,8,1,1,10,446,222,862,835,875,701,33,25,30,14,14,9,281,273,730,766,769,703,34,28,28,18,10,15,419,335,947,963,664,729,32,15,27,17,10,10,369,377,891,1003,680,661,22,21,25,2,11,9,213,275,807,795,788,956,25,32,15,8,13,8,423,265,848,622,838,732,30,10,18,9,12,11,441,391,940,829,935,561,34,20,42,11,14,8,127,453,1091,1012,756,1184,33,23,8,5,2,4,316,276,815,839,731,620,21,23,28,10,11,10,5 +412,308,828,789,654,533,26,19,13,12,4,9,159,219,763,716,619,886,21,26,18,1,2,7,205,329,738,563,730,597,10,10,8,1,10,16,507,259,804,804,691,796,26,20,18,4,12,17,404,270,776,772,715,616,25,26,8,3,13,10,332,236,671,680,762,602,26,12,5,3,10,18,270,288,764,609,598,956,15,24,18,6,10,14,220,240,727,612,652,798,18,14,11,5,7,2,223,153,776,758,714,880,8,19,10,2,12,5,507,323,832,716,729,621,30,14,32,11,13,18,310,270,702,645,657,663,27,9,10,15,7,12,488,264,917,832,560,637,23,24,9,14,3,17,296,178,867,846,646,579,19,28,7,1,2,4,234,224,665,634,632,864,16,25,3,5,10,13,302,234,672,505,766,640,21,13,0,12,11,20,522,412,900,746,907,485,27,17,24,10,15,19,400,352,939,845,644,1092,32,32,10,4,15,9,333,271,793,736,675,592,28,12,20,11,14,1,5 +416,160,659,800,642,576,2,25,8,9,3,12,229,283,748,719,579,945,3,8,23,2,5,10,303,455,743,648,790,656,34,26,13,6,11,19,519,421,711,793,645,855,26,30,23,13,13,20,436,432,721,745,685,675,35,30,13,10,14,13,420,352,562,635,780,655,34,26,0,8,11,21,316,346,795,620,620,1015,9,16,23,1,11,17,310,250,762,635,682,857,6,10,16,6,6,5,213,213,849,787,684,939,20,7,15,1,11,4,587,359,647,671,715,668,26,10,27,12,12,21,340,320,535,592,653,670,25,9,5,16,6,15,506,222,732,861,570,696,11,24,10,15,2,20,378,96,706,875,618,628,9,14,12,0,3,7,238,302,682,625,614,923,14,13,8,2,11,16,394,302,619,530,716,699,17,21,5,9,12,23,652,414,713,757,901,528,25,21,19,9,14,22,344,302,990,864,620,1151,8,12,15,3,14,12,305,325,622,763,649,587,14,22,25,16,15,4,5 +408,446,890,902,726,574,26,16,31,14,10,11,251,235,921,815,703,943,21,29,10,5,10,9,335,127,856,680,766,654,10,21,10,3,12,18,345,95,938,931,735,853,20,21,2,0,0,19,266,190,934,891,745,673,25,17,10,1,1,12,376,232,785,781,766,653,26,19,23,5,8,20,236,196,1012,740,716,1013,19,29,0,10,10,16,262,348,967,723,616,855,18,29,7,7,7,4,73,287,996,875,776,937,8,26,8,0,0,3,483,191,886,813,839,666,34,17,30,13,13,20,298,284,756,732,727,668,35,30,28,17,11,14,486,330,971,931,638,694,31,17,27,16,11,19,376,402,911,963,642,626,21,21,25,1,10,6,246,306,843,759,740,921,24,30,15,9,12,15,436,304,836,594,792,697,29,18,18,10,11,22,482,384,970,817,901,526,35,26,42,12,15,21,174,466,1125,974,724,1149,32,25,8,6,3,11,311,267,837,805,699,587,22,23,22,9,12,3,5 +406,308,799,813,658,508,22,21,13,9,7,11,159,217,752,724,623,875,17,24,18,2,5,9,205,341,723,595,730,588,14,18,8,2,7,18,523,259,771,820,701,785,30,18,18,7,11,19,408,268,743,782,715,609,29,24,8,4,12,12,336,218,648,692,776,591,26,20,5,4,7,20,272,284,753,641,610,945,11,26,18,3,7,16,210,264,718,638,632,787,14,22,11,6,6,4,189,159,789,790,710,869,8,19,10,1,11,3,499,339,803,708,757,610,26,12,32,12,12,20,314,290,687,653,665,626,23,17,10,16,6,14,494,266,888,860,592,626,19,26,9,15,6,19,292,178,838,878,602,564,15,22,7,0,5,6,226,262,642,656,636,859,12,25,3,2,7,15,304,262,637,521,764,635,17,21,0,9,8,22,524,412,871,744,929,468,23,19,24,9,14,21,386,358,930,879,646,1081,28,28,10,3,14,11,311,279,770,752,641,555,24,10,20,10,13,3,5 +446,344,914,771,605,551,29,16,10,10,11,11,223,327,697,680,570,732,24,25,21,3,9,11,135,303,816,585,729,499,7,13,11,3,7,2,459,307,862,768,654,664,31,27,21,8,19,13,424,292,840,734,668,492,22,29,11,5,20,10,262,180,737,660,771,542,21,15,2,5,13,0,236,262,700,613,583,792,18,33,21,2,13,8,272,302,685,616,645,644,21,19,14,7,14,16,361,239,686,752,663,724,13,22,13,0,19,17,411,269,918,658,742,619,21,13,29,13,20,0,316,188,794,621,660,641,18,14,7,17,14,6,388,270,1003,820,555,611,20,25,8,16,10,1,348,232,951,840,615,531,22,21,10,1,9,14,198,218,657,616,597,720,13,26,6,1,7,9,200,198,730,557,777,534,12,16,3,8,8,2,466,294,976,774,948,539,18,10,21,8,22,1,442,374,853,835,591,942,35,25,13,2,22,9,419,277,879,710,594,646,19,19,23,11,13,17,5 +353,269,987,664,650,552,29,19,18,12,6,12,164,430,1016,607,643,907,24,26,31,11,4,10,230,230,893,578,818,632,7,16,21,1,8,19,448,288,965,709,605,817,17,20,31,2,8,20,379,311,971,735,665,653,22,20,21,3,9,13,317,255,892,747,880,631,23,16,12,3,8,21,255,351,1067,560,754,977,20,18,31,16,8,17,183,431,1030,499,800,827,21,18,24,7,3,5,168,410,1035,617,660,907,11,17,23,2,8,4,472,148,991,819,871,636,31,18,35,15,9,21,301,147,875,682,797,650,32,13,17,15,3,15,473,219,1076,697,746,666,32,20,6,14,5,20,313,333,998,705,708,606,22,26,6,5,4,7,245,291,922,595,758,903,25,13,16,15,8,16,327,247,903,640,958,679,30,17,13,12,9,23,507,233,1059,909,1011,504,32,19,11,12,11,22,311,555,1200,732,624,1125,35,22,23,12,11,12,250,304,934,575,535,551,21,12,15,11,10,4,5 +372,500,907,827,789,652,27,25,21,12,11,6,269,173,810,744,764,1021,22,28,10,7,9,8,371,163,813,597,795,732,9,10,0,3,11,9,347,91,1015,860,760,931,19,10,10,0,1,12,294,140,985,846,760,751,24,14,0,1,2,3,404,272,810,754,795,731,25,8,13,5,9,11,246,282,953,661,759,1091,28,20,10,12,9,15,312,354,900,640,653,933,25,20,3,7,12,5,115,233,883,792,837,1015,9,29,2,0,1,6,545,231,869,808,828,744,33,26,38,13,6,11,332,340,717,703,748,746,34,21,18,17,12,13,486,392,954,864,671,772,36,26,17,16,14,10,362,392,906,880,705,704,30,30,15,1,9,5,248,316,708,694,791,999,33,21,5,11,11,6,466,314,867,515,841,775,38,11,8,10,10,13,544,450,973,794,862,604,34,29,32,14,12,12,162,458,992,889,789,1227,33,28,2,8,4,6,305,255,820,738,766,663,21,14,22,9,13,6,5 +414,342,854,718,623,530,25,22,15,14,5,11,201,307,897,639,606,899,20,31,16,5,1,9,269,223,816,506,747,610,11,17,6,3,13,18,455,229,860,745,628,809,21,17,16,0,11,19,344,202,868,735,660,629,26,23,6,1,12,12,382,208,747,677,807,609,27,19,7,5,13,20,266,278,936,572,645,969,16,23,16,10,13,16,246,330,897,545,661,811,17,21,9,7,6,4,141,269,922,685,665,893,7,20,8,0,11,3,545,203,858,729,794,622,35,19,28,13,12,20,304,208,724,632,708,632,32,16,12,17,8,14,500,286,943,755,631,650,28,23,11,16,6,19,338,272,879,773,615,582,18,23,9,1,3,6,212,202,801,597,661,877,21,18,1,9,13,15,356,188,774,546,845,653,26,16,2,10,14,22,574,344,926,805,958,482,32,20,26,12,14,21,284,454,1105,786,613,1105,31,27,8,6,14,11,267,203,807,647,586,541,25,9,18,9,15,3,5 +425,293,798,862,652,523,20,28,12,10,7,11,198,282,661,739,609,836,15,13,19,3,5,11,166,348,734,656,772,547,16,19,9,5,11,2,484,310,778,859,687,746,28,35,19,12,15,9,397,325,750,811,719,566,23,35,9,9,16,10,301,219,635,687,788,570,18,23,4,7,13,0,227,251,662,684,618,906,9,21,19,0,11,4,239,263,635,699,678,748,12,13,12,7,10,16,286,184,694,851,696,830,16,8,11,0,15,17,472,302,802,659,751,607,18,15,31,13,16,0,297,261,696,656,671,653,15,10,9,17,10,6,423,237,887,907,592,615,11,27,8,16,6,1,291,179,843,939,622,559,13,15,8,1,5,14,185,265,621,689,624,814,4,14,4,1,11,9,265,261,630,568,758,590,9,16,1,8,12,2,493,339,870,751,951,505,15,16,23,8,18,1,411,323,859,928,628,1042,26,17,11,2,18,9,394,320,773,791,651,632,20,27,21,15,17,17,5 +337,253,589,817,649,609,2,16,10,11,3,12,184,348,696,720,588,978,3,13,21,0,3,10,268,566,701,651,827,689,34,35,11,6,11,19,474,486,645,802,642,888,26,37,21,13,15,20,415,533,657,750,748,708,35,35,11,10,14,13,383,457,502,618,809,688,34,35,2,8,11,21,299,455,741,633,611,1048,9,21,21,3,11,17,281,305,708,660,675,890,6,13,14,4,6,5,210,284,805,808,727,972,20,2,13,3,11,4,558,452,569,636,730,701,26,15,29,10,12,21,363,403,493,587,678,703,25,10,7,14,6,15,453,313,654,878,539,729,11,15,8,13,2,20,327,175,634,894,637,661,9,15,10,2,1,7,237,361,632,634,603,956,14,14,6,4,11,16,363,361,555,529,665,732,17,30,3,11,12,23,609,467,635,742,886,561,25,16,21,11,14,22,341,309,938,877,633,1184,8,3,13,5,14,12,280,342,562,772,732,620,14,27,23,14,15,4,5 +353,399,767,1013,799,628,17,20,31,10,10,3,254,116,792,870,758,997,12,7,14,3,10,11,344,250,777,803,731,708,19,39,10,3,12,10,338,156,849,1020,804,907,29,27,0,8,4,13,281,171,851,968,802,727,34,17,10,5,3,8,389,273,712,838,739,707,35,35,23,5,10,12,245,239,925,841,741,1067,16,15,0,2,10,12,299,271,848,846,679,909,13,19,7,7,7,6,106,136,923,998,839,991,7,20,8,0,0,7,524,306,713,824,836,720,35,17,30,13,17,10,323,395,593,811,726,722,32,22,28,17,11,14,473,385,798,1040,665,748,26,21,27,16,11,9,359,301,774,1086,701,680,18,11,25,1,10,8,237,289,754,848,767,975,21,14,15,1,12,9,443,303,767,631,739,751,26,34,18,8,11,12,517,513,803,802,910,580,32,22,42,8,15,11,149,361,1028,1083,781,1203,23,19,8,2,3,3,312,288,676,922,748,639,25,21,26,11,14,7,5 +372,348,614,899,710,562,4,16,12,11,3,11,189,405,667,794,637,931,1,15,19,4,5,9,259,573,654,715,864,642,32,35,9,12,17,18,419,553,590,854,619,841,28,37,19,17,17,19,328,594,602,790,727,661,33,37,9,16,16,12,356,484,493,628,770,641,32,33,4,14,17,20,240,440,682,719,654,1001,7,23,19,1,17,16,250,254,651,762,760,843,4,13,12,8,10,4,167,353,750,902,766,925,20,0,11,1,11,3,535,475,618,612,673,654,24,17,29,14,12,20,284,402,542,629,671,656,23,12,9,18,12,14,466,354,703,970,580,682,13,15,8,17,4,19,338,270,685,990,724,614,11,13,8,2,5,6,170,324,579,708,640,909,12,16,4,0,17,15,352,334,498,583,670,685,15,30,1,7,18,22,552,372,676,682,803,514,23,14,23,9,14,21,234,222,887,955,690,1137,10,3,11,1,14,11,285,355,615,860,791,573,14,29,21,14,17,3,5 +349,253,675,898,729,568,6,18,19,9,6,9,156,244,690,777,666,937,1,13,12,2,4,7,258,450,699,692,761,648,30,33,2,6,8,16,416,382,663,883,704,847,30,35,12,13,12,17,321,399,653,827,784,667,31,35,2,10,11,10,327,343,540,707,747,647,30,33,11,8,8,18,223,311,717,718,655,1007,5,21,12,1,8,14,219,183,682,735,651,849,2,13,5,6,3,2,120,180,781,887,769,931,20,2,4,1,8,5,508,352,679,675,714,660,22,15,38,12,11,18,273,373,573,678,636,662,21,10,16,16,5,12,451,269,764,947,611,688,15,17,15,15,5,17,293,175,738,975,635,620,13,15,13,0,4,4,197,255,610,719,667,915,10,14,3,2,8,13,353,289,551,530,643,691,13,28,6,9,9,20,521,423,747,691,826,520,21,16,30,9,11,19,259,205,910,962,707,1143,12,5,4,3,11,9,254,320,660,833,750,581,14,27,22,16,12,1,5 +364,488,855,814,670,549,30,34,30,12,15,10,165,191,848,655,691,918,25,19,11,9,11,8,233,111,783,612,904,629,6,13,19,1,7,17,405,85,913,861,663,828,18,13,15,2,5,18,308,138,887,833,753,648,21,9,19,3,6,11,298,268,752,743,962,636,22,15,32,3,7,19,230,300,963,666,804,988,19,11,9,14,7,15,156,390,908,631,842,830,22,21,16,5,12,3,141,287,891,783,692,912,12,34,17,2,5,4,445,219,841,705,941,641,30,17,21,15,6,19,262,334,703,700,867,653,31,22,37,15,12,13,474,376,926,809,794,669,31,33,22,14,14,18,282,442,856,871,760,611,23,35,20,3,13,5,246,330,756,689,816,898,24,18,24,13,7,14,332,338,793,560,1018,674,29,16,27,12,6,21,460,408,941,841,1081,501,31,34,37,12,12,20,270,484,1038,894,640,1124,36,33,17,10,8,10,225,319,784,691,579,562,22,5,21,11,15,2,5 +426,528,795,920,754,524,29,21,32,12,13,11,225,221,794,757,731,887,24,18,5,1,13,9,279,137,745,710,772,604,7,28,11,1,13,18,411,125,827,947,773,797,19,14,7,4,5,19,308,196,805,891,787,625,22,12,11,3,4,12,348,298,678,769,740,609,23,24,24,3,7,20,276,240,883,762,716,957,18,26,1,6,7,16,188,386,836,753,634,799,21,32,8,5,8,4,145,311,889,905,810,881,11,33,9,2,5,3,449,271,787,753,849,610,31,16,29,11,12,20,310,390,657,742,737,632,32,27,29,15,6,14,492,368,872,931,620,638,30,22,28,14,14,19,310,460,818,993,670,588,22,24,26,1,13,6,302,382,736,775,754,879,23,25,16,5,13,15,370,370,707,616,754,655,28,29,19,12,12,22,432,474,875,833,885,478,32,33,43,10,10,21,250,430,1038,1000,746,1095,35,32,9,4,2,11,285,359,744,817,729,531,23,20,21,11,11,3,5 +403,393,908,793,649,482,28,26,13,13,4,12,168,250,873,698,632,837,23,35,18,2,2,10,224,230,812,573,733,562,8,13,8,2,10,19,480,182,890,810,666,747,24,19,18,3,10,20,371,189,862,780,672,585,23,19,8,2,11,13,331,189,769,720,799,569,24,15,5,4,10,21,259,241,886,633,641,907,17,27,18,7,10,17,213,353,851,612,633,755,20,23,11,6,5,5,168,242,892,764,705,837,10,24,10,1,10,4,482,196,910,758,802,578,32,25,32,12,11,21,329,261,806,667,698,606,29,20,10,16,5,15,491,301,995,832,597,588,25,27,9,15,5,20,277,299,929,852,611,546,21,25,7,0,2,7,249,253,781,648,671,839,18,22,3,6,10,16,333,231,758,569,839,615,23,10,0,11,11,23,489,381,982,802,962,446,29,24,24,9,13,22,373,471,1073,859,649,1055,34,33,10,3,13,12,304,236,865,722,584,523,28,11,20,10,12,4,5 +400,310,788,799,716,559,31,22,13,10,6,8,157,217,781,700,675,914,26,25,18,3,4,6,247,349,784,589,764,639,5,25,8,3,8,15,437,273,820,810,717,822,15,25,18,6,10,16,336,260,828,778,725,660,20,21,8,3,11,9,356,230,673,666,776,638,21,25,5,5,8,17,242,292,876,631,666,982,24,25,18,4,8,13,240,260,837,642,738,834,23,23,11,7,5,1,157,145,892,778,754,914,13,16,10,0,10,6,531,363,786,678,779,643,29,13,32,13,11,17,292,322,636,631,705,657,30,18,10,17,5,11,482,304,871,846,612,673,32,23,9,16,5,16,306,200,827,866,704,613,26,17,7,1,4,3,198,286,705,638,686,910,29,20,3,3,8,12,340,292,726,539,794,686,34,22,0,10,9,19,546,410,854,756,899,511,30,16,24,8,13,18,266,322,1013,863,704,1132,37,23,10,2,13,8,269,313,749,736,699,554,17,17,20,9,12,0,5 +365,407,937,748,638,489,30,27,20,14,8,12,126,286,900,617,647,852,25,20,17,11,6,10,200,150,847,590,824,569,6,22,15,1,6,19,480,142,973,805,613,762,24,20,27,4,10,20,381,179,945,785,695,590,21,16,15,5,11,13,287,213,824,769,888,584,22,22,26,1,6,21,251,309,981,612,756,922,19,18,21,16,6,17,167,445,934,561,776,764,22,24,20,7,5,5,194,340,961,709,652,846,12,27,21,4,10,4,454,172,929,787,893,593,30,10,27,17,11,21,275,231,827,704,799,607,29,19,27,13,5,15,463,301,1014,759,732,603,25,26,16,12,7,20,279,375,932,797,690,563,23,30,14,5,6,7,235,311,866,645,762,844,18,19,18,15,6,16,285,283,835,636,948,620,23,23,21,14,7,23,479,343,1017,903,1043,453,29,29,25,14,13,22,389,573,1154,828,610,1060,36,26,17,12,13,12,276,286,872,623,515,550,28,12,11,13,12,4,5 +423,281,674,910,728,553,8,23,20,11,8,8,186,250,687,783,675,922,3,10,11,4,6,6,236,406,668,712,786,633,28,28,1,8,6,15,448,354,646,895,709,832,32,32,11,15,10,16,331,363,634,835,787,652,29,32,1,12,9,9,345,297,545,695,770,632,28,28,12,10,6,17,245,271,706,732,674,992,3,18,11,1,6,13,213,175,671,755,692,834,0,12,4,8,1,1,156,184,770,907,764,916,20,5,3,1,8,6,514,344,678,651,731,645,20,12,37,14,9,17,287,337,576,674,663,647,19,7,17,18,7,11,509,251,763,963,610,673,17,22,16,17,7,16,309,173,735,995,640,605,13,14,14,2,6,3,219,261,589,731,686,900,8,11,4,0,6,12,337,267,546,546,690,676,11,23,7,7,7,19,533,407,744,683,873,505,19,19,31,9,9,18,269,229,893,976,702,1128,14,10,3,1,9,8,278,358,659,845,729,566,16,24,21,14,10,0,5 +390,292,690,904,700,506,8,26,13,9,3,10,147,339,655,791,629,873,3,13,18,2,1,8,211,495,658,712,780,584,28,25,8,10,13,17,505,449,656,869,649,783,32,35,18,17,15,18,368,476,634,805,761,603,29,35,8,14,14,11,318,378,541,655,748,583,28,25,5,12,13,19,226,346,646,726,630,943,3,21,18,1,13,15,202,186,613,755,676,785,0,13,11,6,6,3,183,273,710,907,750,867,22,2,10,1,9,4,491,365,694,637,675,602,20,15,32,12,10,19,252,354,602,642,625,634,19,10,10,16,8,13,460,264,779,971,562,624,17,25,9,15,4,18,288,200,759,995,634,556,13,15,7,0,1,5,202,248,567,717,630,851,8,14,3,2,13,14,308,260,528,562,620,627,11,20,0,9,14,21,524,368,756,679,817,458,19,16,24,9,12,20,352,204,851,964,678,1079,14,13,10,3,12,10,309,313,687,857,745,571,16,27,20,16,15,2,5 +373,357,968,741,640,482,29,22,10,15,3,9,146,292,875,666,631,847,24,33,21,4,3,7,184,214,842,533,800,558,7,17,11,2,11,16,466,220,930,760,675,757,27,17,21,1,11,17,381,213,902,746,707,579,22,23,11,2,10,10,301,189,803,716,854,557,23,19,2,4,11,18,241,251,850,601,664,917,18,29,21,9,11,14,179,357,817,564,684,759,21,21,14,6,4,2,216,260,852,708,696,841,11,20,13,1,9,5,446,210,972,760,837,604,29,21,31,12,10,18,319,229,850,661,751,620,26,16,7,16,6,12,455,279,1057,782,642,598,22,23,8,15,2,17,243,263,985,796,646,562,22,23,10,0,1,4,241,273,779,620,684,825,15,24,6,8,11,13,287,245,796,581,888,601,20,14,3,11,12,20,465,353,1036,828,1009,458,26,20,21,11,12,19,405,475,1037,807,634,1053,35,33,13,5,12,9,284,246,927,680,605,581,27,11,23,10,13,1,5 +421,391,899,696,675,572,29,24,13,11,7,11,204,296,896,643,660,941,24,27,18,8,5,9,290,164,837,490,787,652,7,17,8,2,7,18,428,176,909,727,656,851,17,17,18,1,7,19,339,187,919,707,696,671,22,21,8,2,6,12,387,197,796,675,845,651,23,19,5,4,7,20,277,291,987,544,719,1011,20,19,18,13,7,16,263,405,948,501,733,853,21,21,11,6,4,4,120,314,949,653,713,935,11,22,10,1,7,3,538,164,903,731,824,664,31,17,32,14,10,20,319,225,763,616,750,666,32,16,10,16,4,14,525,301,988,737,689,692,32,25,9,15,6,19,355,333,916,741,663,624,22,23,7,2,5,6,251,263,798,571,733,919,25,16,3,12,7,15,397,235,825,518,905,695,30,18,0,11,8,22,545,347,971,779,950,524,32,22,24,13,8,21,257,527,1078,760,661,1147,35,25,10,9,8,11,292,254,850,631,624,583,21,9,20,10,9,3,5 +343,315,683,866,721,589,12,13,19,9,12,6,160,160,730,767,692,958,7,24,12,2,8,10,254,336,727,650,743,669,24,26,2,2,10,11,366,248,705,873,796,868,34,28,12,9,4,14,301,257,711,825,812,688,29,28,2,6,3,9,317,273,572,709,765,668,24,24,11,4,10,13,237,271,777,690,667,1028,5,32,12,1,10,11,211,187,738,693,611,870,4,24,5,6,9,5,144,124,813,845,795,952,12,13,4,1,2,4,452,350,685,715,820,681,24,12,38,12,17,13,285,333,563,670,710,683,21,21,16,16,13,11,471,273,770,907,577,709,17,14,15,15,13,12,317,191,732,933,649,641,9,14,13,0,10,7,247,215,658,701,711,936,10,25,3,2,10,10,361,237,609,510,755,712,15,23,6,9,9,15,475,467,757,681,942,541,21,13,30,9,17,14,229,297,960,930,709,1164,18,14,4,3,5,4,252,300,652,793,710,600,20,26,22,12,14,4,5 +403,387,896,696,683,591,30,23,13,11,7,11,214,288,883,643,668,960,25,28,18,8,5,9,302,174,840,490,795,671,6,18,8,2,7,18,410,184,914,727,664,870,16,18,18,1,7,19,337,181,924,707,704,690,21,22,8,2,6,12,379,195,791,675,853,670,22,18,5,4,7,20,271,281,992,544,727,1030,23,20,18,13,7,16,263,401,953,501,739,872,22,22,11,6,4,4,116,304,942,653,721,954,12,21,10,1,7,3,538,162,898,731,832,683,30,18,32,14,10,20,321,235,758,616,758,685,31,17,10,16,4,14,521,297,983,737,695,711,33,24,9,15,6,19,353,323,911,741,671,643,25,22,7,2,5,6,257,267,785,571,741,938,28,17,3,12,7,15,413,241,824,518,913,714,33,17,0,11,8,22,545,353,966,779,950,543,31,21,24,13,8,21,241,521,1065,760,669,1166,36,24,10,9,8,11,284,246,845,631,632,602,18,10,20,10,9,3,5 +346,400,745,1028,695,690,24,18,23,11,9,8,229,233,602,891,612,847,19,9,12,4,11,6,329,285,709,834,691,726,18,41,2,8,13,9,347,243,807,975,628,929,18,41,8,15,1,16,210,266,779,907,730,737,13,31,2,12,0,7,342,242,610,751,647,637,12,39,15,10,7,11,178,272,725,844,601,873,13,17,8,1,7,13,280,198,678,877,567,765,16,21,1,8,8,5,141,191,769,1033,759,885,36,6,0,1,1,6,495,295,731,721,618,838,4,11,38,14,10,11,256,268,577,748,548,538,3,20,20,18,10,9,414,336,816,1087,559,652,15,17,19,17,12,10,354,314,790,1117,621,564,17,13,17,2,11,3,180,186,528,833,599,781,8,12,7,0,13,6,428,194,645,588,479,685,5,38,10,7,12,13,480,390,835,665,700,692,3,20,34,9,14,12,146,308,824,1078,681,1029,30,5,0,1,2,8,293,309,712,979,784,795,16,25,24,14,11,6,5 +386,300,928,716,547,629,29,18,6,4,10,12,249,361,625,619,542,754,24,25,25,11,8,10,113,225,832,636,847,583,7,11,15,11,6,1,473,261,910,727,636,732,25,27,25,10,18,12,434,278,882,709,736,548,20,27,15,9,19,11,220,212,759,697,895,572,15,15,2,13,12,1,266,238,730,574,637,814,18,31,25,8,12,7,284,360,709,569,677,666,21,21,18,13,13,15,433,357,692,699,613,746,19,24,17,8,18,16,347,179,930,761,860,713,15,15,23,7,19,1,250,158,790,644,778,661,12,16,3,11,13,5,318,204,1015,761,615,659,20,25,12,10,9,0,388,252,961,787,635,573,22,21,14,9,8,13,228,296,633,585,669,740,13,24,10,7,6,10,182,268,760,590,889,576,10,14,7,2,7,3,426,306,1002,865,1070,621,12,10,17,4,21,2,470,476,791,782,533,962,35,25,17,8,21,8,421,305,893,647,530,708,13,21,21,9,14,16,5 +339,427,772,1016,814,638,17,16,31,9,10,8,272,114,801,877,779,1007,12,19,16,2,10,6,350,228,758,804,770,718,19,31,10,2,12,11,290,128,888,1025,831,917,29,21,0,7,4,10,249,167,872,971,833,737,34,17,10,4,3,7,369,291,713,837,750,717,35,27,23,4,10,13,219,199,930,846,764,1077,16,27,0,3,10,13,277,267,857,847,698,919,13,29,7,6,7,9,110,176,912,999,858,1001,7,26,8,1,0,10,482,306,720,847,873,730,35,9,30,12,17,9,305,417,596,808,759,732,32,28,28,16,11,15,439,385,805,1031,674,758,26,17,27,15,11,10,351,317,779,1087,716,690,18,19,25,0,10,7,239,283,757,853,792,985,21,26,15,2,12,8,445,307,784,660,756,761,26,28,18,9,11,13,487,527,832,839,939,590,32,26,42,9,15,10,129,371,1037,1086,802,1213,23,25,8,3,3,8,308,306,677,917,757,649,25,23,28,10,14,10,5 +390,408,883,862,705,572,26,18,22,15,9,10,223,265,924,791,692,941,21,21,9,4,11,8,325,151,859,636,755,652,10,29,1,4,13,17,385,141,933,877,694,851,20,23,9,1,3,18,286,174,927,831,706,671,25,19,1,0,2,11,382,222,798,751,805,651,26,25,14,6,9,19,254,240,1025,690,717,1011,19,27,9,9,9,15,270,356,978,677,641,853,18,31,2,8,6,3,81,277,993,829,755,935,8,24,1,1,1,4,521,153,875,785,842,668,34,9,33,14,16,19,338,246,759,696,728,666,35,28,19,18,10,13,512,302,960,907,635,692,31,19,18,17,10,18,346,350,894,917,621,624,21,21,16,2,11,5,242,266,846,705,739,919,24,28,6,8,13,14,430,254,843,596,839,695,29,26,9,9,12,21,502,368,967,801,934,524,35,24,33,11,14,20,196,476,1126,926,705,1147,32,23,1,5,2,10,279,263,822,777,634,587,22,21,17,10,13,2,5 +394,292,842,726,589,488,23,18,11,10,3,11,159,303,751,657,566,845,18,29,20,1,3,9,159,355,776,518,759,554,13,21,10,1,15,18,505,307,802,729,678,753,33,21,20,8,15,19,422,324,774,703,696,573,28,27,10,5,14,12,306,238,685,641,805,555,23,23,3,3,15,20,260,308,708,570,569,913,12,33,20,2,15,16,206,294,683,567,613,755,15,25,13,5,8,4,249,245,760,703,659,837,11,16,12,2,11,3,471,311,846,665,766,588,23,17,30,11,12,20,314,208,744,598,684,636,20,20,8,15,10,14,452,232,931,781,545,594,16,21,7,14,2,19,284,210,877,789,601,554,16,19,9,1,3,6,224,194,667,585,603,821,9,28,5,3,15,15,274,174,664,516,797,597,14,18,2,10,16,22,504,370,910,741,982,456,20,16,22,10,14,21,450,400,911,788,581,1049,29,29,12,4,14,11,345,233,803,687,570,585,21,15,22,11,17,3,5 +381,249,849,768,590,584,17,19,9,9,12,13,206,344,560,673,557,723,12,22,22,2,10,9,104,340,793,614,788,532,19,14,12,6,8,0,428,338,831,763,673,681,25,30,22,13,20,13,401,331,803,723,715,509,20,30,12,10,21,12,233,251,680,659,834,553,19,18,1,8,14,2,233,265,649,614,578,791,6,30,22,1,14,8,273,263,630,623,632,635,9,20,15,6,15,14,412,268,623,759,674,715,27,21,14,1,20,15,388,250,851,677,793,656,11,10,28,12,21,2,307,221,715,616,707,648,10,15,6,16,15,4,359,171,936,827,568,616,8,22,9,15,11,1,333,171,904,847,616,544,10,18,11,0,10,12,209,223,582,613,596,717,1,23,7,2,8,11,187,217,681,564,800,549,2,15,4,9,9,4,441,309,923,775,1009,576,10,7,20,9,23,3,467,343,760,834,578,933,23,22,14,3,23,9,404,274,832,717,601,687,23,22,24,16,14,15,5 +348,286,704,877,732,544,6,19,14,11,5,8,125,291,697,770,679,913,1,18,17,4,3,6,195,491,660,671,824,624,30,32,7,6,9,15,447,427,658,870,731,823,30,40,17,13,13,16,334,436,632,822,839,643,31,40,7,10,12,9,282,370,553,688,824,623,30,32,6,8,9,17,210,370,680,695,662,983,5,26,17,1,9,13,152,240,647,714,690,825,2,16,10,8,4,1,203,227,724,866,808,907,20,3,9,1,9,6,447,409,708,674,769,640,22,20,33,14,10,17,282,388,596,661,703,650,21,15,11,18,4,11,452,296,793,928,604,664,15,18,10,17,4,16,228,176,761,954,678,598,13,12,8,2,3,3,210,306,595,700,678,891,10,19,2,0,9,12,288,316,554,545,690,667,13,27,1,7,10,19,464,418,768,732,905,498,21,11,25,9,12,18,320,226,877,939,718,1119,12,6,9,1,12,8,247,375,689,818,797,563,14,32,19,14,13,0,5 +315,421,861,817,542,698,32,22,32,14,6,13,118,240,792,654,559,897,27,19,17,5,4,7,142,196,743,649,822,712,4,19,27,1,10,4,414,180,937,860,613,783,32,21,17,4,12,3,315,191,909,836,729,713,19,21,27,5,11,12,215,185,748,786,868,733,20,19,40,1,10,12,157,177,889,667,674,953,21,15,17,10,10,0,195,299,832,634,720,843,24,17,24,3,3,12,254,260,881,786,570,915,14,16,25,4,6,13,382,268,845,712,843,768,22,9,13,11,13,4,185,297,703,727,759,748,19,12,39,13,7,4,377,355,930,790,672,720,23,25,30,12,7,3,323,341,838,874,626,706,25,23,28,3,4,10,167,295,780,688,682,971,16,12,32,9,10,13,219,293,783,593,892,757,13,16,35,14,11,12,423,419,953,884,1045,686,19,22,41,12,11,9,331,423,1058,895,508,1037,38,19,25,6,9,15,262,354,788,682,463,627,20,13,19,13,12,13,5 +353,319,824,911,772,624,16,13,19,9,10,4,226,180,821,852,735,993,11,34,12,2,10,16,338,376,832,689,766,704,20,14,2,2,12,13,330,288,886,916,831,903,30,18,12,9,0,12,277,269,894,886,827,723,29,24,2,6,1,9,365,335,717,768,758,703,28,12,11,4,8,13,253,369,938,729,706,1063,13,32,12,1,10,11,285,209,881,732,628,905,10,28,5,6,7,11,112,140,942,888,852,987,8,21,4,1,0,8,474,442,802,798,849,716,32,24,40,12,13,13,329,393,652,729,733,718,29,25,16,16,11,17,453,357,887,970,626,744,25,14,15,15,11,12,361,199,843,972,714,676,15,20,13,0,10,13,271,259,783,744,742,971,18,27,3,2,12,8,441,291,786,539,736,747,23,11,6,9,11,15,489,509,874,736,889,576,29,19,30,9,15,14,189,237,1061,969,766,1199,22,22,4,3,3,4,290,372,759,866,771,635,24,26,24,12,12,10,5 +292,278,764,734,670,616,21,24,10,10,7,9,189,245,749,645,641,985,16,35,21,3,5,7,273,325,734,548,806,696,15,15,11,3,7,16,425,267,858,747,691,895,25,21,21,6,11,17,340,286,858,733,707,715,30,21,11,3,10,10,356,246,693,663,848,695,31,13,2,5,7,18,230,298,888,578,660,1055,22,27,21,4,7,14,258,320,815,559,692,897,19,25,14,7,4,2,149,203,870,707,726,979,7,22,13,0,11,5,531,309,712,701,839,708,37,23,29,13,8,18,320,274,578,612,745,710,34,22,7,17,2,12,406,258,797,777,650,736,30,25,8,16,6,17,302,196,777,795,646,668,24,23,10,1,5,4,200,254,699,599,674,963,27,22,6,3,7,13,376,240,760,528,864,739,32,12,3,10,8,20,574,412,812,791,985,568,34,22,21,8,10,19,284,412,977,796,662,1191,27,27,13,2,10,9,249,251,671,665,649,627,25,15,23,9,9,1,5 +356,388,984,766,688,630,33,31,27,10,13,1,219,291,907,687,679,997,28,20,24,13,9,15,289,143,866,536,860,710,7,20,14,3,9,12,311,183,1048,821,641,907,13,20,20,0,3,9,218,202,1044,817,715,729,18,18,14,1,4,8,296,176,871,725,908,711,19,18,27,5,9,10,188,218,1054,618,796,1067,26,12,20,18,9,12,228,372,997,565,842,909,25,16,13,9,14,10,151,321,908,717,700,991,15,19,12,4,3,7,429,203,970,737,861,720,27,18,26,13,4,10,226,202,822,680,813,730,28,21,30,17,14,16,372,294,1055,793,806,748,30,24,17,16,12,11,384,324,975,805,750,688,28,28,15,7,11,12,182,278,803,661,796,979,31,13,19,17,9,7,388,254,940,542,964,755,36,17,22,10,8,12,446,334,1056,795,971,582,28,31,22,10,10,11,196,490,1057,834,658,1203,39,18,12,14,6,3,285,317,913,659,647,639,17,10,24,9,15,9,5 +364,260,857,757,579,454,14,22,3,5,3,4,201,363,742,674,552,793,9,19,28,6,5,10,191,465,805,687,767,486,22,25,18,10,17,11,539,419,805,754,644,685,28,33,28,15,13,10,460,436,781,718,718,513,23,33,18,14,14,3,288,292,684,706,807,517,22,29,5,12,17,9,284,384,665,595,633,845,3,27,28,7,17,13,184,328,662,614,685,687,6,17,21,10,10,7,305,273,741,736,631,769,22,8,20,7,9,8,421,347,861,782,792,558,14,15,24,6,10,9,284,216,761,657,708,602,13,16,0,10,12,15,402,192,946,810,551,546,11,21,15,9,4,10,326,196,908,824,625,538,7,13,15,6,5,7,262,272,680,596,637,753,2,20,13,8,17,4,242,258,675,601,783,533,5,22,10,7,18,11,484,316,921,876,988,452,13,10,14,5,12,10,478,350,890,817,559,981,20,19,20,9,12,4,323,323,836,708,566,581,22,25,22,14,15,8,5 +402,372,943,647,655,545,32,28,19,12,6,11,163,329,934,606,640,914,27,17,24,11,4,9,243,183,835,505,807,625,4,7,14,1,8,18,473,191,915,692,632,824,16,13,24,2,8,19,384,210,921,688,680,644,19,13,14,3,9,12,350,194,818,680,867,624,20,7,11,3,8,20,286,320,983,517,723,984,21,9,24,16,12,16,226,436,944,460,765,826,24,11,17,7,9,4,161,331,945,594,687,908,14,24,16,2,8,3,519,181,947,750,838,637,28,19,36,15,11,20,306,216,807,627,774,639,29,12,16,15,5,14,510,292,1032,688,717,665,33,29,7,14,7,19,318,314,956,682,691,597,25,33,7,5,4,6,262,296,818,552,731,892,26,10,9,15,8,15,346,264,835,561,931,668,31,6,6,12,9,22,542,346,1015,822,968,497,29,28,18,12,11,21,320,558,1114,709,639,1120,38,31,16,12,11,11,269,253,890,578,596,558,20,5,16,11,10,3,5 +411,299,882,741,593,467,27,17,8,11,5,12,178,298,745,652,576,784,22,26,23,4,5,10,180,334,788,607,787,495,9,20,13,4,17,1,496,280,846,740,652,694,31,22,23,9,17,12,413,295,820,716,690,516,24,28,13,6,16,11,313,201,711,674,839,512,25,22,0,6,17,1,237,271,720,595,627,854,16,34,23,1,17,7,215,285,699,604,655,696,19,24,16,8,10,15,292,228,732,720,661,778,9,19,15,1,13,16,476,290,886,704,834,573,25,14,27,14,14,1,331,195,786,623,742,597,22,19,5,18,12,5,457,251,971,788,593,559,18,24,10,17,4,0,273,199,917,808,635,523,20,20,12,2,5,13,223,215,695,600,655,762,11,27,8,0,17,10,287,197,704,589,869,538,16,21,5,7,18,3,515,339,948,826,1032,461,22,15,19,9,16,2,443,405,925,801,585,990,33,30,15,1,16,8,356,252,847,678,548,594,23,18,25,12,17,16,5 +424,292,692,873,674,510,8,24,11,11,2,10,187,383,651,768,599,879,3,13,20,4,2,8,217,457,678,705,792,590,28,27,10,10,14,17,557,491,656,840,573,789,32,35,20,17,14,18,404,478,630,772,685,609,29,35,10,14,15,11,362,390,541,618,736,589,28,27,3,12,14,19,264,344,636,693,624,949,3,21,20,1,14,15,246,222,603,722,690,791,0,13,13,8,7,3,219,319,712,874,708,873,24,2,12,1,10,4,513,359,696,622,637,612,20,15,30,14,11,19,288,306,606,611,607,620,19,10,8,18,9,13,478,250,781,942,576,630,17,23,7,17,3,18,326,220,759,962,620,566,13,15,9,2,2,5,198,246,563,686,608,857,8,14,5,0,14,14,306,248,522,551,644,633,11,22,2,7,15,21,578,310,760,704,777,464,19,16,22,9,13,20,378,242,845,933,650,1085,14,11,12,1,13,10,341,319,679,832,723,563,18,27,22,14,16,2,5 +353,257,699,850,690,512,6,23,11,10,1,10,152,350,682,747,635,881,1,16,20,1,3,8,202,528,669,656,810,592,30,28,10,7,13,17,484,478,665,839,683,791,30,38,20,14,15,18,365,493,641,791,767,611,31,38,10,11,14,11,299,411,554,653,780,591,30,28,3,9,13,19,231,391,675,670,634,951,5,24,20,2,13,15,177,231,642,701,710,793,2,14,13,5,6,3,180,278,739,845,754,875,22,1,12,2,9,4,466,408,703,631,741,606,22,18,30,11,10,19,273,367,601,630,693,638,21,13,8,15,8,13,449,275,788,913,558,632,15,22,7,14,2,18,259,173,758,933,678,568,13,12,9,1,1,5,197,323,580,669,636,859,10,17,5,3,13,14,301,329,547,542,690,635,13,23,2,10,14,21,495,363,765,721,899,464,21,13,22,10,12,20,339,223,866,914,672,1087,12,10,12,4,12,10,274,344,686,803,717,547,16,30,22,15,15,2,5 +426,312,956,701,577,588,29,13,7,10,12,10,247,375,657,620,556,725,24,28,24,3,10,12,123,345,826,595,773,530,7,12,14,3,8,3,465,349,900,706,652,679,27,26,24,10,20,16,430,326,876,682,700,515,22,32,14,7,21,9,224,194,785,632,821,547,17,14,1,5,14,1,256,288,702,547,607,791,18,36,24,0,14,11,284,324,707,576,663,637,21,20,17,7,15,17,407,277,676,682,643,717,17,25,16,0,20,18,393,271,960,690,786,656,17,16,26,13,21,1,288,156,826,583,702,646,14,15,4,17,15,7,374,238,1045,756,561,622,20,22,11,16,11,2,362,226,989,770,629,560,22,22,13,1,10,15,214,262,669,554,629,713,13,29,9,1,8,8,184,232,772,549,817,539,10,15,6,8,9,1,434,266,1016,802,998,576,14,11,18,8,23,0,454,382,773,763,567,935,35,26,16,2,23,10,451,297,923,652,566,693,15,20,24,13,14,18,5 +420,306,853,820,695,509,27,16,14,10,4,9,191,257,764,743,654,878,22,25,17,3,6,7,243,373,745,602,725,589,9,25,7,3,14,16,467,319,807,819,726,788,27,31,17,8,8,17,310,308,783,773,750,608,24,29,7,5,7,10,336,252,684,669,737,588,25,27,6,5,14,18,234,282,755,642,637,948,16,33,17,2,14,14,198,216,722,645,677,790,19,23,10,7,7,2,147,167,775,797,751,872,9,10,9,0,6,5,475,329,857,685,734,619,29,13,33,13,11,18,280,264,719,632,658,625,26,22,11,17,9,12,510,252,942,871,563,629,22,21,10,16,5,17,298,192,888,885,669,575,20,11,8,1,6,4,228,226,644,651,663,856,15,26,2,1,14,13,340,232,673,502,727,632,20,22,1,8,15,20,474,366,917,681,874,473,26,10,25,8,9,19,296,272,928,882,685,1084,33,19,9,2,7,9,311,331,820,777,718,578,27,23,19,11,16,1,5 +404,320,833,756,584,523,25,19,12,10,9,5,179,305,770,657,567,820,20,32,19,1,7,17,173,269,769,554,770,535,11,10,9,1,9,8,523,253,809,769,663,730,29,20,19,6,17,15,422,246,781,739,683,550,26,26,9,3,18,12,320,198,686,653,818,572,27,12,4,3,11,8,256,248,755,586,584,890,14,30,19,4,11,14,256,304,724,591,614,732,17,14,12,5,12,14,305,239,785,727,656,814,7,25,11,2,17,9,479,229,837,671,791,577,27,20,29,11,18,8,294,204,741,602,707,659,24,15,9,15,12,12,436,240,922,793,556,619,20,20,8,14,8,7,316,240,872,815,598,521,18,28,8,1,7,16,196,198,698,597,612,798,13,31,4,3,9,11,274,182,673,540,828,582,18,13,1,10,10,10,536,330,905,783,995,481,24,17,23,10,20,9,434,424,956,816,578,1026,31,32,11,4,20,5,375,227,792,681,563,608,25,12,21,11,15,13,5 +430,416,857,837,695,508,28,21,16,12,10,10,211,231,828,754,672,877,23,30,15,1,10,8,249,275,743,613,729,588,8,20,5,1,12,17,457,233,805,848,716,787,24,22,15,4,6,18,322,236,781,800,734,607,23,24,5,3,5,11,340,196,712,720,753,587,24,22,8,3,12,19,260,288,803,667,657,947,17,30,15,6,10,15,192,290,772,656,625,789,20,26,8,5,7,3,159,191,809,808,751,871,10,19,7,2,0,4,457,293,861,714,790,602,32,18,35,11,17,19,288,260,753,679,680,614,29,21,13,15,11,13,526,354,946,876,565,628,25,22,12,14,11,18,312,300,888,896,633,560,21,20,10,1,10,5,268,194,716,676,695,855,18,25,0,5,12,14,350,184,695,511,773,631,23,17,3,12,11,21,462,402,921,710,906,460,29,19,27,10,15,20,292,374,996,901,687,1083,34,28,7,4,3,10,311,257,816,766,670,541,28,14,19,11,16,2,5 +384,306,834,807,698,566,16,18,9,9,4,10,195,277,875,724,663,935,11,31,22,2,4,8,253,399,830,611,778,646,20,19,12,2,12,17,435,325,876,810,729,845,30,27,22,7,6,18,334,316,888,780,743,665,35,27,12,4,7,11,340,270,731,694,784,645,32,21,1,4,12,19,230,352,948,639,670,1005,13,35,22,3,12,15,216,304,913,638,722,847,10,29,15,6,5,3,139,215,974,784,750,929,8,16,14,1,6,4,507,401,826,712,807,658,32,19,30,12,11,19,266,278,686,651,723,668,29,26,6,16,7,13,470,286,911,858,614,686,25,19,9,15,5,18,336,194,873,872,676,618,15,17,11,0,4,5,210,266,803,650,682,913,18,30,7,2,12,14,356,260,782,569,778,689,23,16,4,9,13,21,528,396,886,804,929,518,29,16,20,9,9,20,260,328,1113,871,688,1141,22,25,14,3,9,10,263,309,783,754,679,577,24,19,24,10,14,2,5 +346,300,802,944,706,506,13,24,23,10,7,13,125,209,665,815,657,837,8,3,18,3,5,9,159,315,788,738,738,548,23,27,8,7,7,0,415,249,804,933,717,755,29,29,8,14,13,5,342,272,782,885,761,571,24,25,8,11,14,10,254,218,633,769,766,549,23,27,15,9,9,4,178,224,706,762,636,907,2,11,8,0,7,2,234,220,671,781,632,749,5,7,5,7,8,14,283,159,762,933,758,831,25,12,6,0,13,15,443,285,800,729,761,642,15,9,32,13,14,2,268,286,694,734,659,608,14,12,20,17,8,4,404,244,885,983,618,604,12,23,19,16,6,1,264,186,855,1021,616,576,8,15,17,1,5,12,162,222,631,765,658,815,3,10,9,1,7,11,260,234,644,614,708,591,6,22,10,8,8,4,466,404,874,801,929,514,14,26,34,8,16,3,366,342,915,1006,688,1043,19,11,6,2,16,9,343,297,775,863,691,635,21,17,28,15,17,15,5 +352,384,795,770,682,602,28,22,14,14,9,8,183,231,782,689,651,971,23,35,17,3,7,10,281,261,759,544,758,682,8,11,7,1,5,15,403,203,865,789,685,881,18,15,17,2,11,16,340,196,869,765,693,701,23,21,7,3,10,9,364,216,712,695,800,681,24,9,6,3,5,17,252,274,921,610,644,1041,23,27,17,8,5,15,268,320,852,587,686,883,20,25,10,5,6,5,141,203,879,739,726,965,10,24,9,2,11,6,551,267,773,729,787,694,32,27,29,11,10,17,290,274,635,648,697,698,33,24,11,15,4,15,460,332,858,811,632,722,35,23,10,14,8,16,346,272,808,827,644,654,25,23,8,1,7,7,198,246,724,633,666,951,28,24,2,7,5,12,368,242,773,528,820,727,33,8,1,12,6,19,562,414,851,777,909,554,33,22,25,10,12,18,224,424,1006,838,670,1177,34,25,9,4,12,8,275,229,728,705,657,613,20,17,19,11,11,4,5 +384,412,848,942,795,626,22,16,19,10,10,5,277,167,841,849,760,995,17,37,12,3,10,15,373,277,812,718,741,706,14,13,2,3,12,12,317,201,916,951,786,905,24,13,12,6,0,13,264,196,926,919,786,725,29,19,2,3,1,8,382,252,773,803,711,705,30,11,11,5,8,14,244,326,982,764,745,1065,19,29,12,4,10,16,288,272,907,761,691,907,16,27,5,7,7,10,87,141,952,913,833,989,4,24,4,0,0,7,497,353,810,813,844,718,38,25,40,13,13,14,312,340,670,762,730,720,35,30,16,17,11,16,440,382,895,979,657,746,31,17,15,16,11,13,394,280,845,1001,701,678,21,25,13,1,10,12,254,242,793,779,771,973,24,30,3,3,12,9,470,238,834,580,733,749,29,10,6,10,11,16,506,488,886,779,862,578,35,24,30,8,15,15,164,312,1069,1002,783,1201,28,23,4,2,3,5,301,295,767,867,736,637,26,23,24,9,12,9,5 +407,453,1089,721,630,546,36,37,17,17,4,18,168,282,976,596,619,825,31,10,20,14,2,4,220,136,903,617,806,582,0,26,20,10,10,5,470,166,1133,766,583,743,24,22,32,7,10,6,337,129,1105,768,661,611,15,12,20,6,11,11,321,141,948,782,868,613,16,24,27,12,10,7,219,291,1061,623,740,893,25,6,26,11,12,3,259,403,1012,594,798,761,28,16,25,14,7,9,234,284,993,702,636,845,18,25,26,7,10,10,500,244,1079,818,813,624,24,14,26,20,11,7,277,257,941,719,763,642,25,13,24,24,5,1,479,369,1164,740,746,616,27,30,17,23,3,6,299,359,1062,790,710,592,29,28,15,8,2,7,181,285,920,638,730,867,20,11,19,10,10,12,309,269,973,695,918,645,23,21,22,13,11,9,501,381,1175,946,959,530,25,39,22,15,13,8,339,507,1212,801,604,1065,42,24,22,9,13,14,362,284,1022,616,589,567,28,6,6,16,12,10,5 +453,329,889,823,623,439,21,21,10,10,6,15,214,352,798,758,580,788,16,20,21,3,8,7,230,434,821,627,699,493,15,26,11,7,18,14,508,402,825,800,688,692,31,26,21,14,16,15,391,423,807,744,674,512,26,26,11,11,17,14,339,295,724,670,743,498,21,28,2,9,18,16,239,359,723,655,573,852,10,28,21,0,18,12,219,267,706,674,615,694,13,22,14,7,13,8,214,284,787,816,689,776,13,11,13,0,12,7,496,342,893,672,734,547,21,10,31,13,9,16,335,227,797,631,644,587,18,17,7,17,15,10,501,255,978,894,547,541,14,26,8,16,7,15,297,249,934,902,601,503,14,14,10,1,8,10,241,179,714,650,585,760,7,21,6,1,18,15,317,169,703,581,729,536,12,25,3,8,17,18,509,325,949,724,926,419,18,11,21,8,11,17,393,309,938,885,613,988,27,24,13,2,11,11,356,278,860,806,588,552,19,20,23,15,14,7,5 +437,361,813,668,589,514,29,19,10,13,5,10,188,296,766,577,574,863,24,22,21,6,3,8,210,252,707,570,755,580,7,18,11,6,11,17,538,272,799,681,592,751,23,24,21,5,7,18,381,241,771,675,642,601,22,26,11,2,8,11,337,183,676,651,795,587,23,20,2,8,11,19,267,271,783,528,641,923,18,30,21,5,11,15,223,317,744,529,691,775,21,22,14,10,4,3,216,270,777,645,635,855,11,15,13,3,7,4,500,222,815,705,784,586,31,10,21,16,12,19,289,185,695,598,702,652,30,17,7,20,6,13,475,295,900,715,597,616,26,26,8,19,6,18,341,263,834,733,649,556,22,22,10,4,3,5,235,213,678,553,663,851,19,23,6,4,11,14,293,185,673,552,835,627,24,21,3,9,12,21,545,323,887,821,942,466,30,13,21,11,10,20,361,435,960,730,579,1073,35,28,13,1,10,10,320,230,766,599,562,539,27,16,19,12,13,2,5 +436,342,941,704,587,530,31,15,8,11,9,12,219,341,764,617,566,757,26,30,23,4,7,10,161,285,811,592,755,498,5,12,13,4,5,1,513,295,901,715,606,667,29,24,23,7,17,14,420,256,879,699,640,499,20,30,13,4,18,11,284,150,768,659,795,555,21,14,0,6,11,1,240,266,755,554,619,819,20,36,23,3,11,9,256,326,742,569,679,669,23,18,16,8,12,15,341,259,743,679,639,749,13,25,15,1,17,16,439,253,945,717,776,594,27,18,27,14,18,1,290,162,825,606,692,652,24,13,5,18,12,5,406,274,1030,747,577,606,22,20,10,17,8,0,318,224,962,767,631,530,24,24,12,2,7,13,198,234,704,567,631,745,15,31,8,2,5,10,228,214,757,562,819,553,18,15,5,9,6,3,496,294,1003,827,954,514,24,13,19,9,20,2,426,424,920,764,577,967,37,28,15,1,20,8,403,255,900,641,564,627,25,18,25,10,15,16,5 +369,421,762,1015,765,607,15,14,32,10,10,5,230,154,839,890,730,976,10,25,13,1,10,13,318,238,804,801,729,687,21,25,11,1,12,8,318,160,836,1030,788,886,31,23,1,8,4,13,259,195,840,976,790,706,36,19,11,5,3,12,343,235,707,844,713,686,31,23,24,3,10,12,235,219,948,847,713,1046,12,31,1,2,10,10,243,257,893,844,645,888,9,35,8,5,7,8,94,156,960,996,813,970,9,24,9,2,0,7,456,268,734,842,830,699,31,13,29,11,17,10,281,335,630,813,716,701,28,30,29,15,11,12,449,349,819,1044,617,727,24,15,28,14,11,9,355,309,781,1084,669,659,14,17,26,1,10,10,247,217,807,858,743,954,17,30,16,3,12,13,413,233,760,643,715,730,22,22,19,10,11,12,461,461,818,806,896,559,28,24,43,10,15,11,165,375,1079,1085,751,1182,21,23,9,4,3,1,286,262,691,926,710,618,23,25,25,11,14,7,5 +429,429,827,925,676,514,23,14,32,11,6,13,208,238,860,778,659,881,18,19,3,4,4,11,258,168,811,719,704,594,13,31,11,4,8,20,444,126,849,940,695,791,25,21,9,5,12,21,335,203,825,884,707,615,28,17,11,2,11,14,349,219,718,802,750,599,29,29,24,6,8,22,253,193,921,761,650,951,12,27,3,5,8,18,211,339,882,762,588,793,15,31,8,8,1,6,128,264,935,914,722,875,5,26,9,1,6,5,494,180,821,808,793,608,31,11,29,14,11,22,317,281,735,753,677,622,28,28,29,18,5,16,521,309,906,952,574,632,24,17,28,17,5,21,307,365,846,1002,594,578,16,17,26,2,4,8,239,273,818,768,690,867,17,26,16,4,8,17,357,273,735,639,774,643,22,28,19,9,9,24,503,381,905,828,923,470,28,26,43,9,9,23,279,463,1116,1001,668,1087,29,25,9,1,9,13,294,272,776,834,613,531,29,25,21,10,10,5,5 +306,218,730,722,660,548,7,23,3,4,3,10,169,383,673,619,631,903,2,16,28,11,3,8,201,507,668,702,924,628,29,28,18,13,11,17,499,495,712,711,693,771,31,38,28,10,11,18,402,492,684,699,787,649,30,38,18,13,10,11,266,382,587,703,848,635,29,28,5,15,11,19,254,404,686,576,728,955,4,24,28,8,11,15,138,310,647,603,820,817,1,14,21,15,4,3,231,315,730,713,696,895,23,1,20,8,9,4,403,389,732,767,809,626,21,18,22,7,8,19,216,298,602,664,777,678,20,13,0,11,6,13,392,204,817,781,546,658,16,22,15,12,2,18,304,166,785,801,748,608,14,12,15,9,3,5,242,388,579,577,724,901,9,17,13,7,11,14,266,388,582,598,774,677,12,23,10,10,12,21,466,332,804,885,937,504,20,13,14,4,10,20,378,302,861,786,630,1117,13,10,20,8,10,10,245,423,713,671,671,519,17,30,20,17,13,2,5 +377,365,855,736,683,561,29,22,12,14,4,10,192,274,866,663,670,930,24,35,19,5,4,8,260,282,807,512,785,641,7,11,9,3,10,17,382,256,851,751,692,840,17,19,19,0,6,18,297,247,861,733,714,660,22,23,9,1,7,11,317,173,744,661,843,640,23,11,4,5,10,19,209,279,923,574,677,1000,20,27,19,10,10,15,201,303,886,559,677,842,21,23,12,7,5,3,132,214,911,701,733,924,11,24,11,0,6,4,486,272,859,695,832,653,31,25,31,13,11,19,245,207,717,620,742,655,32,22,9,17,5,13,465,305,944,777,647,681,32,23,8,16,5,18,335,261,878,789,669,613,22,21,8,1,4,5,187,199,766,599,711,908,25,22,4,9,10,14,363,187,769,518,879,684,30,8,1,10,11,21,499,359,923,763,958,513,32,20,23,12,9,20,223,411,1070,800,677,1136,35,27,11,6,9,10,266,220,812,671,652,572,21,13,21,9,12,2,5 +361,281,641,980,725,596,6,20,23,9,11,10,162,190,706,855,696,965,1,7,10,2,9,8,256,380,715,780,773,676,30,37,2,8,11,17,400,284,697,973,756,875,30,39,8,15,5,18,297,293,695,919,846,695,31,29,2,12,4,11,323,267,550,777,793,675,30,37,15,10,11,19,235,285,781,804,689,1035,5,15,8,1,11,15,205,171,734,823,685,877,2,17,1,6,8,3,116,160,845,975,787,959,18,8,0,1,1,4,474,396,631,751,776,688,22,9,38,12,18,19,285,375,527,756,714,692,21,12,20,16,12,13,477,291,716,1031,573,716,15,19,19,15,12,18,303,151,696,1063,657,650,13,11,17,0,9,5,233,289,658,805,715,943,10,14,7,2,11,14,367,313,599,602,699,719,13,32,10,9,10,21,487,483,715,719,924,548,21,22,34,9,16,20,253,269,956,1048,701,1171,12,7,0,3,4,10,234,348,610,913,732,609,14,21,22,16,15,2,5 +450,362,905,845,696,526,26,20,31,15,9,14,267,329,954,746,671,895,21,23,6,6,7,12,315,179,867,643,714,606,10,27,10,6,7,21,429,191,923,866,675,805,20,21,6,3,9,22,334,262,921,854,679,625,25,17,10,2,8,15,370,278,812,788,734,605,26,23,23,8,5,23,248,232,1023,679,688,965,17,25,0,9,5,19,234,372,980,674,602,807,18,31,7,10,2,7,153,367,1005,826,732,889,8,26,8,3,9,6,523,123,901,826,805,620,34,11,30,16,8,23,284,234,789,729,687,622,33,26,28,20,2,17,510,264,986,872,620,646,29,21,27,19,8,22,392,388,914,914,604,578,19,23,25,4,7,9,238,298,882,702,708,875,22,26,15,8,7,18,416,286,835,607,768,651,27,24,18,9,6,25,538,288,985,880,885,478,33,26,42,11,8,24,248,508,1162,917,692,1101,32,25,8,5,8,14,317,327,848,764,629,539,24,19,20,12,9,6,5 +383,343,919,666,629,553,30,22,11,10,5,11,164,334,914,605,616,922,25,23,20,9,3,9,232,184,793,482,783,633,6,13,10,3,9,18,484,216,899,697,614,832,20,17,20,0,11,19,369,219,877,697,658,652,21,17,10,1,12,12,353,197,790,659,843,632,22,13,3,5,9,20,245,297,939,526,691,992,19,15,20,14,11,16,239,409,902,493,731,834,22,15,13,7,6,4,164,334,905,623,667,916,12,20,12,0,11,3,522,174,923,717,820,645,30,21,30,15,12,20,293,185,801,608,748,647,31,16,8,17,6,14,471,273,1008,705,683,673,29,23,7,16,4,19,287,311,932,711,663,605,23,29,9,3,3,6,177,267,798,553,703,900,22,12,5,13,9,15,337,235,787,544,903,676,27,14,2,10,10,22,551,319,991,807,966,505,31,22,22,12,14,21,321,533,1106,730,617,1128,36,25,12,10,14,11,292,248,868,597,578,566,24,9,22,9,13,3,5 +385,367,841,764,674,634,20,13,13,12,4,9,286,304,824,693,649,1003,15,32,18,5,6,17,346,362,773,542,734,714,16,18,8,5,14,14,324,326,893,773,679,913,26,20,18,4,10,9,277,341,909,729,697,733,31,26,8,1,9,16,359,255,750,665,764,713,32,16,5,7,14,12,217,313,965,602,636,1073,19,32,18,6,14,14,251,253,890,589,672,915,16,26,11,9,7,18,160,250,911,737,716,997,4,17,10,2,10,11,526,320,789,679,769,726,38,20,32,15,7,12,283,223,655,620,681,728,35,29,10,19,9,18,453,297,874,813,590,754,29,14,9,18,5,13,375,277,840,825,654,686,21,18,7,3,6,20,215,147,754,607,670,981,24,33,3,5,14,15,437,131,803,514,800,757,29,15,0,8,15,10,521,381,847,719,907,586,35,17,24,10,7,11,163,339,1036,826,664,1209,26,18,10,2,7,9,324,252,740,711,647,645,28,26,20,11,16,17,5 +382,392,909,717,696,621,30,22,12,13,7,3,279,273,824,648,675,990,25,31,19,6,5,15,335,281,793,489,786,701,10,13,9,4,7,16,329,265,977,734,665,900,16,13,19,1,7,7,294,244,985,714,683,720,21,19,9,0,8,10,350,174,810,666,828,700,22,11,4,6,7,14,218,304,965,567,688,1060,29,23,19,11,9,8,242,302,906,532,714,902,26,23,12,8,6,12,163,219,885,680,734,984,12,24,11,1,7,11,531,269,873,706,801,713,30,25,31,14,10,14,282,216,723,619,735,715,31,24,9,18,4,20,432,336,958,760,674,741,33,23,8,17,6,15,382,284,904,768,684,673,31,25,8,2,5,14,204,182,724,586,714,968,34,24,4,10,7,9,422,154,869,519,892,744,39,10,1,9,8,12,528,374,933,766,919,573,31,24,23,13,10,13,170,406,1008,779,686,1196,36,23,11,7,10,7,307,223,820,656,663,632,18,17,21,10,9,11,5 +402,330,629,1025,767,549,5,20,22,11,10,9,207,311,642,904,706,918,0,15,13,4,10,7,271,513,657,833,827,629,31,31,1,14,12,16,399,449,603,986,696,828,29,37,9,17,10,17,268,490,599,908,814,648,32,37,1,16,9,10,346,420,484,752,785,628,31,31,14,16,16,18,234,340,663,847,709,988,6,23,9,1,10,14,222,176,622,876,713,830,3,13,2,8,7,2,109,245,747,1028,819,912,21,0,1,3,0,5,471,399,633,754,710,649,23,17,39,14,17,18,282,402,535,753,674,647,22,12,19,18,15,12,502,306,718,1084,615,669,14,19,18,17,11,17,314,242,710,1116,687,601,12,13,16,2,10,4,232,270,562,838,717,896,11,16,6,0,12,13,378,294,493,615,645,672,14,26,9,7,13,20,462,414,701,624,790,505,22,14,33,9,15,19,218,160,860,1085,743,1124,11,7,1,1,3,9,283,353,626,970,834,574,15,29,25,14,16,1,5 +342,270,632,948,725,582,5,21,19,10,11,8,153,225,697,825,678,951,0,10,12,1,9,12,263,471,698,740,727,662,31,30,2,7,11,13,371,369,640,935,742,861,29,32,12,14,7,16,306,398,648,875,826,681,32,32,2,11,6,13,328,356,525,749,761,661,31,30,11,9,13,15,248,334,728,766,653,1021,6,18,12,2,11,11,234,158,691,783,629,863,3,12,5,5,8,7,145,165,794,935,799,945,19,5,4,2,1,2,471,403,636,731,732,674,23,12,36,11,18,15,298,384,556,722,662,676,22,7,16,15,12,9,478,290,721,991,573,702,14,20,15,14,12,14,322,160,701,1023,651,634,12,14,13,1,9,9,244,254,625,767,679,929,11,11,3,3,11,14,366,286,550,552,645,705,14,25,6,10,10,17,490,466,704,667,874,534,22,19,30,10,16,16,238,204,927,1010,711,1157,11,8,4,4,4,6,257,315,625,875,758,593,13,24,20,15,17,6,5 +380,472,844,990,786,641,19,16,31,13,9,6,281,173,831,871,761,1010,14,25,14,4,11,8,355,165,792,768,788,721,17,25,10,4,13,11,297,97,942,1005,797,920,27,19,0,3,1,10,230,160,936,951,815,740,32,17,10,0,0,9,366,234,769,821,756,720,33,23,23,6,7,13,224,198,968,820,748,1080,20,31,0,7,9,13,282,294,895,811,670,922,17,37,7,8,6,9,91,227,934,963,830,1004,5,28,8,1,1,10,479,259,796,837,865,733,39,13,30,14,14,9,306,358,656,788,753,735,36,32,28,18,10,15,458,364,881,1007,652,761,28,17,27,17,10,10,390,360,853,1051,696,693,22,19,25,2,11,9,242,286,763,833,782,988,25,32,15,6,13,10,454,294,836,646,782,764,30,22,18,9,12,13,466,458,902,825,913,593,36,28,42,9,14,10,124,422,1047,1056,776,1216,25,27,8,3,2,6,321,291,751,883,759,652,27,25,26,10,11,10,5 +412,298,752,855,639,525,18,20,15,10,6,11,163,201,757,756,590,872,13,21,16,1,6,9,237,407,750,651,669,607,18,27,6,3,16,18,515,291,748,854,704,782,32,29,16,10,14,19,398,308,724,818,700,630,29,29,6,7,13,12,350,288,617,698,683,612,24,29,7,5,18,20,270,318,790,681,563,942,7,25,16,2,16,16,234,224,755,698,613,794,10,17,9,5,11,4,191,141,840,846,703,878,10,8,8,2,12,3,533,363,750,710,682,605,24,13,30,11,13,20,304,312,668,663,610,639,21,14,12,15,13,14,486,260,835,908,513,627,17,19,11,14,7,19,334,186,799,934,619,591,11,13,9,1,6,6,222,190,699,682,587,884,10,18,1,3,16,15,332,206,622,571,667,660,15,26,2,10,17,22,570,434,824,750,858,485,21,12,26,10,15,21,360,300,997,919,629,1096,24,17,8,4,15,11,297,299,717,800,648,520,22,21,18,13,14,3,5 +363,507,827,948,772,584,25,16,31,13,11,6,222,174,854,847,753,953,20,23,14,2,9,8,326,148,815,724,794,664,11,27,10,2,11,11,322,66,889,961,795,863,21,19,0,3,1,12,257,151,887,919,791,683,26,17,10,2,2,7,345,241,752,797,802,663,27,25,23,4,9,15,239,223,975,776,744,1023,18,31,0,7,11,13,245,335,916,767,616,865,17,37,7,6,8,3,96,252,953,919,832,947,7,28,8,1,1,6,444,252,819,819,895,676,35,11,30,12,14,13,317,355,679,760,769,678,34,32,28,16,12,13,435,387,904,973,644,704,30,17,27,15,12,12,367,405,852,1007,686,636,20,19,25,0,9,5,271,339,800,789,782,931,23,30,15,6,11,8,419,341,807,634,812,707,28,24,18,11,10,15,447,461,911,829,951,536,34,28,42,9,16,14,203,453,1078,1014,774,1159,31,27,8,3,4,6,268,306,774,847,713,595,23,25,26,10,13,4,5 +406,276,714,838,689,528,12,23,14,10,3,12,167,251,687,747,638,897,7,12,17,1,3,10,219,421,686,626,707,608,24,28,7,3,15,19,477,341,696,839,708,807,30,34,17,10,13,20,366,342,676,787,744,627,25,34,7,7,12,13,342,298,569,675,709,607,24,28,6,5,15,21,272,318,712,660,619,967,1,20,17,2,15,17,200,206,677,669,657,809,4,14,10,5,8,5,143,175,758,821,741,891,16,3,9,2,7,4,503,355,718,677,704,626,18,14,33,11,10,21,288,306,604,640,632,630,15,9,11,15,10,15,510,236,803,893,539,648,13,22,10,14,4,20,318,162,771,909,639,580,9,16,8,1,3,7,250,230,597,667,641,875,4,13,2,3,15,16,324,244,564,488,649,651,9,23,1,10,16,23,524,394,784,661,846,482,15,17,25,10,10,22,320,256,899,902,671,1103,18,10,9,4,10,12,273,309,687,791,692,551,20,26,19,13,17,4,5 +406,304,777,885,723,512,20,24,15,10,4,8,173,251,724,764,664,881,15,13,16,3,4,6,211,393,715,675,731,592,16,27,6,5,10,15,467,321,749,872,730,791,32,35,16,12,10,16,328,324,723,818,766,611,29,35,6,9,9,9,316,270,618,706,727,591,24,27,7,7,10,17,226,280,723,703,657,951,9,21,16,0,10,13,202,228,690,718,679,793,12,13,9,7,3,1,175,167,779,870,755,875,10,2,8,0,6,6,485,329,781,682,702,624,24,15,34,13,11,17,258,312,667,675,632,628,21,10,12,17,5,11,488,262,866,928,575,632,17,23,11,16,5,16,288,204,822,958,635,570,13,15,9,1,4,3,204,252,624,708,667,859,10,14,1,1,10,12,322,258,611,539,643,635,15,22,2,8,11,19,488,360,849,698,830,476,21,16,26,8,9,18,304,254,912,947,701,1087,26,11,8,2,9,8,313,361,752,814,718,573,22,27,18,15,12,0,5 +383,403,820,794,719,579,28,25,16,14,11,12,172,192,811,733,690,948,23,34,15,3,9,10,268,246,744,558,731,659,8,12,5,1,11,19,460,188,822,819,716,858,20,20,15,2,1,20,339,197,794,785,728,678,23,20,5,3,2,13,351,233,703,705,753,658,24,12,8,3,9,21,265,311,874,624,673,1018,17,26,15,8,9,17,245,293,829,601,663,860,20,24,8,5,8,5,146,184,868,755,769,942,10,23,7,2,1,4,516,308,818,741,776,671,32,24,35,11,12,21,307,303,686,662,680,681,33,21,13,15,12,15,497,365,903,833,581,699,29,26,12,14,12,20,307,283,847,841,671,631,21,24,10,1,9,7,247,259,721,647,707,926,22,21,0,7,11,16,381,257,714,466,781,702,27,9,3,12,10,23,519,461,898,713,868,531,33,23,27,10,16,22,303,401,1023,854,711,1154,34,30,7,4,4,12,294,234,773,729,698,590,24,12,19,11,13,4,5 +355,395,764,864,712,626,24,16,22,12,12,2,212,154,777,773,711,995,19,33,9,1,8,12,312,234,758,636,846,706,12,17,1,1,10,11,316,180,814,883,777,905,22,19,9,4,2,10,259,171,820,841,827,725,27,25,1,3,3,5,335,239,643,725,848,705,28,15,14,3,10,11,237,245,866,694,714,1065,19,29,9,6,10,13,233,239,825,679,634,907,16,25,2,5,9,7,132,158,872,831,792,989,6,18,1,2,2,6,452,310,754,725,891,718,36,21,37,11,13,11,283,345,606,688,791,720,35,30,19,15,13,15,417,359,839,899,628,746,31,17,18,14,13,10,351,283,789,919,664,678,21,19,16,1,10,9,259,243,723,711,766,973,24,30,6,5,10,6,401,261,708,518,856,749,29,14,9,12,9,13,457,483,828,723,977,578,35,18,33,10,17,12,175,343,1005,928,708,1201,30,19,1,4,5,2,268,276,709,787,717,637,24,23,21,11,14,6,5 +339,347,988,740,705,622,28,22,14,10,7,4,224,328,907,695,676,981,23,29,17,9,5,16,310,218,866,538,745,704,8,15,7,3,7,9,352,236,1072,773,654,891,18,17,17,0,7,12,307,235,1068,749,666,725,23,23,7,1,6,9,363,221,895,717,805,703,24,13,6,5,7,9,233,285,1044,596,715,1051,27,21,17,14,9,15,269,349,987,541,727,901,24,19,10,7,8,11,142,300,950,693,733,983,10,20,9,0,7,8,526,164,950,775,792,708,32,23,35,15,10,9,303,211,800,666,720,722,33,20,11,17,4,13,461,271,1035,781,681,734,35,19,10,16,8,8,345,299,979,781,671,676,29,21,8,3,5,13,209,227,799,611,725,975,32,22,2,13,7,8,403,209,952,540,885,751,37,12,1,10,8,11,531,329,1018,801,910,576,33,20,25,12,8,10,187,473,1085,802,697,1199,34,21,9,10,8,2,294,252,895,679,632,623,20,15,19,9,9,10,5 +388,336,895,752,568,591,28,23,9,10,11,13,205,283,634,655,533,796,23,28,22,1,9,9,125,225,805,606,794,545,8,8,12,1,7,0,497,219,877,765,643,718,28,16,22,8,19,11,438,226,849,743,687,572,23,22,12,5,20,12,268,178,726,667,836,570,18,10,1,3,13,2,252,220,705,590,582,846,17,28,22,2,13,6,286,340,678,601,648,708,20,16,15,5,14,14,385,257,693,727,636,786,16,29,14,2,19,15,413,249,897,707,783,655,18,18,26,11,20,2,274,230,751,618,707,659,15,11,6,15,14,4,372,256,982,795,586,617,19,24,9,14,10,1,346,242,926,815,606,595,21,32,11,1,9,12,204,280,618,605,598,792,12,29,7,3,7,11,226,270,727,566,812,576,9,11,4,10,8,4,490,368,969,831,993,575,15,21,20,10,22,3,470,458,834,816,560,1008,34,36,14,4,22,9,407,255,860,685,591,644,16,10,24,11,13,15,5 +425,345,748,964,720,538,20,13,30,11,9,13,232,204,843,841,673,907,15,22,5,4,7,11,290,300,782,758,680,618,16,28,9,4,5,20,410,228,772,967,721,817,26,34,7,9,9,21,321,265,778,911,719,639,31,30,9,6,8,14,361,193,669,803,708,617,30,26,22,6,5,22,255,213,880,792,660,977,11,30,1,1,5,18,223,251,843,801,624,819,12,20,6,8,2,6,118,142,908,953,752,901,4,7,7,1,9,5,506,288,748,815,751,630,30,12,31,14,8,22,309,291,652,766,643,638,27,19,27,18,4,16,521,281,833,1003,622,658,23,18,26,17,8,21,331,235,791,1041,622,594,13,8,24,2,7,8,243,241,771,797,680,889,16,23,14,0,5,17,381,239,696,628,702,665,21,25,17,7,6,24,507,399,824,803,877,490,27,7,41,9,10,23,241,349,1073,1034,700,1113,26,12,7,1,10,13,300,296,715,883,673,549,28,26,19,12,11,5,5 +409,287,777,792,664,512,12,27,9,11,2,7,174,384,714,695,607,823,7,14,22,4,4,17,180,468,701,650,770,528,24,20,12,6,16,8,488,444,737,779,667,727,30,36,22,13,16,15,369,455,709,725,703,547,25,36,12,10,15,14,289,325,626,615,758,563,24,24,1,8,16,8,209,351,669,614,646,887,1,22,22,1,16,16,209,281,646,645,716,729,4,12,15,8,9,16,242,288,717,781,708,811,22,7,14,1,10,9,460,350,781,633,729,562,16,16,28,14,9,8,259,269,685,578,671,656,15,11,6,18,11,12,451,245,866,849,536,602,13,26,9,17,3,7,287,211,834,869,660,536,9,14,11,2,4,18,187,279,626,611,640,795,4,15,7,0,16,13,269,271,607,546,716,571,7,17,4,7,17,10,499,281,845,753,901,468,15,15,20,9,11,9,379,259,872,854,644,1023,18,16,14,1,11,7,350,348,760,741,669,597,20,28,24,14,16,15,5 +212,184,800,648,674,679,15,11,10,8,9,1,351,287,573,557,705,1022,16,30,29,13,11,13,407,349,790,620,1022,757,25,20,19,13,13,12,279,357,908,659,799,930,13,22,29,16,11,9,238,364,846,681,895,778,22,26,19,17,12,6,334,280,701,717,1072,762,21,18,6,11,9,10,342,334,702,530,786,1090,22,36,29,16,15,12,398,262,661,539,808,944,19,26,22,9,12,8,323,249,698,629,776,1022,13,17,21,16,17,9,369,281,764,789,1037,751,23,18,25,7,0,10,278,266,612,652,955,785,24,27,7,1,6,16,236,176,849,691,760,785,24,4,8,0,10,11,368,142,839,717,802,741,22,16,10,15,11,10,402,272,617,553,832,1034,27,31,14,17,13,5,410,278,744,628,1056,810,32,17,11,10,12,10,394,368,894,893,1231,631,24,15,13,8,2,9,258,380,747,714,668,1244,21,16,21,18,14,3,291,327,735,567,633,662,11,30,23,11,13,9,6 +228,388,721,744,633,766,15,31,32,14,9,14,339,313,500,633,678,1065,20,22,15,7,13,8,377,215,671,596,1029,834,31,16,25,7,11,1,291,185,741,801,808,909,13,10,15,10,1,4,234,274,711,811,920,839,26,6,25,11,2,11,278,312,568,769,1075,857,25,12,38,5,9,5,332,256,625,598,757,1125,24,14,15,10,9,1,344,364,566,557,781,1007,23,24,22,3,12,13,339,355,649,709,743,1087,29,37,23,10,11,14,295,239,715,787,1014,818,17,20,15,13,2,3,330,364,561,704,938,880,16,25,39,7,8,3,288,286,800,753,737,864,10,32,28,6,8,2,406,358,768,797,781,836,14,34,26,9,11,11,396,384,498,649,805,1119,19,21,30,11,11,12,346,390,579,608,1029,899,16,19,33,8,10,5,282,430,805,891,1236,722,16,37,43,14,4,4,384,486,748,818,625,1233,17,36,23,12,16,10,273,293,696,619,612,659,7,8,21,7,13,14,6 +329,187,697,717,637,644,15,10,8,10,3,11,452,364,472,620,678,991,20,31,23,3,3,11,374,352,665,697,1075,722,25,19,17,11,15,2,324,394,657,718,870,887,15,19,29,18,17,13,349,397,629,742,986,743,26,21,17,15,16,10,331,345,538,770,1117,729,25,17,16,13,15,0,377,327,547,585,757,1059,16,25,23,0,15,8,503,249,514,604,773,911,19,31,22,7,8,16,540,346,619,726,769,991,33,18,23,0,11,17,386,294,701,812,1040,720,17,23,23,13,12,0,419,267,575,701,960,752,16,26,15,17,10,6,239,155,786,776,731,752,6,19,6,16,2,1,387,177,770,814,799,708,8,21,6,1,3,14,427,261,522,614,801,999,11,26,16,1,15,9,319,257,529,665,1025,775,8,16,11,8,16,2,353,391,769,924,1252,596,16,18,19,8,14,1,507,403,682,787,629,1211,17,17,19,2,14,9,486,214,696,636,648,609,13,29,9,15,17,17,6 +229,179,561,735,648,644,6,13,16,14,3,10,348,294,588,650,657,985,11,30,19,7,3,12,324,444,613,619,992,724,36,20,9,7,13,3,352,432,615,714,845,911,24,22,21,10,15,16,323,457,589,694,929,747,37,22,9,11,16,9,323,383,460,664,1036,721,36,18,14,5,13,1,309,385,673,565,698,1055,11,28,19,10,13,11,417,263,600,590,698,899,12,26,14,3,6,17,462,252,747,738,786,979,24,15,15,10,11,18,488,374,565,738,965,736,28,20,29,13,12,1,355,361,451,597,877,730,27,27,19,7,8,7,207,251,650,798,654,740,9,12,8,6,2,2,259,131,632,826,716,686,7,16,6,9,1,15,331,311,588,562,742,981,16,29,8,11,13,8,337,313,511,589,950,759,19,17,9,8,14,1,449,479,625,808,1173,610,27,15,23,14,14,0,459,325,830,799,646,1197,6,16,11,12,14,10,416,308,560,664,677,657,20,28,13,7,15,18,6 +339,337,943,757,624,725,23,11,20,16,9,10,364,288,620,634,667,1052,26,28,15,5,11,12,278,204,859,619,1054,797,21,22,17,5,13,3,278,220,913,770,849,934,9,24,29,8,7,12,265,245,883,746,965,818,14,24,17,9,8,9,197,181,772,702,1096,816,13,20,20,3,9,1,309,203,715,589,750,1118,22,30,23,8,11,7,339,295,706,600,770,980,25,28,22,1,10,17,408,276,673,748,748,1058,31,13,23,8,17,18,280,202,947,750,1019,787,5,18,23,13,0,1,315,215,793,635,939,839,6,27,25,9,6,7,245,245,1032,790,728,825,14,10,12,8,10,2,381,273,994,836,780,795,16,18,10,7,11,15,413,237,588,600,792,1078,17,29,16,9,13,8,241,221,771,581,1016,858,14,19,15,10,12,1,235,331,1015,850,1233,681,6,13,27,16,2,0,375,421,638,829,616,1280,29,14,19,10,14,10,454,288,920,664,627,648,13,30,7,9,13,18,6 +242,168,721,711,617,668,14,12,7,9,3,12,355,297,506,620,622,951,13,27,24,12,3,10,275,377,683,635,979,728,22,23,14,12,11,1,349,379,681,688,820,939,24,25,24,15,15,16,354,404,653,656,916,749,23,27,14,16,14,11,264,306,554,648,1005,687,22,21,1,10,11,1,314,332,605,541,685,1005,7,35,24,15,11,11,416,286,554,568,665,863,10,27,17,8,6,15,453,265,657,708,763,957,32,14,16,15,11,16,379,305,725,716,960,798,14,17,22,8,12,1,284,232,571,583,868,666,13,26,4,2,6,5,114,136,810,780,647,684,7,3,11,1,2,0,340,138,800,796,687,644,7,13,13,14,1,13,336,282,542,550,727,915,2,28,9,16,11,10,280,286,547,561,913,725,5,20,6,9,12,3,406,356,789,804,1148,652,13,14,18,9,14,2,432,404,710,773,621,1147,20,13,16,17,14,8,333,299,718,662,670,729,22,29,20,12,15,16,6 +320,338,757,771,658,647,18,23,15,10,4,13,305,253,516,626,689,832,13,20,16,9,2,9,201,225,737,719,1072,651,18,30,22,11,10,0,403,221,759,762,883,826,24,24,32,12,10,5,340,240,731,734,991,698,19,16,22,11,11,10,226,226,604,750,1114,626,18,28,17,9,10,4,302,254,681,613,760,888,7,18,28,10,10,2,350,322,624,650,770,758,10,24,27,7,5,14,485,265,683,780,794,844,32,23,28,10,10,15,363,239,753,770,1039,725,10,14,16,9,11,2,276,294,599,683,957,623,9,19,22,7,5,4,192,246,838,810,728,619,9,20,11,6,5,1,350,256,816,868,796,593,11,14,11,9,2,12,298,270,538,618,804,846,2,19,21,11,10,11,218,264,617,645,1022,656,1,27,16,4,11,4,338,416,839,904,1249,627,9,25,26,10,13,3,514,440,754,845,652,1040,24,22,24,12,13,9,391,251,736,688,675,658,22,18,8,9,12,15,6 +381,287,598,877,665,664,19,27,23,3,3,12,386,264,487,696,706,925,22,20,12,14,7,8,286,326,638,839,1103,702,25,24,32,10,15,5,430,294,644,858,898,785,15,24,28,13,9,2,355,311,604,852,1014,679,26,16,32,14,10,11,283,317,495,868,1145,763,25,24,25,12,15,13,363,255,630,725,785,983,16,14,28,13,15,1,405,215,563,748,801,863,19,14,35,14,8,13,536,254,672,890,797,941,37,21,36,13,13,14,374,304,588,832,1068,686,17,18,12,6,10,3,309,367,452,799,988,804,16,9,30,4,12,5,225,219,671,896,759,746,10,30,17,5,2,2,433,207,667,978,827,760,12,22,17,12,5,11,371,239,517,738,829,987,11,9,31,14,15,12,275,263,512,729,1053,779,8,19,26,7,16,13,343,489,692,1004,1280,610,16,23,30,5,12,10,543,373,743,951,657,1105,17,26,34,15,12,14,444,214,593,784,676,557,13,16,8,10,15,14,6 +281,379,720,793,600,664,19,23,20,8,2,13,298,210,563,640,625,859,14,18,11,13,2,9,220,228,730,763,1022,672,17,32,25,13,12,0,398,188,748,796,819,809,23,22,27,16,14,1,349,223,720,800,933,703,18,12,25,17,13,10,197,255,583,812,1064,679,17,30,16,11,12,8,289,241,712,665,704,913,8,18,27,16,12,2,333,317,643,676,720,793,11,24,30,9,5,14,480,244,740,800,742,881,27,25,31,16,10,15,320,246,712,830,987,726,9,16,7,7,11,2,219,337,558,753,907,686,8,19,21,1,7,4,179,271,797,822,678,652,10,22,18,0,3,1,363,287,781,888,746,656,12,16,18,15,0,12,313,301,561,682,748,895,3,19,24,17,12,11,223,289,608,707,972,701,0,29,19,10,13,8,365,453,808,978,1199,638,8,25,31,8,13,5,509,445,811,869,598,1053,25,24,27,18,13,11,412,262,705,708,629,623,21,18,9,11,14,15,6 +322,250,701,679,603,688,14,15,8,8,5,10,459,361,496,606,606,1057,19,32,23,13,5,12,341,445,679,605,981,768,26,18,13,13,17,3,369,459,641,640,802,967,18,24,23,16,19,18,456,456,619,632,898,787,27,26,13,17,18,9,334,368,538,624,1023,767,26,18,0,11,17,1,414,400,511,509,667,1127,13,34,23,16,17,13,488,252,476,546,679,969,16,22,16,9,10,17,539,341,597,678,749,1051,32,17,15,16,13,18,403,381,707,710,946,780,18,20,23,7,14,1,374,302,597,559,866,782,17,25,5,1,12,7,200,234,790,758,637,808,5,6,10,0,4,2,376,192,782,766,705,740,7,14,12,15,5,15,426,274,510,518,709,1035,8,31,8,17,17,8,336,282,517,557,931,811,9,15,5,10,18,1,466,446,761,788,1158,640,17,15,19,8,16,0,468,426,648,735,607,1263,16,18,15,18,16,10,405,235,712,662,656,699,16,28,21,11,19,18,6 +364,320,714,886,630,608,17,18,24,12,6,12,339,215,505,719,645,825,12,23,7,9,8,12,213,299,692,812,1026,618,19,27,19,9,20,3,407,259,718,873,829,769,25,27,23,12,16,2,368,288,682,807,937,645,20,21,19,13,17,9,184,246,581,781,1068,639,19,25,16,7,16,7,284,200,664,724,708,889,6,17,23,12,16,5,304,174,607,765,724,757,9,23,24,5,13,17,487,203,658,899,774,839,33,16,25,12,10,18,305,271,710,803,991,662,11,13,9,11,7,1,252,290,564,728,911,676,10,18,21,5,13,7,238,240,795,911,682,630,8,19,20,4,7,2,382,240,775,987,750,634,10,17,18,11,8,15,296,184,553,715,752,869,1,18,18,13,20,8,188,192,584,722,976,659,2,24,13,6,19,7,328,416,796,951,1203,578,10,20,35,12,9,4,494,304,747,960,632,1033,23,15,21,14,9,10,435,261,697,797,671,561,23,23,13,9,12,18,6 +264,248,740,707,600,648,14,14,14,9,9,12,319,307,549,610,631,943,15,33,23,2,7,10,251,287,722,611,1006,714,22,17,13,10,5,1,331,321,706,696,823,903,18,17,25,17,17,14,352,344,682,690,927,745,23,17,13,14,18,11,266,312,589,678,1050,703,22,15,14,12,11,1,322,302,652,537,702,1005,13,25,23,1,11,9,376,314,609,566,708,861,16,27,18,6,12,15,491,297,706,706,732,953,28,20,19,1,17,16,415,261,744,746,977,762,16,27,29,12,18,1,374,304,600,611,891,682,13,26,19,16,12,5,238,162,829,762,664,684,5,19,4,15,8,0,292,196,793,794,730,660,7,21,2,0,7,13,320,298,595,556,744,931,8,26,12,2,5,10,258,300,592,599,960,737,7,14,9,9,6,3,410,418,810,832,1183,632,13,20,19,9,20,2,518,432,781,775,592,1149,20,19,15,3,20,8,409,281,713,632,613,683,16,25,11,16,15,16,6 +335,283,905,764,652,717,23,14,15,10,8,12,400,312,582,651,697,1072,22,29,20,1,12,14,292,248,813,624,1052,797,17,21,10,3,12,5,266,282,861,761,839,968,9,25,22,10,6,14,279,291,835,721,953,816,16,25,10,7,7,11,223,183,730,675,1096,800,13,19,15,5,10,3,305,227,669,586,778,1140,24,29,20,2,10,9,375,281,656,607,802,992,27,25,15,5,11,19,418,272,619,753,760,1072,31,16,16,2,18,20,336,230,909,733,1031,801,11,21,30,11,1,3,345,193,755,606,955,819,8,24,20,15,7,9,231,201,994,807,758,833,14,9,7,14,9,4,345,207,950,841,800,777,16,13,5,1,10,17,389,245,564,591,824,1068,19,28,9,3,12,8,253,241,723,560,1048,844,16,18,10,10,11,1,297,327,969,827,1253,669,8,14,22,10,3,2,379,403,626,830,644,1288,29,15,12,4,15,12,472,310,880,681,631,692,7,29,12,13,14,20,6 +327,191,718,716,655,713,15,15,14,16,4,10,468,392,479,599,696,1058,20,30,27,5,6,12,370,362,706,642,1093,791,25,20,17,5,18,3,308,404,682,691,888,954,15,20,27,12,12,12,359,427,654,651,1004,810,26,22,17,9,13,9,305,361,553,659,1135,796,25,18,10,7,18,1,385,351,550,544,775,1126,16,28,27,8,16,7,487,279,511,579,791,980,19,26,20,1,11,17,506,370,606,719,787,1060,33,17,19,8,12,18,440,284,724,713,1058,789,17,20,29,13,9,1,393,233,600,590,978,815,16,29,15,9,13,7,181,121,807,781,749,825,6,12,2,8,5,2,371,209,799,807,817,773,8,18,2,7,6,15,451,279,519,543,819,1064,11,29,12,9,18,8,323,273,546,548,1043,840,8,17,9,10,17,1,369,363,790,811,1270,665,16,17,15,16,11,0,449,435,667,780,647,1274,17,16,19,10,11,10,454,244,729,659,666,678,13,26,15,9,14,18,6 +296,192,754,736,677,723,16,16,16,16,9,12,415,393,515,631,728,1092,21,29,25,5,11,10,375,315,684,616,1065,803,30,21,15,5,13,1,271,353,736,713,844,1002,14,25,25,8,3,12,264,402,708,669,956,822,27,25,15,9,4,11,320,302,585,639,1111,802,26,19,8,3,9,1,322,306,594,558,803,1162,23,31,25,8,7,7,456,278,549,585,831,1004,24,23,18,1,10,15,373,339,606,737,781,1086,30,16,17,8,15,16,427,217,756,703,1062,815,18,17,31,13,0,1,314,202,612,570,980,817,17,24,13,9,6,5,200,120,841,805,783,843,9,7,6,8,10,0,394,188,809,825,817,775,13,15,6,7,11,13,384,276,513,553,855,1070,18,28,10,9,13,10,380,278,586,502,1079,846,15,18,7,10,12,3,396,306,828,769,1282,675,17,16,17,16,2,2,288,408,713,798,673,1298,16,15,17,10,14,8,379,333,737,693,626,734,8,27,17,9,11,16,6 +297,285,711,738,612,619,14,24,13,9,6,17,348,326,516,625,653,886,19,21,22,16,10,5,328,304,723,760,1050,677,22,23,26,16,10,4,464,290,743,755,845,818,10,23,38,19,10,5,333,305,707,799,961,704,23,13,26,20,11,12,297,301,576,835,1092,694,22,25,15,14,10,6,345,301,665,640,732,952,21,13,32,19,10,2,393,331,604,651,748,820,22,17,31,12,9,10,506,324,711,751,744,904,32,24,32,19,16,11,372,278,703,851,1015,687,14,19,16,6,9,6,235,313,555,766,935,705,13,12,20,2,5,0,225,201,788,783,706,673,7,27,11,3,5,5,431,227,770,839,774,663,11,25,11,18,8,8,353,275,562,677,776,926,16,14,25,20,10,13,323,273,581,732,1000,716,13,22,20,13,11,8,387,443,801,997,1227,593,13,24,20,11,11,7,543,459,766,812,604,1114,20,25,28,21,13,13,402,210,694,647,623,560,8,15,10,10,12,11,6 +262,198,702,692,661,656,11,16,11,13,4,11,375,319,551,595,690,1003,16,29,22,8,2,11,305,337,666,626,1057,734,29,21,14,8,14,2,345,367,668,681,864,913,19,21,26,11,14,13,330,392,640,687,964,755,30,19,14,12,13,10,304,348,555,693,1101,741,29,19,13,6,14,0,342,336,640,534,763,1073,12,25,22,11,14,8,456,256,575,573,777,923,15,27,19,4,7,16,479,309,706,695,785,1001,29,18,20,11,12,17,449,307,706,757,1032,730,21,19,26,12,13,0,354,336,570,626,954,764,20,26,18,6,9,6,174,186,791,751,733,764,2,15,5,5,3,1,324,152,769,783,795,720,4,21,3,10,2,14,336,316,561,555,805,1011,9,26,13,12,14,9,312,316,560,620,1029,787,12,18,8,7,15,2,414,440,772,859,1250,608,20,18,20,13,15,1,486,400,789,760,653,1223,13,17,16,13,15,9,433,269,695,613,662,645,17,25,12,8,16,17,6 +304,162,639,703,658,656,12,16,9,8,3,10,363,367,524,594,677,1013,15,31,26,13,5,12,273,439,597,629,1054,730,24,19,16,13,17,3,385,469,595,682,871,933,22,29,26,16,17,14,384,488,567,650,979,749,25,33,16,17,16,9,252,348,502,654,1088,723,24,23,3,11,17,1,328,390,615,531,748,1083,9,35,26,16,17,9,382,252,558,562,746,925,12,21,19,9,10,17,501,333,667,702,800,1007,30,18,18,16,9,18,343,327,643,712,1027,778,16,19,24,7,10,1,268,222,519,587,941,738,15,20,6,1,12,7,162,144,728,764,712,764,5,7,9,0,4,2,386,156,714,790,770,696,5,17,11,15,5,15,372,292,544,532,792,991,4,30,11,17,17,8,276,288,497,549,996,767,7,16,8,10,18,1,360,326,703,808,1227,632,15,12,16,8,12,0,498,366,756,767,656,1219,18,17,18,18,12,10,371,299,640,654,687,703,20,29,22,11,15,18,6 +253,145,694,630,590,714,9,14,5,8,8,4,360,348,505,537,615,1039,14,25,26,13,12,10,386,426,676,578,1010,788,33,25,16,13,12,11,360,466,742,607,807,989,19,29,26,16,8,10,301,471,684,573,921,807,32,29,16,17,9,3,349,333,587,589,1052,767,31,23,3,11,10,9,329,379,606,474,696,1099,20,31,26,16,12,13,405,277,561,505,712,951,17,25,19,9,11,7,358,294,676,627,730,1043,27,10,18,16,18,8,406,322,662,657,975,824,23,17,22,7,1,9,241,239,508,526,895,756,22,24,2,1,7,15,235,137,747,697,668,780,12,5,13,0,9,10,393,119,753,715,734,724,16,13,15,15,10,7,363,323,569,475,740,1007,21,26,11,17,12,4,403,321,600,514,964,809,18,22,8,10,11,11,459,347,786,755,1187,680,22,14,16,8,3,10,289,351,711,692,588,1239,11,11,18,18,15,4,290,348,651,591,621,747,11,29,20,11,14,8,6 +288,372,683,821,596,663,22,24,19,10,10,11,361,249,500,682,635,848,21,15,12,17,14,11,289,243,709,819,1032,677,22,29,26,17,10,6,393,197,719,824,827,802,16,17,28,20,2,1,358,226,681,854,943,684,21,11,26,21,3,8,238,282,558,876,1074,704,20,25,13,15,10,14,330,238,651,725,714,910,15,21,28,20,10,4,366,296,590,706,730,780,18,27,31,13,13,16,499,265,681,836,734,862,38,30,32,20,14,17,259,249,673,868,997,707,12,13,2,7,3,0,226,340,519,819,917,723,11,22,16,3,9,6,188,256,758,852,688,673,13,19,15,4,9,3,440,294,752,924,756,681,15,21,23,19,12,14,378,234,500,758,758,902,10,22,25,21,10,9,270,234,559,781,982,714,7,26,20,14,9,14,334,462,775,1034,1209,639,11,30,30,12,5,11,508,434,708,885,590,1038,22,29,28,22,17,13,389,193,680,740,619,594,14,15,14,11,14,17,6 +354,320,874,811,654,672,24,12,15,12,10,11,341,269,567,722,655,961,19,25,16,5,8,13,253,265,772,611,894,732,12,21,6,9,4,4,251,257,816,788,825,935,16,23,16,16,16,15,294,252,792,734,869,749,15,23,6,13,17,10,230,194,699,606,932,681,12,19,7,11,10,2,222,216,632,629,688,1031,17,23,16,2,10,10,392,246,615,654,642,873,20,23,9,9,11,18,387,223,622,806,760,955,28,14,8,2,16,19,421,215,878,640,913,802,10,25,34,15,17,2,356,212,724,575,813,686,7,26,12,19,11,8,276,246,963,874,614,712,15,15,11,18,9,3,268,232,915,894,636,644,17,15,9,3,8,16,258,188,617,626,730,939,12,18,1,1,4,7,276,182,688,513,890,723,9,22,2,8,5,0,394,338,934,666,1097,654,7,14,26,10,19,1,308,366,677,871,648,1167,30,15,8,0,19,11,487,283,845,764,643,733,12,29,18,13,16,19,6 +269,217,726,773,661,667,11,15,19,14,5,12,362,336,517,670,680,988,14,30,18,3,5,10,262,282,672,629,1015,735,25,20,8,3,9,1,314,318,698,736,868,940,23,22,18,8,9,14,317,345,670,682,968,758,26,22,8,7,10,11,257,295,571,620,1045,716,25,18,11,3,9,1,289,259,618,597,727,1050,8,26,18,6,9,9,417,267,567,626,703,900,11,24,11,1,4,15,468,312,656,778,803,988,29,15,10,6,11,16,428,220,730,690,998,793,17,20,34,11,10,1,345,243,588,559,906,713,16,27,16,11,6,5,165,119,815,840,673,731,6,12,11,10,4,0,295,185,785,866,727,683,4,18,11,5,3,13,315,261,555,588,775,964,5,27,3,7,9,10,281,259,562,519,953,754,8,17,6,12,10,3,397,349,798,748,1184,649,16,17,24,14,12,2,433,391,747,835,659,1190,17,16,10,8,12,8,448,276,713,730,690,720,21,26,20,11,13,16,6 +348,298,671,830,637,645,16,19,20,7,2,14,353,239,542,655,668,848,17,24,15,14,2,10,251,323,679,834,1065,665,26,26,31,14,14,3,443,295,693,813,860,760,20,28,31,17,14,0,382,312,665,815,976,668,27,20,31,18,13,9,232,296,554,851,1107,710,26,24,20,12,14,11,320,234,681,708,747,896,11,18,31,17,14,3,368,176,618,745,763,790,14,22,36,10,7,15,525,225,715,843,777,876,34,17,37,17,8,16,313,309,665,839,1030,677,18,16,11,6,9,1,244,336,517,788,950,727,17,17,25,0,9,5,152,220,750,859,721,667,7,22,16,1,3,0,412,204,734,931,789,693,9,18,16,16,2,13,330,206,566,713,791,916,6,17,30,18,14,10,242,224,579,754,1015,724,9,23,25,11,15,11,340,458,763,1021,1242,609,17,19,27,9,11,8,554,324,798,904,633,1052,16,18,33,19,11,14,423,223,658,739,660,544,18,24,7,10,16,16,6 +251,273,688,786,587,654,10,19,19,12,12,14,302,294,573,691,632,993,11,26,16,5,10,8,266,276,676,632,1025,732,26,20,8,13,2,1,308,280,678,751,820,933,18,16,18,16,14,12,273,303,650,689,936,751,27,16,8,15,15,13,327,305,541,593,1067,715,26,16,21,15,8,3,267,267,682,612,707,1055,15,18,16,2,8,7,429,269,613,643,727,905,14,24,11,9,9,13,392,290,740,795,719,993,28,23,12,2,14,14,482,256,690,675,990,768,18,26,32,15,15,3,379,325,558,536,910,712,17,25,24,19,9,3,253,183,775,847,681,736,3,24,11,18,11,2,261,199,743,883,749,682,5,24,9,3,10,11,243,271,581,601,755,963,10,19,13,1,2,12,331,273,552,516,979,755,9,23,16,8,3,5,473,449,762,729,1202,624,17,23,26,10,17,4,379,399,829,848,579,1195,16,22,8,0,17,10,416,228,665,733,598,691,14,22,16,13,16,14,6 +378,350,728,828,624,661,18,22,19,9,3,15,375,177,523,657,647,816,13,21,12,12,3,9,261,269,724,806,1044,673,18,29,30,12,11,2,413,201,754,825,843,780,24,23,28,15,11,1,348,222,716,829,955,682,19,13,30,16,12,10,244,264,583,853,1086,682,18,27,23,10,11,10,356,218,682,700,726,856,7,17,28,15,11,2,380,268,623,729,742,756,10,23,35,8,6,14,549,193,704,835,764,850,32,24,36,15,11,15,335,279,720,849,1009,707,10,17,10,8,12,2,310,356,566,794,929,675,9,18,26,2,6,4,210,276,805,849,700,627,9,23,19,1,2,1,420,256,791,923,768,643,11,19,19,14,1,12,362,260,533,715,770,876,2,18,29,16,11,11,228,270,604,734,994,706,1,26,24,9,12,10,304,476,818,1021,1221,633,9,24,30,9,14,7,556,382,757,904,620,1010,24,23,32,17,14,13,415,249,713,737,647,588,22,19,10,12,13,15,6 +221,261,668,734,657,602,8,15,13,11,5,11,300,264,589,621,664,941,13,30,18,0,3,11,260,308,646,634,957,676,28,20,14,4,9,2,322,310,658,739,830,851,18,20,26,11,15,11,305,331,630,747,890,703,29,18,14,8,14,10,269,319,551,733,1007,691,28,18,17,6,9,0,291,313,702,560,707,1011,13,26,20,3,9,6,385,301,639,579,697,861,16,30,19,4,8,16,446,264,740,729,781,939,26,21,20,3,13,17,400,298,670,789,964,700,20,22,26,10,14,0,351,345,548,666,870,706,19,27,20,14,8,6,233,209,755,769,655,706,1,18,9,13,4,1,281,189,727,817,707,662,3,22,7,2,3,14,287,347,601,593,751,953,8,27,13,4,9,9,265,347,576,630,949,729,11,17,12,11,10,2,399,455,742,877,1166,582,19,21,24,11,16,1,481,415,847,802,653,1161,14,20,16,5,16,9,390,304,653,643,644,621,16,26,8,14,15,17,6 +376,212,764,799,674,707,18,15,15,10,10,12,339,305,485,700,691,1052,15,28,20,3,8,10,239,355,724,601,1024,781,26,22,10,9,6,1,277,377,736,786,879,984,22,26,20,16,18,14,338,386,708,732,957,804,27,28,10,13,19,11,276,276,593,600,1068,766,26,22,7,11,12,1,290,294,582,623,740,1122,9,24,20,0,12,9,402,216,541,642,744,964,12,26,13,7,13,15,461,269,598,794,804,1046,36,15,12,0,18,16,441,305,768,624,1005,817,18,26,32,13,19,1,410,244,622,573,921,781,17,25,12,17,13,5,296,146,853,862,700,803,9,14,11,16,9,0,286,118,833,882,762,739,11,12,9,1,8,13,314,262,525,622,788,1032,6,21,5,1,6,10,298,262,592,527,996,808,9,21,2,8,7,3,390,384,836,682,1217,675,17,13,22,8,21,2,392,350,675,863,670,1258,16,14,12,2,21,8,467,289,761,752,691,740,20,30,22,15,14,16,6 +334,328,791,800,539,599,18,16,15,13,6,11,249,277,596,723,494,752,13,29,16,8,4,17,147,393,777,638,779,597,18,19,6,8,8,8,459,329,727,775,646,774,24,35,16,11,12,13,426,352,727,727,732,584,19,35,6,12,11,10,176,286,610,615,801,576,18,23,7,6,8,6,242,288,593,620,483,842,7,21,16,11,8,16,244,222,598,645,539,682,10,11,9,4,3,18,401,185,719,797,643,758,28,16,8,11,10,19,281,309,795,697,746,699,10,19,30,12,9,6,176,276,641,584,654,607,9,14,12,6,3,12,278,264,880,871,499,585,9,15,11,5,5,7,380,234,872,885,521,581,11,25,9,10,4,16,218,184,530,621,527,720,2,16,1,12,8,9,186,188,631,514,709,592,1,16,2,7,9,4,376,338,841,761,940,591,9,16,26,13,11,5,456,268,754,856,525,948,24,17,8,13,11,11,349,299,776,767,622,714,22,27,18,8,12,19,6 +263,281,599,829,586,623,9,26,19,9,2,11,296,200,570,688,613,874,14,23,12,16,6,7,270,360,641,823,1000,655,29,21,26,16,16,6,454,274,671,878,803,782,17,21,28,19,14,3,371,303,633,910,911,656,30,15,26,20,15,12,277,341,502,920,1042,706,29,23,17,14,16,14,339,291,687,733,694,938,20,17,28,19,16,0,361,271,616,712,710,808,17,19,31,12,9,12,504,226,755,834,716,890,27,22,32,19,12,15,350,346,583,904,965,653,21,13,8,6,11,4,243,409,451,861,885,743,20,12,20,2,11,6,247,287,668,844,662,685,6,25,21,3,3,3,379,205,658,922,724,701,10,23,21,18,4,10,325,303,576,780,738,926,15,16,25,20,16,13,267,315,535,825,962,718,12,22,20,13,17,14,397,531,693,1092,1181,577,20,22,30,11,13,11,557,387,834,905,580,1082,13,27,28,21,13,15,372,250,574,730,605,538,9,13,12,10,16,13,6 +363,311,687,662,604,629,18,26,16,9,11,12,342,316,512,527,645,886,13,21,17,6,9,10,272,264,685,648,1042,657,18,25,27,12,7,1,458,258,695,663,837,830,24,23,33,15,19,4,407,289,667,693,953,690,19,13,27,14,20,9,279,301,564,727,1084,672,18,23,22,10,13,5,363,305,661,538,724,954,7,13,33,7,13,3,429,335,598,563,740,814,10,19,32,8,14,15,540,324,673,667,736,896,28,24,33,7,19,16,424,250,685,745,1007,703,10,17,15,8,20,1,331,325,545,658,927,689,9,18,23,10,14,5,215,217,770,705,698,675,9,23,14,9,10,0,403,245,750,755,766,647,11,21,14,6,9,13,341,279,550,563,768,920,2,14,26,8,7,10,279,283,571,616,992,704,1,22,21,5,8,5,421,443,771,889,1219,601,9,28,25,9,22,2,589,477,768,736,596,1102,24,23,29,9,22,8,424,218,678,579,615,616,22,15,5,12,13,16,6 +342,348,845,787,585,714,23,13,25,12,9,10,349,319,526,648,636,907,24,30,8,1,11,12,271,199,791,637,1023,760,23,20,14,9,13,3,255,205,827,778,818,901,11,22,22,16,1,10,196,244,799,730,934,799,14,22,14,13,2,9,174,160,676,656,1065,737,13,18,27,11,9,1,262,192,647,615,709,965,20,24,16,4,7,5,342,308,628,640,737,843,23,26,15,3,10,17,395,293,627,792,717,947,33,15,16,4,13,18,267,185,847,690,988,806,5,24,26,9,0,1,318,202,693,595,908,690,4,25,32,13,6,7,234,248,932,826,689,690,14,16,19,12,10,2,348,282,894,880,747,660,16,18,17,3,11,15,366,260,514,612,761,929,15,25,19,5,13,8,244,244,677,521,985,769,12,17,22,12,12,1,230,322,919,784,1202,696,4,15,34,12,2,0,376,426,626,857,579,1103,29,16,12,6,14,10,445,293,822,706,596,671,11,28,12,13,11,18,6 +173,225,629,737,627,683,12,15,17,10,10,6,338,366,516,648,676,1018,17,26,16,11,14,12,364,326,615,623,1063,759,32,24,16,11,10,9,346,318,685,764,858,900,18,24,28,14,2,14,271,383,629,770,974,780,31,22,16,15,3,7,319,395,536,746,1105,776,30,22,19,9,10,11,339,335,619,565,749,1084,23,30,22,14,10,13,369,279,552,576,773,946,20,28,21,7,13,7,388,344,679,726,757,1024,28,21,22,14,14,6,380,262,627,792,1028,753,22,14,24,9,3,11,305,355,523,679,948,799,21,31,24,3,9,11,165,187,712,772,725,787,11,10,11,2,9,10,375,197,710,814,787,755,15,18,9,13,12,9,383,315,552,608,801,1038,20,27,15,15,10,8,355,311,527,623,1025,816,17,21,14,8,9,13,361,445,761,894,1244,639,21,23,26,10,5,12,397,407,774,803,621,1246,12,20,18,16,17,2,296,278,620,638,636,614,10,24,6,11,14,6,6 +299,289,652,849,623,641,15,25,20,9,11,9,398,226,541,738,664,842,20,26,15,16,15,9,338,340,690,823,1061,655,29,16,35,16,9,10,422,276,732,930,856,710,15,16,31,19,3,1,399,305,696,980,972,630,28,20,35,20,4,10,305,309,535,1020,1103,724,27,18,22,14,9,18,393,281,674,785,743,896,22,26,31,19,11,2,367,273,607,694,759,780,23,20,38,12,14,14,574,240,728,804,757,864,31,23,39,19,13,17,224,316,634,890,1026,639,19,14,9,6,4,4,291,367,486,947,946,763,18,15,23,2,10,10,299,247,719,836,717,675,8,26,20,3,10,7,457,203,725,892,785,731,12,24,22,18,13,12,431,287,547,840,787,912,17,27,34,20,9,11,293,291,568,791,1011,726,14,19,29,13,8,18,303,487,750,1072,1238,589,18,23,27,11,6,15,611,391,795,925,615,1024,15,34,37,21,18,13,340,252,627,696,640,512,7,8,13,10,15,15,6 +334,210,701,690,647,652,14,19,15,12,8,11,381,339,460,605,670,993,19,32,22,9,6,11,263,339,671,578,1049,726,24,18,12,9,10,2,369,383,661,663,864,927,18,22,22,12,16,15,376,384,633,619,966,745,25,22,12,11,17,10,274,316,530,589,1091,705,24,16,7,7,10,0,320,292,533,516,733,1063,13,26,22,8,10,10,434,230,482,543,747,905,16,20,15,5,11,16,495,317,577,689,787,987,32,17,16,8,16,17,423,283,705,669,1014,762,16,20,24,11,17,0,330,246,557,528,934,718,15,27,12,9,11,6,204,136,790,759,705,744,5,10,5,8,7,1,348,170,776,777,773,676,7,18,5,7,6,14,346,234,486,515,777,971,8,25,9,9,10,9,288,228,523,518,999,747,7,15,4,6,11,2,442,378,769,739,1226,618,15,19,20,12,19,1,484,382,638,750,643,1199,18,18,14,10,19,9,455,247,704,625,670,685,16,24,18,9,16,17,6 +215,223,740,735,607,708,11,14,7,9,4,11,362,348,533,632,620,1041,16,31,24,12,6,11,306,294,700,631,995,782,25,19,14,12,10,2,286,326,712,732,812,983,15,19,24,15,8,13,337,357,684,722,922,801,26,23,14,16,9,10,239,307,573,694,1033,761,25,17,1,10,10,0,299,271,618,563,689,1111,16,31,24,15,10,8,397,269,553,578,693,953,19,23,17,8,5,16,408,326,668,730,739,1039,29,18,16,15,12,17,342,246,744,756,968,818,17,19,22,8,9,0,279,265,590,635,884,766,16,30,4,2,7,6,137,135,829,798,657,792,2,7,11,1,3,1,351,177,809,818,715,724,6,19,13,14,4,14,361,301,547,586,735,1019,11,32,9,16,10,9,275,297,568,565,941,803,8,16,6,9,11,2,389,383,812,834,1168,674,16,20,18,9,11,1,381,403,733,799,605,1247,17,17,16,17,11,9,306,290,737,684,658,741,13,25,20,12,12,17,6 +300,232,703,705,632,672,17,17,12,13,3,13,373,379,422,592,665,1027,20,30,19,8,7,9,293,265,693,617,1052,750,21,20,15,8,15,0,371,301,699,702,857,929,17,20,27,11,11,9,324,350,665,706,967,769,22,20,15,12,12,12,258,306,546,702,1094,755,21,18,14,6,15,2,330,302,573,531,734,1095,14,24,21,11,15,4,398,294,530,556,750,945,17,24,20,4,8,14,503,359,573,700,768,1027,35,17,21,11,13,15,357,243,701,756,1017,756,13,18,23,12,10,2,310,250,565,633,937,772,12,25,19,6,10,4,178,142,786,750,708,788,8,14,8,5,2,1,378,202,772,788,776,730,10,22,6,10,5,12,390,280,484,554,780,1021,9,25,14,12,15,11,272,274,547,579,1002,797,6,17,9,7,16,4,338,382,781,850,1229,624,12,19,23,13,12,3,498,448,654,773,626,1225,21,16,17,13,12,9,427,249,700,614,649,667,15,24,11,8,15,15,6 +206,226,728,700,646,602,12,11,13,12,8,4,267,271,655,607,657,877,7,24,26,9,10,12,273,371,770,600,986,662,24,26,16,9,20,13,343,345,784,687,839,847,26,26,26,12,16,8,212,358,770,665,911,687,25,26,16,13,17,5,224,260,577,639,1030,619,24,24,5,7,16,11,226,304,772,526,720,945,9,32,26,12,16,11,314,236,723,553,724,799,6,30,19,5,15,11,345,219,790,695,766,877,26,11,18,12,10,12,345,315,718,711,979,716,16,18,28,11,7,11,206,216,568,572,893,632,15,29,10,5,13,17,178,162,803,763,676,642,11,6,7,4,9,12,330,138,783,783,734,588,15,14,7,11,10,9,258,224,595,523,762,883,10,25,11,13,20,4,296,224,638,546,976,663,7,23,8,6,19,9,350,352,808,795,1193,588,15,13,16,12,9,10,348,350,813,764,640,1099,18,10,18,14,9,4,319,287,705,637,641,637,14,30,20,9,12,12,6 +296,210,689,750,656,694,15,19,20,9,10,12,335,315,486,669,669,995,14,24,23,2,8,10,277,345,647,584,1012,762,27,22,13,8,4,1,301,359,655,717,867,967,23,22,23,15,16,16,306,358,627,661,957,781,28,20,13,12,17,11,340,316,524,567,1048,727,27,20,12,10,10,1,278,310,589,566,722,1047,8,16,23,1,10,11,438,252,532,599,704,907,11,22,16,6,11,15,435,295,653,749,800,1001,33,17,15,1,16,16,513,283,693,649,993,822,19,26,37,12,17,1,412,284,543,504,899,706,18,23,17,16,11,5,242,176,778,825,672,728,6,18,10,15,9,0,258,160,760,837,730,686,8,20,10,0,8,13,278,250,522,557,766,955,7,17,8,2,4,10,354,246,525,488,956,765,10,23,7,9,5,3,454,408,757,699,1185,674,18,21,19,9,19,2,390,388,722,804,654,1191,15,16,15,3,19,8,445,247,686,725,685,749,21,22,19,16,16,16,6 +277,305,727,779,607,626,16,16,14,12,3,11,342,356,510,702,598,929,15,27,17,9,7,11,248,330,709,641,915,686,20,23,7,9,17,2,340,362,683,726,762,889,22,23,17,12,13,17,331,329,655,644,848,703,21,25,7,13,14,10,259,321,574,574,957,639,20,21,6,7,17,0,251,295,607,595,607,999,9,29,17,12,17,12,391,241,558,634,621,841,12,25,10,5,10,16,404,334,653,778,747,923,34,14,9,12,13,17,392,242,731,680,886,756,12,15,27,11,12,0,245,235,587,535,800,654,11,26,11,5,12,6,167,223,816,856,575,680,7,9,10,4,4,1,331,237,804,866,651,612,9,17,8,11,5,14,273,149,580,584,649,907,4,28,2,13,17,9,279,149,553,547,865,687,3,20,1,6,16,2,441,361,791,740,1092,608,11,18,25,12,14,1,389,397,684,831,609,1135,22,13,9,14,14,9,366,204,732,742,670,687,20,25,19,9,15,17,6 +278,188,688,644,655,662,11,15,9,16,4,10,389,301,531,553,686,1027,16,30,24,5,4,12,343,359,614,578,1079,742,29,20,16,5,10,3,335,383,632,639,880,937,17,22,28,8,10,16,292,384,608,639,990,761,30,22,16,9,9,9,278,304,513,657,1121,745,29,18,13,3,10,1,344,330,574,482,761,1097,20,28,24,8,10,11,452,224,509,513,777,939,19,24,21,1,3,17,463,279,634,637,791,1021,29,15,22,8,10,18,423,333,692,729,1044,750,21,18,26,13,9,1,344,288,538,586,964,764,20,27,16,9,5,7,170,192,777,695,735,778,6,10,3,8,3,2,388,96,751,725,803,722,10,18,3,7,2,15,370,300,487,495,805,1013,15,29,15,9,10,8,294,302,510,558,1029,789,12,17,10,10,11,1,376,428,752,817,1256,614,20,17,18,16,11,0,446,376,715,710,649,1233,13,16,18,10,11,10,423,295,679,555,672,669,9,26,12,9,12,18,6 +294,188,745,684,654,713,15,13,12,12,2,11,427,357,524,597,663,1060,20,30,23,9,4,13,327,383,707,556,984,793,27,20,13,9,14,4,293,427,673,657,851,992,17,24,23,12,14,17,392,420,659,643,931,812,28,28,13,13,15,10,270,352,570,607,1026,782,27,20,4,7,14,2,364,328,533,502,704,1124,14,36,23,12,14,12,432,206,494,529,686,972,17,24,16,5,7,18,491,325,603,681,790,1060,33,17,15,12,10,19,411,293,749,681,969,817,19,18,31,11,11,2,358,250,619,536,877,779,18,25,9,5,9,8,164,154,834,755,654,805,6,4,10,4,1,3,336,144,820,769,702,749,8,14,10,11,2,16,422,250,520,501,748,1032,9,31,8,13,14,7,302,250,555,494,936,822,10,17,5,6,15,0,380,384,801,747,1163,675,18,15,19,12,13,1,406,366,672,742,652,1262,15,16,15,14,13,11,397,249,748,649,683,738,15,30,21,9,16,19,6 +291,201,719,769,694,654,12,15,13,16,1,11,338,326,552,664,745,1023,17,26,20,5,3,11,258,384,661,673,1092,734,28,24,16,5,15,2,322,406,683,758,871,933,16,28,28,8,15,13,287,407,653,710,983,753,29,30,16,9,14,10,197,281,556,698,1138,737,28,24,13,3,15,0,251,301,599,601,818,1093,15,32,22,8,15,8,371,189,546,632,844,935,18,26,21,1,8,16,422,270,659,770,806,1017,30,13,22,8,9,17,362,318,723,762,1087,746,20,18,22,13,8,0,243,241,585,627,1003,754,19,25,18,9,10,6,145,163,808,808,796,774,3,8,7,8,2,1,347,107,782,858,838,712,5,12,5,7,3,14,321,263,538,596,870,1003,10,27,15,9,15,9,249,263,551,591,1094,779,11,21,10,10,16,2,339,361,791,848,1305,606,19,13,22,16,10,1,403,303,750,839,688,1229,14,12,18,10,10,9,412,310,710,678,653,665,14,30,12,9,17,17,6 +276,306,846,750,654,701,22,17,22,10,8,12,335,311,553,653,685,958,17,30,21,1,12,10,239,201,788,572,1042,753,14,16,11,7,8,1,235,239,826,745,867,956,20,20,21,14,4,14,260,278,798,703,967,772,15,20,11,11,5,11,220,224,677,615,1078,706,14,14,14,9,10,1,254,246,648,570,764,1022,11,22,21,2,8,9,360,332,625,585,762,870,14,22,14,5,11,15,407,299,638,737,772,964,32,19,13,2,14,16,359,207,850,685,1017,817,6,28,39,11,5,1,324,242,696,562,933,685,5,27,19,15,7,5,196,208,935,805,726,705,13,18,14,14,7,0,288,250,903,825,768,651,15,18,14,1,10,13,328,256,557,575,804,936,6,23,6,3,8,10,256,258,676,488,1010,752,3,17,9,10,9,3,344,366,918,739,1225,677,5,17,21,10,7,2,370,452,693,814,646,1158,28,20,13,4,15,8,433,277,829,695,653,750,18,26,23,15,12,16,6 +314,154,698,726,644,731,11,16,19,10,2,11,419,345,549,615,693,1062,16,29,24,9,2,13,329,353,642,602,1050,811,27,21,14,11,14,4,307,387,658,713,843,960,15,25,24,12,12,13,338,410,630,675,959,834,28,27,14,11,13,10,272,306,551,639,1094,808,27,21,11,9,14,2,316,308,620,552,766,1128,18,31,24,6,14,8,458,244,565,575,790,990,19,25,17,7,7,18,459,305,680,727,762,1068,29,16,16,6,8,19,455,259,702,693,1041,819,19,19,32,9,9,2,350,224,582,572,959,823,18,24,16,11,9,8,164,96,787,789,742,833,4,9,7,10,3,3,348,148,761,815,792,779,8,13,7,7,2,16,384,294,555,555,818,1074,13,28,9,7,14,7,304,294,536,514,1042,850,10,18,6,4,15,0,386,340,766,773,1259,697,18,14,18,10,11,1,398,382,771,792,638,1290,15,15,16,8,11,11,429,305,689,675,623,682,11,29,16,9,16,19,6 +240,322,683,729,623,684,14,24,18,15,6,15,367,315,578,626,672,1015,11,27,19,6,10,7,333,317,649,579,1039,764,22,21,9,6,14,2,347,255,687,732,834,913,18,21,21,9,12,9,320,322,657,712,950,787,23,11,9,10,13,14,330,344,560,668,1081,761,22,19,18,4,14,4,354,346,691,551,745,1081,17,19,19,9,14,4,388,378,626,564,769,943,14,25,14,2,9,12,387,333,737,712,741,1021,30,26,15,9,16,13,469,289,681,732,1020,772,14,17,33,14,13,4,372,372,561,599,938,776,13,22,23,8,15,2,220,254,766,770,721,786,7,21,8,7,5,3,352,260,744,800,771,732,11,21,6,8,8,10,356,338,608,560,797,1027,16,20,10,10,14,13,338,338,563,545,1021,803,13,20,13,9,13,6,452,484,763,816,1238,650,13,26,23,15,15,5,422,506,836,793,617,1243,20,25,11,11,15,11,357,249,662,634,612,635,8,17,15,8,12,13,6 +274,170,692,732,642,687,7,17,9,13,1,10,333,315,541,639,657,1006,12,26,22,8,3,12,263,421,640,626,1020,755,29,24,12,8,13,3,353,433,644,713,839,958,19,30,22,11,15,16,336,446,616,657,945,774,30,32,12,12,14,9,244,308,527,625,1058,726,29,26,1,6,13,1,278,342,636,554,714,1074,12,34,22,11,13,11,392,242,575,583,714,918,15,24,15,4,6,17,425,263,708,725,786,1006,25,13,14,11,9,18,369,329,696,697,993,803,21,18,24,12,10,1,246,262,542,562,907,729,20,23,6,6,8,7,156,154,781,797,680,755,2,8,9,5,2,2,358,104,761,813,740,691,2,14,11,10,1,15,314,306,559,549,758,982,9,27,7,12,13,8,278,304,532,542,966,768,12,21,4,7,14,1,396,366,756,781,1193,657,20,13,20,13,12,0,402,312,759,794,644,1210,13,12,14,13,12,10,349,339,689,675,683,728,17,30,22,8,15,18,6 +411,319,958,736,600,696,31,15,20,11,6,12,396,352,655,647,643,953,26,32,23,4,10,14,282,298,812,556,982,748,5,18,13,8,14,5,318,328,882,725,775,943,21,26,23,15,8,16,335,299,872,675,891,767,16,28,13,12,9,11,259,187,779,577,1026,691,11,22,12,10,14,3,289,281,656,566,730,1021,20,28,23,1,16,13,393,293,679,585,758,873,23,26,16,8,9,19,454,284,634,733,690,953,23,19,15,1,16,20,416,228,962,635,971,820,11,26,37,14,9,3,361,141,808,534,889,696,8,25,17,18,13,9,305,261,1047,799,710,726,22,16,12,17,5,4,359,237,989,821,726,652,24,14,12,2,8,17,335,209,671,565,772,949,15,29,8,0,14,8,263,181,768,506,992,735,12,15,7,7,13,1,375,279,1014,701,1191,682,8,11,19,9,11,2,389,407,663,802,590,1171,37,18,15,1,13,12,534,282,921,691,553,725,15,28,21,14,12,20,6 +227,255,782,712,697,646,16,12,13,14,2,11,336,294,611,609,706,989,13,31,20,7,4,11,250,270,686,646,993,724,20,19,16,7,14,2,294,302,748,715,800,897,16,21,28,10,14,13,313,315,720,713,878,745,21,21,16,11,13,10,215,257,613,717,1045,733,20,17,13,5,14,0,265,265,678,560,791,1057,21,29,22,10,14,8,387,265,623,581,801,911,18,27,21,3,7,16,444,258,714,705,789,989,28,16,22,10,10,17,386,230,786,789,1018,718,20,21,22,13,11,0,305,281,632,652,934,756,17,28,18,7,9,6,153,197,871,757,753,752,7,13,7,6,1,1,283,179,829,793,787,712,11,17,5,9,2,14,303,285,561,581,825,1001,16,30,15,11,14,9,233,283,618,644,1045,779,13,16,10,8,15,2,405,389,854,883,1210,600,17,16,22,14,13,1,413,383,803,782,689,1211,22,17,18,12,13,9,402,296,757,619,650,629,12,29,12,7,16,17,6 +397,279,879,802,665,663,21,14,23,12,12,10,358,284,596,709,696,954,16,27,20,5,10,12,264,302,769,596,1015,699,15,21,10,5,2,3,292,314,811,787,824,892,27,25,20,12,14,16,275,307,793,731,924,706,20,25,10,9,15,9,253,213,702,605,1055,664,19,19,15,7,8,1,251,217,645,620,775,1024,10,23,20,2,8,11,397,213,618,639,773,866,13,25,13,9,9,17,442,240,635,791,773,948,25,16,12,2,14,18,422,260,883,635,1018,783,13,23,38,15,15,1,409,213,737,574,936,679,12,24,20,19,11,7,253,209,968,863,739,713,12,15,15,18,11,2,267,187,924,879,773,637,14,13,15,3,10,15,283,201,612,621,813,932,5,20,7,1,2,8,287,205,689,490,1021,708,4,20,10,8,3,1,337,345,935,677,1216,641,12,14,22,10,17,0,389,333,726,864,657,1160,27,15,12,0,17,10,454,312,854,749,648,728,19,29,24,13,16,18,6 +238,268,694,677,669,692,11,16,14,12,5,13,381,311,529,610,712,1005,16,33,23,9,3,9,329,335,668,595,1089,758,27,17,13,9,9,0,377,335,682,728,876,917,21,17,25,12,15,11,368,398,654,746,990,789,28,15,13,13,14,12,342,404,547,736,1133,755,27,15,16,7,9,2,392,398,656,527,789,1071,10,29,23,12,9,6,458,394,597,518,809,933,13,27,18,5,8,14,533,341,694,664,793,1011,29,22,19,12,13,15,415,319,696,796,1064,790,19,21,31,11,14,2,398,408,552,667,986,770,18,30,19,5,8,4,190,230,781,728,765,776,4,15,6,4,4,1,366,244,761,752,825,726,4,23,4,11,3,12,380,420,565,590,837,1019,7,30,12,13,9,11,324,422,556,613,1061,795,10,14,11,6,10,4,374,480,772,884,1282,664,18,22,19,12,16,3,552,494,785,743,661,1233,15,21,15,14,16,9,397,351,689,590,666,657,19,25,11,9,15,15,6 +273,263,735,713,612,646,12,14,14,12,11,11,346,302,552,608,661,965,13,33,21,1,9,11,244,294,695,603,1034,720,24,17,11,7,7,2,312,312,701,712,827,893,16,17,23,14,19,13,305,325,673,702,943,747,25,19,11,11,20,10,235,281,580,684,1078,715,24,15,20,9,13,0,315,289,627,539,734,1033,17,27,21,4,13,8,403,295,574,576,758,885,16,27,16,3,14,16,492,292,695,706,738,965,30,20,17,4,19,17,352,278,739,742,1013,742,16,25,31,9,20,0,377,281,597,615,933,724,15,28,19,13,14,6,201,181,824,754,710,728,3,17,10,12,10,1,321,197,794,794,766,680,7,21,8,3,9,14,339,241,584,542,786,973,12,28,12,5,7,9,225,241,569,581,1010,751,9,14,15,12,8,2,333,407,805,846,1229,620,15,20,21,12,22,1,503,425,760,779,606,1185,18,19,13,6,22,9,416,232,718,624,605,635,12,27,11,13,13,17,6 +286,246,767,736,661,672,15,13,17,10,10,12,323,319,494,655,674,957,10,30,22,1,8,10,239,313,731,560,1013,708,21,20,12,9,4,1,283,333,719,717,872,901,27,20,22,16,16,16,290,330,695,669,962,719,22,22,12,13,17,11,250,290,604,599,1039,677,21,18,9,11,10,1,286,288,611,552,727,1021,4,22,22,2,10,11,402,264,576,575,699,869,7,28,15,5,11,15,465,303,645,727,805,957,29,17,14,2,16,16,405,261,771,669,998,792,13,28,36,11,17,1,396,258,621,530,902,676,12,25,14,15,11,5,192,174,856,807,675,706,10,18,11,14,9,0,276,176,840,815,721,644,8,18,11,1,8,13,306,232,570,551,771,929,1,23,7,3,4,10,244,226,597,502,947,719,4,19,4,10,5,3,354,382,831,721,1182,650,12,17,20,10,19,2,442,408,698,796,659,1157,21,16,14,4,19,8,415,225,766,689,690,737,23,28,20,15,16,16,6 +278,268,642,785,620,721,11,23,19,9,10,12,299,269,567,658,669,1030,12,20,20,2,8,10,261,327,648,629,1040,791,29,22,10,10,4,1,349,299,646,772,835,898,25,12,20,17,16,8,316,358,618,720,951,816,30,12,10,14,17,11,310,340,523,642,1084,810,29,18,19,12,10,1,296,296,666,609,742,1092,6,12,20,1,10,3,384,302,601,632,766,968,9,22,13,6,11,15,469,273,732,784,744,1048,29,25,12,1,16,16,465,313,640,684,1019,813,21,20,34,12,17,1,422,338,524,575,939,827,20,23,22,16,11,5,250,198,725,840,718,821,8,28,9,15,9,0,240,194,705,872,772,783,4,24,7,0,8,13,302,330,589,608,794,1072,9,17,11,2,4,10,312,334,532,517,1018,850,12,23,14,9,5,3,408,476,720,774,1235,703,20,25,22,9,19,2,476,414,827,853,614,1218,13,24,12,3,19,8,361,275,631,720,613,668,23,18,16,16,16,16,6 +351,463,762,953,607,837,23,25,33,13,14,12,342,218,559,784,654,1080,22,12,14,6,12,12,258,178,692,773,971,881,13,30,24,8,0,3,270,150,780,946,756,910,19,20,14,15,12,2,229,217,752,890,872,840,26,10,24,12,13,9,199,241,609,750,1017,924,21,26,37,10,10,7,205,125,678,787,737,1132,26,10,14,3,6,5,371,305,623,812,765,1024,27,14,21,10,7,17,416,288,678,964,695,1070,27,27,22,3,12,18,364,264,758,722,976,871,21,12,16,16,13,1,379,357,626,727,894,947,18,19,40,20,15,7,231,359,843,990,717,909,14,30,29,19,13,2,259,391,799,1052,735,903,16,20,27,4,12,15,275,291,567,782,783,1160,21,11,29,2,0,8,259,303,618,597,1003,950,18,29,32,9,1,7,321,453,842,814,1194,797,18,27,44,11,17,4,381,433,809,1029,601,1178,29,26,22,1,15,10,454,298,729,874,550,712,7,16,22,12,16,18,6 +323,361,655,946,623,803,11,20,36,11,15,11,344,240,530,779,670,1044,16,23,15,4,13,13,270,258,647,766,1047,847,29,23,25,12,1,4,284,226,657,913,842,904,17,19,15,17,11,5,241,295,629,839,958,830,30,17,25,16,12,10,221,303,526,697,1089,876,29,19,38,14,11,4,219,143,655,778,745,1100,14,15,15,1,5,6,401,223,590,809,767,990,17,21,22,8,8,18,420,254,707,961,749,1052,29,22,23,1,11,19,400,268,653,681,1024,863,21,25,15,14,12,2,341,349,523,680,944,897,20,26,43,18,16,8,181,253,738,985,719,865,2,23,28,17,14,3,297,299,712,1049,777,853,4,23,26,2,13,16,281,273,582,767,795,1118,9,16,30,0,1,9,265,301,529,552,1019,904,12,26,33,7,2,4,337,443,733,755,1240,781,20,22,43,9,18,1,395,351,794,1014,617,1168,13,21,23,1,14,11,466,258,640,871,620,706,15,21,21,14,15,19,6 +298,194,722,656,660,682,10,16,17,13,1,11,431,363,523,583,701,997,13,29,26,8,3,13,335,391,680,534,1098,750,26,21,16,8,15,4,333,437,652,631,893,955,24,23,26,11,15,17,382,432,636,607,1009,769,27,25,16,12,16,10,294,370,555,581,1140,719,26,19,9,6,15,2,362,354,582,474,780,1059,7,31,26,11,15,14,464,258,535,505,796,909,10,25,19,4,8,18,501,339,674,651,792,997,28,16,18,11,9,19,463,315,726,665,1063,810,18,17,36,12,10,2,380,248,578,508,983,716,17,26,14,6,10,8,176,160,811,731,754,740,7,7,11,5,2,3,332,186,797,739,822,686,3,15,11,10,3,16,412,270,559,471,824,967,6,30,11,12,15,7,318,264,544,476,1048,759,9,18,8,7,16,0,396,392,778,727,1275,662,17,16,16,13,12,1,462,402,705,716,652,1199,16,15,18,13,12,11,421,247,725,629,671,737,22,27,20,8,17,19,6 +355,417,760,916,629,815,21,16,34,11,14,10,328,192,565,763,674,1078,20,15,15,4,12,12,262,192,684,730,997,863,15,29,25,6,0,3,242,152,766,909,782,938,19,17,15,13,12,4,227,191,738,849,898,840,26,15,25,10,13,9,219,207,609,713,1043,892,21,25,38,8,10,5,221,143,674,752,759,1136,24,19,15,1,6,5,363,293,613,773,787,1016,25,23,22,8,7,17,392,248,694,925,719,1080,27,22,23,1,12,18,390,256,758,685,1000,875,21,15,15,14,13,1,393,335,630,692,918,911,18,24,41,18,15,7,261,337,843,957,739,889,12,23,28,17,13,2,237,335,793,1013,757,869,14,17,26,2,12,15,261,301,575,749,803,1134,19,14,30,0,0,8,285,315,606,584,1023,920,16,30,33,7,1,5,327,437,838,759,1220,785,18,22,43,9,17,2,351,421,817,996,621,1190,27,21,23,1,15,10,462,310,725,841,572,746,5,25,21,14,16,18,6 +200,236,665,650,626,605,17,18,11,7,1,17,313,303,486,587,645,848,12,23,22,14,3,3,311,289,685,572,1016,645,19,27,14,14,15,6,385,307,669,687,835,854,25,27,26,17,15,7,320,330,623,701,939,668,20,19,14,18,14,10,258,272,538,697,1058,600,19,25,7,12,15,8,320,328,635,486,708,908,6,25,22,17,15,4,362,342,582,489,714,764,9,29,19,10,8,8,451,287,663,633,768,854,31,18,20,17,9,11,333,255,663,765,987,725,11,11,20,6,8,8,254,254,509,630,901,589,10,26,12,0,10,2,192,186,748,701,672,609,8,13,5,1,2,7,390,208,738,721,740,561,10,15,5,16,3,6,322,274,510,547,752,836,1,24,13,18,15,11,274,266,551,576,966,632,2,24,8,11,16,10,386,352,761,851,1193,593,10,20,20,9,10,9,478,468,712,714,624,1056,23,17,16,19,10,15,305,277,660,551,655,662,23,23,18,10,17,9,6 +245,133,669,725,624,686,8,15,9,10,8,4,396,278,558,604,643,979,13,26,22,11,12,14,380,438,721,663,1032,754,36,24,12,11,12,13,322,414,781,712,835,921,22,24,22,14,8,8,241,427,719,704,943,779,35,24,12,15,9,7,333,351,580,704,1074,751,34,22,5,9,10,11,343,351,649,561,714,1047,19,30,22,14,12,11,445,243,606,592,730,905,16,26,15,7,11,11,392,236,735,724,766,993,26,13,16,14,18,12,418,350,631,762,997,776,26,14,22,9,1,11,301,299,497,645,917,748,25,25,10,3,7,17,197,205,716,780,688,750,13,6,5,2,9,12,395,105,734,812,756,710,15,16,7,13,10,11,387,319,608,578,758,993,22,27,9,15,12,6,373,319,617,619,982,783,19,21,4,8,11,9,381,419,761,870,1209,656,25,17,20,10,3,10,361,321,786,793,622,1195,8,12,14,16,15,4,362,350,624,656,653,679,14,26,20,11,14,12,6 +288,248,894,666,624,690,19,5,8,8,6,10,359,405,571,585,629,785,14,32,25,13,10,12,253,285,832,590,992,694,17,18,15,13,14,3,341,349,854,683,825,877,23,24,25,16,12,14,370,390,826,685,903,677,18,32,15,17,13,9,206,284,721,683,1034,615,17,20,2,11,14,1,336,350,652,496,704,821,8,40,25,16,16,9,300,312,647,519,720,715,11,28,18,9,13,17,499,347,630,641,744,795,35,19,17,16,16,18,231,209,898,747,965,802,9,26,23,7,5,1,290,150,744,622,883,630,8,25,5,1,11,7,218,176,983,707,672,694,10,10,10,0,7,2,410,246,957,729,724,562,12,14,12,15,8,15,406,222,555,525,746,763,3,33,10,17,14,8,198,208,716,586,970,661,0,15,7,10,13,1,248,218,962,861,1183,690,8,13,17,8,7,0,488,432,591,730,618,985,25,18,17,18,13,10,401,325,885,593,637,757,21,28,21,11,12,18,6 +256,282,810,682,694,639,17,13,13,14,10,7,379,307,569,597,695,986,22,30,18,7,12,17,361,275,694,604,976,717,29,20,12,7,14,8,269,289,828,689,791,896,13,22,24,10,10,13,236,270,770,689,853,738,20,22,12,11,11,14,276,198,709,683,1028,724,21,18,9,5,8,6,310,262,614,526,770,1056,28,30,18,10,14,14,422,278,577,545,784,906,25,26,17,3,11,16,357,255,624,673,786,986,23,15,18,10,16,13,363,217,814,759,1001,715,17,18,20,13,1,6,300,214,666,616,917,747,16,27,14,7,7,12,210,218,899,731,736,747,16,10,9,6,11,7,390,202,881,761,770,703,20,18,7,9,12,18,372,204,561,545,806,994,25,31,11,11,14,13,328,200,706,600,1028,770,22,17,6,8,13,6,346,336,942,851,1169,591,16,15,24,14,1,5,312,398,669,750,684,1206,23,16,14,12,13,7,387,287,785,601,651,628,9,28,16,7,12,15,6 +356,362,676,894,629,709,15,23,32,15,3,13,367,187,507,721,670,890,18,22,17,6,5,13,261,265,684,804,1067,719,23,24,27,6,13,4,365,201,708,913,862,804,19,24,17,9,7,3,334,230,674,929,978,700,24,18,27,10,8,10,208,242,547,905,1109,750,23,26,40,4,13,12,344,196,656,726,749,938,12,16,17,9,13,6,342,236,591,747,765,826,15,16,24,2,6,18,543,203,680,899,761,906,33,19,25,9,11,19,259,285,668,833,1032,751,15,16,13,14,6,2,340,352,514,840,952,773,14,11,39,8,8,8,248,270,753,903,723,711,6,24,30,7,4,3,420,262,739,987,791,743,8,20,28,8,5,16,380,250,527,771,793,944,7,11,32,10,13,7,204,266,556,716,1017,756,6,23,35,9,14,12,232,470,764,1009,1244,683,14,21,41,15,8,9,540,372,747,970,621,1026,19,22,25,11,8,15,373,255,661,795,640,640,17,16,19,8,15,19,6 +312,464,928,903,702,772,27,34,31,12,15,12,201,277,785,746,715,1001,26,11,18,9,9,4,251,185,740,711,888,808,15,13,28,5,9,11,275,175,1010,948,643,799,19,15,18,2,3,8,196,222,964,940,717,757,24,11,28,1,4,15,220,300,833,854,950,883,25,13,41,7,9,19,152,212,926,751,836,1043,34,3,18,14,9,9,264,344,867,726,884,947,31,13,25,9,14,9,225,331,810,878,700,999,9,26,26,2,3,10,357,217,888,778,921,774,33,17,12,15,4,7,254,322,746,813,869,916,34,14,38,19,14,13,356,360,973,882,830,838,36,33,31,18,10,8,326,458,917,966,770,868,34,29,29,3,11,9,184,276,677,782,840,1099,39,10,33,13,9,16,296,278,852,633,1036,895,42,8,36,8,8,19,352,368,1026,936,1033,720,34,34,40,12,8,16,226,492,951,981,666,1105,33,25,26,10,6,12,317,293,831,774,571,591,21,3,18,11,15,10,6 +351,429,839,854,658,785,27,14,35,12,12,11,350,232,570,689,701,1076,26,27,14,5,10,13,266,158,719,666,996,847,9,21,24,5,2,4,252,144,825,859,773,920,21,21,14,10,14,7,261,189,797,817,885,850,24,19,24,7,15,10,205,185,674,705,1044,882,23,19,37,7,8,2,225,163,689,688,788,1136,28,21,14,2,8,6,377,317,648,705,816,1018,31,25,21,9,9,18,410,248,661,857,736,1098,23,18,22,2,14,19,390,228,839,703,1015,829,23,25,16,15,15,2,389,261,691,660,931,905,20,24,42,19,9,8,247,323,924,887,768,879,18,19,29,18,11,3,263,341,868,945,782,861,20,19,27,3,10,16,289,285,596,689,830,1134,23,20,29,1,2,9,255,271,677,582,1050,918,20,20,32,8,3,2,333,387,915,807,1221,741,20,18,44,10,17,1,353,441,796,932,648,1244,33,17,22,0,17,11,492,296,800,767,589,670,11,27,22,13,16,19,6 +223,209,678,686,610,697,7,16,10,12,3,5,356,244,551,617,611,966,12,31,21,9,3,15,316,418,648,580,976,757,29,19,11,9,13,8,322,368,654,667,791,960,17,19,21,12,13,13,319,369,624,645,887,774,30,21,11,13,12,8,297,331,535,611,1018,708,29,17,2,7,13,6,345,375,656,514,658,1008,14,29,21,12,13,16,433,285,597,549,674,878,15,25,14,5,6,12,434,220,724,677,756,978,25,18,13,12,11,13,450,378,682,697,941,827,21,19,25,11,12,6,337,321,528,550,861,669,20,30,7,5,8,12,181,265,767,757,632,689,2,11,8,4,2,7,323,129,753,765,700,657,4,19,10,11,1,12,339,271,561,513,702,916,9,30,6,13,13,7,305,273,550,554,926,748,12,16,3,6,14,6,445,463,770,785,1153,679,20,18,21,12,14,5,407,365,771,746,614,1156,13,17,13,14,14,5,366,282,669,655,663,758,15,25,23,9,15,13,6 +246,200,567,708,663,592,7,17,18,11,4,8,299,383,556,627,694,957,2,30,23,10,2,14,339,383,627,592,1071,672,29,20,13,10,12,9,479,405,601,687,890,867,31,20,23,13,14,16,368,448,573,671,994,693,30,20,13,14,15,11,372,416,480,643,1109,673,29,18,12,8,12,11,356,396,645,528,765,1027,4,28,23,13,12,15,378,296,580,557,765,869,1,24,16,6,7,13,481,367,729,709,799,951,23,17,15,13,12,6,497,311,563,723,1044,692,21,18,31,10,13,11,328,354,463,574,958,694,20,29,17,4,7,9,212,176,648,777,731,708,16,10,6,3,3,10,334,190,640,797,791,652,14,18,6,12,2,15,344,336,556,527,807,945,9,29,8,14,12,12,374,336,503,522,1017,721,12,17,7,7,13,13,454,462,641,785,1244,554,20,19,19,11,15,12,522,458,820,766,657,1165,13,16,15,15,15,4,371,277,570,649,680,627,17,24,15,10,16,12,6 +297,279,650,806,627,662,13,22,17,7,3,13,340,208,553,685,670,909,18,27,14,14,1,7,266,362,668,800,1061,696,29,23,30,14,11,4,422,294,692,885,856,819,17,25,30,17,13,3,369,293,650,929,972,697,30,17,30,18,12,12,275,331,533,949,1103,743,29,21,23,12,11,12,379,333,682,722,747,971,16,19,30,17,11,0,377,271,617,663,767,845,19,19,35,10,6,12,558,236,734,791,755,933,31,20,36,17,11,13,328,376,638,881,1026,696,21,19,8,6,12,4,289,407,492,882,946,774,20,14,22,0,6,4,217,293,723,801,723,718,4,23,21,1,4,3,393,189,707,879,785,734,6,21,21,16,1,10,369,333,571,785,795,961,11,14,29,18,11,13,245,341,564,792,1019,759,12,20,24,11,12,12,319,531,744,1083,1240,614,20,20,28,9,14,9,577,391,809,882,619,1113,13,25,32,19,14,15,372,286,631,689,634,565,13,17,12,10,13,13,6 +239,151,688,704,633,671,10,16,16,13,5,12,342,336,545,611,654,1010,15,27,25,8,5,10,264,358,654,590,989,751,28,23,15,8,17,1,338,388,670,699,820,918,18,23,25,11,17,12,369,423,642,671,902,774,29,23,15,12,18,11,295,349,547,651,1035,754,28,21,8,6,17,1,325,357,648,532,719,1078,13,29,25,11,17,7,413,263,583,565,731,934,16,25,18,4,10,15,470,312,694,697,751,1012,28,14,17,11,13,16,446,280,690,717,982,759,20,15,31,12,14,1,341,293,580,580,900,769,19,26,13,6,12,5,175,149,775,759,683,777,1,7,6,5,4,0,307,137,755,785,741,725,3,17,6,10,5,13,319,317,567,535,761,1018,8,28,10,12,17,10,305,317,538,556,983,794,11,20,7,7,18,3,443,395,762,809,1200,637,19,18,17,13,16,2,441,401,801,770,627,1234,14,13,17,13,16,8,374,312,681,635,618,664,16,25,17,8,17,16,6 +293,227,761,712,726,715,12,18,16,9,11,10,342,288,622,631,733,1084,17,35,23,2,9,12,246,308,659,556,1018,795,26,15,13,2,3,3,284,328,709,699,873,994,16,19,23,9,15,16,355,331,685,671,947,814,27,21,13,6,16,9,263,267,586,621,1058,794,26,15,8,4,9,1,297,297,651,528,794,1154,15,27,23,1,9,11,403,251,586,553,776,996,18,23,16,6,10,17,476,268,695,703,836,1078,26,22,15,1,15,18,448,298,765,697,1029,807,22,27,35,12,16,1,375,307,611,548,941,809,21,28,13,16,10,7,231,205,850,775,744,835,3,15,10,15,10,2,249,145,818,791,776,767,5,19,10,0,9,15,311,301,542,529,834,1062,10,26,8,2,3,8,271,301,585,508,1024,838,13,14,5,9,4,1,437,425,825,757,1205,667,21,18,19,9,18,0,395,385,782,772,718,1290,16,21,15,3,18,10,468,292,736,669,719,726,18,25,19,12,17,18,6 +323,335,677,724,604,508,11,15,18,10,8,8,330,230,528,603,613,769,6,34,13,11,4,10,302,340,681,690,1004,540,25,16,17,11,14,5,478,240,685,775,807,715,31,16,29,14,10,12,457,277,657,801,915,577,26,16,17,15,11,7,317,319,532,793,1046,557,25,14,14,9,14,3,411,257,611,632,686,839,0,28,23,14,14,7,311,251,558,603,702,693,3,28,22,7,11,15,562,242,681,719,750,777,27,23,23,14,10,16,338,332,677,855,969,594,17,24,13,9,15,3,369,387,535,738,889,580,16,29,15,3,9,9,339,279,762,747,660,538,14,18,16,2,9,4,379,235,744,807,728,554,10,24,16,13,6,13,397,249,518,667,730,789,5,29,16,15,14,6,243,265,543,724,954,585,8,13,11,8,13,3,353,511,753,977,1181,504,16,23,29,10,13,2,643,389,778,800,604,989,17,22,19,16,13,8,298,206,676,625,639,557,21,24,11,11,12,16,6 +296,244,613,848,578,580,6,25,18,7,5,11,281,241,626,671,609,825,11,24,15,14,7,9,221,425,675,838,1006,606,30,24,27,14,19,6,463,373,689,849,801,717,18,24,31,17,17,1,396,400,661,863,917,613,31,24,27,18,16,10,240,348,536,897,1048,673,30,26,20,12,19,14,300,300,735,738,688,887,13,22,31,17,19,2,282,134,662,769,704,765,14,18,32,10,12,14,475,221,805,861,718,845,24,13,33,17,9,15,319,351,597,867,971,594,22,16,13,6,10,2,252,334,481,836,891,722,21,13,25,0,14,6,218,244,682,857,662,644,3,16,14,1,6,3,366,164,670,949,730,678,3,16,14,16,7,12,308,198,626,753,732,891,10,17,26,18,19,11,226,224,573,810,956,685,13,21,21,11,20,14,364,466,703,1073,1183,532,21,17,27,9,12,11,546,266,892,922,574,1047,12,22,29,19,12,13,339,249,590,751,601,475,16,16,5,10,15,15,6 +247,243,794,670,592,658,14,6,8,9,7,10,412,316,527,601,599,949,17,27,23,12,9,12,334,370,754,606,974,726,22,23,13,12,19,3,292,392,730,663,793,931,20,25,23,15,17,18,339,383,712,669,887,751,23,31,13,16,16,9,241,289,619,661,1016,691,22,21,0,10,15,1,333,317,556,492,658,1005,11,35,23,15,17,13,395,231,537,537,672,861,14,27,16,8,14,17,454,284,622,669,740,955,32,12,15,15,11,18,298,278,798,745,939,784,14,19,23,8,6,1,299,209,644,598,859,668,13,26,5,2,12,7,165,177,883,745,630,682,5,3,10,1,8,2,365,181,875,757,698,646,7,13,12,14,9,15,415,171,537,529,700,917,6,28,8,16,19,8,285,173,608,572,924,729,5,20,5,9,18,1,319,341,854,831,1151,640,13,14,19,9,8,0,417,365,615,726,596,1145,20,13,15,17,8,10,342,242,793,615,649,711,18,33,21,12,11,18,6 +205,445,627,878,659,821,11,31,37,15,10,12,294,254,584,731,708,1086,12,22,14,6,8,12,232,242,631,700,1063,863,31,22,24,6,4,3,346,214,657,909,842,914,25,10,14,9,10,2,331,321,629,903,956,818,32,6,24,10,9,9,225,365,532,817,1109,914,31,18,37,4,10,7,285,267,691,714,781,1140,6,14,14,9,4,5,299,353,622,717,805,1022,9,24,21,2,3,17,460,314,747,869,777,1070,29,37,22,9,8,18,348,294,621,807,1056,867,23,20,16,14,9,1,307,487,517,770,974,941,22,25,42,8,11,7,199,373,706,895,757,905,8,26,29,7,9,2,305,357,678,957,807,899,4,28,27,8,8,15,321,459,590,745,833,1148,11,21,29,10,4,8,229,469,549,614,1057,938,14,19,32,9,5,7,299,533,709,909,1274,787,22,39,44,15,11,4,493,469,852,954,653,1172,11,36,22,11,11,10,362,352,602,777,628,740,23,8,22,8,12,18,6 +330,288,835,779,670,750,17,15,22,9,9,11,397,295,524,652,715,1091,22,32,19,2,9,13,283,245,761,619,1078,828,19,18,9,6,5,4,255,263,807,772,865,973,15,22,19,13,7,11,290,298,779,726,979,847,20,22,9,10,8,10,238,218,664,644,1122,833,19,16,16,8,7,2,296,232,625,603,794,1157,16,24,19,1,5,6,410,298,606,622,818,1017,19,24,12,6,8,18,457,285,597,774,782,1097,35,17,11,1,15,19,387,227,839,686,1053,826,11,26,35,12,8,2,384,230,685,581,977,852,10,25,21,16,4,8,216,194,924,830,774,862,8,16,10,15,8,3,304,224,892,862,818,810,10,16,10,0,7,16,364,266,548,604,842,1101,11,25,8,2,5,7,246,266,663,531,1066,877,8,15,11,9,6,0,338,342,907,778,1275,702,10,15,23,9,10,1,392,422,680,847,662,1287,23,18,11,3,12,11,487,301,818,712,655,709,13,28,19,16,11,19,6 +301,325,651,861,612,621,15,21,22,11,3,14,304,186,606,690,663,856,14,22,9,8,1,10,202,272,663,793,998,637,25,24,25,10,11,3,392,216,713,876,781,742,23,26,25,13,13,0,339,235,685,888,895,652,26,18,25,12,14,9,203,241,552,882,1046,700,25,22,28,8,11,11,293,213,709,695,736,916,8,18,25,5,11,3,291,237,650,720,762,800,11,16,30,6,4,15,488,186,751,872,722,880,33,19,31,5,9,16,306,294,639,814,1003,671,17,18,13,10,10,1,301,351,515,813,921,741,16,11,27,12,6,5,233,275,724,876,714,677,6,26,18,11,4,0,347,229,694,960,756,697,8,20,16,6,1,13,283,267,604,736,788,924,5,11,24,6,11,10,179,281,585,725,1012,716,8,21,23,5,12,11,307,469,737,1012,1223,601,16,19,33,11,12,8,527,353,872,937,606,1058,17,22,27,7,12,14,330,276,618,768,567,520,21,18,11,10,13,16,6 +381,311,773,835,637,818,19,17,36,16,5,12,422,324,486,690,682,1117,20,28,13,5,7,14,322,312,729,683,1071,886,23,22,23,5,13,5,334,334,755,806,866,961,17,26,13,10,9,8,339,371,725,758,982,891,24,28,23,9,8,11,237,249,604,676,1113,909,23,22,36,5,13,3,333,233,587,665,759,1177,14,32,13,8,13,7,381,231,556,694,781,1059,17,24,20,1,6,19,474,292,583,846,765,1139,37,15,21,8,9,20,366,258,775,698,1036,870,15,16,17,13,8,3,327,225,637,619,956,932,14,23,41,9,10,9,241,205,860,890,737,916,10,8,30,8,6,4,411,237,834,934,795,888,12,14,28,7,7,17,427,241,522,656,807,1171,9,29,28,9,13,8,275,245,605,529,1031,951,6,19,31,10,14,1,297,341,847,792,1250,774,14,15,45,16,6,2,411,363,670,903,629,1285,19,14,21,10,6,12,480,310,762,768,644,711,15,28,23,9,15,20,6 +297,299,776,834,600,676,17,15,12,13,8,10,296,310,559,751,585,891,12,24,19,6,6,12,220,338,704,666,868,712,19,26,9,12,6,3,312,338,712,785,729,913,25,28,19,15,10,18,289,333,694,709,817,725,20,28,9,14,11,9,213,241,599,613,902,653,19,24,4,14,6,1,177,289,638,652,574,921,6,20,19,3,6,13,353,233,591,683,590,807,9,24,12,10,5,17,372,244,700,835,734,915,31,9,11,3,10,18,414,254,780,697,843,808,11,20,29,16,11,1,297,173,626,582,755,582,10,19,9,20,5,7,225,227,865,909,546,630,8,18,8,19,7,2,257,213,843,923,618,590,10,18,8,4,6,15,209,145,541,641,616,829,1,19,4,2,6,8,235,137,590,606,810,695,2,23,1,9,7,1,431,309,836,727,1041,664,10,17,23,11,13,0,373,339,737,888,600,1071,23,10,11,1,13,10,430,266,765,805,667,755,23,26,21,12,12,18,6 +344,330,670,776,613,614,17,24,18,8,4,14,337,289,497,625,642,803,12,17,15,15,4,8,257,295,692,764,1039,626,19,33,25,15,16,1,447,257,696,759,834,775,25,25,31,18,16,2,366,278,658,733,950,667,20,15,25,19,17,11,286,298,549,761,1081,617,19,31,16,13,16,9,338,282,650,656,721,867,6,19,31,18,16,1,400,292,593,687,737,739,9,25,30,11,9,13,523,285,670,789,759,819,33,22,31,18,12,14,361,267,662,795,1004,684,11,11,11,5,13,3,268,330,518,712,924,642,10,20,21,1,11,3,206,228,747,815,695,620,8,17,12,2,3,2,402,262,739,877,763,600,10,15,14,17,4,11,336,232,509,655,765,857,1,20,24,19,16,12,286,238,562,702,989,645,2,30,19,12,17,9,406,456,760,935,1216,604,10,26,27,10,15,6,542,442,727,850,613,1029,23,21,27,20,15,12,433,199,663,697,648,575,23,17,9,9,18,14,6 +383,289,817,871,622,700,16,12,27,12,13,10,348,280,522,754,673,965,17,25,14,5,11,12,258,294,759,683,1036,760,20,21,6,11,1,3,260,304,777,838,831,927,20,25,14,16,13,14,259,299,749,770,947,785,21,25,6,15,14,9,239,225,644,626,1078,717,20,19,19,13,7,1,247,223,601,699,746,1031,11,25,14,2,7,9,389,209,574,726,772,893,14,25,7,9,8,17,414,226,613,878,740,971,34,14,6,2,13,18,400,230,821,666,1019,814,12,23,34,15,14,1,403,201,667,625,937,726,11,26,24,19,12,7,247,213,906,938,724,736,7,15,17,18,12,2,265,207,874,966,770,682,9,13,17,3,11,15,287,179,568,690,798,977,6,18,11,1,1,8,273,183,639,541,1022,757,3,22,14,8,2,1,315,331,885,658,1237,686,11,12,28,10,16,0,359,327,672,937,616,1193,22,15,6,0,16,10,468,288,802,822,609,687,18,31,24,13,17,18,6 +237,341,743,748,610,703,14,15,20,16,6,11,342,270,590,631,661,988,13,32,13,5,4,13,250,224,677,670,984,755,22,18,23,5,8,4,324,212,735,803,763,866,18,18,29,8,14,7,349,273,707,817,875,774,25,16,23,9,13,10,207,255,606,813,1032,796,22,16,28,3,8,2,319,259,691,600,736,1052,19,28,29,8,8,6,351,323,626,591,764,924,18,28,28,1,7,18,500,276,729,743,712,1004,30,21,29,8,12,19,330,212,743,807,993,751,20,20,19,13,13,2,357,319,619,744,911,817,17,29,27,9,7,8,213,225,828,779,716,785,5,16,18,8,5,3,305,269,780,831,750,773,9,22,16,7,4,16,349,287,596,659,788,1038,14,29,22,9,8,9,199,291,601,674,1012,824,11,15,23,10,9,2,327,417,819,955,1209,665,17,21,29,16,15,1,525,447,842,824,606,1196,20,20,25,10,15,11,400,270,706,649,559,600,10,26,7,9,14,19,6 +267,189,709,690,661,658,11,15,11,13,4,11,380,320,556,597,690,1007,16,30,22,8,2,11,304,348,669,622,1057,738,29,20,14,8,14,2,342,378,673,677,864,917,19,20,26,11,14,13,335,403,645,683,964,759,30,20,14,12,13,10,301,349,554,691,1101,739,29,18,13,6,14,0,347,345,633,530,763,1077,12,26,22,11,14,8,455,253,568,569,777,927,15,26,19,4,7,16,482,306,699,691,785,1005,29,17,20,11,12,17,446,312,713,759,1032,734,21,20,26,12,13,0,359,325,577,622,954,762,20,27,18,6,9,6,177,177,798,751,733,768,2,14,5,5,3,1,321,145,776,779,795,718,4,20,3,10,2,14,341,313,554,551,805,1011,9,27,13,12,14,9,309,317,555,616,1029,787,12,17,8,7,15,2,411,433,779,855,1250,610,20,17,20,13,15,1,489,397,782,756,653,1227,13,16,16,13,15,9,436,272,702,609,662,649,17,26,12,8,16,17,6 +340,346,766,927,622,735,16,22,35,10,18,13,377,221,559,794,681,990,21,19,24,3,14,9,333,249,756,731,1034,803,20,31,14,11,4,0,223,199,768,904,829,942,16,17,12,18,8,5,244,234,740,842,945,836,21,21,14,15,9,10,290,262,603,690,1076,766,20,27,27,13,12,4,252,204,658,749,750,1054,15,17,12,0,4,2,426,276,603,774,784,928,18,25,11,7,11,14,397,197,718,926,736,1012,34,24,12,0,8,15,417,229,764,676,1021,857,12,17,26,13,13,2,378,336,612,679,935,769,11,24,32,17,17,4,256,278,849,978,730,771,7,23,25,16,17,1,280,266,817,1014,762,721,9,15,25,1,16,12,330,244,563,744,808,1020,10,14,19,1,4,11,370,260,610,527,1032,798,7,28,22,8,3,4,342,454,844,684,1241,733,11,22,30,8,19,3,324,390,791,991,624,1232,22,21,12,2,11,9,457,243,743,854,607,696,14,25,32,15,12,15,6 +249,165,656,690,684,671,9,15,18,14,3,14,358,332,649,617,721,1040,14,30,25,3,1,16,310,374,606,564,1018,751,31,20,15,3,11,7,282,404,692,671,823,950,19,24,25,6,13,16,297,397,654,643,923,770,32,24,15,7,12,13,271,313,575,617,1072,750,31,18,10,1,11,5,287,327,726,508,800,1110,16,30,25,6,11,17,435,235,649,533,798,952,17,24,18,1,4,21,434,288,768,685,786,1034,27,15,17,6,9,16,442,290,660,699,1041,763,23,18,35,11,10,5,329,237,522,544,953,765,22,25,15,11,6,11,159,165,745,765,760,791,4,8,10,10,4,6,293,115,735,773,790,723,6,16,10,5,1,19,329,261,587,509,838,1018,11,29,10,7,11,12,303,257,596,506,1046,794,14,17,7,12,12,5,419,363,790,753,1239,623,22,15,17,14,12,4,355,355,849,750,680,1246,11,16,17,8,12,14,414,296,641,657,635,684,13,28,19,11,13,22,6 +264,150,660,646,645,668,9,15,12,14,1,10,333,337,553,549,686,1027,10,28,27,7,3,12,265,371,604,558,1083,746,27,22,17,7,15,3,365,411,626,629,878,937,27,26,27,10,15,14,340,426,598,587,994,765,28,26,17,11,14,9,264,326,517,585,1125,751,27,20,4,5,15,1,264,324,618,474,765,1097,4,28,27,10,15,9,360,224,567,509,781,941,7,24,20,3,8,17,463,293,678,647,777,1021,27,13,19,10,9,18,441,289,664,653,1048,768,19,18,29,13,10,1,284,220,524,516,968,766,18,23,9,7,10,7,178,120,749,709,739,782,10,8,6,6,2,2,282,126,717,735,807,724,6,16,8,9,3,15,314,288,539,483,809,1015,7,27,12,11,15,8,300,288,528,502,1033,791,10,19,9,8,16,1,424,352,728,741,1260,632,18,15,15,14,12,0,448,356,769,712,637,1237,15,14,19,12,12,10,399,319,645,595,656,695,23,28,21,7,17,18,6 +351,269,720,905,668,671,16,17,29,11,16,10,342,260,501,782,703,1010,15,20,18,4,14,12,280,324,690,711,1044,739,26,26,8,10,2,3,240,294,698,878,865,944,22,20,14,17,10,10,243,307,670,806,965,758,27,22,8,14,11,9,277,277,561,652,1080,720,26,22,21,12,12,1,247,199,594,729,776,1080,9,20,14,1,4,5,411,181,535,754,774,922,12,22,7,8,9,17,408,238,628,906,786,1004,34,19,6,1,10,18,430,258,724,650,1039,799,18,18,32,14,13,1,401,285,594,653,951,735,17,23,26,18,17,7,265,195,809,964,734,761,7,18,19,17,15,2,223,207,783,994,782,693,9,18,19,2,14,15,273,187,529,724,820,988,6,13,13,0,2,8,343,201,548,515,1024,764,9,29,16,7,3,1,347,403,792,636,1245,651,17,17,28,9,19,0,325,313,727,971,662,1216,16,18,6,1,13,10,446,228,711,842,651,726,20,26,28,14,14,18,6 +321,277,728,790,685,605,14,17,16,10,3,17,332,242,531,617,736,902,19,24,17,3,7,5,284,312,672,762,1073,655,24,24,23,5,13,4,372,270,752,789,852,796,12,26,33,12,15,5,251,285,708,785,964,676,25,18,23,9,14,12,265,291,591,821,1119,708,24,22,22,7,13,8,289,243,662,642,809,968,19,20,29,0,13,2,387,223,617,685,835,834,22,20,28,7,6,10,470,220,680,797,795,912,32,19,29,0,13,11,372,292,722,793,1076,641,16,22,19,13,10,6,291,335,572,752,994,739,15,15,23,17,8,0,237,237,807,805,787,685,5,26,12,16,2,5,369,181,779,885,829,695,9,20,10,1,5,8,311,233,573,651,861,940,14,15,22,1,13,13,281,245,598,706,1085,728,11,21,17,8,14,8,333,459,824,979,1296,553,15,19,25,8,12,7,469,343,781,866,679,1130,18,20,25,2,12,13,410,232,703,691,638,528,10,22,3,15,15,11,6 +333,247,776,771,626,643,18,12,15,10,4,11,348,316,491,644,655,902,17,25,16,11,4,11,234,282,750,743,1038,689,22,25,24,11,14,2,382,306,770,784,843,840,20,25,32,14,12,7,343,319,738,806,949,718,23,23,24,15,11,10,185,249,623,824,1080,692,22,23,19,9,14,2,317,223,660,627,736,968,11,23,30,14,14,4,325,243,611,646,752,830,14,27,29,7,7,16,514,286,646,776,750,916,36,14,30,14,6,17,284,222,776,852,1007,717,14,17,16,9,11,0,271,225,622,759,929,701,13,24,22,3,9,6,193,153,861,818,708,685,9,17,13,2,5,1,399,187,841,864,770,659,11,17,13,13,4,14,357,235,555,668,780,930,6,24,23,15,14,9,193,233,626,703,1004,724,5,22,18,8,15,2,279,343,856,978,1225,611,13,14,26,10,9,1,527,375,715,845,618,1106,20,13,26,16,9,9,392,280,767,676,629,608,18,29,6,11,16,17,6 +228,484,812,934,654,686,28,30,26,12,15,15,193,191,723,799,691,905,23,23,21,7,15,3,201,161,682,780,920,712,16,7,31,3,5,14,353,101,906,1007,683,693,18,9,21,6,7,7,310,152,860,1017,777,651,23,15,31,7,8,12,202,258,709,957,976,793,24,9,36,5,3,22,234,244,856,804,790,941,31,15,21,12,3,4,216,344,785,751,820,847,28,15,28,7,10,8,373,253,790,903,690,903,14,28,29,6,9,15,257,215,788,801,975,678,30,15,9,9,8,8,212,310,638,904,883,842,29,16,33,11,8,14,302,364,873,885,766,744,31,31,34,10,16,11,362,408,823,991,742,792,33,33,32,5,15,6,230,278,657,863,814,1003,36,16,36,11,5,15,180,280,742,722,1024,801,37,10,39,12,4,22,322,426,922,1011,1133,628,29,28,37,10,10,19,392,470,943,1022,632,1023,34,37,29,8,10,17,219,241,737,787,531,503,16,1,19,9,11,9,6 +220,274,628,824,629,652,12,15,16,12,2,11,269,177,541,735,618,929,7,30,15,5,2,11,227,403,660,654,903,706,24,20,5,9,12,2,327,301,668,793,752,909,30,22,15,16,14,15,280,332,642,735,852,723,25,22,5,13,13,10,242,306,489,631,941,663,24,18,8,11,12,0,220,322,658,646,605,987,1,26,15,2,12,10,364,226,601,673,641,841,4,24,8,5,5,16,355,161,734,825,753,935,28,15,7,2,10,17,427,367,632,705,876,784,16,20,27,13,11,0,280,322,478,590,790,644,15,27,13,15,7,6,200,274,717,887,579,668,13,12,12,14,3,1,272,172,709,913,655,620,9,16,10,3,0,14,230,194,559,639,647,895,4,27,0,3,12,9,258,210,542,568,849,701,7,17,3,8,13,2,446,464,694,761,1076,636,15,17,27,10,13,1,366,308,787,886,625,1127,18,16,7,4,13,9,371,279,631,773,694,719,22,26,17,13,14,17,6 +275,337,787,784,654,745,14,19,26,11,15,11,284,230,566,691,697,1070,19,34,17,0,13,11,224,276,695,560,1056,815,22,8,7,0,1,2,234,222,761,803,839,968,18,8,17,7,11,13,293,237,733,779,953,842,23,14,7,4,12,10,231,273,624,669,1102,816,22,4,18,2,5,0,269,259,665,612,778,1136,13,26,17,3,5,8,353,277,608,603,798,998,16,18,10,4,8,16,440,260,671,755,770,1076,28,29,9,3,11,17,386,328,791,713,1041,835,18,30,35,10,12,0,393,367,645,628,963,831,17,19,23,14,10,6,225,271,876,823,756,841,5,20,16,13,14,1,223,231,840,843,808,787,7,32,16,2,13,14,301,305,570,631,822,1082,8,27,10,4,1,9,275,313,619,492,1046,858,9,11,13,11,0,2,329,487,859,757,1243,709,17,29,25,11,14,1,409,405,790,848,646,1298,20,30,9,5,14,9,380,260,762,707,647,700,20,14,25,12,15,17,6 +244,282,830,655,642,697,21,16,14,9,11,11,393,363,547,562,687,984,20,27,31,12,15,11,327,235,760,589,1054,757,17,23,21,12,9,2,305,269,804,664,849,956,17,23,31,15,3,13,304,334,776,678,965,774,16,23,21,16,4,10,280,320,663,692,1098,716,15,21,8,10,9,0,330,324,658,483,766,1054,14,31,31,15,11,8,430,418,617,504,790,896,17,27,24,8,14,16,447,373,642,642,758,984,35,20,23,15,15,17,379,221,834,762,1029,815,7,15,29,8,4,0,302,284,680,621,951,709,6,32,11,2,10,6,128,198,919,710,746,735,12,9,4,1,10,1,382,298,887,730,792,667,14,21,6,14,13,14,382,346,589,528,814,962,9,28,16,16,9,9,304,346,658,571,1038,762,6,20,13,9,8,2,378,364,902,842,1249,669,6,22,11,9,6,1,418,536,703,719,634,1190,27,19,23,17,18,9,345,317,815,590,631,744,15,25,19,12,15,17,6 +240,216,650,711,676,757,10,14,16,14,6,5,405,311,571,604,727,1084,15,31,25,7,4,17,387,337,582,605,1070,835,32,19,15,7,8,8,299,353,698,730,849,952,20,19,25,10,10,13,292,386,636,734,961,856,33,23,15,11,11,10,324,338,553,720,1116,842,32,17,14,5,8,6,380,350,650,535,800,1148,21,33,25,10,8,12,454,340,577,548,826,1018,18,25,18,3,3,12,421,297,698,700,786,1096,28,18,17,10,10,11,449,287,652,770,1067,825,24,19,33,13,9,6,370,312,520,653,985,865,23,30,19,7,3,12,174,166,737,758,778,863,9,7,4,6,5,7,376,206,727,788,820,821,13,19,4,9,4,14,400,362,545,576,852,1112,18,32,10,11,8,9,340,362,554,573,1076,888,15,16,9,8,9,8,394,418,790,852,1287,709,23,18,17,14,11,7,362,436,791,777,670,1292,10,17,17,12,11,3,367,349,633,636,631,678,12,27,13,7,12,11,6 +197,197,825,651,608,657,13,8,9,8,5,10,364,346,576,596,613,978,16,29,26,13,9,12,300,322,759,593,984,731,23,21,16,13,15,3,272,360,773,674,815,930,15,25,26,16,13,18,297,391,745,700,901,758,24,29,16,17,14,9,221,285,648,710,1026,718,23,19,3,11,15,1,289,317,617,497,682,1038,16,37,26,16,15,13,371,265,582,498,694,890,19,27,19,9,8,17,432,302,657,630,744,982,31,14,18,16,15,18,286,238,829,794,949,763,15,19,22,7,6,1,263,221,675,641,869,707,14,26,6,1,10,7,141,127,914,702,650,719,4,3,9,0,4,2,341,171,882,718,708,673,6,13,11,15,7,15,377,269,578,552,720,958,11,30,11,17,15,8,275,271,639,597,942,758,8,18,8,10,14,1,331,319,885,870,1161,627,14,12,16,8,8,0,417,387,720,713,604,1180,19,15,18,18,12,10,326,324,810,582,633,686,13,31,20,11,13,18,6 +312,398,656,874,656,674,15,31,28,13,10,13,263,163,571,693,699,899,14,18,7,2,8,7,179,281,682,744,1076,692,25,26,23,4,4,4,421,173,714,881,869,813,23,14,23,11,16,3,342,226,686,843,985,701,26,4,23,8,17,12,252,338,549,799,1120,725,25,22,30,6,10,12,328,276,700,706,776,961,8,10,23,5,10,0,342,310,635,721,796,835,11,20,28,2,11,12,495,225,748,873,780,917,33,33,29,5,16,13,387,345,644,773,1051,724,17,20,21,10,17,4,326,462,498,732,973,762,16,21,35,12,11,4,248,362,729,877,752,714,6,30,20,11,9,3,346,304,713,961,812,720,8,24,18,4,8,10,302,374,573,711,824,955,5,17,22,6,4,13,232,384,580,658,1048,745,8,23,25,13,5,12,342,580,750,935,1269,642,16,33,35,13,19,9,536,402,837,950,648,1089,17,32,25,7,19,15,335,303,637,775,653,603,21,10,13,12,16,13,6 +297,167,740,708,662,660,15,13,13,7,4,11,340,346,483,605,709,997,12,28,26,14,4,11,242,406,710,636,1084,728,25,22,16,14,16,2,408,426,708,695,871,933,25,26,26,17,16,13,417,447,680,673,987,747,26,30,16,18,15,10,269,323,577,691,1128,707,25,22,5,12,16,0,357,361,578,540,784,1067,6,36,26,17,16,8,369,275,537,569,804,909,9,24,19,10,9,16,520,306,608,703,788,991,33,15,18,17,10,17,324,318,744,755,1063,788,17,16,24,6,11,0,285,201,610,620,983,722,16,23,10,0,11,6,169,123,829,771,758,748,8,4,5,1,5,1,373,135,809,791,816,680,8,14,7,16,4,14,365,303,535,543,832,975,5,29,11,18,16,9,261,299,570,572,1056,751,8,19,8,11,17,2,365,363,812,841,1279,640,16,15,16,9,13,1,525,401,691,772,656,1203,17,14,18,19,13,9,390,316,737,647,649,715,23,30,20,10,16,17,6 +336,286,634,817,676,660,11,24,19,4,6,11,335,209,585,652,719,893,16,23,14,11,4,9,265,395,648,795,1096,686,29,21,30,13,10,6,435,295,678,846,883,775,17,23,30,12,14,1,406,310,650,878,997,673,30,15,30,13,15,10,270,374,529,910,1140,759,29,19,23,15,10,14,400,328,694,703,796,953,14,19,30,12,10,2,382,262,623,700,816,839,17,15,35,13,9,14,577,223,750,812,800,917,29,22,36,12,14,15,389,403,628,848,1071,662,21,15,12,3,15,2,356,442,492,841,993,808,20,12,26,5,9,6,236,312,713,816,772,726,2,27,17,4,5,3,382,200,687,900,832,760,4,23,17,11,4,12,386,328,571,740,844,975,9,12,29,13,10,11,252,344,562,781,1068,769,12,18,24,6,11,14,336,568,728,1068,1289,600,20,22,28,4,17,11,624,372,845,893,668,1113,13,27,32,14,17,13,363,265,611,708,673,529,15,15,8,9,16,15,6 +270,210,674,730,670,682,16,21,15,11,2,14,339,337,505,615,713,1007,15,20,20,10,4,8,279,311,662,672,1090,756,28,30,20,10,14,1,405,335,686,717,877,897,22,26,32,13,16,6,346,374,658,721,991,777,29,16,20,14,15,11,288,350,533,733,1134,775,28,28,17,8,14,3,316,292,628,560,790,1073,9,22,26,13,14,1,392,240,565,603,810,937,12,28,25,6,7,13,489,329,678,733,794,1015,34,21,26,13,10,14,421,281,670,771,1065,744,20,10,22,10,11,3,278,328,530,664,987,798,19,23,22,4,9,3,148,178,755,777,766,784,7,16,7,3,1,2,350,158,729,821,826,754,9,12,5,12,2,11,342,304,525,575,838,1037,8,23,19,14,14,12,310,302,542,622,1062,815,11,27,14,7,15,5,380,442,756,893,1283,638,19,23,22,11,13,4,498,396,767,798,662,1235,14,20,22,15,13,10,407,251,657,643,667,619,20,20,8,10,16,14,6 +358,406,742,891,672,861,15,31,39,15,11,6,349,313,569,732,717,1146,14,24,12,4,13,8,331,209,670,729,1074,917,27,22,22,4,15,9,281,225,800,890,853,980,17,12,12,7,3,8,258,298,746,852,965,888,24,12,22,8,2,11,252,266,633,760,1120,960,21,18,35,2,9,11,290,148,684,723,794,1204,22,16,12,7,9,11,374,332,609,746,818,1084,19,20,19,0,8,13,343,373,688,898,788,1148,21,29,20,7,5,14,345,225,738,754,1059,905,19,20,18,12,2,7,288,326,588,719,983,979,18,21,40,10,8,13,272,296,823,930,774,957,20,22,31,9,12,8,428,374,797,986,824,937,22,28,29,6,13,11,344,332,537,724,842,1202,27,19,27,8,15,12,346,340,640,545,1066,988,26,17,30,11,14,11,304,384,872,838,1281,815,18,35,46,15,4,8,280,476,793,967,664,1258,21,28,20,9,10,6,409,311,709,814,657,772,5,10,24,10,9,14,6 +290,220,771,652,628,700,18,19,15,13,11,12,463,359,498,575,659,1021,23,30,26,8,15,10,425,315,733,576,1038,778,28,20,16,8,9,1,307,343,737,641,855,975,12,20,26,11,5,16,320,376,709,647,959,801,25,16,16,12,6,11,362,342,598,655,1080,761,24,18,9,6,9,1,402,346,593,478,730,1087,21,24,26,11,11,11,474,344,546,521,736,933,24,26,19,4,14,15,429,359,609,649,764,1027,32,21,18,11,17,16,457,273,775,735,1009,810,16,18,32,12,4,1,382,304,625,582,923,746,15,25,14,6,10,5,222,160,860,721,696,762,9,16,3,5,10,0,418,228,842,737,762,718,11,22,3,10,13,13,446,316,536,497,772,997,16,25,11,12,9,10,404,316,593,560,988,799,13,17,8,7,8,3,410,402,839,813,1215,672,15,21,16,13,6,2,400,478,674,714,622,1223,18,20,18,13,18,8,393,251,768,605,645,733,10,22,16,8,15,16,6 +257,279,738,736,678,632,12,13,16,11,6,13,326,246,601,591,729,977,13,30,19,4,4,9,250,308,668,634,1064,710,24,20,17,4,8,0,286,268,724,743,837,887,16,20,29,11,14,11,267,281,696,703,945,731,25,18,17,8,15,12,259,267,583,695,1112,721,24,18,20,6,8,2,253,267,690,574,802,1047,15,22,23,1,10,6,397,249,631,605,828,897,16,28,22,8,9,14,432,220,728,735,788,975,30,19,23,1,14,15,404,292,740,739,1069,704,18,26,27,14,15,2,331,323,586,628,987,744,15,23,23,18,9,4,211,235,825,759,780,738,3,20,10,17,5,1,265,179,789,823,822,700,5,20,8,2,4,12,279,249,577,579,854,987,10,23,16,0,8,11,263,249,602,622,1078,765,9,17,15,7,9,4,395,445,814,857,1289,586,15,19,23,9,17,3,431,377,825,812,672,1197,18,18,19,1,17,9,428,260,709,643,631,619,14,28,7,14,16,15,6 +348,502,725,966,613,856,17,29,35,11,13,15,337,215,558,793,664,1071,16,14,14,4,13,13,241,187,689,790,1005,886,19,28,24,8,3,4,299,153,761,955,796,891,13,18,14,15,9,3,234,232,733,897,912,821,20,8,24,12,10,10,188,314,578,775,1051,931,19,24,37,10,13,10,232,160,679,800,739,1105,18,6,14,1,3,6,360,306,620,825,767,999,19,16,21,8,6,18,441,303,711,977,719,1017,33,29,22,1,9,19,357,287,717,743,1000,884,13,16,16,14,10,2,344,426,579,738,918,960,10,17,42,18,18,8,218,398,802,993,719,906,8,32,29,17,12,3,306,418,762,1065,753,916,10,22,27,2,11,16,290,322,568,795,791,1151,13,13,29,0,3,7,226,334,597,572,1015,947,10,25,32,7,4,10,298,518,809,843,1220,824,10,31,44,9,16,7,418,428,816,1042,609,1117,23,28,22,1,12,13,449,315,688,883,578,733,11,12,22,14,13,19,6 +236,436,841,685,666,768,37,18,20,14,15,12,251,301,634,630,697,995,32,35,23,5,13,10,229,207,693,531,1074,806,15,9,13,1,1,1,295,205,821,732,891,1003,13,7,23,4,11,12,284,256,793,738,999,821,0,13,13,5,12,11,258,294,670,706,1108,755,1,5,12,1,5,1,270,342,739,529,768,1015,26,27,23,10,5,7,334,450,686,488,766,915,29,19,16,3,8,15,443,341,723,640,802,1019,27,30,15,4,11,16,397,299,845,770,1047,888,9,31,37,11,12,1,382,372,691,637,961,682,10,20,17,13,6,5,218,370,930,720,732,716,28,19,10,12,14,0,222,384,858,728,790,686,30,31,10,3,13,13,282,468,578,576,812,923,21,28,8,9,1,10,280,462,677,567,1016,803,18,12,7,14,0,3,344,442,913,840,1247,746,10,30,19,12,14,2,452,542,846,749,660,1171,43,31,15,6,14,8,323,379,800,598,683,833,21,15,19,13,13,16,6 +262,266,670,770,608,624,12,15,16,9,4,6,289,281,565,651,655,907,7,26,15,2,4,8,283,301,702,646,1046,680,24,24,9,10,10,9,367,313,694,753,841,863,24,24,21,17,10,12,248,330,666,705,957,713,25,20,9,14,11,3,266,292,539,663,1088,663,24,22,22,12,10,7,290,280,712,598,730,977,9,22,15,1,10,15,380,254,669,625,750,825,8,28,14,6,5,9,399,271,734,777,740,911,26,17,15,1,10,10,399,273,654,711,1011,736,16,22,31,12,11,7,326,312,508,596,931,660,15,23,23,16,7,13,224,174,739,823,704,660,9,18,12,15,3,8,354,182,733,865,770,628,7,18,10,0,2,7,272,256,575,593,778,907,4,23,14,2,10,2,286,260,604,554,1002,697,7,21,17,9,11,9,366,432,756,807,1225,610,15,17,27,9,13,8,434,402,809,838,602,1121,18,16,11,3,13,6,347,255,653,699,619,637,20,26,11,16,14,10,6 +312,292,662,826,608,636,13,24,19,7,4,9,331,211,559,651,655,853,18,19,14,14,4,9,249,359,674,836,1032,656,25,25,30,14,12,8,429,283,724,827,827,737,13,25,30,17,14,1,356,300,686,865,943,647,26,17,30,18,15,10,244,314,553,913,1074,721,25,27,21,12,12,16,320,264,692,716,730,911,20,15,30,17,12,2,356,216,627,731,750,795,21,19,35,10,7,14,503,199,734,833,734,875,31,20,36,17,12,17,331,333,648,859,1009,642,17,15,12,6,13,2,242,362,510,844,929,762,16,12,26,0,7,8,186,266,733,841,704,688,6,25,17,1,3,5,394,198,719,921,762,718,10,21,17,16,2,12,338,222,577,739,778,929,15,16,29,18,12,11,260,248,570,778,1002,727,12,22,24,11,13,16,352,486,758,1059,1225,586,16,22,28,9,15,13,538,342,817,902,602,1063,17,23,32,19,15,13,421,225,635,727,605,515,9,17,8,10,16,15,6 +352,304,667,791,627,630,16,25,17,11,6,12,397,259,498,620,676,861,21,24,16,18,10,10,329,349,661,807,1059,662,26,24,28,18,14,5,455,275,703,796,854,757,14,24,32,21,8,0,382,318,665,836,970,655,27,14,28,22,9,9,294,342,538,886,1101,717,26,24,17,16,14,13,384,272,643,695,749,917,19,16,32,21,12,3,426,250,580,706,773,793,22,18,33,14,9,15,541,249,675,794,753,875,34,23,34,21,16,16,331,325,657,858,1026,648,18,20,10,8,5,1,274,386,515,817,946,742,17,13,22,4,11,5,200,260,742,812,725,686,7,26,15,5,5,2,468,218,724,882,783,700,9,24,15,20,8,13,410,246,552,716,801,931,14,15,27,22,14,10,318,264,545,771,1025,731,11,21,22,15,13,13,366,514,759,1044,1242,586,17,23,26,13,7,10,570,386,758,867,621,1077,16,26,30,23,13,14,463,191,648,690,632,517,10,16,8,12,14,16,6 +224,214,666,628,625,594,14,13,9,5,6,12,291,365,595,547,662,935,9,30,28,8,6,10,237,299,654,600,1005,670,22,20,18,14,12,1,343,337,680,647,804,859,24,20,28,13,14,12,318,380,652,683,906,693,23,20,18,12,15,11,270,336,561,707,1051,661,22,18,13,14,12,1,274,316,698,494,737,1005,7,22,28,5,12,7,368,342,643,501,751,853,10,28,21,12,9,15,447,341,734,623,743,933,24,17,22,5,14,16,405,245,666,771,998,716,14,24,26,8,15,1,330,248,538,636,916,676,13,23,12,12,9,5,234,122,751,687,703,694,7,20,3,11,5,0,280,220,721,711,757,634,7,22,3,6,4,13,276,316,605,543,779,927,2,23,15,6,12,10,256,314,580,602,1001,703,5,17,10,3,13,3,418,372,738,861,1216,578,13,17,14,5,17,2,474,464,861,694,619,1149,20,16,20,7,17,8,373,309,639,555,600,643,22,28,12,10,16,16,6 +358,262,677,746,637,536,12,14,17,11,3,12,343,339,522,597,668,809,7,25,18,4,5,10,257,331,685,700,1055,562,24,25,22,14,17,1,447,351,677,721,860,731,30,25,34,17,13,8,362,328,649,683,966,595,25,25,22,16,12,11,268,332,552,701,1097,595,24,23,19,16,17,1,324,256,631,608,741,877,1,27,28,1,17,3,336,198,574,651,757,737,4,29,27,8,10,15,511,317,683,761,769,815,26,14,28,3,9,16,409,265,675,735,1020,624,16,17,20,14,10,1,336,280,549,650,940,630,15,28,24,18,12,5,284,192,760,787,711,612,13,11,9,17,4,0,346,204,746,849,779,580,9,15,7,2,5,13,336,182,538,601,785,841,4,26,21,0,17,10,256,184,551,660,1009,623,7,22,16,7,18,3,354,404,753,871,1232,530,15,16,24,9,12,2,562,358,776,818,629,1035,18,13,24,1,12,8,373,179,674,671,650,569,20,27,6,14,15,16,6 +287,197,765,782,636,660,16,15,13,15,8,11,394,320,500,677,667,993,21,26,20,6,12,11,338,326,737,672,1048,736,28,24,12,6,12,2,272,368,731,753,861,921,12,24,24,9,6,13,261,363,701,693,969,757,25,24,12,10,7,10,275,277,596,663,1090,735,24,22,13,4,10,0,299,275,573,608,738,1063,21,26,20,9,10,8,419,229,544,645,746,913,24,26,17,2,11,16,364,288,601,787,772,995,32,13,18,9,18,17,388,256,769,727,1017,752,16,16,26,14,1,0,307,213,631,596,933,742,15,25,18,8,7,6,163,133,854,845,704,754,7,10,7,7,9,1,377,147,842,875,772,702,11,16,5,8,10,14,359,217,528,597,782,991,16,27,11,10,12,9,327,215,593,582,998,771,13,21,8,9,11,2,357,343,837,815,1225,622,15,17,22,15,3,1,345,363,656,844,630,1209,18,12,14,11,15,9,390,268,762,701,653,667,8,26,12,8,14,17,6 +289,321,663,768,637,664,15,29,12,11,10,16,298,364,508,641,678,899,10,16,23,0,8,6,272,308,699,668,1075,682,21,26,13,10,6,3,428,248,705,759,870,825,27,16,25,17,18,4,325,309,677,721,986,701,22,6,13,14,19,13,317,341,534,711,1117,663,21,22,16,12,12,5,331,351,625,592,757,963,4,8,23,3,12,1,409,393,578,615,773,829,7,18,18,4,13,11,494,390,681,767,769,911,29,31,19,3,18,12,440,282,653,753,1040,768,13,16,29,10,19,5,351,311,523,642,960,678,12,19,17,14,13,1,269,187,738,817,731,714,10,32,6,13,9,4,353,301,728,855,799,636,8,24,4,2,8,9,295,345,510,593,801,923,1,15,12,4,6,14,307,341,551,570,1025,707,4,25,11,11,7,7,399,445,749,843,1252,654,12,31,19,11,21,6,541,537,780,836,629,1085,21,30,15,5,21,12,370,234,656,693,648,679,23,12,9,14,14,12,6 +357,299,742,804,607,638,19,22,19,10,8,15,394,250,499,645,642,823,24,23,14,17,12,11,314,292,752,830,1039,666,23,27,30,17,12,2,392,276,766,815,834,759,11,27,30,20,6,1,319,277,730,857,950,667,20,19,30,21,7,8,245,255,599,897,1081,699,19,25,21,15,10,10,357,227,652,708,721,885,20,19,30,20,10,4,367,229,605,717,737,765,23,21,35,13,11,16,504,226,670,817,743,857,33,18,36,20,18,17,256,246,734,871,1004,678,11,17,12,7,1,0,255,273,580,832,924,704,10,16,26,3,7,6,221,221,819,831,695,644,10,21,17,4,9,1,467,223,809,905,763,672,12,19,17,19,10,14,407,161,549,743,765,893,15,16,29,21,12,9,281,165,606,768,989,711,12,24,24,14,11,10,267,395,828,1047,1216,614,10,20,28,12,3,7,505,351,711,878,601,1025,23,21,32,22,15,13,444,230,733,713,624,539,11,19,8,11,14,17,6 +163,263,708,709,606,659,13,19,14,11,9,14,348,374,519,648,607,1012,18,34,17,10,13,8,322,284,688,571,910,739,25,10,7,10,11,1,290,284,690,728,781,936,11,12,17,13,7,14,331,339,662,728,863,762,24,14,7,14,8,13,283,347,549,690,954,734,23,8,6,8,11,3,317,305,602,529,626,1082,20,26,17,13,15,9,391,313,535,538,612,924,21,22,10,6,12,13,416,358,650,690,744,1006,31,25,9,13,17,14,380,222,710,772,891,761,15,28,29,10,8,3,291,315,578,625,799,745,14,25,11,4,14,3,187,173,795,762,586,763,6,16,10,3,8,2,323,237,775,778,630,701,10,26,8,12,11,11,359,275,537,568,672,996,15,27,2,14,11,12,311,275,540,553,864,772,12,13,1,7,10,5,419,411,782,830,1087,623,14,25,25,11,10,4,383,449,729,771,608,1218,19,26,9,15,16,10,296,228,703,646,655,682,9,20,19,10,11,14,6 +243,261,682,805,643,596,12,16,17,12,4,15,278,254,551,676,680,915,17,29,16,9,6,7,230,298,638,749,1013,654,26,21,22,9,18,2,354,284,688,836,806,817,14,23,32,12,18,3,295,289,646,852,912,673,27,19,22,13,17,12,185,253,569,866,1059,695,26,19,17,7,18,6,289,261,668,667,765,983,17,25,28,12,18,0,319,247,619,676,783,839,20,29,27,5,11,12,468,232,694,796,745,919,30,18,28,12,10,13,314,282,680,884,1012,648,18,17,16,11,11,4,241,289,554,799,930,724,17,24,22,5,13,2,175,217,765,816,735,690,3,19,11,4,5,3,343,177,733,884,777,682,7,19,9,11,6,10,309,229,591,700,807,935,12,24,21,13,18,13,211,231,582,761,1031,721,9,18,16,6,19,6,313,419,774,1030,1232,548,17,18,26,12,13,5,491,369,813,881,639,1131,16,19,24,14,13,11,360,248,661,686,602,549,12,23,8,9,16,13,6 +260,170,699,643,634,643,7,9,9,9,4,8,365,351,578,602,675,930,10,28,26,12,6,14,329,371,659,629,1072,711,29,22,16,12,18,5,363,413,669,676,867,906,19,26,28,15,16,16,300,412,617,702,983,738,30,28,16,16,15,11,232,324,566,732,1114,680,29,20,9,10,18,3,298,340,665,511,754,990,14,36,26,15,18,13,406,236,598,540,770,842,13,26,21,8,11,15,475,307,743,646,766,934,25,13,22,15,10,16,345,283,703,802,1037,759,21,18,24,8,9,3,258,226,549,661,957,659,20,25,14,2,13,9,92,130,788,716,728,665,4,2,3,1,5,4,396,136,778,734,796,637,4,14,3,14,6,15,372,254,584,562,798,908,9,29,15,16,18,10,292,254,575,643,1022,716,12,19,10,9,19,3,308,342,793,902,1249,627,20,13,16,9,11,2,472,354,778,703,626,1130,13,14,18,17,11,8,379,283,696,572,645,686,15,30,16,12,14,16,6 +308,250,621,804,634,646,13,14,19,10,7,10,411,309,512,679,635,991,18,31,12,1,5,12,313,369,609,678,956,722,29,19,10,11,11,3,317,379,581,767,807,901,17,21,22,18,15,14,348,374,553,697,895,743,30,21,10,15,16,9,288,322,486,633,998,735,29,17,11,13,11,1,306,300,587,634,658,1061,16,25,16,2,11,9,466,172,524,667,654,909,19,25,15,5,10,17,483,293,679,817,780,987,31,16,16,2,15,18,477,305,627,715,933,716,21,23,18,11,16,1,350,326,523,598,843,758,20,26,16,15,10,7,210,202,710,857,620,750,4,15,15,14,6,2,324,168,702,905,682,714,6,17,13,1,5,15,356,226,532,625,702,1001,11,26,9,3,11,8,312,238,477,614,906,779,12,16,6,10,12,1,454,446,689,789,1133,600,20,16,30,10,18,0,444,352,740,870,638,1209,13,17,12,4,18,10,457,231,632,737,687,633,13,27,14,15,15,18,6 +225,195,687,701,684,749,14,15,13,12,8,11,364,266,556,598,703,1024,19,32,24,9,6,13,324,388,633,579,1036,817,28,18,14,9,6,4,350,372,663,688,891,1022,16,24,24,12,8,15,381,365,635,694,991,836,29,30,14,13,9,10,305,313,512,658,1070,776,28,20,5,7,6,2,321,359,647,521,750,1058,15,36,24,12,6,10,403,315,576,544,728,938,18,20,17,5,3,18,474,234,711,696,826,1042,32,19,16,12,8,19,416,336,691,722,1021,877,20,20,32,11,11,2,323,315,537,589,927,719,19,25,10,5,5,8,193,225,776,764,694,739,5,8,11,4,7,3,371,157,756,784,752,713,7,18,11,11,6,16,363,357,516,538,798,966,10,31,9,13,6,7,331,363,525,513,978,816,11,15,6,6,7,0,395,425,751,788,1209,729,19,17,18,12,11,1,439,385,776,765,682,1208,14,18,16,14,11,11,348,370,676,654,713,804,14,28,20,9,10,19,6 +255,169,712,709,637,688,13,13,16,10,9,10,386,338,507,634,658,1013,18,28,23,1,13,12,358,392,678,597,1045,766,29,22,13,9,11,3,294,434,700,690,856,967,15,26,23,16,9,16,261,435,646,634,956,785,28,28,13,13,10,9,321,345,569,612,1087,745,27,22,10,11,11,3,331,351,578,535,727,1065,22,32,23,2,13,11,419,225,529,582,743,925,21,28,16,5,12,13,366,296,652,702,777,1019,31,15,15,2,19,14,444,312,716,694,1010,802,19,20,29,11,2,3,331,267,574,549,930,724,18,27,15,15,8,7,187,161,801,776,701,746,8,8,4,14,8,2,377,123,787,790,769,704,12,12,4,1,11,11,367,277,535,526,771,973,17,29,8,3,11,8,357,275,562,557,995,783,14,19,5,10,10,5,405,393,808,778,1222,658,18,11,19,10,4,4,347,363,709,771,633,1209,15,14,15,4,16,6,370,264,709,656,660,725,7,32,15,15,15,14,6 +329,275,639,890,676,626,9,26,22,12,6,10,302,206,592,709,725,883,14,25,13,9,4,10,194,332,655,844,1080,650,27,23,29,9,8,7,430,286,691,887,859,757,17,23,29,12,12,0,369,291,663,903,971,647,28,21,29,13,13,9,225,283,530,917,1126,721,27,25,26,7,8,15,319,267,703,732,798,945,14,19,29,12,8,3,323,207,632,757,822,817,17,13,34,5,7,15,506,192,755,897,794,899,27,16,35,12,12,16,352,342,629,847,1073,636,19,19,15,11,13,1,299,355,487,848,991,774,18,10,29,5,7,7,221,257,714,891,774,698,0,23,16,4,5,4,351,167,694,985,824,722,4,17,14,11,4,13,305,261,588,763,850,935,9,12,28,13,8,10,195,271,567,776,1074,731,10,20,23,6,9,15,347,479,733,1059,1291,566,18,18,29,12,15,12,563,327,852,966,670,1077,15,25,31,14,15,12,360,276,616,785,641,517,15,15,7,9,14,16,6 +233,169,596,715,642,613,7,14,14,15,4,13,298,304,553,646,663,974,12,27,19,6,4,9,260,416,584,585,1014,693,33,23,11,6,16,0,356,432,586,702,845,890,21,25,23,9,18,15,307,431,560,660,929,716,34,25,11,10,17,12,295,367,485,620,1058,696,33,21,14,4,16,2,297,331,662,539,726,1044,14,27,19,9,16,10,401,207,591,574,734,886,15,25,16,2,9,14,408,262,718,714,770,968,25,12,17,9,12,15,466,326,600,704,997,715,25,17,27,14,13,2,319,325,492,547,913,711,24,24,19,8,11,4,171,211,685,770,688,725,6,9,8,7,3,1,323,99,663,802,752,667,4,15,6,8,4,12,267,281,559,538,768,960,13,28,10,10,16,11,307,279,508,533,986,736,16,20,9,9,17,4,441,441,666,772,1209,579,24,16,23,15,15,3,411,311,807,783,636,1180,9,13,13,11,15,9,380,298,589,634,639,636,15,27,11,8,18,15,6 +236,182,715,746,654,669,8,16,12,12,4,12,307,305,622,655,663,1034,9,29,19,9,4,10,247,335,655,628,986,749,28,21,9,9,10,1,333,367,673,731,821,944,20,25,19,12,12,14,308,368,649,697,885,768,29,25,9,11,11,11,226,278,548,653,1032,750,28,19,4,7,10,1,236,272,691,576,716,1104,13,29,19,6,10,9,388,192,622,603,732,946,12,23,12,5,5,15,401,257,733,743,772,1028,26,16,11,6,10,16,419,283,719,731,971,757,20,19,25,11,11,1,262,272,565,598,895,767,19,24,9,11,5,5,158,174,804,807,690,785,5,9,8,10,3,0,316,124,772,831,738,725,3,15,8,7,2,13,258,274,570,573,756,1018,8,26,4,7,10,10,256,274,571,594,980,794,11,18,1,6,11,3,440,396,785,815,1193,621,19,16,23,12,13,2,380,316,830,812,648,1240,14,15,11,8,13,8,373,295,700,689,669,676,16,27,21,9,12,16,6 +281,193,611,734,664,708,8,16,12,13,2,10,370,352,594,649,671,1051,13,29,19,2,6,12,320,416,627,596,986,782,36,21,9,4,16,3,316,446,649,691,855,983,24,27,19,11,12,18,301,433,627,627,941,801,37,29,9,8,13,9,287,349,500,577,1020,771,36,23,4,6,16,1,263,355,679,552,696,1111,11,33,19,5,16,13,423,199,624,581,676,963,12,25,12,2,9,17,434,284,759,733,812,1051,26,16,11,5,12,18,466,320,615,665,967,824,28,19,31,10,7,1,281,291,475,510,875,768,27,24,9,12,11,7,197,197,700,813,648,792,9,9,8,11,3,2,347,147,680,821,702,736,7,13,8,4,4,15,331,267,594,543,742,1019,16,28,4,6,16,8,353,271,553,494,928,813,19,18,1,13,17,1,437,405,671,709,1157,678,27,12,23,13,9,0,363,295,828,790,666,1251,6,15,11,7,9,10,374,282,608,707,705,749,20,31,21,12,16,18,6 +237,339,941,718,557,739,27,23,10,15,8,9,246,308,620,641,542,846,22,24,21,4,12,7,268,246,845,570,861,759,23,26,11,4,12,10,282,270,931,721,706,948,15,26,21,7,8,11,229,235,887,703,792,752,10,22,11,8,9,4,199,159,780,631,899,666,9,24,2,2,10,8,241,279,737,536,557,856,16,22,21,7,12,12,279,317,702,553,581,784,19,24,14,0,11,12,306,256,757,699,691,894,37,19,13,7,18,13,256,224,935,713,834,871,1,12,29,12,1,8,241,169,781,578,748,553,0,23,7,10,7,10,245,283,1020,779,541,691,18,16,8,9,9,9,399,235,980,787,591,575,20,24,10,6,10,10,293,199,608,549,599,764,11,23,6,8,12,3,259,173,801,506,807,724,8,23,3,11,11,6,289,317,1017,799,1034,731,0,23,21,15,3,7,303,439,730,778,555,1012,33,18,13,9,15,9,312,234,910,677,634,830,13,16,23,10,14,13,6 +240,240,654,712,632,683,8,12,14,10,11,13,331,285,655,599,683,1036,7,31,21,3,9,9,297,343,628,584,1016,763,28,17,13,7,7,0,281,341,664,713,799,932,22,17,25,14,19,13,318,368,636,681,913,784,29,19,13,11,20,12,342,332,539,649,1064,764,28,15,18,9,13,2,302,334,736,560,758,1104,13,23,21,0,13,8,424,294,665,577,786,956,10,29,18,7,14,14,431,283,778,713,740,1036,26,20,19,0,19,15,481,321,658,717,1021,765,22,27,31,13,20,2,414,338,550,592,939,787,19,22,21,17,14,4,304,212,743,757,738,795,7,21,8,16,10,1,244,164,709,801,774,743,5,21,6,1,9,12,298,296,609,563,810,1036,10,24,12,1,7,11,328,296,568,584,1034,812,13,16,13,8,8,4,464,464,726,807,1241,635,19,20,21,8,22,3,422,418,883,786,628,1254,14,19,15,2,22,9,439,251,623,631,583,654,14,25,11,15,13,15,6 +313,199,645,751,628,632,11,16,12,12,11,11,386,312,558,652,677,973,16,29,19,5,9,13,310,366,603,655,1032,710,33,21,11,11,7,4,364,376,599,732,815,891,21,21,23,16,19,15,321,369,575,686,931,737,34,19,11,15,20,10,313,335,514,664,1078,713,33,19,18,13,13,2,327,315,629,585,750,1043,10,23,19,2,13,10,455,225,572,624,774,893,13,27,16,9,14,18,490,296,707,764,746,971,29,18,17,2,19,19,460,324,649,724,1025,730,25,23,29,15,20,2,393,329,541,597,943,728,24,24,19,19,14,8,219,225,734,802,726,736,6,17,8,18,10,3,329,127,714,852,776,684,4,21,6,3,9,16,321,269,552,580,802,977,13,24,10,1,7,7,311,269,513,585,1026,753,16,18,13,8,8,0,415,453,709,818,1243,606,24,18,23,10,22,1,491,347,790,825,622,1193,9,17,13,0,22,11,462,240,642,674,601,649,19,25,9,13,13,19,6 +308,274,634,833,617,619,16,20,17,10,3,14,337,239,493,660,648,890,19,23,14,11,5,8,261,331,664,801,1039,661,26,25,24,11,17,1,395,287,654,832,842,812,18,27,30,14,13,2,354,310,614,856,950,676,27,17,24,15,14,11,230,298,515,870,1081,702,26,23,21,9,17,9,338,272,640,689,721,958,13,17,30,14,17,1,354,244,573,714,737,818,16,19,29,7,10,13,521,231,690,840,753,904,34,20,30,14,11,14,321,313,630,840,1004,663,18,21,14,9,8,3,286,336,488,809,924,729,17,14,22,3,12,3,228,226,715,848,695,681,7,25,15,2,4,2,390,184,703,928,763,691,9,21,15,13,5,11,364,236,541,718,765,926,8,14,23,15,17,12,244,246,530,759,989,720,9,22,18,8,18,9,316,462,724,1032,1216,575,17,20,28,10,10,6,552,380,753,909,611,1106,16,21,26,16,10,12,379,229,629,738,634,554,16,19,6,11,15,14,6 +296,292,682,769,632,721,10,14,18,11,11,8,309,269,603,630,677,1020,13,31,15,4,9,14,253,281,666,675,1052,781,26,17,19,10,3,5,391,271,678,756,839,882,22,19,31,17,15,12,304,346,650,738,953,806,27,19,19,14,16,9,264,304,559,720,1096,814,26,15,24,12,9,3,296,254,688,601,754,1082,9,23,25,1,9,7,344,272,629,626,776,958,12,25,24,8,10,15,489,273,744,778,756,1038,26,18,25,1,15,16,407,261,684,738,1027,789,18,27,23,14,16,3,358,326,554,653,949,831,17,26,25,18,10,9,262,206,769,818,732,811,5,19,14,17,10,4,280,224,741,866,788,787,3,19,12,2,9,13,308,306,601,602,802,1064,6,24,18,0,3,8,262,310,574,581,1026,846,9,16,19,7,4,3,370,428,756,852,1245,687,17,18,27,9,18,2,510,392,845,843,624,1208,16,19,21,1,18,8,363,277,659,688,629,642,20,27,5,14,17,16,6 +279,191,707,685,640,632,16,15,9,14,5,12,412,344,512,606,689,993,21,26,24,7,9,10,378,390,659,631,1060,712,28,24,16,7,15,1,306,428,669,670,855,903,16,24,28,10,13,14,269,419,639,674,971,733,29,22,16,11,14,11,305,347,542,696,1102,713,28,22,13,5,15,1,343,347,551,513,762,1063,19,28,24,10,17,9,425,227,512,566,786,905,22,28,21,3,12,15,410,324,625,680,758,987,34,15,22,10,15,16,416,320,711,764,1037,716,20,14,26,13,6,1,325,257,589,627,955,734,19,27,16,7,12,5,177,179,796,736,738,744,7,10,3,6,6,0,393,153,776,768,788,690,9,16,3,9,7,13,407,253,522,532,814,985,14,27,15,11,15,10,357,249,533,605,1038,761,11,21,10,8,14,3,365,403,777,866,1255,584,19,17,18,14,8,2,413,385,714,749,634,1203,14,14,18,12,12,8,386,244,704,586,633,635,10,26,12,7,13,16,6 +284,278,644,727,614,562,10,15,14,14,3,8,289,269,561,598,627,881,5,28,17,7,5,12,251,341,664,691,1016,628,26,22,17,7,17,5,441,315,668,752,825,795,32,22,29,10,15,12,374,334,640,766,927,653,27,16,17,11,14,7,280,322,525,768,1058,651,26,20,16,5,17,3,338,274,658,615,698,951,1,26,23,10,17,7,326,224,597,624,714,807,2,32,22,3,10,13,509,269,728,742,758,885,24,21,23,10,11,14,371,311,638,824,981,646,18,18,19,13,12,3,334,354,508,727,901,670,17,27,17,7,12,9,272,216,723,770,672,656,15,18,10,6,4,4,324,176,705,830,740,628,11,20,10,9,5,11,336,250,565,646,742,907,6,27,16,11,17,6,256,258,546,723,966,685,9,19,11,8,18,5,366,476,720,948,1193,536,17,21,25,14,14,4,566,378,827,799,612,1107,16,20,19,12,14,6,325,225,633,648,643,575,18,26,9,7,17,14,6 +238,202,704,675,656,658,11,13,16,14,8,10,375,339,597,602,691,1027,16,28,25,7,12,18,369,425,706,563,1042,738,33,22,15,7,12,9,281,447,798,666,851,937,19,26,25,10,10,12,238,430,738,652,951,759,32,28,15,11,11,15,296,340,629,642,1086,737,31,22,12,5,10,7,324,348,654,493,764,1097,22,36,25,10,14,17,418,200,617,532,776,939,19,26,18,3,11,19,379,299,738,662,774,1021,27,15,17,10,18,12,393,333,654,726,1027,758,23,18,31,13,1,7,308,258,554,567,945,758,22,25,17,7,7,13,176,200,739,730,728,778,12,4,4,6,9,8,368,152,755,750,786,714,16,12,4,9,10,21,386,240,643,494,806,1009,21,29,10,11,12,14,348,240,654,541,1028,785,18,19,7,8,11,7,342,386,790,798,1245,618,22,13,17,14,3,6,324,332,807,735,652,1233,11,14,17,12,15,10,363,249,641,608,629,679,11,30,13,7,14,18,6 +234,220,674,713,653,692,7,15,16,14,4,11,349,299,641,600,698,1019,8,28,19,7,2,11,305,313,650,637,1055,770,29,22,17,7,10,2,305,331,680,708,834,901,21,22,29,10,12,11,260,350,652,712,946,791,30,20,17,11,11,10,264,308,549,710,1101,781,29,20,20,5,10,0,298,282,732,543,775,1085,14,28,23,6,10,6,418,252,661,570,797,953,11,30,22,3,3,16,415,289,780,716,769,1031,25,19,23,6,8,17,401,277,678,748,1040,760,21,18,27,13,9,0,334,310,544,641,964,804,20,29,23,11,5,6,194,182,763,762,753,798,6,14,10,10,3,1,322,154,735,804,805,760,6,20,8,7,2,14,322,296,601,562,823,1047,11,29,16,7,10,9,288,296,588,587,1047,825,12,19,15,8,11,2,378,424,748,862,1262,646,20,19,23,14,11,1,432,390,873,785,645,1247,13,18,19,8,11,9,407,269,659,630,638,615,13,26,7,9,12,17,6 +245,559,785,1003,652,871,16,32,32,13,14,14,258,182,718,846,691,1086,17,23,17,2,10,6,268,186,713,799,978,893,22,15,27,2,12,15,234,100,903,1046,747,846,28,11,17,5,0,6,165,215,857,1040,851,804,35,7,27,6,1,15,191,355,696,944,1028,980,32,13,40,0,8,23,223,219,841,847,782,1100,25,15,17,7,8,3,303,363,768,834,810,1006,22,23,24,2,11,11,314,304,817,986,716,1026,14,36,25,5,2,16,238,302,737,864,997,853,32,19,13,10,1,9,263,485,595,905,913,1025,29,24,39,12,11,15,285,441,822,990,762,929,25,33,30,11,9,12,317,451,796,1074,764,977,23,35,28,4,10,9,297,349,672,882,818,1172,30,20,32,6,12,14,271,359,739,697,1032,982,35,18,35,13,11,21,267,575,873,996,1187,815,29,36,41,13,7,20,311,405,954,1079,636,1116,22,37,25,7,7,18,328,338,694,886,573,690,16,7,19,12,12,12,6 +222,368,808,792,539,646,22,25,13,10,8,9,277,277,569,705,520,805,17,14,18,11,12,5,305,285,794,666,803,682,18,32,8,11,12,12,381,245,858,767,700,885,20,28,18,14,4,9,276,248,808,737,772,693,15,24,8,15,5,2,284,200,667,677,821,593,14,30,5,9,10,10,254,282,724,610,531,847,11,20,18,14,8,12,306,330,671,635,511,719,14,26,11,7,11,8,305,245,782,787,681,837,36,19,10,14,16,9,301,231,796,749,792,794,6,2,28,9,1,10,200,226,642,628,690,506,5,21,10,3,7,10,222,290,881,859,511,616,13,18,9,2,9,11,428,268,865,875,517,522,15,22,7,13,10,6,306,190,535,621,573,755,6,21,3,15,12,3,326,164,702,562,729,641,3,27,0,8,11,10,400,358,894,827,966,648,5,29,24,10,3,9,308,452,739,848,541,993,28,18,10,16,15,9,243,213,795,751,632,751,18,14,20,11,12,9,6 +299,241,672,727,582,616,13,15,17,11,4,11,338,300,503,598,621,881,16,22,18,18,6,11,250,370,696,741,1016,666,27,28,26,18,18,2,410,386,674,734,811,807,21,28,34,21,16,7,357,367,646,762,927,695,28,22,26,22,15,10,211,333,537,800,1058,687,27,26,17,16,18,2,319,269,632,637,698,947,10,26,32,21,18,4,349,181,569,654,716,815,13,28,31,14,11,16,502,280,700,740,724,895,31,15,32,21,8,17,302,288,672,842,981,686,19,14,14,8,9,0,251,277,534,741,901,702,18,27,22,4,13,6,167,177,757,776,672,672,4,12,11,5,5,1,367,169,743,828,740,658,6,14,11,20,6,14,355,191,557,664,744,925,7,23,25,22,18,9,249,191,542,727,968,711,10,25,20,15,19,2,335,403,750,976,1193,594,18,17,24,13,11,1,545,329,769,801,578,1109,15,14,28,23,11,9,402,232,671,646,609,573,19,26,8,12,14,17,6 +303,215,703,740,624,669,7,14,19,11,11,10,276,248,614,645,665,986,12,29,22,0,9,12,258,408,649,560,1062,739,29,17,12,6,3,3,350,352,645,737,857,944,25,25,22,13,15,18,321,367,627,699,973,760,30,25,12,10,16,9,289,311,548,605,1104,720,29,19,19,8,9,1,293,347,661,558,744,1038,6,27,22,3,9,13,347,239,608,575,760,898,9,25,15,4,10,17,476,230,739,725,756,992,25,20,14,3,15,18,414,358,707,679,1027,797,21,19,34,10,16,1,429,327,565,544,947,699,20,20,22,14,10,7,287,221,792,787,718,719,8,19,9,13,10,2,245,107,772,813,786,677,4,15,7,2,9,15,305,285,584,565,788,948,9,24,11,4,3,8,303,295,563,498,1012,758,12,16,14,11,4,1,351,451,763,739,1239,649,20,12,20,11,18,0,497,357,810,802,616,1182,13,19,14,5,18,10,340,296,694,675,635,724,23,25,16,14,17,18,6 +263,211,670,765,605,596,11,14,14,13,3,12,332,276,529,660,612,919,16,27,17,6,3,10,266,354,640,705,929,664,27,23,15,6,15,1,328,336,630,772,796,845,19,23,27,11,17,12,317,353,610,794,854,695,28,21,15,10,16,11,227,293,547,784,975,671,27,21,14,6,15,1,285,277,636,613,665,989,12,25,21,5,15,7,393,199,593,622,665,839,15,27,20,2,8,15,450,256,684,768,729,917,29,16,21,5,11,16,366,288,674,850,924,694,19,17,19,14,12,1,319,293,544,731,834,686,18,26,15,12,10,5,195,187,759,812,619,682,2,15,10,11,4,0,355,125,733,856,675,642,4,19,10,4,3,13,305,243,587,654,707,929,7,26,14,6,15,10,225,243,546,709,917,707,10,20,9,9,16,3,383,415,742,942,1134,574,18,16,25,13,14,2,469,343,777,837,601,1139,15,15,17,7,14,8,386,258,661,682,606,615,17,27,11,12,17,16,6 +363,351,624,765,597,581,13,26,21,8,5,15,358,292,475,592,626,744,8,17,10,15,7,13,258,294,660,767,1023,551,23,33,28,15,19,4,484,270,658,760,818,654,29,23,26,18,17,3,419,279,630,780,934,574,24,13,28,19,16,10,247,341,491,808,1065,598,23,29,19,13,19,10,353,189,594,661,705,790,2,19,26,18,19,6,335,211,543,682,721,676,5,25,33,11,12,18,550,294,646,780,743,756,29,24,34,18,9,19,326,264,616,804,988,627,15,11,10,5,10,2,297,347,486,757,908,647,14,20,24,1,14,8,229,235,701,796,679,609,12,17,17,2,6,3,401,295,693,868,747,595,8,17,19,17,7,16,359,177,483,688,749,810,3,20,27,19,19,7,227,211,522,721,973,612,6,28,22,12,20,10,345,463,708,990,1200,571,14,28,32,10,12,7,609,379,747,833,597,940,19,23,30,20,12,13,388,152,617,686,632,534,23,15,10,9,15,19,6 +284,290,665,764,589,568,12,17,16,12,5,14,259,213,602,609,630,861,11,28,15,1,3,8,251,331,705,716,1027,612,24,18,19,7,13,1,455,279,711,781,822,797,24,18,31,14,15,6,394,296,683,791,938,647,25,18,19,11,14,11,286,320,552,809,1069,635,24,16,22,9,13,3,314,260,721,616,709,931,7,22,25,4,13,1,338,258,654,659,725,779,10,26,24,3,8,13,473,225,777,773,721,857,26,23,25,4,13,14,357,317,657,797,992,646,16,24,17,9,14,3,340,372,511,740,912,652,15,21,19,13,8,3,288,256,742,783,683,626,7,22,12,12,4,2,358,208,718,861,751,608,5,24,12,3,3,11,290,248,602,643,753,879,4,21,18,5,13,12,244,270,591,722,977,663,7,15,17,12,14,5,374,496,741,977,1204,542,15,23,27,12,16,4,544,368,862,840,581,1079,18,22,21,6,16,10,277,225,638,671,600,573,22,22,5,13,15,14,6 +323,331,649,835,574,573,16,19,21,8,10,15,328,248,500,682,587,780,15,22,10,15,12,11,230,330,687,807,972,585,22,28,22,15,18,2,384,310,665,830,785,716,22,30,26,18,16,1,361,321,637,844,883,612,23,24,22,19,17,8,161,273,534,848,1014,618,22,26,13,13,16,10,277,253,653,701,654,844,9,22,26,18,18,4,267,171,588,726,670,720,12,24,27,11,17,16,478,222,693,850,722,800,34,13,28,18,12,17,230,266,643,858,937,623,14,14,6,5,7,0,185,251,501,793,857,659,13,19,18,1,13,6,209,237,728,864,628,597,7,18,17,2,11,1,397,255,716,938,696,615,9,16,19,17,12,14,351,113,536,736,698,842,4,19,21,19,18,9,209,131,547,789,922,634,5,25,16,12,17,10,291,383,737,1028,1149,553,13,17,32,10,9,7,505,313,762,903,576,1004,20,16,24,20,9,13,380,236,642,746,619,506,20,22,12,9,12,17,6 +214,180,599,774,651,687,5,13,16,11,2,9,287,283,606,663,698,1040,10,28,21,0,2,15,259,403,619,630,1073,765,31,22,11,8,12,6,325,413,637,763,860,936,19,26,21,15,14,15,282,430,605,713,974,784,32,26,11,12,13,12,260,312,498,657,1117,772,31,20,12,10,12,4,286,364,691,598,773,1108,16,28,21,3,12,12,398,236,616,623,793,960,13,26,14,4,5,18,423,247,763,773,777,1040,23,13,15,3,10,15,437,359,603,719,1052,769,23,20,29,10,11,4,316,288,479,590,972,791,22,25,17,14,7,10,160,202,688,829,747,801,4,10,6,13,3,5,294,80,674,861,805,749,6,14,4,2,0,18,284,294,578,599,821,1038,11,29,8,4,12,11,282,302,531,562,1045,814,14,19,7,11,13,4,404,424,707,803,1268,639,22,13,21,11,13,3,418,336,844,842,645,1256,11,14,13,5,13,9,397,317,598,705,630,660,13,30,13,14,14,17,6 +315,261,814,635,664,645,17,14,15,11,3,11,408,426,509,574,705,840,12,31,28,10,5,11,302,324,790,545,1102,665,19,19,18,10,17,2,386,372,762,630,897,854,25,21,28,13,15,17,381,397,738,624,1013,658,20,23,18,14,16,10,265,347,641,628,1144,578,19,17,7,8,17,0,363,357,596,463,784,904,6,31,28,13,17,12,417,321,571,496,800,752,9,23,21,6,10,16,546,406,614,630,796,840,33,16,20,13,11,17,346,256,820,712,1067,777,11,19,30,10,10,0,339,203,664,553,987,585,10,28,12,4,12,6,157,179,903,710,758,661,8,7,5,3,4,1,415,277,895,718,826,553,10,17,5,12,5,14,421,231,561,470,828,812,1,32,13,14,17,9,275,211,632,517,1052,630,2,16,10,7,18,2,331,335,878,778,1279,637,10,18,14,11,12,1,541,469,607,695,656,1042,23,17,20,15,12,9,450,210,821,602,675,736,23,25,18,10,15,17,6 +315,341,634,698,623,651,12,25,16,10,11,14,384,256,531,565,664,886,17,26,17,11,9,8,324,366,658,698,1061,687,26,22,27,11,7,1,464,260,670,743,856,816,18,16,33,14,19,2,407,311,642,779,972,714,27,8,27,15,20,11,337,401,511,823,1103,712,26,20,22,9,13,9,421,359,660,606,743,938,13,18,33,14,13,1,445,349,595,603,759,824,16,24,32,7,14,13,592,286,718,693,755,910,30,31,33,14,19,14,414,372,626,817,1026,705,18,20,15,9,20,3,343,459,476,756,946,723,17,21,23,3,14,3,233,313,711,715,717,679,3,26,14,2,10,2,423,265,697,781,785,689,5,26,14,13,9,11,405,363,543,647,787,934,8,19,26,15,7,12,317,375,542,706,1011,736,9,19,21,8,8,9,389,581,724,985,1238,621,17,31,25,10,22,6,621,449,791,774,615,1102,16,30,29,16,22,12,418,266,619,599,634,584,16,16,5,11,13,14,6 +306,302,772,774,647,624,21,14,19,9,7,14,321,287,489,639,682,899,16,27,16,2,5,8,233,249,732,624,1029,670,15,23,14,8,9,1,299,247,750,781,854,883,21,23,26,15,15,12,270,264,720,739,954,701,16,21,14,12,16,13,222,220,619,675,1063,631,15,21,21,10,9,3,294,258,636,608,755,969,10,23,20,1,9,7,364,320,599,623,753,811,13,29,19,6,10,13,473,259,630,775,765,893,31,16,20,1,15,14,343,223,776,727,1018,746,7,23,28,12,16,3,356,260,628,610,930,644,6,24,26,16,10,3,242,212,861,813,713,658,12,17,11,15,6,2,316,224,837,863,761,602,14,17,9,0,5,11,332,254,569,617,799,887,5,24,13,2,9,12,216,244,620,576,1003,667,2,20,16,9,10,5,318,378,850,815,1224,608,6,16,26,9,18,4,470,440,695,848,641,1105,27,15,16,3,18,10,399,265,763,693,640,681,19,27,10,16,17,14,6 +257,343,855,823,734,596,29,26,18,11,6,15,310,238,656,716,763,861,30,33,17,10,4,7,244,258,747,843,1046,648,15,15,31,10,8,2,352,208,879,898,821,733,17,21,33,13,10,3,329,211,837,936,911,659,22,19,31,14,9,12,189,201,712,980,1098,707,21,13,20,8,8,10,301,235,781,761,856,921,38,25,33,15,8,0,307,291,726,730,878,813,35,25,36,6,3,12,478,214,787,810,808,899,21,24,37,13,10,13,264,246,849,952,1071,622,21,23,11,10,7,4,237,307,695,913,987,742,22,20,25,4,3,2,219,283,934,834,830,672,24,27,16,3,5,3,375,245,884,898,848,694,28,25,16,12,4,10,333,277,636,798,892,941,33,20,30,14,8,13,199,275,721,883,1108,729,30,12,25,7,9,10,295,425,949,1156,1239,548,22,24,25,11,9,7,489,409,898,899,726,1097,35,29,33,15,9,13,382,284,814,700,665,467,13,13,7,10,10,13,6 +388,298,733,923,644,782,20,17,37,11,15,10,355,287,454,772,691,1033,17,24,14,4,13,12,255,279,731,739,1074,838,24,22,24,12,1,3,311,275,733,888,869,955,20,22,14,17,11,6,278,324,705,814,985,851,25,22,24,16,12,11,238,234,568,652,1116,835,24,20,37,14,5,3,250,166,589,751,766,1089,11,18,14,1,5,5,384,212,544,782,786,965,14,22,21,8,8,17,429,265,615,934,770,1055,38,15,22,1,11,18,399,233,733,652,1045,866,16,26,16,14,12,1,356,254,579,655,965,824,15,23,42,18,10,7,228,184,818,974,740,818,11,16,29,17,14,2,334,230,804,1022,798,792,13,18,27,2,13,15,292,240,486,740,814,1063,6,17,29,0,1,10,280,250,575,567,1038,863,7,23,32,7,0,3,322,368,809,714,1261,756,15,19,44,9,14,0,392,358,664,987,638,1183,18,14,22,1,14,10,463,273,732,852,647,743,18,24,22,14,15,18,6 +261,203,762,678,637,665,13,13,10,13,5,12,402,294,595,609,682,1030,12,28,23,8,7,10,376,360,658,624,1027,745,23,22,15,8,17,1,290,356,712,679,812,940,17,22,27,11,15,16,257,369,688,673,926,766,24,22,15,12,16,11,311,297,595,707,1073,744,23,20,14,6,15,1,347,323,628,524,763,1100,20,26,23,7,19,11,421,259,583,569,787,942,17,28,20,4,12,15,378,266,664,669,745,1024,27,15,21,7,13,16,420,310,766,783,1016,753,19,20,27,12,6,1,341,257,618,634,940,763,16,27,17,10,12,5,209,179,851,733,743,781,12,14,4,9,6,0,391,135,809,757,785,719,16,18,2,6,7,13,383,253,557,533,809,1016,21,27,14,8,17,10,347,249,590,614,1033,792,18,19,9,7,16,3,399,399,830,875,1234,617,16,15,19,13,8,2,365,387,767,746,629,1238,19,14,17,9,10,8,382,262,735,587,616,672,3,28,11,10,13,16,6 +299,333,652,871,596,586,16,18,23,13,5,15,304,224,479,702,597,865,21,27,8,8,7,7,228,318,672,769,950,632,26,23,14,8,19,2,404,274,666,842,769,787,16,25,24,11,17,3,317,293,622,812,861,659,27,19,14,12,18,12,225,301,535,758,992,663,26,21,15,6,19,8,277,219,624,715,632,933,15,19,20,11,19,0,339,183,571,756,648,793,18,23,19,4,12,12,474,218,660,886,742,871,34,18,20,11,11,13,362,310,648,806,915,642,18,17,14,12,12,4,233,363,510,721,835,696,17,18,20,6,14,2,209,235,731,894,606,648,7,23,19,5,6,3,369,247,723,974,676,652,9,19,17,10,7,10,295,211,547,702,676,901,10,18,13,12,19,13,237,243,542,733,900,687,9,20,10,7,18,8,367,487,744,940,1127,556,17,18,34,13,14,5,485,323,729,939,600,1091,16,19,16,13,14,11,428,214,651,784,649,543,14,23,12,8,17,13,6 +280,258,902,637,552,703,28,24,2,7,5,11,315,373,579,588,591,722,23,33,29,14,3,11,207,269,800,659,988,655,24,5,19,14,9,2,381,311,874,664,783,806,14,21,29,17,9,13,436,302,846,704,899,624,9,21,19,18,10,10,198,230,731,734,1030,624,8,9,6,12,9,0,336,286,692,531,670,746,17,25,29,17,11,8,278,326,671,548,686,650,20,13,22,10,6,16,517,295,640,634,694,748,36,30,21,17,9,17,193,181,906,798,953,777,0,29,19,6,10,0,238,186,752,683,873,607,1,18,1,0,4,6,228,178,991,702,644,629,19,19,14,1,4,1,400,226,949,722,712,633,21,27,14,16,3,14,358,242,549,558,714,674,12,24,14,18,9,9,162,226,730,643,938,632,9,6,11,11,10,2,292,278,974,924,1165,697,1,18,13,9,12,1,540,436,681,701,548,890,34,31,21,19,12,9,351,309,881,574,581,780,12,15,17,10,11,17,6 +248,156,735,644,600,667,9,12,11,10,2,13,329,385,596,559,631,1008,14,29,28,3,4,9,279,335,701,596,1012,743,27,21,18,9,14,0,345,379,709,659,827,940,23,23,28,16,16,15,348,424,681,685,931,770,28,23,18,13,15,12,272,372,588,697,1054,740,27,19,15,11,14,2,300,336,673,498,702,1068,8,27,28,0,14,10,366,244,610,515,710,920,11,27,21,7,7,14,483,361,739,645,736,1008,27,16,20,0,10,15,371,251,739,767,981,773,19,23,28,13,11,2,352,278,603,628,897,737,18,24,14,17,9,4,214,104,824,703,668,749,6,13,5,16,1,1,288,186,804,733,736,703,2,21,3,1,2,12,344,300,592,543,744,988,7,28,13,1,14,11,276,300,591,614,962,780,10,18,10,8,15,4,366,364,807,855,1189,637,18,14,14,8,13,3,498,404,820,710,594,1210,15,15,20,2,13,9,357,289,732,583,617,696,21,29,10,15,16,15,6 +320,284,670,769,612,616,18,20,16,9,2,14,361,261,511,652,651,823,19,21,17,20,4,8,267,323,694,801,1048,642,22,29,31,14,16,3,441,301,704,816,843,755,18,29,33,17,16,2,386,312,662,862,959,657,23,19,31,18,17,11,256,280,553,902,1090,665,22,27,18,12,16,11,362,280,668,699,730,885,13,15,33,17,16,1,368,268,609,674,746,765,16,21,36,16,9,13,553,251,686,776,750,845,36,18,37,17,10,14,293,285,658,894,1013,668,14,15,9,10,11,3,280,300,512,835,933,696,13,16,23,6,11,3,206,212,743,798,704,642,9,21,18,7,3,2,432,206,737,864,772,652,11,17,18,18,4,11,368,212,535,744,774,893,8,16,30,18,16,12,244,210,568,789,998,683,5,26,25,11,17,11,336,428,760,1064,1225,596,13,22,25,9,13,8,568,402,751,843,606,1041,20,17,33,19,13,14,431,223,657,676,633,525,16,21,9,8,16,14,6 +243,145,693,686,676,705,11,12,15,10,1,11,400,360,542,591,719,1050,16,25,24,11,3,11,336,376,653,606,1096,785,29,25,14,11,13,2,324,412,665,673,883,946,17,25,24,14,15,13,353,459,637,671,997,806,30,27,14,15,14,10,305,387,532,675,1140,786,29,23,11,9,13,0,355,357,617,510,796,1118,16,33,24,14,13,8,443,269,548,541,816,974,19,29,17,7,6,16,440,332,681,681,800,1052,29,14,18,14,9,17,422,304,697,739,1071,781,21,15,28,9,10,0,341,297,561,604,993,807,20,28,16,3,8,6,111,147,782,749,772,815,2,3,3,2,2,1,353,143,762,769,832,763,6,15,3,13,1,14,387,363,530,521,844,1058,11,26,11,15,13,9,335,357,531,554,1068,834,12,22,6,8,14,2,395,415,765,825,1289,657,20,16,18,10,12,1,417,415,766,750,668,1274,13,13,16,16,12,9,334,320,690,619,673,668,13,29,14,11,15,17,6 +235,221,766,669,630,655,17,17,15,12,1,11,332,328,549,598,643,900,12,26,26,9,3,11,278,330,716,579,1010,691,19,24,16,9,15,2,358,364,714,638,841,890,25,24,26,12,15,17,307,359,690,634,931,698,20,22,16,13,14,10,245,289,605,628,1052,632,19,22,7,7,15,0,293,323,658,489,702,952,6,28,26,12,15,12,403,271,617,528,708,812,9,26,19,5,8,16,454,298,694,666,774,906,31,17,18,12,9,17,384,264,770,712,981,787,11,14,28,11,10,0,275,227,618,553,895,611,10,29,12,5,10,6,87,165,855,746,668,657,8,8,5,4,2,1,363,179,843,754,734,593,10,20,5,11,3,14,315,227,611,490,744,860,1,27,11,13,15,9,273,221,604,535,960,672,2,21,8,6,16,2,369,349,830,782,1187,643,10,21,16,12,12,1,441,409,731,727,628,1096,23,16,18,14,12,9,370,254,763,630,659,734,23,22,18,9,17,17,6 +360,252,708,675,652,594,14,16,14,10,3,11,385,263,483,572,699,799,9,27,21,11,3,13,275,361,708,669,1090,616,22,23,25,11,15,4,443,327,690,722,885,813,28,23,37,14,11,11,414,348,664,750,1001,665,23,19,25,15,10,10,254,278,545,782,1132,599,22,21,22,9,15,2,402,320,616,557,774,861,3,25,31,14,15,6,374,260,571,580,794,719,6,29,30,7,8,18,589,249,674,678,784,815,30,18,31,14,9,19,347,321,712,792,1055,688,14,17,19,9,10,2,356,282,558,713,975,572,13,26,21,3,10,8,246,224,797,716,748,556,11,15,12,2,4,3,412,148,783,766,814,558,7,19,10,13,3,16,404,220,523,604,822,805,2,26,24,15,15,7,228,216,564,689,1046,627,5,20,19,8,16,0,280,418,778,954,1269,582,13,18,21,10,12,1,632,388,729,749,646,1007,20,17,27,16,12,11,381,245,711,584,663,627,24,25,3,11,17,19,6 +242,264,683,721,614,625,14,18,15,16,9,12,327,327,478,634,623,968,17,31,16,5,7,10,267,315,685,591,966,699,26,19,8,5,9,1,363,337,659,712,815,894,20,19,20,12,17,14,352,366,631,700,903,726,27,17,8,9,18,11,286,342,550,672,1008,694,26,17,13,7,11,1,338,324,611,545,664,1038,11,23,16,8,11,9,416,308,558,568,664,882,14,25,13,1,12,15,503,319,665,716,760,962,32,20,14,8,17,16,425,265,687,750,939,739,18,21,26,13,18,1,360,326,563,601,851,709,17,24,18,9,12,5,206,162,772,768,624,723,5,17,11,8,8,0,318,226,762,804,690,665,7,23,9,7,7,13,332,278,568,542,708,960,6,24,7,9,9,10,286,282,541,581,916,736,9,16,8,10,10,3,424,434,755,814,1143,605,17,20,26,16,20,2,506,446,742,785,614,1180,16,19,10,10,20,8,421,261,686,640,649,664,18,23,12,9,15,16,6 +323,269,791,732,630,632,18,15,11,12,9,11,398,294,502,659,651,973,21,24,20,9,11,11,326,382,737,690,1044,706,24,26,18,9,21,2,360,358,719,719,849,905,16,26,30,12,13,17,275,371,709,707,955,731,25,24,18,13,12,10,253,313,622,733,1086,713,24,24,13,7,15,0,329,287,585,582,726,1033,15,26,24,12,15,12,411,163,580,629,742,885,18,28,23,5,14,16,464,264,633,735,770,973,36,13,24,12,9,17,342,328,795,813,1009,728,16,14,20,11,8,0,281,273,645,664,929,712,15,27,18,5,14,6,167,217,880,777,700,714,9,10,7,4,10,1,425,193,860,823,768,678,11,18,7,11,11,14,389,167,572,581,770,953,10,25,17,13,21,9,283,185,613,656,994,747,7,23,12,6,20,2,293,413,853,903,1221,592,15,17,22,12,6,1,443,323,648,800,626,1173,18,12,20,14,6,9,454,192,788,637,653,649,14,26,12,9,9,17,6 +275,293,736,798,643,765,11,18,24,14,6,10,338,292,559,671,688,1092,16,31,11,3,4,12,228,258,670,646,1039,839,25,19,13,3,8,3,318,278,714,799,826,960,17,23,19,6,10,10,337,309,686,767,940,858,26,23,13,7,11,9,201,231,585,705,1083,854,25,17,24,1,8,1,283,239,648,622,767,1156,14,27,13,6,8,5,365,277,589,641,791,1022,17,21,16,1,5,17,458,270,692,793,751,1104,29,16,17,6,10,18,392,254,738,747,1022,833,17,19,29,11,11,1,315,265,606,648,946,873,16,26,29,11,5,7,149,199,823,837,747,873,2,9,18,10,5,2,303,227,791,881,791,831,4,17,16,5,4,15,323,309,569,629,815,1116,9,26,16,7,8,8,219,311,578,552,1039,894,8,16,19,12,9,1,361,375,810,835,1242,717,16,18,33,14,13,0,427,407,799,866,635,1268,17,17,15,8,13,10,420,304,719,717,622,710,15,25,15,11,14,18,6 +308,304,694,818,619,659,19,25,19,7,6,13,379,201,491,697,642,858,22,22,12,14,10,11,287,317,692,822,1039,685,25,22,30,14,14,4,371,253,722,885,838,756,15,22,28,17,8,1,344,280,686,915,950,666,26,18,30,18,9,8,216,272,553,941,1081,730,25,24,19,12,14,12,362,242,646,734,721,902,16,20,28,17,12,4,356,214,581,709,737,796,19,20,35,10,9,16,529,195,670,823,763,880,37,19,36,17,16,17,243,303,686,925,1004,683,17,14,10,6,5,0,262,346,534,878,924,749,16,15,24,0,9,6,186,236,771,843,695,689,10,22,19,1,5,1,438,198,757,911,763,711,12,20,19,16,8,14,414,230,531,777,765,932,11,17,29,18,14,9,234,246,562,818,989,746,8,21,24,11,13,12,250,466,784,1103,1216,621,16,21,30,9,7,9,540,344,735,894,617,1050,17,24,32,19,13,15,409,239,679,721,648,542,13,14,10,10,14,17,6 +309,201,768,724,659,632,17,12,19,10,4,12,368,376,503,639,680,885,12,29,26,3,6,10,278,302,736,598,1017,668,19,21,16,11,14,1,314,336,740,693,872,871,25,23,26,18,12,14,279,367,712,633,954,679,20,23,16,15,13,11,281,313,605,589,1061,607,19,19,11,13,14,1,281,321,626,546,745,955,6,25,26,0,14,9,443,311,581,577,729,797,9,27,19,7,7,15,462,346,648,723,783,879,33,14,18,0,12,16,434,222,772,665,1006,758,11,23,34,13,13,1,337,193,624,518,914,620,10,26,16,17,11,5,179,135,857,795,695,664,8,15,7,16,3,0,317,223,837,811,741,578,10,15,7,1,4,13,313,241,583,541,787,873,1,26,11,1,14,10,291,229,596,512,981,651,2,18,8,8,15,3,391,319,840,735,1200,622,10,14,16,8,15,2,439,441,697,784,653,1095,23,15,18,2,15,8,464,260,765,685,666,705,23,29,16,15,16,16,6 +311,285,724,834,644,597,14,13,22,13,5,10,310,252,511,695,661,882,17,26,9,8,7,12,218,324,690,734,982,647,26,24,15,8,19,3,346,326,700,825,821,808,20,24,25,11,17,8,307,337,672,807,897,676,27,24,15,12,16,9,121,259,597,773,1028,666,26,22,18,6,17,1,245,221,648,670,716,948,11,24,21,11,17,5,287,163,603,697,724,812,14,28,20,4,12,17,450,224,670,845,764,894,32,13,21,11,7,18,290,288,728,807,979,677,18,16,17,12,10,1,227,265,598,708,893,691,17,25,23,6,14,7,191,207,813,869,676,665,5,14,18,5,6,2,355,201,787,933,734,649,7,18,16,10,7,15,325,199,585,669,760,910,6,25,14,12,19,8,189,201,590,684,976,694,9,21,13,7,20,1,271,397,802,923,1193,575,17,15,33,13,10,0,461,291,769,910,638,1096,16,12,17,13,10,10,400,296,715,745,631,578,18,28,11,8,13,18,6 +335,397,860,817,640,705,26,19,24,12,9,11,340,252,543,670,685,904,21,24,11,1,13,11,234,152,784,681,1054,735,14,26,19,3,11,2,292,162,850,820,849,880,16,26,27,10,3,7,247,193,818,780,965,772,11,18,19,7,4,10,167,189,703,726,1096,720,10,24,26,5,11,2,263,187,698,649,764,968,15,24,25,4,9,4,335,327,673,668,788,834,18,30,24,3,12,16,424,264,654,820,752,928,32,21,25,4,15,17,278,196,860,744,1023,783,2,14,23,9,2,0,281,253,706,659,947,707,1,25,31,13,8,6,215,285,945,844,744,695,17,16,16,12,8,1,359,327,907,908,788,665,19,16,14,3,11,14,331,275,579,650,812,934,10,25,18,5,11,9,209,261,700,595,1036,754,7,23,21,12,10,2,259,373,940,868,1245,679,1,21,31,12,4,1,415,445,701,893,632,1096,32,20,21,6,16,9,434,264,835,728,627,674,14,22,9,13,13,17,6 +274,172,696,758,659,681,12,14,19,15,7,10,389,325,535,653,708,1034,17,27,18,6,9,12,363,359,640,620,1077,761,30,23,8,6,15,3,267,391,684,739,864,930,18,27,18,9,7,16,272,404,624,691,978,782,31,27,8,10,8,11,284,296,559,645,1121,762,30,21,13,4,11,3,314,306,592,578,781,1102,21,29,18,9,11,11,418,204,531,603,805,954,20,25,11,2,8,13,379,279,652,755,781,1034,30,12,12,9,15,14,415,271,700,711,1056,763,22,17,30,14,2,3,314,236,566,578,976,785,21,24,18,8,8,7,178,128,785,815,757,793,7,7,9,7,8,2,370,114,759,843,809,741,11,13,7,8,9,15,376,264,543,575,833,1034,16,28,5,10,15,10,342,264,550,530,1057,810,13,20,8,9,14,5,374,350,796,779,1274,633,21,14,24,15,4,4,328,334,747,820,653,1252,12,13,10,11,12,6,371,295,687,689,634,652,10,29,16,8,15,14,6 +393,281,905,747,639,688,23,12,14,11,11,10,440,348,582,654,682,1003,22,27,23,4,13,12,348,354,833,645,1059,756,25,23,13,8,15,3,300,400,835,722,852,963,15,27,23,15,9,16,289,391,825,664,968,779,22,27,13,12,10,9,265,275,730,644,1103,729,21,21,10,10,9,1,325,297,623,577,759,1073,16,31,23,1,13,11,415,219,644,612,779,915,19,27,16,8,10,17,448,306,615,748,763,997,37,14,15,1,15,18,368,288,909,716,1034,804,13,19,29,14,2,1,359,187,757,573,956,732,12,26,15,18,8,7,227,201,994,812,735,754,14,7,4,17,12,2,391,195,968,836,795,690,16,11,2,2,13,15,429,181,582,570,807,983,11,28,8,0,15,8,311,175,723,565,1031,771,8,20,5,7,14,1,285,307,969,798,1252,660,12,12,19,9,0,0,387,331,572,809,631,1209,21,13,15,1,12,10,506,296,896,692,636,729,15,31,15,14,11,18,6 +235,299,831,697,711,664,25,11,14,16,5,12,354,270,614,618,752,1021,20,34,21,5,3,10,276,266,707,575,1063,744,11,16,13,5,9,1,272,274,787,712,832,931,23,16,25,8,9,14,295,285,757,700,938,765,26,20,13,9,10,11,237,253,660,686,1113,745,25,14,14,3,9,1,297,289,645,523,839,1091,28,34,21,10,9,9,399,299,614,526,863,935,25,26,18,1,4,15,392,260,675,672,799,1015,21,23,19,8,9,16,394,280,835,758,1068,744,25,22,27,13,10,1,333,317,681,615,990,768,22,29,19,9,4,5,129,241,920,736,819,774,16,12,6,8,4,0,317,221,876,760,847,724,20,24,4,7,3,13,343,341,564,540,881,1017,25,35,12,9,9,10,265,343,659,565,1101,793,22,13,9,10,10,3,363,419,901,836,1248,616,22,23,21,16,12,2,369,423,766,761,703,1233,31,22,15,10,12,8,360,322,806,598,678,663,11,24,11,9,11,16,6 +319,291,719,795,642,629,17,21,16,8,2,14,360,230,512,640,671,852,20,24,15,13,6,10,242,286,701,791,1050,653,23,26,27,13,12,1,384,266,739,820,855,798,17,30,31,16,12,0,347,281,703,850,961,672,24,20,27,17,13,9,219,251,580,872,1092,680,23,24,18,11,12,9,341,243,667,679,752,916,14,18,31,16,12,3,347,249,608,688,768,784,17,20,32,9,5,15,520,218,687,802,770,868,35,17,33,16,12,16,288,292,713,854,1023,677,15,18,11,7,9,1,259,319,559,807,945,709,14,15,23,1,7,5,183,219,798,812,724,655,8,24,16,0,1,0,391,197,778,890,786,667,10,18,16,15,4,13,367,245,554,720,796,896,9,15,26,17,12,10,215,245,587,767,1020,698,6,23,21,10,13,9,301,439,807,1036,1241,593,14,19,27,8,11,6,537,369,752,871,636,1062,19,20,29,18,11,12,418,270,704,702,651,564,15,22,7,11,14,16,6 +311,159,740,741,672,716,11,14,13,10,5,10,370,334,545,638,703,1015,16,27,26,1,5,12,318,412,692,619,1080,784,29,23,16,7,9,3,314,436,700,718,899,985,17,27,26,14,13,14,333,445,672,660,1003,803,30,27,16,11,12,9,291,319,567,576,1114,753,29,21,5,9,9,1,295,327,618,567,774,1073,18,27,26,2,9,9,451,235,557,596,772,927,19,25,19,5,4,17,422,274,688,740,808,1025,29,12,18,2,11,18,446,320,744,638,1053,832,21,19,30,11,10,1,311,217,592,529,967,730,20,24,10,15,4,7,187,113,829,808,740,754,4,11,9,14,4,2,361,115,809,828,796,700,8,13,9,1,3,15,331,303,545,560,816,981,13,28,11,3,9,8,315,301,564,517,1022,797,12,20,8,10,10,1,443,357,808,724,1253,686,20,14,16,10,12,0,341,343,747,805,666,1213,13,13,18,4,12,10,402,342,737,698,689,757,11,29,20,15,13,18,6 +248,192,723,666,666,682,18,14,16,12,4,11,441,379,484,581,699,999,19,29,27,9,6,11,357,297,687,572,1060,754,24,21,17,9,18,2,301,345,695,679,881,943,18,21,27,12,12,13,360,380,667,685,981,781,25,23,17,13,13,10,306,346,566,669,1102,733,24,19,8,7,18,0,374,338,593,490,770,1069,13,33,27,12,16,8,464,344,546,523,778,919,16,27,20,5,11,16,491,369,611,665,792,999,36,20,19,12,12,17,399,257,727,733,1041,794,16,17,35,11,9,0,378,274,585,598,957,746,15,32,13,5,13,6,148,128,812,731,732,760,9,9,10,4,5,1,388,222,794,753,796,704,11,21,10,11,6,14,430,318,550,525,814,995,8,30,12,13,18,9,316,318,553,554,1030,771,7,18,9,6,17,2,364,376,795,819,1253,660,15,20,15,12,11,1,438,482,690,730,660,1215,18,19,19,14,11,9,385,269,720,613,667,713,16,27,19,9,14,17,6 +257,363,1000,673,807,678,37,10,10,17,8,11,374,332,677,604,842,1029,34,35,25,8,12,11,288,150,832,587,1083,758,15,15,17,4,12,2,190,196,954,708,842,925,13,17,29,7,8,15,247,179,928,720,928,779,14,23,17,8,9,10,187,157,827,734,1141,761,15,13,14,2,10,0,285,291,746,519,937,1097,40,35,25,13,12,10,361,425,743,518,965,949,39,23,22,4,11,16,372,342,662,642,857,1029,19,20,23,7,18,17,296,210,1004,802,1110,758,23,23,27,14,1,0,341,219,850,665,1044,784,24,28,17,10,7,6,227,297,1089,702,917,788,28,11,4,9,9,1,293,329,1027,730,911,740,30,23,2,6,10,14,383,333,611,568,967,1033,35,36,16,12,12,9,257,305,822,629,1179,809,32,12,11,11,11,2,293,341,1068,896,1224,630,24,20,17,15,3,1,323,535,689,739,785,1247,43,21,19,9,15,9,424,302,963,566,722,647,21,23,11,10,14,17,6 +293,245,878,668,618,675,19,8,12,9,8,10,342,424,555,579,641,774,14,31,29,12,10,12,228,270,800,598,990,675,17,19,19,12,16,3,354,338,844,695,817,848,23,27,29,15,14,12,357,377,814,713,901,666,18,35,19,16,15,9,193,287,709,717,1032,604,17,23,6,10,16,1,335,337,662,498,716,806,8,39,29,15,18,7,299,329,651,523,732,706,11,25,22,8,15,17,506,354,630,649,728,784,35,18,21,15,14,18,236,172,882,773,969,777,9,25,27,8,7,1,287,163,728,648,885,635,8,24,9,2,13,7,197,171,967,711,684,687,10,9,6,1,9,2,405,269,935,737,728,555,12,13,8,14,10,15,383,249,561,561,756,766,3,32,14,16,16,8,177,233,706,618,980,646,0,16,11,9,15,1,227,201,950,885,1187,675,8,10,13,9,9,0,495,445,629,734,614,972,25,17,21,17,11,10,418,360,863,587,611,728,21,29,21,12,12,18,6 +273,217,776,676,653,695,14,15,17,12,6,13,368,322,521,607,674,1002,17,32,24,9,4,9,270,324,724,568,1057,763,24,18,14,9,10,0,342,348,748,663,872,966,20,20,24,12,14,15,333,389,720,635,968,782,25,22,14,13,15,12,287,317,605,623,1099,732,24,16,11,7,10,2,321,351,596,506,739,1054,11,30,24,12,10,10,429,287,553,537,755,914,14,26,17,5,9,14,476,296,648,667,793,1008,32,19,16,12,14,15,440,282,780,707,1022,811,16,22,30,11,15,2,337,305,626,550,942,711,15,29,16,5,9,4,161,173,865,743,713,735,5,12,5,4,5,1,325,169,839,755,781,687,7,18,5,11,4,12,347,291,515,515,783,962,6,29,9,13,10,11,295,297,604,550,1007,776,7,15,6,6,11,4,409,405,848,783,1234,665,15,17,18,12,17,3,463,419,707,736,649,1196,18,18,16,14,17,9,424,292,767,621,676,736,18,28,14,9,16,15,6 +351,251,759,722,661,646,20,17,9,8,2,13,376,330,480,623,702,899,17,24,24,13,6,9,276,258,729,726,1099,694,20,26,24,13,12,0,414,296,755,765,894,863,20,26,36,16,12,7,345,319,721,807,1010,729,21,20,24,17,13,12,251,275,608,829,1141,675,20,24,15,11,12,2,357,277,649,606,781,967,11,22,30,16,12,2,375,301,600,605,797,825,14,28,29,9,5,14,532,318,643,731,793,909,36,17,30,16,12,15,324,246,759,837,1064,734,12,12,18,7,9,2,275,245,605,760,984,684,11,23,16,1,7,4,173,159,844,771,755,676,11,16,11,0,1,1,435,205,824,819,823,642,13,16,11,15,4,12,375,251,544,665,825,919,6,23,23,17,12,11,247,249,609,708,1049,711,3,23,18,10,13,4,303,383,841,981,1276,614,11,19,18,8,11,3,539,437,698,794,653,1115,22,16,26,18,11,9,420,254,752,633,672,627,18,24,10,11,14,15,6 +306,260,775,785,669,695,14,16,15,13,2,11,371,261,544,686,674,1028,19,29,16,2,4,13,277,357,725,601,961,763,26,21,6,6,12,4,273,349,715,756,858,964,18,25,16,13,10,15,330,362,693,704,936,782,27,25,6,10,11,10,212,268,604,592,983,738,26,19,7,8,12,2,276,272,589,605,699,1098,13,27,16,5,12,10,390,170,554,632,653,940,16,23,9,2,5,18,427,237,657,784,807,1022,32,16,8,5,10,19,405,297,779,654,952,811,18,21,34,10,9,2,332,240,631,547,854,753,17,24,12,12,7,8,200,188,864,852,631,779,5,11,11,11,1,3,314,178,844,872,671,711,7,15,9,4,2,16,348,172,574,598,747,1006,8,26,1,6,12,7,258,172,589,479,901,782,9,18,2,13,13,0,370,380,835,700,1130,665,17,16,26,13,11,1,354,298,700,845,669,1234,16,15,8,7,11,11,429,265,772,740,706,736,16,27,18,12,14,19,6 +249,197,657,723,654,680,5,16,15,14,5,8,336,284,632,608,699,1035,10,27,24,7,3,12,292,360,615,617,1060,760,31,23,14,7,13,5,366,372,675,728,847,941,19,23,24,10,15,12,345,389,647,694,963,779,32,25,14,11,14,7,331,333,552,672,1104,761,31,21,7,5,13,5,335,349,733,555,780,1103,16,31,24,10,13,7,383,313,662,576,804,955,13,25,17,3,8,11,398,268,763,710,764,1035,23,14,16,10,13,12,460,324,657,728,1035,764,23,15,26,13,14,5,301,305,535,603,959,778,22,26,12,7,8,9,203,179,742,766,760,796,4,7,5,6,4,4,337,139,704,798,802,736,8,17,5,9,3,9,299,335,606,558,826,1029,13,28,9,11,13,8,337,337,579,573,1050,805,14,20,6,8,14,7,491,439,761,832,1257,632,22,18,18,14,16,6,387,407,880,791,646,1251,11,13,16,12,16,4,332,312,632,652,637,673,11,25,18,7,15,12,6 +251,311,643,880,588,601,16,16,21,12,3,15,260,266,458,745,573,946,21,27,10,3,7,7,226,328,649,740,866,679,26,21,8,9,17,2,374,288,629,841,723,856,16,21,20,16,13,9,293,305,595,819,809,700,27,17,8,13,14,14,201,323,524,739,906,690,26,19,13,11,17,4,227,213,593,712,568,1016,15,19,14,4,17,4,341,173,540,743,588,866,18,25,13,3,10,12,404,256,653,895,722,944,34,20,14,4,13,13,372,288,645,829,839,673,18,19,20,13,12,4,223,343,521,710,753,713,17,20,18,13,12,2,223,229,730,905,542,707,7,23,17,12,4,3,341,241,716,983,616,669,9,21,15,3,5,10,231,183,540,701,610,956,10,20,7,5,17,13,217,213,521,702,814,734,9,18,8,8,16,6,415,465,725,895,1041,555,17,20,32,12,14,5,421,331,728,944,588,1166,16,19,10,6,14,11,384,172,642,793,655,588,14,23,12,13,15,13,6 +279,211,729,759,658,654,17,11,17,11,3,11,350,318,472,644,693,987,16,26,18,10,5,13,250,362,691,703,1052,726,25,24,20,10,17,4,362,392,697,748,849,883,21,26,32,13,15,11,337,393,669,750,953,745,26,26,20,14,14,10,171,295,580,756,1096,751,25,22,15,8,17,2,293,273,609,611,774,1055,10,32,26,13,17,6,329,167,566,640,790,911,13,28,25,6,10,18,480,278,627,766,776,991,35,11,26,13,7,19,298,294,733,806,1041,720,17,18,18,10,10,2,245,239,595,689,959,770,16,27,20,4,12,8,147,167,818,810,742,760,8,6,9,3,4,3,363,131,798,854,800,728,10,16,7,12,5,16,371,217,548,626,818,1003,5,27,19,14,17,7,223,219,575,663,1042,783,8,21,14,7,18,0,285,359,801,916,1259,610,16,13,24,11,10,1,473,313,710,831,652,1203,17,12,22,15,10,11,406,276,726,670,627,615,19,30,10,10,15,19,6 +243,145,693,686,676,705,11,12,15,10,1,11,400,360,542,591,719,1050,16,25,24,11,3,11,336,376,653,606,1096,785,29,25,14,11,13,2,324,412,665,673,883,946,17,25,24,14,15,13,353,459,637,671,997,806,30,27,14,15,14,10,305,387,532,675,1140,786,29,23,11,9,13,0,355,357,617,510,796,1118,16,33,24,14,13,8,443,269,548,541,816,974,19,29,17,7,6,16,440,332,681,681,800,1052,29,14,18,14,9,17,422,304,697,739,1071,781,21,15,28,9,10,0,341,297,561,604,993,807,20,28,16,3,8,6,111,147,782,749,772,815,2,3,3,2,2,1,353,143,762,769,832,763,6,15,3,13,1,14,387,363,530,521,844,1058,11,26,11,15,13,9,335,357,531,554,1068,834,12,22,6,8,14,2,395,415,765,825,1289,657,20,16,18,10,12,1,417,415,766,750,668,1274,13,13,16,16,12,9,334,320,690,619,673,668,13,29,14,11,15,17,6 +231,209,645,766,646,589,8,12,14,15,3,11,296,294,544,687,667,938,11,25,21,6,5,11,248,400,633,648,1024,663,28,25,11,6,17,2,318,408,595,735,865,864,18,25,23,9,15,17,287,405,569,695,961,688,29,25,11,10,16,10,223,307,526,669,1058,656,28,23,14,4,17,0,251,313,657,588,730,1008,13,29,21,9,17,12,359,185,600,619,714,850,14,29,16,2,10,16,386,262,699,767,786,932,26,12,17,9,9,17,396,324,649,749,1005,709,20,17,29,14,10,0,285,247,519,598,913,671,19,28,19,8,12,6,141,173,734,823,686,689,3,9,6,7,4,1,297,137,726,855,740,627,3,13,4,8,5,14,283,209,580,581,772,922,8,26,10,10,17,9,267,209,531,562,966,698,11,22,9,9,18,2,369,377,709,811,1195,567,19,14,21,15,12,1,413,309,786,828,642,1144,14,11,13,11,12,9,374,262,644,683,669,634,16,29,11,8,15,17,6 +284,292,838,761,658,671,19,14,16,14,4,11,353,263,541,664,677,892,14,29,15,7,4,11,247,263,790,629,1028,705,17,21,5,7,10,2,321,283,790,750,865,908,23,21,17,10,12,15,284,292,762,738,965,720,18,23,5,11,11,10,178,212,665,700,1062,642,17,19,12,5,10,0,290,240,612,581,724,952,8,33,15,10,10,10,342,258,591,606,720,804,11,27,10,3,3,16,471,247,626,756,800,900,33,16,11,10,10,17,311,253,842,770,1001,785,9,17,27,13,9,0,302,246,688,633,915,621,8,28,17,7,5,6,154,214,927,814,686,653,10,7,12,6,3,1,340,190,907,844,744,595,12,17,10,9,2,14,354,232,557,580,772,870,3,30,4,11,10,9,188,218,660,579,970,696,0,18,7,8,11,2,270,374,904,842,1201,649,8,16,27,14,11,1,460,386,637,825,656,1092,25,15,7,12,11,9,433,291,835,678,687,730,21,27,13,7,12,17,6 +302,504,759,885,608,782,22,19,33,13,13,14,197,175,746,706,641,1037,19,16,14,6,11,12,187,163,675,741,920,826,14,28,24,6,1,3,353,83,799,898,701,861,26,16,14,7,13,2,284,156,771,872,817,795,29,12,24,4,14,9,230,284,648,816,970,885,30,24,37,8,7,9,166,226,853,719,740,1093,27,16,14,3,7,5,284,372,782,728,768,983,24,20,21,10,8,17,349,283,829,880,668,1049,14,31,22,3,13,18,423,257,751,786,933,804,34,14,16,16,14,1,330,390,627,757,855,916,31,25,38,20,12,7,316,382,836,892,724,864,19,28,29,19,12,2,210,422,762,968,724,872,17,22,27,4,11,15,156,358,700,734,766,1115,22,15,29,2,1,8,250,364,683,639,978,907,25,31,32,9,2,9,442,480,843,918,1125,732,31,31,44,11,16,6,378,454,990,961,588,1171,28,30,22,1,16,12,381,313,704,784,559,643,18,20,22,12,17,18,6 +251,197,585,767,619,628,6,13,15,13,3,11,316,288,524,664,634,961,11,28,16,6,1,11,252,390,589,651,969,702,30,22,6,8,13,2,344,396,585,736,808,897,18,26,18,11,15,13,301,401,557,704,908,727,31,26,6,12,14,10,229,293,464,662,1005,693,30,20,7,6,13,0,245,309,641,591,671,1031,13,30,16,7,13,8,389,173,576,620,661,873,14,26,11,4,6,16,422,248,707,772,763,955,24,13,12,7,9,17,406,318,589,742,946,732,22,18,22,12,10,0,261,261,455,605,856,704,21,25,12,10,8,6,153,173,674,828,629,714,3,8,11,9,4,1,323,101,662,860,687,662,3,14,9,6,1,14,281,245,562,584,717,951,10,29,5,8,13,9,261,247,487,575,913,727,13,19,2,7,14,2,403,385,657,808,1142,600,21,13,26,13,12,1,433,311,780,829,621,1169,12,14,8,9,12,9,394,276,588,692,660,655,16,30,18,10,15,17,6 +231,297,701,755,569,582,17,15,18,7,6,13,284,252,510,656,588,847,18,24,13,14,8,9,214,332,701,725,961,626,23,26,19,14,20,0,376,302,699,796,774,791,19,26,29,17,18,5,357,305,661,806,866,661,24,22,19,18,17,10,197,291,582,816,1005,637,23,24,10,12,20,4,301,247,665,637,665,915,12,28,25,17,20,2,305,211,610,650,681,775,15,28,24,10,13,14,484,232,681,758,707,853,35,17,25,17,10,15,248,284,699,874,940,660,15,14,9,6,11,2,207,313,557,759,860,662,14,25,15,0,15,4,179,221,784,792,637,628,8,14,14,1,7,1,371,209,770,846,699,618,10,16,16,16,8,12,323,183,576,666,709,881,7,25,18,18,20,11,197,199,581,735,933,665,6,23,13,11,21,4,311,437,785,1000,1156,566,14,17,29,9,13,3,511,345,758,829,571,1073,19,16,21,19,13,9,352,234,696,658,600,571,17,26,15,10,16,15,6 +247,279,898,665,620,653,23,14,14,12,9,13,368,370,575,596,655,928,26,31,27,9,13,9,334,246,846,577,1028,721,23,19,17,9,11,0,246,282,864,672,839,928,9,19,27,12,9,15,263,293,836,658,939,744,14,19,17,13,10,12,249,245,727,676,1070,684,13,17,10,7,11,2,311,323,674,503,730,992,22,31,27,12,13,10,373,381,661,528,746,842,25,27,20,5,12,14,426,326,652,642,742,946,31,18,19,12,19,15,336,198,902,760,997,781,5,19,29,11,2,2,301,193,748,601,917,649,6,30,15,5,8,4,189,205,987,712,698,671,14,11,2,4,8,1,359,255,959,730,756,619,16,19,2,11,11,12,405,263,567,512,774,902,17,32,12,13,11,11,303,235,724,581,998,724,14,16,9,6,10,4,327,317,970,840,1215,635,6,18,15,12,4,3,411,503,615,727,616,1126,29,17,19,14,16,9,386,258,883,586,625,708,13,27,15,9,15,15,6 +296,314,743,749,633,629,17,22,17,13,5,13,329,249,514,610,652,880,20,23,16,8,9,9,267,265,705,709,1027,673,21,27,24,8,15,0,407,239,751,754,842,830,17,23,32,11,13,3,310,270,715,766,936,704,22,13,24,12,14,10,244,288,606,786,1071,684,21,25,19,6,15,6,318,244,675,607,731,948,14,21,30,11,15,2,382,282,620,642,747,812,17,27,29,4,8,14,489,255,667,748,761,892,35,24,30,11,15,15,381,257,739,820,1002,693,13,13,16,12,12,2,260,348,587,721,924,697,12,22,24,6,10,4,188,224,824,784,703,671,8,19,11,5,4,1,394,228,800,836,765,653,10,15,11,10,7,12,336,276,572,628,775,924,9,22,23,12,15,11,264,286,607,707,999,714,6,24,18,7,14,6,354,468,829,962,1220,601,12,24,26,13,14,3,510,408,748,821,627,1108,21,23,26,13,14,9,429,227,726,652,642,596,15,19,6,8,13,15,6 +237,169,653,690,656,669,10,15,9,9,3,5,390,300,546,593,677,974,15,26,24,12,5,9,372,380,633,644,1050,735,32,24,16,12,17,8,360,408,675,679,869,926,20,24,28,15,13,13,293,411,619,701,961,762,33,22,16,16,12,4,315,365,548,713,1092,712,32,22,9,10,17,6,353,361,667,532,752,1042,17,32,24,15,17,14,417,305,612,557,768,894,18,30,21,8,10,10,416,276,725,687,784,974,28,17,22,15,7,11,412,322,657,777,1023,775,24,14,22,8,10,6,301,321,505,644,945,721,23,29,14,2,12,12,133,177,742,751,724,735,5,8,3,1,4,7,413,145,732,775,786,679,7,18,3,14,5,8,379,351,586,565,796,970,12,27,15,16,17,3,343,347,553,618,1020,752,15,21,10,9,18,8,411,431,775,873,1241,639,23,17,18,9,10,7,413,389,790,756,650,1190,10,16,18,17,10,5,324,336,650,609,665,692,12,26,16,12,15,11,6 +344,268,722,804,665,620,15,16,20,12,6,10,349,281,515,659,710,911,20,25,15,9,8,12,245,341,680,758,1077,676,23,25,25,9,18,3,375,331,708,799,864,803,17,27,31,12,16,6,326,330,680,785,978,691,24,27,25,13,17,11,182,264,581,805,1121,723,23,23,22,7,16,3,278,240,650,658,789,975,14,21,31,12,18,5,322,166,601,701,813,847,17,23,30,5,13,17,483,235,680,815,781,927,33,10,31,12,12,18,317,277,722,813,1052,658,15,15,17,11,7,1,232,254,578,736,974,748,14,20,27,5,13,7,198,180,807,833,769,708,6,17,12,4,7,2,394,186,775,903,815,704,8,21,10,11,8,15,356,168,567,659,837,963,9,20,24,13,18,10,222,178,590,708,1061,749,6,22,19,6,17,3,284,370,800,971,1272,572,14,16,27,12,9,0,486,296,773,880,657,1137,19,11,27,14,9,10,427,255,703,711,654,535,15,27,5,9,12,18,6 +271,145,633,734,642,662,11,13,13,10,2,12,334,356,530,623,673,991,12,26,24,11,4,10,268,372,619,660,1064,736,31,24,14,11,14,1,394,408,619,701,867,923,25,24,26,14,16,12,337,423,591,661,975,761,32,24,14,15,15,11,285,351,494,661,1106,737,31,22,9,9,14,1,299,339,625,580,746,1051,6,30,24,14,14,7,389,239,554,609,762,909,9,28,19,7,7,15,482,318,683,741,778,995,29,13,20,14,10,16,432,292,635,735,1029,764,23,16,24,9,11,1,289,257,513,610,949,734,22,27,14,3,9,5,171,141,720,797,720,742,8,8,3,2,1,0,305,133,710,829,788,704,4,14,3,13,2,13,321,285,524,583,790,981,11,27,13,15,14,10,299,287,499,618,1014,771,14,21,8,8,15,3,415,387,707,819,1241,634,22,15,18,10,13,2,491,365,776,798,636,1201,11,12,16,16,13,8,420,280,630,665,659,681,23,28,16,11,16,16,6 +292,344,787,787,626,737,18,19,23,10,12,12,361,257,522,666,677,1030,23,28,16,1,14,10,265,229,727,603,1034,811,22,18,6,7,8,1,235,205,779,788,829,940,14,16,16,14,4,10,274,252,751,748,945,838,21,18,6,11,5,11,250,222,620,638,1076,804,20,14,19,9,8,1,284,244,613,611,752,1094,17,20,16,2,8,5,396,334,582,626,780,964,20,24,9,5,15,15,431,257,619,778,736,1042,36,23,8,2,8,16,385,217,787,690,1017,825,12,24,34,11,5,1,380,282,643,593,933,809,11,23,24,15,11,5,204,234,872,834,732,811,9,22,11,14,11,0,276,264,834,866,768,765,11,22,11,1,14,13,348,274,538,616,804,1058,12,21,11,3,8,10,280,276,625,509,1028,838,9,21,14,10,7,3,342,408,863,760,1235,711,11,21,26,10,7,2,390,452,712,855,622,1238,22,22,8,4,13,8,449,273,762,714,607,682,12,24,20,15,14,16,6 +302,318,724,886,617,642,15,24,25,5,4,10,293,189,565,707,654,891,16,21,6,12,6,10,189,287,682,858,985,666,21,27,28,14,10,7,371,229,770,895,772,749,13,27,22,15,10,0,344,232,730,915,884,641,22,23,28,16,11,9,178,206,597,937,1031,737,21,27,17,14,10,15,270,218,704,764,733,949,22,21,22,15,10,3,302,212,645,759,757,825,19,17,29,12,5,15,445,155,714,885,719,907,31,14,30,15,12,16,269,305,712,907,988,648,13,15,8,4,9,1,208,328,570,874,906,788,12,10,22,2,5,7,198,272,797,887,709,714,8,25,21,3,3,4,388,206,767,973,745,738,12,15,25,14,4,13,300,258,593,801,781,949,17,16,27,16,10,10,188,266,610,810,1005,747,14,22,22,9,11,15,330,450,818,1093,1208,582,12,16,36,7,11,12,450,330,825,962,607,1069,21,23,30,17,11,12,409,305,687,779,580,533,7,19,16,12,12,16,6 +250,260,747,719,720,675,13,13,14,10,3,10,375,269,594,614,743,1016,18,32,21,1,3,12,301,323,653,597,1038,755,27,18,11,3,11,3,259,307,709,730,849,914,19,18,23,10,11,14,314,308,681,712,933,776,28,18,11,7,12,9,278,274,576,698,1088,756,27,16,14,5,11,1,336,344,633,553,814,1082,16,28,21,2,11,9,454,308,570,568,824,944,19,30,16,5,6,17,435,265,665,702,822,1022,27,21,17,2,11,18,437,315,751,762,1053,751,23,24,29,11,12,1,404,324,597,627,971,779,22,29,19,15,6,7,190,246,836,756,776,785,4,18,6,14,2,2,298,180,794,790,818,735,6,22,4,1,1,15,352,338,528,564,852,1028,11,29,10,3,11,8,278,336,579,597,1072,804,14,15,9,10,12,1,396,438,815,854,1247,627,22,21,21,10,14,0,408,430,764,787,716,1244,15,20,13,4,14,10,427,317,722,626,675,646,17,28,11,13,13,18,6 +300,356,721,819,644,728,17,19,36,12,6,11,303,265,512,678,693,953,12,28,15,1,4,11,207,235,699,665,1054,752,19,22,25,5,8,2,335,203,723,818,843,855,25,22,15,12,10,7,296,282,695,776,959,783,20,20,25,9,11,10,192,244,582,704,1098,757,19,20,38,7,10,2,282,228,661,647,766,1013,6,22,15,4,8,4,360,320,606,666,790,895,9,26,22,3,5,16,465,273,667,818,762,975,29,19,23,4,10,17,355,231,719,728,1041,812,11,20,15,9,11,0,326,296,587,643,959,774,10,23,43,13,9,6,174,250,804,854,742,762,8,16,28,12,5,1,302,280,784,906,792,732,10,20,26,3,4,14,304,302,578,648,818,1007,1,23,30,5,8,9,208,296,575,541,1042,789,2,19,33,12,9,2,304,400,799,820,1259,714,10,21,43,12,13,1,490,444,766,891,638,1121,23,18,23,6,13,9,389,291,710,732,621,675,23,22,21,13,14,17,6 +230,286,838,719,689,630,16,12,14,14,6,11,325,267,643,642,700,999,15,29,17,7,8,13,293,271,730,597,1001,710,22,21,7,7,12,4,299,291,774,734,842,909,18,21,19,10,10,17,282,278,756,732,914,729,21,27,7,11,11,10,202,218,661,708,1047,709,20,19,6,5,12,2,284,252,646,541,755,1069,17,35,17,10,12,12,360,250,603,544,763,911,14,25,12,3,7,18,387,245,690,696,799,993,30,18,13,10,14,19,335,271,842,782,996,722,14,17,21,13,3,2,292,282,688,639,918,726,11,30,11,7,7,8,174,226,927,768,719,750,7,7,10,6,7,3,358,194,889,784,765,684,11,19,8,9,8,16,336,262,575,572,797,977,14,30,6,11,12,7,236,264,652,579,1011,753,11,18,1,8,13,0,326,410,898,854,1208,582,11,20,25,14,5,1,374,368,771,781,681,1205,22,17,9,12,11,11,351,287,813,628,690,641,10,29,19,7,14,19,6 +284,234,727,712,619,695,20,17,9,10,5,15,377,335,428,631,620,1052,19,28,22,11,3,7,309,323,705,604,973,775,24,22,12,11,11,2,329,337,717,709,810,962,18,22,22,14,13,11,370,362,683,677,898,796,25,22,12,15,14,14,310,330,564,643,1013,776,24,20,1,9,11,4,344,340,583,540,667,1122,13,28,22,14,11,6,428,308,544,561,669,966,16,26,15,7,8,12,487,317,577,703,765,1046,38,17,14,14,13,13,443,279,725,725,946,775,16,16,22,9,14,4,324,316,575,578,860,797,15,29,6,3,8,2,222,188,810,771,635,805,11,10,9,2,4,3,340,184,790,791,695,753,13,18,11,13,3,10,386,300,480,553,709,1048,8,29,7,15,11,13,320,302,571,556,921,824,7,19,4,8,12,6,450,432,805,805,1148,647,15,19,20,10,16,5,418,462,658,776,623,1264,18,16,14,16,16,11,387,237,718,655,672,694,16,24,20,11,15,13,6 +273,177,679,699,640,694,6,16,18,9,5,10,336,278,590,628,669,1041,11,29,25,2,3,12,292,456,637,577,1048,772,30,21,15,8,11,3,354,430,617,686,865,973,20,25,25,15,13,18,363,433,599,636,967,791,31,27,15,12,14,9,337,357,526,584,1090,761,30,21,10,10,11,1,321,405,657,517,742,1101,11,27,25,1,11,13,423,259,588,558,750,953,14,25,18,6,8,17,460,246,725,690,772,1041,24,16,17,1,13,18,512,390,683,668,1017,796,22,23,31,12,14,1,361,313,547,519,933,758,21,24,15,16,8,7,223,229,768,764,706,782,3,13,6,15,6,2,291,95,742,778,772,726,1,13,6,0,3,15,307,315,566,516,784,1009,10,28,10,2,11,8,335,325,539,515,1002,803,13,18,7,9,12,1,465,445,739,738,1225,654,21,14,17,9,16,0,441,351,800,759,632,1241,12,15,17,3,16,10,412,302,670,656,653,717,18,29,15,16,15,18,6 +321,359,904,793,611,762,28,14,23,9,4,10,412,286,615,678,656,989,23,29,20,2,6,12,302,230,788,629,989,818,8,21,10,4,10,3,254,210,876,800,784,937,20,21,20,11,6,12,275,241,848,764,900,851,19,23,10,8,7,9,245,213,733,704,1033,787,14,19,19,6,10,1,309,243,710,617,741,1051,21,27,20,1,10,7,425,361,677,626,769,933,24,29,13,6,5,17,446,272,682,778,701,1017,24,18,12,1,12,18,370,218,908,758,982,860,14,23,34,12,7,1,371,261,754,643,900,786,11,28,24,16,7,7,197,263,993,840,721,780,19,15,11,15,3,2,331,281,943,866,739,738,21,19,11,0,4,15,379,329,663,630,785,1035,16,28,11,2,10,8,261,319,732,569,1005,823,13,18,14,9,11,1,325,367,976,840,1202,750,11,18,22,9,9,0,395,485,765,859,603,1211,34,17,12,3,9,10,478,296,875,724,564,693,12,29,20,14,12,18,6 +320,334,629,896,588,654,14,28,23,10,11,14,307,183,528,717,637,927,19,13,8,1,9,8,249,303,639,824,1024,702,28,19,24,11,7,3,395,223,671,895,819,809,16,19,24,18,19,2,332,266,633,885,935,691,29,11,24,15,20,11,248,318,524,887,1066,753,28,21,27,13,13,11,330,242,655,738,710,989,17,13,24,2,13,1,388,252,592,759,734,863,20,13,29,5,14,13,501,207,711,903,718,945,32,26,30,2,19,14,357,309,619,851,989,688,20,9,14,11,20,3,326,408,495,818,909,786,19,14,28,15,14,3,258,274,704,903,686,744,5,31,19,14,10,2,386,242,680,991,748,744,7,27,17,1,9,11,320,294,560,753,762,987,12,12,23,3,7,12,240,316,535,734,986,777,11,22,22,10,8,11,348,528,721,1027,1205,604,19,26,34,10,22,8,524,368,794,972,582,1129,14,27,26,4,22,14,375,239,606,797,597,557,12,11,12,15,13,14,6 +231,249,663,756,617,621,8,12,15,15,5,4,374,238,554,679,608,950,13,29,16,6,7,18,358,368,633,638,925,699,30,21,6,6,19,9,284,314,647,745,770,896,18,21,18,9,15,12,273,337,587,741,862,726,31,19,6,10,16,11,287,313,544,683,963,688,30,19,7,4,15,7,329,281,635,596,631,1018,17,29,16,9,15,15,387,209,560,617,629,862,16,31,11,2,12,13,376,238,717,761,757,950,26,20,12,9,9,10,398,338,667,781,906,731,22,19,22,14,8,7,337,347,523,644,814,683,21,30,12,8,14,13,249,257,752,821,593,693,3,17,11,7,6,8,375,157,744,849,657,651,7,21,9,8,7,15,357,233,552,613,673,932,12,30,5,10,19,10,305,243,539,622,871,722,13,18,2,9,20,9,395,471,763,843,1098,595,21,20,26,15,8,8,389,345,758,822,619,1154,12,19,8,11,8,4,370,206,660,685,680,654,12,29,18,8,13,12,6 +354,310,731,786,615,609,16,18,17,8,6,15,375,243,524,613,662,814,21,25,16,13,8,11,265,299,715,786,1037,631,20,25,28,13,20,2,409,249,747,771,832,758,16,27,32,16,18,1,346,266,707,805,948,652,21,19,28,17,19,8,240,256,610,837,1081,654,20,23,21,11,20,10,344,246,685,654,737,878,15,19,32,16,20,4,386,252,634,691,757,754,18,21,33,9,13,16,537,229,675,799,741,834,34,18,34,16,10,17,335,273,725,809,1016,657,12,19,14,7,11,0,280,298,577,768,936,683,11,16,24,1,15,6,184,226,810,817,711,631,7,25,15,0,7,1,424,220,792,887,769,639,9,19,15,15,8,14,358,186,574,677,785,878,10,16,27,17,20,9,242,200,609,726,1009,672,7,22,22,10,19,10,314,420,819,999,1232,589,11,18,26,8,13,7,538,378,752,860,609,1040,22,19,30,18,13,13,437,199,718,699,610,538,14,23,6,11,16,17,6 +391,299,927,745,665,613,30,18,19,13,11,11,298,328,700,674,688,844,25,23,22,6,9,13,214,296,789,547,965,593,6,17,12,6,3,4,362,314,851,732,764,758,32,29,22,9,15,17,299,297,841,686,866,576,21,29,12,6,16,10,235,207,766,572,1009,616,22,19,11,8,9,2,237,247,715,569,777,914,19,27,22,3,9,14,341,263,712,580,777,756,22,21,15,10,10,18,430,278,717,732,741,838,12,18,14,3,15,19,432,212,931,626,982,709,24,17,38,16,16,2,367,183,795,535,898,693,21,20,16,20,10,8,329,231,1016,812,743,687,21,19,13,19,10,3,281,215,966,820,755,575,23,15,13,4,9,16,231,197,700,566,807,822,14,20,7,2,3,7,271,181,749,485,1007,630,15,18,6,9,4,0,373,301,983,676,1158,597,21,10,20,11,18,1,429,371,828,807,653,1050,36,19,14,1,18,11,446,298,896,708,628,712,22,25,22,12,17,19,6 +287,397,702,831,641,666,17,29,24,13,5,15,300,186,559,676,686,903,20,16,7,8,5,7,246,254,680,757,1059,698,23,22,27,8,9,2,398,172,744,860,854,809,17,16,23,11,11,3,313,221,708,868,970,703,24,6,27,12,12,12,233,291,581,874,1101,717,23,18,26,6,11,10,325,255,700,677,763,963,14,8,23,11,9,0,359,321,637,682,785,839,17,18,30,4,6,12,502,252,718,826,761,921,35,31,31,11,11,13,344,286,690,860,1032,724,15,18,13,12,12,4,281,403,538,805,954,744,14,19,31,6,8,2,219,323,775,844,741,706,8,32,20,5,4,3,381,303,749,914,793,702,10,28,18,10,3,10,325,373,565,714,811,951,9,15,26,12,9,13,227,375,594,715,1035,741,6,19,21,7,10,10,329,519,792,1006,1250,634,14,31,35,13,14,7,515,429,799,907,633,1081,19,30,29,13,14,13,386,292,673,726,634,597,15,12,13,8,15,13,6 +257,271,779,731,601,635,14,12,15,13,8,10,380,318,540,656,608,978,19,27,16,8,10,12,322,372,757,609,953,713,24,23,6,8,20,3,278,374,709,712,792,912,14,25,16,11,16,18,291,365,697,696,878,738,25,25,6,12,17,9,229,315,614,654,991,698,24,21,7,6,16,1,307,279,563,559,647,1048,17,29,16,11,16,13,403,197,552,588,647,890,20,27,9,4,15,17,416,288,647,730,749,972,32,12,10,11,10,18,342,290,783,740,926,747,16,17,24,12,7,1,319,251,647,591,840,711,15,26,12,6,13,7,173,203,868,798,613,729,5,9,11,5,9,2,361,203,860,818,673,667,7,17,9,10,10,15,387,163,576,552,689,962,12,28,3,12,20,8,283,169,599,587,899,738,9,20,2,7,19,1,323,379,839,810,1126,607,15,14,26,13,9,0,399,341,650,795,603,1184,18,13,8,13,9,10,386,212,790,662,642,670,12,29,18,8,12,18,6 +219,199,522,784,614,648,6,12,16,10,2,12,304,312,599,689,621,1001,11,27,15,3,4,10,292,450,614,668,972,728,36,23,7,11,16,1,336,452,616,755,805,911,24,25,19,18,14,14,293,455,588,709,893,749,37,25,7,15,13,11,313,363,447,669,1014,729,36,21,8,13,16,1,273,371,686,614,662,1071,13,25,15,0,16,9,415,205,609,649,670,921,14,27,12,7,9,15,404,258,770,791,762,1001,24,12,13,0,8,16,490,368,524,759,941,730,28,21,21,13,9,1,307,337,418,624,857,752,27,26,13,17,11,5,203,249,609,845,628,760,9,13,12,16,3,0,277,127,601,879,696,708,7,15,10,1,4,13,277,267,575,601,704,1001,16,26,6,1,16,10,343,271,510,640,922,777,19,20,3,8,17,3,475,465,592,823,1149,600,27,14,27,8,11,2,405,303,841,848,616,1219,6,13,9,2,11,8,386,302,523,709,655,643,16,29,17,15,16,16,6 +249,205,674,719,646,682,14,19,10,13,2,14,312,352,517,606,689,999,15,22,23,8,4,8,272,310,664,673,1066,750,28,28,17,8,14,1,404,340,686,724,853,901,22,26,29,11,16,8,307,387,658,740,967,775,29,16,17,12,15,13,277,365,537,756,1110,765,28,26,16,6,14,3,303,303,638,553,766,1065,9,22,23,11,14,3,383,259,575,592,786,927,12,28,22,4,7,13,480,342,690,722,770,1005,32,21,23,11,10,14,418,286,670,800,1041,752,20,12,25,12,11,3,287,321,532,687,963,780,19,23,17,6,9,3,159,163,755,776,742,774,5,18,6,5,1,2,329,165,735,810,802,736,7,14,4,10,2,11,319,325,539,592,814,1025,8,23,16,12,14,12,299,325,546,643,1038,803,11,25,11,7,15,5,369,441,754,914,1259,642,19,21,19,13,13,4,507,421,781,787,638,1227,14,20,19,13,13,10,384,268,663,636,643,631,20,22,9,8,16,14,6 +263,215,682,758,663,678,14,15,16,11,6,12,374,300,513,657,694,1035,19,30,19,0,6,10,294,320,642,618,1071,756,30,18,9,6,8,1,270,342,646,747,888,953,18,18,19,13,14,14,303,361,618,713,996,779,31,16,9,10,15,11,295,325,537,665,1109,753,30,16,18,8,12,1,339,323,600,580,765,1105,13,22,19,3,8,9,459,263,545,607,765,947,16,28,12,4,9,15,458,296,666,755,799,1029,32,21,13,3,14,16,408,324,686,729,1044,776,22,26,33,10,15,1,419,351,558,598,958,768,21,25,19,14,9,5,195,213,771,809,729,786,5,22,8,13,5,0,301,135,753,843,791,726,7,22,6,2,4,13,345,331,535,579,809,1019,10,23,10,4,8,10,293,331,530,550,1017,795,13,17,13,11,9,3,367,473,752,811,1244,640,21,21,23,11,17,2,431,409,745,824,657,1241,12,20,11,5,17,8,440,262,679,687,680,697,16,26,13,14,16,16,6 +346,318,619,976,656,609,6,13,25,11,9,7,205,179,702,859,625,978,1,14,6,4,11,19,305,391,723,790,712,689,30,30,4,12,13,12,363,305,721,953,733,888,30,24,8,17,9,9,246,346,701,881,813,708,31,22,4,16,8,14,368,368,552,719,764,688,30,26,17,14,15,10,208,246,795,806,592,1048,5,22,6,1,9,14,324,98,734,833,554,890,2,22,1,8,6,16,183,187,869,985,760,972,18,15,2,1,1,9,531,395,583,725,749,711,24,22,32,14,16,10,326,390,487,722,659,705,21,29,22,18,14,16,460,304,668,1035,512,729,15,16,21,17,10,11,322,242,672,1073,618,661,13,16,19,2,11,18,198,212,690,799,634,958,10,15,9,0,13,13,414,244,611,624,678,734,15,33,12,7,12,10,520,530,701,651,899,569,21,15,36,9,14,9,214,204,968,1046,646,1184,12,14,2,1,2,7,329,293,552,915,689,634,14,28,16,14,15,15,7 +267,279,655,832,611,661,9,13,20,11,11,9,176,232,740,733,602,1030,4,30,11,4,9,19,206,434,695,644,825,741,27,20,1,8,3,12,340,364,767,819,776,940,33,28,11,15,15,9,229,385,747,757,824,760,34,30,1,12,16,16,293,355,604,653,865,740,29,24,12,10,9,10,149,287,839,668,589,1100,10,30,11,1,9,14,315,109,776,687,557,942,7,28,4,8,10,18,238,186,847,839,729,1024,15,17,5,1,15,11,472,386,605,689,814,753,29,20,29,14,16,10,283,355,513,622,720,755,26,25,17,18,10,16,323,271,690,897,529,781,18,16,16,17,10,11,261,189,682,927,605,713,12,12,14,2,9,20,123,221,722,661,645,1008,15,23,4,0,3,15,317,255,663,562,801,784,20,19,7,7,4,8,479,469,731,683,1014,613,26,9,31,9,18,9,251,211,996,906,609,1236,15,16,3,1,18,9,352,284,570,785,650,672,17,30,13,14,17,17,7 +264,256,574,768,607,638,1,17,13,10,12,4,239,259,679,637,628,997,4,30,18,1,10,16,319,505,690,624,989,718,35,16,10,11,8,15,417,405,692,763,822,907,25,22,22,18,20,10,306,438,670,709,912,739,36,24,10,15,21,11,380,406,539,633,1031,721,35,18,17,13,14,13,320,426,780,604,693,1067,10,24,18,2,14,13,390,266,709,631,699,909,7,24,15,5,15,13,423,243,852,773,737,991,19,21,16,2,20,10,525,451,522,697,956,720,27,22,30,11,21,13,422,418,462,582,874,744,26,21,20,15,15,19,338,334,607,817,651,748,10,20,9,14,11,14,260,184,629,861,713,700,8,16,7,1,10,15,292,320,681,603,735,993,15,23,9,3,8,10,374,328,596,596,951,769,18,19,12,10,9,13,496,546,652,781,1170,592,26,15,24,10,23,12,464,334,951,842,601,1207,7,20,12,4,23,6,349,325,513,691,622,641,15,26,10,15,14,12,7 +262,212,598,789,662,683,2,14,22,9,10,5,273,313,665,676,705,1040,7,23,21,2,8,15,343,465,676,593,1082,763,38,21,11,8,4,8,327,453,720,780,869,950,26,23,21,15,16,13,280,454,692,726,983,784,39,23,11,12,17,8,408,412,543,592,1126,764,38,17,14,10,10,10,308,390,774,611,782,1110,13,23,21,1,10,16,430,276,703,630,802,954,10,23,14,6,11,10,353,279,820,782,786,1034,20,16,13,1,16,7,567,421,548,626,1057,763,30,21,37,12,17,10,444,412,438,565,979,785,29,24,19,16,11,12,328,278,633,844,758,793,11,17,10,15,9,9,240,160,641,870,818,741,9,15,10,0,8,12,274,368,655,612,830,1036,18,16,6,2,4,7,450,374,608,511,1054,812,21,24,9,9,5,12,498,534,684,700,1275,635,29,14,21,9,19,11,324,316,925,855,654,1252,4,17,13,3,19,1,401,349,529,730,659,682,18,29,19,16,16,9,7 +335,313,595,964,666,649,1,19,23,13,12,8,238,244,688,847,607,1018,4,22,8,6,10,20,240,462,685,778,732,729,35,28,2,10,2,11,374,382,705,933,633,928,25,32,8,15,14,10,283,421,683,861,727,748,36,32,2,14,15,15,301,377,540,711,700,728,35,26,15,12,8,9,151,303,779,794,610,1088,10,18,8,3,8,15,339,169,718,821,636,930,7,20,1,10,9,17,266,184,847,973,694,1012,19,9,2,3,14,12,496,394,551,729,673,749,27,24,32,16,15,9,241,387,471,714,581,743,26,19,20,20,13,15,331,301,636,1029,574,769,10,18,19,19,11,10,303,243,642,1061,590,701,8,18,17,4,10,19,109,259,688,785,618,996,15,15,7,2,2,14,339,269,595,596,656,772,18,25,10,9,3,7,513,441,677,695,851,605,26,19,34,11,17,8,247,139,960,1032,638,1224,7,8,0,1,17,8,362,382,530,909,683,672,15,24,16,12,18,16,7 +254,274,544,791,543,649,2,21,14,12,5,6,247,295,659,726,496,1018,7,22,17,5,5,20,309,553,664,669,821,729,38,28,7,9,17,11,473,463,666,770,654,928,26,28,17,14,17,12,406,528,640,716,728,748,39,28,7,13,16,13,402,430,517,620,857,728,38,26,6,9,17,11,306,462,760,619,533,1088,13,20,17,4,17,17,376,286,689,654,605,930,10,20,10,5,10,15,327,277,844,790,627,1012,20,9,11,4,13,8,525,477,494,712,784,741,30,12,23,11,14,11,298,416,442,585,704,743,29,21,11,13,12,15,334,352,579,858,555,769,11,16,10,12,4,10,346,204,603,878,569,701,9,22,8,3,5,17,258,324,665,616,561,996,18,21,4,5,17,12,394,336,572,577,785,772,21,25,1,6,18,13,636,542,630,800,1002,601,29,23,25,12,16,12,346,290,931,855,529,1224,4,8,9,6,16,6,301,349,485,732,606,660,18,20,19,13,17,14,7 +353,233,614,975,702,686,1,20,19,12,11,5,232,246,699,872,657,1055,4,11,12,5,9,19,322,498,692,779,734,766,35,27,2,9,11,12,370,404,742,952,703,965,25,33,12,16,7,11,303,435,716,886,787,785,36,33,2,13,6,12,411,393,581,742,750,767,35,25,11,11,13,10,239,369,812,797,646,1125,10,19,12,2,11,16,363,203,737,822,666,967,7,19,5,9,8,14,258,180,852,974,752,1049,19,8,4,2,1,7,582,428,558,728,713,778,27,23,34,15,18,10,345,397,472,729,639,784,26,18,16,19,12,16,469,305,643,1042,558,806,10,19,15,18,12,11,273,181,659,1062,644,742,8,17,13,3,9,16,191,283,687,792,666,1035,15,12,3,1,11,11,419,301,642,581,672,811,18,24,6,8,10,12,573,469,692,638,879,638,26,18,30,10,16,11,211,173,955,1039,680,1261,7,9,4,0,4,5,394,360,537,930,709,697,15,25,18,13,17,13,7 +318,296,634,936,704,658,7,24,24,10,16,5,187,147,723,831,669,1027,2,11,7,3,14,15,301,357,690,736,732,738,29,31,3,7,2,10,401,251,738,929,753,937,31,29,7,14,10,15,336,264,728,875,807,757,32,21,3,11,11,10,394,328,593,733,764,737,29,27,16,9,8,12,232,284,830,760,656,1097,8,11,7,0,4,14,326,230,761,779,638,939,5,13,0,7,9,10,173,129,856,931,762,1021,17,16,1,0,10,5,587,371,590,727,773,750,27,19,35,13,11,12,332,422,494,712,671,752,24,22,21,17,13,12,420,330,675,993,582,778,16,23,20,16,15,11,298,218,677,1019,632,710,14,21,18,1,14,12,182,292,705,761,684,1005,13,4,8,1,2,11,402,314,648,562,722,781,18,30,11,8,1,14,610,546,706,713,929,610,24,26,35,8,15,13,230,294,975,1004,684,1233,13,15,1,2,13,3,303,309,561,881,699,669,15,17,19,15,14,9,7 +242,296,596,817,616,651,1,19,15,11,3,11,223,275,687,742,569,1020,6,22,16,4,5,19,213,543,686,639,800,731,37,28,6,10,17,10,343,427,708,800,671,930,25,34,16,17,15,11,262,472,692,746,715,750,38,34,6,14,14,16,280,446,557,632,826,730,37,26,7,12,17,8,154,398,794,645,562,1090,12,20,16,1,17,16,326,200,725,670,638,932,9,20,9,8,10,20,287,241,858,816,690,1014,19,9,8,1,11,13,461,463,546,674,773,743,29,20,28,14,12,8,228,420,460,599,691,747,28,19,12,18,12,14,266,350,631,882,580,771,10,16,11,17,4,9,290,214,643,904,620,703,8,16,9,2,5,22,152,282,675,644,570,1000,17,21,1,0,17,13,286,288,612,551,774,776,20,25,2,7,18,6,506,488,670,738,991,603,28,17,26,9,14,7,272,182,945,881,602,1226,5,8,8,1,14,11,347,351,529,772,643,662,17,26,18,14,17,19,7 +340,264,545,882,609,650,3,22,14,9,12,3,249,301,630,801,540,1019,8,15,17,2,10,17,327,563,659,686,793,730,39,29,7,12,8,10,437,469,659,859,568,929,27,29,17,19,20,11,420,532,633,793,680,749,40,27,7,16,21,10,454,442,484,641,753,729,39,27,6,14,14,10,310,444,729,704,545,1089,14,13,17,1,14,14,392,260,660,729,635,931,11,13,10,6,15,12,293,277,811,881,673,1013,21,10,9,1,20,7,643,469,501,643,670,758,31,23,29,12,21,10,416,408,413,632,590,744,30,18,11,16,15,14,466,344,586,953,565,770,12,21,10,15,11,9,312,206,612,969,605,702,10,23,8,0,10,14,250,316,632,699,539,997,19,8,2,2,8,9,442,326,545,558,665,773,22,26,1,9,9,12,670,534,631,675,878,614,30,24,25,9,23,11,308,272,902,946,591,1225,3,9,9,3,23,3,373,345,508,853,692,681,19,19,19,16,14,11,7 +308,338,703,861,632,610,13,9,20,11,12,8,167,153,770,760,615,973,8,26,11,4,10,16,213,335,749,663,740,690,23,20,1,6,2,15,365,243,793,846,741,887,33,22,11,13,14,6,260,262,779,772,759,713,32,22,1,10,15,15,306,306,618,666,786,689,27,18,12,8,8,13,164,224,853,685,600,1043,8,26,11,1,8,11,308,158,800,706,550,885,5,28,4,8,9,17,235,165,899,858,722,967,11,17,3,1,14,10,495,351,677,716,787,714,27,20,33,14,15,13,280,342,571,645,681,704,24,21,17,18,11,19,390,294,762,922,516,724,20,18,16,17,11,14,282,244,742,946,582,660,10,18,14,2,10,19,116,190,752,684,650,957,13,19,4,0,2,14,326,216,677,573,762,733,18,19,7,7,3,11,486,484,785,698,955,574,24,15,31,9,17,12,248,268,1036,929,624,1179,19,16,3,1,17,8,337,307,632,810,619,639,21,28,17,14,16,16,7 +248,236,601,797,638,693,3,16,15,10,11,5,193,225,584,676,661,982,8,21,16,3,9,9,255,373,663,603,986,753,33,21,6,9,3,10,333,347,705,782,831,954,23,25,16,16,15,11,258,324,677,722,925,772,34,25,6,13,16,2,340,286,500,602,1028,722,33,19,7,11,9,8,216,316,701,625,688,1048,8,21,16,0,9,14,360,278,632,646,698,894,11,21,9,7,10,8,313,169,771,798,766,992,21,14,8,0,15,9,529,381,575,596,953,811,25,21,30,13,16,8,356,354,421,575,875,705,24,22,12,17,10,14,336,284,660,854,656,729,6,15,11,16,10,9,222,182,662,886,716,669,4,15,9,1,9,6,178,326,552,622,740,956,13,14,1,1,3,3,362,330,565,523,950,764,16,24,2,8,4,10,518,482,695,648,1171,665,24,16,26,8,18,9,322,292,832,867,634,1184,9,15,8,2,18,5,385,359,562,738,667,740,19,27,18,15,17,9,7 +283,253,575,960,690,679,3,20,22,10,13,3,184,248,648,831,641,1036,8,15,9,3,11,17,252,486,669,768,780,757,39,29,1,9,1,10,374,402,703,951,669,946,27,29,11,16,13,11,305,425,675,891,767,776,40,29,1,13,14,10,365,375,528,739,774,762,39,27,14,11,7,8,211,357,759,788,632,1106,14,15,9,0,7,16,353,217,686,811,676,950,11,17,4,7,8,12,240,174,821,963,744,1030,21,8,5,0,13,9,558,444,519,723,721,759,31,23,29,13,14,8,319,419,421,728,631,781,30,20,19,17,10,14,387,325,604,1013,594,791,12,19,18,16,12,9,263,185,626,1051,652,739,10,21,16,1,11,14,145,317,640,787,650,1030,19,8,6,1,1,9,367,343,593,588,702,806,22,26,9,8,2,10,573,521,657,707,915,631,30,22,33,8,16,9,239,189,908,1032,670,1246,3,7,1,2,16,3,344,386,510,893,709,678,19,21,13,15,15,11,7 +242,202,613,797,596,674,1,11,15,12,14,4,271,311,650,666,637,1009,4,28,16,5,12,18,311,393,699,653,1034,754,35,22,12,13,0,9,269,421,729,764,829,931,25,24,20,16,12,12,190,404,701,692,945,777,36,26,12,15,13,11,298,350,536,606,1076,751,35,20,23,15,6,7,218,288,763,625,716,1079,10,26,16,2,6,15,378,186,692,662,732,927,7,28,13,9,7,13,343,249,831,808,728,1013,19,15,14,2,12,12,421,311,569,652,999,770,27,24,28,15,13,7,372,290,421,549,919,748,26,27,20,19,9,13,288,232,654,856,690,760,10,14,15,18,13,8,228,154,664,896,758,716,8,14,13,3,12,15,230,222,638,614,760,999,15,21,17,1,0,10,346,228,607,557,984,789,18,21,20,8,1,7,368,404,695,756,1211,640,26,13,26,10,15,6,324,256,908,861,588,1221,7,14,10,0,15,4,365,295,562,732,607,661,15,32,10,13,14,12,7 +248,344,738,796,645,656,15,14,20,12,14,7,175,187,757,689,638,1023,12,33,11,1,12,19,231,291,688,578,771,736,21,13,1,1,0,10,339,233,864,813,714,933,31,15,11,4,12,11,296,260,834,785,746,757,36,21,1,3,13,14,324,286,675,705,825,735,37,11,12,3,6,8,186,210,890,634,651,1093,20,31,11,6,6,16,296,210,815,621,623,935,17,23,4,5,7,16,209,187,836,773,719,1017,9,22,3,2,12,9,519,291,684,757,824,746,39,25,31,11,13,8,284,346,556,646,718,756,36,20,17,15,7,14,362,278,769,833,593,774,24,15,16,14,13,9,262,260,735,861,613,712,22,27,14,1,12,18,144,206,707,641,691,1007,25,26,4,5,0,13,348,228,744,536,841,783,30,10,7,12,1,10,544,470,820,771,986,608,36,22,31,10,15,9,210,326,985,868,643,1229,21,23,3,4,15,7,293,213,637,717,614,665,23,21,15,11,14,15,7 +213,177,577,744,600,655,2,15,12,11,10,5,270,322,676,635,613,1010,3,22,21,4,8,19,366,412,697,630,946,735,34,24,11,14,4,12,328,434,689,709,807,920,26,22,21,17,16,11,327,443,667,661,893,756,35,22,11,16,17,12,405,391,528,651,992,736,34,20,18,16,10,10,329,385,773,574,666,1080,9,20,21,1,10,16,407,283,706,597,652,930,6,22,14,8,11,14,350,288,857,749,736,1010,20,17,13,3,16,7,528,354,529,723,929,743,26,24,29,14,17,10,467,347,455,596,833,757,25,27,15,18,11,16,411,221,614,815,610,769,11,18,8,17,9,11,225,145,634,837,670,713,9,18,6,2,8,16,289,321,670,561,710,1008,14,15,10,0,4,11,395,321,583,596,904,784,17,27,13,7,5,12,517,467,655,779,1127,613,25,17,21,9,19,11,347,379,944,806,596,1228,8,16,13,1,19,5,364,288,510,701,623,660,14,26,9,14,16,13,7 +272,230,564,829,611,667,1,16,23,12,11,8,255,327,659,726,642,1036,6,29,16,5,9,20,281,465,690,651,1019,747,37,19,6,15,3,11,309,469,686,784,838,946,25,25,16,16,15,10,218,476,658,700,942,766,38,27,6,15,16,15,320,418,519,548,1055,746,37,21,19,17,9,9,208,332,762,653,713,1106,12,25,16,2,9,13,392,162,689,684,711,948,9,25,9,9,10,17,357,259,846,836,747,1030,19,18,8,4,15,12,489,385,514,654,992,771,29,23,34,15,16,9,362,338,442,559,906,761,28,24,24,19,12,15,294,262,599,898,679,787,10,17,11,18,10,10,214,188,617,924,737,719,8,13,11,3,9,19,184,224,665,642,755,1014,17,22,11,1,3,14,366,236,580,531,963,790,20,20,14,8,4,7,446,440,650,654,1192,629,28,12,26,10,18,8,336,250,931,889,605,1242,5,17,8,0,18,8,407,287,501,788,628,692,17,29,20,13,17,16,7 +348,290,622,962,726,662,0,20,21,11,10,9,235,225,699,871,667,1031,5,11,10,4,12,19,319,467,684,758,692,742,36,27,0,6,14,12,377,363,734,949,727,941,24,31,10,13,6,11,274,382,714,881,761,761,37,31,0,10,5,16,400,380,587,747,714,741,36,25,13,8,12,10,226,348,818,782,656,1101,11,17,10,1,8,16,354,198,741,801,648,943,8,19,3,8,7,18,241,143,848,953,764,1025,18,10,2,1,2,11,561,435,580,745,699,754,28,23,34,14,15,10,326,412,470,730,619,756,27,18,18,18,11,16,444,348,665,1025,586,782,9,19,17,17,11,11,292,226,669,1041,648,714,7,19,15,2,12,20,188,280,677,783,670,1009,16,10,5,0,14,15,426,296,642,556,644,785,19,24,8,7,13,10,542,494,706,651,837,614,27,20,32,9,13,9,206,142,949,1026,704,1237,6,9,2,1,1,9,395,401,555,923,723,673,16,23,18,14,14,17,7 +321,333,559,974,726,663,3,23,24,9,17,4,224,196,662,871,679,1032,8,6,7,2,13,16,342,494,665,774,714,743,39,28,3,8,5,11,360,330,687,967,743,942,27,28,7,15,7,14,351,383,663,913,823,762,40,26,3,12,8,9,415,427,542,767,750,742,39,28,16,10,15,13,281,379,775,798,654,1102,14,12,7,1,5,17,335,233,700,817,620,944,11,14,0,6,12,11,226,168,839,969,800,1026,21,11,1,1,7,4,590,496,497,763,741,755,31,18,35,12,16,13,395,485,435,750,663,759,30,19,21,16,18,13,463,387,582,1029,588,783,12,22,20,15,18,12,255,255,606,1057,656,715,10,14,18,0,15,13,275,325,656,799,680,1012,19,5,8,2,5,10,457,367,597,578,650,788,22,25,11,9,6,15,601,613,635,701,875,615,30,25,35,9,22,14,243,247,922,1042,712,1238,3,10,1,3,10,4,338,384,490,917,763,674,19,18,19,16,13,10,7 +262,266,648,792,629,649,6,14,24,9,11,3,239,203,727,691,652,1010,1,23,17,2,9,15,333,409,704,592,949,729,30,23,7,6,3,16,359,305,758,783,796,920,30,17,17,13,15,11,324,322,734,729,880,750,33,17,7,10,16,10,398,356,589,627,999,728,30,19,16,8,9,14,298,346,824,616,727,1080,9,21,17,1,9,12,382,304,761,631,711,924,6,23,10,6,10,12,315,225,864,783,737,1004,18,22,9,1,15,11,577,395,604,669,966,739,28,21,37,12,16,14,444,412,504,588,872,747,25,22,21,16,10,20,406,306,689,847,675,763,15,23,14,15,10,15,228,190,683,871,705,703,13,23,14,0,9,14,262,322,719,617,761,1000,14,16,8,2,3,9,426,322,646,540,957,776,19,26,11,9,4,14,564,540,730,703,1166,605,25,22,25,9,18,13,332,380,993,860,625,1222,12,21,9,3,18,7,393,293,565,735,588,662,14,27,21,16,17,11,7 +259,295,825,754,668,725,21,21,28,11,11,4,206,330,782,709,679,1080,20,28,19,10,9,16,320,226,719,536,894,805,15,10,11,2,11,9,312,254,945,805,655,976,25,16,17,1,1,12,275,281,911,781,745,826,30,22,11,2,2,9,347,269,744,681,950,804,31,8,24,4,9,11,239,279,923,602,800,1148,28,24,17,15,9,17,305,335,854,551,844,1000,25,10,10,6,8,11,220,306,825,703,678,1080,3,25,9,1,1,6,490,174,785,747,933,809,39,26,29,16,10,11,329,243,639,624,853,823,40,13,29,16,12,13,401,217,870,791,796,839,30,22,16,15,12,10,249,265,816,791,750,779,28,30,16,4,9,13,271,231,688,647,804,1076,33,25,16,14,11,8,425,217,811,542,1004,852,38,7,19,11,10,13,515,347,923,779,1073,677,40,21,25,11,16,12,191,459,970,816,634,1298,27,26,9,11,4,2,322,258,728,651,577,698,27,18,25,10,13,10,7 +276,290,693,825,610,662,9,9,18,10,11,8,179,215,776,734,599,1031,8,32,13,3,9,20,229,387,681,619,762,742,27,18,3,3,3,11,375,327,813,824,723,941,33,26,13,10,15,10,286,354,789,772,749,761,40,28,3,7,16,15,326,298,656,684,810,741,35,20,10,5,9,9,170,268,895,653,594,1101,16,32,13,0,9,15,322,146,820,662,562,943,13,28,6,7,10,17,241,181,845,814,696,1025,15,19,5,0,15,10,519,345,643,698,791,760,35,20,31,13,16,9,262,306,549,635,691,756,32,21,15,17,10,15,350,242,728,880,542,782,18,18,14,16,10,10,266,188,698,902,572,714,16,14,12,1,9,19,116,172,744,656,644,1009,21,25,2,1,3,14,340,202,711,551,790,785,26,15,5,8,4,9,532,432,775,714,979,618,32,11,29,8,18,8,248,256,1020,893,606,1237,15,18,5,2,18,8,349,257,596,774,589,681,17,26,15,13,17,16,7 +288,332,645,925,628,622,14,27,17,12,12,6,169,221,544,836,571,885,9,12,14,5,10,8,221,353,691,733,770,668,22,34,4,15,2,11,427,301,705,876,623,869,28,32,14,16,14,10,274,314,683,794,735,683,23,22,4,15,15,1,336,252,504,648,756,617,22,32,9,17,8,9,164,280,657,745,552,955,3,8,14,2,8,13,324,220,600,776,594,797,6,10,7,9,9,7,255,205,741,928,708,887,30,15,6,4,14,8,527,313,633,688,701,754,14,18,32,15,15,9,278,282,479,645,603,610,13,15,14,19,9,13,364,256,718,1000,558,636,11,26,13,18,11,10,290,230,712,1016,594,574,7,20,11,3,10,5,106,132,506,734,568,863,2,5,1,1,2,4,330,152,545,589,654,657,5,29,4,8,3,11,556,416,731,660,883,608,13,29,28,10,17,10,278,342,796,981,614,1091,20,14,6,0,17,6,341,217,636,898,711,699,24,14,16,13,16,8,7 +288,240,557,933,637,675,0,11,22,11,11,5,267,251,672,832,638,1040,5,16,9,4,9,19,387,459,679,741,865,755,36,30,1,14,11,10,291,401,685,896,804,950,24,22,9,17,9,13,248,438,661,826,890,776,37,24,1,16,8,12,390,388,540,670,887,754,36,26,14,16,15,12,276,318,783,755,631,1110,11,24,9,1,11,18,354,164,708,784,547,952,8,26,2,8,8,14,267,207,831,936,781,1034,18,15,1,3,1,7,523,401,497,658,880,763,28,22,35,14,18,12,424,414,453,665,776,773,27,29,19,18,14,14,430,298,582,1002,541,791,9,16,18,17,12,11,214,180,602,1024,621,729,7,16,16,2,9,16,286,282,680,746,687,1026,16,17,6,0,11,11,484,314,595,609,797,802,19,31,9,7,12,14,518,538,635,656,1028,627,27,15,33,9,16,13,230,250,942,993,639,1248,6,14,1,1,4,5,383,305,478,890,688,682,16,30,19,14,17,13,7 +289,251,610,902,696,710,3,20,19,11,14,4,228,224,659,795,649,1079,8,17,12,4,12,16,270,458,650,700,766,790,39,29,2,6,0,9,352,372,732,893,707,989,27,29,12,13,12,12,331,385,704,841,767,809,40,29,2,10,13,9,387,333,541,705,770,791,39,27,11,8,6,9,229,365,770,724,644,1149,14,15,12,1,6,15,357,239,699,743,672,991,11,17,5,8,7,11,252,154,800,895,736,1073,21,8,4,1,12,8,582,430,560,703,747,802,31,23,34,14,13,9,331,391,430,680,647,808,30,20,16,18,9,13,395,317,645,959,608,830,12,19,15,17,13,8,261,165,645,983,634,766,10,21,13,2,12,13,151,303,635,725,660,1059,19,10,3,0,0,8,393,317,612,546,732,835,22,26,6,7,1,11,607,509,696,715,935,662,30,22,30,9,15,10,189,219,909,968,672,1285,3,7,4,1,15,2,330,368,535,845,691,721,19,21,18,14,14,10,7 +318,300,653,938,763,703,10,19,22,11,11,2,211,171,668,829,720,1072,9,12,9,4,9,14,313,413,653,730,745,783,26,28,1,4,11,11,333,295,773,933,774,982,34,32,9,11,1,10,278,294,743,885,798,802,41,32,1,8,2,7,394,320,574,749,769,782,36,26,14,6,9,9,224,354,789,758,717,1142,17,18,9,1,11,13,348,244,716,773,709,984,14,20,2,8,8,9,227,99,803,925,795,1066,14,9,1,1,1,8,553,429,603,751,774,795,36,24,37,14,14,9,328,394,463,722,690,797,33,19,19,18,12,15,426,356,688,989,629,823,19,18,18,17,12,10,238,216,678,1013,675,755,17,18,16,2,9,11,186,294,630,763,735,1050,22,11,6,0,11,6,422,308,643,554,727,826,27,25,9,7,10,11,556,506,739,695,894,655,33,19,33,9,16,10,176,234,908,1002,741,1278,16,8,1,1,4,2,383,391,570,875,748,714,18,24,21,14,13,8,7 +266,310,697,814,683,683,15,12,14,10,12,2,187,193,718,713,642,1036,10,33,17,3,10,14,263,383,691,598,769,763,21,15,7,3,2,11,389,289,803,821,724,946,31,17,17,8,14,10,312,300,787,787,748,784,36,21,7,5,15,7,376,294,636,677,805,764,33,13,6,5,8,9,218,330,845,638,621,1106,14,25,17,2,8,13,348,300,772,641,661,952,11,29,10,7,9,9,255,151,843,793,743,1032,9,22,9,0,14,8,565,393,655,709,770,761,33,27,33,13,15,9,328,366,521,634,680,785,30,22,11,17,9,15,378,312,740,861,607,793,24,21,10,16,11,10,254,208,722,881,651,741,16,21,8,1,10,11,156,288,674,649,651,1036,19,26,2,1,2,6,380,304,701,514,787,812,24,16,1,8,3,11,584,486,773,741,942,635,30,20,25,8,17,10,236,312,954,878,669,1252,21,21,9,2,17,2,341,317,618,751,710,678,23,25,19,11,16,8,7 +277,283,609,874,663,655,2,15,21,11,11,9,216,188,718,761,642,1022,3,22,10,4,9,19,286,384,687,678,775,735,34,24,0,8,3,10,340,288,733,861,780,932,26,18,10,15,15,13,303,317,709,801,804,756,35,18,0,12,16,16,377,363,588,671,817,734,34,20,13,10,9,8,223,271,827,698,615,1092,9,20,10,1,9,18,375,215,756,721,577,934,6,22,3,8,10,18,278,172,861,873,755,1016,20,21,2,1,15,11,566,366,557,709,808,745,26,20,32,14,16,8,381,419,489,644,702,755,25,23,18,18,12,14,399,305,642,931,545,773,11,22,17,17,10,9,255,211,654,961,613,711,9,22,15,2,9,20,189,255,700,697,667,1006,14,15,5,0,3,15,393,281,643,576,777,782,17,27,8,7,4,10,575,543,693,707,984,607,25,21,32,9,18,9,259,291,970,942,655,1228,8,20,2,1,18,9,384,260,532,813,666,664,14,26,16,14,17,17,7 +294,286,708,807,624,628,15,10,18,10,10,2,189,155,739,708,607,997,10,27,13,3,8,14,257,383,724,603,800,708,21,19,3,3,6,11,419,289,806,814,735,907,31,19,13,10,18,10,288,260,784,764,759,727,36,23,3,7,19,7,366,326,607,674,848,707,31,15,10,5,12,9,212,334,838,647,594,1067,12,27,13,0,12,13,346,214,777,646,614,909,9,29,6,7,13,9,251,125,878,798,710,991,9,20,7,0,18,8,553,409,676,686,797,744,31,21,27,13,19,9,320,358,540,633,719,722,28,22,15,17,13,15,398,322,761,856,552,748,24,19,14,16,9,10,298,182,739,886,622,680,14,19,12,1,8,11,146,252,719,648,642,975,17,20,2,1,6,6,378,274,674,545,824,751,22,22,5,8,7,11,556,514,792,722,1007,598,28,18,29,8,21,10,268,268,999,879,620,1203,21,19,5,2,21,2,371,333,635,744,639,669,23,27,15,13,14,8,7 +229,303,710,720,572,656,16,9,10,13,3,8,232,236,747,663,537,1023,13,36,21,2,5,18,268,366,686,580,778,736,20,14,11,0,17,13,410,286,826,747,599,933,30,16,21,3,17,10,363,299,806,729,649,757,35,22,11,4,16,15,337,251,667,661,812,735,36,12,2,2,17,11,253,309,886,552,594,1093,21,36,21,7,17,15,279,269,809,561,658,935,18,24,14,4,10,17,250,218,856,689,622,1017,8,21,13,3,11,10,478,336,662,745,793,746,40,24,25,10,10,11,251,293,546,606,709,756,37,29,7,14,12,17,313,257,747,753,608,774,25,10,8,13,4,12,335,187,725,777,594,712,23,22,10,2,5,19,195,209,699,577,620,1007,26,37,6,6,17,14,353,199,736,556,836,783,31,11,3,13,18,11,579,437,790,843,981,608,37,21,21,11,12,10,259,381,975,786,562,1229,22,22,13,5,12,8,222,234,619,631,553,665,24,24,23,12,15,16,7 +330,352,737,851,639,674,14,8,21,11,14,9,213,185,782,740,626,1041,11,27,10,4,12,17,271,301,699,641,741,754,22,15,0,4,2,8,365,241,859,854,722,951,32,19,10,7,10,13,286,270,835,790,750,775,37,25,0,4,11,16,364,266,694,698,773,753,38,13,13,6,8,6,190,228,913,679,623,1111,19,29,10,3,4,18,360,196,838,684,563,953,16,21,3,8,7,18,249,179,861,836,711,1035,10,22,2,1,10,11,549,301,683,722,788,764,38,21,32,14,11,6,304,326,575,657,682,774,35,16,18,18,11,12,404,260,768,896,555,792,23,17,17,17,13,7,274,252,736,924,583,730,21,21,15,2,12,20,138,184,730,684,667,1025,24,22,5,2,2,15,376,206,757,553,771,801,29,18,8,9,1,8,540,454,817,724,932,626,35,18,32,9,13,7,222,334,1012,921,635,1247,20,21,2,1,13,9,381,247,634,778,646,683,22,23,16,10,14,17,7 +274,308,596,901,619,657,2,18,19,10,0,9,219,251,693,792,580,1026,3,21,12,3,4,19,201,493,678,711,753,737,34,29,2,9,14,10,329,397,722,894,656,936,26,33,12,16,12,11,288,450,696,836,732,756,35,33,2,13,13,16,268,406,563,704,777,736,34,27,11,11,14,8,140,340,804,731,565,1096,9,19,12,0,14,16,292,152,731,754,621,938,6,21,5,7,7,18,243,243,826,906,687,1020,20,6,6,0,10,13,449,435,540,724,734,757,28,21,28,13,9,8,226,398,466,675,644,751,25,18,16,17,9,14,296,314,625,962,541,777,11,17,15,16,1,9,286,216,629,994,599,709,9,17,13,1,2,20,126,266,685,730,591,1004,14,16,3,1,14,13,300,278,620,591,725,780,19,26,6,8,15,6,504,480,678,754,942,615,25,18,30,8,11,7,262,182,953,975,601,1232,8,7,4,2,11,9,315,341,509,842,636,678,14,25,14,15,16,17,7 +251,371,724,812,652,672,15,17,19,11,15,5,146,116,777,735,641,1041,10,36,12,2,13,15,234,316,708,590,776,752,21,10,2,2,1,16,382,192,832,831,757,951,31,10,12,5,11,7,307,235,812,797,785,771,36,18,2,2,12,12,333,333,663,697,814,751,35,6,11,4,7,14,213,295,894,642,634,1111,16,32,12,5,5,10,305,243,827,633,576,953,13,20,5,6,8,14,240,158,866,785,736,1035,9,31,4,1,11,11,520,396,682,741,813,766,35,28,34,12,12,14,297,411,560,648,707,766,32,21,16,16,12,20,371,349,767,853,558,792,24,18,15,15,14,15,257,257,737,873,614,724,18,28,13,0,13,16,165,257,731,659,686,1019,21,29,3,4,1,11,345,283,722,496,804,795,26,13,6,11,0,12,543,555,804,731,975,624,32,27,30,9,14,13,245,335,1009,878,650,1247,21,30,4,3,14,7,310,280,637,751,665,687,23,16,18,10,15,13,7 +316,378,793,779,640,652,19,14,22,15,16,11,179,249,810,688,629,1021,14,33,9,4,12,19,219,247,717,561,742,732,17,9,1,2,6,10,357,229,907,808,661,931,27,15,9,1,6,13,280,216,885,766,701,751,32,21,1,2,7,16,308,264,746,696,796,731,33,7,14,4,10,8,158,208,953,619,666,1091,22,31,9,9,6,18,312,242,880,600,646,933,19,13,2,6,13,20,243,233,873,752,690,1015,5,28,3,1,6,13,493,211,743,740,807,744,41,25,31,12,11,8,260,282,625,641,703,746,38,18,19,16,15,14,368,288,828,808,614,772,28,15,18,15,17,9,268,304,790,840,602,704,24,27,16,0,14,22,134,166,740,636,688,999,27,28,6,8,6,15,342,168,809,527,830,775,32,10,9,11,5,8,498,406,871,760,947,604,38,22,33,11,17,7,258,360,1022,851,630,1227,25,27,1,5,9,11,369,199,692,698,597,665,27,17,15,10,14,19,7 +313,301,845,762,643,710,25,11,21,13,17,4,204,218,808,685,650,1079,20,28,18,4,13,18,238,284,743,544,889,790,11,16,8,4,5,13,316,288,945,769,754,989,21,22,18,3,7,8,241,261,923,715,832,809,26,26,8,0,8,11,307,231,744,637,929,789,27,14,13,6,5,11,153,223,943,590,721,1149,22,30,18,7,5,11,325,195,874,585,715,991,19,16,11,8,12,13,244,196,859,737,731,1073,7,21,10,1,7,10,484,294,813,679,908,804,33,24,40,14,8,11,269,279,659,584,812,804,30,15,18,18,10,17,345,245,898,813,685,830,30,18,17,17,14,12,257,209,844,825,679,762,24,24,15,2,15,15,139,215,730,597,745,1057,27,23,5,6,5,10,361,213,813,514,915,833,32,13,8,9,4,9,479,419,931,703,1030,662,30,15,24,9,10,10,201,311,1018,828,641,1285,31,20,10,3,10,4,376,312,758,709,650,725,23,24,24,10,13,12,7 +309,307,590,1034,739,664,2,19,26,9,11,6,208,148,705,917,690,1033,3,8,9,2,9,14,324,438,678,834,715,744,34,30,5,8,11,13,328,296,710,1023,758,943,26,30,5,15,9,16,259,359,690,953,834,763,35,30,5,12,8,11,375,377,565,799,697,743,34,30,18,10,15,15,221,309,806,858,669,1103,9,16,5,1,11,15,287,171,741,877,621,945,6,20,2,6,8,9,166,138,848,1029,807,1027,20,9,3,1,1,2,514,462,536,789,744,756,26,16,35,12,18,15,323,437,478,792,670,758,25,19,23,16,14,11,437,351,621,1085,577,784,11,18,22,15,12,14,269,229,633,1117,659,716,9,12,20,0,9,11,237,279,699,859,691,1011,14,9,10,2,11,12,439,315,620,632,581,787,17,25,13,9,12,17,515,555,666,711,808,616,25,21,37,9,16,16,189,205,965,1102,723,1239,8,8,3,3,4,6,318,372,511,971,772,675,14,22,21,16,17,8,7 +277,237,599,879,584,636,2,13,19,9,14,6,202,198,714,754,607,1003,3,20,12,2,12,20,316,436,697,689,938,716,34,26,8,10,0,11,358,350,711,866,793,913,26,22,14,17,12,12,233,393,693,798,875,737,35,24,8,14,13,13,343,359,566,664,978,715,34,22,21,12,8,11,261,331,809,709,676,1073,9,24,12,1,6,17,341,199,744,732,656,915,6,26,7,6,7,15,280,168,855,884,702,997,20,17,8,1,12,8,492,382,555,676,927,726,26,20,32,12,13,11,387,379,493,647,833,736,25,25,22,16,13,15,381,287,640,934,626,754,11,16,15,15,13,10,243,177,652,972,656,692,9,16,13,0,12,17,241,247,708,706,714,987,14,17,13,2,0,12,405,269,621,587,904,763,17,29,16,9,1,13,483,507,679,714,1121,588,25,15,30,9,15,12,333,277,982,953,580,1209,8,16,6,3,15,6,320,298,530,810,587,645,14,30,14,16,16,14,7 +355,395,797,898,702,700,18,10,24,13,10,4,238,164,784,801,689,1069,15,25,9,6,10,16,300,278,715,682,772,780,18,17,3,6,12,15,370,216,913,905,727,979,28,19,7,3,2,6,271,211,887,851,773,799,33,25,3,2,1,11,381,259,720,737,768,779,34,13,16,8,8,13,205,241,923,726,690,1139,23,33,7,7,10,11,369,211,850,725,632,981,20,21,0,10,7,13,244,164,855,877,748,1063,6,24,1,3,0,10,544,324,747,753,819,792,42,23,37,16,15,13,299,335,607,694,719,794,39,18,21,20,11,19,429,329,832,939,608,820,27,15,20,19,11,14,313,277,790,965,630,752,25,21,18,4,10,15,151,207,708,733,728,1047,28,26,8,6,12,10,407,221,789,548,790,823,33,20,11,9,11,11,537,479,877,727,909,652,39,18,35,11,15,12,211,299,992,966,690,1275,24,23,1,3,3,6,376,320,696,823,701,713,26,21,21,12,12,12,7 +274,316,642,857,695,696,3,11,22,9,17,4,201,159,691,760,678,1065,2,24,9,2,15,18,307,389,684,653,817,776,33,22,1,4,3,11,331,269,770,858,826,975,27,18,9,11,9,10,314,288,742,812,852,795,34,20,1,8,10,11,390,374,589,688,839,775,33,18,14,6,7,9,260,310,810,683,657,1135,8,24,9,1,3,15,354,274,735,696,587,977,5,26,2,6,10,13,265,171,830,848,795,1059,21,19,1,1,9,8,565,409,586,720,852,788,27,20,33,12,10,9,396,460,470,657,748,790,24,23,19,16,12,15,416,338,671,910,561,816,12,20,18,15,16,10,222,258,673,936,643,748,10,20,16,0,15,15,240,324,667,688,713,1043,13,17,6,2,3,10,430,350,660,537,803,819,18,25,9,9,2,11,558,582,726,716,1010,648,24,19,33,9,14,10,234,318,941,927,689,1271,9,18,1,3,12,4,371,319,555,802,718,707,13,28,17,14,13,12,7 +285,283,612,963,668,672,5,12,25,10,11,3,204,158,713,872,655,1041,2,19,12,3,9,17,312,420,690,767,798,752,31,29,4,11,11,12,288,310,728,940,805,951,29,25,6,18,9,9,247,351,706,874,861,771,34,27,4,15,8,10,373,355,567,718,798,751,31,25,17,13,15,10,221,281,810,785,630,1111,10,27,6,0,11,14,319,131,743,810,528,953,7,29,1,7,8,12,194,142,844,962,786,1035,19,16,2,0,1,9,504,414,564,728,843,774,29,21,36,13,18,10,341,403,496,713,737,766,26,28,22,17,14,16,425,319,649,1016,516,792,14,15,21,16,12,11,255,211,641,1050,614,724,12,13,19,1,9,14,223,251,715,780,686,1019,15,20,9,1,11,9,429,289,626,593,728,795,20,28,12,8,12,10,507,537,692,650,961,632,26,12,36,8,16,9,177,233,985,1027,664,1247,11,15,2,2,4,3,350,308,525,898,703,695,13,31,24,15,17,11,7 +309,319,522,1015,673,648,4,13,23,10,10,5,260,248,643,912,664,1017,9,14,8,3,12,15,378,510,662,829,851,728,40,32,2,13,14,16,310,402,644,988,812,927,28,24,8,18,12,11,223,467,622,900,902,747,41,24,2,17,11,12,403,465,499,746,879,727,40,28,15,15,18,14,271,319,744,845,631,1087,15,22,8,0,8,12,357,107,673,872,567,929,12,24,1,7,7,14,232,224,828,1024,813,1011,22,13,2,2,2,11,512,464,466,756,862,740,32,22,32,13,15,14,395,439,426,759,762,742,31,25,20,17,17,20,421,359,551,1082,533,768,13,14,19,16,11,15,249,249,583,1112,657,700,11,12,17,1,12,16,271,273,647,838,693,995,20,15,7,1,14,11,487,299,554,635,787,771,23,31,10,8,15,14,473,571,600,612,1018,600,31,15,34,8,13,13,221,195,915,1085,675,1223,2,14,0,2,1,7,418,362,467,968,736,659,20,28,16,15,14,13,7 +308,412,744,780,643,670,18,18,19,13,14,11,201,213,773,697,632,1039,13,31,12,2,12,19,269,253,702,560,721,750,18,13,2,2,0,12,363,167,862,799,686,949,28,11,12,3,12,11,348,220,844,765,712,769,33,13,2,2,13,18,378,314,699,689,779,749,34,9,11,4,6,10,240,244,912,614,629,1109,21,27,12,7,6,16,342,282,837,601,589,951,18,23,5,6,7,20,233,225,852,753,705,1033,6,30,4,1,12,13,569,297,688,753,786,762,40,27,32,12,13,10,346,380,578,630,678,764,37,24,16,16,9,16,420,336,773,819,565,790,27,19,15,15,13,11,284,312,739,841,599,722,23,31,13,0,12,22,184,224,717,627,673,1017,26,24,3,6,0,15,378,240,770,522,801,793,31,16,6,11,1,8,584,504,816,759,936,622,37,30,30,9,15,9,244,408,997,848,639,1245,24,29,4,3,15,11,331,179,639,715,614,681,26,19,16,10,14,19,7 +253,399,748,878,621,760,17,11,35,11,13,2,186,152,789,729,656,1059,12,18,14,4,9,14,282,230,720,676,925,828,19,22,24,4,9,11,304,154,860,891,692,903,29,18,14,7,3,12,173,187,838,839,798,833,34,20,24,4,4,7,299,223,707,711,977,851,35,18,37,6,11,9,161,181,926,712,753,1119,20,24,14,3,9,13,307,267,849,719,779,1001,17,26,21,8,10,9,208,178,866,871,677,1081,7,19,22,1,3,10,454,286,704,697,956,812,39,16,16,14,14,9,309,357,590,678,872,874,36,21,42,18,14,15,363,323,789,911,731,858,26,20,29,17,14,10,241,299,755,959,727,830,22,24,27,2,11,11,171,271,743,719,781,1113,25,17,29,2,9,8,385,297,764,556,995,893,30,25,32,9,8,9,445,475,830,747,1142,716,36,19,44,9,18,8,223,391,1021,954,599,1227,23,18,22,1,6,2,340,290,653,789,536,653,25,26,22,10,15,10,7 +315,327,531,998,721,706,3,21,21,10,11,5,232,294,654,885,668,1075,8,12,12,1,13,17,358,534,657,796,737,786,39,26,0,11,15,10,328,448,657,977,716,985,27,34,10,18,13,15,289,497,633,891,830,805,40,34,0,15,12,12,397,431,512,741,747,785,39,26,13,13,19,12,277,383,757,816,647,1145,14,20,10,2,9,18,303,183,684,839,611,987,11,18,3,5,8,14,240,230,831,991,801,1069,21,7,2,2,3,7,516,450,477,767,708,798,31,20,40,11,14,12,375,447,437,744,650,800,30,17,18,15,18,12,463,355,562,1053,555,826,12,20,17,14,12,11,271,243,588,1079,653,758,10,16,15,1,13,16,297,295,660,815,667,1053,19,13,5,3,15,11,469,333,567,596,593,829,22,23,8,10,16,14,495,507,613,649,810,658,30,17,32,10,12,13,195,191,926,1060,705,1281,3,10,2,4,0,5,366,352,470,941,796,717,19,26,24,15,13,13,7 +256,210,605,808,662,682,3,12,16,13,9,7,303,329,674,725,667,1047,8,29,15,6,7,19,295,421,695,632,946,760,39,21,5,12,5,10,315,433,719,769,851,961,27,25,15,15,13,11,248,426,695,691,911,779,40,25,5,14,14,14,322,366,542,575,976,757,39,19,8,14,7,8,226,320,775,630,692,1117,14,25,15,3,7,14,418,172,708,659,654,959,11,27,8,10,8,16,367,253,839,811,798,1041,21,16,7,3,13,11,513,343,563,681,945,784,31,27,31,16,14,8,310,332,451,550,849,772,30,26,13,20,8,14,256,244,648,879,628,798,12,15,12,19,8,9,266,156,658,899,672,730,10,13,10,4,7,18,218,260,664,621,740,1025,19,26,0,2,5,13,346,262,607,548,904,801,22,18,3,9,6,8,500,450,691,675,1131,642,30,12,27,11,16,7,312,256,938,868,662,1253,3,15,7,1,16,7,415,303,552,775,695,705,19,29,17,12,15,15,7 +289,361,753,820,650,671,17,18,26,10,16,13,194,234,766,719,655,1036,14,19,15,3,12,13,254,274,715,606,856,751,19,19,5,3,6,18,284,234,881,829,711,946,29,13,15,6,6,15,261,253,849,771,783,772,34,19,5,3,7,14,313,273,692,669,906,750,35,15,18,5,10,16,157,205,905,650,730,1106,22,23,15,4,6,18,301,227,830,649,700,948,19,23,8,7,13,18,242,230,845,801,716,1030,7,24,7,0,6,11,488,244,707,695,913,759,41,17,35,13,11,16,301,287,571,628,813,769,38,18,23,17,15,14,375,275,792,863,670,787,26,21,14,16,17,17,217,275,754,889,660,725,24,25,14,1,14,20,167,153,714,657,756,1022,27,18,10,3,6,13,369,165,763,526,922,798,32,22,13,10,5,14,481,415,847,701,1061,623,38,24,27,8,17,15,201,349,992,890,642,1244,23,25,7,2,9,13,368,198,654,751,589,678,25,19,23,9,14,17,7 +262,288,515,866,649,670,4,18,20,10,9,3,269,285,628,755,660,1035,9,23,11,3,7,17,343,469,647,678,941,750,40,21,1,13,5,12,379,411,641,845,824,945,28,21,11,18,17,11,346,438,613,779,922,769,41,17,1,17,18,10,422,424,486,637,975,751,40,19,12,15,11,12,330,406,731,696,659,1105,15,17,11,0,11,16,412,288,658,721,633,947,12,21,4,7,12,12,331,265,815,873,791,1029,22,20,5,2,17,7,603,439,465,703,920,760,32,25,29,13,18,12,442,480,411,620,828,768,31,22,17,17,12,16,374,344,550,929,603,786,13,21,16,16,8,11,250,222,580,961,671,726,11,21,14,1,7,14,290,362,634,687,719,1019,20,16,4,1,5,9,422,378,541,574,883,795,23,24,7,8,6,14,600,606,601,717,1114,624,31,20,31,8,20,13,370,342,900,934,651,1241,2,19,3,2,20,3,389,331,472,809,696,681,20,23,13,15,15,11,7 +186,282,742,730,626,679,19,12,11,16,3,5,213,261,729,667,621,1044,16,35,20,7,5,17,267,283,698,590,830,759,17,15,10,3,11,14,359,259,870,767,657,954,27,15,20,6,13,9,348,284,838,767,717,778,32,21,10,7,12,12,298,258,673,729,876,760,33,13,3,1,11,12,226,272,870,568,686,1114,24,33,20,12,11,14,278,322,799,543,696,956,21,25,13,3,4,14,255,243,834,693,680,1038,5,22,12,6,11,9,455,269,686,801,871,767,41,23,22,13,8,12,236,270,558,668,781,777,40,28,8,11,6,18,304,244,771,763,660,795,28,13,7,10,2,13,306,216,747,781,648,735,26,25,9,5,3,16,228,252,673,607,712,1028,29,34,5,11,11,11,340,236,742,598,906,804,34,12,2,12,12,12,528,404,822,883,1017,631,40,22,22,14,10,11,256,424,953,794,614,1250,25,21,12,8,10,5,223,247,641,639,591,686,27,23,20,11,13,13,7 +294,322,615,881,677,694,3,15,20,10,15,6,171,161,696,782,640,1063,2,20,11,3,13,16,247,433,663,669,689,774,33,24,1,3,1,15,381,289,739,876,726,973,27,28,11,10,11,8,312,330,715,810,764,793,34,28,1,7,12,13,356,362,580,704,741,773,33,22,12,5,7,13,220,342,811,703,629,1133,8,24,11,0,5,13,334,214,736,712,627,975,5,24,4,7,8,15,255,141,817,864,723,1057,21,15,3,0,11,10,551,463,563,700,726,786,27,20,35,13,12,13,316,426,467,671,634,788,24,23,17,17,12,19,410,368,648,932,559,814,12,14,16,16,14,14,270,224,650,952,611,746,10,12,14,1,13,17,162,274,668,708,657,1041,13,17,4,1,1,12,352,298,645,513,703,817,18,27,7,8,0,11,556,536,699,674,896,646,24,13,31,8,14,12,246,224,940,945,655,1269,9,14,3,2,14,6,339,355,526,822,664,705,13,30,19,13,15,14,7 +283,367,766,780,665,652,17,19,21,13,16,5,170,214,771,697,662,1021,14,34,10,2,14,15,284,256,706,558,809,732,19,8,0,2,2,12,372,180,884,807,716,931,29,8,10,3,10,13,331,213,862,777,764,751,34,14,0,2,11,8,375,267,701,695,863,731,35,4,13,4,4,14,245,243,908,614,709,1091,22,26,10,7,4,16,299,311,833,599,675,933,19,18,3,6,9,10,228,216,850,751,725,1015,7,29,2,1,10,7,556,246,718,749,874,744,41,30,32,12,11,14,349,363,586,640,768,746,38,19,18,16,9,16,417,299,803,813,639,772,26,20,17,15,15,13,249,281,769,839,633,704,24,32,15,0,14,12,223,293,713,635,733,999,27,27,5,6,2,9,397,297,770,524,879,775,32,11,8,11,1,16,577,481,848,771,1006,604,38,29,32,9,13,15,257,423,995,848,657,1227,23,30,2,3,13,5,304,252,669,705,616,663,25,14,16,10,14,9,7 +239,419,737,839,704,662,19,19,26,11,16,5,156,162,750,736,687,1029,14,36,5,4,14,17,228,208,705,627,768,742,17,10,5,4,2,8,384,132,853,860,753,939,27,6,7,5,10,13,273,183,831,832,781,763,32,14,5,2,11,12,331,259,676,724,768,741,33,6,18,6,6,10,165,205,889,673,674,1099,20,28,5,5,4,18,309,297,816,670,598,941,17,18,2,8,9,14,224,224,861,822,770,1023,5,33,3,1,10,7,520,262,687,776,821,752,39,30,33,14,11,10,281,387,557,683,715,762,36,19,23,18,11,12,343,335,772,872,588,780,28,20,22,17,15,9,251,325,742,910,630,718,22,32,20,2,14,16,115,307,688,688,718,1013,25,29,10,4,2,11,345,327,747,533,784,789,30,13,13,9,1,12,553,505,813,794,929,614,36,31,37,9,13,11,227,419,970,911,700,1235,25,32,3,1,13,5,316,260,644,750,715,671,27,14,17,10,14,13,7 +265,309,652,966,682,642,6,11,28,10,11,2,190,128,711,859,681,997,1,20,9,3,9,16,312,398,706,766,894,720,30,30,7,7,11,11,288,282,756,961,861,921,30,26,3,14,7,10,175,281,738,911,899,743,31,26,7,11,6,9,315,345,579,763,892,713,30,26,20,9,13,11,183,303,810,790,696,1067,7,28,3,0,11,13,265,177,749,809,608,909,4,28,4,7,8,11,186,134,862,961,800,991,18,15,5,0,1,6,426,458,612,735,923,744,26,20,33,13,18,11,305,437,486,748,823,726,23,27,25,17,12,15,361,347,697,1017,610,748,15,16,24,16,12,10,247,225,693,1049,642,682,13,10,22,1,9,13,231,307,695,791,744,979,12,21,12,1,11,8,415,337,644,584,846,755,17,27,15,8,10,13,427,569,732,689,1073,604,23,11,39,8,16,12,211,231,973,1034,680,1203,12,16,5,2,4,2,332,394,581,901,701,665,14,30,21,15,17,10,7 +372,334,664,897,635,647,7,18,17,13,10,10,267,279,739,810,584,1010,2,19,14,6,8,18,261,459,710,701,691,727,29,29,4,8,6,9,361,391,774,872,656,926,31,35,14,15,18,12,310,412,756,804,690,746,32,35,4,12,19,15,320,378,607,690,719,720,29,27,9,10,12,7,196,300,838,723,565,1080,8,21,14,3,12,15,362,156,777,744,607,922,5,21,7,10,13,19,299,253,852,896,687,1004,17,6,6,3,18,14,507,389,618,696,680,751,27,23,30,16,19,7,280,338,514,667,590,735,24,20,14,20,13,13,360,282,703,966,549,761,16,17,13,19,9,8,334,244,687,984,591,693,14,15,11,4,8,21,146,218,713,716,587,988,13,14,1,2,6,12,354,226,672,583,679,764,18,26,4,9,7,5,522,406,742,674,876,609,24,16,28,11,21,6,266,182,987,961,617,1216,13,7,6,1,21,10,387,325,575,862,642,672,15,27,16,12,14,18,7 +305,345,778,736,632,673,18,20,20,15,14,5,188,260,785,657,629,1042,15,33,13,4,12,19,280,280,702,532,792,753,18,11,3,2,0,12,400,230,906,765,669,952,28,11,13,1,12,11,385,257,878,743,729,772,33,17,3,2,13,12,397,283,721,693,850,752,34,9,14,4,6,12,271,285,924,574,694,1112,23,25,13,9,6,16,339,331,849,553,682,954,20,17,6,6,7,14,230,260,844,705,684,1036,6,26,5,1,12,7,590,240,722,769,853,765,42,27,33,12,13,12,379,331,600,628,749,767,39,18,19,16,7,16,441,257,807,769,644,793,27,21,14,15,13,11,271,277,763,793,622,725,25,31,12,0,12,16,225,271,719,593,714,1020,28,26,6,8,0,11,399,275,790,548,874,796,33,8,9,11,1,14,617,445,858,803,995,625,39,26,29,11,15,13,277,453,1001,806,620,1248,24,25,5,5,15,5,310,246,669,661,573,684,26,19,17,10,14,13,7 +262,258,628,852,623,673,8,19,18,11,9,5,211,191,729,737,586,1038,5,24,13,4,7,19,257,385,670,652,741,753,28,24,3,6,5,10,417,307,746,851,690,948,32,24,13,13,17,13,350,342,724,811,718,772,37,22,3,10,18,12,382,304,597,691,775,754,32,22,10,8,11,10,242,306,836,680,581,1108,13,16,13,1,11,18,336,228,769,693,629,950,10,22,6,8,12,14,259,175,850,845,675,1032,16,15,5,1,17,7,561,367,574,709,744,761,32,24,29,14,18,10,308,352,500,652,654,773,29,21,15,18,12,14,364,270,659,905,559,789,17,18,14,17,8,9,290,166,655,933,585,731,15,20,12,2,7,16,158,238,709,681,603,1022,18,17,2,0,5,11,366,250,652,550,749,798,23,23,5,7,6,12,612,476,704,761,950,625,29,21,29,9,20,11,256,318,979,918,603,1244,14,14,5,1,20,5,317,273,541,787,618,680,16,22,15,14,15,13,7 +333,343,693,851,654,674,15,11,21,12,13,6,228,218,758,732,645,1043,10,28,10,5,11,18,224,286,679,649,778,754,21,18,0,5,1,9,376,272,793,842,733,953,31,22,10,10,13,12,287,275,777,792,789,773,36,22,0,7,14,13,313,223,628,680,814,755,33,16,13,7,7,7,151,241,861,675,642,1113,14,26,10,2,7,15,335,209,802,692,648,955,11,26,3,9,8,15,272,202,851,844,712,1037,9,17,2,2,13,12,512,300,655,692,801,766,33,22,34,15,14,7,247,275,537,647,711,772,30,23,18,19,10,13,339,269,740,906,562,794,24,18,17,18,12,8,293,239,710,932,604,730,16,16,15,3,11,17,95,183,714,676,680,1023,19,21,5,1,1,12,331,193,687,541,798,799,24,19,8,8,2,7,531,419,771,720,979,626,30,15,32,10,16,6,253,325,994,919,640,1249,21,18,2,0,16,6,366,284,610,790,655,685,23,28,18,13,15,14,7 +390,282,628,1069,811,682,0,21,25,14,12,6,285,211,703,924,746,1051,5,6,14,7,14,8,361,423,698,875,797,762,36,30,4,9,16,11,375,351,738,1044,742,961,24,28,6,14,8,12,302,366,720,976,802,781,37,28,4,13,7,5,446,338,577,814,713,761,36,30,17,11,14,13,268,254,816,891,755,1121,11,14,6,4,10,13,386,164,745,918,745,963,8,20,1,11,9,3,229,143,860,1070,827,1045,18,9,2,4,4,6,593,387,584,776,730,784,28,16,36,17,13,13,360,382,474,817,688,776,27,19,22,21,13,13,498,298,669,1114,661,802,9,20,21,20,13,12,314,232,671,1158,707,734,7,12,19,5,14,5,228,274,679,884,759,1029,16,7,9,3,16,8,484,304,636,651,643,805,19,25,12,10,15,15,560,476,706,692,796,642,27,23,36,12,11,14,160,166,951,1131,781,1257,6,8,2,2,1,6,405,389,559,1000,806,705,16,20,26,13,12,4,7 +334,294,573,1037,659,662,2,13,27,11,9,12,277,199,696,938,654,1031,3,16,8,4,11,10,401,449,669,849,829,742,34,34,6,12,13,19,329,361,697,1014,808,941,26,24,4,17,11,20,210,408,675,938,878,761,35,26,6,16,10,13,400,398,552,772,839,741,34,32,19,14,17,21,254,276,795,865,633,1101,9,24,4,1,9,17,328,110,726,892,517,943,6,28,3,8,6,5,205,171,839,1044,783,1025,20,15,4,1,1,4,499,425,513,754,866,754,26,22,34,14,16,21,380,420,479,783,756,756,25,27,24,18,16,15,430,312,598,1104,533,782,11,14,23,17,10,20,294,222,612,1132,615,714,9,8,21,2,11,7,286,262,700,858,695,1009,14,17,11,0,13,16,498,298,607,625,759,785,17,31,14,7,14,23,486,542,647,634,992,614,25,13,38,9,14,22,194,204,966,1105,659,1237,8,14,4,1,2,12,385,333,488,992,704,673,14,30,20,14,15,4,7 +287,287,614,925,692,667,0,19,21,11,12,6,184,158,699,824,657,1036,5,16,10,4,10,20,266,424,686,729,728,747,36,26,0,6,2,11,352,308,738,916,737,946,24,26,10,13,14,12,311,355,716,864,783,766,37,26,0,10,15,13,363,337,589,738,764,746,36,24,13,8,8,9,207,319,820,751,642,1106,11,16,10,1,8,17,337,207,743,772,646,948,8,18,3,8,9,15,230,124,858,924,748,1030,18,11,2,1,14,8,558,420,554,742,755,759,28,22,32,14,15,9,337,391,472,705,661,761,27,21,18,18,11,15,417,325,639,986,576,787,9,18,17,17,11,10,255,207,651,1012,628,719,7,20,15,2,10,17,167,231,677,750,672,1014,16,9,5,0,2,12,385,261,648,571,730,790,19,27,8,7,3,11,573,525,688,720,931,619,27,21,32,9,17,10,207,233,947,995,672,1242,6,10,2,1,17,6,328,330,533,874,689,678,16,22,16,14,16,14,7 +336,320,782,782,629,646,20,11,18,12,11,7,217,197,803,685,622,1015,15,26,13,5,9,19,287,319,734,576,759,726,16,18,3,5,3,12,427,243,890,785,678,925,26,20,13,6,15,9,328,272,876,745,710,745,31,20,3,3,16,14,398,248,729,661,817,725,32,16,10,7,9,10,220,246,938,618,635,1085,19,24,13,4,9,14,350,212,865,617,627,927,16,24,6,9,10,16,263,155,866,769,691,1009,4,19,5,2,15,9,591,291,738,709,806,738,38,24,29,15,16,10,322,288,610,610,710,742,35,15,15,19,10,16,430,262,823,831,593,766,29,20,14,18,10,11,316,214,783,857,603,698,21,24,12,3,9,18,126,180,745,621,673,995,24,19,2,3,3,13,382,200,790,532,837,771,29,15,5,10,4,10,612,420,856,733,972,598,35,17,29,10,18,9,258,330,1027,852,625,1221,26,18,5,0,18,7,355,263,685,721,596,657,28,26,15,11,17,15,7 +319,289,712,804,599,640,10,10,23,9,8,6,212,214,793,705,600,1009,7,19,14,2,6,16,334,350,692,604,827,720,26,23,4,4,6,15,366,280,828,805,718,919,34,19,14,11,14,10,329,301,806,743,776,741,39,21,4,8,13,13,405,303,677,655,879,719,34,19,15,6,6,13,269,269,912,632,661,1079,15,25,14,1,6,13,341,233,839,643,635,921,12,27,7,6,5,15,232,202,860,795,687,1003,14,20,6,1,10,10,574,318,662,691,864,732,34,17,34,12,13,13,399,357,568,614,762,738,31,22,20,16,9,19,467,253,747,857,597,760,19,19,13,15,7,14,277,193,713,883,601,694,17,23,11,0,6,17,263,231,765,635,691,991,20,18,7,2,6,12,445,235,734,574,861,767,25,26,10,9,7,13,579,481,792,725,1048,592,31,20,28,9,13,12,257,351,1039,874,593,1215,16,19,6,3,13,6,348,242,613,745,558,651,18,27,18,14,14,14,7 +334,266,620,842,673,711,0,23,14,9,10,2,243,265,657,765,618,1080,5,12,17,2,8,14,317,531,672,632,783,791,36,26,7,6,4,13,425,411,736,835,670,990,24,26,17,13,16,10,424,400,708,787,724,810,37,26,7,10,17,7,444,402,543,659,791,790,36,24,6,8,10,11,306,438,770,660,609,1150,11,12,17,1,10,11,384,272,699,675,671,992,8,14,10,6,11,9,279,229,802,827,727,1074,18,11,9,1,16,8,629,475,576,669,742,803,28,22,31,12,17,11,396,410,428,624,656,805,27,17,11,16,11,17,456,356,661,903,607,831,9,22,10,15,9,12,282,180,659,915,641,763,7,20,8,0,8,11,226,330,637,665,617,1058,16,5,2,2,4,6,426,344,614,526,739,834,19,23,1,9,5,13,674,538,708,711,950,663,27,25,25,9,19,12,278,276,911,904,655,1286,6,10,9,3,19,4,353,383,551,805,684,722,16,18,19,16,16,8,7 +280,398,670,845,634,631,12,12,22,10,12,9,191,165,757,724,605,1000,9,29,9,3,10,19,221,311,670,647,706,711,24,15,1,3,2,10,407,217,790,858,707,910,34,17,11,8,14,13,302,252,770,822,723,730,39,21,1,5,15,16,344,312,645,720,754,710,36,11,14,5,8,8,192,224,878,683,586,1070,17,25,9,2,8,18,314,206,801,690,580,912,14,27,4,7,9,18,243,185,850,842,694,994,12,22,5,0,14,11,535,345,616,770,743,723,36,23,29,13,15,8,284,382,530,671,637,727,33,18,19,17,9,14,362,322,701,886,544,751,21,21,18,16,11,9,294,282,679,930,578,683,19,21,16,1,10,20,108,198,717,686,624,980,22,22,6,1,2,15,336,226,700,565,742,756,27,18,9,8,3,10,574,512,746,780,923,583,33,20,33,8,17,9,268,344,993,925,624,1206,18,23,1,2,17,9,333,229,573,760,617,642,20,23,13,11,16,17,7 +235,355,775,756,660,652,19,17,23,13,16,8,158,250,786,663,659,1021,16,36,14,6,14,18,234,244,711,542,830,732,17,8,4,2,2,13,324,204,895,791,677,931,27,10,14,1,10,10,259,203,875,757,747,753,32,16,4,2,11,15,313,249,724,693,888,731,33,6,17,4,8,11,193,229,927,598,740,1091,24,28,14,11,4,15,309,293,856,573,736,933,21,18,7,6,9,17,244,252,871,725,704,1015,5,29,8,1,10,10,494,222,723,751,889,744,41,30,34,12,11,11,317,307,603,636,791,750,40,19,22,16,13,17,355,267,808,783,698,772,28,18,13,15,15,12,239,293,776,813,674,706,26,30,11,0,14,19,177,213,708,619,756,1003,29,29,9,10,2,14,357,209,795,540,926,779,34,9,12,11,1,11,501,429,853,787,1033,604,40,27,28,13,15,10,249,413,990,828,646,1227,25,28,6,7,13,8,330,178,676,663,593,663,27,16,18,10,14,16,7 +382,430,852,864,753,693,21,17,22,12,10,10,311,203,789,805,732,1062,22,28,9,7,12,8,413,221,744,628,833,773,15,22,1,3,14,17,327,137,966,889,746,972,25,14,9,0,2,18,314,188,936,835,772,792,30,18,1,1,1,11,462,264,765,747,861,772,31,22,14,5,8,19,296,234,926,696,781,1132,30,32,9,12,8,15,368,300,867,671,719,974,27,32,2,7,7,3,209,205,844,823,799,1056,3,29,1,0,2,4,575,235,814,803,884,785,39,18,37,13,11,19,394,352,664,692,790,787,40,27,19,17,9,13,494,338,899,907,711,813,30,18,18,16,11,18,292,330,845,911,683,745,28,20,16,1,12,5,292,246,693,717,791,1040,35,31,6,11,14,14,536,246,828,588,895,816,40,19,9,10,13,21,540,472,946,803,950,645,40,29,33,14,13,20,174,418,981,928,747,1268,27,30,1,8,1,10,417,203,761,789,712,704,27,20,21,9,10,2,7 +309,359,752,765,603,616,17,15,19,12,9,11,202,230,825,642,594,981,12,30,12,3,7,19,216,294,720,571,757,696,19,16,2,3,5,10,372,248,860,784,656,891,29,16,14,4,17,13,301,249,842,756,696,717,34,22,2,1,18,16,321,239,713,710,813,697,35,14,11,5,11,8,175,241,952,619,629,1051,18,28,12,6,11,18,309,253,883,598,637,893,15,24,7,7,12,20,240,222,888,750,657,975,7,21,8,0,17,13,520,256,712,760,798,704,37,24,26,13,18,8,287,279,618,651,704,718,34,19,16,17,12,14,377,283,797,800,599,732,26,16,15,16,8,9,303,275,761,838,589,674,20,24,13,1,7,22,115,161,765,628,653,969,23,23,3,5,5,15,327,163,768,587,831,745,28,13,6,10,6,8,543,405,834,812,980,568,34,21,30,8,20,7,271,383,1047,841,595,1189,23,20,4,2,20,11,326,198,659,678,562,623,25,24,14,9,15,19,7 +338,352,721,814,701,699,15,14,17,11,14,5,223,167,720,743,678,1068,14,27,14,2,12,15,329,309,681,594,749,779,21,17,4,2,0,10,381,203,841,823,742,978,31,13,14,5,12,13,364,238,811,783,760,798,36,19,4,2,13,8,430,326,642,701,791,778,37,13,9,4,6,12,282,268,855,642,663,1138,22,31,14,5,6,16,362,274,782,637,637,980,19,21,7,6,7,10,247,179,823,789,765,1062,9,26,6,1,12,5,605,345,671,733,804,791,41,23,34,12,13,12,382,400,531,650,698,793,38,18,14,16,7,12,468,316,756,863,595,819,24,15,13,15,13,11,248,238,726,877,641,751,22,25,11,0,12,12,230,266,668,651,705,1046,27,24,1,4,0,7,438,286,711,500,807,822,32,20,4,11,1,14,618,526,807,717,944,651,38,24,28,9,15,13,226,370,948,880,695,1274,21,27,6,3,15,3,363,231,628,751,680,710,23,19,18,10,14,9,7 +314,352,728,773,622,673,13,15,20,11,13,5,197,221,771,684,619,1042,10,32,11,2,11,19,289,323,686,559,772,753,23,12,1,2,1,12,407,231,854,790,699,952,33,12,11,5,13,11,392,268,830,756,739,772,38,18,1,2,14,12,406,312,681,694,824,752,37,10,12,4,7,12,280,264,900,607,648,1112,18,30,11,5,7,16,346,296,823,598,616,954,15,22,4,6,8,14,237,229,844,750,692,1036,11,25,3,1,13,7,599,299,670,754,821,765,37,26,31,12,14,12,388,378,560,633,715,767,34,21,17,16,8,16,448,288,755,812,588,793,22,16,16,15,12,11,274,276,723,838,586,725,20,28,14,0,11,16,232,272,723,618,680,1020,23,25,4,4,1,11,404,290,752,547,828,796,28,13,7,11,2,14,624,500,806,776,985,625,34,25,31,9,16,13,284,414,1001,843,618,1248,19,24,3,3,16,5,319,235,621,706,583,684,21,20,15,10,15,13,7 +268,310,631,932,676,621,6,16,21,10,13,4,127,153,658,823,641,968,1,17,10,1,11,18,173,403,725,726,710,699,30,25,0,7,1,11,345,293,719,923,721,896,30,27,10,14,13,10,270,306,703,861,807,722,31,27,0,11,14,11,266,324,520,739,762,686,30,23,13,9,9,9,144,344,751,754,626,1038,5,19,10,2,7,13,274,216,694,769,618,880,2,21,3,5,8,13,249,129,819,921,744,962,18,12,2,2,13,12,451,433,609,737,743,743,22,21,36,11,14,9,262,400,479,710,651,701,21,22,18,15,14,15,334,348,694,985,550,719,15,17,17,14,12,10,262,202,692,1009,616,659,13,17,15,1,11,15,132,274,646,757,656,952,10,12,5,3,1,10,292,286,587,566,694,728,13,24,8,10,2,7,468,528,717,709,905,601,21,18,32,10,16,8,292,212,928,998,656,1174,12,11,2,4,16,4,327,379,590,871,699,670,14,25,20,15,17,12,7 +316,302,739,876,613,709,14,12,28,10,10,6,217,241,804,779,628,1078,13,25,15,3,10,18,293,319,683,656,857,789,22,15,7,3,12,9,287,297,867,879,696,988,32,21,11,6,6,14,276,300,843,809,786,808,37,27,7,3,5,13,356,268,708,673,889,788,38,13,20,5,12,7,202,238,937,702,711,1148,21,33,11,4,10,15,320,188,860,699,703,990,18,19,4,7,7,15,237,221,855,851,673,1072,10,20,5,0,0,10,503,277,677,701,896,801,40,19,33,13,17,7,310,274,589,646,802,803,37,18,25,17,11,13,420,222,762,921,669,829,23,15,20,16,11,8,240,220,724,939,649,761,21,25,20,1,10,17,194,152,752,711,737,1056,26,26,12,3,12,12,406,164,773,558,911,832,31,18,15,10,11,9,502,400,815,701,1074,661,37,16,31,8,15,8,198,322,1030,940,597,1284,20,21,5,2,3,6,381,237,624,793,544,720,22,23,27,9,16,14,7 +287,303,840,756,622,673,20,19,27,13,12,8,184,276,839,691,633,1042,15,24,18,6,8,20,284,290,738,530,838,753,16,16,8,2,10,11,318,292,958,783,627,952,26,20,18,1,2,12,267,273,936,733,717,772,31,26,8,2,3,15,353,221,785,647,898,752,32,14,19,4,10,9,211,271,982,590,738,1112,23,26,18,11,10,17,325,257,913,569,762,954,20,10,11,6,9,17,218,244,866,721,650,1036,4,21,10,1,2,10,520,232,786,705,883,765,40,22,34,12,15,9,317,217,664,592,799,767,39,17,24,16,13,15,421,233,871,797,724,793,29,18,17,15,13,10,251,221,819,809,682,725,25,30,17,0,10,19,193,147,759,611,746,1020,28,23,11,10,10,14,389,133,856,528,936,796,33,13,14,11,9,11,517,341,916,737,1037,625,39,21,24,13,17,10,191,381,1041,824,596,1248,26,20,10,7,5,8,350,226,729,679,539,686,28,20,26,10,14,16,7 +355,395,797,898,702,700,18,10,24,13,10,4,238,164,784,801,689,1069,15,25,9,6,10,16,300,278,715,682,772,780,18,17,3,6,12,15,370,216,913,905,727,979,28,19,7,3,2,6,271,211,887,851,773,799,33,25,3,2,1,11,381,259,720,737,768,779,34,13,16,8,8,13,205,241,923,726,690,1139,23,33,7,7,10,11,369,211,850,725,632,981,20,21,0,10,7,13,244,164,855,877,748,1063,6,24,1,3,0,10,544,324,747,753,819,792,42,23,37,16,15,13,299,335,607,694,719,794,39,18,21,20,11,19,429,329,832,939,608,820,27,15,20,19,11,14,313,277,790,965,630,752,25,21,18,4,10,15,151,207,708,733,728,1047,28,26,8,6,12,10,407,221,789,548,790,823,33,20,11,9,11,11,537,479,877,727,909,652,39,18,35,11,15,12,211,299,992,966,690,1275,24,23,1,3,3,6,376,320,696,823,701,713,26,21,21,12,12,12,7 +309,359,752,765,603,616,17,15,19,12,9,11,202,230,825,642,594,981,12,30,12,3,7,19,216,294,720,571,757,696,19,16,2,3,5,10,372,248,860,784,656,891,29,16,14,4,17,13,301,249,842,756,696,717,34,22,2,1,18,16,321,239,713,710,813,697,35,14,11,5,11,8,175,241,952,619,629,1051,18,28,12,6,11,18,309,253,883,598,637,893,15,24,7,7,12,20,240,222,888,750,657,975,7,21,8,0,17,13,520,256,712,760,798,704,37,24,26,13,18,8,287,279,618,651,704,718,34,19,16,17,12,14,377,283,797,800,599,732,26,16,15,16,8,9,303,275,761,838,589,674,20,24,13,1,7,22,115,161,765,628,653,969,23,23,3,5,5,15,327,163,768,587,831,745,28,13,6,10,6,8,543,405,834,812,980,568,34,21,30,8,20,7,271,383,1047,841,595,1189,23,20,4,2,20,11,326,198,659,678,562,623,25,24,14,9,15,19,7 +328,254,626,850,600,653,6,16,17,10,9,5,255,193,727,733,573,1022,3,25,14,3,7,19,303,421,682,656,760,733,30,23,4,9,5,10,445,319,746,841,705,932,30,23,14,16,17,13,384,354,724,787,739,754,35,23,4,13,18,12,428,344,601,673,810,732,30,21,9,11,11,10,264,324,842,680,560,1092,11,19,14,0,11,18,352,208,767,699,574,934,8,23,7,7,12,14,243,173,840,851,692,1016,18,16,8,0,17,7,613,375,574,691,775,745,30,27,26,13,18,10,336,366,500,634,675,753,27,24,14,17,12,14,418,278,659,905,534,773,15,17,13,16,8,9,332,156,653,939,572,709,13,17,11,1,7,16,182,232,717,681,590,1004,16,18,1,1,5,11,416,256,656,586,760,780,21,24,4,8,6,12,658,496,706,741,969,605,27,18,28,8,20,11,284,300,985,920,590,1228,12,15,6,2,20,5,331,279,535,785,607,664,14,25,16,15,15,13,7 +317,437,798,894,722,658,20,13,25,14,10,7,204,176,775,771,707,1025,15,28,6,3,10,15,288,160,712,672,774,738,16,16,4,3,12,6,352,132,914,919,723,935,26,12,6,2,2,15,247,159,886,875,757,757,31,18,4,1,1,8,365,237,717,773,776,739,32,12,17,5,8,8,199,187,912,730,712,1095,23,32,6,8,10,14,335,291,847,715,666,937,20,20,1,7,7,10,196,240,846,867,760,1019,4,27,2,0,0,9,524,230,754,769,837,748,40,26,34,13,15,8,281,343,606,724,735,758,39,25,22,17,11,10,425,337,839,921,638,776,29,14,21,16,11,7,305,357,793,955,642,716,25,26,19,1,10,12,169,259,699,747,746,1007,28,29,9,7,12,7,389,279,786,570,818,783,33,19,12,10,11,10,521,459,880,785,927,610,39,25,36,10,15,9,195,409,987,964,704,1231,26,26,2,4,3,3,352,252,705,797,683,667,28,18,18,9,12,9,7 +339,277,607,963,708,682,3,20,18,12,14,5,234,280,674,846,635,1047,8,13,13,5,12,19,314,524,663,771,766,762,39,27,3,9,0,12,390,438,729,944,635,957,27,29,13,16,12,9,311,447,701,878,745,783,40,29,3,13,13,12,413,425,552,730,734,763,39,25,10,11,6,10,233,355,783,789,630,1117,14,15,13,2,6,12,395,175,712,814,674,959,11,17,6,9,7,14,270,220,825,966,748,1041,21,10,5,2,12,9,598,452,557,726,637,770,31,23,33,15,13,10,337,435,447,723,581,784,30,18,15,19,11,16,439,331,642,1022,606,798,12,19,14,18,13,11,281,215,648,1054,662,740,10,21,12,3,12,16,165,311,656,784,636,1035,19,8,2,1,0,11,411,335,617,573,654,811,22,24,5,8,1,10,591,515,693,650,831,634,30,22,29,10,15,9,215,147,930,1031,686,1255,3,9,5,0,15,5,388,394,538,906,761,689,19,21,17,13,16,13,7 +346,282,651,940,692,677,12,23,21,12,13,4,229,161,730,837,649,1046,7,10,10,5,11,18,323,405,693,742,728,757,24,26,0,5,1,11,401,295,759,923,731,956,34,26,10,12,13,10,326,306,741,859,775,776,37,26,0,9,14,11,420,318,598,731,750,756,32,24,13,7,7,9,242,310,833,764,644,1116,13,12,10,2,7,15,378,214,772,785,650,958,10,12,3,9,8,13,255,111,865,937,736,1040,12,11,2,2,13,8,615,399,609,731,721,769,32,22,34,15,14,9,344,364,503,708,635,773,29,17,18,19,12,15,448,306,694,1003,586,797,21,22,17,18,12,10,296,198,692,1025,620,731,15,18,15,3,11,15,168,250,698,763,664,1024,18,5,5,1,1,10,422,268,657,570,698,800,23,23,8,8,2,11,608,510,731,689,893,629,29,25,32,10,16,10,224,250,974,1008,672,1252,18,10,2,0,16,4,375,355,580,889,715,688,20,18,18,13,17,12,7 +268,352,718,828,625,667,13,12,22,11,12,7,187,223,793,719,624,1036,10,31,9,2,10,19,235,269,690,616,753,747,23,15,1,2,2,10,369,239,838,839,708,946,33,15,9,5,14,13,302,244,818,801,750,766,38,19,1,2,15,14,346,296,693,703,795,746,37,13,14,4,8,8,192,196,922,662,629,1106,18,29,9,5,8,18,308,220,845,659,593,948,15,27,2,6,9,16,213,227,872,811,689,1030,11,24,3,1,14,9,543,259,662,751,800,759,37,27,31,12,15,8,290,336,574,656,698,761,34,22,19,16,11,14,370,256,747,867,571,787,22,15,18,15,11,9,276,276,719,899,581,719,20,25,16,0,10,18,124,198,747,669,675,1014,23,24,6,4,2,13,346,224,748,544,805,790,28,16,9,11,3,10,568,460,792,761,972,619,34,24,33,9,17,9,230,352,1025,902,615,1242,19,23,1,3,17,7,309,191,613,751,588,678,21,23,15,10,16,15,7 +268,324,686,765,610,668,14,8,16,9,10,8,175,187,755,676,593,1037,9,35,15,2,8,18,177,353,684,553,754,748,22,15,5,2,4,13,349,277,792,772,721,947,32,21,15,7,16,8,280,280,772,736,745,767,37,27,5,4,17,15,248,286,621,666,790,747,34,13,8,4,10,11,134,274,856,601,580,1107,15,33,15,3,10,13,282,186,795,594,572,949,12,25,8,6,11,17,275,195,852,746,690,1031,10,22,7,1,16,12,437,373,646,704,763,764,34,25,31,12,17,11,236,332,530,613,673,762,31,18,13,16,11,17,292,276,731,812,528,788,23,15,12,15,9,12,270,220,709,834,578,720,17,19,10,0,8,19,138,182,713,606,626,1015,20,28,0,2,4,14,268,200,680,515,772,791,25,12,3,9,5,9,482,478,768,730,955,622,31,16,27,9,19,10,292,282,991,833,608,1243,20,21,7,3,19,8,323,287,603,708,623,685,22,23,17,10,16,16,7 +394,336,653,915,678,690,11,15,19,11,11,10,273,231,718,808,653,1057,8,16,12,4,9,20,277,387,659,713,702,770,25,28,2,4,11,11,357,321,775,904,739,967,35,28,12,11,5,12,324,332,747,830,771,789,40,28,2,8,4,17,356,300,616,702,738,771,35,24,11,6,11,9,204,288,843,739,642,1127,16,24,12,1,11,17,374,164,766,756,624,969,13,24,5,8,8,19,293,211,823,908,734,1051,13,13,4,1,1,12,537,383,609,694,767,780,35,20,36,14,18,9,310,334,495,687,667,788,32,23,16,18,12,15,422,276,694,972,540,808,20,14,15,17,12,10,292,224,680,996,616,746,18,12,13,2,9,21,172,216,684,740,676,1039,21,17,3,0,11,14,386,232,677,539,728,815,26,29,6,7,10,7,526,458,741,628,909,642,32,13,30,9,16,8,250,222,958,983,664,1263,17,14,4,1,4,10,417,327,566,860,657,701,19,30,20,14,15,18,7 +358,332,784,827,690,658,30,15,18,13,12,7,245,209,723,722,645,1027,25,24,13,6,10,19,235,343,742,623,780,738,6,18,3,6,2,12,391,297,884,838,661,937,16,20,15,5,14,9,302,254,866,804,681,759,21,24,3,2,15,14,336,268,701,696,782,737,22,16,10,8,8,10,184,310,860,663,638,1097,25,22,13,5,8,12,332,236,799,670,716,939,22,22,8,10,11,16,279,125,842,818,730,1021,12,17,9,3,14,13,529,385,756,722,729,750,30,24,25,16,15,10,272,346,608,657,665,756,31,19,15,20,9,16,372,344,841,872,644,778,33,16,14,19,11,11,340,236,799,906,676,712,27,22,12,4,10,18,102,274,643,676,646,1009,30,17,2,4,2,13,348,290,762,549,790,785,35,19,5,9,3,8,548,460,872,760,851,610,31,21,29,11,17,9,270,234,929,901,680,1233,36,18,5,1,17,7,379,377,715,758,729,669,18,24,15,12,16,15,7 +235,259,817,647,654,684,20,22,18,10,14,8,178,384,782,606,643,1053,19,31,23,11,12,20,226,230,709,511,812,764,16,15,13,3,0,11,362,274,947,696,619,963,26,17,23,0,12,12,333,307,913,708,687,783,31,23,13,1,13,15,337,293,750,688,864,763,32,13,18,5,6,9,215,299,925,495,750,1123,27,23,23,16,6,17,315,347,862,448,764,965,24,13,16,7,7,17,246,360,813,598,668,1047,4,22,15,2,12,10,528,158,763,772,851,776,40,23,35,15,13,9,313,207,633,617,773,778,41,16,21,17,7,15,367,179,848,682,730,804,29,19,8,16,13,10,247,279,798,686,684,736,27,31,6,5,12,19,169,223,680,546,750,1031,32,24,10,15,0,14,341,199,819,553,916,807,37,12,13,10,1,11,575,299,899,824,977,636,41,24,19,10,15,10,241,471,956,711,630,1259,26,21,15,12,15,8,306,256,706,566,579,695,28,17,15,9,14,16,7 +345,325,691,882,632,610,13,14,22,10,10,6,190,186,768,743,597,965,8,25,9,3,8,18,244,350,707,690,706,690,23,21,1,5,4,9,424,276,793,877,693,875,33,25,13,12,16,12,271,291,779,817,707,711,36,27,1,9,17,13,335,279,634,711,752,691,31,21,14,7,10,7,167,243,871,722,580,1035,12,25,9,0,10,17,341,157,814,733,608,883,9,27,6,7,11,15,242,154,871,885,694,963,11,16,7,0,16,10,534,338,653,715,727,700,31,21,27,13,17,7,261,311,545,684,633,714,28,26,19,17,11,13,399,261,738,929,548,724,22,15,18,16,9,8,321,229,718,973,596,670,14,13,16,1,8,17,95,181,738,719,610,963,17,18,6,1,4,12,355,203,691,584,742,739,22,24,9,8,5,9,531,451,769,727,927,572,28,12,33,8,19,8,263,255,1014,960,622,1181,19,15,3,2,19,6,362,298,612,803,617,617,21,31,11,15,16,14,7 +270,286,693,760,604,679,13,10,14,11,10,8,221,247,780,691,597,1048,8,31,17,4,8,20,267,391,699,552,780,759,23,19,7,4,6,11,377,341,807,753,705,958,33,25,17,9,18,12,304,358,787,715,735,778,38,25,7,6,19,15,372,292,660,631,830,758,35,19,6,6,12,9,200,298,899,590,608,1118,16,29,17,1,12,17,358,210,830,593,602,960,13,29,10,8,13,17,249,217,871,745,684,1042,11,18,9,1,18,10,563,331,643,679,807,771,35,21,31,14,19,9,318,280,559,576,713,773,32,22,11,18,13,15,370,226,728,823,566,799,22,17,10,17,9,10,262,192,706,833,590,731,18,13,8,2,8,19,134,160,742,591,652,1026,21,24,2,0,6,14,374,184,715,512,830,802,26,16,1,7,7,11,588,414,769,713,1005,631,32,12,25,9,21,10,214,338,1018,824,600,1254,19,17,9,1,21,8,339,235,596,725,579,690,21,27,19,12,14,16,7 +288,296,571,953,672,638,1,11,24,9,11,5,241,169,682,856,661,1007,4,16,7,2,9,19,365,447,689,759,818,718,35,30,3,10,11,10,321,315,679,938,805,917,25,22,7,17,9,13,258,364,661,870,877,737,36,22,3,14,8,12,378,396,532,730,846,717,35,26,16,12,15,12,272,312,775,779,632,1077,10,24,7,1,11,18,330,182,712,802,546,919,7,26,0,6,8,14,229,151,853,954,792,1001,19,15,1,1,1,7,513,439,529,722,851,730,27,20,35,12,18,12,396,454,465,715,743,732,26,27,21,16,14,14,426,346,614,1016,528,758,10,16,20,15,12,11,254,238,632,1042,630,690,8,14,18,0,9,16,292,274,680,776,692,985,15,17,8,2,11,11,466,314,587,595,766,761,18,31,11,9,12,14,516,582,651,654,991,590,26,15,35,9,16,13,256,244,954,1023,670,1213,7,16,1,3,4,5,357,313,516,906,719,649,15,30,19,16,17,13,7 +353,337,618,847,652,670,9,21,16,12,9,13,288,236,679,750,603,1039,4,22,15,5,7,19,228,430,656,643,756,750,27,26,5,5,5,12,342,336,732,836,653,949,33,32,15,12,17,11,337,363,714,782,683,769,36,32,5,9,18,18,297,341,585,646,752,749,31,24,8,7,11,10,175,325,810,667,614,1109,12,18,15,2,11,16,377,193,733,686,674,951,9,18,8,9,12,22,324,196,828,838,682,1033,15,9,7,2,17,15,482,390,568,652,739,762,31,24,29,15,18,10,263,345,466,619,645,764,28,17,13,19,12,16,301,281,653,904,604,790,18,20,12,18,8,11,311,225,647,926,608,722,14,18,10,3,7,24,153,217,649,668,616,1017,17,15,0,1,5,15,317,225,642,523,750,793,22,23,3,8,6,8,525,427,694,706,923,622,28,19,27,10,20,9,285,209,921,911,628,1245,15,10,7,0,20,13,396,354,539,794,641,681,17,24,17,13,15,21,7 +243,239,652,844,658,685,2,18,16,12,6,5,232,250,679,757,605,1054,3,21,15,5,6,19,270,454,684,652,766,765,34,29,5,5,8,10,350,400,774,833,691,964,26,33,15,12,10,11,297,399,746,785,715,786,35,33,5,9,11,12,325,345,585,667,776,764,34,27,8,7,8,8,181,333,800,664,594,1124,9,19,15,2,8,14,301,223,727,683,628,966,6,21,8,9,5,14,224,164,824,835,710,1048,20,6,7,2,12,9,512,400,602,697,757,777,28,19,31,15,9,8,253,367,468,626,663,783,25,18,13,19,3,14,335,271,687,901,596,805,11,17,12,18,5,9,291,167,685,923,604,739,9,17,10,3,4,16,157,283,645,665,610,1036,14,18,0,1,8,11,365,291,654,538,750,812,19,26,3,8,9,10,575,463,738,747,927,637,25,18,27,10,11,9,189,201,921,908,640,1260,8,7,7,0,11,5,280,368,573,789,693,696,14,25,17,13,12,13,7 +215,273,600,755,560,674,3,21,18,7,8,5,260,274,665,638,585,979,8,26,13,18,4,9,304,400,658,735,940,740,39,24,21,8,12,12,470,370,722,756,745,871,27,24,29,11,14,9,379,383,694,756,847,759,40,18,21,12,15,2,371,391,551,774,986,773,39,22,10,8,12,10,313,353,780,629,668,1045,14,20,27,15,14,12,379,299,707,648,684,915,11,26,26,16,9,8,400,248,812,756,680,995,21,21,27,15,14,9,484,380,556,818,925,724,31,18,7,10,15,10,291,453,436,723,849,796,30,21,15,6,9,14,271,309,641,800,642,770,12,18,14,7,9,11,357,223,637,844,692,752,10,20,18,16,6,6,265,347,647,642,708,1025,19,21,20,14,12,3,363,361,610,689,932,807,22,21,15,7,13,10,553,573,690,956,1147,630,30,23,29,7,17,9,409,323,919,829,554,1207,3,20,23,13,17,5,314,300,531,666,589,599,19,20,15,10,12,9,7 +340,270,534,961,657,689,3,20,16,12,10,8,259,343,633,850,584,1058,8,15,15,5,8,18,319,513,666,765,765,769,39,27,5,15,4,9,409,497,650,908,576,968,27,29,15,16,16,14,362,506,628,824,686,788,40,29,5,15,17,15,436,444,493,668,703,768,39,25,8,17,10,9,254,364,734,777,579,1128,14,15,15,2,10,19,424,182,663,808,611,970,11,17,8,9,11,17,309,281,818,962,713,1052,21,10,7,4,16,10,629,415,486,680,640,785,31,23,35,15,17,9,356,378,416,677,560,783,30,18,13,19,11,13,440,298,571,1030,589,809,12,19,12,18,9,8,272,214,597,1048,595,741,10,21,10,3,8,19,166,248,635,766,583,1036,19,8,0,1,4,14,428,274,550,583,609,812,22,24,3,8,5,11,640,460,616,616,806,643,30,22,27,10,19,10,242,216,905,1013,637,1264,3,9,7,0,19,8,407,327,485,920,738,706,19,21,19,13,16,16,7 +286,378,796,759,649,660,20,19,20,13,13,4,173,187,781,668,642,1029,15,34,11,2,11,16,261,259,726,545,789,740,16,8,1,2,1,15,411,179,910,786,700,939,26,10,11,3,13,10,322,210,888,772,744,759,31,16,1,2,14,11,372,280,723,686,841,739,32,6,12,4,7,13,214,240,922,601,673,1099,23,26,11,7,7,11,332,296,851,584,661,941,20,16,4,6,8,13,235,201,858,736,717,1023,4,29,5,1,13,10,569,271,746,756,828,752,40,30,29,12,14,13,326,368,608,631,736,756,39,17,17,16,8,19,398,306,831,792,629,780,29,20,16,15,12,14,266,272,791,824,627,712,25,32,14,0,11,15,154,284,713,618,701,1009,28,27,4,6,1,10,376,290,792,529,859,785,33,9,7,11,2,13,592,490,874,784,970,612,39,27,31,9,16,12,262,412,997,831,643,1235,26,28,3,3,16,6,331,247,695,678,644,673,28,16,13,10,15,12,7 +288,292,689,899,608,722,12,20,18,12,11,4,235,297,626,822,539,1019,17,23,13,5,11,18,233,477,689,711,782,790,28,27,3,7,3,11,317,427,795,880,609,991,12,31,13,14,9,10,268,372,761,822,703,809,25,31,3,11,10,11,268,378,588,674,750,759,24,25,10,9,9,9,122,318,753,717,534,1059,23,17,13,2,7,13,284,182,686,742,598,933,20,19,6,9,10,13,243,227,805,894,672,1031,22,8,5,2,15,12,447,395,653,692,687,838,16,21,31,15,10,9,210,364,499,659,599,720,15,16,15,19,6,15,304,320,738,968,550,740,17,19,14,18,10,10,284,220,728,982,586,702,19,19,12,3,9,15,138,256,596,716,538,967,26,16,2,1,3,10,340,280,641,553,662,803,23,24,5,8,4,7,502,428,775,734,885,692,15,20,29,10,12,8,216,168,874,961,590,1207,18,9,5,0,14,4,327,381,632,868,691,763,4,23,15,13,13,12,7 +271,299,575,917,681,684,3,16,19,10,13,6,180,240,672,820,638,1053,8,17,12,3,11,20,278,546,659,719,695,764,39,27,2,7,1,11,328,390,709,904,718,963,27,31,12,14,13,10,295,455,681,842,776,785,40,31,2,11,14,13,371,439,552,726,759,763,39,25,11,9,7,9,235,399,783,741,611,1123,14,21,12,0,7,15,335,227,710,762,609,965,11,23,5,7,8,15,256,202,829,914,751,1047,21,10,4,0,13,8,540,490,519,726,722,776,31,23,34,13,14,9,363,447,445,697,630,782,30,22,16,17,12,15,415,369,604,980,557,804,12,15,15,16,12,10,235,237,614,1002,629,738,10,15,13,1,11,17,207,285,658,740,641,1035,19,14,3,1,1,12,399,309,615,563,685,811,22,24,6,8,2,11,543,541,657,678,898,636,30,16,30,8,16,10,233,179,928,985,667,1259,3,9,4,2,16,6,370,372,500,868,700,695,19,27,18,15,17,14,7 +299,313,625,839,642,665,4,10,17,10,9,10,206,160,708,750,609,1034,1,23,14,1,7,18,292,440,685,633,740,745,32,21,4,5,5,13,360,282,749,836,725,944,28,19,14,12,17,10,353,329,727,784,749,764,33,21,4,9,18,17,397,377,600,694,792,744,32,17,9,7,11,11,269,337,827,671,582,1104,9,25,14,2,11,15,371,225,750,676,608,946,6,25,7,5,12,19,292,182,845,828,724,1028,20,18,6,2,17,12,576,462,567,704,757,757,28,19,30,11,18,11,385,431,479,649,663,759,25,22,14,15,12,17,433,375,652,894,550,785,13,19,13,14,8,12,275,221,656,916,618,717,11,19,11,1,7,21,235,231,694,670,620,1012,14,18,1,3,5,16,405,271,659,545,756,788,19,24,4,10,6,9,585,575,701,710,963,617,25,18,28,10,20,10,271,287,962,907,630,1240,10,19,6,4,20,10,384,288,536,790,643,676,12,27,16,15,15,18,7 +365,315,599,1069,800,668,1,18,23,12,11,7,272,238,684,934,723,1037,6,9,12,5,9,15,318,484,687,875,764,748,37,29,2,9,11,6,328,382,713,1042,697,947,25,31,8,16,7,17,283,423,693,976,779,767,38,31,2,13,6,14,389,405,562,822,666,747,37,29,15,11,13,8,213,297,801,891,724,1107,12,17,8,2,11,14,353,159,726,918,700,949,9,19,1,9,8,16,228,188,849,1070,822,1031,19,6,0,2,1,9,552,428,551,776,681,760,29,17,38,15,18,8,311,419,455,815,643,762,28,20,20,19,12,10,453,345,636,1124,652,788,10,17,19,18,12,7,301,261,642,1158,702,720,8,13,17,3,9,18,193,285,670,884,724,1015,17,10,7,1,11,13,429,303,617,641,578,791,20,26,10,8,10,10,539,481,677,694,727,620,28,20,34,10,16,9,171,127,938,1131,774,1243,5,7,0,0,4,7,364,414,534,1012,809,681,17,23,24,13,17,15,7 +303,283,591,946,700,700,1,19,20,11,17,5,204,240,682,859,661,1069,6,14,11,4,15,19,294,520,685,748,728,780,37,28,1,10,3,12,332,400,713,925,723,979,25,32,11,17,9,9,289,439,689,859,807,799,38,32,1,14,10,12,387,417,554,717,764,779,37,26,12,12,9,10,229,399,793,766,646,1139,12,18,11,1,3,14,353,209,720,791,642,981,9,20,4,8,10,14,258,194,835,943,766,1063,19,9,3,1,9,9,554,480,535,721,743,800,29,24,37,14,10,10,353,429,455,698,661,794,28,19,17,18,14,16,429,365,620,1017,568,820,10,18,16,17,16,11,239,213,634,1031,646,752,8,18,14,2,15,16,187,295,674,761,672,1047,17,11,4,0,3,11,405,319,611,564,684,823,20,25,7,7,2,10,549,533,669,651,899,658,28,19,31,9,16,9,207,169,942,1008,680,1275,5,8,3,1,12,5,386,370,514,909,717,721,17,24,21,14,13,13,7 +278,280,621,869,627,625,5,15,17,11,11,3,197,185,628,778,600,938,0,22,14,4,9,13,279,381,707,681,787,699,31,22,4,14,3,10,387,287,711,834,706,902,29,22,14,17,15,11,310,310,691,760,814,718,32,18,4,16,16,6,356,330,508,652,819,670,31,20,9,16,9,12,224,292,737,695,563,1006,6,20,14,1,9,14,330,224,672,724,571,850,3,20,7,8,10,8,243,169,819,876,743,944,19,19,6,3,15,5,541,365,597,718,776,751,23,20,30,14,16,12,380,394,445,615,678,661,22,23,14,18,10,14,410,308,682,940,533,687,14,24,13,17,10,11,252,188,690,964,603,629,12,20,11,2,9,10,196,254,604,686,607,914,11,15,1,0,3,7,364,276,577,595,727,708,14,21,4,7,4,14,570,516,707,692,956,603,22,19,28,9,18,13,302,304,888,933,621,1142,11,18,6,1,18,3,311,263,588,838,698,678,13,26,16,14,17,7,7 +367,315,683,960,811,709,9,20,21,12,10,8,278,218,686,845,758,1078,6,7,12,5,10,6,376,466,693,748,769,789,27,33,0,5,12,15,316,350,793,951,840,988,29,31,10,10,2,16,271,311,765,903,864,808,34,29,0,7,1,9,441,397,592,769,753,788,33,33,13,7,8,17,273,395,807,776,741,1148,14,15,10,2,10,13,343,221,738,791,699,990,11,19,3,9,7,1,188,192,825,945,863,1072,15,8,2,2,0,6,544,502,645,769,808,801,33,13,40,15,15,17,363,463,493,740,724,803,30,18,18,19,11,11,477,399,730,1011,651,829,18,19,17,18,11,16,273,229,716,1031,731,761,16,11,15,3,10,3,263,357,642,781,763,1056,19,10,5,1,12,12,499,371,661,548,667,832,24,28,8,8,11,19,547,567,773,699,838,661,30,22,32,10,15,18,143,147,922,1020,793,1284,15,9,2,0,3,8,386,452,616,901,846,720,17,21,24,13,12,0,7 +335,347,674,977,785,678,11,15,24,9,9,9,244,126,721,834,738,1047,6,12,15,2,11,7,352,374,700,767,729,758,25,32,3,4,13,16,324,254,784,976,820,957,35,26,7,11,3,17,273,247,764,932,832,777,36,26,3,8,2,10,409,345,629,794,711,757,31,32,16,6,9,18,251,319,846,801,725,1117,12,20,7,1,9,14,311,233,769,810,673,959,9,24,0,6,6,2,154,118,850,962,837,1041,13,11,1,1,1,5,534,446,626,772,808,770,31,18,37,12,16,18,335,435,510,769,714,772,28,23,21,16,10,12,461,385,711,1004,635,798,20,18,20,15,10,17,287,247,705,1050,693,730,14,10,18,0,11,4,257,301,697,806,745,1025,17,13,8,2,13,13,473,325,686,587,645,801,22,31,11,9,12,20,539,553,750,734,846,630,28,19,35,9,14,19,163,245,969,1043,769,1253,17,12,1,3,2,9,340,394,593,892,778,691,19,26,27,14,13,1,7 +269,333,774,749,611,671,17,17,17,15,10,5,190,226,787,650,602,1036,14,36,14,4,8,19,244,264,708,533,763,751,19,12,4,0,4,12,414,216,890,778,674,946,29,12,14,3,16,9,357,235,868,768,712,772,34,18,4,4,17,12,371,287,715,702,815,750,35,10,9,2,10,10,241,233,926,597,615,1106,22,28,14,9,10,14,313,279,853,566,623,948,19,20,7,4,11,14,240,232,850,718,681,1030,7,25,6,3,16,7,556,260,724,766,788,759,41,26,28,10,17,10,317,359,596,643,702,769,38,21,14,14,11,16,383,265,809,776,585,787,26,18,13,13,9,11,289,265,767,806,599,725,24,30,11,2,8,16,159,259,725,618,653,1022,27,29,1,8,4,11,355,269,786,547,827,798,32,9,4,13,5,12,597,479,854,808,960,623,38,25,28,11,19,11,265,391,1007,821,607,1244,23,24,6,5,19,5,294,214,671,656,614,678,25,20,16,12,16,13,7 +251,363,782,748,756,726,34,22,20,12,16,6,252,220,705,651,789,1081,33,17,21,5,14,8,342,328,714,566,1054,806,18,29,11,5,2,15,292,280,880,755,815,977,12,15,21,6,10,6,239,225,852,723,909,827,17,9,11,3,11,3,373,257,673,637,1110,805,18,25,16,7,4,13,239,325,836,572,888,1149,41,17,21,4,4,9,403,357,781,575,914,1001,38,23,14,9,9,9,314,220,806,727,818,1081,16,32,13,2,10,10,552,366,756,693,1071,810,26,15,37,15,11,13,397,387,602,574,1001,824,27,28,21,19,7,13,349,369,841,795,870,840,29,31,8,18,15,14,193,291,795,815,874,780,33,23,8,3,14,7,215,387,633,583,914,1077,38,16,8,3,2,4,443,385,732,512,1128,853,35,32,11,10,1,11,521,509,876,761,1199,678,27,32,21,10,13,12,243,377,923,812,736,1299,40,31,13,0,13,6,418,348,713,685,707,699,18,19,17,11,12,10,7 +224,206,636,823,526,645,6,19,11,14,1,1,213,289,625,734,483,978,1,22,20,7,3,13,255,405,688,703,832,719,30,28,10,7,15,12,469,427,712,800,647,918,30,30,20,10,15,9,334,430,692,732,747,744,31,30,10,11,14,6,290,304,505,648,856,708,30,26,3,5,15,10,200,332,722,647,536,1038,5,24,20,10,15,12,286,192,665,674,608,890,2,20,13,3,8,8,295,239,786,826,616,978,22,7,12,10,9,9,385,353,618,728,787,757,22,10,26,13,8,10,154,290,468,615,701,705,21,19,8,7,10,16,264,198,703,890,554,719,15,12,7,6,2,11,372,118,695,914,548,673,13,20,9,9,3,10,178,274,597,640,562,954,10,23,5,11,15,5,330,278,566,563,764,746,13,25,2,8,16,10,514,406,722,824,991,617,21,21,22,14,10,9,326,268,885,887,504,1178,12,8,12,12,10,3,255,331,605,770,599,686,16,22,22,7,17,9,7 +230,300,717,720,596,670,13,13,16,11,10,3,167,237,786,647,593,1039,8,40,15,0,8,17,245,327,695,524,822,750,23,10,5,0,4,10,437,295,823,741,745,949,33,14,15,7,16,11,382,310,803,725,785,769,38,20,5,4,17,10,354,330,656,667,866,749,33,8,8,2,10,12,270,300,887,558,620,1109,14,32,15,3,10,16,312,298,824,545,610,951,11,20,8,4,11,12,293,245,865,697,688,1033,11,27,7,3,16,5,531,305,679,747,817,762,33,28,31,10,17,12,348,378,563,600,729,766,30,21,13,14,11,14,360,234,764,763,574,790,22,14,12,13,9,11,284,228,734,785,590,722,16,26,10,2,8,14,226,300,762,571,656,1019,19,31,0,4,4,9,334,316,715,528,832,795,24,7,3,11,5,14,588,496,801,781,1023,622,30,23,27,11,19,13,334,410,1040,788,596,1245,19,26,7,5,19,3,297,269,632,655,597,683,21,18,17,12,16,11,7 +295,271,619,937,660,626,3,10,22,12,9,8,244,216,716,834,657,995,2,17,9,5,11,20,346,470,701,749,846,706,33,27,1,9,13,11,298,376,733,922,823,905,27,27,9,16,9,10,223,407,715,856,855,725,34,27,1,13,8,15,357,395,574,704,890,705,33,23,14,11,15,9,227,299,811,767,654,1065,8,25,9,2,9,15,365,121,750,792,588,907,5,23,2,9,6,17,240,184,867,944,772,989,21,10,3,2,1,10,500,414,565,702,881,726,25,23,31,15,16,9,371,393,489,695,773,720,24,28,19,19,14,15,417,297,650,1000,572,746,12,15,18,18,10,10,263,213,664,1032,634,678,10,15,16,3,11,19,239,251,702,762,708,973,13,18,6,1,13,14,451,283,631,607,838,749,16,30,9,8,12,9,495,513,691,646,1051,584,24,12,33,10,14,8,221,181,972,1009,658,1201,9,11,1,0,2,8,392,326,544,886,655,647,13,31,15,13,15,16,7 +334,308,586,905,665,689,1,20,17,9,10,6,225,225,677,798,608,1054,6,13,14,2,8,18,319,537,658,701,711,769,37,27,4,6,4,13,395,361,720,902,662,964,25,31,14,13,16,10,370,426,692,842,726,790,38,31,4,10,17,13,426,424,559,722,727,768,37,25,9,8,10,11,286,420,790,729,593,1124,12,17,14,1,10,15,392,252,715,744,633,966,9,19,7,6,11,15,265,195,828,896,713,1048,19,10,6,1,16,8,615,491,524,712,666,777,29,23,32,12,17,11,382,458,450,693,588,787,28,18,14,16,11,17,458,378,609,954,555,805,10,19,13,15,9,12,292,228,623,984,615,743,8,19,11,0,8,17,232,294,663,734,609,1040,17,10,1,2,4,12,432,330,624,551,663,816,20,24,4,9,5,13,622,556,668,688,864,641,28,20,28,9,19,12,258,230,933,973,645,1262,5,9,6,3,19,6,371,371,503,840,678,696,17,23,16,16,16,14,7 +342,316,630,939,638,639,6,15,26,14,10,8,271,179,741,822,635,1008,1,12,5,7,12,18,375,387,680,751,832,719,30,30,5,9,14,13,367,311,746,908,795,918,30,22,9,14,10,10,266,344,726,828,833,738,33,22,5,13,9,15,410,322,593,682,874,718,30,26,18,11,16,11,256,264,832,767,656,1078,9,20,5,4,8,15,376,146,771,794,588,920,6,22,2,11,7,17,249,163,858,946,734,1002,18,15,3,4,2,10,559,367,576,700,865,733,28,20,31,17,15,11,390,364,518,679,759,733,25,25,23,21,15,17,454,286,661,996,568,759,15,18,22,20,11,12,294,224,659,1034,604,691,13,16,20,5,12,19,248,196,723,760,700,986,14,13,10,3,14,14,490,236,648,605,832,762,19,31,13,10,13,11,536,498,704,630,1029,591,25,17,37,12,13,10,224,256,995,1007,632,1214,12,14,3,2,1,8,425,267,541,880,623,654,14,26,15,13,14,16,7 +335,285,586,892,666,649,4,13,24,10,11,4,196,142,673,797,637,1014,1,14,7,3,9,16,306,418,648,694,704,729,32,28,3,7,11,13,370,290,698,879,769,928,28,26,7,14,7,12,291,315,674,813,791,748,33,26,3,11,6,9,389,355,533,675,726,724,32,24,16,9,13,13,227,311,768,718,612,1084,9,22,7,0,11,13,327,183,703,737,546,926,6,26,0,7,8,11,204,114,820,889,748,1008,20,13,1,0,1,8,560,440,542,681,767,753,28,20,35,13,18,13,349,417,452,652,665,739,25,25,21,17,12,17,453,333,627,951,520,765,13,16,20,16,12,12,283,219,627,977,596,697,11,16,18,1,9,13,207,263,669,717,656,992,14,15,8,1,11,8,427,295,592,532,692,768,19,31,11,8,10,15,565,549,670,621,899,611,25,15,35,8,16,14,229,213,941,962,654,1220,10,12,1,2,4,4,328,366,511,843,661,674,12,28,19,15,17,10,7 +306,360,707,913,697,652,14,9,24,10,13,5,187,105,764,826,674,1021,9,18,9,3,9,13,311,341,729,697,763,732,22,26,3,3,9,14,339,205,799,908,804,931,32,18,7,10,3,13,290,222,785,850,826,751,37,22,3,7,4,6,362,368,626,722,753,731,32,22,16,5,11,14,220,290,857,731,653,1091,13,26,7,0,9,12,280,216,802,740,569,933,10,26,0,7,10,8,177,141,895,892,781,1015,10,19,1,0,3,9,539,423,671,752,818,748,32,18,37,13,16,14,334,434,549,687,712,746,29,25,21,17,14,18,450,366,756,956,547,772,23,18,20,16,14,13,266,252,744,980,629,704,15,20,18,1,11,10,226,268,738,738,701,999,18,19,8,1,9,9,418,286,685,549,735,775,23,29,11,8,8,16,546,580,779,712,928,606,29,19,35,8,18,15,210,282,1016,973,689,1227,20,18,1,2,6,5,287,343,634,842,718,669,22,28,21,13,15,7,7 +366,404,677,979,708,671,11,18,24,12,9,4,237,183,746,890,661,1040,10,13,9,5,11,14,331,391,675,779,634,751,25,29,3,5,13,17,389,279,797,966,733,950,35,29,7,10,9,12,272,328,773,892,745,770,40,29,3,7,8,9,420,350,644,752,668,750,37,29,16,7,15,15,248,274,871,805,648,1110,18,21,7,2,9,9,352,186,796,822,606,952,15,21,0,9,6,11,201,181,847,974,746,1034,13,12,1,2,1,10,569,445,625,762,717,763,37,21,37,15,16,15,340,422,525,735,621,765,34,20,21,19,14,21,478,352,710,1042,566,791,20,17,20,18,10,16,310,280,692,1062,620,723,18,13,18,3,11,13,208,254,706,804,668,1018,23,14,8,1,13,8,458,274,701,599,624,794,28,26,11,8,12,15,550,506,757,684,803,623,34,16,35,10,14,14,176,218,984,1049,692,1246,17,13,1,0,2,8,355,353,582,938,695,682,19,27,21,13,15,10,7 +296,334,714,755,639,689,15,11,19,11,14,10,213,239,741,676,634,1058,12,30,12,4,12,20,261,273,644,541,767,769,21,12,2,4,0,11,345,235,842,762,702,968,31,16,12,5,12,12,312,232,810,722,742,788,36,22,2,2,13,17,372,258,657,640,815,768,37,10,11,6,6,9,212,214,876,581,665,1128,20,30,12,5,6,17,368,254,799,580,625,970,17,20,5,8,7,19,245,237,808,732,703,1052,9,25,4,1,12,12,563,247,662,702,830,781,39,22,34,14,13,9,326,312,536,583,722,783,36,17,16,18,9,15,386,258,747,804,605,809,24,16,15,17,13,10,268,260,709,820,589,741,22,24,13,2,12,21,150,188,687,590,695,1036,25,23,3,4,0,16,384,202,728,505,827,812,30,15,6,9,1,9,582,434,796,716,978,641,36,21,30,9,15,8,220,376,967,821,633,1264,21,24,4,1,15,10,353,191,613,698,598,700,23,20,18,10,14,18,7 +395,353,713,909,737,696,17,16,20,14,11,9,294,170,696,824,690,1065,16,13,11,7,9,19,360,362,675,701,657,776,19,27,1,7,11,12,372,240,839,904,708,975,29,27,11,8,1,9,339,251,807,856,720,795,34,27,1,5,2,16,447,305,640,728,701,775,35,25,12,9,9,10,271,333,835,729,679,1135,24,19,11,4,9,14,419,233,762,744,667,977,21,21,4,11,8,18,260,130,817,896,759,1059,7,10,3,4,1,11,622,396,657,744,724,788,43,21,35,17,12,10,369,363,527,697,628,790,40,24,17,21,12,16,491,341,742,968,619,816,26,17,16,20,12,11,323,249,722,984,653,748,24,17,14,5,9,20,209,227,638,734,693,1043,29,12,4,3,11,15,467,239,705,529,693,819,34,28,7,10,10,8,615,485,797,686,804,648,40,18,31,12,16,9,203,263,920,973,721,1271,23,9,3,2,4,9,398,340,616,864,720,707,25,25,19,13,13,17,7 +337,279,590,1000,691,644,3,15,24,10,9,10,268,186,687,901,674,1013,2,12,7,3,11,12,380,430,696,808,801,724,33,36,3,11,13,17,342,338,700,981,806,923,27,24,7,18,9,18,245,365,682,909,878,743,34,26,3,15,8,11,425,373,547,751,819,723,33,34,16,13,15,19,269,285,786,826,641,1083,8,20,7,0,9,15,325,115,721,851,557,925,5,26,0,7,6,7,152,162,848,1003,813,1007,21,13,1,0,1,6,528,426,546,743,844,736,25,20,35,13,16,19,379,421,464,752,744,738,24,25,21,17,14,17,457,319,631,1063,535,764,12,14,20,16,10,18,307,207,643,1091,649,696,10,8,18,1,11,9,283,269,677,821,697,991,13,13,8,1,13,14,499,305,604,596,737,767,16,31,11,8,12,21,517,551,668,631,968,596,24,17,35,8,14,20,193,215,953,1068,687,1219,9,12,1,2,2,10,366,320,523,953,724,657,13,26,19,15,15,6,7 +273,377,678,860,642,629,10,13,23,10,14,9,122,126,755,749,625,998,7,28,8,1,12,19,216,314,680,654,736,709,26,14,2,1,0,12,392,210,796,875,739,908,34,18,10,8,12,11,293,255,776,831,759,730,39,24,2,5,13,16,311,333,651,725,782,708,34,10,15,3,8,10,191,231,880,698,612,1068,15,34,8,2,6,16,281,183,803,697,560,910,12,20,3,5,7,18,252,168,848,849,724,992,14,25,4,2,12,11,492,382,626,773,789,721,34,22,30,11,13,10,279,401,532,684,679,727,31,17,20,15,13,16,379,335,711,899,522,749,19,16,19,14,13,11,261,261,689,937,592,683,17,22,17,1,12,20,153,221,725,703,660,980,20,27,7,3,0,15,323,245,706,566,766,756,25,17,10,10,1,10,513,531,756,767,953,581,31,19,34,10,15,9,279,293,999,936,636,1204,16,26,0,4,15,9,320,272,581,781,627,640,18,20,14,11,16,17,7 +260,294,533,943,643,686,3,21,19,12,5,7,233,337,638,836,590,1047,8,24,12,5,9,19,237,525,661,753,789,766,39,26,2,15,9,10,335,497,649,900,652,957,27,32,12,16,7,13,280,522,625,832,768,785,40,32,2,15,8,14,286,442,492,668,765,767,39,24,11,17,13,8,132,370,737,765,583,1117,14,18,12,2,9,16,306,184,668,796,615,961,11,18,5,9,4,16,277,275,821,948,711,1041,21,11,4,4,11,11,463,415,483,700,730,772,31,22,36,15,8,8,216,394,421,685,630,784,30,17,16,19,14,14,296,304,568,1012,555,802,12,18,15,18,4,9,278,246,590,1036,601,742,10,18,13,3,7,18,154,272,640,758,597,1035,19,19,3,1,9,13,328,278,547,567,675,811,22,23,6,8,10,8,516,436,613,684,900,640,30,19,30,10,10,7,230,144,910,1001,625,1257,3,10,4,0,10,7,321,361,476,898,718,693,19,24,20,13,11,15,7 +294,358,682,877,666,702,8,10,22,12,11,8,233,175,749,798,659,1071,5,21,11,1,9,6,367,357,682,657,856,782,28,27,1,5,11,15,341,251,804,880,843,981,32,17,9,12,5,16,338,264,776,838,877,801,37,23,1,9,4,9,386,374,627,706,858,781,32,23,14,7,11,17,294,288,858,697,670,1141,13,29,9,4,11,13,274,214,787,700,574,983,10,31,2,3,8,1,229,211,834,852,784,1065,16,22,1,4,1,6,521,409,632,732,885,794,32,17,39,9,18,17,360,486,522,675,781,796,29,26,19,13,12,11,438,350,717,924,584,822,17,17,18,12,12,16,268,264,693,940,618,754,15,15,16,3,9,3,334,340,737,708,714,1049,18,22,6,5,11,12,462,368,692,533,802,825,23,26,9,12,10,19,546,606,768,704,1021,654,29,20,33,12,16,18,232,362,1009,937,666,1277,14,23,1,6,4,8,305,269,589,800,697,713,16,23,23,13,15,0,7 +303,305,578,1015,697,618,2,17,27,11,16,3,194,178,645,910,664,983,3,14,8,4,14,17,302,410,692,829,739,698,34,28,6,14,6,10,338,324,682,982,756,897,26,24,4,17,10,11,239,361,660,904,866,717,35,24,6,16,11,10,361,361,501,736,765,693,34,24,19,16,14,8,193,275,742,843,629,1053,9,18,4,1,4,14,339,145,675,872,573,895,6,18,3,8,9,12,192,158,826,1024,801,977,20,13,4,3,6,9,532,404,542,758,770,730,26,22,34,14,11,8,329,401,432,749,684,708,25,23,24,18,17,14,411,321,627,1080,551,734,11,16,23,17,15,9,293,229,643,1112,639,666,9,18,21,2,14,14,181,233,637,834,667,961,14,11,11,0,6,9,419,269,562,623,653,737,17,29,14,7,5,10,523,533,662,650,894,584,25,19,38,9,17,9,189,205,913,1081,689,1189,8,12,4,1,9,3,340,308,531,966,768,655,14,24,20,14,10,11,7 +336,402,762,809,714,708,21,18,16,13,16,5,247,191,719,726,667,1077,20,39,15,4,14,19,311,297,698,583,698,788,15,7,5,4,2,12,375,207,884,826,669,987,25,9,15,3,10,9,342,260,854,802,671,807,30,17,5,0,11,12,410,246,685,692,722,787,31,5,8,6,4,10,236,326,858,635,658,1147,28,31,15,7,4,12,372,284,795,626,676,989,25,19,8,8,9,14,261,161,816,778,730,1071,3,32,7,1,10,9,609,347,712,734,723,800,39,31,35,14,11,10,334,328,574,651,627,802,40,20,13,18,7,16,436,340,797,854,638,828,30,19,12,17,15,11,286,266,763,866,636,760,28,29,10,2,14,16,172,210,645,654,670,1055,33,32,0,6,2,11,408,208,752,477,748,831,38,10,3,9,1,10,622,460,848,734,827,660,40,28,27,9,13,9,212,368,931,871,696,1283,27,31,7,3,13,5,341,233,667,748,691,719,27,15,19,10,12,13,7 +274,296,875,715,658,634,24,25,18,11,14,6,187,357,840,624,663,1003,19,26,17,8,12,20,225,217,767,565,846,714,12,18,9,4,0,11,363,255,985,762,629,913,22,20,21,1,12,10,280,272,967,768,709,733,27,22,9,0,13,13,326,248,808,738,902,713,28,16,20,6,6,9,158,272,981,569,772,1073,25,18,17,13,6,15,264,312,918,538,812,915,22,14,14,8,7,15,197,315,865,690,676,997,6,17,15,1,12,10,517,147,821,802,885,726,36,20,33,14,13,9,268,184,693,669,809,728,37,19,25,18,7,15,362,198,906,732,764,754,33,18,10,17,13,10,270,254,850,778,728,686,27,28,8,2,12,17,102,208,736,608,780,981,30,19,12,12,0,12,344,192,875,597,968,757,35,15,15,9,1,9,548,304,943,870,1021,586,37,25,25,13,15,8,214,444,1016,793,628,1209,30,18,11,9,15,6,293,273,764,610,575,645,24,12,15,10,14,14,7 +266,246,589,844,670,654,1,18,19,10,11,2,255,227,610,749,677,963,6,23,12,3,9,14,329,429,663,656,976,728,37,23,2,11,3,13,351,359,693,815,861,927,25,21,12,18,15,10,258,374,669,749,947,751,38,21,2,15,16,7,408,360,494,599,1016,703,37,19,11,13,9,11,282,356,723,668,700,1021,12,17,12,0,9,11,412,254,654,695,672,875,9,21,5,7,10,9,327,199,787,847,818,969,19,18,4,0,15,8,585,401,551,657,963,772,29,27,30,13,16,11,428,416,399,588,865,682,28,24,16,17,10,17,336,324,636,909,638,696,10,19,15,16,10,12,234,184,644,935,702,660,8,19,13,1,9,11,240,292,592,661,748,931,17,16,3,1,3,6,442,306,565,532,924,741,20,26,6,8,4,13,510,540,673,665,1151,632,28,20,30,8,18,12,334,290,870,908,672,1161,5,17,4,2,18,4,397,307,544,797,711,699,17,23,14,15,17,8,7 +300,416,664,866,682,699,17,19,26,9,15,1,185,145,683,729,667,1046,16,30,5,2,13,13,259,247,658,656,748,773,19,12,5,2,1,12,393,135,796,887,699,956,29,10,11,7,11,9,326,196,770,855,737,792,34,14,5,4,12,6,366,304,613,741,784,784,35,8,18,4,5,10,214,260,818,702,666,1116,24,26,5,3,5,14,332,314,745,699,682,962,21,20,4,6,8,8,231,185,800,851,724,1046,7,29,5,1,11,9,567,301,608,751,789,775,43,28,29,12,12,10,318,408,494,700,691,801,40,19,23,16,10,16,406,374,693,895,574,811,26,20,22,15,14,11,290,316,677,939,632,759,24,32,20,0,13,10,156,314,639,715,696,1048,29,23,10,2,1,5,364,334,684,542,800,826,34,15,13,9,0,10,590,532,746,779,939,651,40,29,37,9,14,9,254,404,917,940,662,1252,23,28,3,3,14,3,317,275,565,771,647,688,25,18,15,10,15,9,7 +323,301,690,875,655,640,12,16,18,11,11,5,212,174,763,768,618,1005,7,21,13,4,9,19,262,346,728,669,729,720,24,21,3,4,3,10,400,258,780,866,686,915,34,21,13,11,15,11,325,277,776,816,716,739,35,21,3,8,16,12,375,265,625,704,755,721,30,19,10,6,9,8,215,287,864,697,613,1075,11,19,13,1,9,16,303,223,811,712,647,917,8,19,6,8,10,14,232,132,888,864,699,999,12,16,5,1,15,9,572,350,652,710,744,728,30,21,31,14,16,8,315,317,544,671,648,738,27,22,15,18,10,14,421,275,737,930,575,756,21,21,14,17,10,9,311,177,727,952,603,696,13,21,12,2,9,16,129,225,731,702,635,989,16,14,2,0,3,11,369,245,682,555,749,765,21,22,5,7,4,10,593,457,756,738,930,592,27,18,29,9,18,9,233,313,1005,941,637,1211,18,15,5,1,18,5,318,294,617,816,640,647,20,25,15,14,17,13,7 +299,309,742,650,622,731,19,21,20,11,13,4,230,300,707,571,639,1086,18,32,21,8,11,18,242,238,632,436,870,811,17,12,11,4,1,11,294,274,860,679,633,982,27,16,21,1,13,10,287,271,828,653,733,832,32,22,11,0,14,11,313,261,659,605,926,810,33,10,14,6,7,9,183,235,846,490,754,1154,26,24,21,13,7,13,363,297,781,467,798,1006,23,12,14,8,8,13,270,306,738,613,650,1086,5,25,13,1,13,12,508,216,698,653,889,815,41,26,37,14,14,9,315,215,550,546,819,829,42,13,19,18,8,15,343,221,783,685,754,845,28,22,8,17,12,10,255,249,723,701,722,785,26,32,8,2,11,15,171,195,607,511,764,1082,31,25,6,12,1,10,333,187,728,472,964,858,36,9,9,9,2,7,531,345,832,733,1041,683,42,23,21,13,16,8,249,435,893,716,594,1304,25,24,13,9,16,4,368,222,641,571,569,704,27,18,17,10,15,12,7 +298,196,596,909,632,641,0,23,19,10,10,4,199,243,635,800,577,992,5,18,12,3,8,14,261,447,684,719,790,719,36,26,2,11,6,9,433,397,700,890,615,920,24,26,12,18,18,12,328,412,676,824,717,742,37,26,2,15,19,7,386,350,503,688,756,706,36,24,11,13,12,9,214,336,738,737,578,1062,11,12,12,0,12,15,362,202,671,762,646,904,8,16,5,7,13,9,271,175,806,914,680,986,18,11,6,0,18,8,575,393,558,678,707,763,28,24,28,13,19,9,330,372,430,669,617,721,27,17,16,17,13,13,396,278,643,970,574,743,9,22,15,16,9,8,288,130,653,1002,594,679,7,24,13,1,8,11,142,296,631,732,586,972,16,11,3,1,6,6,376,312,570,581,696,748,19,23,6,8,7,11,604,490,680,718,907,617,27,25,30,8,21,10,280,224,905,979,610,1198,6,10,4,2,21,0,363,343,549,852,671,690,16,18,14,15,14,8,7 +326,396,721,855,678,658,17,14,21,10,14,3,203,187,764,746,665,1027,12,25,10,3,12,17,315,265,705,641,738,738,19,19,0,3,0,10,371,163,839,862,717,937,29,11,10,6,12,13,328,212,825,814,753,757,34,17,0,3,13,10,402,294,678,728,780,737,35,15,13,5,6,12,250,250,899,685,658,1097,18,29,10,4,6,18,338,288,822,684,642,939,15,23,3,7,7,12,227,205,875,836,730,1021,7,26,2,0,12,5,577,279,665,752,795,750,37,23,32,13,13,12,360,382,557,675,691,754,34,20,18,17,11,14,460,316,750,898,570,778,26,15,17,16,13,11,264,300,728,924,622,712,20,27,15,1,12,14,216,256,712,692,698,1005,23,22,5,3,0,9,414,270,749,549,804,781,28,22,8,10,1,14,578,502,789,748,955,610,34,26,32,8,15,13,226,406,990,925,664,1233,23,25,2,2,15,3,349,217,622,780,645,669,25,21,16,9,16,11,7 +245,273,621,746,641,681,0,21,20,10,13,2,258,236,610,671,654,952,5,18,19,3,11,12,328,416,653,580,993,745,36,24,9,9,1,13,362,316,723,729,852,950,24,14,19,16,13,8,267,337,697,675,942,764,37,14,9,13,14,5,395,345,518,577,1027,704,36,20,16,11,7,11,311,363,725,566,707,992,11,14,19,0,7,11,407,339,658,589,683,866,8,20,12,7,8,7,366,216,781,741,785,970,18,23,11,0,13,8,544,384,589,659,978,811,28,18,35,13,14,11,435,413,435,518,882,651,27,23,21,17,8,17,323,331,674,811,655,673,9,26,8,16,12,12,231,223,676,829,709,641,7,22,8,1,11,9,273,343,570,565,751,900,16,15,8,1,1,4,409,343,583,500,935,744,19,25,11,8,2,11,491,533,711,707,1164,663,27,23,23,8,16,10,389,341,854,810,639,1138,6,22,11,2,16,4,336,332,580,705,670,742,16,20,17,15,15,8,7 +274,306,839,679,636,679,21,25,22,11,15,4,173,325,804,600,647,1048,18,28,21,8,13,18,255,197,725,499,836,759,15,18,11,4,1,11,391,229,955,720,621,958,25,18,21,1,11,12,340,272,931,716,699,778,30,22,11,0,12,11,362,258,768,666,886,758,31,16,18,6,5,11,222,276,947,521,752,1118,26,20,21,13,5,17,308,350,880,490,776,960,23,14,14,8,8,13,221,315,811,642,660,1042,3,21,13,1,11,6,557,177,789,736,875,771,39,20,35,14,12,11,318,236,653,601,797,773,40,19,23,18,6,15,402,210,874,706,734,799,30,20,10,17,14,10,262,270,810,730,704,731,28,30,10,2,13,15,156,266,704,556,764,1026,31,21,10,12,1,10,354,252,837,533,946,802,36,15,13,9,0,13,600,344,919,804,1009,631,40,27,21,13,14,12,244,474,986,747,610,1254,27,20,13,9,14,4,279,271,732,584,553,692,27,14,19,10,13,12,7 +255,343,728,799,642,659,17,7,19,12,13,5,196,142,757,698,619,1028,12,34,12,5,11,19,236,304,710,601,758,739,19,16,2,5,1,12,374,218,838,808,707,938,29,18,12,8,13,9,271,215,820,778,733,760,34,26,2,5,14,12,325,269,671,708,794,738,35,14,11,7,7,10,157,261,888,627,614,1098,18,30,12,2,7,12,301,233,815,636,608,940,15,30,5,9,8,14,208,142,862,788,712,1022,7,21,6,2,13,9,510,318,684,738,793,751,37,28,28,15,14,10,265,345,558,651,695,757,34,21,16,19,8,16,331,299,769,842,580,779,26,16,15,18,12,11,283,223,741,876,588,713,20,20,13,3,11,16,121,227,707,646,644,1010,23,27,3,1,1,11,335,235,732,555,792,786,28,15,6,8,2,10,553,477,806,786,945,611,34,19,30,10,16,9,219,335,989,869,638,1234,23,20,4,0,16,5,300,276,641,722,657,670,25,26,14,11,15,13,7 +271,279,592,891,574,614,1,17,22,10,6,8,168,170,635,750,551,905,4,22,9,1,4,6,222,440,700,759,848,670,35,26,15,11,10,11,460,318,698,888,671,847,25,26,25,18,14,10,365,333,678,834,777,695,36,22,15,15,15,1,325,367,513,754,890,683,35,24,14,13,10,11,245,347,746,729,568,975,10,18,21,2,10,13,305,243,675,746,630,825,7,20,20,5,9,7,308,156,826,898,678,909,19,15,21,2,14,8,492,420,552,768,815,688,27,20,13,11,15,9,309,433,412,715,733,690,26,15,19,15,9,11,377,343,637,922,556,676,10,22,18,14,5,10,323,209,651,986,620,652,8,18,16,1,4,5,193,295,623,734,590,921,15,15,14,3,10,4,297,323,584,673,802,711,18,23,9,10,11,11,563,557,674,868,1025,582,26,19,33,10,17,10,365,279,899,967,564,1119,7,14,17,4,17,8,296,342,539,802,641,605,15,24,11,15,18,8,7 +338,350,758,829,733,716,20,15,18,12,17,3,247,141,725,744,716,1085,19,30,13,5,15,13,323,319,714,607,793,796,16,16,3,5,3,10,347,217,868,836,770,995,26,10,13,4,9,11,324,222,840,800,798,815,31,18,3,1,10,6,412,292,667,690,829,795,32,12,10,7,3,8,240,290,858,653,703,1155,27,30,13,6,3,14,386,264,793,650,661,997,24,22,6,9,10,10,249,139,828,802,797,1079,4,29,5,2,9,11,599,371,726,714,844,808,40,24,35,15,10,8,358,394,572,647,740,810,41,19,15,19,8,14,434,336,811,872,623,836,29,16,14,18,16,9,276,246,771,890,681,768,27,28,12,3,15,10,190,290,653,664,747,1063,32,23,2,5,3,5,438,310,736,501,847,839,37,19,5,8,2,8,598,516,852,716,952,668,41,27,29,10,12,7,186,334,941,891,729,1291,26,28,5,2,12,3,369,311,681,768,744,727,28,18,19,11,13,11,7 +214,260,601,768,566,644,3,17,14,15,6,5,215,221,650,697,537,991,2,30,17,4,4,13,287,473,703,586,806,722,33,20,7,6,12,12,481,357,697,769,679,923,27,20,17,13,14,13,420,388,679,737,759,741,34,20,7,10,15,6,364,378,516,641,850,703,33,18,6,8,12,14,316,386,753,586,524,1061,8,26,17,7,12,12,308,288,688,595,564,903,5,24,10,0,9,8,347,229,837,747,674,985,21,17,9,7,14,7,505,435,565,719,779,758,25,20,29,12,15,14,328,416,441,592,691,716,24,27,11,10,9,16,324,344,650,825,514,742,12,12,10,9,5,13,316,190,658,835,570,674,10,20,8,6,4,10,278,294,640,597,566,969,13,27,2,8,12,9,346,302,581,518,768,745,16,17,1,11,13,16,576,544,679,779,987,614,24,19,25,15,17,15,402,356,918,828,558,1197,9,16,9,9,17,5,281,283,546,719,631,681,13,24,19,10,18,7,7 +314,330,675,935,696,675,9,10,21,9,11,9,213,127,750,852,667,1044,4,17,10,2,9,7,343,389,717,725,760,755,27,33,0,6,11,16,333,247,777,934,809,954,33,21,10,13,5,17,290,262,763,888,845,774,34,21,0,10,4,10,380,366,610,750,756,754,29,29,13,8,11,18,252,320,845,755,642,1114,10,25,10,1,11,14,278,190,790,768,572,956,7,31,3,6,8,2,185,147,871,920,794,1038,15,16,2,1,1,5,505,443,631,748,805,767,29,21,38,12,18,18,346,434,521,727,709,769,26,28,18,16,12,12,444,356,716,988,542,795,18,17,17,15,12,17,298,234,708,1008,638,727,12,13,15,0,9,4,286,270,728,762,686,1022,15,18,5,2,11,13,452,294,669,563,698,798,20,30,8,9,10,20,528,574,747,694,915,627,26,16,32,9,16,19,216,270,1004,997,686,1250,15,15,2,3,4,9,313,341,598,872,731,688,17,29,22,16,15,1,7 +297,387,788,727,464,648,24,27,9,13,7,10,254,308,561,644,461,781,19,18,22,8,5,8,206,216,722,641,804,656,18,16,12,8,7,11,404,258,792,670,651,857,18,18,22,11,9,10,415,219,774,702,737,659,13,14,12,12,8,5,225,179,619,648,838,575,12,16,1,6,7,9,255,303,664,543,508,817,13,10,22,11,7,11,247,331,637,578,526,699,16,16,15,4,4,13,402,272,690,728,604,809,36,23,14,11,9,16,232,238,786,724,777,772,4,10,24,12,8,9,137,185,632,615,691,534,3,11,6,6,2,9,275,319,871,802,496,596,15,26,9,5,6,10,449,301,839,816,520,548,17,26,11,10,5,11,237,191,445,542,546,731,8,15,7,12,7,4,235,179,630,543,746,627,5,15,4,7,8,7,341,319,860,836,977,648,3,27,20,13,10,8,435,461,751,777,464,965,30,22,14,13,10,10,278,240,767,674,529,749,16,6,22,8,9,14,7 +230,294,592,794,596,620,4,14,19,10,10,3,223,213,681,677,595,977,1,27,12,1,8,17,307,423,708,620,864,700,32,19,2,9,6,12,411,323,696,789,759,887,28,15,14,16,18,9,364,346,680,745,837,721,33,17,2,13,19,10,360,386,527,675,910,701,32,15,11,11,12,10,312,334,770,632,594,1047,7,21,12,2,12,14,360,290,711,645,576,891,4,25,7,5,13,12,371,233,854,797,730,971,20,22,8,2,18,7,507,395,548,741,849,712,24,23,26,11,19,10,418,452,464,624,755,722,23,20,16,15,13,16,400,320,633,847,544,732,13,23,15,14,9,11,284,224,643,885,608,678,11,23,13,1,8,14,272,324,675,635,646,973,12,20,3,3,6,9,334,344,584,604,828,749,15,22,6,10,7,12,540,576,666,783,1049,584,23,22,30,10,21,11,412,382,953,868,596,1189,10,21,4,4,21,3,339,273,523,725,643,635,12,25,14,15,14,11,7 +326,292,622,835,652,681,7,7,19,9,12,7,221,179,695,760,623,1050,4,20,12,2,8,19,333,437,650,627,710,761,29,24,2,4,10,10,343,311,750,826,753,960,31,22,12,11,6,13,336,350,722,762,767,780,36,24,2,8,5,14,408,362,585,662,762,760,31,20,11,6,12,10,276,324,814,661,600,1120,12,28,12,1,10,18,350,190,737,670,582,962,9,28,5,6,9,16,259,173,818,822,734,1044,17,15,4,1,2,9,573,423,562,664,759,773,31,20,34,12,19,10,396,386,466,627,651,775,28,23,16,16,13,14,472,338,647,900,522,801,16,16,15,15,13,9,278,200,643,910,616,733,14,18,13,0,10,18,272,206,675,658,642,1028,17,21,3,2,10,13,448,246,648,505,734,804,22,27,6,9,9,12,578,534,700,632,935,633,28,15,30,9,17,11,236,276,945,901,640,1256,13,16,4,3,5,7,371,273,529,802,645,692,15,28,18,14,16,15,7 +240,320,659,867,647,647,11,7,19,9,11,3,161,155,758,764,628,1016,6,32,12,2,9,17,215,353,689,659,751,727,25,16,2,4,3,14,367,243,767,862,744,926,35,20,12,11,15,9,298,270,747,820,776,746,36,26,2,8,16,10,320,310,614,720,791,726,31,14,11,6,9,12,186,280,853,693,617,1086,12,30,12,1,9,14,296,208,792,702,615,928,9,30,5,6,10,12,229,155,865,854,719,1010,13,19,4,1,15,9,503,365,617,748,778,739,31,26,32,12,16,12,280,352,535,673,678,741,28,21,16,16,12,18,360,302,702,922,539,767,20,16,15,15,10,13,246,212,686,942,603,699,14,18,13,0,9,14,134,210,742,694,657,994,17,25,3,2,3,9,326,228,669,565,773,770,22,15,6,9,4,12,528,504,739,762,972,599,28,17,30,9,18,11,240,298,1014,935,635,1222,17,20,4,3,18,5,297,277,574,810,634,660,19,26,16,14,17,11,7 +234,258,546,884,692,662,3,15,23,11,14,5,209,227,613,759,699,1029,8,22,8,4,12,19,295,443,644,694,914,742,39,20,2,10,0,12,295,381,670,867,849,939,27,24,8,17,12,9,218,396,640,801,925,761,40,24,2,14,13,12,340,378,493,647,948,743,39,18,15,12,6,10,216,340,726,712,684,1099,14,22,8,1,6,14,372,210,651,737,624,941,11,22,1,8,7,14,311,175,796,889,822,1023,21,15,2,1,12,9,517,425,496,671,929,752,31,20,32,14,13,10,372,424,386,640,829,762,30,23,20,18,11,16,330,342,581,943,608,780,12,16,19,17,13,11,182,208,601,977,680,720,10,16,17,2,12,16,192,298,605,707,748,1011,19,15,7,0,0,11,402,328,558,548,876,787,22,23,10,7,1,10,492,550,630,661,1101,614,30,15,34,9,15,9,272,228,873,954,692,1235,3,16,0,1,15,5,399,365,489,823,715,671,19,28,16,14,16,13,7 +330,396,781,842,645,676,18,11,23,11,9,15,245,181,776,741,640,1045,15,20,8,4,11,15,323,251,707,632,783,756,18,28,2,4,13,16,319,201,903,857,710,955,28,18,8,5,3,13,240,234,877,807,754,777,33,22,2,2,2,14,388,276,714,705,821,755,34,24,15,6,9,14,216,202,915,674,669,1115,23,28,8,5,9,14,346,220,842,675,631,957,20,32,1,8,6,18,169,187,839,827,717,1039,6,21,2,1,1,13,529,273,725,711,832,768,42,14,32,14,16,14,314,328,597,664,730,774,39,27,20,18,10,16,440,316,810,885,603,796,27,16,19,17,10,15,304,306,768,915,613,730,25,18,17,2,11,20,190,178,714,685,701,1027,28,21,7,4,13,11,434,198,783,544,833,803,33,27,10,9,12,12,518,454,859,713,954,628,39,21,34,9,14,13,136,348,996,914,641,1251,24,20,0,1,2,15,345,219,672,771,642,687,26,24,16,10,13,17,7 +322,304,762,810,596,617,15,10,23,12,10,8,209,261,851,661,611,982,10,27,12,5,8,20,243,305,728,622,850,697,21,23,6,5,4,11,359,303,862,809,687,892,31,23,18,8,16,12,266,310,854,753,777,716,36,21,6,5,17,15,316,278,713,683,892,700,35,21,19,7,10,9,174,214,952,648,694,1052,16,25,12,2,10,17,286,190,901,659,694,894,13,27,11,9,11,17,227,239,902,811,654,976,9,16,12,2,16,10,511,235,714,733,881,705,35,25,30,15,17,9,280,238,630,646,787,719,32,20,24,19,11,15,386,216,799,849,654,733,24,19,15,18,9,10,316,230,763,899,642,677,18,19,13,3,8,19,132,138,801,651,720,968,21,20,11,1,4,14,340,144,768,616,902,744,26,20,14,8,5,9,510,354,828,775,1071,569,32,16,30,10,19,8,230,332,1081,890,580,1188,21,15,8,0,19,8,319,239,661,725,529,624,23,29,16,11,16,16,7 +356,266,574,833,587,682,4,22,14,12,11,12,311,275,667,744,526,1051,1,19,17,5,9,18,279,495,642,649,743,762,32,27,7,11,7,13,393,413,702,800,592,961,28,27,17,16,19,10,398,444,674,734,654,783,33,27,7,15,20,19,384,394,547,620,735,761,32,25,6,13,13,11,240,338,782,661,527,1121,9,13,17,2,13,15,390,130,707,688,605,963,6,17,10,9,14,21,321,251,806,836,639,1045,20,10,9,2,19,14,563,409,518,616,688,774,28,23,29,15,20,11,296,344,438,599,598,780,25,18,11,19,14,17,382,276,603,902,553,802,13,21,10,18,10,12,312,184,607,924,565,736,11,23,8,3,9,23,168,224,659,654,525,1033,14,12,2,1,7,16,378,232,606,543,681,809,19,24,1,8,8,9,636,458,658,666,894,634,25,24,25,10,22,10,282,220,925,897,567,1257,10,9,9,0,22,12,371,273,489,794,608,693,12,19,19,13,13,20,7 +372,322,592,995,762,673,2,26,22,9,11,10,283,169,635,890,705,1042,7,1,9,2,9,8,409,453,672,795,766,753,38,35,1,8,11,17,361,329,714,982,737,952,26,33,9,15,3,18,334,332,686,926,847,774,39,23,1,12,2,11,456,412,527,780,750,752,38,35,14,10,9,19,308,372,756,819,686,1112,13,9,9,1,11,15,354,220,679,838,660,954,10,15,2,6,8,3,159,177,816,990,832,1036,20,14,1,1,1,4,597,485,542,776,729,765,30,11,37,12,16,19,424,480,412,763,673,771,29,16,19,16,12,13,510,402,627,1054,602,793,11,25,18,15,12,18,288,246,639,1078,694,727,9,17,16,0,9,5,312,334,625,818,702,1024,18,8,6,2,11,14,522,370,598,591,612,800,21,30,9,9,10,21,592,612,678,706,819,625,29,28,33,9,16,20,216,238,895,1063,746,1248,4,13,1,3,4,10,359,393,529,940,807,684,18,15,21,16,13,2,7 +276,220,623,779,656,707,2,15,20,10,11,1,293,255,620,694,677,988,7,22,23,3,9,13,373,449,679,591,1040,775,38,24,13,9,3,12,329,401,729,756,875,980,26,18,23,16,15,9,242,388,703,696,971,794,39,20,13,13,16,6,420,340,528,576,1080,734,38,20,12,11,9,10,300,414,743,597,740,1032,13,20,23,0,9,12,442,296,672,626,736,900,10,22,16,7,10,8,349,223,801,774,796,1000,20,19,15,0,15,7,553,417,589,620,1015,835,30,20,37,13,16,10,456,360,435,535,927,691,29,23,17,17,10,16,338,302,674,844,700,713,11,20,10,16,10,11,244,150,676,862,762,679,9,20,10,1,9,10,268,314,588,592,782,940,18,15,8,1,3,5,466,314,595,523,988,774,21,27,7,8,4,12,472,496,713,666,1215,687,29,19,19,8,18,11,328,302,866,839,652,1178,4,18,15,2,18,3,401,349,580,742,679,762,18,26,19,15,17,7,7 +272,322,694,773,598,646,13,10,19,10,10,7,159,193,795,680,595,1015,8,31,12,1,8,17,263,345,706,561,800,726,23,13,2,1,4,14,423,253,800,784,731,925,33,15,12,8,16,9,362,276,780,744,769,745,38,21,2,5,17,14,368,324,647,674,850,725,33,11,11,3,10,12,268,260,886,609,622,1085,14,31,12,2,10,14,320,260,827,602,594,927,11,23,5,5,11,16,285,197,864,754,686,1009,11,24,4,2,16,9,547,325,654,720,817,738,33,25,30,11,17,12,354,392,568,617,717,740,30,20,16,15,11,18,408,294,739,816,558,766,22,13,15,14,9,13,290,222,709,842,584,698,16,23,13,1,8,18,216,252,767,612,660,993,19,24,3,3,4,13,366,272,702,533,828,769,24,16,6,10,5,12,568,516,776,740,1017,598,30,22,30,10,19,11,308,364,1041,843,594,1221,19,23,4,4,19,7,329,237,605,708,569,659,21,21,14,11,16,15,7 +283,353,645,885,660,637,12,16,21,10,12,9,176,200,720,780,629,1004,7,27,10,3,10,19,172,368,717,681,714,717,24,21,0,5,2,10,334,284,743,876,733,914,34,29,10,12,14,11,265,295,723,834,761,738,31,29,0,9,15,16,239,287,570,714,748,720,26,19,13,7,8,8,111,299,807,707,616,1074,7,25,10,0,8,16,277,197,750,724,614,916,4,23,3,7,9,18,246,160,853,876,722,998,12,14,2,0,14,13,426,382,619,738,753,741,26,21,34,13,15,8,221,341,525,679,651,735,23,20,18,17,13,14,293,305,704,944,548,755,19,15,17,16,11,9,263,231,692,964,602,693,9,15,15,1,10,20,111,221,714,708,648,986,12,20,5,1,2,13,277,237,629,545,728,762,17,18,8,8,3,6,457,459,735,736,925,601,23,12,32,8,17,7,265,243,992,951,640,1210,18,15,2,2,17,9,326,340,586,832,657,664,20,29,18,15,18,17,7 +221,417,717,827,713,651,19,18,24,12,17,4,132,172,732,710,712,1016,14,35,7,1,15,18,260,246,713,607,825,731,17,9,3,1,3,11,336,152,829,852,766,926,27,7,7,4,9,12,283,209,809,828,810,750,32,13,3,3,10,11,321,297,666,726,853,732,33,5,16,3,5,11,211,259,869,663,717,1086,22,27,7,6,3,17,289,351,794,650,651,928,19,21,0,5,10,13,232,198,863,802,779,1010,5,30,1,2,9,6,504,284,671,774,890,743,41,31,33,11,10,11,331,411,547,681,784,751,38,22,21,15,10,15,365,373,756,856,639,767,28,19,20,14,16,10,225,337,742,890,657,709,24,31,18,1,15,15,209,359,686,680,765,1000,27,28,8,5,3,10,369,381,729,539,873,776,32,12,11,12,2,13,513,521,797,796,1008,607,38,30,35,10,12,12,255,415,964,899,705,1222,25,29,1,4,12,4,298,312,634,736,678,664,27,17,17,11,13,12,7 +277,283,592,879,690,678,1,19,16,10,9,4,186,236,671,776,651,1047,6,16,15,3,7,14,288,500,668,681,794,758,37,28,5,9,5,13,372,378,706,864,713,957,25,30,15,16,17,12,331,397,690,812,791,777,38,30,5,13,18,7,395,377,551,702,822,759,37,26,8,11,11,13,259,429,782,709,636,1117,12,16,15,0,11,13,335,297,709,724,688,959,9,18,8,7,12,9,274,190,830,876,750,1041,19,9,7,0,17,8,574,498,542,706,769,770,29,24,31,13,18,13,393,431,444,675,683,776,28,19,13,17,12,17,423,373,627,942,600,798,10,18,12,16,8,12,227,199,637,964,660,734,8,20,10,1,7,11,215,341,659,704,662,1027,17,9,0,1,5,8,405,353,614,565,762,803,20,25,3,8,6,15,575,543,666,712,975,630,28,21,27,8,20,14,279,267,929,945,670,1253,5,8,7,2,20,4,358,362,523,830,699,689,17,22,17,15,15,8,7 +316,368,653,917,740,677,11,11,22,9,12,6,223,123,698,828,705,1046,8,18,9,2,8,14,353,391,673,703,730,757,25,24,1,2,10,13,327,245,773,918,795,956,35,18,9,9,2,14,310,264,753,866,809,776,40,22,1,6,3,7,402,382,598,742,746,756,35,20,14,4,10,15,262,330,823,741,684,1116,16,26,9,1,10,17,302,272,746,746,626,958,13,28,2,6,9,9,197,143,837,898,800,1040,13,21,1,1,2,6,551,445,597,774,807,769,35,16,37,12,15,15,382,456,477,707,701,771,32,23,19,16,13,15,470,414,682,962,594,797,20,20,18,15,13,14,248,288,684,986,658,729,18,18,16,0,10,11,280,292,664,748,718,1024,21,19,6,2,10,10,464,314,669,557,724,800,26,27,9,9,9,17,560,592,727,732,909,629,32,19,33,9,17,16,210,274,938,983,726,1252,17,22,1,3,5,6,329,361,566,848,727,688,19,22,21,12,14,8,7 +286,360,766,995,640,647,21,30,17,11,17,11,133,273,603,888,557,822,16,3,14,4,15,3,227,305,726,801,722,685,19,27,4,10,3,12,407,255,796,958,581,890,21,29,14,17,9,9,250,274,774,888,689,700,16,19,4,14,10,4,310,276,609,730,660,606,15,27,9,12,3,12,156,222,716,815,546,856,10,5,14,1,3,10,280,226,673,844,564,738,13,7,7,8,10,6,187,235,774,996,700,856,37,18,6,1,9,11,505,217,758,728,627,795,7,15,36,14,10,10,256,254,604,729,523,517,6,12,14,18,8,8,378,276,843,1070,572,613,12,29,13,17,16,13,256,296,821,1084,578,539,14,21,11,2,15,4,96,128,529,806,544,764,5,4,1,0,3,5,330,126,632,609,566,648,2,22,4,7,2,12,512,384,844,732,781,647,6,32,28,9,12,11,240,356,833,1053,626,1004,27,17,6,1,12,11,301,219,751,962,729,750,19,11,20,14,11,7,7 +256,346,681,862,706,697,8,10,20,9,13,1,161,135,700,757,693,1066,7,25,11,2,9,15,279,335,687,648,822,777,28,21,1,2,9,12,329,223,803,871,807,976,32,15,11,9,3,9,298,232,773,835,851,796,39,23,1,6,4,8,340,364,606,735,858,776,38,17,12,4,11,10,232,304,821,688,676,1136,15,29,11,1,9,12,286,264,748,691,646,978,12,25,4,6,10,10,255,159,831,843,792,1060,16,24,3,1,3,7,501,399,631,755,855,789,34,23,33,12,12,10,348,452,493,686,757,791,31,20,17,16,14,16,414,372,716,905,576,817,17,17,16,15,14,11,228,254,704,931,664,749,15,23,14,0,11,12,230,322,662,699,730,1044,20,22,4,2,9,7,382,348,675,546,832,820,25,24,7,9,8,12,522,580,767,747,1007,649,31,22,31,9,18,11,244,318,942,928,694,1272,14,23,3,3,6,3,321,315,596,789,723,708,18,23,17,12,15,9,7 +302,322,662,848,669,687,9,13,20,10,13,3,197,177,717,751,662,1056,6,26,11,1,11,17,309,333,678,640,801,767,27,20,1,3,1,10,357,239,790,845,768,966,33,14,11,10,13,13,348,272,758,797,806,786,38,20,1,7,14,10,398,340,617,699,835,766,33,16,12,5,7,12,262,262,842,674,657,1126,14,26,11,2,7,18,354,278,765,683,615,968,11,26,4,5,8,12,247,181,846,835,753,1050,15,25,3,2,13,5,587,339,610,727,848,779,33,24,35,11,14,12,394,420,496,654,748,781,30,19,17,15,10,14,432,306,695,901,583,807,18,18,16,14,12,11,240,246,687,923,615,739,16,26,14,1,11,14,236,294,693,677,707,1034,19,19,4,3,1,9,424,318,684,556,825,810,24,23,7,10,2,14,592,540,744,737,1016,639,30,25,31,10,16,13,250,350,965,918,661,1262,15,24,3,4,16,3,353,257,577,791,644,698,17,24,19,13,15,11,7 +316,274,538,911,628,686,2,18,15,12,9,8,245,309,651,820,589,1055,7,17,16,5,11,20,333,531,658,719,762,766,38,25,6,13,9,11,377,465,666,876,671,965,26,25,16,16,15,12,334,512,638,802,781,785,39,25,6,15,16,15,426,430,519,658,814,765,38,21,7,15,11,9,276,388,760,735,556,1125,13,17,16,2,9,17,408,196,685,762,604,967,10,19,9,9,12,17,315,269,836,914,732,1049,20,14,8,2,17,10,615,453,482,668,737,778,30,19,30,15,16,9,420,376,428,655,651,782,29,20,12,19,16,15,440,334,567,986,544,806,11,17,11,18,8,10,248,222,595,1002,622,738,9,19,9,3,11,19,226,252,655,728,590,1035,18,10,1,1,9,14,456,272,574,597,704,811,21,26,2,8,10,11,606,514,622,632,935,638,29,20,26,10,18,10,252,246,917,971,620,1261,4,13,8,0,18,8,433,303,481,880,709,697,18,23,18,13,11,16,7 +291,321,751,792,586,672,18,14,21,12,18,4,178,202,810,659,615,1013,13,25,12,3,14,18,226,302,701,584,870,752,18,17,8,3,4,13,348,240,861,811,647,899,28,21,16,4,8,8,239,271,841,751,759,773,33,25,8,1,9,11,303,267,696,671,920,755,34,15,21,5,10,11,155,235,935,630,720,1079,19,29,12,6,4,13,315,193,872,627,752,941,16,17,9,7,11,13,222,188,867,779,626,1019,6,18,10,0,8,10,496,286,703,687,901,758,38,23,32,13,11,11,281,295,603,622,817,774,35,16,26,17,15,17,373,255,788,823,704,784,27,17,15,16,17,12,289,237,748,867,682,730,21,23,13,1,16,15,133,169,748,639,738,1025,24,22,13,5,4,10,349,181,755,550,948,801,29,14,16,10,3,9,501,425,827,735,1095,636,35,16,30,8,17,10,249,323,1032,870,558,1241,24,19,6,2,11,4,334,232,648,697,495,621,26,25,18,9,12,12,7 +386,288,515,929,646,682,2,21,16,12,10,8,303,351,630,836,573,1051,7,16,15,5,8,18,313,519,631,737,762,762,38,30,5,13,6,9,393,509,645,890,559,961,26,30,15,16,18,12,380,528,617,812,675,781,39,28,5,15,19,15,426,450,494,648,718,761,38,28,8,15,12,7,252,366,735,751,570,1121,13,14,15,2,12,17,400,188,662,780,640,963,10,16,8,9,13,17,303,289,801,932,692,1045,20,9,7,2,18,12,621,431,459,652,637,774,30,22,29,15,19,7,348,368,407,657,559,776,29,21,13,19,13,13,438,330,544,1006,582,802,11,20,12,18,9,8,328,232,568,1020,606,734,9,22,10,3,8,19,172,254,630,742,572,1029,18,9,0,1,6,14,428,274,549,573,638,805,21,27,3,8,7,7,636,452,599,614,827,634,29,23,27,10,21,6,248,180,896,989,624,1257,4,8,7,0,21,8,401,333,452,898,701,693,18,20,17,13,14,16,7 +252,240,656,750,663,684,12,17,14,10,11,4,277,207,599,663,672,955,7,22,21,3,9,10,315,401,684,582,1017,738,24,26,11,9,3,11,341,329,738,735,864,943,30,26,21,16,15,10,220,334,716,675,952,759,25,20,11,13,16,3,366,300,531,595,1053,701,24,24,6,11,9,9,260,366,714,572,713,1005,1,18,21,0,9,13,414,310,653,599,709,867,4,20,14,7,10,9,355,203,768,747,809,965,28,19,13,0,15,10,529,373,640,655,990,804,16,24,31,13,16,9,382,338,486,546,904,668,15,23,11,17,10,15,310,270,725,813,677,686,13,20,10,16,10,10,246,156,709,835,735,642,9,16,10,1,9,7,228,296,553,571,757,917,4,15,6,1,3,2,386,298,590,546,961,747,7,27,3,8,4,9,454,470,748,709,1190,660,15,19,21,8,18,8,370,360,841,816,663,1149,18,18,13,2,18,4,395,313,627,705,698,737,22,24,19,15,17,10,7 +212,208,605,741,605,656,0,17,13,10,11,3,295,295,630,646,606,981,5,30,18,3,9,13,325,409,693,639,963,730,36,20,8,9,7,10,409,417,709,728,786,913,24,20,18,16,19,11,322,422,687,688,880,759,37,22,8,13,20,6,364,404,516,668,1005,721,36,18,5,11,13,10,316,388,741,575,649,1049,11,24,18,0,13,14,404,318,674,604,661,901,8,24,11,7,14,8,373,273,807,740,751,983,18,17,12,0,19,7,537,371,567,730,928,758,28,22,22,13,20,10,324,406,415,617,848,730,27,25,10,17,14,14,290,268,652,798,619,742,9,14,9,16,10,9,312,182,660,828,687,686,7,18,7,1,9,10,288,366,612,580,691,979,16,25,5,1,7,5,372,364,587,619,913,759,19,17,0,8,8,12,546,520,689,824,1140,626,27,19,24,8,22,11,400,346,890,809,609,1199,6,16,10,2,22,1,363,335,560,672,658,669,16,24,20,15,13,7,7 +248,318,660,790,613,657,13,9,14,9,10,9,197,201,747,719,578,1026,8,34,17,2,8,19,235,419,688,584,733,737,23,16,7,4,4,10,395,303,762,795,682,936,33,18,17,11,16,13,336,338,750,765,696,756,36,22,7,8,17,16,356,282,617,669,781,736,31,14,6,6,10,8,222,336,856,616,575,1096,12,28,17,1,10,18,326,252,793,619,611,938,9,28,10,6,11,18,261,193,868,771,675,1020,11,21,9,1,16,11,539,403,610,705,754,749,31,30,29,12,17,8,304,342,522,616,660,751,28,23,11,16,11,14,354,300,695,843,559,777,22,18,10,15,9,9,276,186,687,859,579,709,14,20,8,0,8,20,154,200,719,627,591,1004,17,29,2,2,4,15,340,220,672,520,769,780,22,13,1,9,5,10,590,476,724,757,956,609,28,19,25,9,19,9,264,332,993,852,601,1232,19,20,9,3,19,9,323,267,573,743,600,668,21,24,19,14,16,17,7 +249,243,570,784,604,706,1,13,12,12,10,2,242,268,685,687,595,1063,6,32,19,1,8,16,324,464,664,586,860,786,37,18,9,7,6,11,400,390,694,787,727,973,25,20,19,14,18,12,417,417,668,751,811,805,38,22,9,11,19,9,407,417,543,661,902,787,37,16,4,9,12,11,345,409,786,618,590,1133,12,24,19,4,12,17,375,331,715,621,622,981,9,28,12,3,13,11,388,274,838,771,710,1061,19,19,11,4,18,6,572,452,516,687,837,790,29,26,29,9,19,11,423,443,464,614,751,804,28,25,9,13,13,15,389,325,601,839,546,822,10,18,8,12,9,10,273,199,615,859,628,762,8,18,8,3,8,13,309,367,685,625,630,1055,17,25,4,5,6,8,387,371,598,542,836,831,20,17,1,12,7,13,613,579,652,765,1051,658,28,17,23,12,21,12,357,387,953,850,594,1277,5,18,11,6,21,2,372,280,497,727,641,707,17,28,21,13,14,10,7 +334,314,556,936,676,727,4,19,17,11,13,5,225,321,625,845,607,1074,9,16,14,4,11,19,305,603,648,736,770,807,40,28,4,10,1,12,363,479,678,909,607,1006,28,32,14,17,13,9,318,532,650,839,713,826,41,32,4,14,14,12,406,510,507,691,742,796,40,26,9,12,7,10,238,422,742,754,598,1136,15,18,14,1,7,12,378,222,667,779,634,986,12,20,7,8,8,14,301,289,806,933,740,1074,22,9,6,1,13,9,587,497,506,689,639,831,32,24,34,14,14,10,366,450,396,682,577,793,31,19,14,18,10,16,432,378,591,1007,580,817,13,18,13,17,12,11,238,266,603,1019,634,763,11,18,11,2,11,16,180,314,613,749,606,1044,20,11,1,0,1,11,424,326,566,550,622,836,23,25,4,7,2,10,582,520,642,627,817,689,31,19,28,9,16,9,222,160,883,996,658,1276,2,8,6,1,16,5,421,397,493,901,759,752,20,24,18,14,15,13,7 +311,285,639,960,632,635,8,13,23,10,10,3,198,188,706,863,625,982,3,14,8,3,10,17,304,404,717,768,802,715,28,30,2,11,12,12,344,318,741,935,785,914,32,24,8,18,8,9,239,349,721,861,849,734,31,24,2,15,7,10,373,339,564,705,836,704,28,26,15,13,14,10,209,259,803,786,608,1050,7,22,8,0,10,14,313,109,740,811,510,894,4,22,1,7,7,12,192,166,859,963,756,982,16,13,0,0,0,7,518,374,601,723,837,743,26,22,34,13,17,10,307,357,489,706,729,705,23,25,20,17,13,16,419,263,686,1025,510,731,17,14,19,16,11,11,283,201,678,1051,596,671,13,14,17,1,10,14,187,217,694,781,666,958,12,15,7,1,12,9,411,249,623,588,758,744,17,31,10,8,11,12,513,491,719,631,977,599,23,15,34,8,15,11,199,213,972,1028,630,1186,14,14,0,2,3,3,364,306,562,919,675,668,16,28,18,15,16,11,7 +285,379,722,869,683,668,17,7,24,10,16,4,160,116,747,748,670,1035,12,24,7,3,12,18,252,276,702,661,767,748,19,20,3,3,6,11,356,178,828,882,752,945,29,18,9,8,6,10,259,185,808,838,796,767,34,24,3,5,7,11,339,285,661,738,803,749,35,16,16,5,6,9,189,247,880,701,661,1105,18,30,7,2,6,15,307,253,805,704,633,947,15,24,2,7,9,13,202,150,852,856,753,1029,7,21,3,0,6,8,510,336,682,758,814,758,37,22,31,13,11,9,305,399,548,689,714,766,34,19,21,17,9,15,399,349,767,906,567,786,26,14,20,16,15,10,271,263,737,944,629,724,20,20,18,1,14,15,159,291,703,710,705,1017,23,23,8,1,6,10,363,315,724,567,799,793,28,23,11,8,5,11,517,523,804,762,954,620,34,19,35,8,13,10,227,349,981,941,675,1241,23,20,1,2,9,4,328,296,639,786,690,677,25,24,15,11,14,12,7 +317,227,537,937,631,667,3,24,18,11,9,4,242,278,628,836,568,1036,8,15,13,4,7,16,304,498,663,749,797,747,39,25,3,14,5,9,424,438,653,900,600,946,27,25,13,17,17,12,387,473,631,828,716,766,40,25,3,16,18,9,427,413,484,676,737,746,39,23,10,16,11,9,269,365,727,761,573,1106,14,11,13,1,11,15,383,199,658,790,633,948,11,13,6,8,12,11,288,224,811,942,683,1030,21,12,5,3,17,8,612,414,487,682,692,771,31,25,31,14,18,9,357,393,411,675,598,761,30,16,15,18,12,13,425,291,572,1010,573,787,12,23,14,17,8,8,297,169,600,1030,587,719,10,23,12,2,7,13,191,289,630,752,577,1014,19,8,2,0,5,8,415,309,547,579,663,790,22,22,5,7,6,11,663,515,617,698,876,629,30,26,29,9,20,10,277,247,900,999,609,1242,3,11,5,1,20,2,368,326,488,900,704,692,19,17,15,14,15,10,7 +255,359,669,825,643,581,14,14,19,12,11,5,94,150,732,728,626,936,9,35,12,1,9,19,162,338,729,607,785,649,22,9,2,3,3,10,420,232,757,836,762,846,32,17,12,10,15,11,303,257,745,800,782,670,33,23,2,7,16,12,257,325,580,714,831,658,28,11,11,5,9,8,191,281,815,649,611,1004,9,33,12,4,9,14,229,185,764,650,581,846,6,23,5,3,10,14,264,168,873,802,733,928,10,26,4,4,15,9,436,404,647,756,810,681,28,25,30,9,16,8,253,393,537,655,710,683,25,20,16,13,10,14,369,321,732,870,543,691,21,19,15,12,10,9,291,241,716,890,599,641,11,23,13,3,9,16,147,221,708,664,661,912,14,28,3,5,3,11,257,249,645,551,797,694,19,12,6,12,4,10,471,539,751,768,998,549,25,20,30,12,18,9,333,299,994,887,635,1140,20,27,4,6,18,5,264,274,604,754,626,612,22,19,14,13,17,13,7 +207,239,652,806,656,661,5,10,19,12,7,7,192,240,717,733,647,1030,2,31,12,5,5,15,210,358,686,626,842,741,31,19,2,7,7,6,360,332,774,801,791,940,29,23,12,14,13,15,287,343,746,765,817,762,34,23,2,11,12,12,289,309,597,667,886,740,31,17,11,9,7,8,177,257,828,634,638,1100,10,27,12,2,7,16,307,155,757,653,600,942,7,29,5,9,6,14,274,212,824,805,756,1024,19,16,6,2,11,9,470,328,602,737,863,753,29,27,28,15,12,8,243,347,488,626,763,759,26,28,16,19,6,10,281,247,687,861,584,781,14,17,15,18,6,7,271,155,675,893,624,715,12,15,13,3,5,16,159,229,693,641,690,1012,15,28,3,1,7,11,293,261,662,558,848,788,20,16,6,8,8,10,527,469,738,775,1053,613,26,14,30,10,14,9,257,277,967,874,652,1236,11,17,4,0,14,5,306,252,561,741,645,672,13,29,14,13,13,13,7 +379,349,733,837,615,684,14,12,19,12,9,13,252,240,808,760,614,1053,11,21,12,5,11,19,284,372,705,627,773,764,22,19,2,5,13,12,356,322,851,828,694,963,32,25,12,8,9,11,299,349,831,756,742,783,37,25,2,5,8,18,365,317,706,654,825,763,38,17,11,7,15,10,203,241,941,657,659,1123,19,27,12,2,9,16,371,151,864,670,619,965,16,21,5,9,6,22,284,232,869,822,685,1047,10,18,4,2,1,15,526,308,683,664,834,776,38,17,36,15,16,10,323,263,595,621,728,778,35,16,16,19,14,16,421,273,768,898,585,804,23,19,15,18,10,11,283,277,732,910,583,736,21,19,13,3,11,24,167,95,758,660,687,1031,24,20,3,1,13,15,399,127,761,541,833,807,29,20,6,8,12,8,509,403,811,648,992,636,35,12,30,10,14,9,221,277,1036,901,609,1259,20,17,4,0,2,13,444,246,630,796,572,695,22,27,20,11,15,21,7 +332,332,676,942,654,670,10,11,27,9,9,10,251,113,751,837,663,1039,5,16,8,2,11,8,379,323,694,738,884,750,26,32,6,4,13,17,333,223,790,943,777,949,34,20,4,11,7,18,240,242,772,881,843,769,37,20,6,8,6,11,398,296,643,733,902,749,32,28,19,6,13,19,252,254,870,770,712,1109,13,24,4,1,9,15,302,218,793,781,658,951,10,30,3,6,6,3,149,121,846,933,744,1033,14,17,4,1,1,4,507,349,628,717,923,762,32,20,34,12,16,19,370,386,522,718,825,764,29,29,24,16,12,13,452,320,713,991,634,790,19,18,23,15,10,18,306,218,697,1021,628,722,15,14,21,0,11,5,284,254,725,775,750,1017,18,17,11,2,13,14,486,278,700,578,888,793,23,31,14,9,12,21,498,512,754,679,1093,622,29,17,38,9,14,20,190,306,997,1014,644,1245,16,16,4,3,2,10,347,305,583,875,609,681,18,28,20,14,15,2,7 +272,338,686,825,612,656,11,9,19,10,3,10,229,221,759,728,599,1025,8,32,12,3,5,20,229,357,670,625,760,736,25,18,2,3,15,11,329,311,804,834,703,935,35,24,12,10,13,12,258,332,784,802,737,755,40,26,2,7,14,17,264,284,651,692,806,737,35,16,11,5,15,9,142,236,884,653,596,1095,16,30,12,0,15,17,274,160,807,660,614,937,13,28,5,7,8,19,237,217,854,812,678,1019,13,17,6,0,9,12,425,333,634,746,785,748,35,28,28,13,8,9,188,296,536,647,691,754,32,25,16,17,10,15,280,268,719,868,544,776,20,16,15,16,4,10,322,254,699,900,584,712,18,16,13,1,5,21,148,140,723,662,636,1005,21,31,3,1,15,14,320,166,710,549,804,781,26,15,6,8,16,7,488,434,764,790,983,608,32,13,30,8,8,8,230,266,999,893,602,1231,17,18,4,2,8,10,303,261,589,746,583,667,19,26,14,13,17,18,7 +369,287,521,973,717,625,1,19,24,10,14,4,242,246,614,850,662,994,6,8,7,3,12,18,346,504,619,787,771,705,37,30,3,11,4,11,350,406,645,952,672,904,25,30,9,18,8,10,303,439,621,880,788,724,38,30,3,15,9,11,425,411,484,726,757,704,37,30,16,13,8,9,259,349,721,805,659,1064,12,16,7,0,6,15,349,167,648,830,683,906,9,12,2,7,7,13,214,180,785,982,765,988,19,7,3,0,8,8,594,452,465,730,690,717,29,16,31,13,13,9,371,445,391,725,630,719,28,21,21,17,13,15,493,343,550,1032,587,745,10,18,20,16,13,10,297,223,572,1070,659,677,8,12,18,1,12,15,229,315,610,798,671,972,17,9,8,1,4,10,437,343,547,579,661,748,20,27,11,8,3,11,583,529,595,624,850,577,28,21,35,8,15,10,189,143,878,1045,695,1200,5,6,1,2,11,4,358,386,458,908,744,636,17,22,15,15,16,12,7 +388,280,616,844,600,695,5,20,13,12,10,12,309,239,717,769,547,1064,4,15,18,5,8,20,325,487,656,646,704,775,31,27,8,9,6,11,417,369,740,817,629,974,29,29,18,16,18,12,404,422,718,753,677,794,36,29,8,13,19,17,442,366,595,647,732,774,31,25,5,11,12,9,268,356,830,670,540,1134,12,15,18,2,12,17,432,192,757,689,604,976,9,15,11,9,13,21,327,217,840,841,650,1058,19,8,10,2,18,14,633,425,558,647,685,787,31,25,30,15,19,9,338,350,488,622,595,789,28,18,10,19,13,15,440,298,643,919,546,815,14,19,9,18,9,10,324,186,641,929,572,747,12,21,7,3,8,23,176,208,699,667,552,1042,17,8,3,1,6,14,434,228,650,546,696,818,22,24,0,8,7,7,660,478,692,673,897,647,28,22,24,10,21,8,276,274,969,906,580,1270,11,9,10,0,21,12,417,263,525,821,613,706,13,21,20,13,14,20,7 +326,366,785,831,653,646,19,15,24,13,11,4,229,175,806,742,652,1015,14,26,11,2,9,18,337,259,717,611,819,726,17,18,3,2,11,11,359,179,889,850,706,925,27,12,11,3,1,12,290,210,873,808,766,745,32,18,3,2,2,11,406,248,732,706,861,725,33,14,16,4,9,13,246,230,945,663,715,1085,18,30,11,7,11,17,318,276,868,654,679,927,15,22,4,6,8,13,179,177,867,806,715,1009,5,25,3,1,1,6,547,267,737,718,882,738,37,22,37,12,14,13,338,338,611,659,778,742,34,25,21,16,12,15,452,306,822,872,655,766,28,16,18,15,12,12,292,258,780,894,623,698,20,28,18,0,9,15,234,242,746,678,739,995,23,27,8,6,11,10,448,252,795,521,883,771,28,21,11,11,10,15,564,460,855,718,1018,598,34,25,31,9,16,14,198,392,1026,901,643,1221,25,24,3,3,4,4,335,237,684,762,596,657,27,20,21,10,13,12,7 +369,317,598,1045,790,678,1,18,22,12,11,7,272,244,683,916,713,1047,6,9,11,5,9,17,328,518,686,849,754,758,37,29,1,9,11,8,338,400,712,1022,687,957,25,31,9,16,7,15,287,447,692,956,769,777,38,31,1,13,6,14,405,441,561,802,666,757,37,29,14,11,13,8,229,311,800,867,714,1117,12,17,9,2,11,16,365,169,725,892,690,959,9,19,2,9,8,16,236,212,848,1044,812,1041,19,6,1,2,1,9,564,452,550,762,671,770,29,17,39,15,18,8,321,437,454,795,633,772,28,20,19,19,12,12,465,371,635,1106,642,798,10,17,18,18,12,7,291,279,641,1132,694,730,8,13,16,3,9,18,197,287,669,862,714,1025,17,10,6,1,11,13,439,305,616,617,580,801,20,26,9,8,10,10,551,493,676,674,723,630,28,20,33,10,16,9,159,121,937,1109,764,1253,5,7,1,0,4,7,372,420,533,992,799,691,17,23,23,13,17,15,7 +313,375,711,801,599,625,12,10,19,11,9,13,220,194,790,702,582,994,7,33,12,4,7,19,194,320,717,605,731,705,24,17,2,4,5,12,378,274,819,804,676,904,34,21,12,11,17,11,305,305,801,768,696,726,37,23,2,8,18,18,293,297,668,670,785,704,32,15,11,6,11,10,153,225,907,637,573,1064,13,27,12,1,11,16,307,167,844,646,577,906,10,29,5,8,12,22,280,202,877,798,679,988,12,18,6,1,17,15,478,316,667,728,768,717,32,27,28,14,18,10,233,303,579,621,672,723,29,22,16,18,12,16,319,305,752,854,523,745,21,19,15,17,8,11,285,287,724,886,575,679,15,19,13,2,7,24,91,119,758,638,617,976,18,26,3,0,5,15,297,143,723,551,785,752,23,14,6,7,6,8,531,435,789,756,954,579,29,16,30,9,20,9,279,295,1032,873,595,1200,18,19,4,1,20,13,350,244,620,736,584,638,20,25,14,14,15,21,7 +372,280,628,1008,799,695,3,19,22,13,9,1,277,217,651,887,738,1064,8,8,11,6,11,15,387,461,662,808,769,775,39,28,1,6,13,12,355,367,754,989,772,974,27,30,9,13,5,9,292,376,722,921,834,794,40,30,1,10,4,8,452,356,561,775,753,774,39,26,14,8,11,10,274,316,780,828,723,1134,14,16,9,3,9,14,386,196,705,851,691,976,11,20,2,10,6,10,251,125,822,1003,845,1058,21,9,1,3,1,7,583,409,574,753,762,787,31,20,39,16,16,10,376,396,442,760,690,789,30,19,19,20,10,16,490,314,659,1063,645,815,12,18,18,19,10,11,278,224,663,1091,711,747,10,16,16,4,11,12,242,282,619,827,737,1042,19,9,6,2,13,7,502,306,632,592,653,818,22,25,9,9,12,12,568,480,714,665,850,647,30,21,33,11,14,11,158,148,893,1072,779,1270,3,8,1,1,2,3,425,401,549,947,810,706,19,22,23,12,15,9,7 +355,309,511,998,726,676,2,21,22,10,10,4,232,260,610,881,653,1045,7,8,9,3,10,16,338,554,645,804,752,756,38,28,1,13,12,15,348,440,633,965,629,955,26,28,9,18,10,12,329,511,609,895,737,775,39,28,1,17,9,9,421,461,476,741,712,755,38,26,14,15,16,13,269,377,717,818,648,1115,13,14,9,0,10,13,347,167,644,847,642,957,10,18,2,7,7,11,210,240,801,999,782,1039,20,9,1,2,0,10,586,474,455,719,617,770,30,20,37,13,17,13,367,455,393,736,597,770,29,19,19,17,15,19,493,361,540,1065,590,796,11,20,18,16,11,14,275,255,572,1087,658,728,9,16,16,1,10,13,239,295,614,811,652,1023,18,7,6,1,12,8,439,315,535,564,576,799,21,25,9,8,13,15,591,549,589,599,729,628,29,23,33,8,15,14,207,167,882,1058,706,1251,4,8,1,2,3,6,354,382,460,953,807,691,18,20,21,15,16,10,7 +297,301,774,730,615,679,15,17,17,15,10,8,240,266,799,639,600,1048,14,36,14,4,8,18,266,288,686,524,739,759,21,10,4,4,6,13,396,260,902,755,640,958,31,14,14,1,18,10,343,267,872,737,672,780,36,20,4,0,19,15,383,275,721,693,795,758,37,8,9,6,12,11,233,237,938,588,625,1118,22,28,14,9,12,15,359,251,861,557,641,960,19,16,7,8,13,17,274,252,850,705,661,1042,9,27,6,1,18,10,572,262,722,745,780,771,41,28,28,14,19,11,309,297,600,636,692,777,38,17,14,18,13,17,389,233,807,767,611,799,24,18,13,17,9,12,293,223,763,793,591,733,22,30,11,2,8,19,137,185,723,599,649,1030,27,29,1,8,6,14,375,199,792,552,827,806,32,7,4,9,7,11,615,421,858,801,954,631,38,23,28,11,21,10,253,379,1005,800,605,1254,21,26,6,5,21,8,336,194,669,651,578,690,23,18,16,10,14,16,7 +316,308,649,852,652,701,5,11,20,9,16,5,223,159,738,777,647,1070,4,22,11,2,12,17,345,407,685,638,810,781,31,22,1,4,6,12,359,287,771,849,793,980,29,18,11,11,6,13,372,294,745,791,825,800,36,22,1,8,7,10,416,370,622,673,840,780,31,18,12,6,12,14,310,318,853,672,650,1140,12,26,11,1,6,18,326,222,778,681,558,982,9,26,4,6,13,12,269,183,835,833,754,1064,19,23,3,1,6,5,577,403,599,709,863,793,31,18,39,12,13,14,404,436,509,632,755,795,28,21,17,16,17,14,472,348,684,907,558,821,14,20,16,15,17,13,244,206,668,921,602,753,12,20,14,0,14,14,288,288,718,679,700,1048,17,19,4,2,6,9,444,316,677,514,804,824,22,25,7,9,5,16,588,560,735,675,1011,653,28,19,31,9,19,15,256,324,988,914,648,1276,11,22,3,3,9,5,345,273,556,789,637,712,13,22,23,14,14,11,7 +324,346,694,923,680,700,12,9,23,11,9,2,211,139,763,818,677,1069,9,18,10,4,11,16,327,299,688,713,774,780,24,26,2,4,13,13,353,199,812,926,747,979,34,20,8,9,7,10,284,228,790,872,799,799,39,22,2,6,6,9,396,284,659,736,788,779,36,22,15,6,13,11,234,256,888,747,678,1139,17,26,8,1,9,15,336,210,811,756,636,981,14,30,1,8,6,11,221,151,866,908,734,1063,12,19,0,1,1,8,551,347,640,730,831,792,36,20,38,14,16,11,336,368,542,713,731,794,33,25,20,18,12,17,438,310,725,974,572,820,21,18,19,17,10,12,274,236,705,996,614,752,19,18,17,2,11,13,216,232,721,754,720,1047,22,19,7,0,13,8,440,256,718,571,790,823,27,29,10,7,12,13,556,502,770,710,963,652,33,17,34,9,14,12,194,322,999,989,664,1275,18,18,0,1,2,4,377,275,597,862,643,711,20,26,22,12,15,10,7 +243,329,727,749,611,636,16,14,19,12,11,5,150,238,804,670,610,1005,11,39,12,1,9,19,202,286,717,539,807,716,20,11,2,1,3,10,404,244,831,772,706,915,30,11,12,4,15,11,347,251,815,754,754,735,35,17,2,3,16,12,337,289,678,680,859,715,34,9,11,3,9,10,235,245,913,587,655,1075,15,31,12,6,9,16,287,275,852,570,637,917,12,23,5,5,10,14,244,240,873,722,687,999,8,26,4,2,15,7,522,270,689,756,838,728,34,27,30,11,16,10,321,347,581,617,740,730,31,24,16,15,10,14,365,267,774,790,595,756,25,15,15,14,10,9,277,251,740,810,603,688,17,27,13,1,9,16,181,233,758,602,685,983,20,32,3,5,3,11,327,259,737,527,859,759,25,8,6,12,4,12,567,471,807,780,1030,588,31,26,30,10,18,11,287,395,1036,817,607,1211,22,25,4,4,18,5,276,214,640,680,568,647,24,19,14,11,17,13,7 +251,401,707,805,659,644,14,20,22,12,14,10,154,202,772,712,648,1013,9,33,9,1,12,20,252,262,711,579,749,724,22,11,1,1,0,11,366,150,821,828,732,923,32,9,9,4,12,12,345,213,801,794,758,745,37,11,1,5,13,17,333,311,674,722,795,723,36,7,14,1,6,9,237,245,903,639,645,1083,17,25,9,6,6,17,307,299,826,622,573,925,14,21,2,3,7,19,256,224,879,774,731,1007,10,32,1,4,12,12,516,288,661,776,816,736,36,29,33,9,13,9,331,409,559,661,706,742,33,22,19,13,11,15,387,319,746,840,567,764,23,21,18,12,13,10,291,311,730,862,597,698,19,33,16,3,12,21,217,287,728,656,691,995,22,26,6,5,0,16,345,309,729,537,795,771,27,14,9,12,1,9,543,527,787,786,962,596,33,32,33,12,15,8,281,417,1006,873,657,1219,20,31,1,6,15,10,300,232,616,724,632,655,22,17,17,13,16,18,7 +261,275,612,834,633,693,4,15,16,10,10,8,212,220,713,761,600,1062,3,28,15,3,8,16,234,470,674,628,723,773,32,20,5,7,4,7,360,356,734,821,714,972,28,24,15,14,16,14,317,395,712,767,750,792,35,24,5,11,17,15,349,347,579,649,773,772,32,18,8,9,10,7,197,351,818,652,571,1132,11,22,15,0,10,17,355,187,751,671,581,974,8,24,8,7,11,17,284,202,842,823,711,1056,20,17,7,0,16,10,538,410,558,691,744,785,30,22,33,13,17,7,315,355,484,606,644,787,27,21,13,17,11,11,351,303,643,901,535,813,13,16,12,16,9,6,255,179,641,911,593,745,11,16,10,1,8,19,151,205,693,653,611,1040,16,21,0,1,4,14,345,231,638,528,733,816,21,17,3,8,5,9,583,495,690,697,936,645,27,15,27,8,19,8,251,265,965,896,621,1268,10,16,7,2,19,8,350,280,529,801,636,704,12,28,17,15,16,16,7 +282,304,689,791,586,624,10,7,20,9,12,8,203,199,776,660,579,989,5,28,11,2,10,18,227,353,705,593,802,704,26,20,3,4,8,9,397,285,797,796,709,899,34,22,15,11,20,14,322,312,779,756,741,725,35,24,3,8,21,15,354,284,648,680,850,705,30,18,12,6,14,9,210,260,887,641,592,1059,11,28,11,1,14,19,320,190,822,638,598,901,8,28,8,6,15,17,251,185,859,786,682,983,14,15,9,1,20,10,541,317,641,722,813,712,30,24,25,12,21,9,316,342,551,633,731,728,27,21,17,16,15,13,374,254,726,834,556,740,19,16,16,15,11,8,302,204,700,874,594,684,13,20,14,0,10,19,142,196,752,634,634,977,16,21,4,2,8,14,342,226,703,583,836,753,21,17,7,9,9,11,574,466,763,772,1027,576,27,15,31,9,23,10,282,318,1024,865,580,1197,16,16,5,3,23,8,331,245,594,710,565,631,18,28,13,14,14,16,7 +281,379,916,781,691,719,25,30,22,10,13,4,172,284,839,658,696,1042,20,23,13,13,9,10,268,152,788,579,881,793,11,15,15,3,9,11,334,166,1030,834,636,910,21,17,19,0,3,10,229,223,998,808,718,814,26,19,15,1,4,3,331,211,825,740,943,806,27,13,28,5,9,9,169,219,982,637,821,1106,28,15,13,18,9,13,295,351,927,594,875,976,25,11,12,9,12,7,166,298,854,746,691,1054,7,20,13,4,3,8,498,162,876,748,906,783,35,23,25,13,6,9,275,235,728,681,850,829,36,16,29,17,14,15,395,257,961,796,819,821,34,21,18,16,14,10,267,321,897,834,769,785,30,31,16,7,11,7,159,281,733,666,821,1074,33,16,20,17,9,4,371,261,886,595,1013,852,38,12,23,10,8,11,495,351,1006,860,1036,673,36,30,29,10,12,10,183,469,1001,861,655,1250,31,21,13,14,6,4,316,266,819,660,602,636,23,9,17,9,15,8,7 +293,351,770,751,605,620,20,12,18,10,10,10,178,270,829,666,596,989,15,35,13,3,8,18,190,256,736,551,745,700,16,13,3,3,4,9,406,248,864,766,662,899,26,17,13,6,16,14,287,227,850,742,694,719,31,23,3,3,17,17,309,251,705,680,799,699,32,11,10,5,10,7,159,239,940,589,613,1059,17,27,13,4,10,19,305,257,885,582,613,901,14,21,6,7,11,19,256,240,896,734,669,983,4,24,5,0,16,12,494,220,740,748,788,716,36,29,29,13,17,7,251,259,628,613,692,714,33,16,15,17,11,13,351,273,825,796,577,740,29,19,14,16,9,8,289,279,787,822,579,672,19,25,12,1,8,21,81,157,779,598,647,967,22,28,2,3,4,16,293,165,762,547,817,743,27,10,5,10,5,9,547,381,850,780,964,574,33,20,29,8,19,8,289,387,1059,821,599,1195,26,23,5,2,19,10,318,192,689,690,570,637,28,21,15,9,16,18,7 +306,356,911,727,678,696,26,25,21,11,14,5,177,311,822,638,669,1065,23,28,18,12,12,17,197,217,773,541,866,776,12,14,12,2,6,14,317,249,1025,774,675,975,20,20,18,1,6,7,248,252,989,754,753,795,25,24,12,2,7,12,248,232,818,708,908,775,26,12,25,4,6,12,120,242,963,577,770,1135,31,20,18,17,6,10,272,292,904,536,798,977,28,10,11,8,13,14,221,301,835,686,714,1059,8,23,12,3,6,11,427,175,873,762,865,788,34,24,28,14,7,12,212,200,725,643,803,792,35,15,24,16,11,18,346,258,958,754,762,816,35,20,15,15,13,13,252,288,890,774,726,750,33,30,13,6,14,16,130,206,716,606,776,1043,36,21,17,16,6,11,308,186,873,577,938,819,41,11,20,11,5,10,436,316,1007,844,963,648,35,27,24,11,9,11,236,444,984,801,658,1271,32,22,10,13,9,5,331,277,816,622,661,707,22,14,18,10,12,13,7 +312,294,670,826,631,673,13,14,15,11,10,7,237,211,757,741,602,1042,8,25,16,4,8,19,305,371,686,624,713,753,23,21,6,4,4,10,407,289,782,813,704,952,33,21,16,11,16,13,344,318,762,761,718,772,38,23,6,8,17,14,422,292,629,663,765,752,33,17,7,6,10,10,244,274,868,652,583,1112,14,23,16,1,10,18,398,206,805,667,591,954,11,25,9,8,11,16,271,193,868,819,695,1036,11,18,8,1,16,9,617,325,620,681,750,765,33,21,32,14,17,10,362,320,536,624,650,767,30,24,12,18,11,14,416,248,705,889,547,793,22,17,11,17,9,9,282,198,691,907,581,725,16,17,9,2,8,18,166,172,723,657,621,1020,19,18,1,0,4,13,422,198,684,540,753,796,24,24,2,7,5,12,628,446,746,693,932,625,30,16,26,9,19,11,232,330,999,894,621,1248,19,17,8,1,19,7,377,231,579,787,614,686,21,29,18,14,16,15,7 +332,350,650,963,663,660,9,13,25,10,9,6,219,163,757,852,656,1029,4,16,6,3,11,14,329,309,696,765,779,740,27,30,4,5,13,15,347,241,766,954,784,939,33,20,6,12,11,14,250,276,748,868,818,759,36,22,4,9,10,9,378,296,621,730,799,739,31,26,17,7,17,13,214,210,860,791,649,1099,12,24,6,0,9,13,308,162,799,808,577,941,9,28,1,7,6,11,221,163,872,960,749,1023,15,19,2,0,1,12,523,327,600,738,840,752,31,18,34,13,16,13,346,364,530,719,736,754,28,27,22,17,16,17,454,270,685,1016,545,780,18,18,21,16,10,14,272,260,679,1048,605,712,14,14,19,1,11,13,220,196,733,792,701,1007,17,17,9,1,13,10,438,222,676,621,785,783,22,31,12,8,14,13,506,488,726,684,982,612,28,17,36,8,14,12,218,296,1005,1035,653,1235,15,18,2,2,2,10,371,261,561,898,650,671,17,28,18,15,15,10,7 +320,346,697,886,660,654,9,8,22,10,13,5,167,185,756,769,635,1017,4,31,9,3,11,19,171,377,741,682,748,734,27,17,1,3,1,12,357,297,797,887,747,927,33,23,9,10,13,9,286,296,777,835,785,753,32,29,1,7,14,12,258,314,618,731,786,735,27,19,14,5,7,10,140,312,853,714,616,1087,8,33,9,0,7,12,280,204,794,725,616,929,5,27,2,7,8,14,263,169,881,877,732,1011,15,20,3,0,13,13,453,405,661,735,765,748,27,23,31,13,14,10,252,384,539,690,673,752,24,22,19,17,10,16,358,332,746,933,544,770,18,17,18,16,12,11,264,230,736,965,616,710,12,15,16,1,11,16,124,266,734,719,658,1003,13,26,6,1,1,11,272,278,681,560,754,779,18,18,9,8,2,8,458,516,779,733,943,614,24,14,33,8,16,9,294,222,1010,958,644,1225,15,19,1,2,16,5,337,373,620,815,681,669,17,27,15,13,15,13,7 +254,218,617,793,640,626,9,13,22,9,9,2,225,221,616,698,661,951,4,20,21,2,7,16,313,453,683,609,1020,704,27,24,11,12,5,15,345,369,709,772,855,905,33,24,21,19,17,10,226,382,685,706,951,725,28,24,11,16,18,9,366,322,506,572,1064,685,27,20,14,14,11,13,268,380,729,617,724,1011,2,22,21,1,11,9,384,248,662,644,722,863,1,22,14,6,12,11,329,187,805,794,776,957,21,13,13,1,17,10,517,397,593,616,995,746,19,22,35,12,18,13,398,336,443,545,905,668,18,25,19,16,12,19,314,266,678,860,678,692,16,14,10,15,8,14,240,132,684,882,744,642,12,14,10,0,7,13,234,268,592,612,766,921,7,15,6,2,5,8,416,278,565,527,974,723,10,27,9,9,6,13,464,468,707,656,1197,598,18,15,21,9,20,12,360,310,874,859,634,1149,15,14,13,3,20,6,379,299,586,750,659,679,17,28,19,16,15,10,7 +308,316,658,869,672,655,11,21,18,11,14,11,229,231,713,784,607,1024,6,24,13,4,12,19,203,419,704,667,722,735,25,26,3,4,0,10,357,347,766,864,655,934,31,32,13,11,12,11,300,342,746,816,665,754,32,32,3,8,13,16,286,334,601,686,702,734,31,24,10,6,6,8,140,318,840,695,602,1094,12,18,13,1,6,16,330,194,769,710,636,936,9,18,6,8,7,20,287,163,862,862,698,1018,13,11,5,1,12,13,469,369,616,684,699,755,31,24,33,14,13,8,230,358,510,655,593,749,28,17,15,18,7,14,300,308,701,930,598,775,20,20,14,17,13,9,278,214,689,950,600,707,14,18,12,2,12,22,104,244,679,696,610,1002,17,17,2,0,0,13,308,256,656,517,692,778,22,23,5,7,1,6,510,424,738,712,859,611,28,19,29,9,15,7,266,180,953,937,648,1230,17,10,5,1,15,11,351,377,587,828,669,678,19,24,17,14,14,19,7 +341,345,760,829,638,669,14,10,22,11,17,12,224,208,789,736,631,1038,11,29,9,4,15,18,228,328,692,623,742,749,22,17,1,4,3,13,354,282,880,830,705,948,32,23,9,7,9,10,281,307,856,772,737,768,37,25,1,4,10,19,301,289,703,664,786,748,38,15,14,6,7,11,151,193,922,657,644,1108,19,29,9,3,3,15,345,135,845,666,584,950,16,21,2,8,10,21,268,192,842,818,706,1032,10,20,1,1,9,14,502,288,708,724,811,761,38,23,33,14,10,11,241,277,582,627,701,763,35,14,19,18,12,17,347,261,793,880,574,789,23,19,18,17,16,12,287,265,749,906,578,721,21,21,16,2,15,23,111,147,739,662,682,1016,24,22,6,2,3,16,341,177,774,541,794,792,29,14,9,9,2,9,501,411,838,716,949,621,35,14,33,9,14,10,239,255,1017,901,634,1244,20,19,1,1,12,12,364,274,655,774,605,680,22,25,17,10,13,20,7 +279,411,764,780,684,683,22,23,20,13,17,2,166,172,739,705,673,1052,19,30,11,2,15,16,282,274,714,554,790,763,14,12,1,0,3,13,372,158,884,805,751,962,24,4,11,3,9,10,343,223,854,779,783,782,29,10,1,4,10,9,367,347,685,701,834,762,30,8,12,2,3,11,255,273,872,612,668,1122,27,22,11,7,3,11,299,323,801,595,622,964,24,20,4,4,10,11,268,192,840,747,760,1046,4,33,3,3,9,8,552,328,714,761,837,775,38,26,33,10,10,11,355,435,574,644,735,777,39,21,17,14,8,17,413,365,799,815,606,803,31,24,16,13,16,12,245,311,769,835,640,735,29,32,14,2,15,13,237,325,685,633,714,1030,32,27,4,6,3,8,395,347,750,510,836,806,37,15,7,13,2,13,573,555,844,769,949,635,39,33,31,11,12,12,257,403,967,846,682,1258,28,34,3,5,12,4,334,280,671,711,693,694,26,10,17,12,11,10,7 +303,315,560,937,698,704,3,18,21,9,16,4,208,192,667,826,671,1071,8,15,10,2,14,16,322,482,656,737,746,784,39,29,0,8,2,11,352,330,690,930,761,981,27,23,10,15,10,12,351,379,664,876,843,803,40,23,0,12,11,9,407,427,545,730,784,785,39,25,13,10,12,13,277,383,780,761,648,1141,14,17,10,1,4,17,333,247,705,780,626,983,11,19,3,6,9,11,268,182,830,932,782,1065,21,14,2,1,10,6,588,476,498,736,787,794,31,21,36,12,13,13,401,479,440,713,701,802,30,22,18,16,17,15,437,373,583,992,554,822,12,17,17,15,15,12,219,245,603,1020,646,760,10,17,15,0,14,13,257,313,661,762,686,1053,19,10,5,2,2,8,443,349,600,561,720,829,22,28,8,9,3,15,597,605,638,698,941,656,30,20,32,9,19,14,259,273,927,1005,684,1277,3,13,2,3,13,4,354,348,483,878,723,713,19,23,20,16,14,10,7 +330,382,657,845,668,676,10,18,21,10,12,8,223,201,722,748,639,1045,9,27,10,1,10,14,327,323,667,629,718,756,26,19,0,1,2,11,415,207,785,860,739,955,34,15,10,8,14,18,378,274,761,818,755,775,41,15,0,5,15,13,422,380,622,716,768,755,36,15,13,3,8,13,284,270,851,675,618,1115,17,29,10,2,8,15,362,276,774,672,602,957,14,25,3,5,9,13,241,223,855,824,736,1039,14,30,2,2,14,6,609,357,595,742,771,768,36,23,32,11,15,13,392,454,503,673,665,772,33,28,18,15,9,9,444,332,680,886,562,796,19,19,17,14,11,12,286,288,670,912,614,728,17,27,15,1,10,15,250,284,686,688,658,1025,22,22,5,3,2,14,446,314,687,523,762,801,27,22,8,10,3,15,634,576,733,736,937,628,33,30,32,10,17,14,274,386,962,913,656,1251,16,29,2,4,17,4,349,217,558,772,653,687,18,23,16,11,16,12,7 +253,265,894,676,650,669,22,22,13,11,3,3,216,374,853,583,637,1014,19,27,20,12,3,17,228,246,778,568,816,749,14,23,12,4,11,10,326,310,1014,727,617,924,24,25,24,1,9,11,277,335,984,743,691,770,29,27,12,0,8,10,293,287,815,737,868,750,30,21,19,6,11,8,147,263,992,556,742,1084,27,23,20,17,11,14,289,295,927,509,792,938,24,15,17,8,4,12,232,348,868,641,672,1016,4,12,18,3,9,11,476,178,848,801,831,745,38,15,30,14,8,8,245,183,704,668,763,773,39,24,20,18,6,14,323,177,933,697,748,779,31,13,9,17,2,9,267,243,871,729,712,729,29,25,7,6,3,14,123,207,747,589,744,1022,32,24,11,16,11,9,331,197,882,626,924,798,37,20,14,9,12,8,523,253,984,895,973,621,39,22,22,9,10,7,227,425,1001,752,628,1238,28,13,14,13,10,3,298,304,791,565,615,656,26,17,10,10,13,11,7 +265,231,611,797,607,666,3,21,18,11,11,4,252,246,672,684,622,1007,2,26,13,4,9,10,326,388,691,641,953,746,33,20,5,12,7,11,436,358,727,782,798,933,27,18,17,17,19,10,353,365,699,724,880,767,34,20,5,16,20,3,411,361,546,632,995,739,33,16,10,14,13,11,309,369,779,637,663,1077,8,18,13,1,13,13,407,311,706,656,673,925,5,22,10,8,14,5,346,242,837,806,735,1005,21,23,11,1,19,6,590,366,567,690,926,762,25,22,23,14,20,11,385,407,447,599,846,748,24,21,15,18,14,15,383,285,652,850,625,766,12,22,14,17,10,10,285,179,654,894,685,706,10,20,12,2,9,7,267,347,662,632,707,999,13,19,4,0,7,6,413,351,611,593,925,777,16,23,5,7,8,13,611,525,697,750,1142,630,24,19,29,9,22,12,375,377,936,867,603,1221,9,22,7,1,22,4,406,312,542,728,628,679,13,24,15,14,13,6,7 +297,307,563,936,670,662,2,20,18,9,10,8,188,286,652,849,599,1031,7,17,13,2,8,18,240,574,671,740,736,742,38,27,3,10,4,13,380,446,675,915,597,941,26,33,13,17,16,8,301,497,649,853,709,761,39,33,3,14,17,15,349,483,508,705,710,741,38,25,10,12,10,11,189,405,751,758,594,1101,13,19,13,1,10,13,345,215,684,783,630,943,10,19,6,6,11,17,258,244,825,935,718,1025,20,10,5,1,16,10,546,478,525,701,627,762,30,23,33,12,17,11,293,463,435,692,551,756,29,18,15,16,11,17,377,379,610,1009,574,782,11,19,14,15,9,12,271,253,626,1023,614,714,9,17,12,0,8,19,129,313,650,755,600,1009,18,12,2,2,4,14,351,341,563,550,618,785,21,24,5,9,5,9,557,497,653,649,805,618,29,18,29,9,19,10,261,141,920,1000,648,1237,4,9,5,3,19,8,360,392,518,907,719,685,18,25,17,16,16,16,7 +313,245,666,847,611,655,6,15,20,11,10,7,224,238,733,752,646,1024,3,20,15,4,10,19,342,412,690,655,959,735,30,26,7,8,12,10,354,370,786,832,768,934,30,24,15,15,6,13,217,379,766,764,868,754,35,26,7,12,5,14,365,315,621,640,1009,734,30,22,20,10,12,10,233,285,848,675,731,1094,11,26,15,1,10,18,337,155,771,698,729,936,8,26,8,8,7,16,256,214,836,850,709,1018,18,19,9,1,0,9,506,328,610,646,964,747,30,18,33,14,17,10,383,281,504,617,876,749,27,25,23,18,11,14,423,233,695,910,689,775,15,18,12,17,11,9,257,169,685,938,715,707,13,14,10,2,10,18,231,169,713,672,765,1002,16,19,12,0,12,13,445,193,690,561,973,778,21,29,15,7,11,12,485,415,740,650,1172,607,27,13,27,9,15,11,265,263,985,919,607,1230,12,18,7,1,3,7,376,264,567,802,558,666,14,28,17,14,16,15,7 +311,311,636,896,666,657,9,19,17,11,14,10,210,240,727,821,609,1026,4,16,14,4,12,18,254,470,706,694,674,737,27,28,4,8,0,13,368,354,734,875,669,936,33,32,14,15,12,10,289,395,718,811,723,756,32,32,4,12,13,17,349,381,573,691,694,736,27,26,9,10,8,11,187,343,812,716,596,1096,8,18,14,1,6,15,355,195,757,737,610,938,5,20,7,8,7,19,248,192,874,889,712,1020,15,9,6,1,12,12,540,428,598,709,655,753,27,24,36,14,13,11,287,383,516,664,567,751,24,19,14,18,13,17,389,321,683,967,550,777,18,18,13,17,13,12,279,221,679,977,608,709,12,18,11,2,12,21,125,225,717,713,610,1004,13,11,1,0,0,16,361,247,628,518,630,780,18,25,4,7,1,9,537,465,712,643,833,611,24,19,28,9,15,10,243,197,997,958,646,1232,15,8,6,1,15,10,354,330,565,867,677,676,17,24,20,14,16,18,7 +296,392,703,896,735,665,19,10,23,10,10,6,207,99,704,803,712,1034,16,23,8,3,10,18,319,277,695,682,761,745,17,23,2,3,12,9,311,165,829,903,768,944,27,15,8,6,2,12,254,198,799,855,784,766,32,23,2,3,1,13,376,320,640,733,767,744,33,19,15,5,8,9,220,252,841,724,695,1104,24,31,8,4,10,17,326,226,768,725,617,946,21,27,1,7,7,15,197,141,829,877,799,1028,5,22,0,0,0,8,527,353,653,761,838,757,41,21,36,13,15,9,346,394,521,698,726,763,40,22,20,17,11,13,442,354,738,945,593,785,28,13,19,16,11,8,256,278,720,965,665,719,26,23,17,1,10,17,218,238,654,731,739,1016,29,24,7,3,12,12,428,264,709,550,781,792,34,24,10,10,11,11,520,524,791,739,912,617,40,22,34,8,15,10,170,330,932,964,727,1240,25,21,0,2,3,6,355,283,612,835,714,676,27,25,20,9,12,14,7 +271,313,821,708,613,646,21,17,14,14,8,4,220,284,802,657,600,1015,18,32,17,5,6,18,280,242,731,544,765,726,15,18,7,3,6,9,442,242,935,745,616,925,25,18,17,0,12,12,361,239,911,735,648,747,30,24,7,1,13,11,363,255,760,681,821,725,31,16,6,5,6,11,241,239,943,554,657,1085,26,28,17,10,6,17,299,295,876,533,685,927,23,20,10,7,7,13,238,266,849,677,659,1009,3,19,11,0,12,6,528,212,775,761,804,738,39,20,23,13,13,11,265,267,643,616,724,744,40,21,11,17,7,13,355,231,860,739,643,766,30,18,10,16,7,10,331,255,810,765,625,700,28,24,8,1,6,15,169,213,718,581,671,997,31,29,4,9,6,10,369,211,829,558,871,773,36,15,1,10,7,13,609,393,903,835,952,600,40,19,25,12,15,12,273,417,1002,778,605,1221,27,18,9,6,15,4,266,222,720,615,576,659,27,22,19,9,14,12,7 +292,322,638,828,571,611,12,17,18,12,9,5,199,163,613,731,550,896,11,30,13,5,7,13,161,365,712,692,847,671,24,14,5,15,5,12,407,265,736,787,702,874,26,20,17,16,17,9,318,288,708,725,788,700,25,20,5,15,18,6,234,310,529,653,885,646,24,14,10,17,11,10,176,290,728,662,551,968,5,22,13,2,11,12,304,194,657,689,579,808,8,22,10,9,12,12,363,159,808,839,697,898,26,21,11,4,17,13,425,369,612,759,820,733,16,24,23,15,18,10,258,344,458,640,734,633,15,23,15,19,12,16,296,302,697,889,537,645,9,20,14,18,8,11,282,216,705,927,593,599,5,18,12,3,7,10,156,176,589,659,591,882,4,23,4,1,5,5,224,194,588,630,795,680,7,17,5,8,6,8,474,490,732,787,1020,597,15,17,29,10,20,9,392,280,867,892,567,1102,18,22,7,0,20,5,379,297,603,755,640,664,24,24,15,13,15,13,7 +318,412,583,932,732,716,2,19,24,14,13,12,285,177,688,797,699,1085,3,22,15,3,9,10,419,443,663,714,762,796,34,28,3,3,9,19,373,259,715,941,811,995,26,20,7,10,5,20,390,326,687,885,865,815,35,18,3,7,4,13,422,488,568,759,732,795,34,26,16,5,11,21,334,340,801,756,670,1155,9,30,7,6,9,17,302,254,726,757,602,997,6,30,0,1,10,5,221,241,829,911,822,1079,20,23,1,6,3,4,555,497,527,779,813,808,28,16,37,11,18,21,396,556,461,722,723,810,25,25,21,11,14,15,474,472,612,947,574,836,11,16,20,10,14,20,308,336,620,997,662,768,9,14,18,5,11,7,376,352,682,771,710,1063,14,27,8,7,9,16,494,382,625,552,664,839,19,25,11,12,8,23,572,696,667,719,903,668,25,23,35,14,18,22,286,318,948,994,720,1291,8,28,1,8,6,12,311,333,498,845,749,727,14,22,27,11,15,4,7 +349,319,765,844,614,641,17,12,21,13,12,7,224,186,816,715,613,1008,12,25,10,6,10,19,264,304,737,644,786,721,19,23,0,6,2,12,432,242,867,843,703,918,29,23,12,9,14,9,315,251,849,795,751,740,34,23,0,6,15,14,375,223,704,701,836,722,33,21,13,8,8,10,197,227,937,674,620,1078,14,23,10,3,8,14,331,197,870,687,614,920,11,25,5,10,9,16,276,146,881,839,688,1002,7,14,6,3,14,11,562,294,733,709,807,731,33,23,28,16,15,10,291,291,607,660,717,741,30,22,18,20,9,16,413,265,818,889,582,759,26,19,17,19,11,11,329,217,782,927,596,699,16,19,15,4,10,18,105,205,766,681,666,990,19,18,5,2,2,13,359,219,763,576,830,766,24,20,8,9,3,8,585,423,851,745,989,593,30,14,32,11,17,9,273,315,1046,916,610,1214,23,13,2,1,17,7,364,294,682,767,617,650,25,29,12,12,16,15,7 +322,462,876,1071,719,742,25,23,26,12,14,10,239,215,731,952,762,947,26,28,21,21,10,8,213,219,784,879,967,734,15,10,31,1,12,19,221,193,988,1158,724,663,21,16,21,2,0,2,234,210,950,1170,802,627,26,22,31,3,1,11,162,246,781,1090,1029,839,27,12,30,3,8,21,214,226,896,961,851,923,34,26,21,20,8,1,240,266,839,868,885,827,31,18,28,17,11,13,323,219,846,1016,761,845,7,29,29,12,2,18,203,227,842,920,1004,696,35,18,9,15,1,13,260,266,692,1035,946,906,36,15,27,15,11,19,368,376,927,1024,831,784,34,24,32,14,9,16,314,382,871,1104,815,814,32,30,32,15,10,11,294,190,641,1018,887,997,39,25,36,19,12,12,208,188,832,835,1097,825,44,13,37,12,11,19,222,392,976,1062,1116,674,36,21,37,12,7,20,336,398,857,1135,703,969,31,36,29,18,7,14,315,253,785,904,602,561,23,12,19,11,12,14,8 +410,432,1173,671,619,912,36,11,12,11,9,11,359,531,862,624,660,867,31,30,37,22,13,11,309,201,955,595,1057,874,16,20,29,2,11,2,227,283,1159,752,852,1009,12,36,37,1,3,9,224,280,1139,780,968,825,1,36,29,2,4,10,228,366,998,774,1099,837,0,24,20,4,11,0,308,438,993,563,739,839,25,38,37,19,9,4,338,562,970,456,755,845,28,26,30,18,12,16,419,571,799,602,751,923,28,15,29,13,15,17,163,221,1175,832,1022,984,8,18,23,14,2,0,344,330,1021,703,942,790,9,21,15,16,8,6,370,348,1260,698,713,836,27,16,16,15,8,1,374,494,1158,690,781,746,29,12,18,16,11,14,402,470,768,634,783,709,20,31,28,18,11,9,272,456,1001,629,1007,863,17,17,25,11,10,2,160,180,1241,902,1234,898,9,1,5,11,4,1,416,614,908,737,611,971,42,16,29,17,16,9,363,515,1118,540,630,939,20,28,23,10,13,17,8 +275,349,743,765,660,736,24,23,20,2,10,12,378,258,526,662,701,881,23,10,21,9,14,8,334,262,727,687,1098,754,26,34,39,15,10,5,316,216,795,860,893,831,14,22,29,12,2,2,305,233,761,890,1009,753,17,12,39,11,3,11,259,253,606,874,1140,763,16,30,30,17,10,13,367,267,689,675,780,901,17,12,29,8,10,1,353,327,624,566,796,807,20,16,36,13,13,13,498,248,717,702,792,913,36,25,37,8,10,14,232,240,731,820,1063,788,8,12,1,5,3,3,333,301,577,803,983,714,7,21,27,9,9,5,275,275,816,752,754,676,15,26,30,10,9,2,419,263,806,790,822,700,17,16,30,7,12,11,447,257,488,740,824,915,12,11,42,9,10,12,295,243,631,665,1048,783,9,31,37,8,9,13,195,423,837,950,1275,720,7,25,29,2,5,10,523,445,724,839,652,1011,26,24,37,10,15,14,352,236,724,608,671,641,16,18,21,15,14,14,8 +336,388,901,736,680,850,27,23,22,5,9,13,389,391,622,651,721,899,22,12,23,16,15,11,333,187,735,628,1118,830,25,32,39,8,11,2,267,231,927,821,913,915,15,20,29,11,1,1,286,266,897,843,1029,843,10,10,39,12,2,8,248,374,750,813,1160,789,9,28,32,10,9,8,372,374,789,628,800,823,16,12,29,13,9,4,348,470,748,529,816,823,19,16,36,16,12,16,491,467,745,675,812,931,37,27,37,13,9,17,171,163,895,831,1083,920,1,12,1,8,2,0,344,302,741,744,1003,716,0,21,29,6,10,6,298,316,980,741,774,770,18,28,30,7,8,1,420,452,912,763,842,690,20,18,30,14,13,14,464,374,550,691,844,793,11,11,44,12,11,9,296,356,765,622,1068,829,8,31,39,5,10,8,126,248,985,907,1295,834,0,27,29,5,4,5,502,596,764,810,672,925,33,26,37,13,14,11,369,387,876,587,691,841,13,18,21,12,13,17,8 +375,469,1003,753,646,876,38,32,26,13,10,15,288,310,744,642,687,943,33,19,23,18,14,9,248,130,811,643,1084,868,14,27,33,0,10,2,274,158,1047,836,879,963,14,13,23,3,2,1,199,137,1019,856,995,901,1,5,33,4,3,10,209,263,858,822,1126,831,2,23,36,2,10,10,245,375,923,639,766,901,27,11,23,21,10,2,303,507,876,552,782,873,30,21,30,14,13,14,366,380,771,702,778,987,26,34,31,9,10,15,276,240,995,798,1049,940,10,21,7,16,3,2,309,351,841,757,969,706,11,22,33,14,9,4,291,385,1080,756,740,790,29,29,36,13,9,1,351,489,978,790,808,734,31,25,34,12,12,12,335,389,668,704,810,893,22,18,38,20,10,11,295,381,883,637,1034,873,19,24,41,13,9,10,207,339,1093,922,1261,870,11,34,35,13,5,7,391,615,876,833,638,1027,44,33,31,19,15,13,384,406,938,610,657,813,22,9,21,12,14,15,8 +419,341,1011,679,662,840,25,11,7,5,10,10,494,562,686,612,703,733,20,30,28,12,12,12,410,302,887,637,1100,788,23,20,30,16,14,3,352,380,981,774,895,897,17,36,42,11,6,12,377,377,953,810,1011,771,12,36,30,12,7,9,299,393,838,824,1142,759,11,24,17,14,8,1,477,437,793,597,782,733,14,38,36,11,10,7,385,453,774,478,798,705,17,28,35,16,9,17,592,452,785,604,794,809,39,15,36,11,16,18,194,200,1013,842,1065,914,3,20,14,6,1,1,419,223,859,749,985,686,2,25,14,12,7,7,363,279,1098,692,756,762,16,16,15,13,11,2,517,385,1066,692,824,702,18,12,15,10,12,15,565,309,608,668,826,627,9,31,29,12,14,8,303,283,837,681,1050,765,6,17,24,11,13,1,123,137,1081,954,1277,848,2,1,14,5,1,0,567,475,682,749,654,821,31,16,32,13,13,10,420,428,1000,530,673,833,15,30,8,16,12,18,8 +289,485,916,835,654,731,34,25,19,13,10,12,234,194,679,726,695,1002,39,16,20,20,14,6,246,126,756,723,1092,779,22,26,38,0,10,5,238,96,982,928,887,832,10,16,28,3,2,4,163,157,948,954,1003,740,7,8,38,4,3,13,177,247,787,914,1134,830,8,22,29,2,10,13,227,263,856,739,774,1056,33,16,28,21,10,1,271,379,809,632,790,938,36,18,35,16,13,11,344,274,784,772,786,1006,20,31,36,11,8,14,250,222,900,844,1057,765,16,14,2,16,3,5,273,317,746,851,977,861,17,23,26,14,11,5,291,369,985,814,748,821,25,28,31,13,9,4,309,413,907,860,816,819,27,24,31,14,14,9,301,335,603,804,818,1064,28,15,41,20,10,14,263,315,818,703,1042,854,25,27,36,13,9,13,219,421,1010,988,1269,681,17,31,30,13,5,10,361,501,803,907,646,1136,36,30,36,19,13,16,330,288,845,674,665,634,26,16,22,12,14,12,8 +365,301,1059,684,652,845,26,10,7,2,8,11,414,570,736,629,693,790,21,27,32,13,12,11,338,294,909,682,1090,811,26,23,30,13,12,2,280,382,1031,779,885,942,16,35,40,10,8,11,303,359,999,833,1001,776,11,35,30,11,9,10,233,389,892,855,1132,772,10,25,17,13,10,0,401,431,833,626,772,774,15,35,36,10,12,6,333,483,820,517,788,760,18,29,33,17,11,16,512,480,799,611,784,860,38,12,32,10,18,17,172,194,1063,885,1055,919,2,23,18,5,1,0,377,215,909,784,975,699,1,28,12,7,7,6,309,257,1148,699,746,769,17,13,13,8,9,1,439,375,1102,699,814,699,19,9,15,11,10,14,495,367,656,693,816,682,10,28,25,11,12,9,257,341,891,728,1040,794,7,20,22,6,11,2,89,123,1135,999,1267,843,1,2,10,2,3,1,503,507,728,752,644,908,32,13,32,12,15,9,374,440,1040,537,663,846,14,33,12,13,14,17,8 +429,463,1071,781,644,907,36,23,26,10,8,12,392,330,778,680,685,920,31,14,27,21,14,10,342,150,873,663,1082,893,16,34,37,3,12,1,236,174,1093,866,877,956,12,18,27,0,0,2,235,151,1063,880,993,914,1,12,37,1,1,9,265,277,916,846,1124,850,0,30,36,5,8,7,343,405,947,667,764,868,25,12,27,18,8,3,389,493,902,578,780,852,28,20,34,17,11,15,436,398,799,728,776,976,28,29,35,12,10,16,206,210,1063,832,1047,983,8,16,3,13,1,1,425,353,909,781,967,719,9,21,33,17,9,5,363,383,1148,788,738,827,27,30,32,16,9,0,393,511,1048,816,806,781,29,20,32,15,12,13,433,365,704,726,808,866,20,17,42,17,12,10,329,367,931,653,1032,882,17,33,43,10,11,7,153,291,1153,938,1259,917,9,29,31,10,3,4,433,625,882,859,636,970,42,28,35,16,15,10,420,394,1006,640,655,830,20,20,23,9,12,16,8 +417,495,912,872,651,853,34,28,28,10,9,9,396,184,677,753,692,952,35,21,25,19,13,9,364,138,750,724,1089,859,22,29,35,3,11,8,234,90,970,953,884,874,10,13,25,0,1,1,235,113,934,971,1000,818,7,7,35,1,2,10,273,241,779,911,1131,878,6,25,38,5,9,16,333,287,852,756,771,946,29,13,25,18,9,2,407,397,799,671,787,868,32,23,32,15,12,14,432,288,788,821,783,960,24,36,33,10,7,17,230,222,896,857,1054,899,12,19,5,13,2,2,427,313,742,856,974,807,13,24,35,17,12,8,349,385,981,861,745,773,25,33,34,16,8,5,383,429,897,909,813,813,27,27,34,13,15,12,421,319,591,815,815,976,24,20,40,17,11,11,347,309,806,672,1039,882,21,30,43,10,10,16,183,419,1004,963,1266,851,13,36,33,10,4,13,423,509,803,950,643,1016,36,35,33,16,12,13,424,280,839,727,662,732,24,15,23,9,13,15,8 +358,446,819,884,647,895,30,29,29,5,13,13,383,263,632,761,688,920,25,22,20,16,9,9,337,193,673,700,1085,881,22,28,30,8,11,4,255,163,877,957,880,910,12,12,20,5,1,1,268,208,849,957,996,864,7,6,30,6,2,10,276,362,680,879,1127,848,6,24,39,10,9,12,356,354,787,754,767,864,19,14,20,13,9,2,350,452,740,687,783,838,22,24,27,18,12,14,455,359,765,839,779,916,34,37,28,13,3,15,197,191,809,847,1050,959,2,20,10,8,2,2,362,360,653,830,970,707,3,25,36,12,12,4,348,366,892,881,741,811,21,32,33,11,8,1,404,490,820,927,809,771,23,28,31,14,11,12,444,358,528,803,811,884,14,21,35,12,11,11,314,370,715,662,1035,878,11,29,38,9,10,12,126,328,907,953,1262,905,3,37,38,5,6,9,472,566,802,962,639,910,36,36,28,11,8,15,369,345,782,749,658,804,16,14,18,14,13,15,8 +387,461,907,898,647,846,33,25,26,11,11,9,354,166,718,775,688,961,38,16,25,20,11,9,342,174,765,728,1085,854,27,26,35,2,9,10,262,92,985,981,880,843,9,16,25,1,3,1,233,129,951,987,996,787,12,6,35,2,4,10,263,251,786,927,1127,889,11,22,36,4,9,18,319,249,885,780,767,955,34,10,25,19,9,2,391,313,830,695,783,865,37,18,32,16,14,14,428,224,831,843,779,947,19,31,33,11,5,17,254,268,885,855,1050,882,17,14,5,14,4,4,391,387,731,874,970,836,18,19,33,16,14,10,331,391,970,883,741,774,24,34,34,15,10,7,383,345,898,931,809,836,26,24,34,14,13,12,397,313,622,833,811,995,29,15,40,18,9,11,341,325,823,678,1035,885,26,27,43,11,8,18,191,497,1001,955,1262,840,18,31,33,11,6,15,435,429,842,976,639,1007,31,30,33,17,10,13,410,274,828,745,658,719,25,16,23,10,15,15,8 +349,451,900,845,657,799,31,24,23,13,10,13,364,238,659,732,698,884,26,13,24,22,14,9,334,158,740,727,1095,799,21,29,38,2,10,4,258,122,956,938,890,840,11,19,28,3,2,1,263,145,926,956,1006,790,6,9,38,4,3,10,269,227,763,920,1137,796,5,25,33,2,10,12,337,287,838,743,777,860,20,11,28,21,10,2,349,405,789,642,793,818,23,15,35,18,13,14,460,294,782,784,789,922,33,28,36,13,8,15,194,184,886,862,1060,847,3,13,2,16,3,2,347,285,732,855,980,705,4,18,30,14,11,4,337,341,971,832,751,707,22,31,31,13,9,1,395,385,893,872,819,717,24,21,31,16,14,12,429,295,583,808,821,888,15,12,43,20,10,11,313,281,792,709,1045,818,12,28,40,13,9,12,149,399,990,994,1272,787,4,28,30,13,5,9,479,519,773,923,649,970,37,27,36,19,13,15,350,258,829,688,668,676,17,17,22,12,14,15,8 +405,425,881,916,598,804,29,29,24,10,15,9,326,176,726,795,639,981,34,12,25,19,9,11,280,208,737,714,1036,808,25,18,35,3,11,12,258,164,967,999,831,777,5,18,25,0,1,1,219,167,935,1001,947,709,10,16,35,1,2,8,203,201,762,919,1078,875,11,20,34,5,9,18,263,239,875,798,718,969,36,14,25,18,9,4,331,255,824,713,734,869,37,8,32,15,12,16,402,176,811,863,730,895,17,21,33,10,1,17,230,272,859,799,1001,800,19,6,5,13,2,6,351,303,705,868,921,890,20,13,31,17,12,12,319,365,944,889,692,808,22,32,34,16,10,9,373,309,866,951,760,868,26,22,34,13,9,14,353,231,616,849,762,1017,31,13,40,17,11,9,281,233,807,664,986,867,28,19,41,10,10,16,207,431,975,917,1213,764,20,23,33,10,8,17,409,373,846,992,590,989,33,26,33,16,6,11,384,272,802,759,609,679,21,10,23,9,13,17,8 +466,396,1051,735,679,950,30,5,19,10,8,11,463,519,738,656,720,865,25,24,20,21,12,13,397,239,839,657,1117,898,22,26,42,3,12,4,289,311,1041,826,912,963,12,30,34,0,2,7,304,280,1013,860,1028,893,7,30,42,1,3,10,294,360,882,844,1159,873,6,24,29,5,10,2,406,424,877,643,799,783,19,32,34,18,8,6,378,494,844,530,815,809,22,30,41,19,11,18,521,513,695,676,811,921,34,9,42,14,14,19,217,183,1049,850,1082,1014,2,26,4,13,1,2,464,270,895,775,1002,786,3,29,26,17,7,8,404,334,1134,748,773,870,21,10,25,16,9,3,438,440,1030,764,841,822,23,8,25,17,10,16,506,360,650,712,843,727,14,25,41,17,12,9,298,344,887,663,1067,883,11,23,36,10,11,2,118,156,1125,942,1294,960,3,7,24,10,3,1,506,544,780,811,671,887,36,10,42,16,15,11,433,479,992,596,690,907,18,38,16,11,12,19,8 +477,511,1027,887,671,905,36,24,29,11,9,11,406,250,766,760,712,948,31,9,24,18,13,11,330,140,841,731,1109,883,16,35,34,2,13,6,286,186,1075,964,904,924,12,23,24,1,1,1,215,105,1043,976,1020,856,1,13,34,2,0,8,255,201,886,914,1151,870,0,31,39,4,7,14,313,301,955,763,791,888,25,11,24,19,7,4,361,391,904,688,807,852,28,15,31,14,10,16,414,306,801,840,803,940,28,24,32,9,7,17,260,246,1015,852,1074,955,8,13,6,14,0,0,411,315,861,859,994,755,9,20,36,16,10,6,351,407,1100,874,765,819,27,25,35,15,10,3,405,433,998,928,833,789,29,15,35,12,15,14,407,289,696,820,835,908,20,10,39,18,13,9,307,297,911,677,1059,884,17,30,42,11,12,14,169,371,1117,968,1286,905,9,26,34,11,2,11,403,503,886,967,663,958,42,23,32,17,12,13,448,312,958,744,682,840,24,17,22,10,11,17,8 +394,502,868,897,648,881,34,26,30,11,15,9,335,135,697,764,689,1006,35,19,19,16,9,9,301,147,728,689,1086,881,18,23,29,4,11,10,233,103,948,966,881,886,10,13,19,1,1,1,176,126,914,968,997,814,3,5,29,0,2,10,234,272,749,880,1128,908,4,19,40,6,9,18,270,272,854,763,768,972,29,11,19,17,9,2,354,318,801,702,784,906,32,21,26,12,12,14,391,241,784,854,780,948,24,34,27,7,1,17,249,279,848,804,1051,909,12,17,11,14,2,4,366,392,694,833,971,857,13,22,37,18,12,10,326,444,933,882,742,805,25,35,32,17,10,7,352,384,859,942,810,855,27,27,30,10,9,12,358,344,593,812,812,1018,24,18,34,16,11,11,314,344,786,629,1036,914,21,26,37,9,10,18,192,492,964,914,1263,859,13,34,39,9,8,15,390,408,829,975,640,1002,40,33,27,15,6,13,395,317,791,758,659,780,24,15,17,10,13,15,8 +462,540,874,1025,681,884,41,32,38,11,15,9,401,195,693,876,722,1037,38,27,15,12,9,11,329,121,736,803,1119,888,21,9,25,4,11,10,259,125,944,1080,914,895,17,9,15,1,1,1,218,124,912,1070,1030,799,6,13,25,0,2,8,254,274,747,978,1161,929,7,11,38,6,9,18,322,282,852,881,801,1011,32,19,15,17,9,4,372,372,799,838,817,917,35,17,22,8,12,16,427,257,794,990,813,959,23,30,23,3,1,17,247,247,856,870,1084,916,15,17,15,14,2,4,432,364,702,935,1004,912,16,18,43,18,12,10,358,396,941,1002,775,830,32,33,28,17,10,7,386,428,875,1078,843,912,34,31,26,6,9,14,416,340,589,916,845,1043,27,20,30,16,11,9,304,348,782,727,1069,919,24,12,33,9,10,16,138,468,968,996,1296,866,16,30,43,9,8,15,408,410,847,1103,673,1001,37,41,23,13,6,11,439,317,805,888,692,827,29,1,21,10,13,17,8 +466,418,732,1099,667,919,27,25,33,10,9,11,445,111,637,942,708,1062,32,36,18,9,11,13,381,257,654,875,1105,901,27,2,28,3,13,18,255,161,834,1146,900,834,9,18,18,0,1,3,264,182,804,1120,1016,800,22,20,28,1,0,10,290,284,627,1008,1147,984,21,6,41,5,7,16,380,212,778,949,787,1028,38,28,18,14,7,6,408,222,719,918,803,910,35,16,25,7,10,18,473,151,792,1070,799,912,13,33,26,0,1,19,217,345,702,832,1070,909,23,28,12,15,8,12,464,388,548,965,990,991,24,19,40,17,10,18,398,374,787,1066,761,883,26,22,31,16,14,15,428,308,737,1158,829,971,30,30,29,3,11,16,474,238,527,978,831,1058,35,27,33,13,13,7,320,246,682,759,1055,956,32,5,36,10,12,14,120,516,826,924,1282,891,24,19,40,12,14,15,458,328,815,1177,659,946,21,34,26,10,2,11,439,317,653,962,678,778,19,14,18,9,11,19,8 +309,451,764,820,631,787,27,29,22,3,11,11,354,224,583,717,678,858,22,14,23,14,11,9,304,158,708,678,1069,775,23,28,37,10,9,6,298,124,828,913,864,812,15,18,27,13,3,1,289,165,796,927,980,748,10,8,37,14,4,10,215,267,631,871,1111,760,9,24,32,12,9,14,347,289,720,718,753,828,16,6,27,13,9,2,313,365,675,619,773,772,19,16,34,18,14,14,484,288,750,763,763,854,37,29,35,13,5,15,208,186,750,833,1034,833,1,16,3,6,4,2,293,297,596,814,954,669,0,17,29,8,14,6,263,335,835,809,727,717,18,32,32,9,10,3,403,395,823,851,793,677,20,22,32,12,13,12,433,273,493,775,801,858,11,13,42,14,9,11,269,275,664,646,1025,788,8,25,39,7,8,14,169,389,856,933,1248,775,0,31,31,5,6,11,503,495,759,896,625,890,33,28,35,15,10,13,352,228,743,669,642,706,13,12,23,14,15,15,8 +443,455,1169,701,679,962,36,19,24,11,8,12,384,482,868,644,720,897,31,22,25,22,12,10,312,198,953,621,1117,924,16,28,39,2,12,1,282,254,1167,786,912,1023,12,28,29,1,0,6,227,235,1141,818,1028,907,1,28,39,2,1,11,263,341,1002,804,1159,879,0,30,32,4,8,3,317,443,1005,601,799,845,25,30,29,19,8,3,363,545,978,490,815,853,28,20,36,18,11,15,432,526,829,636,811,971,28,11,37,13,12,16,240,202,1169,842,1082,1040,8,14,7,14,1,1,407,353,1015,733,1002,794,9,19,27,16,7,5,361,381,1254,726,773,888,27,24,28,15,9,0,385,513,1142,724,841,836,29,12,30,16,10,13,413,435,776,670,843,775,20,23,40,18,12,10,325,423,1009,643,1067,893,17,25,37,11,11,3,171,209,1245,920,1294,972,9,9,21,11,3,2,441,631,958,771,671,967,42,24,37,17,15,8,422,484,1112,568,690,949,24,24,21,10,12,16,8 +404,474,1129,710,677,959,35,7,23,12,8,11,367,495,822,651,718,934,30,20,24,21,12,11,315,215,915,638,1115,933,17,30,40,1,12,2,235,271,1133,799,910,1040,11,26,30,2,0,7,236,254,1105,837,1026,910,2,24,40,3,1,10,240,378,966,823,1157,882,1,28,33,3,8,2,336,476,975,620,797,882,24,28,30,20,8,4,362,582,944,509,813,888,27,26,37,17,11,16,433,543,807,641,809,992,29,13,38,12,12,17,221,247,1127,857,1080,1039,7,22,6,15,1,0,406,372,973,752,1000,805,8,25,30,15,7,6,332,400,1212,729,771,887,26,16,29,14,9,1,384,528,1116,729,839,811,28,14,29,15,10,14,424,468,742,689,841,806,19,21,45,19,12,9,302,454,973,662,1065,912,16,27,40,12,11,2,136,230,1207,939,1292,957,8,13,22,12,3,1,434,676,902,778,669,1000,41,12,38,18,15,9,397,507,1070,571,688,962,21,34,20,11,12,17,8 +453,521,1028,860,694,1006,36,34,32,11,10,14,392,280,803,747,735,1009,31,23,21,14,12,12,316,178,838,686,1132,974,16,27,31,2,10,3,280,190,1070,929,927,1017,12,11,21,1,2,2,239,173,1042,939,1043,969,1,5,31,2,3,9,237,339,881,869,1174,941,0,23,42,4,10,11,321,405,948,726,814,911,25,15,21,19,10,5,359,507,909,667,830,925,28,25,28,10,13,17,450,352,818,819,826,1009,28,38,29,5,6,18,250,246,1018,849,1097,1064,8,21,9,14,3,1,415,423,864,822,1017,854,9,26,39,16,13,7,337,431,1103,865,788,920,27,27,34,15,9,2,387,479,1007,907,856,870,29,29,32,8,14,15,419,435,691,779,858,911,20,22,36,18,10,8,289,439,906,632,1082,971,17,24,39,11,9,11,141,311,1114,927,1309,1006,9,38,37,11,5,8,445,583,949,938,686,983,42,37,29,15,11,14,428,436,961,729,705,959,24,9,19,10,14,18,8 +426,410,818,1073,686,787,31,25,29,11,13,8,387,189,681,942,741,1002,36,30,22,16,9,10,321,243,704,859,1094,769,25,4,32,2,11,17,255,193,918,1146,873,688,9,20,22,1,1,0,250,228,884,1148,985,658,16,20,32,2,2,9,230,254,711,1058,1140,880,15,8,39,4,9,19,340,202,840,943,810,948,40,24,22,19,9,3,340,218,783,874,836,852,39,16,29,12,12,15,455,179,810,1026,808,852,13,31,30,7,1,16,217,255,794,872,1087,735,23,20,8,14,4,11,416,296,640,1007,1007,959,24,17,36,16,12,17,350,324,879,1026,784,827,26,20,35,15,12,14,378,324,817,1114,832,837,30,28,33,10,9,13,434,170,581,994,862,1020,35,23,37,18,11,10,274,180,762,801,1086,864,32,7,40,11,10,17,118,420,920,1008,1305,717,24,17,36,11,10,18,450,338,827,1151,686,964,27,32,30,17,4,12,389,253,737,914,633,612,23,12,20,10,13,16,8 +400,398,1221,674,650,907,36,6,3,11,10,12,345,523,902,625,691,880,31,23,34,22,14,10,297,177,1001,658,1088,887,16,27,24,8,10,1,241,259,1207,767,883,1010,12,31,36,1,6,10,202,230,1177,821,999,858,1,31,24,4,7,11,222,314,1056,845,1130,834,0,25,11,6,10,1,282,440,1031,618,770,832,25,31,34,19,10,5,354,538,1004,497,786,844,28,31,29,24,13,15,401,533,815,591,782,942,28,8,30,19,18,16,233,205,1223,875,1053,991,8,25,20,14,3,1,368,298,1069,768,973,755,9,30,8,16,9,5,308,338,1308,691,744,837,27,9,9,15,9,0,358,474,1196,679,812,761,29,7,9,20,12,13,374,416,818,685,814,760,20,24,23,18,10,10,300,394,1057,712,1038,864,17,24,18,13,9,3,162,224,1299,979,1265,909,9,6,8,11,5,2,404,628,906,732,642,994,42,9,26,17,17,8,401,471,1166,527,661,900,22,37,14,16,14,16,8 +377,433,838,785,668,802,25,24,21,3,10,14,400,272,587,682,709,849,20,11,22,14,14,12,320,192,766,665,1106,770,21,35,40,12,10,3,298,198,876,882,901,795,17,21,30,7,2,2,301,161,846,906,1017,743,12,13,40,8,3,9,205,241,691,864,1148,757,11,31,31,12,10,11,383,273,748,693,788,787,14,11,30,11,10,5,313,341,701,584,804,753,17,17,37,18,13,17,512,282,754,718,800,841,39,26,38,11,10,18,190,210,828,816,1071,832,3,13,0,6,3,1,381,263,674,805,991,692,2,22,28,10,9,7,307,341,913,772,762,714,16,27,29,11,9,2,433,359,887,806,830,664,18,17,29,12,12,15,479,207,521,758,832,835,9,10,43,10,10,8,221,209,712,631,1056,789,6,32,38,9,9,11,113,379,924,916,1283,778,2,26,28,3,5,8,513,471,751,859,660,887,31,25,38,9,15,14,360,212,815,624,679,717,15,17,20,14,14,18,8 +515,509,1081,877,684,1047,37,25,32,13,9,14,452,298,810,756,725,1008,32,14,21,18,13,12,376,146,889,695,1122,1003,15,36,31,6,13,3,318,212,1123,950,917,1012,13,20,21,3,1,2,231,167,1093,956,1033,976,0,14,31,2,0,9,291,285,934,880,1164,980,1,32,42,8,7,11,347,355,991,747,804,892,26,10,21,15,7,5,405,477,946,680,820,910,29,18,28,14,10,17,460,364,837,832,816,988,27,29,29,9,7,18,290,206,1071,844,1087,1099,9,16,9,16,0,1,457,385,917,833,1007,881,10,23,39,20,10,7,385,407,1156,874,778,961,28,30,34,19,10,2,433,475,1056,920,846,937,30,20,32,12,15,15,435,385,738,798,848,916,21,13,36,14,13,8,335,401,959,643,1072,994,18,33,39,9,12,11,157,303,1167,938,1299,1061,10,29,37,11,2,8,401,577,922,953,676,948,43,28,29,13,12,14,488,388,1014,742,695,970,25,18,19,12,11,18,8 +447,427,869,919,664,885,30,31,30,8,11,12,456,274,610,788,705,910,25,18,21,17,11,12,388,172,713,719,1102,857,22,28,31,7,13,5,270,172,905,990,897,872,12,14,21,4,1,2,289,187,873,992,1013,812,7,6,31,3,0,9,291,303,722,910,1144,832,6,24,40,9,7,13,413,261,781,787,784,822,19,10,21,14,7,5,383,357,732,722,800,798,22,20,28,15,10,17,506,336,753,874,796,862,34,33,29,10,5,18,190,174,859,842,1067,937,2,20,9,11,0,1,433,297,705,863,987,705,3,21,37,15,10,7,391,325,944,908,758,799,21,30,34,14,10,2,447,437,866,962,826,769,23,24,32,13,13,15,509,257,538,836,828,850,14,17,36,13,13,8,301,269,741,665,1052,854,11,25,39,6,12,13,81,327,957,952,1279,887,3,33,37,6,4,10,481,505,762,995,656,858,36,32,29,12,10,14,418,280,806,778,675,826,16,10,19,13,11,18,8 +428,380,955,802,616,866,27,17,26,6,8,12,449,369,644,701,657,841,22,12,21,15,12,10,387,187,763,708,1054,838,25,32,31,9,12,1,279,205,979,883,849,913,15,20,21,6,0,2,308,220,947,905,965,875,10,14,31,5,1,9,314,328,804,885,1096,799,9,28,36,11,8,7,402,334,827,686,736,765,16,18,21,12,8,3,390,432,788,601,752,773,19,26,28,19,11,15,501,419,769,753,748,899,37,27,29,12,12,16,143,147,947,875,1019,940,1,10,9,9,1,1,372,272,793,818,939,692,0,29,33,13,7,5,414,284,1032,809,710,788,18,26,34,12,9,0,434,428,932,841,778,748,20,18,32,13,10,13,494,300,600,751,780,753,11,17,36,11,12,10,338,298,819,698,1004,821,8,35,39,8,11,7,158,256,1039,985,1231,880,0,27,37,4,3,4,494,560,764,880,608,889,33,26,29,10,15,10,401,353,918,665,627,803,15,24,19,15,12,16,8 +379,509,786,951,654,900,27,34,34,4,13,8,404,202,643,810,695,947,22,23,17,11,9,10,358,178,700,723,1092,882,25,25,27,13,11,9,270,98,862,1008,887,897,15,9,17,10,1,0,281,201,832,1002,1003,833,10,3,27,9,2,9,263,357,661,904,1134,865,9,21,40,15,9,17,381,307,780,807,774,885,16,15,17,8,9,3,367,421,729,764,790,839,19,25,24,13,12,15,484,306,818,916,786,883,37,38,25,12,1,18,176,216,772,828,1057,954,1,21,13,5,4,3,379,391,614,861,977,746,0,26,41,9,12,9,325,389,853,940,748,820,18,27,30,8,12,6,435,453,813,1004,816,780,20,29,28,9,9,13,469,351,549,848,818,911,11,22,32,9,11,10,301,361,702,651,1042,883,8,24,35,2,10,17,101,449,880,918,1269,902,0,38,41,4,10,14,479,453,839,1029,646,877,33,37,25,10,4,12,388,310,761,822,665,835,13,9,19,9,13,16,8 +466,482,921,952,625,940,31,30,30,11,12,11,449,253,678,823,666,933,26,23,17,16,12,13,383,157,753,740,1063,906,21,25,27,2,14,6,269,157,967,1025,858,907,11,9,17,1,2,3,276,174,937,1021,974,865,6,3,27,2,1,10,286,298,778,935,1105,883,5,21,40,4,8,14,394,286,849,822,745,841,20,15,17,19,8,6,390,404,802,753,761,829,23,25,24,12,9,18,495,305,765,905,757,893,33,38,25,7,4,19,177,205,909,879,1028,988,3,21,13,14,1,2,428,364,755,886,948,764,4,26,37,16,9,8,418,384,994,943,719,852,22,31,30,15,11,3,436,450,910,993,787,826,24,29,28,10,12,16,494,322,590,869,789,873,15,22,32,18,14,7,302,340,803,684,1013,903,12,28,35,11,13,14,118,366,1009,963,1240,948,4,38,41,11,5,11,464,530,810,1030,617,871,37,37,25,17,9,13,419,323,854,811,636,849,19,13,19,10,10,19,8 +445,425,979,819,656,909,31,26,31,10,9,12,440,358,700,706,697,900,26,17,22,17,15,12,374,186,791,687,1094,885,21,31,32,3,11,3,250,220,999,894,889,932,11,15,22,0,1,2,285,217,971,910,1005,894,6,9,32,1,2,9,285,359,822,866,1136,846,5,27,41,5,9,7,385,367,865,693,776,822,20,9,22,18,9,5,387,469,822,618,792,822,23,19,29,13,12,17,496,442,747,770,788,940,33,32,30,8,9,18,178,172,971,848,1059,979,3,15,8,13,2,1,423,315,817,809,979,731,4,22,38,17,10,7,391,335,1056,822,750,829,22,33,35,16,8,2,427,473,962,858,818,791,24,23,33,11,13,15,479,367,610,752,820,828,15,16,37,17,11,8,309,361,837,663,1044,874,12,32,40,10,10,7,127,235,1059,952,1271,923,4,32,36,10,4,4,491,591,814,895,648,920,37,31,30,16,14,10,408,408,914,682,667,836,17,17,20,9,13,18,8 +360,524,741,967,680,851,26,30,32,7,13,8,419,167,600,828,721,942,27,23,21,18,9,10,363,185,667,743,1118,849,28,17,31,6,11,9,285,79,817,1032,913,832,10,9,21,9,1,0,318,168,789,1026,1029,780,13,5,31,10,2,9,274,326,616,934,1160,874,12,13,42,8,9,17,396,282,745,829,800,918,21,15,21,15,9,3,378,364,692,776,816,840,24,25,28,14,12,15,519,265,791,928,812,880,32,38,29,9,1,18,201,243,725,828,1083,887,4,21,9,10,4,3,366,388,569,887,1003,811,5,26,39,8,12,9,314,412,808,948,774,767,17,31,34,7,12,6,450,432,756,1016,842,817,19,33,32,12,9,13,490,320,512,874,844,960,16,22,36,14,11,10,318,322,659,679,1068,872,13,20,39,7,10,17,142,484,835,952,1295,845,5,38,37,7,10,14,528,454,796,1047,672,914,30,37,29,13,4,12,401,265,698,828,691,730,18,9,19,10,13,16,8 +394,486,878,857,649,830,34,25,27,11,9,11,375,201,635,732,690,951,29,16,24,18,13,11,319,107,718,707,1087,826,18,22,34,2,11,6,221,99,932,936,882,875,10,16,24,1,1,1,222,122,900,950,998,785,3,6,34,2,2,8,248,228,739,892,1129,835,2,18,37,4,9,14,322,272,810,735,769,907,23,10,24,19,9,4,360,378,761,656,785,853,26,18,31,14,12,16,425,293,754,806,781,937,30,31,32,9,7,17,185,205,866,818,1052,874,6,14,6,14,2,0,372,296,712,835,972,770,7,19,34,16,12,6,354,362,951,840,743,748,25,34,35,15,8,3,368,424,871,894,811,774,27,28,35,12,15,14,412,308,551,794,813,931,18,15,39,18,11,9,294,296,768,655,1037,847,15,25,42,11,10,14,146,404,968,946,1264,808,7,31,34,11,4,11,436,500,761,935,641,983,40,30,32,17,12,13,373,285,809,708,660,773,18,14,22,10,13,17,8 +336,512,822,905,665,867,29,29,31,12,12,10,275,147,713,772,706,1006,32,24,18,15,8,8,261,147,710,695,1103,867,15,18,28,1,10,13,269,99,920,978,898,892,13,8,18,2,2,2,196,128,892,972,1014,802,8,4,28,3,3,11,204,282,715,880,1145,890,9,14,41,3,10,21,250,292,862,775,785,964,30,16,18,20,10,1,292,342,805,704,801,900,29,26,25,11,13,13,389,261,798,856,797,944,19,39,26,6,2,18,267,283,800,806,1068,903,17,22,12,15,5,7,314,412,646,831,988,839,18,27,38,15,13,13,302,464,885,890,759,795,28,30,31,14,13,10,332,398,819,944,827,839,30,32,29,9,10,11,342,374,605,822,829,998,29,23,33,19,10,12,292,384,772,625,1053,896,26,21,36,12,9,19,206,506,916,908,1280,843,18,39,40,12,11,18,412,420,877,981,657,988,35,38,26,16,5,14,357,341,749,760,676,804,21,10,18,11,14,14,8 +350,354,863,809,660,802,24,20,20,1,8,15,423,337,576,704,701,827,19,11,21,12,12,11,347,179,797,725,1098,788,22,39,41,12,12,2,293,177,893,900,893,857,18,23,31,11,0,1,324,240,859,932,1009,809,13,17,41,12,1,8,260,292,714,910,1140,755,12,35,30,14,8,10,410,298,755,713,780,827,13,15,31,11,8,4,366,376,702,606,796,757,16,23,38,16,11,16,521,365,763,752,792,883,40,26,39,11,12,17,187,133,855,872,1063,868,4,17,1,4,1,0,370,228,701,843,983,630,3,28,27,6,7,6,306,250,940,802,754,720,15,27,28,7,9,1,464,332,924,840,822,678,17,17,28,10,10,14,498,252,550,780,824,831,8,14,42,12,12,9,290,232,731,705,1048,785,5,38,37,5,11,10,128,320,949,992,1275,812,3,26,27,3,3,7,528,512,740,885,652,929,30,25,39,13,15,13,389,271,846,660,671,711,16,23,19,12,12,17,8 +358,466,1174,603,660,986,38,12,7,12,8,14,285,575,845,574,701,941,33,29,38,23,12,8,265,207,958,583,1098,948,14,21,28,5,12,1,237,309,1176,690,893,1083,14,37,38,2,6,10,166,262,1146,732,1009,899,1,37,28,3,7,13,218,374,1011,758,1140,911,2,25,15,3,10,3,248,502,992,527,780,913,27,37,38,20,10,5,316,612,971,420,796,919,30,27,31,21,11,13,339,591,798,524,792,997,26,14,30,16,18,14,275,269,1172,818,1063,1058,10,19,24,15,1,3,314,362,1018,685,983,864,11,24,10,15,7,3,302,394,1257,634,754,910,29,15,11,14,9,2,334,542,1153,612,822,820,31,11,13,19,10,11,330,492,785,592,824,783,22,30,23,19,12,12,310,478,1018,639,1048,937,19,18,20,12,11,5,202,268,1252,906,1275,972,11,0,4,12,3,4,354,690,875,667,652,1045,44,15,30,18,15,10,397,529,1115,480,671,1013,24,29,18,13,14,14,8 +369,349,976,666,621,888,24,12,5,7,8,10,364,568,651,615,664,807,19,29,36,12,12,12,286,312,894,626,1053,832,20,21,26,14,12,3,284,420,954,755,848,923,18,37,36,9,6,10,271,385,924,799,964,795,13,37,26,10,7,9,183,403,807,811,1095,815,12,25,13,14,10,1,349,447,768,588,741,789,13,37,36,9,10,5,273,461,753,471,761,781,16,27,29,16,11,17,480,482,742,593,747,859,38,14,28,9,18,18,178,224,978,853,1018,932,4,21,22,8,1,1,353,257,824,738,938,814,3,26,8,14,7,7,309,281,1063,689,717,834,15,15,9,15,9,2,409,385,1043,681,777,722,17,11,11,10,10,15,441,363,569,657,789,723,8,30,21,8,12,8,197,351,808,664,1013,831,5,18,18,13,11,1,107,103,1050,937,1234,868,3,0,6,7,3,0,471,469,665,728,613,899,30,15,28,9,15,10,350,482,971,531,630,881,16,31,16,16,14,18,8 +389,519,918,811,664,765,37,32,22,11,15,9,292,184,729,680,695,838,32,19,15,16,15,11,248,142,754,705,1074,741,15,27,25,2,5,8,324,118,990,882,891,878,13,13,29,1,7,1,243,71,962,886,995,740,0,5,25,2,8,8,247,195,789,874,1116,738,1,23,32,4,5,16,271,273,892,691,766,786,26,11,29,19,7,4,293,381,843,622,772,726,29,21,30,12,12,16,396,266,792,768,800,836,27,34,31,7,9,17,304,272,902,802,1045,797,9,21,15,14,8,2,375,349,748,811,959,641,10,22,29,16,10,8,341,417,987,796,732,671,28,29,28,15,14,5,301,389,905,856,798,663,30,25,26,10,17,14,329,337,631,730,808,790,21,18,30,18,5,9,299,333,830,705,1024,756,18,24,33,11,4,16,227,439,1010,996,1251,749,10,34,29,11,10,13,459,477,867,891,658,954,43,33,27,17,14,11,344,306,845,670,681,744,23,9,13,10,11,17,8 +389,433,898,828,681,803,29,24,24,12,8,13,416,288,631,717,722,846,24,13,25,23,14,9,368,184,730,706,1119,793,23,33,39,3,12,4,268,174,948,923,914,846,13,19,29,2,0,1,281,177,916,937,1030,796,8,11,39,3,1,10,301,237,755,899,1161,774,7,29,34,3,8,12,383,335,818,728,801,818,18,11,29,20,8,2,379,411,767,625,817,776,21,15,36,19,11,14,486,324,750,763,813,890,35,28,37,14,10,15,198,184,886,845,1084,863,1,15,1,15,1,2,399,245,732,832,1004,649,2,20,31,15,9,4,371,331,971,813,775,717,20,29,30,14,9,1,437,401,885,851,843,683,22,19,30,17,12,12,477,245,577,787,845,826,13,12,44,19,12,11,339,241,784,688,1069,794,10,30,41,12,11,12,141,355,988,973,1296,809,2,28,29,12,3,9,499,537,749,904,673,910,35,27,37,18,15,15,398,250,829,667,692,702,17,17,21,11,12,15,8 +386,470,984,799,653,850,37,27,23,10,8,14,311,255,717,686,694,963,32,16,24,19,14,10,265,95,804,683,1091,844,15,26,38,3,12,3,243,121,1032,884,886,917,13,16,28,0,0,0,180,126,1000,906,1002,837,0,6,38,1,1,9,208,240,843,864,1133,829,1,22,33,5,8,11,264,312,896,689,773,919,26,8,28,18,8,3,318,450,851,596,789,881,29,18,35,15,11,15,383,327,788,746,785,979,27,31,36,10,10,16,237,221,972,816,1056,902,9,14,2,13,1,1,340,314,818,803,976,738,10,19,30,17,9,5,308,372,1057,792,747,762,28,34,31,16,9,0,354,464,971,834,815,748,30,24,31,13,12,13,352,342,647,750,817,923,21,15,43,17,12,10,286,332,868,653,1041,865,18,27,40,10,11,11,180,358,1072,944,1268,826,10,31,30,10,3,8,396,564,839,875,645,1017,43,30,36,16,15,14,379,341,915,652,664,797,21,14,22,9,12,16,8 +411,349,960,735,654,889,26,7,22,7,9,10,466,504,649,658,699,804,21,20,23,12,11,12,390,250,848,651,1092,837,24,30,41,12,13,3,304,314,962,824,887,910,16,30,31,9,1,6,331,317,934,850,1003,830,11,24,41,10,2,11,291,393,797,834,1134,812,10,28,32,14,9,3,451,407,802,635,774,734,15,28,31,9,7,5,381,453,771,528,794,750,18,28,38,16,10,17,546,506,800,674,786,862,38,15,39,13,13,18,144,150,960,846,1057,953,2,22,1,8,0,1,397,271,804,763,977,737,1,27,29,14,6,7,373,273,1043,748,748,821,17,16,28,15,10,2,491,409,1029,762,816,759,19,12,28,10,11,15,545,311,583,700,820,690,10,21,44,10,13,10,307,305,804,663,1044,822,7,27,39,13,12,3,95,161,1038,942,1269,899,1,15,27,7,2,0,533,533,735,809,648,828,32,14,39,11,14,10,396,422,961,594,665,848,14,34,19,16,11,18,8 +513,447,1154,812,669,967,36,14,26,11,11,11,456,376,835,707,710,948,31,13,25,20,13,13,382,132,944,686,1107,925,16,37,35,4,15,4,312,232,1164,895,902,978,12,27,25,1,3,3,237,195,1134,913,1018,934,1,21,35,0,2,10,283,305,995,869,1149,898,0,35,36,6,9,6,357,335,1000,698,789,856,25,21,25,17,9,6,405,443,965,609,805,872,28,27,32,18,8,18,474,436,808,759,801,966,28,20,33,13,11,19,256,186,1150,855,1072,1019,8,17,5,14,2,2,469,307,996,806,992,821,9,22,33,18,8,8,401,345,1235,817,763,879,27,21,34,17,12,3,429,451,1127,847,831,833,29,11,34,16,13,16,449,365,773,759,833,834,20,20,40,16,15,7,331,363,1006,668,1057,922,17,34,43,9,14,6,141,249,1234,955,1284,967,9,20,33,9,0,3,413,547,889,890,661,940,42,19,33,15,12,11,468,404,1093,671,680,924,22,27,23,10,9,19,8 +409,437,1109,715,656,918,36,6,8,10,9,13,392,498,794,654,697,869,31,21,27,21,13,9,338,214,897,655,1094,886,16,29,31,3,11,0,228,272,1115,804,889,1001,12,27,43,0,1,7,243,249,1085,838,1005,875,1,25,31,1,2,12,273,341,948,836,1136,835,0,27,18,5,9,2,337,471,961,621,776,823,25,29,37,18,9,2,375,567,922,510,792,819,28,31,36,19,12,14,440,544,775,646,788,931,28,16,37,14,13,15,182,208,1107,862,1059,1008,8,23,13,13,2,2,401,329,953,765,979,740,9,28,15,17,8,4,379,359,1192,734,750,850,27,15,16,16,8,1,387,507,1088,734,818,784,29,13,16,17,11,12,431,431,724,690,820,735,20,24,30,17,11,11,323,415,957,685,1044,855,17,26,25,10,10,4,153,213,1187,962,1271,928,9,16,15,10,4,3,449,643,854,783,648,929,42,15,33,16,16,9,392,506,1050,574,667,933,20,35,7,11,13,15,8 +313,329,943,695,655,828,26,17,21,1,8,11,362,508,638,628,696,821,21,16,22,12,12,11,292,246,809,613,1093,800,22,32,36,12,12,2,242,318,939,782,888,953,16,32,26,11,2,5,249,343,915,808,1004,745,11,26,36,12,3,10,203,385,776,800,1135,747,10,32,31,14,10,4,353,393,789,591,775,833,15,24,26,11,8,4,305,465,758,486,791,793,18,18,33,16,11,16,452,506,767,628,787,867,38,11,34,11,14,17,156,154,943,842,1058,924,2,10,8,4,1,0,323,249,789,727,978,704,1,13,26,6,7,6,287,263,1028,710,749,776,17,26,27,7,9,1,385,391,1002,716,817,656,19,12,29,10,10,14,441,379,548,660,819,697,10,17,39,12,12,9,243,361,781,629,1043,781,7,29,36,5,11,4,105,155,1019,908,1270,812,1,13,20,3,3,1,457,543,742,763,647,939,32,16,34,13,15,9,358,452,934,552,666,927,14,24,24,12,12,17,8 +425,509,1047,807,685,983,36,30,29,12,8,12,378,350,776,710,726,980,31,23,24,17,14,10,318,204,855,657,1123,963,16,27,34,1,12,1,254,240,1079,878,918,1048,12,11,24,2,0,2,225,215,1051,884,1034,984,1,5,34,3,1,9,251,369,896,836,1165,908,0,23,39,3,8,7,337,455,949,675,805,908,25,15,24,20,8,3,369,561,906,602,821,906,28,25,31,13,11,15,426,430,813,754,817,1026,28,38,32,8,8,16,240,236,1039,848,1088,1073,8,21,6,15,1,1,411,411,885,775,1008,797,9,26,36,15,11,5,351,425,1124,816,779,915,27,31,35,14,9,0,389,559,1028,842,847,853,29,29,35,11,14,13,427,467,694,728,849,872,20,22,39,19,12,10,319,459,915,643,1073,938,17,28,42,12,11,7,149,265,1131,930,1300,993,9,38,34,12,3,4,431,671,922,881,677,996,42,37,32,18,13,10,418,478,982,666,696,968,24,13,22,11,12,16,8 +288,494,901,1014,752,746,28,33,25,12,14,9,203,187,756,893,799,953,29,22,22,17,8,9,199,155,777,834,1022,758,18,14,32,1,10,14,231,129,999,1097,779,709,18,14,22,2,2,1,220,144,965,1105,861,667,23,12,32,3,3,10,126,238,792,1031,1082,849,24,16,31,3,10,20,176,236,907,896,884,961,37,16,22,20,10,2,234,316,856,811,918,867,34,12,29,13,13,14,309,233,841,961,806,903,10,25,30,8,2,17,229,251,875,903,1071,718,32,12,8,15,3,8,246,316,721,980,997,902,33,15,28,15,13,14,318,394,960,981,864,796,35,28,33,14,9,11,290,384,898,1049,856,844,35,26,33,11,10,12,264,272,652,951,926,1035,42,15,37,19,10,11,210,272,841,780,1140,847,41,15,38,12,9,18,260,442,999,1047,1183,684,33,25,36,12,7,19,336,438,898,1090,742,1021,34,36,30,18,7,13,327,245,818,853,641,563,20,6,20,11,14,15,8 +426,432,996,774,623,899,32,16,20,10,8,12,407,323,689,675,664,880,27,11,21,21,12,12,339,131,792,666,1061,857,20,35,37,3,12,3,251,169,1018,865,856,906,10,21,27,0,0,2,272,186,990,889,972,860,5,15,37,1,1,9,252,324,841,853,1103,830,4,31,30,5,8,7,362,338,866,672,743,780,21,19,27,18,8,5,336,452,831,571,759,798,24,25,34,17,11,17,477,407,726,717,755,896,32,26,35,12,12,18,139,169,990,833,1026,951,4,13,3,13,1,1,350,316,836,792,946,753,5,28,27,17,7,7,402,336,1075,777,717,811,23,25,32,16,9,2,410,454,975,805,785,765,25,17,32,15,10,15,460,356,629,737,787,766,16,18,42,17,12,8,256,352,856,650,1011,854,13,36,37,10,11,7,130,278,1078,935,1238,899,5,26,31,10,3,4,474,568,791,850,615,878,38,25,35,16,15,10,357,373,933,627,634,856,18,25,23,9,12,18,8 +416,424,845,959,687,809,34,27,27,11,14,9,345,189,688,832,730,1024,39,24,24,18,10,11,273,197,711,747,1107,803,26,12,34,2,12,14,239,173,937,1038,894,756,10,18,24,1,0,1,204,180,907,1038,1008,698,11,18,34,2,1,8,216,216,730,950,1151,898,12,14,37,4,8,18,292,190,855,835,807,1012,37,24,24,19,8,4,328,266,804,758,827,906,40,16,31,14,11,16,391,219,789,908,811,910,16,25,32,9,0,17,231,249,823,810,1082,771,20,14,6,14,3,8,374,318,669,899,1004,961,21,13,34,16,11,14,314,336,908,926,783,859,25,30,35,15,11,11,358,324,840,996,843,883,27,28,35,12,10,14,384,228,598,886,855,1068,32,25,39,18,12,9,284,240,783,695,1079,888,29,15,42,11,11,16,142,436,941,936,1300,739,21,19,34,11,9,17,402,384,814,1037,679,1024,32,34,32,17,5,11,407,277,768,802,684,662,24,12,22,10,12,17,8 +306,294,825,702,620,768,20,9,20,5,5,10,367,479,530,617,663,789,15,18,21,12,3,12,253,269,823,622,1058,716,16,32,41,12,9,3,341,347,831,791,853,791,22,30,31,9,9,4,354,354,803,821,969,703,17,28,41,10,10,9,192,378,662,805,1100,693,16,30,30,14,9,5,362,346,683,604,740,771,9,26,31,9,9,5,290,370,646,495,758,709,12,28,38,16,2,17,555,409,701,641,752,775,32,9,39,11,9,18,215,147,823,813,1023,822,8,20,1,6,8,1,352,262,669,734,943,754,7,23,27,12,4,7,256,212,908,711,714,746,11,14,28,13,4,2,394,322,886,729,782,654,13,8,28,10,3,15,404,276,500,671,786,769,4,19,42,10,9,8,152,258,671,624,1010,711,1,29,37,11,10,5,162,210,903,905,1235,762,7,11,27,5,10,2,560,434,678,776,612,889,26,10,39,11,10,10,329,367,812,557,631,745,20,32,19,16,11,18,8 +401,471,993,804,677,869,33,23,24,12,9,13,388,272,712,705,718,962,28,16,25,19,15,9,374,122,811,678,1115,875,19,32,39,1,11,0,246,120,1031,889,910,942,9,16,29,2,1,1,223,145,999,913,1026,878,4,10,39,3,2,10,287,271,846,865,1157,842,3,28,34,3,9,8,341,361,893,696,797,922,22,12,29,20,9,2,419,491,850,601,813,890,25,20,36,15,12,14,430,344,789,747,809,990,31,31,37,10,9,15,220,204,983,853,1080,939,5,14,3,15,2,2,417,337,829,806,1000,727,6,25,31,15,10,4,345,387,1068,813,771,787,24,32,30,14,8,1,395,479,974,835,839,749,26,22,30,13,13,12,421,353,642,759,841,930,17,15,42,19,11,11,357,353,867,668,1065,880,14,35,41,12,10,8,165,335,1079,951,1292,859,6,31,29,12,4,5,421,597,832,880,669,1030,39,30,37,18,14,11,412,346,926,661,688,804,21,20,21,11,13,15,8 +378,478,950,913,626,840,35,22,20,11,10,9,345,155,717,802,667,931,30,15,21,20,14,9,295,157,796,785,1064,834,17,27,37,2,10,8,223,109,1016,1002,859,847,11,17,27,1,2,1,230,98,982,1026,975,795,2,9,37,2,3,10,236,216,821,974,1106,855,1,23,30,4,10,16,298,248,900,811,746,905,24,13,27,19,10,2,326,312,847,710,762,851,27,17,34,16,13,14,411,223,828,860,758,943,29,30,35,11,8,17,217,263,934,898,1029,868,7,13,3,14,3,2,360,354,780,919,949,786,8,22,27,16,11,8,336,398,1019,894,720,750,26,31,32,15,9,5,354,356,937,948,788,784,28,23,32,14,14,12,386,312,639,872,790,949,19,14,42,18,10,11,274,314,852,735,1014,863,16,30,37,11,9,16,160,482,1044,1024,1241,822,8,30,31,11,5,13,420,420,833,991,618,1001,41,29,35,17,13,13,353,255,877,762,637,707,23,19,23,10,14,15,8 +491,417,1005,964,695,886,38,29,29,11,13,10,428,200,790,829,736,1003,33,16,24,20,11,12,352,226,835,742,1133,866,14,22,34,4,13,11,294,208,1075,1037,928,829,14,22,24,1,1,2,221,183,1041,1031,1044,787,1,20,34,0,0,9,267,207,878,945,1175,917,2,22,39,6,7,17,333,207,963,834,815,947,27,20,24,17,7,5,373,207,914,765,831,901,30,14,31,16,10,17,442,214,829,917,827,929,26,17,32,11,3,18,258,300,989,823,1098,872,10,12,6,14,0,5,441,311,835,894,1018,904,11,19,36,18,10,11,369,355,1074,937,789,800,29,32,35,17,10,8,407,321,976,1005,857,880,31,18,35,14,11,15,429,213,704,881,859,1025,22,19,39,16,13,8,311,227,911,690,1083,921,19,17,42,9,12,15,137,445,1099,949,1310,836,11,17,34,9,6,16,405,331,902,1044,687,987,44,30,32,15,8,10,456,326,932,815,706,729,24,16,22,10,11,18,8 +465,427,1034,713,638,876,36,15,20,10,8,10,400,372,723,618,679,905,31,12,21,21,12,12,326,108,830,623,1076,858,16,32,39,5,12,3,274,188,1040,808,871,939,12,28,29,0,0,4,219,175,1012,830,987,885,1,18,39,1,1,9,249,251,875,814,1118,815,0,30,30,5,8,5,323,357,890,617,758,825,25,20,29,18,8,5,385,449,853,510,774,829,28,24,36,21,11,17,434,410,710,646,770,943,28,19,37,16,12,18,228,180,1032,800,1041,944,8,18,1,13,1,1,415,283,878,743,961,716,9,27,27,17,7,7,351,323,1117,716,732,794,27,20,30,16,9,2,407,433,1005,734,800,736,29,10,30,19,10,15,415,323,649,682,802,823,20,19,42,17,12,8,319,311,882,627,1026,853,17,35,37,10,11,5,167,289,1116,906,1253,874,9,19,29,10,3,2,431,579,787,787,630,959,42,18,37,16,15,10,442,372,975,558,649,829,20,26,21,13,12,18,8 +373,445,1031,736,631,916,36,25,14,11,8,11,328,372,742,645,672,925,31,16,23,20,14,11,260,156,837,660,1069,882,16,24,35,2,12,2,230,196,1043,821,864,977,12,16,33,1,0,5,237,183,1015,855,980,897,1,6,35,2,1,10,199,325,872,839,1111,857,0,20,24,4,8,4,287,397,895,636,751,849,25,10,33,19,8,4,291,507,858,531,767,861,28,18,34,16,11,16,414,442,757,679,763,963,28,31,35,11,10,17,186,206,1027,839,1034,968,8,14,5,14,1,0,343,333,873,770,954,794,9,19,21,16,9,6,337,357,1112,745,725,824,27,32,26,15,9,1,337,487,1016,767,793,766,29,26,26,14,12,14,379,409,652,703,795,817,20,15,36,18,12,9,237,397,883,666,1019,887,17,27,31,11,11,4,157,269,1111,949,1246,904,9,31,25,11,3,1,431,623,842,812,623,991,42,30,33,17,15,9,338,434,970,595,642,873,22,16,17,10,12,17,8 +368,464,846,939,683,869,28,29,31,12,12,9,331,145,705,810,724,988,33,24,22,15,10,9,307,199,734,753,1121,863,24,18,32,1,8,14,275,113,944,1014,916,850,6,8,22,2,4,1,250,128,912,1022,1032,782,15,4,32,3,5,10,242,262,737,954,1163,894,14,14,41,3,8,20,310,256,862,811,803,940,37,16,22,20,8,2,346,316,805,738,819,874,36,26,29,11,15,14,441,237,830,890,815,934,16,39,30,6,4,17,249,305,820,864,1086,889,20,22,8,15,5,8,370,414,666,905,1006,849,21,27,38,15,13,14,320,410,905,920,777,789,23,30,35,14,11,11,370,356,845,978,845,847,27,32,33,9,12,12,396,346,601,864,847,990,32,23,37,19,8,11,308,362,788,701,1071,896,29,21,40,12,7,18,186,536,944,960,1298,845,21,39,36,12,7,19,460,432,863,1015,675,992,28,38,30,16,9,13,375,307,767,792,694,768,20,10,20,11,14,15,8 +332,498,885,921,650,826,35,30,21,14,10,9,319,131,686,810,691,971,34,23,22,17,12,9,291,171,753,773,1088,826,23,17,36,1,10,10,239,93,957,1012,883,839,11,9,26,4,2,1,244,104,923,1028,999,769,8,5,36,5,3,10,212,258,760,968,1130,863,7,13,31,1,10,18,312,274,847,817,770,943,28,15,26,22,10,2,320,350,794,718,786,881,31,25,33,13,13,14,441,233,823,864,782,947,25,38,34,8,6,17,205,277,869,894,1053,844,11,21,4,17,3,4,326,378,715,915,973,830,12,26,28,13,13,10,300,404,954,906,744,760,26,31,33,12,9,7,376,388,886,952,812,816,28,33,33,11,14,12,396,348,586,874,814,993,23,22,41,21,10,11,268,352,795,721,1038,873,20,20,38,14,9,18,150,490,983,1010,1265,790,12,38,32,14,5,15,450,442,830,997,642,1025,35,37,34,18,11,13,327,295,816,766,661,711,27,9,24,13,14,15,8 +369,493,717,937,656,848,27,33,28,5,13,9,404,178,586,798,697,933,22,24,21,16,11,11,332,208,653,711,1094,818,25,18,31,8,13,12,272,154,799,1004,889,807,15,10,21,9,1,1,283,167,771,992,1005,733,10,10,31,10,0,8,229,247,594,896,1136,831,9,14,38,10,7,18,387,275,717,801,776,851,16,16,21,13,7,4,309,311,666,742,792,791,19,14,28,16,10,16,494,220,787,894,788,815,37,27,29,13,1,17,160,276,699,784,1059,870,1,18,9,8,4,6,377,323,545,845,979,768,0,15,35,8,10,12,319,415,784,916,750,766,18,24,34,7,12,9,419,375,772,982,818,774,20,22,32,14,11,14,481,251,494,846,820,883,11,17,36,12,13,9,249,259,643,639,1044,833,8,15,39,5,12,16,89,451,811,882,1271,824,0,29,37,5,10,17,491,407,784,1017,648,827,33,34,29,11,4,11,362,240,702,792,667,797,13,10,19,12,11,17,8 +452,432,1201,740,655,938,36,14,11,10,8,11,383,427,876,661,696,917,31,13,22,21,12,11,309,131,989,690,1093,908,16,37,34,7,12,2,253,203,1201,833,888,1005,12,31,38,0,4,5,192,174,1167,865,1004,917,1,23,34,3,5,10,246,264,1042,879,1135,873,0,35,21,5,10,4,294,376,1023,652,775,847,25,21,38,18,8,4,366,476,994,533,791,861,28,27,39,23,11,16,385,465,819,671,787,975,28,16,40,18,16,17,239,199,1197,889,1058,1000,8,15,8,13,1,0,394,290,1043,804,978,788,9,22,18,17,7,6,328,336,1282,751,749,854,27,17,21,16,9,1,386,452,1166,759,817,800,29,7,21,19,10,14,382,354,812,723,819,819,20,20,33,17,12,9,314,336,1049,706,1043,901,17,34,28,12,11,4,150,282,1281,983,1270,936,9,16,20,10,3,1,380,592,910,814,647,1007,42,15,36,16,15,9,439,407,1140,591,666,875,24,27,12,15,12,17,8 +467,453,1050,836,662,838,36,13,20,11,8,14,428,264,735,721,703,917,31,14,21,22,12,12,358,138,864,724,1100,834,16,36,41,2,12,3,272,172,1074,925,895,863,12,28,31,1,0,2,245,131,1038,951,1011,813,1,18,41,2,1,9,271,205,901,917,1142,835,0,34,30,4,8,11,361,259,918,734,782,881,25,22,31,19,8,5,397,357,875,633,798,839,28,24,38,18,11,17,456,306,778,777,794,945,28,19,39,13,12,18,220,188,1042,851,1065,878,8,16,1,14,1,1,457,257,888,854,985,744,9,21,27,16,7,7,383,349,1127,821,756,746,27,22,28,15,9,2,409,387,1019,865,824,756,29,12,28,16,10,15,455,225,683,801,826,921,20,21,42,18,12,8,313,231,914,688,1050,855,17,33,37,11,11,11,121,381,1136,975,1277,826,9,19,27,11,3,8,437,481,817,914,654,1001,42,18,39,17,15,14,444,272,985,679,673,713,22,28,19,10,12,18,8 +415,429,893,759,666,940,27,27,30,2,10,11,400,484,604,658,707,909,22,10,21,13,14,11,332,266,743,601,1104,902,25,30,31,11,14,2,296,330,905,830,899,989,15,22,21,8,2,3,287,315,877,842,1015,889,10,12,31,9,1,8,231,433,734,778,1146,863,9,28,40,13,8,6,369,391,759,629,786,847,16,8,21,10,8,4,313,471,720,558,802,853,19,12,28,17,9,16,470,502,723,710,798,957,37,25,29,12,8,17,234,188,891,792,1069,1006,1,16,9,5,1,0,401,329,735,723,989,796,0,15,37,9,9,6,325,331,974,770,760,864,18,28,34,8,11,1,423,463,936,798,828,796,20,18,32,11,14,14,467,399,514,684,830,789,11,9,36,9,14,9,263,395,745,583,1054,887,8,25,39,6,13,6,111,159,973,872,1281,934,0,29,37,2,1,3,447,533,726,833,658,937,33,24,29,10,13,9,424,474,882,626,677,929,13,14,19,13,10,17,8 +383,509,905,863,633,879,37,32,26,14,12,9,318,152,702,736,674,960,32,19,25,17,10,11,272,150,737,677,1071,863,15,21,35,1,12,8,266,124,969,944,866,880,13,13,25,4,0,1,209,91,937,948,982,814,0,3,35,5,1,8,197,253,772,872,1113,870,1,17,36,1,8,16,301,299,855,741,753,904,26,11,25,22,8,4,315,355,806,660,769,864,29,21,32,13,11,16,420,240,773,810,765,922,27,34,33,8,4,17,214,274,891,800,1036,911,9,19,5,17,1,2,343,373,737,819,956,787,10,22,33,13,11,8,291,439,976,848,727,787,28,29,34,12,9,5,387,389,898,898,795,801,30,29,34,11,12,14,387,339,594,794,797,942,21,18,40,21,12,9,269,349,805,623,1021,882,18,20,43,14,11,16,159,455,997,912,1248,861,10,34,33,14,5,13,423,437,854,941,625,956,43,33,33,18,9,11,378,302,834,712,644,790,21,9,23,13,12,17,8 +460,476,1060,795,672,931,36,23,22,10,9,14,407,341,771,700,713,916,31,12,23,21,15,12,337,155,862,687,1110,901,16,38,41,3,11,3,269,173,1092,888,905,948,12,22,31,0,1,2,240,160,1064,914,1021,910,1,16,41,1,2,9,260,252,909,874,1152,868,0,34,32,5,9,9,340,392,960,699,792,840,25,12,31,18,9,5,368,488,921,592,808,838,28,20,38,19,12,17,441,391,796,738,804,954,28,27,39,14,9,18,233,213,1052,856,1075,993,8,16,1,13,2,1,436,336,898,809,995,753,9,25,29,17,10,7,374,382,1137,798,766,847,27,28,28,16,8,2,388,478,1033,826,834,813,29,18,28,17,13,15,434,338,707,762,836,844,20,11,44,17,11,8,312,336,928,665,1060,892,17,35,39,10,10,9,152,302,1144,950,1287,945,9,27,27,10,4,6,450,610,873,873,664,946,42,26,39,16,14,12,433,373,995,650,683,852,22,20,19,11,13,18,8 +465,423,1076,726,641,883,36,15,20,11,8,10,400,372,765,631,682,912,31,12,21,20,12,12,332,110,872,638,1079,865,16,32,39,4,12,3,270,188,1082,819,874,946,12,28,29,1,0,4,215,179,1054,843,990,892,1,18,39,0,1,9,255,255,917,825,1121,822,0,30,30,6,8,5,319,357,932,628,761,832,25,20,29,17,8,5,391,449,895,523,777,836,28,24,36,20,11,17,430,414,752,663,773,950,28,19,37,15,12,18,234,174,1074,811,1044,951,8,18,1,14,1,1,415,283,920,756,964,719,9,27,27,18,7,7,355,319,1159,729,735,801,27,20,30,17,9,2,409,433,1047,751,803,739,29,10,30,18,10,15,407,327,691,693,805,830,20,19,42,16,12,8,325,315,924,638,1029,860,17,35,37,9,11,5,173,285,1158,919,1256,879,9,19,29,9,3,2,423,579,829,800,633,966,42,18,37,15,15,10,446,376,1017,575,652,836,20,26,21,12,12,18,8 +242,498,879,822,735,759,37,32,24,16,14,12,189,171,730,711,776,1010,34,15,25,17,10,6,221,161,723,678,1117,803,19,19,37,3,8,9,289,91,965,917,890,810,15,17,27,6,4,4,194,156,931,935,998,746,14,7,37,7,5,13,164,264,764,871,1165,862,15,19,34,1,8,17,202,264,877,720,861,1054,38,7,27,22,8,1,244,340,828,623,881,948,39,17,34,13,15,11,337,249,793,765,841,992,19,30,35,8,4,18,315,247,859,799,1112,779,23,19,3,17,5,5,222,376,705,816,1032,889,24,18,31,11,13,9,242,396,944,805,839,841,30,29,32,10,11,6,308,372,870,853,883,845,34,31,32,11,12,9,262,340,624,783,903,1092,35,14,42,21,8,14,262,360,805,648,1125,884,32,14,41,14,7,17,286,474,979,935,1276,709,24,34,31,16,7,14,360,458,888,898,725,1122,39,29,35,18,7,16,335,301,802,665,722,620,21,9,23,13,14,12,8 +355,415,842,827,628,784,28,22,20,5,10,12,408,240,571,714,669,841,23,9,21,14,14,10,350,188,736,723,1066,776,24,25,41,10,10,5,304,154,888,918,861,827,14,23,31,11,2,0,317,171,854,944,977,773,9,13,41,12,3,9,267,205,699,912,1108,773,8,25,30,12,10,13,395,235,758,727,748,827,17,15,31,11,10,3,351,351,707,624,764,771,20,13,38,12,13,15,522,250,784,768,760,887,36,24,39,11,10,16,150,172,828,838,1031,838,0,7,1,6,3,1,335,287,674,847,951,666,1,18,27,6,9,5,339,317,913,810,722,696,19,27,28,5,9,2,455,331,875,856,790,690,21,25,28,12,12,13,489,271,547,794,792,841,12,14,42,12,10,10,299,267,724,693,1016,783,9,28,37,5,9,13,147,409,930,980,1243,786,1,24,27,5,5,10,535,469,761,905,620,933,34,23,39,13,15,14,354,260,801,668,639,675,14,17,19,8,14,16,8 +417,503,799,930,669,876,33,30,30,11,15,8,370,166,648,791,710,987,28,19,21,16,9,10,308,148,681,704,1107,862,19,23,31,2,11,13,240,120,887,999,902,857,9,13,21,1,1,0,223,107,861,987,1018,779,4,3,31,2,2,9,249,249,680,899,1149,879,3,19,40,4,9,19,327,287,805,796,789,911,22,11,21,19,9,3,345,331,750,735,805,857,25,21,28,12,12,15,438,238,769,887,801,891,31,34,29,7,1,16,194,274,781,805,1072,906,5,19,9,14,2,7,405,361,627,850,992,818,6,22,37,16,12,13,347,431,866,915,763,790,24,31,34,15,10,10,383,391,794,975,831,822,26,27,32,10,9,13,421,315,544,839,833,949,17,18,36,18,11,10,291,325,737,644,1057,883,14,22,39,11,10,17,139,489,893,889,1284,852,6,34,37,11,8,18,437,409,798,1010,661,915,39,33,29,17,6,12,390,272,726,789,680,819,19,11,19,10,13,16,8 +380,490,834,958,698,651,32,21,23,8,9,9,279,299,639,849,723,880,27,26,16,11,13,11,189,235,682,844,922,639,14,6,34,11,11,18,297,283,928,1039,679,602,14,18,24,8,1,1,350,222,888,1107,757,538,19,24,34,7,2,8,174,218,725,1061,984,738,20,8,25,11,9,18,274,288,812,904,834,852,33,24,24,16,9,4,194,272,757,795,870,746,30,12,31,15,12,16,387,285,688,911,718,786,14,25,32,8,7,17,207,253,810,885,959,607,28,16,6,7,2,12,226,228,656,1002,901,819,29,9,22,11,12,18,358,406,895,925,816,701,31,24,27,10,8,15,414,410,831,999,774,719,35,30,35,9,15,14,312,174,579,959,846,908,38,25,37,15,11,9,180,178,766,810,1054,724,37,9,32,14,10,16,230,368,936,1045,1063,581,29,19,34,8,4,17,398,410,841,1030,668,924,38,34,32,12,12,11,325,329,757,795,571,518,16,10,22,11,13,17,8 +382,482,1039,751,655,920,39,27,23,12,8,13,295,321,752,640,696,945,34,12,24,19,14,9,249,149,847,649,1093,898,13,34,38,1,12,0,263,171,1075,838,888,983,15,20,28,2,0,1,222,142,1045,858,1004,929,2,12,38,3,1,10,216,284,892,832,1135,859,3,30,33,3,8,8,266,368,937,643,775,869,28,12,28,20,8,2,280,506,892,548,791,873,31,18,35,15,11,14,369,391,789,696,787,987,25,27,36,10,10,15,257,247,1031,796,1058,984,11,16,2,15,1,2,330,352,877,765,978,760,12,23,30,15,9,4,314,388,1116,744,749,834,30,24,31,14,9,1,368,498,1022,784,817,780,32,18,31,13,12,12,356,390,688,704,819,863,23,11,43,19,12,11,274,384,911,645,1043,895,20,29,40,12,11,8,200,342,1127,930,1270,918,12,29,30,12,3,5,390,624,878,829,647,999,45,26,36,18,15,11,387,405,974,604,666,869,25,14,22,11,12,15,8 +405,443,834,857,643,890,28,28,29,4,11,12,416,254,593,728,684,935,23,19,20,15,11,12,352,126,680,663,1081,864,24,27,30,9,13,5,246,148,880,928,876,877,14,13,20,6,1,2,249,185,850,932,992,821,9,5,30,7,0,9,253,325,691,850,1123,845,8,23,39,11,7,13,375,275,762,725,763,847,17,11,20,12,7,5,359,385,715,660,779,831,20,21,27,13,10,17,478,330,740,812,775,889,36,34,28,12,5,18,174,170,824,802,1046,928,0,17,10,7,0,1,387,323,670,801,966,732,1,22,36,11,10,7,347,353,909,850,737,798,19,33,33,10,10,2,413,471,831,900,805,760,21,25,31,13,13,15,471,307,511,776,807,883,12,18,35,11,13,8,281,317,716,605,1031,875,9,28,38,4,12,13,81,349,924,896,1258,878,1,34,38,4,4,10,459,529,751,935,635,897,34,33,28,10,10,14,388,300,793,720,654,813,14,13,18,9,11,18,8 +475,405,1264,620,684,959,36,11,9,10,8,11,416,620,941,593,725,890,31,26,40,21,12,11,362,236,1024,624,1122,931,16,24,30,7,12,2,276,362,1226,711,917,1082,12,34,40,0,8,13,225,283,1196,767,1033,890,1,36,30,3,9,10,277,337,1093,801,1164,874,0,28,17,5,10,0,331,493,1032,570,804,862,25,34,40,18,12,8,425,579,1017,463,820,864,28,30,33,23,11,16,414,606,802,533,816,960,28,11,32,18,18,17,288,260,1268,857,1087,1061,8,26,26,13,1,0,417,285,1114,728,1007,783,9,29,12,17,7,6,339,371,1353,641,778,901,27,12,13,16,9,1,425,487,1237,621,846,819,29,8,15,19,10,14,413,449,843,629,848,746,20,27,25,17,12,9,355,431,1088,682,1072,894,17,21,22,12,11,2,193,191,1334,949,1299,971,9,3,2,10,3,1,401,637,897,678,676,1006,42,12,32,16,15,9,490,536,1211,485,695,1002,24,36,20,15,14,17,8 +301,533,917,787,659,843,38,31,21,14,10,12,260,202,710,680,700,964,33,24,22,19,12,6,282,130,767,653,1097,851,14,22,40,1,10,7,262,118,989,878,892,922,14,8,30,4,2,4,193,125,955,902,1008,834,1,2,40,5,3,13,205,257,792,850,1139,830,2,18,31,1,10,15,269,317,881,687,779,922,27,16,30,22,10,1,301,429,826,584,795,880,30,26,37,15,13,11,378,300,805,728,791,972,26,39,38,10,6,16,274,266,901,816,1062,913,10,22,0,17,3,5,297,375,747,793,982,731,11,27,28,13,13,7,265,431,986,784,753,763,29,30,29,12,9,4,343,447,912,816,821,745,31,30,29,13,14,9,329,391,618,750,823,932,22,23,43,21,10,14,283,381,827,627,1047,860,19,25,38,14,9,15,205,411,1013,912,1274,831,11,39,28,14,5,12,397,525,844,865,651,1018,44,38,38,20,11,16,348,354,846,636,670,804,22,10,20,13,14,12,8 +410,392,1055,735,653,862,32,15,10,11,10,12,387,439,740,662,694,869,27,12,25,22,14,10,345,179,849,699,1091,852,20,38,33,2,10,1,267,223,1065,828,886,965,10,26,41,1,4,6,264,222,1035,874,1002,883,5,20,33,2,5,11,274,288,896,880,1133,797,4,36,20,4,10,3,340,430,903,659,773,827,21,20,39,19,10,3,386,508,866,544,789,811,24,28,38,18,13,15,461,489,759,670,785,939,32,21,39,13,16,16,225,177,1051,884,1056,952,4,18,11,14,3,1,412,260,897,809,976,672,5,23,17,16,9,5,372,328,1136,748,747,790,23,22,18,15,9,0,400,450,1032,758,815,732,25,12,18,16,12,13,430,368,674,730,817,791,16,19,32,18,10,10,336,344,907,721,1041,831,13,35,27,11,9,3,180,266,1135,1000,1268,872,5,21,17,11,5,2,470,640,816,807,645,991,38,20,35,17,17,8,409,423,994,588,664,817,20,28,9,10,14,16,8 +332,494,859,844,642,773,33,27,20,13,11,10,289,177,668,737,683,948,38,18,21,18,11,8,267,147,705,716,1080,795,23,20,39,0,9,7,273,91,929,937,875,818,9,14,29,3,3,2,220,130,895,965,991,744,8,4,39,4,4,11,194,242,734,909,1122,834,7,16,30,2,9,15,264,290,827,748,762,960,32,10,29,21,9,1,316,380,774,645,778,870,35,20,36,14,14,13,415,255,757,787,774,942,21,33,37,9,5,16,265,241,841,837,1045,805,15,16,1,16,4,3,320,330,687,852,965,819,16,21,27,14,14,7,278,382,926,831,736,751,24,34,30,13,10,4,332,394,848,875,804,805,26,30,30,12,13,11,348,326,564,811,806,998,27,17,42,20,9,12,286,316,765,676,1030,842,24,21,37,13,8,15,216,442,953,965,1257,747,16,33,29,13,6,12,434,488,804,920,634,1042,35,32,37,19,10,14,353,269,784,687,653,658,25,12,21,12,15,14,8 +463,469,932,959,641,850,34,25,30,10,11,10,432,226,685,828,682,927,29,14,21,17,11,12,362,138,770,769,1079,834,18,22,31,3,13,9,262,162,988,1032,874,847,10,22,21,0,1,2,243,131,954,1038,990,773,3,12,31,1,0,9,277,211,795,962,1121,847,2,24,40,5,7,17,361,243,870,829,761,877,23,16,21,18,7,5,379,335,817,760,777,817,26,12,28,13,10,17,472,278,806,912,773,883,30,25,29,8,5,18,188,224,918,858,1044,888,6,8,9,13,0,3,429,291,764,913,964,774,7,15,37,17,10,9,405,373,1003,934,735,762,25,32,34,16,10,6,415,395,919,1000,803,788,27,26,32,11,13,15,457,253,609,882,805,911,18,15,36,17,13,8,299,263,824,711,1029,845,15,23,39,10,12,15,127,415,1024,990,1256,842,7,25,37,10,4,14,445,461,807,1037,633,919,40,28,29,16,10,10,418,264,861,810,652,773,18,14,19,9,11,18,8 +430,454,1057,749,679,912,35,21,24,11,8,13,399,323,752,658,720,941,30,12,25,20,14,11,349,105,861,643,1117,896,17,34,39,4,12,2,229,141,1079,840,912,957,11,20,29,1,0,1,212,164,1047,858,1028,919,2,12,39,0,1,8,266,258,906,826,1159,863,1,30,34,6,8,8,326,358,931,645,799,889,24,14,29,17,8,4,396,452,890,546,815,879,27,20,36,18,11,16,429,369,785,692,811,999,29,27,37,13,10,17,215,189,1051,814,1082,970,7,12,1,14,1,0,430,318,897,759,1002,750,8,25,31,18,9,6,368,360,1136,758,773,822,26,28,30,17,9,1,386,470,1028,780,841,774,28,18,30,16,12,14,422,332,688,704,843,895,19,13,44,16,12,9,336,336,919,635,1067,901,16,35,41,9,11,8,144,322,1143,920,1294,910,8,27,29,9,3,5,416,592,832,825,671,1005,41,26,37,15,15,11,429,349,994,606,690,815,23,20,21,10,12,17,8 +380,366,989,643,664,897,25,13,11,7,9,11,397,613,666,590,705,810,20,28,34,12,11,13,321,331,857,605,1102,851,23,22,32,14,13,4,285,439,961,732,897,992,17,38,36,9,5,11,286,394,933,772,1013,798,12,38,32,10,6,10,208,424,818,790,1144,806,11,26,19,14,9,2,384,492,773,561,784,830,14,36,36,9,9,6,314,496,756,446,800,796,17,26,35,16,10,18,495,515,747,568,796,874,39,13,34,9,17,19,191,261,993,836,1067,981,3,22,20,8,0,2,388,246,839,717,987,765,2,25,14,14,6,8,320,306,1078,660,758,845,16,14,15,15,10,3,422,422,1062,656,826,729,18,10,17,10,11,16,478,386,576,628,828,680,9,29,27,8,13,7,234,368,817,641,1052,822,6,19,24,13,12,0,110,120,1061,916,1279,889,2,1,8,7,2,1,490,482,660,709,656,906,31,14,34,9,14,11,379,479,992,498,675,976,15,32,14,16,13,19,8 +234,454,735,862,666,780,25,30,24,17,15,12,273,201,644,751,707,985,30,23,25,16,11,6,325,259,653,694,1104,798,21,17,37,4,7,13,329,137,841,957,899,805,13,9,27,7,5,4,234,216,809,959,1015,737,20,5,37,8,6,13,252,340,634,887,1146,865,19,13,34,2,7,21,276,298,791,758,786,1025,36,15,27,21,7,1,298,354,732,663,802,915,33,25,34,12,14,11,405,259,801,805,798,951,9,38,35,7,5,18,325,309,703,809,1069,782,27,21,3,16,6,7,302,436,549,832,989,892,28,26,31,10,12,13,268,362,788,847,760,816,30,31,32,9,12,10,340,362,750,893,828,860,32,33,32,10,13,9,332,334,536,811,830,1055,39,22,42,20,7,14,322,360,693,650,1054,869,36,20,41,13,6,21,262,550,829,937,1281,730,28,38,31,17,10,18,452,470,814,938,658,1061,23,37,35,17,8,16,311,289,656,707,677,643,17,9,23,12,13,12,8 +437,419,867,837,634,784,27,16,22,4,10,15,430,316,558,726,675,835,22,11,21,11,14,13,362,206,727,707,1072,764,25,35,35,13,14,4,296,242,899,928,867,817,15,27,25,10,2,3,287,217,869,940,983,759,10,17,35,9,1,10,263,275,716,894,1114,739,9,31,30,15,8,10,403,231,749,731,754,777,16,19,25,8,8,6,343,291,708,634,770,751,19,21,32,15,9,18,512,306,753,780,766,847,37,20,33,8,10,19,148,188,859,832,1037,832,1,13,5,7,1,2,381,225,705,831,957,624,0,22,27,11,9,8,397,313,944,824,728,696,18,25,32,12,11,3,439,359,878,868,796,652,20,15,34,9,12,16,501,197,528,786,798,797,11,18,40,7,14,7,277,195,735,675,1022,773,8,36,37,10,13,10,99,307,951,964,1249,774,0,20,33,4,1,7,475,443,690,913,626,863,33,19,33,8,13,13,382,274,844,684,645,709,13,25,23,17,10,19,8 +397,491,1049,765,663,914,35,25,20,11,9,13,360,328,756,680,704,943,30,16,21,22,13,11,336,130,859,679,1101,898,17,32,43,2,11,2,242,146,1079,860,896,947,11,16,33,1,1,1,229,139,1049,894,1012,909,2,10,43,2,2,8,249,255,898,868,1143,865,1,28,30,4,9,8,321,377,935,677,783,879,24,10,33,19,9,4,381,501,892,564,799,873,27,18,40,18,12,16,422,376,807,702,795,989,29,31,41,13,11,17,248,228,1041,862,1066,970,7,14,3,14,2,0,399,341,887,801,986,752,8,23,27,16,8,6,323,403,1126,772,757,824,26,32,26,15,8,1,377,493,1032,790,825,776,28,22,26,16,11,14,403,355,690,746,827,897,19,15,42,18,11,9,321,349,917,667,1051,903,16,33,37,11,10,8,169,333,1133,950,1278,912,8,31,25,11,4,5,419,629,858,839,655,1017,41,30,41,17,16,11,416,360,984,618,674,817,23,18,17,10,13,17,8 +410,526,812,901,656,896,31,31,31,10,14,10,395,201,627,768,697,979,26,24,20,13,10,10,341,171,684,689,1094,882,21,24,30,3,12,7,235,133,878,968,889,889,11,8,20,0,0,0,252,168,848,968,1005,825,6,2,30,1,1,9,268,324,681,880,1136,887,5,20,41,5,8,15,356,334,774,765,776,917,20,16,20,18,8,3,372,420,725,708,792,877,23,26,27,9,11,15,461,273,754,860,788,921,33,39,28,4,2,16,189,237,798,812,1059,930,3,22,10,13,1,1,402,398,644,835,979,804,4,27,38,17,11,7,354,420,883,890,750,804,22,30,33,16,9,4,406,434,815,948,818,818,24,30,31,7,10,13,448,354,521,812,820,961,15,23,35,17,12,10,306,370,716,629,1044,901,12,27,38,10,11,15,132,438,906,918,1271,878,4,39,38,10,7,12,458,456,795,977,648,947,37,38,28,14,7,12,399,325,747,766,667,807,17,12,18,9,12,16,8 +344,486,966,795,661,870,38,25,20,11,8,13,281,251,721,688,702,981,33,16,21,18,14,9,257,95,794,681,1099,864,14,28,39,2,12,4,231,121,1022,880,894,933,14,16,29,1,0,1,172,138,992,908,1010,855,1,6,39,2,1,10,194,248,829,862,1141,849,2,24,30,4,8,12,236,310,902,689,781,937,27,10,29,19,8,2,306,452,855,592,797,899,30,18,36,14,11,14,347,323,790,742,793,993,26,31,37,9,8,15,271,227,954,830,1064,920,10,14,1,14,1,2,308,336,800,801,984,760,11,19,27,16,11,4,294,392,1039,792,755,782,29,32,30,15,9,1,310,464,949,830,823,770,31,22,30,12,14,12,316,370,647,752,825,943,22,15,42,18,12,11,286,362,858,653,1049,885,19,29,37,11,11,12,208,356,1058,942,1276,846,11,31,29,11,3,9,372,564,845,871,653,1037,44,30,37,17,13,15,373,361,897,652,672,817,24,16,21,10,12,15,8 +359,407,806,1002,628,770,26,30,27,12,11,9,334,178,643,877,669,929,31,21,20,19,11,9,312,210,692,834,1066,774,28,15,30,1,9,14,262,132,904,1083,861,767,10,15,20,2,3,1,243,175,870,1089,977,691,23,15,30,3,4,10,257,227,697,1029,1108,833,22,17,35,3,9,20,305,197,810,882,748,929,37,19,20,20,9,2,343,289,749,801,764,821,34,13,27,15,14,14,426,198,806,953,760,887,14,24,28,10,5,17,202,250,774,911,1031,782,22,11,10,15,4,8,341,359,620,976,951,834,23,18,32,15,14,14,351,321,859,971,722,746,25,29,33,14,10,11,367,305,797,1041,790,824,29,25,31,13,13,12,387,263,545,935,792,963,34,18,35,19,9,11,311,275,746,780,1016,819,31,18,38,12,8,18,189,475,898,1041,1243,746,23,24,38,12,6,19,451,407,775,1082,620,973,20,35,28,18,10,13,350,244,717,847,639,665,18,7,18,11,15,15,8 +429,523,949,877,681,894,36,27,26,12,10,11,394,168,716,756,722,955,31,20,27,19,12,9,358,138,785,707,1119,890,16,26,37,1,12,6,278,100,1013,962,914,907,12,12,27,2,0,1,253,103,979,970,1030,853,1,4,37,3,1,10,293,231,818,902,1161,883,0,22,36,3,8,14,371,309,891,761,801,919,25,12,27,20,8,2,397,387,838,674,817,869,28,22,34,15,11,14,458,276,805,820,813,951,28,35,35,10,6,15,232,264,935,834,1084,950,8,18,3,15,1,2,425,377,781,849,1004,772,9,23,33,15,11,6,365,429,1020,862,775,808,27,34,32,14,9,3,429,411,938,908,843,796,29,26,32,13,14,12,453,351,630,816,845,951,20,19,42,19,12,11,343,361,849,667,1069,897,17,27,43,12,11,14,155,429,1043,956,1296,898,9,35,31,12,3,11,453,481,846,953,673,977,42,34,35,18,11,13,412,308,878,724,692,787,24,14,23,11,12,15,8 +376,302,1005,606,668,813,26,9,6,3,10,13,375,569,682,569,709,798,21,26,37,12,12,9,313,293,859,600,1106,785,24,24,27,14,14,0,273,417,979,697,901,952,16,34,37,9,8,13,242,386,947,743,1017,740,11,34,27,10,9,12,224,386,834,771,1148,742,10,26,14,14,8,2,364,440,775,540,788,804,15,34,37,9,12,8,322,474,768,441,804,770,18,30,30,16,9,14,455,483,751,529,800,846,38,11,29,9,16,15,195,225,1009,817,1071,899,2,24,23,6,1,2,368,184,855,700,991,689,1,29,9,10,7,4,300,262,1094,631,762,745,17,12,10,11,11,1,412,376,1052,617,830,651,19,8,12,10,12,12,450,360,598,601,832,684,10,27,22,8,14,11,274,342,835,660,1056,772,7,21,19,9,13,4,108,102,1077,929,1283,801,1,3,5,3,1,3,442,506,662,670,660,918,32,12,29,9,13,9,383,433,990,473,679,872,14,34,17,16,12,15,8 +391,463,902,881,647,808,29,28,28,11,10,11,390,216,659,762,688,903,28,17,23,18,14,11,344,160,744,757,1085,810,23,29,33,2,10,6,238,106,952,962,880,843,9,15,23,1,2,1,263,135,920,984,996,787,8,7,33,2,3,8,261,241,761,938,1127,833,7,25,38,4,10,14,335,271,832,765,767,909,22,9,23,19,10,4,373,393,783,680,783,829,25,19,30,14,13,16,456,300,792,832,779,935,31,32,31,9,8,17,206,196,888,880,1050,852,5,17,7,14,3,0,399,275,734,879,970,762,6,20,35,16,11,6,365,343,973,870,741,726,20,33,36,15,9,3,385,409,897,920,809,768,22,23,34,12,14,14,427,295,573,828,811,931,17,16,38,18,10,9,313,287,788,707,1035,833,14,28,41,11,9,14,159,405,990,998,1262,804,6,32,35,11,5,11,471,517,783,959,639,995,35,31,31,17,13,13,394,258,831,736,658,687,21,13,21,10,14,17,8 +380,410,935,765,659,839,30,21,21,8,8,12,381,361,636,668,702,854,25,10,22,19,12,10,331,185,759,689,1097,827,22,40,42,5,12,1,255,173,967,856,892,910,12,24,32,2,0,2,260,176,937,888,1008,866,7,18,42,3,1,9,268,264,784,870,1139,782,6,36,31,7,8,7,350,384,821,669,779,814,19,14,32,16,8,3,348,464,782,562,797,790,22,22,39,19,11,15,455,425,769,708,791,918,34,25,40,14,12,16,207,187,927,850,1062,917,2,18,2,11,1,1,390,266,773,801,982,651,3,27,28,15,7,5,346,318,1012,768,753,761,21,26,27,14,9,0,394,438,922,796,821,713,23,16,27,17,10,13,438,304,586,736,823,800,14,13,43,15,12,10,310,296,803,687,1047,814,11,37,38,12,11,7,142,294,1019,972,1274,849,3,25,26,8,3,4,472,606,766,841,651,942,36,24,40,14,15,10,387,349,870,618,670,764,18,22,18,11,12,16,8 +375,461,784,842,638,829,26,26,24,6,10,12,390,304,563,727,679,850,21,13,25,15,12,12,312,212,728,676,1076,791,22,29,37,9,12,5,294,230,830,931,871,804,16,19,27,8,0,2,291,189,800,939,987,752,11,9,37,9,1,9,199,263,641,873,1118,774,10,25,34,11,8,13,375,271,714,732,758,776,15,9,27,12,8,5,293,345,667,639,774,742,18,15,34,19,11,17,500,338,754,787,770,816,38,28,35,14,6,18,166,200,772,817,1041,863,2,13,3,7,1,1,361,283,618,818,961,699,1,18,31,13,11,7,307,349,857,831,732,755,17,31,32,14,9,2,427,417,849,875,800,703,19,21,32,13,14,15,469,227,477,787,802,808,10,12,42,11,12,8,209,239,666,630,1026,798,7,28,41,12,11,13,107,345,872,913,1253,817,1,28,31,6,3,10,499,499,731,922,630,832,32,27,35,10,11,14,358,250,775,693,649,758,14,15,23,13,12,18,8 +432,440,1097,776,669,919,37,18,16,11,9,12,373,365,782,677,710,932,32,9,19,20,13,10,305,135,901,708,1107,899,15,41,39,2,11,1,249,177,1119,865,902,978,13,25,35,1,3,2,210,144,1087,897,1018,938,0,19,39,2,4,9,248,256,946,889,1149,864,1,37,26,4,11,7,306,368,965,678,789,870,26,17,35,19,9,3,354,498,926,573,805,870,29,25,42,16,12,15,409,429,807,719,801,990,27,24,43,11,15,16,243,223,1091,869,1072,979,9,19,5,14,2,1,404,304,937,820,992,767,10,26,23,16,8,5,344,356,1176,775,763,831,28,25,24,15,8,0,366,466,1076,807,831,787,30,15,24,14,11,13,402,368,728,749,833,868,21,16,38,18,11,10,308,358,959,706,1057,898,18,38,33,11,10,7,154,306,1183,991,1284,919,10,24,23,11,4,4,416,638,870,852,661,1028,43,23,41,17,16,10,415,403,1034,629,680,832,25,25,15,10,13,16,8 +407,417,1067,750,678,880,33,21,16,11,9,13,356,416,764,669,719,881,28,10,21,22,13,9,304,148,867,680,1116,864,19,40,39,4,11,0,272,184,1085,847,911,975,9,24,37,1,1,5,235,191,1055,877,1027,883,4,18,39,2,2,10,241,265,912,871,1158,805,3,36,26,4,9,4,313,425,939,662,798,819,22,14,37,19,9,2,349,515,898,551,814,813,25,22,44,20,12,14,434,446,773,681,810,933,31,25,45,15,13,15,236,194,1061,865,1081,976,5,18,7,14,2,2,385,295,907,800,1001,696,6,27,23,16,8,4,331,341,1146,755,772,814,24,26,22,15,8,1,379,459,1040,769,840,752,26,16,22,18,11,12,403,359,694,731,842,771,17,13,38,18,11,11,301,341,925,702,1066,835,14,37,33,11,10,4,169,273,1149,979,1293,890,6,25,21,11,4,3,447,629,854,822,670,945,39,24,41,17,16,9,396,404,1004,597,689,875,21,22,13,12,13,15,8 +329,355,908,707,630,841,26,10,14,1,9,11,388,490,607,630,671,814,21,17,21,12,13,11,318,258,808,629,1068,803,22,33,37,12,11,2,282,312,910,790,863,908,16,33,35,11,1,7,295,331,882,818,979,798,11,25,37,12,2,10,229,405,745,804,1110,768,10,31,24,14,9,2,379,395,752,599,750,774,15,25,33,11,9,4,335,461,719,500,766,756,18,25,36,16,12,16,502,498,770,650,762,860,38,12,37,11,13,17,168,156,906,822,1033,907,2,19,5,4,2,0,331,261,752,735,953,715,1,24,21,6,8,6,287,257,991,724,724,781,17,13,24,7,8,1,439,419,971,738,792,699,19,9,24,10,11,14,469,373,541,668,794,720,10,18,36,12,11,9,267,353,752,645,1018,792,7,30,31,5,10,2,131,171,986,926,1245,837,1,12,23,3,4,1,507,535,711,781,622,876,32,11,37,13,16,9,364,444,899,574,641,830,14,31,15,12,13,17,8 +346,304,910,695,669,791,23,10,14,3,8,11,443,485,595,616,710,772,18,17,23,12,12,11,349,247,836,645,1107,763,23,33,37,14,12,2,311,277,908,792,902,858,19,33,39,11,4,7,346,294,878,826,1018,774,14,27,37,12,5,10,260,366,747,834,1149,728,13,31,24,14,10,2,424,364,744,611,789,748,12,25,39,11,8,4,368,398,711,494,805,720,15,27,42,16,11,16,551,459,738,628,801,834,41,12,43,11,16,17,169,153,908,832,1072,857,5,19,9,4,1,0,376,234,754,761,992,673,4,26,21,10,7,6,300,212,993,706,763,725,14,13,20,11,9,1,478,356,977,716,831,657,16,9,20,10,10,14,504,276,549,682,833,730,7,18,36,12,12,9,276,246,754,669,1057,754,4,30,31,9,11,2,138,236,988,946,1284,791,4,12,19,3,3,1,556,508,685,769,661,884,29,11,39,13,15,9,385,345,907,544,680,732,17,31,11,16,12,17,8 +410,486,1022,804,647,871,35,18,22,12,9,13,373,267,731,701,688,902,30,9,23,21,13,13,313,111,842,700,1085,843,17,33,41,1,13,4,251,137,1062,897,880,894,11,23,31,2,1,3,250,108,1032,923,996,838,2,13,41,3,0,10,232,224,875,889,1127,816,1,29,32,3,7,12,330,312,916,708,767,816,24,17,31,20,7,6,342,452,877,601,783,810,27,21,38,17,10,18,453,323,814,747,779,918,29,24,39,12,11,19,171,233,1012,853,1050,917,7,11,1,15,0,2,372,308,858,824,970,713,8,26,29,15,8,8,366,388,1097,801,741,781,26,27,28,14,10,3,390,446,1003,835,809,737,28,17,28,15,11,16,422,316,675,771,811,836,19,16,44,19,13,7,276,304,898,658,1035,848,16,36,39,12,12,12,150,364,1108,945,1262,863,8,24,27,12,2,9,458,562,847,882,639,934,41,23,39,18,14,15,369,323,955,655,658,802,19,23,19,11,11,19,8 +404,554,775,992,655,941,28,31,35,6,13,9,411,233,632,839,702,982,23,28,16,13,11,11,347,187,691,768,1093,917,24,22,26,11,13,10,235,143,857,1039,888,918,14,6,16,8,1,1,250,224,827,1025,1004,858,9,6,26,7,0,8,266,370,652,921,1135,906,8,18,39,13,7,18,370,304,767,842,775,904,17,20,16,10,7,4,358,424,716,811,797,864,20,30,23,11,10,16,465,307,807,963,787,898,36,43,24,8,1,17,173,265,759,839,1058,987,0,26,14,11,4,4,404,436,603,880,978,791,1,31,42,13,10,10,352,414,842,981,749,857,19,32,29,12,12,7,412,444,800,1051,817,825,21,34,27,9,11,14,464,380,540,871,823,936,12,27,31,9,13,9,302,372,697,664,1047,918,9,25,34,2,12,16,82,486,869,933,1270,941,1,43,42,6,10,15,452,420,830,1068,651,876,34,42,24,8,4,11,389,357,746,867,666,876,16,14,20,7,11,17,8 +415,493,1046,827,651,839,38,21,21,11,8,15,362,252,755,720,692,916,33,12,22,22,14,11,306,110,860,719,1089,833,14,36,40,2,12,2,246,124,1078,920,884,890,14,20,30,1,0,1,219,107,1046,946,1000,824,1,14,40,2,1,8,227,215,899,910,1131,812,2,32,31,4,8,10,313,311,936,731,771,866,27,14,30,19,8,4,355,433,895,624,787,836,30,20,37,18,11,16,418,296,804,764,783,938,26,27,38,13,10,17,210,222,1038,860,1054,893,10,14,0,14,1,0,393,303,884,847,974,705,11,25,28,16,9,6,321,379,1123,814,745,751,29,28,29,15,9,1,377,439,1021,852,813,727,31,18,29,16,12,14,401,303,689,796,815,888,22,13,43,18,12,9,289,297,916,697,1039,844,19,35,38,11,11,10,139,399,1134,982,1266,829,11,27,28,11,3,7,415,533,861,901,643,980,44,26,38,17,15,13,406,296,981,670,662,762,22,20,20,10,12,17,8 +398,466,1094,743,689,877,38,24,16,11,12,12,325,359,797,652,730,940,33,11,21,22,16,10,281,137,890,693,1127,879,14,39,39,2,8,1,277,137,1116,838,922,966,14,23,37,1,4,4,244,148,1088,882,1038,914,1,17,39,2,5,9,228,234,939,880,1169,838,2,35,26,4,8,5,284,390,976,665,809,904,27,11,37,19,10,3,348,510,939,550,825,880,30,19,44,18,15,15,411,393,804,680,821,1000,26,26,45,13,12,16,309,231,1088,862,1092,947,10,17,7,14,5,1,356,306,934,811,1012,713,11,24,23,16,11,5,294,372,1173,744,783,793,29,27,22,15,11,0,368,464,1069,768,851,741,31,17,22,16,14,13,368,368,727,736,853,906,22,10,38,18,8,10,318,350,954,703,1077,880,19,34,33,11,7,5,220,356,1176,984,1304,873,11,26,21,11,7,2,424,632,899,817,681,1070,44,25,41,17,17,8,425,381,1031,592,700,786,26,19,13,10,14,16,8 +462,498,1078,847,660,903,37,25,27,10,10,14,387,247,791,728,701,966,32,12,24,21,14,12,335,117,880,691,1098,897,15,32,34,3,14,3,271,165,1108,930,893,922,13,20,24,0,2,2,196,134,1078,940,1009,876,0,10,34,1,1,9,252,240,927,878,1140,882,1,28,37,5,8,9,308,302,970,731,780,920,26,10,24,18,8,5,402,392,927,646,796,892,29,14,31,17,9,17,411,303,808,796,792,976,27,27,32,12,8,18,271,225,1070,836,1063,951,9,14,6,13,1,1,408,322,916,821,983,775,10,19,34,17,9,7,336,380,1155,842,754,811,28,28,35,16,11,2,400,440,1047,884,822,797,30,18,35,15,14,15,396,300,719,786,824,956,21,11,39,17,14,8,336,308,946,661,1048,912,18,29,42,10,13,9,162,378,1162,948,1275,895,10,27,34,10,1,6,382,508,893,927,652,1002,43,26,32,16,13,12,475,301,1013,702,671,788,23,16,22,9,10,18,8 +459,497,1089,829,687,908,38,25,28,10,8,14,382,278,794,712,728,963,33,10,25,21,14,10,310,102,901,709,1125,892,14,38,35,3,12,3,268,168,1131,912,920,947,14,24,25,0,0,0,213,113,1097,932,1036,887,1,18,35,1,1,9,255,215,946,894,1167,863,2,36,38,5,8,11,297,305,985,715,807,899,27,10,25,18,8,3,353,427,940,628,823,879,30,18,32,17,11,15,392,336,825,778,819,983,26,25,33,12,10,16,264,236,1077,852,1090,960,10,18,5,13,1,1,399,319,923,831,1010,748,11,23,35,17,9,5,331,389,1162,822,781,818,29,26,34,16,9,0,387,449,1056,866,849,776,31,16,34,15,12,13,387,315,742,780,851,917,22,9,40,17,12,10,315,315,967,679,1075,899,19,33,43,10,11,11,169,367,1177,968,1302,898,11,27,33,10,3,8,379,541,900,909,679,1009,44,24,33,16,15,14,446,338,1020,686,698,835,26,18,23,9,12,16,8 +328,430,790,846,652,850,25,32,28,4,8,12,363,259,579,721,693,935,20,19,21,15,14,12,305,133,736,680,1090,830,21,25,31,9,12,5,243,127,842,917,885,867,17,13,21,8,0,2,260,208,814,925,1001,797,12,3,31,9,1,9,208,314,649,859,1132,811,11,21,38,11,8,13,356,266,730,714,772,895,14,11,21,12,8,5,316,388,679,651,788,835,17,21,28,13,11,17,461,357,754,803,784,911,39,34,29,12,8,18,165,165,778,823,1055,892,3,19,9,7,1,1,348,324,624,810,975,732,2,22,35,9,11,7,286,338,863,841,746,776,16,29,34,8,9,2,404,446,847,891,814,728,18,25,32,13,14,15,444,322,503,767,816,919,9,18,36,11,12,8,252,310,678,624,1040,849,6,24,39,4,11,13,106,358,878,917,1267,826,2,34,37,4,3,10,470,526,761,926,644,941,31,33,29,10,13,14,361,287,771,711,663,799,15,9,19,9,12,18,8 +466,486,1062,829,676,1012,37,27,34,10,9,13,411,345,797,722,717,1013,32,14,19,17,13,13,351,167,864,665,1114,992,15,34,29,3,11,4,259,211,1088,904,909,1053,13,18,19,0,1,3,210,194,1060,912,1025,1011,0,12,29,1,2,10,252,348,907,846,1156,951,1,30,42,5,9,8,322,390,956,701,796,933,26,8,19,18,9,6,392,524,919,628,812,953,29,16,26,13,12,18,423,423,822,780,808,1071,27,29,27,8,7,19,259,229,1056,858,1079,1080,9,16,11,13,2,2,432,376,902,797,999,856,10,21,41,17,12,8,352,394,1141,832,770,930,28,30,32,16,8,3,386,532,1049,868,838,872,30,20,30,11,15,16,420,436,703,754,840,931,21,13,34,17,11,7,324,434,924,629,1064,985,18,31,37,10,10,8,146,248,1144,920,1291,1010,10,29,39,10,4,5,402,644,919,905,668,1049,43,28,27,16,12,11,465,441,1001,692,687,941,25,16,17,9,13,19,8 +403,473,1009,755,638,876,36,22,18,10,10,13,342,332,716,660,679,921,31,11,19,21,14,9,290,112,821,661,1076,862,16,33,41,3,10,0,240,160,1047,848,871,927,12,21,31,0,2,1,185,151,1015,882,987,871,1,11,41,1,3,10,231,239,860,850,1118,821,0,29,28,5,10,8,273,365,911,665,758,853,25,13,31,18,10,2,341,479,866,552,774,847,28,19,38,19,13,14,392,374,775,692,770,951,28,26,39,14,10,15,240,212,1001,832,1041,942,8,11,1,13,3,2,359,317,847,785,961,714,9,24,25,17,9,4,327,377,1086,756,732,790,27,27,28,16,9,1,357,469,984,780,800,738,29,17,28,17,12,12,361,341,658,734,802,857,20,12,40,17,10,11,309,337,883,657,1026,861,17,34,35,10,9,8,181,333,1095,940,1253,872,9,26,27,10,5,5,399,605,808,829,630,981,42,25,39,16,15,11,396,354,944,604,649,819,20,19,19,11,14,15,8 +364,468,804,901,682,891,28,34,35,7,15,11,391,263,639,766,723,926,23,25,18,16,9,9,351,187,684,701,1120,875,24,25,28,6,11,6,287,139,874,964,915,902,14,9,18,5,1,1,280,206,848,960,1031,852,9,5,28,6,2,10,288,372,669,872,1162,862,8,21,41,8,9,14,362,338,788,761,802,884,17,17,18,15,9,2,356,456,737,710,818,846,20,27,25,12,12,14,475,357,774,862,814,922,36,40,26,7,1,15,209,205,788,830,1085,943,0,23,12,10,2,2,378,374,634,827,1005,741,1,28,42,12,12,6,360,374,873,894,776,803,19,29,31,11,10,3,422,504,801,950,844,775,21,31,29,10,9,12,458,362,543,806,846,906,12,24,33,14,11,11,328,376,716,645,1070,878,9,22,36,7,10,14,140,372,890,942,1297,895,1,40,40,7,8,11,498,534,823,979,674,920,34,39,26,13,6,13,381,337,759,770,693,788,16,11,18,8,13,15,8 +271,403,696,821,632,752,21,26,23,5,10,11,348,250,549,708,677,841,16,13,24,12,12,9,278,220,732,677,1070,744,19,31,36,12,10,6,306,164,760,910,865,777,21,19,26,9,2,1,287,193,728,928,981,711,16,9,36,10,3,10,217,277,567,868,1112,743,15,27,33,14,10,14,335,255,672,713,752,875,10,9,26,9,10,2,321,307,625,618,772,767,13,15,33,16,13,14,492,264,732,764,764,835,37,28,34,11,6,15,210,216,680,822,1035,794,7,13,4,6,3,2,311,325,526,813,955,726,6,20,30,12,13,6,237,291,765,814,726,710,12,29,33,13,9,3,395,343,761,852,794,692,14,19,33,10,14,12,409,239,465,776,800,909,5,12,41,10,10,11,239,247,596,641,1024,761,2,30,40,11,9,14,169,445,788,928,1247,736,6,28,32,5,5,11,503,439,751,899,624,943,27,27,34,11,11,13,336,184,679,670,643,663,19,15,24,16,14,15,8 +395,379,751,1103,654,899,24,23,32,12,11,8,336,104,722,950,695,1086,29,36,19,7,9,10,288,328,659,877,1092,873,22,4,29,1,11,21,268,198,873,1154,887,790,18,20,19,2,1,0,241,229,845,1132,1003,766,23,22,29,3,2,9,217,323,678,1020,1134,984,24,8,42,3,9,19,301,213,869,955,774,1020,35,28,19,12,9,3,341,173,792,918,790,916,32,14,26,5,8,15,428,154,811,1070,786,904,6,31,27,2,1,16,270,396,701,842,1057,859,32,30,11,13,10,15,373,423,567,977,977,1035,33,19,39,15,12,21,309,355,786,1072,748,923,33,20,32,14,12,18,371,281,732,1158,816,919,31,28,30,1,9,13,391,239,638,986,818,1076,40,25,34,11,11,10,309,261,741,771,1042,956,41,3,37,12,10,17,185,551,837,932,1269,845,33,17,39,14,16,18,437,295,924,1179,646,966,20,32,27,8,4,12,416,342,646,962,665,736,22,14,17,11,13,16,8 +424,484,1004,818,632,879,33,23,24,11,8,14,405,243,721,709,673,902,28,16,25,22,14,10,355,137,826,694,1070,863,19,30,39,2,12,3,235,129,1044,907,865,906,9,16,29,1,0,0,242,114,1012,925,981,860,4,8,39,2,1,9,282,224,859,883,1112,832,3,26,34,4,8,11,348,334,908,712,752,852,22,12,29,19,8,3,396,432,859,615,768,824,25,20,36,18,11,15,443,305,806,761,764,938,31,31,37,13,10,16,189,215,992,847,1035,941,5,14,1,14,1,1,402,312,838,822,955,695,6,25,31,16,9,5,376,384,1077,815,726,793,24,32,30,15,9,0,404,454,983,849,794,759,26,22,30,16,12,13,438,286,657,773,796,866,17,15,44,18,12,10,334,298,880,668,1020,860,14,33,41,11,11,11,160,366,1092,955,1247,887,6,31,29,11,3,8,444,552,827,896,624,948,39,30,37,17,15,14,409,293,935,669,643,786,19,20,21,10,12,16,8 +419,523,969,887,691,889,36,29,28,11,10,11,358,174,750,766,732,972,31,18,25,18,12,11,306,132,795,731,1129,875,16,30,35,2,10,6,264,96,1031,968,924,894,12,14,25,1,2,1,223,97,1001,988,1040,828,1,8,35,2,3,8,239,233,834,924,1171,880,0,26,38,4,10,14,307,285,919,771,811,918,25,10,25,19,10,4,363,385,870,686,827,878,28,20,32,14,13,16,424,272,813,836,823,952,28,33,33,9,6,17,254,258,955,858,1094,923,8,20,5,14,3,0,387,341,801,873,1014,797,9,21,35,16,13,6,323,413,1040,874,785,797,27,32,34,15,9,3,379,423,954,924,853,811,29,24,34,12,14,14,395,337,656,832,855,956,20,17,40,18,10,9,313,333,867,679,1079,894,17,27,43,11,9,14,171,429,1059,970,1306,871,9,33,33,11,5,11,427,481,880,965,683,998,42,32,33,17,11,13,422,304,898,740,702,800,24,12,23,10,14,17,8 +415,463,1019,746,625,843,35,18,17,11,10,13,366,312,708,639,666,868,30,9,18,22,14,11,298,116,823,668,1063,823,17,35,40,2,10,2,256,150,1043,839,858,882,11,23,34,1,2,1,243,131,1011,875,974,838,2,13,40,2,3,8,221,225,868,857,1105,794,1,31,27,4,10,8,321,325,891,658,745,808,24,17,34,19,10,4,329,439,854,543,761,802,27,21,41,18,13,16,454,362,759,687,757,916,29,24,42,13,14,17,174,208,1011,813,1028,895,7,13,4,14,3,0,379,289,857,792,948,685,8,26,24,16,9,6,339,355,1096,739,719,751,26,25,25,15,9,1,379,443,992,775,787,709,28,15,25,16,12,14,419,305,652,729,789,822,19,16,39,18,10,9,267,299,883,656,1013,828,16,36,34,11,9,8,159,345,1103,941,1240,839,8,24,24,11,5,5,455,577,808,824,617,956,41,23,42,17,17,11,374,332,954,593,636,742,19,23,16,10,14,17,8 +447,507,981,909,659,892,35,21,31,11,9,12,402,198,726,788,700,965,30,14,20,18,13,10,334,120,807,761,1097,882,17,30,30,4,11,5,250,104,1033,988,892,903,11,18,20,1,1,0,207,123,1001,1004,1008,853,2,10,30,0,2,9,263,235,842,942,1139,889,1,26,41,6,9,13,315,253,909,789,779,931,24,14,20,17,9,3,383,367,860,708,795,891,27,18,27,14,12,15,428,272,815,860,791,977,29,29,28,9,7,16,230,238,969,876,1062,926,7,12,10,14,2,1,425,309,815,891,982,806,8,23,38,18,12,5,367,381,1054,894,753,796,26,30,33,17,8,2,381,419,966,948,821,818,28,20,31,12,15,13,405,325,650,846,823,969,19,13,35,16,11,10,331,321,869,715,1047,903,16,33,38,9,10,13,145,415,1071,1008,1274,876,8,29,38,9,4,10,411,471,836,985,651,1017,41,28,28,15,12,14,426,288,912,764,670,765,23,20,18,10,13,16,8 +442,514,937,940,674,898,40,28,33,10,13,9,379,157,744,811,715,1009,35,17,18,15,9,11,315,129,769,742,1112,898,20,25,28,3,11,8,253,91,1007,1013,907,887,16,15,18,0,1,1,206,130,977,1015,1023,835,5,5,28,1,2,8,260,274,808,933,1154,931,4,21,41,5,9,16,310,258,903,810,794,989,29,9,18,18,9,4,376,328,854,743,810,921,32,19,25,11,12,16,407,239,803,895,806,975,24,32,26,6,3,17,245,271,921,843,1077,922,12,19,12,13,2,2,400,368,767,886,997,878,13,20,40,17,12,8,338,426,1006,921,768,818,31,33,31,16,8,5,390,396,922,983,836,872,33,25,29,9,11,14,398,336,642,859,838,1041,24,16,33,17,11,9,326,336,845,684,1062,935,21,22,36,10,10,16,170,458,1029,971,1289,878,13,32,40,10,6,13,408,430,884,1016,666,1027,38,31,26,16,8,11,433,307,864,797,685,759,28,13,18,9,13,17,8 +447,373,1071,702,667,978,27,11,21,7,9,10,440,546,744,637,708,873,22,30,24,16,11,12,376,248,849,634,1105,928,25,20,40,8,13,3,268,344,1063,789,900,1019,15,36,30,5,5,8,273,323,1035,825,1016,889,10,36,40,4,6,9,275,391,904,819,1147,899,9,24,31,10,9,1,389,427,885,608,787,839,16,38,30,13,9,5,359,491,862,493,803,857,19,28,37,20,10,17,488,494,743,635,799,945,37,15,38,13,17,18,204,176,1071,861,1070,1038,1,22,10,10,0,1,453,267,917,748,990,838,0,27,26,14,6,7,375,305,1156,717,761,896,18,16,27,13,10,2,415,429,1046,723,829,820,20,12,29,14,11,15,483,379,672,679,831,729,11,31,39,12,13,8,291,365,909,656,1055,911,8,17,36,11,12,1,91,113,1147,935,1282,974,0,1,18,5,2,0,459,525,784,772,659,937,33,16,38,11,14,10,422,482,1040,559,678,963,15,32,20,16,13,18,8 +317,407,791,1027,678,760,24,26,28,11,16,8,286,166,692,894,735,965,29,35,19,14,14,10,254,216,691,869,1068,746,22,3,29,2,4,17,252,138,899,1096,841,693,14,13,19,1,8,0,269,191,867,1108,949,651,21,19,29,2,9,9,199,217,692,1052,1116,853,20,5,38,4,4,19,263,161,839,893,802,937,35,27,19,19,4,3,311,273,786,832,832,843,32,13,26,10,11,15,416,190,847,984,792,909,8,36,27,5,8,16,252,260,759,916,1075,708,28,25,11,14,9,11,329,359,607,1003,993,924,29,14,35,16,9,17,295,331,844,988,778,800,31,27,32,15,15,14,291,309,792,1072,818,822,31,35,30,8,16,13,331,275,588,948,858,1009,40,28,34,18,4,10,263,289,749,805,1082,837,37,6,37,11,3,17,213,471,887,1046,1299,690,29,24,39,11,11,18,463,397,842,1105,678,1029,22,39,27,15,11,12,306,272,706,874,611,579,16,9,17,10,10,16,8 +357,517,900,824,664,903,37,30,29,12,10,12,318,206,697,699,705,1010,32,23,22,15,12,10,286,130,732,648,1102,899,15,21,32,1,10,5,224,156,962,895,897,936,13,9,22,2,2,0,195,137,932,903,1013,852,0,1,32,3,3,9,209,307,765,835,1144,890,1,17,39,3,10,13,283,367,850,692,784,950,26,15,22,20,10,3,339,441,801,629,800,910,29,25,29,11,13,15,404,280,766,781,796,982,27,38,30,6,6,16,242,260,886,799,1067,957,9,21,8,15,3,1,351,413,732,786,987,799,10,26,36,15,13,5,293,441,971,821,758,819,28,29,35,14,9,2,349,441,893,869,826,813,30,29,33,9,14,13,367,397,587,745,828,978,21,22,37,19,10,10,291,411,798,598,1052,912,18,24,40,12,9,13,173,391,990,891,1279,887,10,38,36,12,5,10,409,499,855,904,656,1010,43,37,30,16,11,14,378,390,831,691,675,854,23,9,20,11,14,16,8 +376,450,791,991,694,785,29,28,31,10,14,9,293,193,656,856,741,1014,34,31,20,13,8,9,239,153,671,785,1116,779,23,5,30,3,10,16,255,143,891,1058,903,758,9,11,20,0,2,1,212,162,857,1058,1017,672,14,17,30,1,3,10,194,234,684,974,1160,870,15,7,41,5,10,20,248,190,809,855,816,1004,40,23,20,18,10,2,292,306,752,798,836,888,37,13,27,9,13,14,381,257,769,950,820,912,13,32,28,4,2,17,267,215,767,824,1095,755,23,21,10,13,3,10,324,314,613,929,1015,933,24,14,38,17,13,16,294,344,852,952,790,841,26,29,33,16,9,13,344,366,794,1038,848,853,30,35,31,7,10,12,338,270,550,902,864,1040,35,24,35,17,10,11,268,266,735,723,1088,860,32,8,38,10,9,18,202,428,893,974,1311,715,24,26,38,10,7,19,410,432,814,1067,688,1014,29,41,28,14,7,13,383,261,714,840,673,676,21,5,18,9,14,15,8 +395,485,886,850,662,854,34,26,27,13,15,9,372,162,729,723,703,917,29,17,26,20,11,11,328,158,718,668,1100,844,18,25,36,0,7,8,282,112,954,933,895,849,10,15,26,3,5,1,289,131,926,935,1011,795,3,5,36,4,6,8,245,253,753,871,1142,847,2,21,37,2,7,16,341,277,894,730,782,887,23,9,26,21,7,4,367,319,837,647,798,823,26,19,33,16,14,16,470,228,790,795,794,903,30,32,34,11,5,17,218,284,872,809,1065,902,6,15,4,16,6,2,391,391,718,816,985,756,7,20,34,14,12,8,361,431,957,841,756,766,25,35,33,13,12,5,389,367,873,883,824,776,27,25,33,14,13,14,433,341,635,783,826,925,18,16,41,20,7,9,305,341,794,620,1050,853,15,26,44,13,6,16,183,477,978,895,1277,856,7,32,32,13,8,13,507,423,855,930,654,937,40,31,34,19,8,11,382,288,815,699,673,745,20,15,24,12,13,17,8 +360,402,770,1063,699,824,26,27,34,12,12,10,309,147,679,924,740,1059,31,34,19,13,8,8,287,235,678,837,1137,816,22,4,29,1,10,17,267,139,884,1130,932,777,14,12,19,2,2,2,212,180,852,1118,1048,703,23,18,29,3,3,11,232,274,679,1026,1179,909,22,6,42,3,10,21,288,202,822,927,819,1033,37,26,19,18,10,1,334,262,763,866,835,915,34,12,26,9,13,13,399,189,816,1018,831,911,8,35,27,4,2,18,289,281,726,868,1102,794,28,24,11,15,5,11,346,392,578,977,1022,982,29,13,41,15,13,17,316,332,811,1028,793,880,31,28,32,14,13,14,352,298,763,1106,861,884,33,36,30,7,10,11,372,264,571,968,863,1067,40,27,34,17,10,12,316,292,732,769,1087,899,37,7,37,12,9,19,202,512,858,996,1314,754,29,25,39,12,11,20,414,378,855,1139,691,1003,20,40,27,14,5,14,383,259,673,910,710,721,20,8,17,11,14,14,8 +393,491,956,829,649,853,38,27,23,10,10,10,326,170,739,714,690,960,33,14,24,21,12,10,268,142,784,677,1087,843,14,28,36,3,10,7,246,142,1020,920,882,870,14,18,26,0,2,0,191,93,988,928,998,806,1,8,36,1,3,9,207,207,823,868,1129,854,2,24,33,5,10,15,265,257,908,721,769,912,27,8,26,18,10,3,317,333,861,626,785,876,30,16,33,19,13,15,384,234,794,772,781,946,26,29,34,14,6,16,248,282,942,802,1052,881,10,14,4,13,3,1,347,349,788,813,972,787,11,17,30,17,13,7,305,417,1027,816,743,763,29,32,33,16,9,4,347,365,931,860,811,789,31,22,33,17,14,13,355,315,649,776,813,954,22,13,41,17,10,10,281,327,856,637,1037,876,19,27,40,10,9,15,185,461,1048,924,1264,823,11,29,32,10,5,12,401,429,849,907,641,996,44,28,34,16,11,12,388,288,885,674,660,750,22,14,24,11,14,16,8 +360,414,659,974,665,855,20,23,28,7,12,9,411,117,574,829,706,1004,25,36,23,18,8,11,357,265,613,742,1103,839,32,4,33,6,10,16,267,155,761,1041,898,812,10,20,23,9,2,1,282,206,731,1015,1014,738,23,22,33,10,3,8,268,318,554,917,1145,890,22,8,38,8,10,18,392,270,717,840,785,934,31,28,23,15,10,4,372,244,660,775,801,848,28,18,30,16,9,16,493,151,779,927,797,848,22,31,31,13,2,17,157,355,633,775,1068,865,14,26,7,10,9,10,362,396,479,864,988,875,15,19,35,8,13,16,314,384,718,951,759,791,17,20,36,7,13,13,436,294,690,1015,827,869,21,28,34,16,10,14,478,272,524,875,829,962,26,25,38,14,10,9,308,288,613,664,1053,878,23,3,41,7,9,16,108,524,757,859,1280,823,15,17,35,7,15,17,496,348,802,1054,657,880,20,32,31,13,5,11,381,299,618,825,676,788,12,14,21,10,14,17,8 +422,406,886,858,631,892,29,26,32,4,9,14,437,319,611,743,672,903,24,15,17,9,13,14,367,141,720,684,1069,854,23,29,27,15,13,5,283,197,914,931,864,893,13,17,17,12,1,4,286,246,884,941,980,833,8,7,27,11,0,11,256,324,735,867,1111,823,7,25,40,15,7,11,396,266,780,730,751,797,18,9,17,8,7,7,352,404,741,661,767,803,21,17,24,13,10,19,507,407,742,813,763,875,35,30,25,8,7,20,173,141,878,839,1034,950,1,13,13,5,0,3,378,288,724,820,954,740,2,20,39,9,10,9,368,300,963,857,725,808,20,31,30,8,10,4,436,420,889,901,793,756,22,21,28,7,15,17,494,330,539,783,795,791,13,14,32,9,13,8,270,334,752,626,1019,849,10,30,35,2,12,11,82,272,970,921,1246,888,2,30,41,4,2,8,490,524,757,934,623,845,35,29,25,10,12,14,389,341,855,721,642,877,13,15,19,9,11,20,8 +313,405,819,781,636,737,28,25,18,8,11,15,360,298,564,676,677,818,23,10,19,15,15,9,306,184,685,693,1074,731,24,32,41,13,9,2,298,182,863,880,869,810,14,22,31,10,3,1,295,181,831,906,985,742,9,12,41,11,4,10,237,237,676,888,1116,710,8,28,28,11,9,10,347,313,735,693,756,788,17,10,31,12,9,2,311,383,690,580,772,746,20,14,38,19,14,14,490,324,765,714,768,856,36,25,39,14,9,15,190,168,807,840,1039,795,0,12,1,9,4,2,313,223,653,815,959,609,1,19,25,15,10,4,313,291,892,772,730,651,19,28,28,16,10,1,399,361,840,802,798,631,21,18,28,13,13,12,433,223,510,762,800,794,12,9,40,11,9,11,279,217,699,687,1024,740,9,29,35,14,8,10,157,341,907,970,1251,725,1,27,27,8,6,7,511,511,724,857,628,908,34,24,39,12,14,13,330,236,796,620,647,660,12,16,19,15,15,15,8 +385,395,1012,611,661,945,26,14,9,4,9,10,398,648,689,572,702,826,21,27,40,13,11,12,326,352,846,585,1099,893,24,23,30,11,13,3,258,462,988,692,894,1012,16,39,40,8,7,12,267,413,960,736,1010,842,11,39,30,7,8,9,235,439,841,760,1141,856,10,27,17,13,9,1,377,519,800,527,781,832,15,35,40,10,11,7,335,547,783,418,797,820,18,25,33,17,10,17,476,544,728,538,793,894,38,12,32,10,17,18,176,292,1016,822,1064,1013,2,21,26,7,0,1,393,257,862,689,984,807,1,24,12,11,6,7,337,339,1101,642,755,875,17,13,13,12,10,2,415,471,1063,626,823,783,19,11,15,11,11,15,471,419,603,592,825,690,10,28,25,9,13,8,265,403,840,627,1049,868,7,20,22,10,12,1,93,99,1084,900,1276,937,1,2,2,4,2,0,465,539,683,675,653,902,32,13,32,8,14,10,386,508,1007,486,672,986,14,31,20,15,13,18,8 +377,397,959,800,638,824,28,20,21,3,9,13,424,326,652,703,681,833,23,13,22,14,13,9,360,160,779,710,1076,800,24,37,40,10,11,0,278,166,985,891,871,863,14,21,30,9,1,1,303,195,951,919,987,827,9,15,40,10,2,10,281,295,810,893,1118,769,8,33,31,12,9,8,395,345,835,702,758,767,17,15,30,11,9,2,361,419,794,597,776,771,20,23,37,16,12,14,506,396,805,743,770,891,36,28,38,11,11,15,136,160,951,867,1041,880,0,15,0,6,2,2,347,261,797,826,961,672,1,28,28,8,8,4,341,309,1036,799,732,732,19,29,29,7,8,1,447,411,942,831,800,692,21,19,29,12,11,12,491,291,614,767,804,769,12,14,43,10,11,11,311,279,825,704,1028,801,9,38,38,5,10,8,115,305,1045,991,1253,822,1,28,28,3,4,5,509,563,784,876,630,899,34,27,38,11,16,11,368,316,920,653,649,733,14,23,20,12,13,15,8 +416,424,845,959,687,809,34,27,27,11,14,9,345,189,688,832,730,1024,39,24,24,18,10,11,273,197,711,747,1107,803,26,12,34,2,12,14,239,173,937,1038,894,756,10,18,24,1,0,1,204,180,907,1038,1008,698,11,18,34,2,1,8,216,216,730,950,1151,898,12,14,37,4,8,18,292,190,855,835,807,1012,37,24,24,19,8,4,328,266,804,758,827,906,40,16,31,14,11,16,391,219,789,908,811,910,16,25,32,9,0,17,231,249,823,810,1082,771,20,14,6,14,3,8,374,318,669,899,1004,961,21,13,34,16,11,14,314,336,908,926,783,859,25,30,35,15,11,11,358,324,840,996,843,883,27,28,35,12,10,14,384,228,598,886,855,1068,32,25,39,18,12,9,284,240,783,695,1079,888,29,15,42,11,11,16,142,436,941,936,1300,739,21,19,34,11,9,17,402,384,814,1037,679,1024,32,34,32,17,5,11,407,277,768,802,684,662,24,12,22,10,12,17,8 +412,502,835,924,655,945,31,34,34,8,14,10,407,225,656,787,698,964,26,23,19,15,10,10,365,175,695,702,1093,925,21,25,29,5,12,7,231,129,907,987,888,940,11,9,19,2,0,0,252,188,879,979,1004,894,6,3,29,3,1,9,278,328,706,889,1135,898,5,21,42,7,8,15,368,336,809,784,775,898,20,15,19,16,8,3,384,442,760,735,793,872,23,25,26,11,11,15,455,317,777,887,787,936,33,38,27,6,2,16,187,215,819,833,1058,1001,3,21,11,11,1,1,414,396,665,844,978,761,4,26,41,15,11,7,354,402,904,917,749,859,22,27,32,14,9,4,418,440,834,975,817,825,24,29,30,9,10,13,456,374,560,827,819,926,15,22,34,15,12,10,314,390,747,640,1043,924,12,24,37,8,11,15,112,400,927,915,1270,953,4,38,39,8,7,12,450,490,830,1002,647,918,37,37,27,14,7,12,407,345,770,795,666,850,17,9,17,11,12,16,8 +334,452,969,774,673,756,40,21,18,13,11,12,263,237,714,671,714,961,39,8,19,24,15,10,243,129,785,692,1111,784,20,34,41,4,9,5,261,135,1023,875,906,825,16,24,33,3,3,0,202,156,993,915,1022,751,7,14,41,4,4,9,186,210,830,891,1153,823,8,30,28,2,9,13,250,264,901,702,793,979,33,14,33,21,9,3,310,380,856,583,809,893,36,16,40,20,14,15,383,265,767,701,805,973,22,23,41,15,11,16,289,221,957,829,1076,784,16,12,3,16,4,1,294,296,803,824,996,814,17,21,25,14,10,5,244,350,1042,753,767,766,31,26,26,13,10,2,346,362,946,789,835,784,33,16,26,18,13,13,332,302,648,771,837,1015,28,13,40,20,9,10,282,286,859,670,1061,847,25,31,35,13,8,13,218,420,1059,953,1288,714,17,23,25,13,6,10,398,498,828,842,665,1109,38,22,41,19,16,14,381,261,900,605,684,629,28,20,17,12,15,16,8 +340,322,937,682,660,820,25,10,12,5,9,10,421,467,624,613,701,793,20,17,23,12,13,12,347,231,809,632,1098,786,23,33,35,12,11,3,295,273,937,773,893,907,17,33,39,11,3,6,318,318,907,803,1009,775,12,29,35,12,4,11,252,360,774,815,1140,745,11,31,22,14,11,3,412,362,771,590,780,771,14,25,39,11,9,5,358,452,738,481,796,737,17,27,40,12,12,17,517,475,757,615,792,841,39,10,41,11,15,18,189,123,935,833,1063,890,3,19,9,4,2,1,362,242,781,744,983,676,2,26,19,6,8,7,292,238,1020,697,754,742,16,11,20,5,8,2,450,370,986,703,822,676,18,7,20,10,11,15,494,356,556,657,824,709,9,20,34,12,11,10,272,322,781,650,1048,771,6,30,29,5,10,3,124,216,1015,927,1275,816,2,12,19,5,4,0,530,548,708,752,652,891,31,9,37,13,16,10,377,405,916,539,671,809,15,31,11,8,13,18,8 +399,435,1078,727,649,878,35,13,11,11,9,13,372,432,765,650,690,865,30,14,24,22,13,9,334,172,878,677,1087,862,17,36,34,4,11,0,252,202,1088,822,882,963,11,28,40,1,1,5,247,173,1056,862,998,883,2,22,34,2,2,10,269,269,921,862,1129,809,1,34,21,4,9,4,329,447,934,647,769,807,24,22,40,19,9,2,375,535,893,530,785,807,27,30,39,20,12,14,444,470,780,660,781,933,29,21,40,15,13,15,204,212,1072,862,1052,968,7,18,10,14,2,2,397,307,918,789,972,698,8,25,18,16,8,4,363,363,1157,738,743,808,26,22,19,15,8,1,385,491,1053,748,811,754,28,12,19,18,11,12,419,373,697,716,813,773,19,21,33,18,11,11,327,351,930,703,1037,837,16,33,28,11,10,4,175,287,1160,980,1264,890,8,21,18,11,4,3,453,671,833,801,641,961,41,20,36,17,16,9,390,426,1015,578,660,839,21,30,10,12,13,15,8 +366,402,864,797,660,832,26,24,23,3,10,13,405,289,595,686,701,859,21,11,24,12,14,13,333,155,732,689,1098,790,24,35,38,12,10,4,285,163,900,882,893,831,16,21,28,9,2,3,310,182,870,906,1009,783,11,13,38,10,3,10,230,288,717,872,1140,781,10,31,33,14,10,12,382,280,768,687,780,759,15,11,28,9,10,6,314,382,727,594,796,763,18,17,35,14,13,18,509,345,774,744,792,865,38,26,36,9,10,19,161,167,854,830,1063,856,2,13,2,4,3,2,350,270,700,811,983,712,1,22,30,8,9,8,334,310,939,790,754,736,17,27,31,7,9,3,430,398,895,832,822,694,19,17,31,10,12,16,482,276,535,752,824,793,10,10,43,10,10,7,240,258,736,641,1048,809,7,32,40,3,9,12,92,330,950,932,1275,810,1,26,30,3,5,9,524,530,753,873,652,879,32,25,36,11,15,15,351,283,835,652,671,753,14,17,22,10,14,19,8 +339,339,845,742,665,813,23,18,22,5,9,10,412,468,552,657,706,818,18,9,23,16,11,12,322,236,807,628,1103,777,19,39,37,10,13,3,312,306,857,833,898,852,19,27,27,11,1,4,317,315,829,851,1014,788,14,17,37,12,2,9,219,393,686,821,1145,740,13,35,32,10,9,5,393,351,711,638,785,794,12,17,27,13,7,5,335,389,672,537,801,732,15,21,34,20,10,17,536,454,719,677,797,834,37,20,35,13,13,18,182,122,841,821,1068,881,5,17,3,8,0,1,351,287,687,754,988,709,4,22,29,10,6,7,285,255,926,753,759,755,14,21,32,11,10,2,451,371,910,765,827,671,16,11,32,14,11,15,479,301,490,703,829,762,7,16,42,12,13,8,239,291,697,632,1053,766,4,36,39,9,12,5,115,211,925,911,1280,809,4,20,31,5,2,2,525,481,672,814,657,856,29,19,35,13,14,10,374,378,840,595,676,814,17,23,23,12,11,18,8 +495,435,937,992,663,834,40,28,30,11,12,10,448,214,720,859,704,957,37,17,23,18,12,12,374,204,777,776,1101,830,24,19,33,4,14,11,292,196,1013,1065,896,795,16,21,23,1,2,2,225,189,979,1063,1012,745,9,21,33,0,1,9,281,213,814,979,1143,887,8,21,40,6,8,17,353,241,899,862,783,951,31,21,23,17,8,5,395,259,844,791,799,849,34,15,30,14,9,17,462,210,775,943,795,893,22,18,31,9,4,18,248,242,919,845,1066,844,14,11,7,14,1,5,457,267,765,930,986,872,15,18,37,18,9,11,385,359,1004,959,757,768,31,31,36,17,11,8,423,343,906,1031,825,866,33,21,34,12,12,15,449,203,636,909,827,993,26,20,38,16,14,8,327,207,849,724,1051,869,23,16,41,9,13,15,141,395,1031,979,1278,816,15,16,35,9,5,16,419,377,838,1068,655,957,34,31,31,15,9,10,454,280,862,837,674,701,30,15,21,10,10,18,8 +395,469,786,907,635,809,32,29,26,5,14,9,348,192,605,776,676,928,33,14,23,16,10,11,284,172,678,697,1073,803,22,20,33,8,12,12,260,154,868,982,868,798,14,20,23,5,0,1,231,139,834,982,984,728,7,14,33,6,1,8,213,225,667,898,1115,834,8,22,36,10,8,18,325,253,766,779,755,886,27,12,23,13,8,4,309,305,713,706,771,820,30,10,30,20,11,16,436,230,792,856,767,860,26,23,31,13,2,17,198,252,768,796,1038,829,10,10,7,8,1,6,365,315,614,847,958,791,11,11,33,12,11,12,317,385,853,884,729,729,23,34,36,11,9,9,391,379,793,944,797,789,25,24,34,14,10,14,411,263,537,830,799,932,22,11,38,12,12,9,265,263,706,645,1023,836,19,17,41,9,11,16,143,443,884,912,1250,785,11,25,35,5,7,17,443,425,793,985,627,916,36,28,31,11,7,11,376,236,741,756,646,708,22,12,21,14,12,17,8 +400,448,1139,674,683,904,36,15,8,11,10,15,351,463,826,619,724,941,31,12,29,22,14,7,337,153,935,654,1121,902,16,38,31,4,10,2,299,199,1153,767,916,1031,12,30,43,1,2,5,202,202,1119,813,1032,917,1,24,31,2,3,12,286,270,986,833,1163,845,0,36,18,4,10,4,278,458,997,604,803,901,25,20,37,19,10,0,394,570,956,489,819,889,28,28,36,20,13,12,385,481,803,599,815,1007,28,19,37,15,14,13,333,239,1135,863,1086,990,8,16,15,14,3,4,354,310,981,760,1006,736,9,23,15,16,9,2,324,368,1220,691,777,828,27,20,14,15,9,3,382,494,1108,687,845,756,29,10,14,18,12,10,356,416,762,669,847,863,20,19,30,18,10,13,378,402,995,692,1071,887,17,35,25,11,9,6,256,304,1225,967,1298,900,9,19,13,11,5,5,388,706,900,740,675,1089,42,18,33,17,17,11,439,439,1078,529,694,863,24,28,9,12,14,13,8 +391,365,979,702,682,932,24,11,18,4,8,10,424,606,670,647,723,829,19,30,35,13,12,12,348,328,875,622,1120,882,24,20,29,11,12,3,284,408,965,783,915,973,18,36,31,8,0,8,311,385,939,805,1031,843,13,36,29,7,1,9,257,465,808,801,1162,853,12,24,26,13,8,1,411,479,791,588,802,803,13,38,31,10,8,5,345,499,766,491,818,811,16,28,30,17,11,17,516,518,785,637,814,901,40,15,31,10,12,18,174,244,981,847,1085,992,4,22,19,7,1,1,401,299,827,732,1005,812,3,27,21,11,7,7,349,283,1066,727,776,868,15,16,22,12,9,2,455,443,1050,725,844,782,17,12,22,11,10,15,503,393,574,653,846,715,8,31,26,9,12,8,275,387,811,646,1070,865,5,17,29,10,11,1,97,117,1051,923,1297,928,3,1,11,4,3,0,521,529,720,770,674,917,30,16,31,8,15,10,384,492,980,569,693,917,16,32,21,15,12,18,8 +401,431,909,930,613,786,29,30,27,12,9,8,356,202,686,807,654,935,34,15,26,19,13,10,308,162,777,770,1051,796,27,17,36,1,13,9,246,124,977,1013,846,795,5,17,26,2,1,0,237,149,943,1017,962,745,12,13,36,3,0,9,243,229,782,961,1093,851,11,19,37,3,7,17,319,205,855,812,733,953,32,15,26,20,7,3,345,311,806,727,749,861,35,11,33,15,10,15,424,230,853,875,745,941,21,24,34,10,7,18,192,196,893,855,1016,796,15,7,4,15,0,3,353,309,739,904,936,842,16,14,34,15,10,9,353,327,978,901,707,756,20,31,33,14,10,6,379,341,910,963,775,824,22,25,33,13,15,13,405,259,602,865,777,997,27,14,41,19,13,10,291,259,813,716,1001,849,24,20,44,12,12,17,167,425,1005,1003,1228,756,16,24,32,12,2,14,437,429,812,1008,605,1023,31,29,34,18,12,12,368,232,836,771,624,633,21,9,24,11,11,16,8 +446,372,850,775,666,816,24,12,24,4,12,14,463,385,535,666,707,833,19,15,25,11,14,12,389,247,798,639,1104,786,20,35,37,13,16,3,337,273,852,862,899,831,18,31,27,10,4,2,338,288,814,874,1015,781,13,23,37,9,3,9,288,304,697,826,1146,755,12,33,34,15,10,9,450,278,694,663,786,781,13,23,27,8,10,5,382,296,645,572,802,743,16,27,34,15,9,17,563,339,698,718,798,837,38,16,35,8,12,18,211,175,848,796,1069,868,4,17,3,7,3,1,428,228,694,765,989,688,3,24,31,11,9,7,388,276,933,772,760,740,15,17,32,12,13,2,502,330,915,806,828,682,17,7,32,9,14,15,544,200,523,720,830,801,8,22,42,7,16,8,296,198,702,611,1054,787,5,32,41,10,15,9,102,266,938,898,1281,812,3,16,31,4,1,6,528,428,661,851,658,855,30,15,35,8,11,12,413,305,845,628,677,757,16,29,23,17,10,18,8 +389,355,914,797,657,876,24,14,22,5,10,11,398,480,611,716,698,845,19,13,23,12,12,13,310,242,868,689,1095,830,18,37,39,12,14,4,310,324,922,886,890,887,18,31,29,9,2,3,305,307,892,910,1006,837,13,21,39,8,1,10,209,397,755,874,1137,805,12,35,32,14,8,6,379,367,770,693,777,797,13,21,29,9,8,6,309,411,735,592,793,769,16,25,36,16,9,18,512,460,778,738,789,867,36,16,37,11,12,19,210,132,910,878,1060,930,4,15,1,6,1,2,381,287,756,811,980,776,3,20,29,12,7,8,311,263,995,808,751,814,15,17,30,13,11,3,439,377,981,826,819,738,17,7,30,10,12,16,469,307,543,756,821,779,8,20,44,8,14,7,219,299,764,679,1045,825,5,34,39,11,13,6,109,183,994,964,1272,874,3,16,29,5,1,3,493,479,721,871,649,873,30,15,37,9,13,11,376,400,909,654,668,843,16,27,21,16,10,19,8 +432,472,1013,820,674,944,34,30,28,12,9,15,397,315,746,713,715,949,29,23,25,17,13,11,333,157,823,686,1112,920,18,27,35,1,11,2,253,187,1047,901,907,985,10,11,25,2,1,1,248,186,1017,915,1023,931,3,5,35,3,2,8,266,324,864,867,1154,875,2,23,38,3,9,10,350,416,923,702,794,865,23,15,25,20,9,4,380,518,876,619,810,865,26,25,32,13,12,16,441,395,787,769,806,969,30,38,33,8,7,17,207,221,1005,849,1077,1020,6,21,5,15,2,0,426,362,851,806,997,758,7,26,35,15,12,6,364,388,1090,823,768,868,25,31,34,14,8,1,400,516,994,857,836,818,27,29,34,11,15,14,438,402,662,759,838,859,18,22,40,19,11,9,324,396,883,664,1062,905,15,28,43,12,10,10,146,282,1099,951,1289,954,7,38,33,12,4,7,448,646,878,898,666,953,40,37,33,18,12,13,411,419,948,681,685,909,22,13,23,11,13,17,8 +417,459,990,889,660,821,36,20,23,11,10,10,354,196,743,774,701,920,31,9,24,22,14,8,300,142,820,761,1098,823,16,27,38,2,10,7,276,122,1048,978,893,852,12,23,28,1,2,2,221,127,1012,996,1009,800,1,13,38,2,3,11,251,203,859,950,1140,836,0,25,33,4,10,15,303,225,928,783,780,908,25,15,28,19,10,1,341,327,875,686,796,852,28,11,35,18,13,13,418,252,810,832,792,948,28,24,36,13,8,16,246,212,976,864,1063,861,8,9,2,14,3,3,381,303,822,889,983,769,9,16,30,16,11,7,345,349,1061,868,754,733,27,29,31,15,9,4,379,367,967,920,822,767,29,23,31,16,14,11,391,285,669,844,824,942,20,14,43,18,10,12,305,285,884,729,1048,850,17,26,40,11,9,15,181,431,1086,1016,1275,805,9,24,30,11,5,12,431,443,855,967,652,1004,42,23,36,17,13,14,390,268,919,732,671,688,24,19,22,10,14,14,8 +406,356,987,764,680,847,28,14,20,7,8,11,435,447,676,675,721,838,23,13,21,16,12,11,371,189,791,686,1118,821,24,37,43,10,12,2,257,249,997,859,913,912,14,29,33,5,0,3,294,244,963,889,1029,852,9,23,43,6,1,8,280,326,832,877,1160,774,8,35,30,10,8,6,394,398,839,674,800,764,17,21,33,13,8,4,378,460,798,561,816,760,20,27,40,20,11,16,503,481,741,699,812,880,36,18,41,13,12,17,173,137,981,867,1083,929,0,15,3,10,1,0,396,240,827,804,1003,665,1,22,27,14,7,6,362,284,1066,769,774,775,19,19,26,15,9,1,442,402,958,787,842,721,21,9,26,14,10,14,488,300,618,743,844,732,12,20,42,12,12,9,308,282,841,692,1068,800,9,34,37,13,11,6,112,208,1069,971,1295,857,1,18,25,7,3,3,496,558,762,840,672,884,34,17,41,11,15,9,397,389,924,611,691,824,16,27,17,16,12,17,8 +411,413,1204,636,638,928,35,9,8,12,9,12,392,612,881,609,679,835,30,32,39,23,13,10,340,266,974,632,1076,882,17,18,29,5,11,1,242,356,1176,723,871,1025,11,34,39,2,7,14,253,329,1148,765,987,835,2,36,29,3,8,11,279,379,1033,803,1118,845,1,22,16,3,11,1,353,473,986,568,758,823,24,40,39,20,11,9,373,583,971,475,774,823,27,28,32,21,12,15,448,586,778,553,770,901,29,17,31,16,19,16,164,250,1208,863,1041,1006,7,20,25,15,2,1,383,289,1054,732,961,784,8,23,11,15,8,5,379,339,1293,661,732,856,26,18,12,14,8,0,401,491,1189,641,800,766,28,14,14,19,11,13,441,463,789,627,802,677,19,33,24,19,11,10,317,449,1032,698,1026,859,16,15,21,12,10,3,151,187,1276,963,1253,922,8,3,3,12,4,2,459,631,875,694,630,927,41,18,31,18,16,8,382,542,1151,509,649,967,19,28,19,13,15,16,8 +397,515,848,852,648,821,36,26,26,12,11,10,364,150,653,725,689,948,31,19,23,19,11,8,314,142,706,680,1086,823,20,21,33,1,11,9,260,84,926,933,881,840,12,13,23,2,1,2,243,101,890,937,997,768,5,5,33,3,2,11,261,243,727,871,1128,848,4,17,36,3,9,17,331,279,816,730,768,920,25,11,23,20,9,1,353,339,761,651,784,854,28,21,30,15,12,13,448,254,752,801,780,922,28,34,31,10,5,18,196,266,830,799,1051,853,8,17,7,15,2,3,375,361,676,818,971,801,9,22,33,15,12,9,353,413,915,837,742,745,27,35,36,14,8,6,373,401,837,889,810,799,29,29,34,13,13,11,421,339,553,783,812,962,20,18,38,19,11,12,315,343,762,628,1036,856,17,24,41,12,10,17,177,463,942,915,1263,799,9,34,35,12,4,14,459,441,787,932,640,980,38,33,31,18,10,14,374,278,775,703,659,720,22,13,21,11,13,14,8 +383,331,889,744,652,843,25,10,21,4,9,10,382,486,580,647,693,858,20,17,22,13,13,12,300,242,789,652,1090,823,23,33,38,11,11,3,282,306,891,829,885,906,17,33,30,8,1,6,273,301,863,853,1001,844,12,27,38,7,2,11,195,377,726,831,1132,778,11,31,31,13,9,3,365,357,729,634,772,810,14,25,30,10,9,5,307,429,694,541,788,788,17,27,37,17,12,17,486,464,743,691,784,900,39,10,38,10,13,18,184,166,887,817,1055,917,3,19,4,7,2,1,373,237,733,766,975,697,2,26,28,11,8,7,315,237,972,751,746,771,16,11,29,10,8,2,423,375,946,779,814,703,18,9,29,11,11,15,459,339,528,701,816,790,9,18,41,9,11,10,221,327,733,656,1040,812,6,30,38,6,10,3,125,163,967,939,1267,841,2,12,28,2,4,0,477,515,676,820,644,914,31,9,38,8,16,10,364,432,878,603,663,810,15,31,20,13,13,18,8 +366,444,797,841,665,829,26,29,28,3,11,11,397,249,590,712,706,894,21,16,23,14,11,11,329,167,711,653,1103,803,22,28,33,10,13,6,281,151,853,916,898,816,16,16,23,9,1,1,270,192,827,920,1014,764,11,6,33,10,0,8,236,310,656,844,1145,794,10,24,38,12,7,14,386,262,739,713,785,838,15,8,23,11,7,4,326,340,692,642,801,798,18,18,30,16,10,16,493,311,765,794,797,854,38,31,31,11,5,17,151,175,785,790,1068,857,2,18,7,6,0,0,358,308,631,793,988,711,1,19,35,8,10,6,322,330,870,834,759,749,17,32,36,7,10,3,442,436,852,882,827,715,19,22,34,12,13,14,474,268,512,766,829,884,10,15,38,10,13,9,260,268,693,603,1053,828,7,25,41,5,12,14,106,372,885,894,1280,803,1,31,35,3,4,11,484,486,768,921,657,880,32,30,31,11,10,13,351,245,782,700,676,738,14,12,21,12,11,17,8 +461,415,1069,710,680,896,32,15,19,11,8,12,446,442,748,641,721,879,27,12,20,22,12,10,390,170,865,640,1118,876,20,38,42,4,12,1,260,214,1083,803,913,959,10,28,34,1,2,4,273,205,1051,839,1029,899,5,22,42,2,3,9,321,293,914,829,1160,827,4,36,29,4,10,5,389,435,921,624,800,811,21,20,34,19,8,3,429,515,882,509,816,817,24,28,41,20,11,15,472,464,755,641,812,943,32,21,42,15,14,16,214,182,1063,845,1083,980,4,18,4,14,1,1,469,299,909,756,1003,714,5,23,26,16,7,5,407,357,1148,725,774,824,23,22,25,15,9,0,425,465,1040,729,842,770,25,12,25,18,10,13,477,339,692,693,844,789,16,19,41,18,12,10,369,323,925,658,1068,855,13,35,36,11,11,5,167,247,1151,935,1295,908,5,21,24,11,3,2,467,639,806,782,672,953,38,20,42,17,15,8,442,400,1006,565,691,845,20,28,16,12,12,16,8 +344,502,968,820,666,824,36,32,18,15,10,12,315,235,717,711,707,921,31,25,23,18,14,8,303,153,798,730,1104,840,16,23,37,2,10,5,295,133,1026,913,899,911,12,7,33,5,2,2,242,120,990,937,1015,851,1,3,37,6,3,11,226,232,835,925,1146,831,0,19,28,0,10,13,316,326,894,722,786,923,25,17,33,23,10,1,328,474,841,617,802,853,28,27,40,14,13,13,429,305,798,757,798,973,28,40,41,9,10,14,271,249,954,883,1069,896,8,23,3,18,3,3,334,332,800,856,989,734,9,28,25,12,9,5,282,402,1039,813,760,746,27,29,26,11,9,2,392,452,959,845,828,744,29,31,26,12,12,11,390,362,639,787,830,933,20,24,40,22,10,12,298,340,862,704,1054,849,17,22,35,15,9,13,194,422,1060,987,1281,828,9,40,25,15,5,10,454,554,859,894,658,1049,42,39,37,19,15,14,367,331,897,663,677,721,24,11,17,14,14,14,8 +300,478,832,898,668,776,34,33,27,14,11,10,235,181,679,777,709,995,35,26,24,15,11,8,217,151,700,738,1106,792,24,10,34,1,9,11,271,105,924,979,901,803,10,10,24,4,3,2,214,136,894,995,1017,709,15,12,34,5,4,11,164,236,717,933,1148,855,16,12,37,1,9,19,228,240,836,782,788,1003,41,18,24,20,9,1,260,354,783,697,804,897,40,18,31,11,14,13,365,245,772,847,800,951,16,31,32,6,5,18,293,235,810,831,1071,782,24,16,6,17,4,5,266,328,656,882,991,888,25,19,34,13,14,11,256,362,895,875,762,816,27,34,35,12,10,8,316,376,831,935,830,856,31,32,35,9,13,11,306,320,577,839,832,1037,36,19,39,19,9,12,260,306,768,684,1056,861,33,13,42,14,8,19,230,450,928,965,1283,724,25,31,34,14,6,16,396,474,843,976,660,1059,32,40,32,16,10,14,351,267,757,745,679,675,22,2,22,13,15,14,8 +303,341,836,767,657,783,24,27,21,4,8,12,402,366,559,666,698,844,19,16,22,13,14,10,308,186,786,665,1095,763,20,28,38,11,12,1,288,208,862,852,890,850,18,16,28,10,0,2,305,269,832,878,1006,784,13,6,38,11,1,9,237,347,685,844,1137,728,12,24,31,13,8,7,383,307,722,659,777,838,13,8,28,10,8,3,329,409,679,564,793,766,16,18,35,13,11,15,514,426,738,714,789,876,38,31,36,10,10,16,160,114,830,824,1060,845,4,14,2,5,1,1,337,259,676,779,980,685,3,19,28,7,9,5,271,247,915,770,751,721,15,32,31,6,9,0,435,383,895,802,819,633,17,22,31,11,12,13,455,335,497,722,821,828,8,15,43,11,12,10,245,315,700,659,1045,768,5,29,38,4,11,7,131,283,922,946,1272,767,3,31,30,4,3,4,521,543,711,843,649,922,30,30,36,12,15,10,342,336,823,626,668,758,16,14,22,9,12,16,8 +380,394,879,834,676,843,27,34,30,5,10,15,409,341,602,705,717,882,22,23,23,16,14,11,355,177,747,712,1114,829,25,25,33,8,10,2,251,203,909,905,909,902,15,9,23,7,2,1,282,210,877,921,1025,836,10,7,33,8,3,8,260,338,728,887,1156,790,9,21,40,10,10,10,380,346,773,702,796,830,16,15,23,13,10,4,368,430,728,637,812,798,19,25,30,16,13,16,489,425,799,789,808,914,37,38,31,13,10,17,181,163,869,853,1079,913,1,21,7,8,3,0,394,298,715,828,999,651,0,26,37,10,9,6,336,316,954,829,770,763,18,27,36,9,9,1,428,438,900,877,838,715,20,29,34,14,12,14,472,314,546,765,840,832,11,22,38,12,10,9,304,310,747,678,1064,822,8,20,41,5,9,10,100,274,963,969,1291,851,0,40,35,5,5,7,488,572,758,912,668,934,33,37,31,11,15,13,395,355,854,697,687,790,15,9,21,12,14,17,8 +387,479,1022,780,686,905,34,28,24,11,10,13,354,328,755,691,727,962,29,21,25,18,14,9,332,168,832,674,1124,901,18,29,39,2,10,0,262,184,1054,865,919,982,10,13,29,1,2,3,227,185,1026,887,1035,926,3,7,39,2,3,10,265,329,871,853,1166,850,2,25,34,4,10,6,313,417,928,670,806,902,23,13,29,19,10,2,381,543,885,577,822,892,26,23,36,14,13,14,424,402,802,727,818,1006,30,36,37,9,8,15,242,232,1014,847,1089,983,6,19,1,14,3,2,389,365,860,788,1009,735,7,24,31,16,11,4,347,401,1099,793,780,827,25,33,30,15,9,1,379,539,1005,815,848,759,27,27,30,12,14,12,399,423,669,731,850,894,18,20,44,18,10,11,343,415,890,678,1074,894,15,30,41,11,9,6,189,317,1106,961,1301,899,7,36,29,11,5,3,441,661,883,856,678,1016,40,35,37,17,13,9,394,430,957,641,697,860,22,15,21,10,14,15,8 +409,415,1136,584,574,846,36,13,7,10,8,11,346,612,813,559,615,791,31,28,38,21,12,11,326,252,904,552,1012,808,16,22,28,3,12,2,266,348,1110,665,807,955,12,38,38,0,6,13,229,313,1084,711,923,753,1,38,28,1,7,10,263,355,965,723,1054,753,0,26,15,5,10,0,305,471,940,500,694,791,25,36,38,18,10,8,353,589,917,391,710,769,28,24,31,19,11,16,402,586,722,507,706,845,28,13,30,14,18,17,192,256,1140,801,977,946,8,18,24,13,1,0,319,291,986,652,897,688,9,19,10,17,7,6,387,361,1225,619,668,786,27,14,11,16,9,1,391,487,1121,595,736,680,29,10,13,17,10,14,379,461,721,567,738,609,20,29,23,17,12,9,301,445,964,604,962,777,17,19,20,10,11,2,211,183,1208,873,1189,838,9,1,4,10,3,1,417,607,831,644,566,885,42,14,30,16,15,9,340,550,1083,461,585,961,20,30,18,11,14,17,8 +408,434,1111,697,642,810,39,21,19,11,10,11,329,409,810,634,683,789,34,24,28,20,14,13,247,129,895,577,1080,772,13,14,32,6,10,4,321,193,1113,782,875,913,15,30,22,1,2,5,266,208,1085,806,991,727,2,30,32,2,3,10,198,284,948,770,1122,725,3,18,27,6,10,4,254,378,951,591,762,817,28,28,22,17,10,6,354,492,922,484,778,723,31,18,29,22,13,18,435,437,741,624,774,823,25,21,30,17,8,19,337,191,1109,822,1045,894,11,20,8,14,3,2,350,298,955,703,965,676,12,17,22,18,11,8,252,334,1194,708,736,742,30,22,23,17,9,3,350,440,1082,712,804,702,32,18,25,18,14,16,310,374,726,658,806,723,23,21,35,16,10,9,252,360,955,587,1030,747,20,15,32,11,9,4,252,278,1189,862,1257,806,12,9,20,9,5,1,426,592,910,765,634,961,45,22,30,15,13,11,441,413,1052,546,653,851,23,24,28,14,14,19,8 +357,433,836,957,658,802,32,31,27,13,13,9,330,156,683,830,699,985,37,20,24,18,9,9,318,216,712,771,1096,812,28,16,34,0,9,12,260,120,926,1036,891,767,8,12,24,3,3,1,227,163,894,1044,1007,721,15,8,34,4,4,10,237,273,721,974,1138,891,14,14,37,2,9,20,293,219,844,835,778,999,39,12,24,21,9,2,363,291,789,756,794,899,40,16,31,14,14,14,420,190,810,906,790,943,14,29,32,9,3,17,270,270,814,872,1061,786,22,16,6,16,4,6,371,375,660,921,981,922,23,17,34,14,14,12,305,355,899,936,752,832,25,32,35,13,10,9,357,329,835,994,820,886,29,28,35,12,11,12,377,257,583,890,822,1063,34,19,39,20,9,11,321,263,768,723,1046,887,31,17,42,13,8,18,189,495,934,988,1273,750,23,29,34,13,6,17,435,407,825,1037,650,1051,28,34,32,19,8,13,392,220,757,804,669,627,24,8,22,12,15,15,8 +452,508,927,913,662,875,34,27,30,11,11,10,413,167,698,782,703,952,29,20,21,16,11,10,349,135,757,729,1100,873,18,22,31,2,13,7,267,93,985,986,895,888,10,12,21,1,1,0,252,124,951,988,1011,832,3,4,31,2,0,9,280,274,792,910,1142,882,2,18,40,4,7,15,362,302,863,783,782,930,23,12,21,19,7,3,398,378,812,716,798,866,26,22,28,12,10,15,463,263,771,868,794,940,30,35,29,7,5,16,203,245,913,838,1065,923,6,18,9,14,0,1,438,360,759,861,985,793,7,23,37,16,10,7,382,404,998,898,756,789,25,34,34,15,10,4,414,418,912,956,824,803,27,28,32,10,13,13,456,334,604,832,826,960,18,19,36,18,13,10,338,340,821,671,1050,888,15,23,39,11,12,15,156,424,1019,964,1277,875,7,35,37,11,4,12,458,468,840,991,654,970,40,34,29,17,10,12,427,291,856,770,673,760,22,14,19,10,11,16,8 +381,477,953,907,661,833,36,26,25,11,10,10,320,194,744,786,702,942,31,17,26,20,14,8,284,132,797,765,1099,831,16,27,36,2,10,9,278,98,1031,992,894,866,12,15,26,1,2,2,205,123,999,1004,1010,792,1,5,36,2,3,11,241,207,830,954,1141,842,0,23,35,4,10,17,285,237,925,791,781,906,25,9,26,19,10,1,335,339,870,704,797,854,28,19,33,16,13,13,390,262,841,850,793,942,28,32,34,11,8,18,256,230,937,876,1064,871,8,17,4,14,3,3,349,329,783,899,984,777,9,20,32,16,11,9,329,365,1022,888,755,749,27,33,33,15,9,6,361,379,944,938,823,779,29,23,33,14,14,11,363,331,664,850,825,942,20,16,41,18,10,12,309,317,871,719,1049,856,17,26,42,11,9,17,183,449,1051,1008,1276,815,9,32,32,11,5,14,417,461,868,983,653,994,42,31,34,17,13,14,374,288,880,752,672,738,22,15,24,10,14,14,8 +415,455,862,930,637,925,29,32,31,5,13,12,410,294,651,805,678,918,24,23,18,16,9,12,342,186,706,742,1075,889,23,23,28,8,11,5,276,174,912,999,870,912,13,9,18,5,1,2,293,215,882,1007,986,860,8,3,28,6,2,9,243,359,719,929,1117,856,7,19,41,10,9,13,375,317,804,796,757,808,18,15,18,13,9,5,331,439,755,737,773,812,21,25,25,16,12,17,502,364,766,889,769,884,35,38,26,11,3,18,172,162,850,885,1040,985,1,21,12,8,2,1,377,367,696,882,960,747,2,26,38,12,12,7,353,363,935,925,731,843,20,27,31,11,8,2,423,497,855,977,799,807,22,29,29,14,11,15,471,347,541,849,801,826,13,22,33,12,11,8,253,363,748,684,1025,878,10,24,36,5,10,13,115,313,948,973,1252,935,2,38,40,5,6,10,497,567,819,1008,629,860,35,37,26,11,8,14,374,348,823,797,648,880,15,9,18,12,13,18,8 +398,464,1006,832,669,823,34,26,21,12,9,14,357,251,721,725,710,924,29,15,22,21,13,10,295,123,818,732,1107,825,18,29,42,1,11,1,249,133,1040,925,902,888,10,17,32,2,1,0,234,126,1008,955,1018,818,3,7,42,3,2,9,218,218,859,923,1149,814,2,25,31,3,9,9,316,304,900,738,789,892,23,9,32,20,9,3,346,422,855,629,805,848,26,17,39,17,12,15,431,303,780,773,801,950,30,30,40,12,11,16,227,207,996,869,1072,879,6,13,2,15,2,1,390,270,842,858,992,729,7,20,28,15,8,5,316,348,1081,821,763,735,25,31,27,14,8,0,362,410,983,861,831,743,27,21,27,15,11,13,404,286,651,805,833,910,18,14,43,19,11,10,286,268,878,710,1057,838,15,30,38,12,10,9,142,390,1092,997,1284,809,7,30,26,12,4,6,434,546,837,910,661,1010,40,29,40,18,16,12,389,281,939,679,680,740,22,15,18,11,13,16,8 +412,474,1054,809,694,891,36,25,22,12,10,13,353,297,773,698,735,934,31,14,23,19,14,9,293,127,862,709,1132,875,16,34,37,1,10,0,267,131,1090,896,927,952,12,18,31,2,2,1,234,114,1060,916,1043,890,1,12,37,3,3,10,234,252,907,894,1174,836,0,30,32,3,10,8,314,352,952,699,814,866,25,10,31,20,10,2,336,494,909,606,830,860,28,16,38,15,13,14,433,363,810,752,826,968,28,29,39,10,12,15,241,237,1046,858,1097,955,8,16,5,15,3,2,388,334,892,831,1017,733,9,21,29,15,9,4,332,388,1131,806,788,803,27,30,28,14,9,1,378,488,1035,840,856,757,29,20,28,13,12,12,410,360,703,766,858,870,20,13,40,19,10,11,294,354,926,699,1082,874,17,31,39,12,9,8,156,342,1142,986,1309,885,9,29,27,12,5,5,446,606,893,885,686,1000,42,28,39,18,17,11,395,369,989,660,705,832,24,16,19,11,14,15,8 +353,467,1021,768,662,855,35,27,16,11,11,13,320,324,748,679,703,924,30,18,21,22,15,9,300,130,835,702,1100,851,17,30,39,2,9,0,262,146,1057,861,895,944,11,14,37,1,3,1,229,157,1027,897,1011,878,2,8,39,2,4,10,227,249,874,889,1142,810,1,26,26,4,9,8,283,383,927,680,782,874,24,10,37,19,9,2,349,529,882,565,798,850,27,20,44,18,14,14,414,380,805,707,794,964,29,33,45,13,11,15,262,232,1013,879,1065,923,7,16,7,14,4,2,357,319,859,820,985,685,8,21,23,16,10,4,307,377,1098,777,756,771,26,34,22,15,10,1,341,477,1002,795,824,713,28,24,22,16,13,12,367,387,672,749,826,876,19,17,38,18,9,11,311,371,893,700,1050,852,16,31,33,11,8,8,189,345,1109,983,1277,849,8,33,21,11,6,5,433,641,860,844,654,1024,41,32,41,17,16,11,372,382,956,621,673,794,21,16,13,10,15,15,8 +392,352,947,659,681,859,22,11,15,9,9,11,471,609,628,606,722,758,17,30,36,10,11,11,381,313,881,625,1119,817,22,20,36,18,13,2,325,423,935,752,914,932,20,36,38,11,7,9,356,382,907,796,1030,784,15,36,36,14,8,10,286,440,778,814,1161,774,14,24,23,16,9,0,452,494,765,589,801,752,11,38,38,9,11,4,384,480,738,470,817,734,14,28,39,14,10,16,549,515,763,576,813,838,40,15,38,9,17,17,223,245,951,858,1084,943,6,22,22,10,0,0,424,276,795,739,1004,733,5,27,18,16,6,6,340,290,1034,672,775,815,13,16,19,17,10,1,486,422,1026,664,843,715,15,12,21,8,11,14,538,340,552,656,845,672,6,31,31,10,13,9,298,320,781,665,1069,786,3,17,28,15,12,2,140,172,1021,938,1296,869,5,1,6,9,2,1,544,496,662,721,673,882,28,16,38,11,14,9,425,413,956,508,692,864,18,32,16,18,13,17,8 +262,402,799,772,655,786,25,27,17,4,11,15,329,315,580,671,696,883,20,14,18,15,15,9,295,153,723,674,1093,778,23,30,40,9,9,2,281,167,851,861,888,855,17,18,32,10,3,1,270,206,823,889,1004,775,12,8,40,11,4,10,206,308,658,861,1135,747,11,26,27,11,9,10,324,346,731,670,775,857,14,8,32,12,9,2,306,428,686,569,791,797,17,16,39,17,14,14,459,387,753,715,787,899,39,29,40,12,11,15,209,161,787,837,1058,844,3,14,2,7,4,2,292,296,633,798,978,658,2,19,24,7,10,4,248,318,872,769,749,716,16,30,27,8,10,1,376,412,854,803,817,660,18,20,27,13,13,12,410,310,500,739,819,863,9,13,39,11,9,11,260,294,687,654,1043,793,6,29,34,6,8,10,160,326,887,939,1270,766,2,29,26,4,6,7,482,574,748,848,647,953,31,28,40,12,16,13,335,291,780,625,666,745,15,14,18,13,15,15,8 +339,391,855,798,640,875,27,33,31,4,10,14,382,358,592,685,687,898,22,22,20,13,14,10,316,198,711,660,1076,851,25,24,30,11,10,1,266,222,887,871,871,898,15,10,20,10,2,0,277,265,855,889,987,848,10,2,30,11,3,9,221,385,708,835,1118,814,9,20,41,13,10,9,367,335,755,670,762,812,16,14,20,10,10,3,319,459,712,601,782,814,19,24,27,13,13,15,486,452,751,753,770,910,37,37,28,12,8,16,166,150,847,815,1041,935,1,22,10,5,3,1,353,311,693,782,961,719,0,25,38,7,11,5,295,309,932,799,736,793,18,28,33,6,9,0,409,453,874,841,800,739,20,28,31,11,14,13,457,369,516,729,810,826,11,21,35,11,10,10,253,357,725,632,1034,850,8,23,38,4,9,9,95,243,943,923,1257,873,0,37,38,4,5,6,485,571,750,874,634,902,33,36,28,12,13,12,356,382,836,663,649,822,13,8,18,9,14,16,8 +223,453,873,812,634,710,38,33,13,15,13,11,216,206,672,707,675,931,41,20,18,20,15,7,210,180,719,754,1072,740,22,14,34,2,7,8,296,114,945,909,867,815,14,12,34,5,5,3,237,129,911,945,983,731,9,8,34,6,6,12,149,233,748,945,1114,795,10,14,21,0,7,16,213,289,835,730,754,977,35,12,34,23,7,0,227,413,782,615,770,875,38,22,39,16,14,12,370,278,755,749,766,959,20,35,40,11,9,17,300,230,857,871,1037,728,18,18,4,18,6,4,241,307,703,874,957,812,19,23,18,12,12,8,237,347,942,793,728,752,29,34,23,11,12,5,281,369,872,837,796,778,31,36,25,14,15,10,275,317,574,799,798,1001,30,19,33,22,7,13,229,297,783,732,1022,811,27,17,28,15,6,16,261,431,971,1017,1249,664,19,35,24,15,8,13,413,519,818,888,626,1125,36,34,36,21,14,15,292,250,804,649,645,573,26,6,16,14,13,13,8 +412,506,951,890,687,858,39,31,25,13,9,10,353,173,720,771,728,965,38,20,26,18,13,12,311,135,777,742,1125,858,21,26,36,0,11,7,261,91,1011,975,920,891,15,12,26,3,1,2,232,98,981,991,1036,813,6,4,36,4,2,9,236,232,816,935,1167,877,7,22,35,2,9,15,320,264,893,778,807,943,32,12,26,21,9,5,368,378,844,687,823,869,35,22,33,14,12,17,417,273,789,835,819,957,21,35,34,9,7,18,273,235,937,865,1090,904,15,22,4,16,2,1,386,328,783,880,1010,808,16,23,32,14,12,7,318,392,1022,875,781,780,30,30,33,13,8,4,392,414,936,923,849,818,32,26,33,12,15,15,406,328,634,837,851,971,27,19,41,20,11,8,316,316,847,690,1075,877,24,23,42,13,10,15,182,436,1041,979,1302,852,16,35,32,13,4,12,422,490,856,968,679,1015,37,34,34,19,12,12,433,285,880,739,698,775,29,10,24,12,13,18,8 +420,368,918,771,652,884,27,10,24,6,10,11,457,471,611,684,693,839,22,17,25,15,12,13,383,251,820,667,1090,848,25,33,39,9,14,4,307,301,922,862,885,909,15,31,29,8,2,3,330,290,892,882,1001,871,10,21,39,9,1,10,266,396,757,850,1132,813,9,31,34,11,8,6,438,400,764,667,772,769,16,25,29,12,8,6,386,448,729,568,788,771,19,27,36,19,9,18,541,495,786,718,784,893,37,16,37,16,12,19,159,177,916,854,1055,954,1,19,1,7,1,2,412,280,760,783,975,724,0,24,31,13,7,8,366,298,999,780,746,818,18,17,30,14,11,3,486,414,985,806,814,762,20,9,30,13,12,16,534,324,559,728,816,753,11,22,44,11,14,7,300,318,764,655,1040,831,8,30,41,12,13,6,94,160,998,940,1267,896,0,16,29,6,1,3,524,544,723,847,644,859,33,15,37,10,13,11,413,435,917,634,663,827,13,31,21,13,10,19,8 +417,463,804,988,670,852,31,24,32,12,14,8,344,162,667,845,711,1021,36,35,19,13,10,10,286,170,680,760,1108,842,25,1,29,1,12,15,252,140,902,1051,903,813,9,15,19,2,0,0,205,143,870,1045,1019,737,14,21,29,3,1,9,217,231,695,953,1150,903,15,3,42,3,8,19,301,219,824,850,790,965,40,27,19,18,8,3,339,271,767,797,806,873,39,13,26,9,11,15,412,212,774,949,802,887,13,36,27,4,0,16,226,280,778,797,1073,856,23,25,11,15,3,9,377,359,624,904,993,910,24,14,39,15,11,15,319,387,863,957,764,822,26,25,32,14,11,12,379,343,805,1037,832,898,30,33,30,7,10,13,393,255,563,891,834,1001,35,28,34,17,12,10,289,257,746,696,1058,889,32,4,37,12,11,17,159,479,900,917,1285,816,24,22,39,12,9,18,411,395,829,1068,662,947,29,37,27,14,5,12,406,274,725,843,681,779,23,9,17,11,12,16,8 +440,466,997,815,654,885,31,24,24,12,9,14,431,285,710,708,695,884,26,11,25,19,15,12,369,159,809,685,1092,857,21,37,39,5,13,3,239,181,1039,902,887,890,11,21,29,2,1,2,254,142,1009,922,1003,848,6,15,39,1,0,9,284,228,850,874,1134,828,5,33,34,7,7,11,368,318,899,707,774,810,20,11,29,16,7,5,380,400,854,612,790,796,23,19,36,19,10,17,467,339,779,760,786,906,33,26,37,14,9,18,211,201,987,844,1057,941,3,15,1,15,0,1,448,282,833,815,977,705,4,24,31,19,10,7,392,354,1072,812,748,799,22,27,30,18,10,2,404,436,968,848,816,767,24,17,30,17,13,15,456,252,656,768,818,828,15,10,44,15,13,8,312,268,875,647,1042,852,12,34,41,8,12,11,108,344,1083,936,1269,895,4,26,29,10,2,8,444,536,802,893,646,904,37,25,37,14,14,14,427,283,930,670,665,796,17,19,21,11,11,18,8 +291,393,894,689,628,794,29,27,9,2,11,14,346,418,623,612,669,805,24,14,24,13,15,8,306,188,758,627,1066,770,21,30,32,13,9,1,310,224,922,784,861,883,13,18,40,12,3,2,291,241,890,812,977,795,8,8,32,13,4,11,239,325,745,812,1108,729,7,26,19,13,9,7,339,401,784,597,748,759,18,8,38,12,9,1,309,489,741,486,764,743,21,16,37,17,14,13,478,462,780,618,760,855,35,29,38,12,11,14,186,166,888,818,1031,866,1,14,10,5,4,3,291,271,734,739,951,640,2,19,16,9,10,3,291,303,973,698,722,714,20,30,19,10,10,2,401,443,931,706,790,654,22,20,19,11,13,11,425,335,553,666,792,723,13,13,31,13,9,12,285,315,760,647,1016,761,10,29,26,8,8,7,157,255,980,926,1243,792,2,29,18,4,6,4,507,609,771,759,620,885,35,28,34,14,16,10,318,366,875,538,639,769,13,14,10,15,15,14,8 +443,483,1051,823,677,883,36,29,23,10,8,15,380,268,772,722,718,920,31,18,24,21,14,11,326,134,855,701,1115,867,16,32,40,3,12,2,270,142,1085,916,910,926,12,16,30,0,0,1,217,115,1055,938,1026,864,1,10,40,1,1,8,251,219,902,892,1157,830,0,28,33,5,8,10,313,351,953,725,797,862,25,10,30,18,8,4,385,465,906,620,813,836,28,20,37,19,11,16,418,326,795,764,809,940,28,33,38,14,10,17,248,220,1043,862,1080,953,8,20,0,13,1,0,395,309,889,831,1000,695,9,21,30,17,9,6,329,381,1128,820,771,801,27,32,29,16,9,1,401,455,1024,852,839,759,29,24,29,17,12,14,403,315,700,786,841,866,20,17,45,17,12,9,327,311,921,681,1065,860,17,29,40,10,11,10,177,353,1137,968,1292,889,9,33,28,10,3,7,419,579,888,901,669,954,42,32,38,16,15,13,442,334,986,674,688,828,24,14,20,11,12,17,8 +351,515,859,863,678,855,36,29,30,12,13,10,318,178,684,736,719,968,33,24,23,15,9,10,304,138,707,691,1116,861,18,18,33,1,11,7,260,98,931,938,911,898,12,8,23,2,1,0,221,125,901,948,1027,822,3,4,33,3,2,9,231,281,730,870,1158,874,2,14,40,3,9,15,287,325,831,737,798,956,27,16,23,20,9,3,343,393,780,666,814,882,30,26,30,11,12,15,424,286,765,818,810,948,26,39,31,6,3,16,264,248,843,814,1081,909,10,22,7,15,2,1,355,373,689,821,1001,801,11,27,37,15,12,7,303,425,928,854,772,779,27,30,36,14,8,4,357,449,852,906,840,811,29,32,34,9,11,13,377,373,568,792,842,978,22,23,38,19,11,10,313,375,769,639,1066,880,19,21,41,12,10,15,199,429,951,932,1293,851,11,39,35,12,6,12,439,483,842,941,670,1000,40,38,31,16,8,12,386,332,790,722,689,772,24,10,21,11,13,16,8 +356,440,1129,679,667,924,35,15,4,10,10,16,315,495,816,626,708,923,30,12,35,21,14,6,333,189,931,657,1105,914,17,38,25,3,10,3,265,243,1151,768,900,1049,11,28,35,0,2,6,168,212,1117,814,1016,897,2,18,25,1,3,13,270,310,976,826,1147,855,1,36,12,5,10,5,272,474,985,597,787,881,24,20,35,18,10,1,362,582,944,490,803,881,27,24,28,19,13,11,369,525,821,610,799,987,29,19,29,14,14,12,289,253,1123,862,1070,1014,7,16,21,13,3,5,344,320,969,757,990,768,8,21,7,17,9,1,332,368,1208,702,761,856,26,20,8,16,9,4,342,518,1104,698,829,780,28,10,10,17,12,9,342,440,760,668,831,815,19,19,22,17,10,14,360,426,991,699,1055,889,16,35,17,10,9,7,212,274,1211,972,1282,926,8,19,7,10,5,6,384,702,886,747,659,1059,41,18,27,16,17,12,385,481,1066,544,678,909,23,26,15,11,14,12,8 +366,442,809,851,645,901,26,32,33,3,12,13,369,287,598,718,686,938,21,17,18,12,10,11,309,157,695,641,1083,879,24,29,28,12,12,4,249,159,863,916,878,910,16,15,18,9,0,1,230,232,835,908,994,858,11,7,28,8,1,8,220,350,668,824,1125,846,10,25,41,14,8,12,352,278,749,713,765,864,15,9,18,9,8,4,320,400,704,656,781,848,18,19,25,14,11,16,447,353,769,808,777,912,38,32,26,9,4,17,177,147,797,788,1048,955,2,21,12,6,1,0,368,336,643,777,968,741,1,20,40,10,11,6,302,338,882,848,739,815,17,29,31,9,9,1,400,470,846,896,807,763,19,23,29,10,12,14,442,334,504,756,809,894,10,16,33,8,12,9,264,344,701,589,1033,882,7,24,36,3,11,12,100,344,897,882,1260,895,1,34,40,3,5,9,430,546,764,929,637,896,32,31,26,9,9,15,375,319,784,718,656,836,14,9,18,10,12,17,8 +369,443,781,855,644,837,28,30,30,3,12,11,394,236,558,728,685,912,23,17,19,10,12,11,326,116,663,661,1082,815,24,25,29,14,14,6,264,138,841,928,877,846,14,15,19,11,2,1,271,183,811,932,993,770,9,5,29,10,1,8,237,299,646,846,1124,806,8,21,40,16,8,14,377,269,719,725,764,838,17,9,19,9,8,4,325,375,672,658,780,808,20,19,26,14,9,16,488,326,757,810,776,862,36,32,27,9,4,17,152,170,767,780,1047,879,0,17,11,4,1,0,349,299,613,799,967,709,1,20,37,8,9,6,343,343,852,840,738,747,19,31,32,7,11,3,427,439,800,898,806,731,21,25,30,8,12,14,471,289,488,776,808,870,12,16,34,10,14,9,275,293,677,601,1032,826,9,24,37,3,13,14,91,363,871,896,1259,819,1,32,39,3,5,11,477,509,732,931,636,876,34,31,27,11,9,13,360,268,752,714,655,792,12,11,17,10,10,17,8 +441,501,1001,905,694,935,37,30,32,11,12,12,366,214,788,780,735,1022,32,17,21,18,10,12,302,116,823,725,1132,925,15,31,31,2,12,5,256,140,1057,982,927,946,13,15,21,1,0,2,205,129,1029,986,1043,878,0,9,31,2,1,9,241,273,860,914,1174,926,1,27,38,4,8,13,287,321,953,779,814,966,26,9,21,19,8,5,363,421,908,704,830,926,29,19,28,14,11,17,374,296,821,856,826,994,27,32,29,9,4,18,286,242,989,866,1097,973,9,21,9,14,1,1,375,369,835,863,1017,839,10,20,39,16,11,7,319,409,1074,898,788,845,28,31,32,15,9,2,375,431,980,944,856,853,30,23,32,12,12,15,371,365,692,832,858,1004,21,16,36,18,12,8,323,373,895,671,1082,944,18,26,39,11,11,13,183,367,1089,962,1309,919,10,32,37,11,5,10,383,519,918,981,686,1028,43,31,29,17,9,14,460,354,932,764,705,846,25,11,21,10,12,18,8 +379,413,866,894,665,805,28,28,28,6,10,13,416,260,615,771,706,910,23,19,23,17,12,11,346,136,742,736,1103,799,24,23,33,7,12,4,246,138,910,975,898,852,14,13,23,8,0,1,283,183,880,985,1014,766,9,3,33,9,1,8,251,291,721,919,1145,792,8,19,38,9,8,12,391,313,784,774,785,864,17,11,23,14,8,4,351,395,739,693,801,820,20,21,30,17,11,16,490,352,812,845,797,896,36,34,31,14,6,17,128,154,856,863,1068,859,0,17,7,9,1,0,363,275,702,868,988,705,1,22,35,9,11,6,343,319,941,883,759,721,19,33,36,8,9,1,431,419,891,933,827,719,21,27,34,15,14,14,487,283,543,829,829,884,12,18,38,13,12,9,287,279,746,696,1053,812,9,24,41,6,11,12,69,327,954,987,1280,787,1,34,35,6,3,9,487,545,775,972,657,928,34,33,31,12,11,15,372,290,841,749,676,754,14,13,21,11,12,17,8 +400,428,853,881,663,890,28,29,31,5,10,11,433,269,628,750,704,949,23,18,22,14,12,9,383,143,689,687,1101,884,24,28,32,10,12,6,235,149,913,946,896,927,14,14,22,7,0,1,258,200,879,948,1012,861,9,6,32,6,1,10,304,330,720,872,1143,855,8,24,41,12,8,14,380,312,797,743,783,897,17,10,22,11,8,2,394,404,744,686,799,861,20,20,29,16,11,14,467,353,767,838,795,937,36,33,30,11,6,15,193,161,839,832,1066,960,0,16,8,8,1,2,410,316,685,825,986,728,1,21,38,12,11,6,356,336,924,876,757,810,19,32,35,11,9,3,408,462,844,926,825,762,21,24,33,12,14,12,460,306,552,790,827,913,12,17,37,10,12,11,336,316,749,635,1051,881,9,29,40,5,11,14,106,328,943,930,1278,896,1,33,36,3,3,11,446,550,782,959,655,941,34,32,30,9,11,13,409,301,784,746,674,831,16,14,20,12,12,15,8 +386,480,1070,763,673,872,37,27,18,12,9,14,319,347,785,672,714,903,32,14,23,23,13,10,293,141,874,699,1111,864,15,36,41,3,11,1,283,145,1104,860,906,949,13,20,35,2,1,0,236,128,1074,898,1022,899,0,14,41,3,2,9,238,220,921,890,1153,825,1,32,28,3,9,9,286,380,968,683,793,871,26,8,35,20,9,3,348,516,921,568,809,835,29,16,40,19,12,15,407,375,818,696,805,963,27,29,41,14,11,16,289,237,1062,872,1076,944,9,18,5,15,2,1,358,314,908,817,996,680,10,21,25,15,8,5,308,392,1147,764,767,792,28,30,24,14,8,0,370,470,1049,784,835,744,30,20,24,17,11,13,368,356,717,752,837,867,21,13,40,19,11,10,322,338,940,695,1061,859,18,31,35,12,10,9,206,360,1156,976,1288,880,10,29,23,12,4,6,432,628,887,837,665,1017,43,28,39,18,16,12,413,363,1005,608,684,787,25,16,15,11,13,16,8 +272,442,838,988,645,755,31,35,24,15,15,12,243,171,705,867,686,970,34,24,23,16,9,6,267,203,724,802,1083,777,23,12,33,2,11,13,281,129,944,1071,878,742,13,12,23,5,1,4,212,184,910,1079,994,700,18,10,33,6,2,13,200,290,737,999,1125,862,19,14,34,0,9,21,252,214,864,872,765,994,42,16,23,21,9,1,258,282,807,785,781,900,39,16,30,12,12,11,367,211,820,933,777,928,13,29,31,7,1,18,263,259,808,873,1048,739,27,14,7,18,2,7,260,382,656,946,968,911,28,17,31,12,12,13,294,344,893,955,739,811,30,32,36,11,10,10,326,346,839,1021,807,861,34,30,34,10,9,9,320,248,605,927,809,1062,39,17,38,20,11,14,262,260,790,748,1033,866,36,13,41,13,10,21,214,500,936,1033,1260,697,28,29,35,15,8,18,402,406,867,1066,637,1048,25,38,31,17,6,16,299,205,753,825,656,572,23,4,21,12,13,12,8 +396,440,725,936,647,843,24,32,29,4,13,12,405,181,548,801,688,956,23,17,22,13,13,14,329,217,713,712,1085,829,26,19,32,11,15,9,291,175,793,1007,880,808,14,19,22,8,3,4,284,200,765,995,996,744,17,19,32,7,2,11,216,266,592,903,1127,864,16,19,39,13,9,15,390,216,685,804,767,928,17,17,22,10,9,7,330,250,638,737,783,834,20,11,29,15,8,19,493,215,727,889,779,854,36,18,30,10,3,20,211,251,711,783,1050,855,8,13,8,7,2,3,398,316,557,852,970,849,7,16,36,11,8,9,322,350,796,913,741,775,15,31,35,10,12,6,434,350,786,977,809,829,17,21,33,11,13,17,484,198,488,849,811,972,12,16,37,9,15,8,242,208,631,646,1035,862,9,14,40,4,14,13,84,440,815,895,1262,815,7,20,36,2,6,14,460,376,746,1014,639,908,26,31,30,8,8,12,393,235,706,789,658,744,16,13,20,11,9,20,8 +371,327,1026,617,641,844,25,11,9,4,10,10,378,562,703,586,672,747,20,30,40,13,12,12,290,346,920,569,1049,776,17,20,30,11,14,3,296,440,968,694,868,861,17,36,40,8,6,14,311,449,948,732,972,713,12,36,30,7,7,9,197,355,847,744,1083,747,11,24,17,13,8,1,357,447,756,513,743,815,14,38,40,10,10,9,285,467,763,400,741,695,17,28,33,17,9,17,518,454,726,546,777,735,35,15,32,10,16,18,162,224,1030,816,1022,908,3,18,26,7,1,1,325,233,876,671,936,746,2,23,12,11,7,7,337,291,1115,652,709,770,16,16,13,10,11,2,423,371,1083,634,765,690,18,12,15,11,12,15,447,369,593,584,785,649,9,31,25,9,14,8,199,341,838,609,991,747,6,17,22,6,13,1,111,87,1084,882,1222,828,2,1,2,2,1,0,501,441,637,679,635,805,31,16,32,8,13,10,318,468,1013,502,658,953,15,28,20,13,12,18,8 +339,285,875,687,635,762,20,6,11,4,5,10,368,444,562,612,676,823,15,21,22,13,5,12,280,252,815,627,1073,734,16,29,34,11,9,3,308,320,865,780,868,841,22,29,38,8,11,8,323,351,835,810,984,739,17,29,34,7,10,9,175,337,708,808,1115,705,16,27,21,13,9,1,347,317,711,593,755,857,9,29,36,10,9,5,291,363,672,484,771,759,12,31,39,17,4,17,532,412,675,622,767,849,34,8,40,10,11,18,192,152,875,816,1038,822,8,23,8,7,6,1,335,261,721,737,958,710,7,30,18,11,4,7,295,205,960,698,729,690,11,9,21,10,4,2,399,309,928,710,797,670,13,9,21,11,5,15,439,303,562,664,799,821,4,22,33,9,9,8,199,299,713,649,1023,735,1,26,28,6,10,1,131,221,951,928,1250,748,7,8,20,2,8,0,531,449,712,759,627,983,26,7,36,8,8,10,320,372,856,542,646,733,20,35,12,13,11,18,8 +332,452,976,776,651,831,37,27,19,11,9,15,285,281,719,683,692,960,32,16,20,22,15,7,265,95,794,672,1089,845,15,28,38,2,11,2,233,127,1024,869,884,934,13,16,28,1,1,3,170,154,992,895,1000,844,0,6,38,2,2,12,200,246,835,859,1131,818,1,24,29,4,9,10,224,342,902,680,771,926,26,8,28,19,9,0,314,478,853,573,787,882,29,18,35,18,12,12,353,347,772,719,783,986,27,31,36,13,9,13,275,205,964,839,1054,909,9,16,2,14,2,4,314,318,810,794,974,715,10,19,26,16,10,2,278,360,1049,783,745,755,28,32,31,15,8,3,314,476,951,807,813,729,30,22,31,16,13,10,312,356,645,743,815,926,21,15,41,18,11,13,292,348,860,668,1039,850,18,27,36,11,10,10,222,338,1064,951,1266,817,10,31,30,11,4,7,374,586,837,854,643,1032,43,30,36,17,14,13,373,371,907,627,662,798,23,14,22,10,13,13,8 +350,320,753,753,656,803,19,15,23,4,3,12,389,471,474,654,697,854,14,12,24,13,5,12,297,279,759,653,1094,767,17,38,38,11,15,3,335,335,761,842,889,836,23,32,28,8,7,2,336,310,727,864,1005,784,18,22,38,9,8,9,188,406,600,838,1136,738,17,36,33,13,15,7,366,362,639,647,776,810,8,20,28,10,13,5,300,342,602,550,792,772,11,26,35,17,8,17,545,453,647,696,788,850,35,15,36,12,11,18,233,203,749,820,1059,857,9,14,2,5,6,1,362,294,599,773,979,765,8,21,30,11,10,7,274,234,834,756,750,791,10,16,31,12,4,2,410,324,820,784,818,685,12,6,31,11,5,15,456,254,476,712,820,828,3,19,43,9,15,8,198,262,613,637,1044,768,0,35,40,10,16,7,152,240,837,924,1271,801,8,17,30,4,8,4,540,452,660,829,648,928,25,14,36,10,8,10,351,355,750,608,667,752,21,26,22,15,17,18,8 +383,453,1083,723,655,938,35,23,16,11,11,12,346,466,802,660,696,899,30,16,25,20,15,10,308,232,875,653,1093,912,17,28,37,2,9,1,268,282,1097,802,888,1017,11,16,31,1,3,6,243,265,1069,838,1004,903,2,8,37,2,4,11,243,359,924,834,1135,859,1,24,24,4,9,3,299,487,953,619,775,845,24,12,31,19,11,3,357,595,920,512,791,849,27,18,38,16,14,15,434,530,801,660,787,971,29,31,39,11,13,16,250,250,1079,872,1058,1028,7,14,11,14,4,1,379,351,925,765,978,762,8,19,19,16,10,5,333,385,1164,748,749,872,26,32,20,15,10,0,363,537,1068,748,817,810,28,22,22,14,13,13,389,471,708,690,819,789,19,15,32,18,9,10,319,449,935,673,1043,881,16,29,29,11,8,3,187,245,1163,952,1270,952,8,31,17,11,6,2,459,683,910,793,647,987,41,30,39,17,18,8,386,516,1022,590,666,921,23,18,19,10,15,16,8 +393,513,1016,820,672,860,36,27,20,11,10,12,340,216,759,715,713,939,31,16,21,20,14,10,302,128,838,712,1110,856,16,34,41,2,10,5,248,116,1070,911,905,879,12,18,31,1,2,0,225,95,1036,943,1021,829,1,12,41,2,3,9,227,219,879,903,1152,857,0,30,30,4,10,13,303,305,936,724,792,899,25,8,31,19,10,3,355,423,887,617,808,859,28,18,38,16,13,15,426,278,822,763,804,961,28,31,39,11,10,16,248,252,1004,861,1075,900,8,18,1,14,3,1,379,331,850,846,995,768,9,21,27,16,9,5,305,401,1089,813,766,768,27,32,28,15,9,2,367,427,1001,851,834,780,29,22,28,14,12,13,387,319,683,791,836,943,20,15,42,18,10,10,297,317,906,672,1060,877,17,31,37,11,9,13,175,415,1108,961,1287,848,9,31,27,11,5,10,429,523,871,896,664,1019,42,30,39,17,15,14,398,282,947,671,683,735,24,16,19,10,14,16,8 +386,380,862,765,678,870,24,25,26,3,8,13,457,375,585,668,719,841,19,14,27,14,14,11,389,223,750,635,1116,838,24,34,37,10,12,2,311,225,880,848,911,879,18,18,27,9,0,1,340,262,850,864,1027,843,13,12,37,10,1,8,286,388,707,818,1158,803,12,30,36,12,8,8,444,324,744,649,798,769,13,10,27,11,8,4,396,406,699,562,814,763,16,16,34,14,11,16,547,427,764,712,810,875,40,29,35,11,10,17,171,125,854,810,1081,938,4,16,3,6,1,0,396,306,700,761,1001,704,3,21,33,8,9,6,338,298,939,774,772,792,15,30,32,7,9,1,496,418,913,800,840,752,17,20,32,12,12,14,536,292,517,708,842,775,8,13,42,10,12,9,310,286,718,615,1066,825,5,31,43,3,11,8,124,252,944,902,1293,884,3,29,31,3,3,5,544,530,729,841,670,849,30,28,35,11,15,11,407,343,845,628,689,803,16,16,23,10,12,17,8 +350,454,932,900,624,811,32,25,21,11,10,10,319,191,709,793,665,970,37,14,22,22,14,8,319,169,780,766,1062,831,24,26,38,4,10,9,237,111,1002,995,857,824,8,18,28,1,2,2,170,144,966,1017,973,774,11,8,38,2,3,11,238,242,807,965,1104,878,12,22,31,4,10,17,258,256,888,806,744,990,37,10,28,19,10,1,372,344,835,699,760,898,40,16,35,20,13,13,363,227,818,837,756,976,16,29,36,15,8,18,285,225,916,911,1027,833,20,12,2,14,3,3,352,338,762,908,947,857,21,17,28,16,11,9,282,356,1001,887,718,785,23,34,31,15,9,6,346,348,923,925,786,839,27,24,31,18,14,11,338,296,629,867,788,1034,32,13,43,18,10,12,338,290,838,726,1012,884,29,27,38,11,9,17,214,454,1030,1011,1239,785,21,29,30,11,5,14,370,462,819,974,616,1070,34,28,36,17,13,14,405,237,859,741,635,658,24,16,22,12,14,14,8 +369,429,1036,722,625,817,36,16,13,10,9,14,340,372,705,631,666,874,31,11,22,21,13,10,294,102,854,684,1063,801,16,37,36,3,11,3,208,170,1066,817,858,930,12,25,38,0,5,0,211,159,1030,863,974,836,1,15,36,1,6,9,231,211,891,869,1105,758,0,33,23,5,11,11,283,347,900,648,745,808,25,19,38,18,9,3,339,495,865,533,761,792,28,25,41,19,12,15,390,402,798,659,757,908,28,22,42,14,17,16,192,228,1028,853,1028,887,8,15,8,13,2,1,349,253,874,798,948,647,9,24,20,17,8,5,349,341,1113,723,719,735,27,23,21,16,8,0,343,413,1011,747,787,671,29,13,21,17,11,13,371,347,675,719,789,792,20,18,35,17,11,10,293,331,906,672,1013,798,17,36,30,10,10,11,169,331,1126,957,1240,811,9,22,20,10,4,8,409,619,781,796,617,974,42,21,38,16,16,14,360,364,971,571,636,796,20,25,12,11,13,16,8 +432,470,952,861,672,830,35,24,23,12,9,12,395,221,705,750,713,913,30,13,24,21,15,10,337,149,774,729,1110,834,17,29,40,1,11,5,271,139,1012,954,905,857,11,19,30,2,1,0,266,122,980,974,1021,801,2,9,40,3,2,9,274,184,817,924,1152,837,1,25,33,3,9,13,358,268,888,761,792,895,24,11,30,20,9,3,378,378,837,658,808,831,27,15,37,17,12,15,463,263,788,798,804,931,29,28,38,12,9,16,215,205,938,854,1075,886,7,13,0,15,2,1,430,298,784,867,995,746,8,18,30,15,10,5,366,370,1023,842,766,746,26,31,29,14,8,2,406,384,929,886,834,756,28,21,29,15,13,13,446,278,631,822,836,925,19,12,45,19,11,10,324,274,848,693,1060,847,16,28,40,12,10,13,166,420,1042,980,1287,832,8,28,28,12,4,10,470,488,817,935,664,979,41,27,38,18,14,14,409,259,881,700,683,717,23,17,20,11,13,16,8 +423,393,883,926,655,760,32,28,26,11,11,9,360,250,678,803,696,919,37,15,25,20,11,11,308,196,725,756,1093,768,28,19,35,2,11,10,260,184,957,1009,888,775,8,19,25,1,1,1,207,179,925,1017,1004,701,13,19,35,2,2,8,245,221,758,949,1135,823,12,21,36,4,9,18,289,229,853,808,775,937,37,19,25,19,9,4,359,285,798,723,791,829,40,13,32,16,12,16,404,222,767,871,787,889,16,18,33,11,5,17,228,188,865,827,1058,778,20,7,5,14,2,4,377,261,711,896,978,824,21,18,33,16,12,10,339,307,950,893,749,736,23,33,34,15,8,7,381,315,870,959,817,814,27,21,34,14,13,14,383,207,588,863,819,965,32,18,40,18,11,9,313,205,795,702,1043,813,29,18,43,11,10,16,183,379,977,981,1270,736,21,18,33,11,4,15,417,403,792,1004,647,977,30,29,33,17,10,11,410,238,808,763,666,655,24,11,23,10,13,17,8 +423,427,1028,755,635,919,36,22,22,10,9,12,360,388,725,670,676,948,31,9,23,21,13,10,312,120,830,649,1073,901,16,33,37,3,11,1,238,208,1046,842,868,980,12,23,27,0,1,2,193,195,1014,858,984,926,1,13,37,1,2,9,237,303,875,836,1115,858,0,29,32,5,9,7,291,387,900,647,755,866,25,13,27,18,9,3,375,483,857,550,771,872,28,19,34,19,12,15,400,448,740,696,767,984,28,24,35,14,11,16,240,170,1024,842,1038,987,8,11,3,13,2,1,393,317,870,767,958,755,9,24,29,17,8,5,329,343,1109,768,729,837,27,27,32,16,8,0,371,469,1005,784,797,775,29,17,32,17,11,13,385,379,655,708,799,866,20,12,42,17,11,10,321,369,886,647,1023,896,17,34,39,10,10,7,169,245,1112,928,1250,915,9,24,31,10,4,4,397,615,809,831,627,996,42,23,35,16,16,10,432,418,967,616,646,872,20,19,23,11,13,16,8 +380,530,853,909,656,949,32,34,37,11,13,10,357,229,712,778,697,1020,27,23,16,12,9,10,341,173,717,687,1094,949,20,25,26,4,11,7,219,129,925,962,889,984,10,9,16,1,1,0,190,202,899,952,1005,938,5,3,26,0,2,9,264,366,724,854,1136,928,4,21,39,6,9,15,294,338,847,763,776,982,21,15,16,17,9,3,380,440,802,724,792,952,24,25,23,8,12,15,393,327,785,876,788,1036,32,38,24,3,1,16,261,257,837,828,1059,1005,4,21,14,14,4,1,396,432,683,811,979,813,5,26,44,18,12,7,334,420,922,918,750,859,23,27,29,17,12,4,354,438,848,964,818,835,25,29,27,6,9,13,370,434,596,798,820,1008,16,22,31,16,11,10,332,440,767,605,1044,962,13,24,34,9,10,15,168,424,945,896,1271,943,5,38,42,9,10,12,390,458,870,987,648,1048,38,37,24,13,4,12,413,399,786,784,667,840,18,9,20,10,13,16,8 +445,485,790,950,658,920,31,27,34,13,15,8,410,164,631,805,699,1013,26,20,17,14,11,10,346,162,664,722,1096,898,21,22,27,6,13,13,248,120,878,1007,891,875,11,12,17,3,1,0,223,141,844,997,1007,813,6,8,27,2,0,9,275,263,673,899,1138,925,5,18,40,8,7,19,345,255,784,806,778,937,20,12,17,15,7,3,381,305,729,763,794,883,23,16,24,10,10,15,456,224,766,915,790,905,33,29,25,5,1,16,202,304,768,791,1061,934,3,18,13,16,2,7,435,399,614,854,981,870,4,21,41,20,10,13,385,453,853,931,752,826,22,30,30,19,10,10,393,367,781,1003,820,872,24,22,28,8,11,13,435,307,533,845,822,985,15,19,32,14,13,10,321,303,718,642,1046,923,12,21,35,9,12,17,139,527,884,891,1273,896,4,29,41,11,8,18,431,373,775,1028,650,929,37,32,25,13,6,12,414,306,711,815,669,825,17,14,19,12,11,16,8 +326,484,816,971,627,890,37,29,29,12,14,8,307,155,713,836,668,999,38,24,18,11,10,10,285,181,692,765,1065,892,23,18,28,1,8,11,241,125,906,1038,860,891,13,8,18,2,4,0,244,170,878,1032,976,835,8,4,28,3,5,9,214,344,699,942,1107,931,7,14,39,3,8,19,280,298,854,835,747,1005,32,16,18,16,8,3,312,350,799,778,763,915,35,26,25,7,13,15,411,249,796,930,759,967,21,39,26,2,4,16,267,331,794,870,1030,920,15,22,12,15,5,5,348,470,640,897,950,884,16,27,36,15,13,11,296,498,879,956,721,816,28,30,31,14,13,8,326,384,813,1018,789,884,30,32,29,5,12,13,368,404,601,880,791,1037,27,23,33,15,8,10,290,408,752,691,1015,923,24,21,36,12,7,17,208,560,910,984,1242,882,16,39,40,12,11,16,434,384,895,1047,619,1013,35,38,26,12,7,12,345,389,743,834,638,763,29,10,18,11,14,16,8 +376,486,969,792,644,850,36,26,19,13,10,13,339,243,690,691,685,943,31,13,20,20,14,11,297,109,791,706,1082,846,16,33,42,0,10,4,239,121,1009,885,877,907,12,19,32,3,2,1,222,118,975,917,993,835,1,11,42,4,3,8,212,206,826,895,1124,841,0,29,29,2,10,12,302,308,873,700,764,903,25,9,32,21,10,4,348,446,826,589,780,859,28,17,39,16,13,16,421,309,777,735,776,965,28,28,40,11,10,17,247,227,957,861,1047,896,8,13,2,16,3,0,378,308,803,828,967,750,9,22,26,14,9,6,292,380,1042,789,738,762,27,29,27,13,9,1,354,428,952,823,806,764,29,19,27,14,12,14,386,320,620,769,808,929,20,12,41,20,10,9,288,306,847,670,1032,863,17,32,36,13,9,12,168,388,1057,957,1259,836,9,28,26,13,5,9,422,552,810,870,636,1033,42,27,40,19,15,15,397,303,900,643,655,763,22,17,18,12,14,17,8 +439,515,839,907,641,866,30,28,29,11,11,10,432,192,624,772,682,919,25,17,20,16,11,12,366,132,683,703,1079,836,22,19,30,4,13,9,264,132,907,976,874,837,12,17,20,1,1,2,267,133,875,976,990,775,7,9,30,0,0,9,273,251,710,894,1121,837,6,19,39,6,7,17,385,245,789,773,761,835,19,13,20,17,7,5,345,347,742,710,777,807,22,17,27,12,10,17,490,268,745,862,773,861,34,30,28,7,5,18,154,244,823,794,1044,888,2,13,10,14,0,3,381,341,669,847,964,750,3,18,36,18,10,9,395,407,908,884,735,768,21,33,33,17,10,6,419,417,830,950,803,772,23,31,31,10,13,15,481,299,544,820,805,877,14,14,35,16,13,8,283,307,743,643,1029,851,11,22,38,9,12,15,119,433,931,920,1256,848,3,30,38,9,4,14,481,447,772,983,633,877,36,31,28,15,10,10,372,260,768,760,652,783,16,11,18,10,11,18,8 +481,451,934,980,679,851,36,25,31,11,14,10,420,190,735,857,720,970,41,14,22,18,12,12,352,180,768,774,1117,847,26,24,32,4,14,11,278,148,1008,1059,912,840,12,24,22,1,2,2,203,151,976,1063,1028,768,11,16,32,0,1,9,273,197,807,973,1159,884,10,26,41,6,8,17,325,223,906,858,799,942,35,18,22,17,8,5,405,281,851,779,815,856,38,12,29,14,9,17,426,210,794,931,811,892,18,21,30,9,2,18,244,248,918,849,1082,879,18,8,8,14,1,5,427,313,764,924,1002,845,19,17,38,18,9,11,361,367,1003,951,773,777,27,34,35,17,11,8,419,335,915,1019,841,849,29,22,33,12,12,15,415,257,641,909,843,980,30,17,37,16,14,8,341,255,846,718,1067,874,27,21,40,9,13,15,157,433,1028,981,1294,839,19,21,36,9,7,16,405,409,851,1056,671,952,32,28,30,15,7,10,468,256,861,827,690,762,26,16,20,10,10,18,8 +395,361,1027,662,642,913,28,13,4,6,10,11,382,554,700,597,685,836,23,28,31,17,12,11,314,258,811,612,1080,865,24,22,27,9,14,2,242,350,1015,751,875,972,14,38,39,6,4,9,241,333,983,783,991,832,9,38,27,7,5,10,225,375,860,793,1122,832,8,26,14,9,8,0,345,423,825,568,762,794,17,36,33,14,8,4,311,489,806,453,780,802,20,26,32,21,9,16,454,498,709,595,774,894,36,13,33,14,16,17,176,188,1027,819,1045,977,0,22,17,9,1,0,387,253,873,720,965,767,1,25,11,11,7,6,337,297,1112,683,736,833,19,14,12,12,11,1,387,419,1008,683,804,759,21,10,12,15,12,14,441,389,628,637,808,680,12,29,26,13,14,9,247,379,865,648,1032,850,9,19,21,10,13,2,93,117,1103,921,1257,907,1,1,11,6,1,1,435,515,728,732,634,896,34,14,29,12,13,9,368,500,994,523,653,922,14,32,11,13,12,17,8 +370,470,1162,589,672,972,38,12,8,10,12,11,299,597,839,562,713,933,33,29,39,21,16,11,279,247,936,587,1110,934,14,21,29,3,8,2,239,325,1142,672,905,1083,14,37,39,0,6,13,200,270,1114,720,1021,881,1,37,29,1,7,10,222,380,991,758,1152,893,2,25,16,5,8,0,244,528,976,521,792,915,27,37,39,18,12,8,332,644,949,428,808,911,30,27,32,19,15,16,365,609,788,514,804,981,26,14,31,14,18,17,299,287,1166,824,1075,1052,10,21,25,13,5,0,340,366,1012,687,995,846,11,26,11,17,11,6,284,406,1251,620,766,900,29,15,12,16,11,1,332,558,1147,602,834,802,31,11,14,17,14,14,330,516,751,580,836,767,22,30,24,17,8,9,314,496,990,645,1060,921,19,18,21,10,7,2,214,262,1234,916,1287,956,11,0,3,10,7,1,384,712,875,651,664,1035,44,15,31,16,19,9,417,557,1109,472,683,1049,24,31,19,11,14,17,8 +418,462,1010,811,666,825,35,23,21,12,9,12,381,223,727,704,707,902,30,12,22,23,13,10,321,151,836,711,1104,819,17,36,42,3,11,5,261,125,1056,906,899,864,11,20,32,2,1,0,254,106,1022,934,1015,814,2,14,42,3,2,9,264,194,869,904,1146,822,1,32,31,3,9,13,350,274,922,719,786,882,24,12,32,20,9,3,362,384,873,608,802,838,27,20,39,19,12,15,443,257,816,746,798,946,29,27,40,14,11,16,223,205,998,844,1069,865,7,14,2,15,2,1,418,294,844,837,989,735,8,25,28,15,8,5,356,360,1083,796,760,731,26,28,27,14,8,2,392,378,987,834,828,747,28,18,27,17,11,13,436,288,671,786,830,908,19,11,43,19,11,10,314,282,892,689,1054,840,16,35,38,12,10,13,152,422,1100,974,1281,811,8,27,26,12,4,10,452,488,835,887,658,1004,41,26,40,18,16,14,399,251,941,652,677,698,21,20,18,11,13,16,8 +350,360,738,859,641,734,24,25,23,3,8,11,401,305,523,742,682,839,19,10,24,14,14,11,311,215,764,717,1079,728,20,24,36,10,12,6,305,213,778,948,874,765,18,24,26,9,0,1,316,226,742,960,990,693,13,16,36,10,1,8,214,266,597,910,1121,743,12,26,33,12,8,14,382,220,672,749,761,859,13,14,26,11,8,4,310,268,615,656,777,753,16,8,33,18,11,16,529,289,712,800,773,839,38,21,34,11,8,17,173,151,728,816,1044,768,4,8,4,6,1,0,350,232,574,849,964,720,3,13,30,10,11,6,298,254,813,834,735,678,15,34,33,11,9,3,450,308,807,888,803,692,17,22,33,12,14,14,460,196,495,808,805,887,8,13,41,10,12,9,220,184,616,675,1029,753,5,21,40,9,11,14,122,352,830,962,1256,714,3,23,32,3,3,11,526,404,721,937,633,925,30,24,34,11,13,13,343,233,727,698,652,639,16,16,24,14,12,17,8 +356,488,973,748,666,901,37,31,21,12,8,16,297,325,732,651,707,976,32,22,24,17,14,6,309,163,787,598,1104,911,15,22,28,1,12,3,265,189,1015,821,899,1030,13,10,20,2,0,4,154,170,987,827,1015,926,0,2,28,3,1,13,250,316,826,779,1146,840,1,18,31,3,8,5,262,392,885,618,786,932,26,14,18,20,8,1,358,554,840,545,802,912,29,24,25,13,11,11,357,399,761,695,798,1026,27,37,26,8,8,12,297,255,963,785,1069,997,9,22,12,15,1,5,330,380,809,718,989,721,10,25,28,15,11,1,298,416,1048,763,760,833,28,28,29,14,9,4,362,528,956,783,828,745,30,28,29,11,14,9,330,442,632,671,830,898,21,21,33,19,12,14,352,434,851,614,1054,892,18,21,36,12,11,7,226,314,1059,893,1281,895,10,37,28,12,3,6,370,654,868,824,658,1078,43,36,26,18,13,12,409,447,908,613,677,884,23,8,16,11,12,12,8 +139,119,599,632,626,691,2,15,2,1,9,11,336,434,692,609,647,1060,3,28,33,12,7,19,336,418,685,598,962,771,34,22,23,12,5,10,282,486,723,703,801,970,26,26,33,9,17,13,363,511,697,749,887,790,35,28,23,10,18,16,323,439,570,769,1012,770,34,22,10,14,11,8,335,427,805,536,714,1130,9,24,33,9,11,18,387,311,730,429,700,972,6,26,26,16,12,20,442,366,833,567,744,1054,20,15,25,9,17,13,412,296,545,843,971,785,28,28,19,4,18,8,359,317,465,698,877,785,25,25,5,8,12,14,289,167,630,669,664,811,11,14,10,9,8,9,279,189,638,655,706,743,9,12,10,10,7,22,339,367,686,603,754,1038,14,23,18,10,5,15,301,365,625,624,950,814,19,19,15,7,6,8,441,383,681,903,1169,643,25,13,9,1,20,7,389,409,952,692,620,1266,8,14,25,11,20,11,352,328,516,537,599,706,14,30,13,14,15,19,9 +233,301,631,673,600,654,9,21,6,9,12,2,302,338,664,608,631,1019,4,32,25,12,10,12,356,344,699,605,1002,730,27,10,15,12,2,11,522,318,727,744,827,929,33,8,25,15,14,10,463,399,709,780,929,749,28,12,15,16,15,5,397,419,534,776,1036,729,27,6,10,10,8,9,391,417,765,559,704,1089,4,24,25,15,8,13,405,421,704,464,702,931,1,20,18,8,9,9,454,378,817,616,730,1013,15,31,19,15,14,10,388,352,605,794,975,754,23,30,19,8,15,9,331,419,457,707,891,744,20,21,5,2,9,15,373,271,690,698,666,770,16,22,14,1,11,10,425,281,678,704,718,702,12,32,14,14,10,9,341,481,638,626,746,997,9,25,16,16,2,4,341,481,605,625,948,773,14,13,13,9,3,9,497,495,719,910,1175,612,20,31,17,9,17,8,491,533,920,735,590,1225,15,30,17,17,17,2,226,372,564,544,611,675,17,16,9,12,16,10,9 +165,171,601,620,640,709,1,25,13,3,13,8,314,384,632,567,685,1078,4,20,32,12,11,10,388,376,645,546,1042,789,35,20,24,12,1,7,412,434,723,707,821,988,25,16,28,9,13,14,395,461,695,747,933,808,36,16,24,10,14,7,415,447,532,735,1088,788,35,16,21,14,7,9,415,447,751,532,762,1148,10,14,28,9,7,9,415,411,680,419,784,990,7,18,21,14,8,7,516,364,791,545,756,1072,19,23,22,9,13,8,480,342,557,807,1027,801,27,14,16,4,14,9,425,417,417,662,951,803,26,21,16,8,8,9,317,251,642,637,740,829,10,26,17,7,12,8,285,215,638,633,792,761,8,20,19,10,11,7,383,451,596,601,810,1056,15,19,29,10,1,8,377,451,603,592,1034,832,18,19,26,3,2,11,481,469,689,861,1249,661,26,23,14,3,16,10,491,477,874,680,632,1284,7,26,22,11,16,4,312,366,532,479,625,720,15,18,24,10,15,8,9 +158,298,731,669,629,763,30,20,14,4,16,7,279,293,644,626,670,948,25,33,27,7,14,7,293,321,673,567,1067,807,22,15,17,7,4,10,313,329,807,746,862,978,12,17,27,14,8,11,270,302,783,758,978,830,7,19,17,11,9,2,258,310,602,744,1109,754,6,13,22,9,4,8,292,362,761,547,749,966,19,25,27,8,4,14,324,410,708,456,765,882,22,23,20,11,11,10,443,251,767,602,761,988,34,22,19,8,8,11,337,275,715,802,1032,879,2,25,25,5,9,8,296,340,561,673,952,663,3,30,17,9,9,12,218,300,800,696,723,709,21,15,18,8,15,9,280,286,756,690,791,673,23,21,16,7,16,8,328,412,582,606,793,902,14,26,20,9,4,1,284,400,651,613,1017,796,11,16,23,6,3,8,290,390,821,884,1244,753,3,20,15,4,11,7,462,442,878,735,621,1140,36,21,19,10,11,7,289,369,684,544,640,762,14,23,13,13,10,11,9 +206,190,585,660,649,694,3,16,7,5,6,5,321,343,650,591,700,1005,8,27,28,8,8,17,287,451,663,644,1035,766,39,23,30,12,12,10,325,449,717,759,810,889,27,23,42,13,14,11,316,448,689,805,924,787,40,23,30,16,15,10,298,392,548,831,1083,787,39,21,17,14,14,8,314,386,773,604,773,1069,14,21,36,7,12,12,386,282,698,485,799,943,11,25,35,12,9,12,441,297,823,591,759,1023,21,14,36,7,14,13,457,379,527,835,1040,752,31,23,14,6,15,8,352,312,429,756,958,810,30,22,14,12,11,14,202,224,612,671,751,794,12,15,15,13,5,9,308,194,624,679,793,766,10,17,15,6,6,14,320,294,632,667,825,1047,19,22,29,8,12,9,294,294,615,682,1049,827,22,20,24,11,13,6,418,454,667,955,1260,650,30,18,14,5,17,7,418,354,902,732,643,1229,3,13,32,9,17,5,385,251,508,507,602,613,19,25,8,16,14,13,9 +77,215,658,700,623,691,8,17,6,1,17,4,274,334,627,649,642,1014,13,26,25,10,15,10,326,360,700,636,993,765,30,20,19,14,3,11,338,416,766,763,840,966,18,22,25,11,9,10,343,419,736,817,930,784,31,24,19,10,10,3,319,405,561,807,1019,744,30,18,10,16,3,9,319,407,742,588,707,1070,19,20,25,9,3,13,353,381,673,499,687,926,16,24,18,14,10,9,390,308,794,645,755,1020,20,17,17,9,9,10,400,322,620,861,974,801,22,26,19,4,10,9,329,393,470,738,882,725,21,23,5,8,8,15,253,235,705,731,661,751,17,16,18,9,16,10,263,227,709,733,701,699,15,16,18,8,15,7,311,439,607,659,749,978,24,19,18,10,3,2,303,439,620,662,935,786,25,23,15,7,2,9,437,441,748,951,1164,657,21,17,17,1,12,8,383,415,881,760,617,1208,12,16,17,11,12,4,278,410,607,597,640,724,10,26,15,14,11,10,9 +121,365,730,775,677,717,23,19,23,7,17,4,202,220,689,666,720,1002,18,26,22,10,15,10,232,260,706,657,1001,779,13,16,34,10,3,11,330,208,848,862,764,836,23,12,24,11,9,10,263,241,814,882,858,768,28,12,34,10,10,5,225,281,643,840,1055,812,29,12,31,12,3,9,229,281,826,665,807,1060,26,18,24,9,3,13,275,357,759,572,835,946,23,24,31,10,10,11,360,242,816,722,755,1026,5,27,32,7,9,12,320,244,686,808,1034,761,37,24,6,6,10,9,267,359,542,777,950,835,38,25,28,10,8,15,257,297,771,778,787,811,32,28,33,9,16,10,271,309,753,810,801,791,28,30,35,8,15,9,225,397,647,728,849,1066,31,19,39,8,3,6,223,395,708,663,1069,850,36,19,38,1,2,9,351,449,812,944,1184,673,38,27,34,7,12,8,403,463,925,853,667,1156,29,26,32,9,12,4,236,356,647,626,608,598,25,22,22,8,11,12,9 +131,121,620,663,604,683,2,13,1,2,10,2,298,334,693,618,649,1024,7,26,32,13,8,16,324,444,686,643,1004,763,34,22,22,13,6,11,356,472,736,742,785,906,22,24,32,8,18,10,341,489,714,798,899,784,35,24,22,11,19,9,347,413,581,826,1050,764,34,20,9,13,12,9,343,441,820,599,722,1090,13,22,32,10,12,15,381,357,747,486,746,952,10,24,25,17,13,11,426,288,850,596,722,1030,16,15,24,10,18,10,440,356,574,872,997,759,30,24,18,5,19,9,381,335,478,751,915,785,29,25,4,9,13,15,289,189,659,690,698,793,11,14,11,8,9,10,297,187,651,684,748,741,9,14,11,11,8,13,311,379,663,654,774,1036,18,19,17,9,6,8,307,385,638,697,998,812,21,21,14,6,7,9,449,411,702,964,1215,635,29,15,10,2,21,8,431,409,935,723,600,1252,8,14,24,10,21,2,324,364,545,542,577,622,18,28,12,13,14,10,9 +150,204,654,654,585,652,17,14,5,3,14,2,215,291,619,601,626,975,12,29,26,10,12,12,235,359,638,620,1023,726,19,19,18,14,0,13,371,375,744,715,818,927,23,23,30,11,12,8,292,346,724,765,934,745,20,23,18,10,13,5,230,288,539,771,1065,705,19,17,5,16,6,11,240,328,742,542,705,1025,12,23,26,7,6,11,284,314,681,463,721,887,9,25,23,14,9,9,373,247,788,601,717,981,21,16,24,7,12,10,347,311,628,829,988,768,15,27,12,6,13,11,272,258,474,712,908,684,16,22,2,10,7,17,278,202,713,683,679,706,18,19,13,9,13,12,318,160,695,689,747,660,22,19,15,8,12,9,218,334,579,607,749,933,17,22,17,8,0,4,212,332,604,644,973,747,20,16,12,7,1,9,382,390,740,929,1200,622,16,14,16,1,15,10,414,378,863,712,577,1169,23,17,20,9,15,4,227,359,607,519,598,697,7,27,8,14,14,10,9 +171,367,684,726,560,625,25,17,15,12,8,4,210,160,585,671,551,834,20,32,16,9,6,10,228,300,672,572,874,669,19,18,6,9,6,11,410,202,744,751,721,882,17,18,18,12,12,10,335,207,724,759,809,692,12,16,6,13,11,3,227,271,543,701,908,616,11,16,7,7,6,9,235,311,702,552,574,878,14,28,16,12,6,13,263,309,649,541,574,754,17,30,11,5,5,9,362,176,762,691,698,864,37,27,12,12,12,10,324,320,670,779,847,755,3,20,22,11,9,9,199,349,516,646,761,543,2,29,12,5,3,15,265,339,755,761,538,587,16,18,11,4,7,10,363,263,737,779,594,537,18,24,9,11,6,7,221,287,517,591,618,792,9,29,5,13,6,2,213,287,588,572,818,658,6,15,2,6,7,9,409,473,768,863,1047,615,2,27,26,12,11,8,411,389,817,784,560,1018,31,26,8,14,11,4,240,270,661,619,621,696,15,22,18,9,10,10,9 +168,126,605,622,613,695,0,20,4,2,10,5,213,393,666,577,654,1036,5,15,35,11,8,15,271,433,663,580,1011,773,36,25,25,15,4,8,379,483,715,701,792,918,24,27,35,10,16,13,350,488,691,745,906,792,37,27,25,11,17,8,310,374,542,757,1057,778,36,21,12,15,10,8,298,400,769,530,733,1102,11,21,35,8,10,12,318,338,704,413,757,962,8,19,28,15,11,10,431,315,813,555,729,1042,18,16,27,8,16,9,445,327,561,811,996,771,28,17,21,5,17,8,340,316,437,684,920,797,27,18,7,9,11,12,306,188,646,651,713,807,9,19,8,10,9,7,240,192,646,643,761,755,7,15,10,9,8,12,282,424,650,599,781,1046,16,14,20,9,4,9,300,424,605,624,1005,822,19,24,17,8,5,10,456,374,687,895,1218,647,27,16,7,2,19,9,422,418,920,686,605,1232,6,17,27,10,19,1,315,423,536,503,606,656,16,27,15,15,16,9,9 +145,199,536,735,653,655,3,15,19,6,10,5,318,380,627,658,658,1024,8,36,12,9,8,17,318,386,660,599,923,735,39,8,2,15,4,8,344,388,650,776,834,934,27,12,12,12,16,13,363,417,626,800,920,754,40,18,2,11,17,12,329,427,483,754,937,734,39,6,11,13,10,6,345,359,724,573,665,1094,14,28,12,10,10,14,395,301,657,540,599,936,11,22,5,11,11,14,480,342,804,692,801,1018,21,27,4,10,16,13,416,314,494,810,924,759,31,30,34,5,17,6,341,397,410,701,822,749,30,21,16,7,11,12,257,217,579,764,591,775,12,20,15,6,9,7,297,217,599,780,639,707,10,26,13,9,8,16,327,351,629,630,717,1002,19,29,3,11,4,11,295,363,546,581,845,778,22,11,6,4,5,6,439,493,622,876,1084,617,30,25,30,6,19,5,451,385,899,795,657,1230,3,28,4,12,19,5,352,298,487,642,702,680,19,18,18,9,16,13,9 +155,181,595,606,604,655,10,14,3,12,7,8,326,362,668,569,645,1020,11,39,30,13,5,18,336,316,619,558,988,735,26,9,20,9,7,9,398,364,705,677,771,930,26,17,30,12,11,12,369,399,681,717,887,754,31,23,20,13,12,15,337,371,536,727,1034,736,32,7,11,7,9,7,337,347,771,502,724,1090,17,31,30,18,7,17,389,363,708,407,748,932,14,19,23,9,6,17,494,360,791,533,712,1014,12,26,22,12,11,12,382,276,553,777,979,743,34,29,20,11,12,7,331,287,449,658,903,753,33,20,6,5,6,13,259,139,638,639,704,771,19,15,13,4,6,8,343,243,616,621,748,711,17,27,13,11,5,19,339,347,614,569,772,1004,22,28,19,17,7,14,311,347,595,598,996,780,25,6,16,10,8,7,413,381,679,879,1195,607,33,20,12,12,14,6,497,485,894,656,596,1226,16,27,22,14,14,8,294,298,516,485,587,664,22,17,12,9,15,16,9 +109,233,597,678,581,657,0,15,10,8,5,3,294,416,706,629,626,964,5,36,21,11,9,15,320,368,673,696,975,725,36,14,29,11,15,10,374,346,711,757,766,852,24,16,37,16,11,13,349,371,691,815,882,744,37,18,29,15,12,8,327,401,558,855,1019,748,36,12,16,11,15,8,329,357,799,616,705,1028,11,30,35,14,17,12,371,345,736,537,733,900,8,24,34,7,10,10,458,396,863,615,689,980,18,21,35,14,15,11,380,306,549,897,966,711,28,24,7,5,12,8,299,343,489,796,882,771,27,29,13,7,14,14,223,189,634,701,685,755,9,12,18,8,4,9,303,273,640,703,717,727,7,22,22,13,7,12,313,313,706,671,755,1010,16,31,28,15,15,9,293,313,613,730,977,790,19,11,23,14,14,8,429,455,675,1003,1184,615,27,21,21,8,14,7,481,457,978,742,577,1190,6,22,31,16,14,3,314,246,524,539,554,588,16,24,13,11,13,11,9 +196,192,597,689,626,695,2,13,22,6,13,6,209,337,594,614,637,1004,7,24,9,11,11,14,181,331,641,553,930,763,34,18,1,13,1,9,299,367,703,736,809,964,24,24,9,10,13,12,300,398,675,754,907,782,35,24,1,9,14,7,210,308,502,708,952,734,34,16,14,15,7,7,208,262,711,533,660,1054,9,26,9,8,7,15,286,252,642,496,612,916,10,26,2,13,8,13,385,261,763,648,768,1010,20,17,1,8,13,14,381,257,569,762,927,811,26,16,35,9,14,7,304,296,415,651,831,713,25,21,19,13,8,13,246,170,654,718,598,735,7,18,18,12,12,8,222,186,654,736,634,689,5,16,16,9,11,11,224,336,568,586,710,962,14,19,6,7,1,6,210,340,567,545,860,776,17,21,9,2,2,5,402,396,689,838,1095,665,25,13,33,4,16,6,392,314,848,753,628,1198,8,18,1,6,16,6,331,339,556,596,673,736,18,26,19,9,15,14,9 +122,152,577,629,622,678,1,16,7,3,12,3,305,367,602,582,645,1001,4,29,28,14,10,15,357,393,639,557,1012,752,35,21,18,10,2,10,395,453,673,700,839,955,25,23,28,11,14,11,360,480,657,720,941,771,36,23,18,12,15,8,374,434,480,730,1054,731,35,19,15,12,8,8,374,430,711,513,706,1063,10,21,28,11,8,14,392,374,644,414,710,913,7,23,21,16,9,10,427,321,781,564,762,1007,19,14,20,11,14,9,445,327,537,802,981,788,27,23,24,6,15,8,372,372,383,659,897,718,26,22,10,6,9,14,272,196,622,658,668,744,10,15,9,7,11,9,318,196,628,652,736,686,8,19,7,12,10,12,342,420,564,572,752,971,15,22,13,12,2,7,336,418,551,587,962,773,18,18,14,5,3,10,450,446,649,868,1189,644,26,18,14,3,17,9,438,432,854,685,618,1199,7,15,20,13,17,1,283,383,536,514,645,711,15,25,8,12,16,9,9 +184,172,567,659,620,673,1,15,9,5,12,5,197,365,636,594,649,1042,6,18,28,12,8,15,239,443,641,573,1024,753,37,26,28,12,10,8,277,483,683,740,819,952,25,28,24,9,6,13,232,484,655,780,927,772,38,28,28,8,7,8,212,372,504,764,1068,752,37,22,17,14,14,6,194,360,737,567,732,1112,12,26,24,9,10,12,264,226,672,482,748,954,9,24,25,16,11,12,359,285,791,594,744,1036,19,15,26,9,6,13,373,351,523,786,999,765,29,18,12,8,19,6,290,274,407,703,921,767,28,23,12,12,13,12,232,194,608,680,704,793,10,16,19,13,13,7,210,158,616,682,762,725,8,12,19,10,10,12,250,296,616,630,774,1020,17,19,27,8,10,7,296,296,573,613,998,796,20,29,22,11,9,6,364,374,651,876,1217,625,28,11,18,5,17,5,368,276,890,725,610,1248,5,16,26,7,9,5,307,363,510,528,625,684,17,28,20,16,14,13,9 +119,125,607,661,562,648,2,11,3,2,11,9,292,378,674,618,589,995,3,30,28,11,9,19,316,374,691,627,964,728,34,18,18,13,3,12,372,418,713,714,783,927,26,20,28,12,15,9,369,439,691,758,887,747,35,20,18,13,16,16,313,409,542,782,1000,717,34,16,5,15,9,10,313,371,781,541,660,1059,9,24,28,12,9,14,351,295,712,478,658,907,6,28,21,15,10,18,410,340,849,606,702,995,20,17,20,12,15,11,404,296,569,860,937,754,26,26,16,3,16,10,303,315,451,719,851,714,25,25,0,9,10,16,251,169,654,700,624,740,11,18,15,10,10,11,311,179,668,694,682,684,9,18,15,11,9,20,309,319,656,602,702,967,14,23,13,13,3,15,291,311,601,637,910,757,17,17,10,8,4,8,463,415,691,924,1137,610,25,17,14,4,18,9,421,383,934,719,556,1197,8,18,20,14,18,9,294,296,554,572,587,677,14,28,14,15,17,17,9 +199,127,627,645,627,718,7,15,2,6,7,5,206,388,618,592,658,1065,12,18,33,11,5,11,286,414,685,615,1035,796,37,28,23,15,11,8,270,490,733,722,854,997,25,26,33,10,5,13,257,493,701,778,958,815,38,28,23,11,6,4,263,397,526,798,1069,785,37,24,10,15,11,6,251,379,735,567,729,1125,18,26,33,8,11,12,267,269,666,456,727,977,15,26,26,15,4,10,384,306,797,584,763,1065,25,17,27,8,5,11,392,304,593,844,1008,820,29,20,19,7,14,6,311,291,441,725,922,782,28,25,5,13,8,12,311,173,678,670,695,806,10,16,10,14,8,7,205,163,684,672,751,750,14,12,12,9,5,8,285,345,594,630,771,1033,19,19,20,7,11,3,327,345,589,665,977,827,20,29,15,12,12,8,363,359,721,932,1208,678,28,11,9,6,12,7,373,319,868,711,621,1265,5,16,25,8,8,3,308,376,582,524,644,741,17,30,13,15,13,11,9 +154,134,658,615,619,670,3,16,4,2,7,9,301,367,709,580,664,1027,2,31,35,13,9,19,275,435,722,623,1021,750,33,19,25,13,11,10,323,497,770,700,800,937,27,25,35,8,15,11,338,496,752,744,914,771,34,25,25,9,16,16,258,394,603,792,1067,751,33,19,12,13,13,8,284,408,832,553,743,1097,8,23,35,10,11,16,340,274,757,464,767,945,5,23,28,17,10,18,437,315,866,544,735,1025,21,16,27,10,15,13,395,335,608,846,1006,754,25,27,21,5,16,8,310,258,492,723,930,772,24,24,7,9,10,14,220,178,693,646,723,784,12,17,8,8,6,9,290,162,693,632,771,728,10,13,10,11,7,20,304,318,689,608,791,1023,13,24,20,9,11,13,256,316,662,683,1015,799,16,16,17,6,12,6,416,346,732,952,1228,622,24,14,7,2,18,7,430,354,959,679,611,1243,9,17,27,10,18,9,345,329,585,494,604,669,13,29,15,13,13,17,9 +167,167,607,697,629,638,4,13,14,3,2,11,222,370,698,644,646,1007,5,22,17,10,4,19,204,402,691,603,967,718,32,28,7,14,14,10,326,470,709,768,826,917,24,30,17,11,12,13,293,467,697,792,902,737,33,30,7,10,13,16,223,361,562,780,1011,717,32,26,6,16,14,8,211,349,805,571,695,1077,11,22,17,7,14,18,301,235,740,488,693,919,8,26,10,14,7,20,340,308,859,640,757,1001,22,9,11,7,10,13,398,280,563,854,954,730,24,20,23,6,7,8,243,263,479,711,866,734,23,23,11,10,9,14,207,165,648,724,645,758,9,12,14,9,3,9,275,163,650,728,705,692,9,14,14,8,4,22,233,275,698,636,743,985,14,23,4,8,14,13,257,275,617,633,945,761,15,25,7,7,15,6,427,307,679,910,1162,590,23,15,25,1,9,7,343,311,962,765,625,1213,10,8,9,9,9,11,304,346,544,578,632,649,12,28,13,14,16,19,9 +114,94,552,659,614,646,0,20,7,2,9,5,263,365,619,618,645,1015,5,29,24,11,7,19,317,411,618,599,1022,726,36,17,18,13,5,10,405,463,662,724,839,925,24,25,24,10,11,11,336,498,640,774,947,745,37,25,18,11,12,12,318,418,497,768,1058,725,36,15,11,15,9,8,318,400,732,553,716,1085,11,21,24,10,5,16,338,296,669,456,714,927,8,19,17,15,6,14,423,301,772,598,750,1009,18,18,18,10,11,9,417,313,510,792,995,738,28,27,20,3,12,8,322,324,402,699,909,740,27,24,6,7,6,14,262,158,595,686,680,766,9,17,19,6,8,9,306,164,589,686,740,698,7,17,19,9,7,16,304,372,607,622,760,993,16,22,21,11,5,11,292,374,556,627,966,769,19,14,16,4,6,10,430,408,636,914,1195,598,27,16,18,2,14,9,446,360,873,717,608,1221,6,19,16,12,14,5,275,373,487,532,631,657,16,25,10,11,15,13,9 +152,162,623,693,583,685,4,15,9,1,10,3,317,353,640,638,618,974,9,28,22,10,8,11,321,349,647,699,1015,755,32,20,28,14,4,12,359,407,725,766,810,880,20,20,32,11,16,9,320,446,705,820,926,778,33,20,28,12,17,4,334,408,540,848,1057,766,32,18,15,16,10,10,336,402,773,611,697,1038,15,20,32,9,10,12,384,350,698,540,713,910,12,26,31,14,11,10,455,309,805,638,721,996,16,17,30,9,16,11,411,291,585,886,980,765,24,26,8,4,17,10,362,374,447,791,900,763,23,25,10,8,11,16,238,212,670,718,671,755,13,18,19,9,9,11,316,216,654,726,739,731,11,18,21,8,8,8,326,372,620,668,741,1008,20,21,23,10,4,3,300,374,603,729,965,800,23,19,20,7,5,8,396,426,703,1004,1192,657,23,17,20,1,19,9,476,394,894,757,577,1188,10,16,30,11,19,3,343,355,562,568,604,632,12,26,18,14,16,11,9 +110,338,737,668,621,682,25,21,2,2,16,6,263,309,650,623,642,951,20,24,29,13,14,8,343,317,709,630,999,742,25,22,19,11,2,11,405,305,815,731,840,941,13,16,29,10,10,10,354,356,799,771,936,759,12,12,19,11,11,1,340,388,608,787,1025,701,11,18,6,13,4,9,340,404,777,552,705,981,22,16,29,10,4,13,358,468,720,475,685,867,19,22,22,15,9,7,391,305,823,613,765,969,31,27,21,10,10,8,381,313,717,851,980,800,5,22,15,5,11,9,344,402,563,724,888,644,6,25,1,7,7,13,296,298,802,701,661,662,16,28,14,6,15,10,312,324,770,701,707,632,20,26,14,11,14,5,332,464,598,617,747,889,17,17,14,11,2,4,324,464,673,652,933,747,14,25,11,4,1,11,430,464,819,935,1168,654,6,27,13,2,13,10,428,502,892,730,619,1133,31,26,21,12,13,6,229,393,694,571,652,729,9,20,13,11,12,8,9 +150,332,690,785,628,717,12,22,24,8,14,5,249,301,745,664,667,986,9,25,25,9,12,9,221,255,686,673,958,767,24,19,35,9,0,10,337,227,818,870,731,830,34,19,25,12,12,9,310,246,790,882,839,760,39,11,35,11,13,12,212,282,643,856,1006,820,36,17,34,11,6,12,242,266,870,669,758,1046,17,17,25,10,6,12,294,318,795,582,786,930,14,23,32,9,7,12,403,311,850,728,694,1010,12,26,33,8,12,13,335,223,634,804,975,747,36,21,5,7,13,8,256,320,524,787,891,845,33,22,31,9,9,14,204,216,719,776,738,803,21,25,34,8,13,9,282,284,701,816,742,801,19,23,34,7,12,12,260,272,703,728,794,1056,22,18,40,9,0,13,192,280,714,665,1010,846,27,20,41,2,1,12,368,428,772,950,1183,669,33,26,33,8,15,9,444,450,981,861,612,1154,18,25,33,10,15,5,319,225,591,632,549,584,20,19,23,9,14,13,9 +114,342,714,706,677,715,28,19,18,5,14,10,285,301,637,637,690,934,23,24,27,12,12,4,327,285,678,578,1025,767,24,20,17,12,6,9,277,303,792,785,888,968,14,18,19,9,6,12,248,316,770,801,978,782,9,18,17,8,7,3,274,316,585,759,1043,706,8,16,26,14,6,7,280,356,754,586,743,948,17,16,19,9,6,11,330,424,699,497,705,854,20,22,14,12,13,9,405,271,776,649,821,964,36,19,15,9,6,10,363,241,696,839,1014,847,0,26,23,6,7,7,314,358,542,694,918,615,1,23,21,10,11,9,224,312,781,723,687,675,19,20,20,9,13,8,278,326,749,737,725,619,21,20,18,10,14,7,322,426,567,645,787,854,12,17,22,8,6,4,308,416,642,600,951,750,9,23,25,1,5,9,346,386,802,879,1190,699,1,21,23,5,9,8,410,492,865,774,675,1106,34,20,15,9,9,10,299,379,669,579,706,782,14,22,17,8,12,10,9 +129,159,609,687,617,626,6,12,2,4,3,10,316,334,630,632,638,991,9,27,29,7,7,20,316,438,649,657,995,706,30,23,21,13,13,11,312,442,727,756,836,901,20,23,33,14,11,12,299,451,709,800,932,727,31,23,21,13,12,17,287,367,570,822,1025,707,30,21,8,15,13,9,311,387,773,585,701,1061,15,25,29,10,13,17,361,283,704,494,683,903,12,29,26,11,6,19,396,308,839,620,757,985,14,14,27,10,13,12,358,356,553,856,976,714,28,21,15,3,10,9,319,269,449,753,884,728,29,26,5,7,8,15,229,171,638,704,657,742,15,15,14,8,2,10,321,161,624,708,707,684,13,15,14,9,5,21,323,297,624,650,743,979,20,26,20,11,13,16,277,305,637,697,933,755,23,20,15,6,14,9,385,401,681,974,1164,578,29,14,13,4,12,8,389,405,886,747,613,1199,12,13,23,12,12,10,296,258,526,542,642,633,16,29,9,13,15,18,9 +141,177,722,635,627,626,17,12,0,3,8,8,216,348,745,608,660,995,12,31,31,12,10,18,232,340,748,639,939,706,19,19,21,12,8,9,348,380,826,712,734,905,29,21,31,9,14,12,287,381,810,774,826,725,28,21,21,10,15,15,249,305,669,808,995,705,27,17,8,14,12,7,253,349,884,567,749,1065,16,23,31,9,8,17,295,345,813,480,745,907,13,27,24,16,11,17,356,310,868,568,717,989,7,18,25,9,18,10,370,266,684,846,972,724,35,25,17,6,15,7,291,225,562,741,882,722,32,24,3,10,11,13,283,149,769,666,707,746,26,17,12,9,7,8,283,207,745,656,725,678,18,17,12,10,10,19,229,285,711,626,779,975,21,24,18,8,8,14,223,273,724,697,985,751,26,16,13,5,9,9,413,319,802,968,1146,582,32,16,11,1,17,8,377,467,985,695,621,1201,23,17,23,9,17,8,268,294,641,506,570,645,23,27,11,12,12,16,9 +130,140,569,701,650,673,2,16,7,1,12,3,299,421,660,626,669,1042,7,27,24,12,10,17,319,389,669,615,988,753,38,19,14,12,2,10,343,447,683,760,853,952,26,19,24,11,14,11,350,502,659,790,947,772,39,21,14,12,15,10,342,458,518,778,1006,752,38,15,11,14,8,8,350,410,761,563,716,1112,13,23,24,11,8,14,394,350,692,500,678,954,10,25,17,16,9,12,465,359,837,652,782,1036,20,22,16,11,14,11,429,299,527,824,979,777,30,19,24,4,15,8,358,376,435,717,885,767,29,20,6,6,9,14,268,188,612,726,652,793,11,21,17,7,11,9,272,224,630,740,690,725,9,19,9,10,10,14,314,430,648,632,764,1020,18,20,11,12,2,9,308,426,577,615,924,796,21,22,14,5,3,8,442,424,655,900,1159,635,29,18,18,3,17,7,432,404,922,769,646,1248,4,21,16,13,17,3,355,391,520,592,673,698,18,25,14,12,16,11,9 +194,146,561,659,640,675,0,17,13,6,12,8,211,367,632,604,661,1044,5,24,18,11,10,18,199,399,639,557,996,755,36,18,14,13,2,9,327,455,681,726,845,954,24,26,18,10,14,12,302,468,657,760,931,774,37,26,14,9,15,15,244,364,520,730,1026,754,36,18,13,15,8,7,234,356,751,537,724,1114,11,24,18,8,8,17,300,242,676,446,704,956,8,22,11,15,9,17,407,289,805,598,768,1038,18,17,12,8,14,12,407,295,511,776,987,767,28,18,24,9,15,7,312,284,409,663,899,769,27,21,10,13,11,13,246,152,596,690,674,795,9,18,23,12,11,8,216,162,606,686,720,727,7,14,15,9,10,19,232,318,616,606,770,1022,16,17,19,7,2,14,238,320,579,581,954,798,19,21,18,6,3,7,406,356,645,864,1181,627,27,13,24,4,17,6,406,316,886,723,634,1250,6,18,12,6,17,8,343,361,498,550,653,686,16,26,14,13,16,16,9 +150,110,604,658,610,667,0,19,3,7,12,2,249,385,659,637,631,986,5,28,34,12,10,16,311,459,680,628,986,745,36,18,24,12,2,11,401,511,706,731,827,938,24,24,34,9,14,10,344,530,692,783,923,768,37,24,24,8,15,9,344,428,529,797,1024,728,36,18,11,14,8,9,336,462,766,568,694,1050,11,20,34,9,8,13,348,328,697,467,682,898,8,20,27,16,9,11,419,333,834,587,748,990,18,19,26,11,14,8,483,357,562,859,967,773,28,24,20,8,15,9,382,324,438,728,875,709,27,21,6,14,9,15,284,196,647,691,648,725,9,18,9,15,11,10,276,170,659,675,706,685,7,16,9,10,10,13,302,396,633,633,736,960,16,21,19,8,2,8,316,400,594,666,934,766,19,19,16,13,3,11,482,376,678,945,1159,639,27,17,8,7,17,10,436,418,919,714,604,1186,6,18,26,9,17,2,329,373,555,541,631,696,16,26,14,16,16,10,9 +137,143,603,709,626,669,2,12,8,3,11,5,260,374,656,652,643,1038,7,29,23,14,9,19,304,364,677,613,954,749,38,15,13,10,3,12,372,410,719,756,799,948,26,17,23,7,15,11,363,451,697,782,877,768,39,19,13,8,16,12,333,417,554,764,992,748,38,13,0,12,9,10,333,395,771,553,694,1108,13,23,23,11,9,16,363,343,694,512,690,950,10,27,16,16,10,14,404,328,829,664,748,1032,20,22,15,11,15,9,450,324,555,828,955,761,30,23,19,6,16,10,375,375,439,707,867,763,29,18,5,10,10,16,317,207,640,742,652,789,11,21,10,9,10,11,283,191,650,752,698,721,9,21,12,12,9,16,299,389,650,616,740,1016,18,22,8,10,3,11,297,391,623,631,940,792,21,18,5,5,4,10,489,463,683,918,1161,621,29,20,19,3,18,9,407,387,916,771,622,1244,4,21,15,9,18,5,320,332,544,610,617,682,18,23,17,12,17,13,9 +172,276,683,724,602,624,14,14,15,2,7,6,259,227,632,663,607,887,9,33,16,13,5,12,241,303,719,610,904,680,22,17,6,11,7,13,359,265,751,777,787,885,28,17,16,10,9,8,326,276,735,803,869,699,23,17,6,11,10,5,210,274,544,769,934,639,22,15,7,13,7,11,252,266,739,576,638,941,3,27,16,10,7,11,304,288,680,525,600,801,6,27,9,15,4,13,409,213,809,677,740,905,24,20,8,12,9,14,317,285,669,827,893,756,14,23,26,5,10,11,246,338,515,710,797,598,13,28,12,7,4,17,228,250,754,755,572,622,11,17,11,6,6,12,350,188,742,765,612,578,7,23,9,11,5,11,264,310,586,639,682,849,2,28,1,11,7,4,194,310,603,622,848,679,5,14,2,4,8,9,370,452,767,909,1075,608,13,20,26,2,12,10,450,386,880,788,600,1081,20,19,8,12,12,6,295,301,650,629,637,691,22,25,18,11,11,14,9 +187,165,634,636,650,716,9,16,6,5,16,4,168,372,589,581,669,1035,14,19,25,12,14,14,230,354,664,550,1004,786,31,23,15,12,2,9,298,406,736,701,857,985,15,27,25,9,10,12,275,451,706,729,957,805,28,27,15,8,11,7,239,333,529,723,1030,765,27,19,8,14,4,7,211,329,706,504,716,1091,20,23,25,9,4,15,279,287,637,423,690,949,17,23,18,16,9,11,368,298,762,575,792,1041,23,14,17,9,10,12,416,252,602,781,987,822,19,19,23,8,11,7,295,295,450,656,895,746,18,22,3,12,7,13,261,165,687,665,662,772,16,15,16,11,15,8,187,191,691,663,712,716,16,13,12,10,14,11,225,379,559,573,764,999,25,16,10,8,2,6,291,377,584,568,938,811,22,26,11,7,1,7,419,347,726,849,1173,678,18,14,17,3,13,6,359,357,837,698,648,1229,15,15,17,7,13,4,328,386,589,527,681,745,7,29,15,14,12,12,9 +172,130,628,701,673,682,6,16,6,4,9,4,283,319,649,606,724,995,11,23,29,11,7,16,287,393,678,667,1041,756,34,23,29,13,5,9,333,417,754,796,810,861,22,23,41,10,17,12,272,444,724,842,922,777,35,19,29,9,18,9,306,384,573,848,1091,775,34,21,16,15,11,7,308,384,778,627,799,1057,17,19,35,8,11,11,366,326,709,512,827,933,14,21,34,15,12,11,429,283,820,638,775,1013,16,18,35,8,17,12,407,327,574,820,1056,742,26,25,15,7,18,7,366,316,454,777,974,798,27,22,13,11,12,13,258,176,659,702,779,784,15,19,14,10,8,8,302,156,659,726,813,754,13,19,14,9,7,13,284,348,625,698,851,1037,22,16,28,7,5,8,280,344,642,701,1075,815,25,24,23,6,6,7,376,406,710,976,1262,638,27,18,13,2,20,6,456,390,897,775,669,1207,8,17,31,8,20,4,331,329,553,544,620,589,14,25,9,13,15,12,9 +202,158,569,683,617,701,0,20,19,6,13,5,213,359,618,604,646,1070,5,23,16,11,11,19,167,371,643,591,995,781,36,17,8,13,1,10,325,413,689,740,832,980,24,25,12,10,13,11,328,432,667,770,940,800,37,25,8,9,14,12,196,330,516,750,1021,780,36,17,17,15,7,8,224,314,741,541,701,1140,11,23,12,8,7,14,268,246,666,486,681,982,8,19,5,15,8,14,411,285,787,638,755,1064,18,20,6,8,13,13,357,273,519,790,976,793,28,17,32,9,14,8,282,250,397,693,888,795,27,18,16,13,8,14,250,146,604,706,651,821,9,21,23,12,12,9,254,166,608,726,703,753,7,17,13,9,11,16,232,314,604,608,749,1048,16,18,13,7,1,11,178,314,587,589,929,824,19,20,16,6,2,6,396,346,649,880,1164,653,27,14,30,4,16,7,408,342,872,749,613,1276,6,21,6,6,16,5,345,345,500,576,644,712,16,23,18,13,15,13,9 +149,141,597,629,626,658,3,14,3,4,15,5,210,424,642,584,645,1027,2,23,28,13,13,19,222,368,657,571,980,738,33,25,20,11,1,10,332,442,711,712,825,937,27,29,30,8,11,11,277,491,687,742,913,757,34,29,20,7,12,12,229,383,548,742,1024,737,33,23,11,13,5,8,229,369,759,527,710,1097,8,23,28,10,5,16,277,279,684,420,704,939,5,23,23,17,8,14,332,354,785,566,750,1021,21,10,24,10,11,9,390,250,553,780,969,750,27,25,20,7,12,8,277,251,431,673,881,752,24,24,8,11,6,14,253,117,638,652,662,778,12,13,15,10,14,9,267,191,644,654,718,710,10,13,15,11,13,16,227,333,632,590,754,1005,13,16,23,9,1,11,237,337,607,607,954,781,18,22,18,8,0,10,421,287,681,884,1173,610,24,14,14,2,14,9,335,375,900,697,616,1233,9,11,20,8,14,5,274,372,524,498,631,669,13,29,10,15,13,13,9 +208,132,630,582,641,716,10,15,6,4,9,5,323,365,591,553,682,1013,13,28,37,7,7,17,291,415,620,552,1079,784,26,22,27,9,7,12,291,475,730,663,874,985,16,26,37,14,9,9,286,460,704,717,990,803,27,26,27,13,10,10,248,356,527,725,1121,753,26,20,14,11,5,10,276,376,724,502,761,1053,19,26,37,6,5,12,342,292,657,399,777,927,16,24,30,11,4,12,419,289,764,507,773,1025,18,13,29,6,11,13,389,303,598,785,1044,832,18,20,23,7,6,10,300,238,444,654,964,714,19,23,9,11,0,16,184,166,683,613,735,734,19,10,10,10,8,11,302,154,663,595,803,696,17,14,12,5,7,14,350,332,559,571,805,961,24,27,22,7,7,9,272,332,596,614,1029,797,27,19,19,8,6,8,354,326,718,881,1256,686,19,15,5,4,8,9,414,358,837,642,633,1201,16,14,29,8,8,5,361,385,573,465,652,757,6,28,17,15,9,13,9 +146,196,576,709,628,648,1,13,16,5,10,7,237,329,651,674,633,1017,4,28,15,8,8,17,299,395,652,581,922,728,35,20,5,16,4,14,383,419,682,766,809,927,25,22,15,13,16,9,370,428,666,788,895,747,36,22,5,12,17,14,340,402,535,752,960,727,35,18,8,14,10,12,318,376,776,565,642,1087,10,22,15,9,10,14,334,286,697,502,616,929,7,26,8,12,11,16,353,299,828,654,776,1011,19,15,7,9,16,9,481,293,532,834,907,740,27,28,31,4,17,12,346,368,438,689,811,742,26,23,13,8,11,18,294,210,617,742,588,768,10,16,12,7,9,13,276,172,613,742,650,700,8,16,10,8,8,18,286,314,655,624,692,995,15,21,0,10,4,13,324,320,590,591,868,771,18,19,3,3,5,12,514,464,650,876,1095,600,26,15,27,5,19,11,354,396,917,769,632,1223,7,16,7,11,19,7,289,295,519,616,675,659,15,28,17,10,16,15,9 +152,442,671,841,651,677,18,22,24,8,16,6,153,153,606,730,636,916,13,31,11,13,12,8,227,221,691,641,833,729,18,9,3,9,6,9,349,105,747,864,794,930,24,7,7,6,6,12,268,176,729,858,882,744,19,13,3,7,7,3,190,296,540,772,831,670,18,5,16,11,8,7,164,246,723,669,611,956,7,23,7,12,6,15,200,292,668,662,515,830,10,17,0,9,13,9,295,193,779,814,785,934,32,30,1,8,6,10,347,295,655,814,858,809,10,29,37,9,9,7,198,420,501,733,754,615,9,18,21,11,13,13,262,362,740,870,531,645,9,23,20,10,17,8,270,330,724,902,611,605,11,35,18,11,14,7,224,308,558,696,675,864,2,24,8,11,6,2,264,328,599,539,739,712,1,12,11,4,5,9,404,534,757,850,984,661,9,30,35,8,15,8,336,410,850,905,649,1102,24,29,1,10,9,6,247,273,646,754,722,744,22,15,23,5,14,10,9 +187,185,563,692,649,683,1,18,23,6,14,6,216,360,606,619,666,1030,6,23,10,9,12,18,190,334,635,556,967,761,37,19,2,15,0,9,280,364,673,747,846,962,25,21,8,12,12,12,297,401,649,773,944,780,38,21,2,11,13,11,225,333,482,729,983,750,37,15,15,17,6,7,219,285,717,548,697,1090,12,21,8,6,6,15,309,243,648,493,643,942,9,21,1,13,7,13,378,294,775,645,793,1030,19,20,0,6,12,14,402,248,519,783,964,793,29,17,38,9,13,7,309,307,377,666,868,747,28,18,20,13,11,13,227,173,604,719,625,771,10,21,19,12,13,8,203,203,612,733,665,715,8,19,17,7,12,15,227,319,588,611,747,998,17,16,7,5,0,10,239,321,551,544,891,792,20,22,10,6,1,5,423,395,645,839,1128,649,28,16,34,4,15,6,365,327,864,756,649,1230,5,21,0,6,15,6,358,330,510,589,684,716,17,23,22,13,16,14,9 +186,182,598,653,630,673,4,17,2,4,10,5,223,403,655,594,663,1028,1,24,29,11,8,17,245,321,662,613,1006,751,32,18,19,13,4,8,395,377,708,726,807,934,28,18,31,10,16,13,354,422,686,772,909,770,33,18,19,9,17,10,286,372,543,772,1052,754,32,14,6,15,10,6,278,358,778,545,738,1096,7,18,29,8,10,12,332,360,703,440,750,946,4,22,24,15,11,12,397,377,802,592,746,1028,20,19,25,8,16,11,449,273,554,816,991,757,26,22,15,7,17,6,326,288,434,711,915,771,23,21,3,11,11,12,286,138,639,678,706,789,13,22,14,10,9,7,290,240,639,680,758,729,11,22,14,9,8,14,242,374,639,616,780,1022,12,17,18,7,4,9,270,374,602,643,998,798,17,21,13,6,5,8,486,384,680,924,1213,625,23,19,13,2,19,7,414,470,909,713,620,1230,10,20,21,8,19,3,339,335,525,520,619,668,12,24,9,13,16,11,9 +156,140,597,652,598,665,7,12,1,6,7,7,269,397,624,601,625,1034,12,19,32,11,5,19,259,443,685,644,1002,745,35,23,22,13,7,10,237,525,713,717,821,944,23,27,32,10,9,11,300,522,689,771,925,764,36,27,22,9,10,14,252,420,528,791,1036,744,35,19,9,15,7,8,256,404,737,554,696,1104,18,27,32,8,7,16,316,238,662,483,694,946,15,27,25,15,4,16,425,329,813,599,738,1028,25,14,24,8,9,13,353,351,547,841,975,765,27,19,18,7,10,8,324,266,439,734,889,759,26,24,4,13,4,14,266,176,632,677,662,785,12,15,11,14,6,9,204,172,654,687,718,717,14,13,11,9,5,18,302,316,610,615,738,1012,21,20,17,7,7,13,262,318,573,672,944,788,18,26,14,12,8,6,362,352,677,955,1175,621,26,10,10,6,12,7,384,324,884,714,594,1240,7,15,24,8,12,7,323,311,546,543,621,688,15,29,14,15,11,15,9 +146,202,676,639,645,685,13,21,8,5,15,3,221,291,629,594,670,1054,8,30,25,10,13,17,237,343,666,569,1009,765,23,14,15,10,1,12,337,373,786,714,820,964,21,22,25,11,11,9,326,370,762,748,920,784,24,22,15,10,12,10,238,298,595,744,1047,764,23,12,16,12,5,10,250,330,768,533,747,1124,16,22,25,9,5,12,300,306,709,432,745,966,13,18,18,12,8,12,417,253,792,578,763,1048,13,21,17,9,11,11,371,297,632,810,1002,777,29,26,25,4,12,10,262,300,484,673,918,779,30,25,11,8,6,16,240,196,717,668,711,805,22,16,16,7,14,11,238,172,699,666,753,737,20,20,14,8,13,14,258,350,595,598,787,1032,21,23,18,10,1,9,252,354,662,603,993,808,26,13,21,3,0,8,412,380,758,886,1180,637,30,17,17,5,14,9,404,404,871,701,635,1260,19,22,17,11,14,3,305,367,603,526,648,696,17,22,9,10,13,11,9 +122,156,574,640,688,706,1,19,10,4,14,5,255,429,603,583,707,1075,6,18,29,15,12,11,349,401,632,566,1022,786,37,24,19,9,0,8,351,453,694,713,861,985,25,22,27,10,12,13,352,512,662,757,951,805,38,22,19,11,13,6,360,450,493,741,1052,785,37,20,18,11,6,10,358,410,718,532,772,1145,12,22,27,12,6,12,346,396,645,427,752,987,9,24,20,13,7,6,445,371,772,579,804,1069,19,19,19,12,12,7,439,317,530,805,1023,798,29,12,21,7,13,10,374,384,384,672,937,800,28,19,13,7,7,12,314,218,615,665,722,826,10,22,16,6,13,9,220,250,625,667,758,758,8,16,16,13,12,8,338,470,585,603,816,1053,17,15,24,11,0,7,352,466,562,604,1000,829,20,25,23,4,1,12,450,422,666,879,1221,658,28,15,15,4,15,11,424,436,857,702,678,1281,5,22,19,12,15,3,265,425,517,521,681,717,17,22,19,9,14,7,9 +168,184,624,664,638,675,4,13,7,4,14,5,233,347,655,581,681,1016,1,24,24,13,12,19,219,321,670,600,1002,753,32,22,22,11,0,10,331,367,736,755,771,898,28,24,30,8,12,11,264,382,716,779,877,772,33,24,22,7,13,12,202,294,575,775,1052,758,32,20,15,13,6,8,228,314,784,566,764,1082,7,22,24,10,6,14,292,316,709,461,788,942,4,22,23,15,7,14,389,301,802,605,736,1022,20,13,24,10,12,13,327,237,578,765,1007,751,26,26,18,7,13,8,268,220,458,704,929,777,23,21,12,11,7,14,226,136,663,675,744,787,13,18,19,10,13,9,302,204,657,693,780,735,11,18,19,11,12,16,246,286,623,627,810,1026,12,17,27,9,0,11,192,284,634,642,1032,802,17,19,22,4,1,6,358,314,704,915,1193,627,23,15,18,2,15,7,412,424,897,736,630,1212,10,14,20,8,15,5,293,339,547,515,611,634,12,28,10,11,14,13,9 +159,213,581,700,608,639,1,14,14,10,10,9,294,344,668,651,607,984,6,31,17,9,12,19,284,394,677,580,928,719,37,19,7,11,20,10,304,410,691,761,773,900,25,21,17,12,18,11,273,391,671,775,837,742,38,23,7,11,17,16,231,389,530,731,972,712,37,17,6,9,16,8,259,291,767,558,640,1052,12,31,17,10,16,16,327,209,702,517,650,904,9,27,10,7,13,18,392,290,823,655,742,984,19,18,11,10,8,13,360,326,539,805,907,735,29,21,23,9,9,8,265,343,449,668,827,727,28,28,11,7,15,14,185,223,624,727,608,745,10,11,10,6,11,9,313,187,626,743,668,683,8,17,8,9,12,20,317,253,666,611,680,980,17,30,4,11,20,13,259,259,589,620,902,756,20,16,1,4,21,6,379,473,663,899,1123,603,28,16,25,10,9,7,393,291,938,770,608,1202,5,17,9,12,9,9,330,230,528,589,643,646,17,29,19,9,12,17,9 +142,146,589,727,637,665,1,18,17,3,11,3,221,371,662,676,654,1012,4,37,14,12,9,17,241,369,679,593,971,745,35,11,4,12,3,12,359,421,683,784,834,944,25,17,14,9,15,9,292,448,673,796,932,764,36,19,4,8,16,10,270,404,520,764,1005,734,35,13,9,14,9,10,268,334,759,583,685,1074,10,29,14,9,9,14,306,268,700,522,663,924,7,23,7,16,10,12,393,311,827,674,781,1012,19,26,6,11,15,9,405,277,551,828,952,769,27,27,32,6,16,10,308,348,447,703,860,731,26,24,14,10,10,16,250,182,636,760,631,755,10,17,13,9,10,11,260,150,640,762,687,701,8,21,11,10,9,14,238,346,638,638,735,982,15,28,1,8,3,9,248,344,579,593,913,774,18,12,4,5,4,10,418,434,659,878,1144,627,26,20,28,1,18,9,416,350,926,789,637,1214,7,25,6,9,18,3,327,333,546,632,674,690,15,21,16,12,17,11,9 +176,180,614,679,628,648,2,13,9,4,10,15,299,307,691,652,639,1017,3,28,22,13,8,17,239,407,698,609,938,728,34,22,22,11,4,14,289,415,728,744,795,927,26,24,22,8,16,9,332,406,708,774,867,747,35,24,22,7,17,20,230,344,575,786,986,727,34,20,17,13,10,12,294,336,808,563,696,1087,9,22,22,10,10,14,358,218,731,462,688,929,6,26,25,17,11,22,439,265,850,614,742,1011,20,15,24,10,16,19,365,319,564,854,943,742,26,26,16,7,17,12,340,296,464,713,849,742,25,23,12,11,11,18,208,200,649,716,642,768,11,14,15,10,9,13,282,124,657,702,690,700,9,14,13,11,8,24,298,250,683,626,738,995,14,23,17,9,4,17,212,256,630,633,938,771,17,19,20,8,5,10,394,420,690,912,1149,600,25,15,20,2,19,11,428,324,951,737,622,1223,8,14,24,8,19,15,381,279,545,576,601,663,14,28,12,15,16,23,9 +176,164,542,665,637,687,2,16,10,6,11,9,261,473,639,636,658,1050,7,25,27,13,9,19,297,447,662,595,1015,767,38,21,17,11,3,12,331,521,670,744,856,960,26,25,27,8,15,11,314,572,646,768,952,788,39,27,17,9,16,16,322,512,509,764,1045,766,38,21,18,13,9,10,318,468,744,553,721,1120,13,23,27,10,9,16,360,300,669,462,703,962,10,25,20,17,10,18,443,399,820,592,777,1044,20,16,19,12,15,11,449,347,480,818,996,773,30,23,23,7,16,10,368,330,422,695,904,785,29,24,13,13,10,16,270,222,565,696,677,801,11,15,16,14,10,11,252,232,597,680,727,741,9,13,16,11,9,20,292,384,649,618,763,1038,18,18,22,9,3,15,322,386,574,645,953,814,21,24,23,12,4,8,422,370,618,916,1184,639,29,14,15,6,18,9,420,368,911,723,633,1260,4,15,19,10,18,9,337,357,479,546,660,692,18,29,13,15,17,17,9 +112,246,690,687,649,689,11,17,7,2,13,2,255,287,645,634,698,1016,10,30,24,9,11,16,257,327,702,661,997,767,25,16,26,9,1,11,301,315,812,764,762,886,19,18,32,12,13,10,296,334,776,826,862,788,26,20,26,13,14,9,262,296,607,848,1049,776,25,14,13,11,7,9,268,326,786,627,777,1080,16,22,26,8,7,15,318,330,721,518,805,950,13,24,29,13,8,11,397,259,804,622,741,1028,13,21,30,8,13,10,355,263,644,864,1022,757,29,26,10,5,14,9,298,292,502,773,938,799,30,25,10,9,8,15,240,202,729,712,757,795,20,20,17,8,12,10,244,208,721,710,783,755,18,20,19,7,11,13,266,310,613,682,827,1044,21,23,25,9,1,8,236,308,672,711,1049,822,26,19,20,8,2,9,388,390,782,980,1190,643,30,19,18,2,16,8,388,434,887,749,645,1232,17,20,28,10,16,2,303,321,613,546,596,620,17,26,10,15,15,10,9 +127,115,688,589,602,691,11,16,7,9,13,4,274,406,667,570,643,1014,8,27,38,10,11,16,312,436,730,585,1040,765,25,19,28,18,1,9,336,490,792,672,835,966,21,23,38,11,13,12,319,525,768,734,951,784,26,25,28,14,14,9,331,437,597,760,1082,744,25,19,15,16,7,9,333,453,780,531,722,1074,14,23,38,7,7,15,361,357,711,432,740,926,11,25,31,14,10,11,434,352,818,506,734,1020,19,18,30,7,13,8,430,324,650,842,1005,801,17,23,24,10,14,9,367,309,496,685,925,729,18,24,10,16,8,13,271,169,735,618,696,755,20,17,11,17,12,8,251,213,735,594,764,699,18,15,13,8,11,13,301,385,637,596,768,982,19,20,23,8,1,8,295,385,654,655,992,786,22,22,20,15,2,11,437,369,772,920,1217,657,18,14,4,9,16,10,413,429,915,643,594,1212,17,17,30,9,16,2,324,388,625,470,613,724,5,29,18,16,15,10,9 +165,143,603,657,609,687,4,16,6,3,6,6,258,392,612,608,650,1056,7,31,25,12,6,18,248,388,645,615,1047,767,32,19,19,12,8,9,306,456,721,718,842,966,22,29,27,9,6,12,269,479,695,768,958,786,33,29,19,8,7,11,197,369,524,772,1089,766,32,21,6,14,8,7,225,337,743,543,729,1126,13,29,25,9,8,15,277,269,672,460,745,968,10,23,20,16,5,13,378,306,795,606,743,1050,16,16,21,9,12,14,298,302,557,806,1012,779,30,25,15,6,5,7,237,265,415,711,932,781,29,22,3,10,3,13,231,143,642,688,703,807,13,13,16,9,5,8,313,153,634,694,771,739,11,13,18,10,6,15,287,349,586,612,773,1034,18,26,18,8,8,10,221,355,593,625,997,810,21,16,13,5,9,5,333,343,685,914,1224,639,29,10,17,1,7,6,391,333,860,719,601,1262,10,17,17,9,9,6,298,378,530,534,624,698,18,27,11,12,10,14,9 +148,136,654,684,593,643,6,16,2,7,15,4,169,331,661,651,614,966,7,29,29,12,13,18,213,391,700,648,963,721,30,21,19,12,1,11,395,431,756,749,808,920,22,25,29,9,11,10,304,446,738,805,900,746,31,27,19,8,12,11,242,326,575,817,995,706,30,21,6,14,5,9,224,368,770,584,679,1024,13,23,29,9,5,13,260,272,699,491,659,878,10,25,22,16,8,13,343,289,826,623,725,972,18,16,23,11,11,8,399,295,616,853,944,755,22,27,15,8,12,9,258,248,474,748,852,685,21,24,1,14,6,15,248,126,701,719,629,701,15,15,14,15,14,10,268,138,711,711,673,663,13,13,14,10,13,15,208,316,641,649,721,936,18,22,16,8,1,10,240,316,642,672,909,742,21,20,11,13,0,11,448,334,734,959,1134,615,21,14,13,7,14,10,380,370,919,740,587,1162,12,15,21,9,14,4,293,351,605,561,608,678,10,29,9,16,13,12,9 +134,132,643,638,610,671,5,14,6,3,9,8,285,373,740,607,655,1040,0,31,37,14,7,18,291,439,717,610,984,751,31,19,27,12,5,13,327,491,749,717,763,950,29,25,37,9,17,10,330,500,727,767,875,770,32,27,27,10,18,15,296,390,590,785,1032,750,31,21,14,12,11,11,298,430,829,554,732,1110,6,27,37,11,11,15,342,348,770,449,758,952,3,27,30,18,12,17,443,323,879,565,714,1034,19,18,29,11,17,10,383,321,605,849,989,765,25,25,23,6,18,11,332,266,517,712,907,767,22,24,9,8,12,17,252,154,690,669,710,791,14,17,10,9,8,12,264,190,690,653,746,725,12,13,12,12,7,19,304,366,722,619,782,1018,11,26,22,10,5,14,266,366,645,664,1006,794,16,16,19,7,6,9,418,338,727,935,1209,623,22,12,5,3,20,10,430,430,992,696,606,1246,11,17,29,11,20,8,333,381,572,523,563,686,13,29,17,14,15,16,9 +117,131,630,695,623,657,1,15,7,4,11,4,254,348,641,654,632,964,4,30,24,13,9,16,246,376,680,609,955,725,35,20,14,11,3,9,316,426,730,752,824,932,25,24,24,8,15,12,299,441,708,790,912,748,36,26,14,7,16,9,251,375,529,780,981,700,35,20,11,13,9,7,267,337,746,561,671,1018,10,24,24,10,9,15,323,293,681,488,641,876,7,26,17,17,10,11,410,274,804,640,769,970,19,17,16,10,15,10,362,278,594,848,938,785,27,28,20,7,16,7,299,313,444,715,844,679,26,25,6,11,10,13,237,179,679,728,617,697,10,16,13,10,10,8,271,165,681,728,663,657,8,14,9,11,9,13,267,337,615,630,717,928,15,25,11,9,3,8,227,337,598,619,889,738,18,17,14,6,4,9,391,397,712,902,1124,639,26,13,18,2,18,8,405,329,899,755,623,1160,7,16,16,8,18,2,324,370,587,598,658,712,15,30,8,13,17,10,9 +191,135,530,699,663,713,1,13,24,7,14,4,270,348,607,624,690,1082,6,24,13,12,12,18,238,420,618,571,1011,793,37,20,3,12,0,11,258,458,654,762,868,992,25,24,7,9,12,10,295,467,628,792,974,812,38,24,3,8,13,11,259,375,491,746,1029,792,37,18,16,14,8,9,259,355,726,565,729,1152,12,24,7,9,6,15,345,237,649,498,693,994,9,24,0,16,7,13,408,266,786,650,803,1076,19,15,1,9,12,12,416,344,474,802,1000,805,29,20,37,10,13,9,347,319,378,679,910,807,28,23,21,14,13,15,235,191,559,720,667,833,10,16,20,13,13,10,205,139,575,738,711,765,8,16,18,10,12,15,275,353,593,630,779,1060,17,17,8,8,0,10,255,357,552,579,937,836,20,21,11,5,1,7,419,425,610,866,1176,665,28,13,35,5,15,8,377,317,861,765,661,1288,5,16,1,7,15,4,374,376,461,584,692,724,17,28,25,12,16,12,9 +174,166,652,635,637,670,11,15,5,4,15,5,175,297,647,598,658,1039,6,26,30,11,13,19,181,415,682,571,993,750,25,22,20,13,1,12,357,421,752,710,840,949,29,28,30,10,11,9,298,402,736,746,928,769,26,28,20,9,12,12,208,298,571,744,1033,749,25,20,13,15,5,10,200,334,774,523,721,1109,8,24,30,8,5,12,252,272,701,420,709,951,5,24,23,15,8,14,365,233,790,570,765,1033,19,13,22,8,11,11,365,321,612,794,984,762,23,24,22,7,12,10,252,276,464,675,896,766,24,23,8,11,6,16,240,174,697,664,673,790,20,14,13,10,14,11,242,124,679,658,727,724,16,12,13,9,13,16,200,340,625,594,765,1017,13,19,21,7,1,11,194,336,640,599,959,793,18,19,18,4,0,8,406,372,726,880,1180,622,24,13,12,2,14,9,388,330,897,695,629,1245,17,14,22,8,14,5,287,391,577,514,648,681,13,30,12,11,13,13,9 +192,202,612,681,608,645,5,13,8,6,6,9,217,299,695,622,629,1014,0,26,23,11,10,19,193,381,696,629,952,725,31,20,17,11,8,10,329,385,704,736,775,924,29,24,23,10,14,11,312,390,698,768,871,744,32,24,17,9,15,16,212,296,543,774,990,724,31,18,4,13,14,8,210,314,778,541,708,1084,6,24,23,8,8,16,286,238,729,494,706,926,3,24,16,15,9,18,369,263,820,630,716,1008,19,15,15,8,16,15,365,305,584,836,951,737,23,22,19,9,15,8,282,226,486,717,869,739,22,23,5,13,13,14,262,154,669,714,670,765,14,16,14,12,5,9,272,148,657,718,706,697,12,16,16,9,8,20,216,238,673,608,748,992,11,19,12,7,8,13,198,242,602,645,954,768,14,19,9,4,9,6,414,354,690,934,1155,597,22,13,19,4,17,7,384,364,953,741,598,1220,11,16,15,6,17,9,299,287,559,586,605,656,13,28,17,11,12,17,9 +169,125,613,629,598,645,4,14,1,4,12,4,184,394,664,602,627,1010,1,23,32,11,10,18,222,432,659,599,984,725,32,25,22,13,2,9,352,494,711,694,801,920,28,33,32,10,14,12,297,511,693,754,903,746,33,33,22,9,15,11,239,369,530,762,1022,728,32,23,9,15,8,7,217,381,765,531,700,1080,7,27,32,8,8,15,263,295,708,434,698,922,4,25,25,15,9,13,348,316,809,568,722,1004,20,10,24,8,14,10,396,296,579,820,967,743,24,21,18,7,15,7,283,263,453,699,883,743,23,24,4,11,9,13,289,141,664,664,662,761,13,13,11,10,11,8,253,163,656,656,716,701,11,11,11,9,10,15,199,373,642,596,744,994,12,20,17,7,2,10,225,373,595,619,950,770,15,22,14,8,3,9,433,311,695,906,1173,607,23,10,10,2,17,8,365,337,918,681,590,1216,10,11,24,8,17,4,262,406,556,518,599,664,12,33,12,15,16,12,9 +118,230,586,757,676,673,1,17,23,5,15,3,241,365,659,686,677,1020,6,30,10,12,13,17,299,359,674,597,904,753,37,14,2,12,1,10,313,359,698,806,845,952,25,10,8,9,11,11,312,404,676,822,931,772,38,16,2,8,12,10,322,422,529,768,912,742,37,10,15,14,7,8,320,348,764,603,668,1082,12,26,8,9,5,14,340,298,695,554,572,932,9,22,1,12,8,12,407,317,830,706,822,1020,19,29,0,9,11,9,445,299,542,826,921,777,29,24,38,6,12,8,362,442,436,711,817,739,28,15,20,10,12,14,282,264,627,786,578,763,10,20,19,9,14,9,222,258,641,794,654,709,8,28,17,10,13,14,286,388,649,656,726,990,17,23,7,8,1,9,302,406,594,569,820,782,20,17,10,1,0,10,452,506,668,866,1059,635,28,27,34,5,14,9,390,350,925,817,680,1222,5,30,0,9,14,3,317,327,539,660,729,698,17,16,22,8,15,11,9 +197,139,631,587,682,688,13,21,4,5,13,6,226,336,610,558,725,1057,18,24,35,10,11,20,226,456,641,567,1046,768,25,20,25,10,1,11,322,446,753,672,815,967,19,26,35,11,13,10,303,445,719,726,919,787,26,26,25,12,14,13,283,349,552,744,1096,767,25,18,12,12,7,9,267,403,745,515,808,1127,24,18,35,7,7,15,345,317,672,406,832,969,21,18,28,14,8,15,408,250,775,508,780,1051,7,15,27,7,13,10,460,328,585,794,1051,780,33,26,21,8,14,9,333,237,441,671,973,782,34,19,7,12,8,15,255,189,670,612,788,808,22,20,8,11,12,10,217,149,664,596,824,740,20,18,10,8,11,17,237,345,566,582,854,1035,29,17,20,6,1,12,279,339,617,627,1076,811,32,21,17,5,2,9,461,337,719,894,1223,640,34,19,7,3,16,8,387,377,844,645,674,1263,17,16,27,7,16,6,372,384,552,456,655,699,21,24,15,12,15,14,9 +129,199,702,650,631,659,9,14,5,3,8,11,264,340,705,629,664,1028,6,31,26,12,8,19,252,318,722,608,943,739,27,19,16,12,6,12,284,362,814,717,738,938,23,21,26,9,10,9,303,363,794,759,832,760,28,21,16,10,11,18,227,301,655,777,999,738,27,17,11,14,10,10,245,331,850,548,747,1098,12,25,26,9,6,14,307,313,789,459,745,940,9,25,19,14,7,20,388,306,858,587,723,1022,15,18,18,9,14,13,328,246,656,835,976,751,31,25,20,4,11,10,259,231,536,708,886,757,28,26,6,8,7,16,213,139,741,687,707,779,18,15,15,7,7,11,265,193,721,675,729,713,16,17,13,10,6,22,283,249,671,611,783,1010,17,26,17,10,6,15,233,253,718,632,989,786,22,16,16,3,7,8,373,339,782,913,1152,611,28,16,16,3,13,9,381,437,945,708,625,1234,15,17,18,11,13,11,300,282,623,547,580,670,17,27,6,10,14,19,9 +259,187,664,583,652,706,22,21,10,5,14,6,244,326,605,558,683,975,19,26,33,12,12,14,162,418,668,547,1060,766,24,16,31,12,0,13,354,416,736,662,877,965,14,26,39,9,12,8,323,409,726,704,985,783,15,26,31,8,13,7,205,279,531,718,1096,725,14,16,18,14,6,11,265,347,714,487,754,1009,17,22,39,9,6,11,281,291,667,382,752,891,20,18,34,16,7,13,458,262,752,510,788,993,36,19,33,9,12,14,362,312,638,790,1033,824,6,22,19,8,13,11,311,223,484,647,947,670,5,19,13,12,7,17,225,189,723,620,718,690,13,20,14,11,13,12,279,161,699,598,778,656,15,18,16,10,12,11,271,323,539,558,798,917,12,19,26,8,0,6,187,319,592,597,1004,771,9,17,23,7,1,9,337,329,730,868,1233,678,5,15,9,3,15,10,481,351,841,645,646,1157,28,20,33,7,15,6,328,380,619,474,669,753,12,24,13,14,14,14,9 +156,236,725,692,590,683,15,17,3,3,11,4,229,291,746,637,633,1010,10,28,28,12,9,18,241,313,713,656,920,761,21,14,22,12,3,13,385,307,841,773,685,878,31,14,34,9,15,10,356,322,821,833,789,782,36,14,22,12,16,11,278,290,668,845,972,766,37,10,9,14,9,11,272,318,879,628,718,1074,18,20,28,9,9,15,326,346,802,509,746,944,15,22,27,16,10,13,395,291,843,627,670,1022,9,25,28,9,15,12,377,265,673,857,947,751,37,22,14,6,16,11,308,292,547,770,863,789,34,17,6,10,10,17,308,174,758,715,698,789,24,24,15,9,10,12,314,234,732,715,714,745,20,26,15,10,9,15,234,304,708,689,762,1038,23,21,21,8,3,10,236,300,739,700,982,814,28,17,16,5,4,9,434,376,801,969,1133,635,34,23,14,1,18,10,426,464,982,754,582,1224,21,24,24,9,18,4,277,287,626,547,529,604,23,20,8,12,17,12,9 +184,160,611,598,630,677,1,17,4,5,5,4,283,431,632,567,661,1024,6,24,35,8,7,18,275,455,641,562,1040,755,37,26,25,8,15,9,283,529,721,677,855,956,25,32,35,13,13,12,298,538,697,717,963,774,38,32,25,12,12,11,212,398,532,735,1082,744,37,24,12,10,15,7,234,414,759,504,732,1084,12,26,35,9,15,15,268,302,686,393,738,936,9,22,28,12,8,13,395,337,793,531,766,1024,19,9,27,9,9,12,329,321,567,799,1011,785,29,16,21,4,8,7,238,300,425,664,925,741,28,21,7,8,10,13,244,198,652,627,696,765,10,10,8,7,6,8,274,196,646,619,764,709,8,14,10,8,7,15,336,368,596,571,776,992,17,25,20,10,15,10,272,364,599,600,990,786,20,23,17,5,16,7,350,298,693,875,1217,641,28,15,7,5,6,6,374,300,874,662,624,1224,5,10,27,11,6,4,307,429,542,481,649,708,17,28,15,12,17,12,9 +206,174,646,624,611,652,4,18,3,7,3,5,215,401,677,619,648,1021,1,27,34,12,3,19,207,437,696,626,1045,732,32,23,24,14,11,12,373,525,738,697,840,931,28,29,34,9,13,9,306,522,720,747,956,751,33,31,24,10,12,12,230,408,541,791,1087,731,32,25,11,14,11,10,214,394,774,546,727,1091,7,25,34,9,11,12,278,240,715,459,743,933,4,23,27,16,4,14,373,349,830,551,751,1015,20,14,26,9,9,11,399,339,614,865,1010,752,24,23,20,8,10,10,244,272,476,722,930,746,23,22,6,14,6,16,242,172,699,663,701,772,13,17,9,15,2,11,290,186,693,639,769,704,11,15,9,10,1,16,238,310,649,601,771,999,12,26,19,8,11,11,234,312,608,670,995,775,15,20,16,13,12,8,424,324,724,945,1222,608,23,14,8,7,12,9,400,314,935,682,607,1227,10,13,26,7,12,5,347,341,605,513,634,675,12,29,14,14,13,13,9 +295,485,781,892,653,655,26,32,25,15,14,9,158,192,574,765,614,784,21,17,10,4,10,7,152,232,711,688,751,675,20,21,4,4,8,10,330,194,799,887,722,864,20,23,6,11,4,11,263,199,777,861,828,672,11,15,4,8,5,4,129,229,620,733,757,582,10,21,17,6,8,8,137,269,687,710,581,814,15,9,6,7,8,12,181,279,654,731,549,710,18,15,1,0,15,12,278,208,731,883,759,824,38,22,2,7,4,13,296,288,775,751,766,787,6,15,36,12,5,8,157,291,621,706,662,499,5,16,22,10,13,10,293,415,860,939,539,611,17,27,21,9,11,9,341,365,832,971,599,515,19,31,19,6,12,10,197,215,458,715,617,722,10,10,9,8,8,3,211,217,635,508,663,640,7,16,12,11,7,6,339,427,857,789,908,647,5,32,36,15,7,7,321,409,770,954,645,962,32,21,2,9,7,9,280,260,764,825,736,752,18,7,22,10,14,13,9 +195,129,618,675,621,676,1,19,5,7,12,3,248,426,671,628,664,1003,4,28,28,14,10,17,226,376,680,629,1041,750,35,22,20,14,2,10,330,456,720,752,828,899,25,28,28,7,14,11,297,501,700,822,944,775,36,30,20,10,15,10,239,433,539,816,1085,757,35,24,13,12,8,8,247,369,770,613,741,1069,10,22,28,11,8,14,301,261,709,498,761,931,7,22,21,18,9,12,406,340,816,608,745,1009,19,15,20,11,14,11,376,278,580,852,1016,758,27,28,20,8,15,8,291,321,454,741,938,772,26,21,8,14,11,14,251,175,665,698,717,774,10,18,15,15,11,9,293,187,657,696,777,728,8,16,15,12,10,14,263,339,657,676,789,1019,15,21,21,10,2,9,215,345,604,683,1013,795,18,21,18,13,3,8,385,341,698,952,1234,636,26,15,14,7,17,7,413,325,935,733,613,1231,7,14,20,9,17,3,360,380,563,546,620,629,15,28,14,14,16,11,9 +241,277,731,651,728,744,19,15,14,10,9,6,280,338,692,600,769,1057,18,42,23,9,9,12,248,266,673,595,1072,818,17,8,35,7,5,11,284,278,845,746,837,915,27,14,31,6,9,10,295,289,813,790,939,839,32,22,35,7,10,5,229,277,640,788,1124,831,33,10,22,9,7,9,257,263,827,577,856,1119,26,36,31,14,5,13,327,319,762,458,880,995,23,22,38,11,8,13,424,324,817,570,816,1075,5,29,39,6,15,14,396,216,689,822,1085,804,41,30,9,7,10,9,293,259,541,713,1007,854,42,23,19,11,4,15,227,197,774,666,836,846,28,16,20,10,8,10,295,237,738,658,864,810,26,24,20,5,7,11,323,233,618,648,898,1099,31,31,34,13,5,4,281,231,705,627,1118,877,36,5,29,16,6,7,365,387,821,900,1241,698,42,23,19,6,12,8,371,443,906,715,720,1261,25,28,37,10,12,6,390,230,644,502,695,655,27,18,19,11,13,14,9 +126,150,685,614,622,643,11,16,4,3,3,9,253,371,716,601,673,1012,6,29,35,10,7,19,263,431,733,612,1008,723,25,21,25,10,11,12,333,475,789,693,781,922,25,27,35,11,11,9,302,470,775,755,893,742,26,27,25,12,12,16,272,380,632,781,1056,722,25,19,12,12,11,10,278,410,853,550,746,1082,10,23,35,9,11,14,328,296,778,461,772,924,7,23,28,14,6,18,403,313,873,531,732,1006,13,14,27,7,13,11,385,317,637,835,1013,735,29,25,21,6,12,10,314,260,513,710,931,737,26,22,7,10,8,16,256,162,722,641,724,763,20,15,8,9,2,11,276,172,702,619,766,695,18,13,10,8,5,20,260,308,678,615,798,990,15,24,20,8,11,15,238,310,695,686,1022,766,20,18,17,7,12,8,412,346,753,949,1233,595,26,14,7,1,14,9,410,384,950,666,616,1218,17,15,27,9,14,9,297,307,604,491,575,654,19,29,15,14,15,17,9 +130,208,582,725,629,712,4,12,19,7,13,5,279,359,619,656,630,1037,9,35,12,10,11,19,301,381,650,579,907,790,40,11,2,14,1,10,303,389,698,764,806,991,28,15,12,11,13,11,348,406,674,780,892,809,41,23,2,10,14,12,322,416,511,736,929,769,40,11,11,12,7,8,322,358,736,561,645,1089,15,27,12,7,7,14,354,300,657,528,589,949,12,25,5,10,8,14,455,311,814,680,775,1043,22,26,4,7,13,9,419,313,534,802,908,826,32,27,34,6,14,8,354,408,400,677,806,748,31,18,16,10,8,14,272,260,619,758,581,770,13,21,15,9,12,9,228,208,631,768,619,728,11,23,13,8,11,16,314,360,609,610,693,997,20,28,3,8,1,11,292,366,582,563,837,807,23,14,6,1,2,10,436,516,664,858,1072,682,31,22,30,7,16,9,420,334,879,783,633,1233,2,25,4,9,16,5,349,315,527,640,684,749,20,21,18,8,15,13,9 +113,189,713,647,663,642,18,15,3,9,5,8,330,320,668,614,708,1011,15,30,34,12,7,20,342,352,717,629,1007,722,18,20,24,12,11,11,270,372,831,722,772,921,18,20,34,15,11,10,283,379,803,764,872,741,23,22,24,16,12,15,277,315,634,798,1059,721,24,18,11,10,11,9,299,357,807,563,787,1081,21,32,34,17,11,13,351,337,746,466,815,923,18,26,27,8,6,17,376,276,829,572,755,1005,8,17,26,15,13,12,330,274,663,838,1032,734,32,18,20,8,4,9,265,265,523,729,948,738,33,29,6,2,6,15,223,167,748,672,767,762,27,8,9,1,6,10,321,195,726,660,793,694,25,18,9,14,7,19,353,303,616,624,837,991,26,31,19,16,11,14,317,299,701,671,1059,767,31,17,16,9,12,7,367,353,791,946,1204,594,33,17,8,9,6,8,367,441,894,703,659,1217,24,16,26,17,10,8,270,322,628,516,612,653,20,26,14,12,13,16,9 +161,115,602,676,649,653,0,15,9,4,10,9,266,412,677,639,672,1022,5,28,28,11,8,19,238,406,654,598,1013,733,36,22,18,13,4,12,280,466,708,745,852,932,24,30,28,10,16,9,279,483,686,771,940,752,37,30,18,9,17,16,231,385,541,773,1053,732,36,24,15,15,10,10,243,383,782,558,733,1092,11,26,28,8,10,14,311,297,719,465,729,934,8,24,21,15,11,18,396,324,836,615,777,1016,18,13,20,8,16,13,382,268,566,847,1000,753,28,26,26,7,17,10,297,275,468,704,914,749,27,23,12,11,11,16,199,139,651,709,689,773,9,14,7,10,9,11,263,161,651,703,747,707,7,12,7,9,8,20,269,341,667,619,779,1000,16,21,13,7,4,15,233,341,596,632,981,776,19,19,14,4,5,8,389,329,688,909,1204,609,27,11,14,2,19,9,375,341,937,740,643,1228,6,14,20,8,19,9,348,352,557,571,638,676,16,32,10,11,16,17,9 +182,186,603,619,654,673,0,20,7,4,10,6,239,319,660,562,697,1002,5,15,26,11,8,12,301,377,653,603,1018,743,36,27,30,11,6,7,385,379,713,708,793,892,24,17,42,10,18,14,328,396,691,764,909,762,37,17,30,11,19,9,334,368,548,782,1068,764,36,23,17,13,12,9,330,378,783,555,780,1068,11,15,36,8,12,9,342,368,714,438,804,928,8,19,35,15,13,7,455,299,813,544,752,1008,18,20,36,8,18,8,465,327,559,804,1023,737,28,15,12,7,19,9,382,334,453,709,945,783,27,22,14,11,13,11,304,224,644,636,760,777,9,23,17,10,9,8,248,196,638,632,796,741,7,17,17,9,8,9,310,348,628,622,826,1022,16,14,29,7,6,10,316,348,607,637,1048,802,19,24,24,6,7,11,454,434,685,912,1219,627,27,22,16,2,21,10,468,440,902,681,646,1210,6,21,32,8,21,2,303,325,534,472,627,630,16,21,8,13,14,8,9 +168,152,587,666,667,681,4,18,1,4,5,7,349,433,656,625,678,1034,9,33,32,9,9,19,335,421,669,614,997,759,40,17,22,13,9,10,315,479,705,739,870,948,28,23,32,12,9,11,350,514,679,779,940,784,41,25,22,11,10,14,320,440,528,785,1039,764,40,19,9,15,13,8,342,426,759,558,733,1104,15,27,32,10,9,14,388,330,692,451,715,948,12,23,25,13,8,16,509,377,817,601,799,1028,22,20,24,10,15,13,403,337,537,845,992,771,32,27,18,3,10,8,348,362,427,716,898,779,31,26,4,7,10,14,220,204,622,695,679,789,13,15,11,6,4,9,300,218,634,689,733,735,11,15,11,9,7,18,370,410,642,629,777,1030,20,26,17,11,9,13,302,410,593,642,967,806,23,14,14,4,10,6,384,420,669,921,1188,643,31,14,10,4,12,7,488,396,912,728,663,1246,2,19,24,12,12,7,381,389,524,545,684,692,20,27,12,9,13,15,9 +173,181,547,706,679,713,4,19,25,5,12,5,194,374,580,619,694,1060,9,20,14,12,10,13,264,366,627,564,967,791,34,20,4,12,6,8,278,400,657,765,866,992,22,26,6,9,8,13,261,449,623,789,964,810,35,26,4,8,7,6,227,347,458,739,969,780,34,18,17,14,8,8,221,303,691,564,709,1120,15,26,6,9,2,14,245,245,618,509,639,972,12,20,1,16,5,8,362,292,761,661,823,1060,22,19,2,9,10,9,374,270,515,777,972,815,26,12,36,8,7,8,285,331,383,676,874,777,25,19,22,12,9,12,293,179,600,723,629,801,9,22,21,11,11,7,183,187,616,749,671,745,11,18,19,10,10,10,281,371,570,623,763,1028,18,19,9,8,6,5,293,371,523,554,877,822,17,23,12,5,5,10,385,409,647,847,1124,673,25,11,36,3,9,9,347,311,840,772,681,1260,8,22,2,7,9,1,300,364,508,591,720,736,14,22,26,12,10,9,9 +151,197,632,723,630,663,4,15,19,6,12,9,306,294,681,684,633,1032,1,34,12,13,10,19,298,340,694,619,890,743,32,16,2,11,2,12,326,358,750,778,801,942,28,18,12,10,14,9,343,369,728,810,849,762,33,18,2,11,15,16,279,343,569,784,938,742,32,14,11,13,8,10,299,319,792,581,662,1102,7,28,12,10,8,14,365,265,719,518,626,944,4,24,5,11,9,18,384,276,812,670,754,1026,20,21,4,10,14,13,358,294,578,858,905,755,26,24,30,5,15,10,287,343,460,723,805,757,23,29,16,7,9,16,233,201,663,756,592,783,13,14,15,6,11,11,349,159,665,758,636,715,11,20,13,11,10,20,309,311,673,646,706,1010,12,27,3,11,2,15,263,317,640,617,876,786,17,13,6,4,3,8,435,455,708,904,1095,615,23,19,30,6,17,9,377,369,941,781,626,1238,10,20,4,12,17,9,274,280,547,620,623,674,12,24,14,7,16,17,9 +176,118,542,612,607,621,2,14,2,6,6,5,229,367,591,551,630,978,3,27,29,13,4,17,235,421,614,564,1001,699,34,23,19,11,8,12,357,471,642,685,824,888,26,29,31,8,14,9,294,470,620,723,926,720,35,29,19,7,13,10,248,364,451,727,1043,706,34,21,6,13,8,10,242,362,690,498,691,1048,9,25,29,10,8,12,312,260,627,401,699,894,6,25,24,17,7,12,387,293,760,553,747,974,20,12,25,10,12,13,411,309,506,791,968,719,26,27,15,9,13,10,308,262,376,662,886,721,25,22,3,13,7,16,252,124,591,635,657,735,11,13,14,14,5,11,278,132,599,641,725,679,9,13,14,11,4,14,238,336,565,569,737,970,14,20,18,9,8,9,232,334,518,600,951,746,17,20,13,12,9,8,426,344,624,877,1178,585,25,12,13,6,15,9,412,338,847,676,603,1190,8,13,21,8,15,5,319,355,495,477,632,640,14,31,9,15,14,13,9 +231,135,573,628,632,674,1,19,1,7,8,4,178,394,630,587,649,1041,4,16,32,12,6,18,214,420,647,560,978,752,35,24,22,12,6,9,342,480,677,693,835,953,25,28,32,9,12,12,313,505,655,729,911,771,36,28,22,8,13,11,267,373,496,719,1014,751,35,20,9,14,6,7,237,397,731,502,704,1111,10,22,32,9,8,15,309,261,668,417,692,953,7,20,25,16,7,13,404,330,793,569,762,1035,19,15,24,9,12,12,452,300,535,783,967,776,27,16,18,10,15,7,327,267,409,656,879,766,26,19,4,14,9,13,295,161,620,661,656,792,10,18,11,13,9,8,221,165,628,657,708,724,8,16,11,10,6,15,237,343,612,571,750,1019,15,15,17,8,6,10,303,339,561,580,942,795,18,25,14,9,7,7,457,333,657,863,1167,634,26,15,10,5,15,6,403,339,890,688,628,1247,7,16,24,7,15,4,338,382,522,527,649,697,15,28,14,16,14,12,9 +165,283,673,669,671,720,20,20,18,14,15,6,246,298,622,612,686,1011,15,33,13,7,13,14,210,268,655,529,981,782,20,15,3,7,1,11,294,300,751,724,858,979,22,21,13,10,11,10,285,323,731,738,956,799,17,21,3,9,12,7,193,283,544,702,1013,751,16,13,10,5,5,9,231,267,737,521,705,1051,13,25,13,8,5,13,295,319,682,464,671,927,12,19,6,3,8,13,412,264,759,616,815,1023,26,20,5,8,11,14,346,260,651,760,972,828,10,25,35,13,12,9,271,351,497,639,876,712,11,28,15,9,6,15,183,261,736,700,643,732,19,13,14,8,14,10,239,257,708,704,695,690,23,19,12,9,13,11,271,381,566,578,755,959,18,24,2,9,1,6,213,385,603,537,921,799,15,12,5,8,0,7,349,433,755,822,1152,684,11,18,29,14,14,8,423,383,860,733,673,1199,26,21,5,10,14,6,338,322,626,568,712,757,8,23,19,7,13,14,9 +148,204,688,629,629,662,20,18,11,4,15,3,191,359,679,580,670,1031,15,21,28,15,13,15,219,289,692,551,1011,742,16,21,22,11,1,10,355,349,780,710,784,941,22,25,24,6,11,11,298,402,762,752,892,761,19,25,22,7,12,8,246,322,593,738,1059,741,20,19,19,11,5,8,242,302,812,539,755,1101,15,19,24,12,5,14,282,320,743,430,775,943,12,19,19,15,8,10,349,323,818,564,735,1025,14,14,20,12,11,9,385,215,662,792,1006,754,28,21,18,7,12,8,294,298,514,665,926,758,29,20,14,11,6,14,292,182,747,650,733,782,27,17,19,10,14,9,268,208,719,652,777,716,23,17,19,13,13,12,212,356,639,604,797,1009,20,14,27,11,1,7,224,352,662,605,1019,785,25,22,24,4,0,10,424,346,772,872,1176,614,29,18,18,4,14,9,372,412,915,689,619,1237,26,15,20,10,14,1,251,345,625,502,616,673,16,25,18,11,13,9,9 +191,239,677,629,622,664,19,13,1,4,10,6,222,314,696,572,657,1019,14,28,30,11,8,18,212,336,663,609,954,744,17,14,20,11,4,9,368,336,787,706,725,915,27,18,32,10,16,12,343,337,767,764,839,763,32,20,20,11,17,13,261,277,616,782,1006,745,33,12,7,13,10,7,253,335,829,553,750,1087,20,24,30,8,10,15,315,349,758,446,774,939,17,26,25,15,11,15,390,318,807,562,698,1019,5,21,26,8,16,14,396,292,627,794,967,748,39,22,16,7,17,7,325,245,499,711,889,762,36,17,4,11,11,13,311,153,712,648,730,780,28,22,13,10,9,8,299,227,688,650,748,720,22,22,13,9,8,17,223,299,650,616,786,1013,25,21,19,7,4,12,219,295,681,663,1002,789,30,17,14,4,5,5,441,371,751,932,1153,616,36,19,12,2,19,6,415,483,930,689,608,1235,25,22,22,8,19,6,286,260,584,482,581,639,27,22,10,11,16,14,9 +133,139,596,641,597,660,4,14,9,7,11,5,236,330,637,594,628,1029,1,29,22,12,9,19,248,394,652,559,1005,740,32,21,12,12,3,12,294,448,704,712,822,939,28,25,22,9,9,9,265,447,684,724,930,759,33,25,12,8,10,12,231,347,527,728,1039,739,32,19,15,14,5,10,231,343,750,517,699,1099,7,23,22,9,3,12,313,231,677,440,697,941,4,25,15,16,4,14,342,278,786,580,733,1023,20,14,14,9,11,11,388,300,554,776,978,762,24,27,24,10,10,10,279,267,428,659,892,754,23,22,10,14,4,16,235,155,639,672,663,780,13,15,13,13,10,11,259,123,643,668,721,712,11,15,11,10,9,16,251,307,627,572,743,1007,12,22,15,8,3,11,257,307,592,585,947,783,15,18,18,11,4,8,419,367,676,868,1178,620,23,14,20,5,12,9,351,327,897,701,591,1235,10,15,14,7,12,5,304,338,529,526,614,683,12,29,4,16,13,13,9 +134,146,598,693,589,601,4,18,3,3,1,1,277,339,657,644,602,960,1,25,28,12,3,15,347,389,700,639,943,681,32,25,18,12,15,12,435,441,694,758,798,870,28,25,30,11,13,9,380,452,674,804,888,702,33,19,18,12,14,8,340,412,503,806,981,682,32,23,5,14,15,10,340,398,744,577,655,1030,7,23,28,11,15,12,350,334,687,480,639,876,4,29,23,14,8,10,395,321,816,632,731,956,20,18,24,11,9,7,415,321,566,864,924,707,24,17,14,4,10,10,316,334,464,741,830,701,23,24,2,6,10,16,290,172,651,718,603,717,13,15,15,5,2,11,342,198,655,720,663,657,11,17,15,10,3,12,336,348,651,648,699,952,12,24,17,12,15,7,326,348,564,665,891,728,15,22,12,5,16,12,474,424,680,946,1116,569,23,20,14,3,12,11,448,424,929,751,585,1174,10,17,20,13,12,3,255,311,553,564,616,632,12,23,8,10,17,9,9 +134,112,632,671,584,645,4,15,3,4,11,7,231,333,683,642,617,1014,1,28,28,13,9,19,285,441,706,641,952,725,32,22,18,13,3,12,401,491,750,732,761,924,28,24,28,8,15,11,376,502,732,782,861,746,33,26,18,9,16,14,316,402,581,804,1002,724,32,20,5,13,9,10,304,426,798,569,692,1084,7,22,28,10,9,16,318,292,721,478,696,926,4,26,21,17,10,16,375,285,826,608,702,1008,20,15,22,10,15,9,439,345,578,876,953,737,26,28,14,5,16,10,332,288,466,737,865,743,23,25,0,11,10,16,310,182,663,704,652,765,13,14,15,12,10,11,288,158,671,696,704,699,11,14,15,11,9,18,268,330,677,630,732,996,12,21,15,9,3,13,282,332,650,671,946,772,17,21,10,10,4,12,496,390,706,952,1163,597,23,15,14,4,18,11,392,350,943,727,578,1220,10,14,20,10,18,7,285,343,549,546,561,656,12,28,10,15,17,15,9 +196,166,632,627,630,634,8,15,2,4,8,8,245,327,627,566,675,991,9,28,29,13,6,18,207,425,646,619,1032,714,28,22,21,13,6,13,329,415,732,712,811,901,20,30,33,8,10,8,282,422,716,754,923,733,29,30,21,9,11,15,194,302,569,788,1078,715,28,20,8,13,6,11,242,348,762,553,752,1061,15,26,29,10,6,13,292,262,697,458,774,909,12,24,26,17,5,17,425,261,806,562,746,989,14,13,27,10,10,14,317,313,594,796,1017,718,22,24,15,7,11,11,276,220,462,719,941,732,23,23,5,11,5,17,216,150,679,644,730,750,17,14,14,10,7,12,292,118,659,650,782,690,15,14,14,11,6,19,264,300,599,612,800,983,20,21,20,9,6,14,192,296,628,665,1024,759,23,19,15,6,7,9,328,332,710,940,1239,586,23,11,13,2,13,10,458,338,871,689,622,1205,14,14,23,8,13,8,295,349,569,478,615,633,10,30,9,13,12,16,9 +137,145,623,642,600,698,14,20,10,9,15,2,268,348,582,561,641,1023,19,17,27,12,13,14,306,394,667,612,1038,776,34,27,27,16,1,11,294,454,735,721,833,977,16,23,27,9,11,10,313,459,697,783,949,795,29,23,27,12,12,7,283,385,528,811,1080,755,28,23,18,14,5,9,289,393,695,582,720,1077,25,19,27,9,5,13,327,283,620,483,736,935,22,21,24,16,10,9,434,308,779,589,732,1029,22,18,25,11,11,10,390,312,587,837,1003,812,20,17,13,10,12,9,303,277,449,738,923,734,19,18,13,16,6,15,247,169,672,655,694,758,17,19,16,17,14,10,231,175,684,677,762,714,21,15,16,10,13,11,323,299,566,637,764,985,26,12,26,10,1,6,297,301,581,650,988,793,23,24,23,15,0,9,383,369,715,917,1215,668,19,18,15,9,14,8,399,375,842,712,592,1219,14,19,25,11,14,2,340,310,584,511,613,735,8,25,21,16,13,10,9 +178,220,533,758,670,690,1,19,27,6,15,7,173,365,608,645,677,1059,6,22,14,11,13,15,211,339,627,592,922,770,37,18,6,13,1,6,307,351,649,803,841,969,25,18,4,10,11,13,286,414,625,817,939,789,38,18,6,9,12,10,238,370,478,745,918,769,37,14,19,15,7,6,206,268,717,602,676,1129,12,22,4,8,5,8,292,250,646,575,592,971,9,24,3,15,8,10,361,305,787,727,810,1053,19,23,4,8,11,11,427,241,485,759,933,786,29,12,34,9,12,6,306,368,381,704,835,784,28,17,24,13,12,10,270,214,570,769,596,810,10,26,23,12,14,5,188,258,588,815,646,742,8,22,21,9,13,12,204,358,594,647,736,1037,17,19,11,7,1,11,272,370,537,542,824,813,20,21,14,4,0,8,448,422,615,845,1075,644,28,19,38,4,14,7,346,334,868,826,672,1265,5,26,4,6,14,3,323,329,484,653,723,707,17,18,26,11,15,11,9 +132,182,651,720,665,681,3,11,10,4,9,5,291,303,668,631,676,1030,2,28,21,11,7,17,279,361,677,638,981,755,33,22,17,13,5,10,287,399,771,793,828,940,27,22,29,10,13,11,312,408,741,817,906,774,34,24,17,9,14,10,266,350,572,811,1025,768,33,20,16,15,7,8,276,368,787,606,735,1100,10,24,23,8,7,14,340,342,714,517,735,946,7,30,22,13,8,12,409,265,809,667,773,1026,21,15,23,8,13,13,375,321,601,855,974,755,29,26,19,5,14,8,318,350,461,744,892,787,26,25,13,9,8,14,220,220,686,737,695,789,12,16,14,8,8,9,278,202,682,755,731,745,10,16,12,9,7,14,296,386,648,665,777,1032,15,25,16,9,5,9,248,390,641,676,979,810,20,19,19,2,6,6,394,422,737,953,1186,633,26,15,21,4,16,7,414,400,922,794,653,1242,9,14,19,10,16,5,341,387,572,589,656,672,13,30,1,9,15,13,9 +149,171,666,687,646,714,5,16,3,5,4,4,252,384,673,622,669,1083,0,29,28,10,4,14,268,408,706,619,1024,794,31,21,18,12,10,11,324,450,768,742,863,993,29,29,28,11,12,10,309,469,744,776,965,813,32,31,18,10,11,7,233,373,571,772,1050,793,31,25,5,14,10,9,233,349,786,547,730,1153,6,33,28,9,10,13,281,323,721,484,710,995,3,25,21,12,3,11,386,308,818,636,788,1077,19,16,20,9,8,12,342,310,638,828,1005,806,23,21,18,4,9,9,225,339,484,711,915,808,22,24,0,8,5,15,237,201,723,716,682,834,14,11,15,7,3,10,303,209,707,724,732,766,12,13,15,8,4,11,289,431,647,618,776,1061,11,28,13,10,10,6,249,433,640,631,958,837,14,18,10,3,11,7,383,395,758,918,1193,666,22,10,14,5,9,8,381,335,927,749,644,1289,11,15,20,11,9,4,290,426,613,586,675,725,13,31,16,8,12,12,9 +236,178,561,700,666,729,18,17,13,5,8,7,283,383,644,621,715,1070,19,14,28,12,4,15,269,401,659,594,1070,807,24,32,34,12,10,6,255,465,689,793,849,952,18,24,28,9,10,11,286,464,665,823,963,826,25,26,34,8,11,12,254,364,536,799,1116,812,24,28,21,14,10,6,268,370,765,606,788,1136,13,22,28,9,10,8,344,254,686,497,812,996,16,24,33,16,5,12,433,343,829,635,784,1076,36,17,34,9,10,13,397,303,501,829,1063,805,16,20,14,8,15,4,356,248,417,742,981,831,15,23,16,12,9,10,228,162,586,703,764,841,9,16,17,13,9,5,248,182,602,723,814,789,11,10,19,10,6,14,322,274,638,675,840,1080,8,15,29,8,10,13,286,274,599,616,1064,856,7,29,26,11,11,6,326,340,639,885,1281,681,15,15,14,5,13,5,394,378,904,772,660,1266,18,16,34,7,13,5,359,301,490,557,635,688,16,28,24,16,12,13,9 +121,171,589,693,655,684,0,16,20,14,8,5,274,346,602,632,670,1031,5,35,11,7,6,17,266,342,625,567,955,762,36,15,1,7,6,10,294,378,705,748,842,963,24,21,11,10,6,11,293,409,681,772,940,781,37,21,1,11,7,10,227,343,518,730,981,751,36,13,12,5,6,8,235,277,731,547,685,1091,11,29,11,10,6,14,293,259,656,490,639,943,8,19,4,3,5,12,408,280,781,642,799,1031,18,20,3,10,12,13,342,252,545,790,948,786,28,23,33,13,7,8,261,327,407,673,852,748,27,26,17,7,3,14,207,173,630,724,617,772,9,9,16,6,7,9,261,199,626,730,667,716,7,21,14,9,6,14,297,351,570,606,739,999,16,26,4,11,6,9,251,351,587,557,889,793,19,12,7,8,7,6,361,405,669,848,1122,644,27,18,31,14,9,7,395,323,846,753,657,1231,6,21,3,12,9,5,302,336,520,596,696,707,16,23,17,7,10,13,9 +178,178,591,675,614,637,2,12,16,5,3,5,225,335,644,620,627,1006,3,29,15,8,7,19,239,363,657,581,962,717,34,21,7,12,11,10,327,403,689,728,809,916,26,23,19,13,7,11,270,404,675,758,893,736,35,23,7,12,8,12,216,328,514,742,1006,716,34,19,8,14,11,8,208,298,747,531,692,1076,9,23,15,5,11,14,266,202,690,470,688,918,6,27,12,12,6,14,303,275,795,622,740,1000,20,14,13,5,13,11,381,283,547,816,949,737,26,25,21,8,6,8,244,284,421,683,861,733,25,24,13,12,6,14,254,184,632,700,646,757,11,17,12,11,4,9,308,146,626,710,700,691,9,17,12,6,5,16,238,282,624,590,736,984,14,24,10,6,11,11,254,282,577,585,938,760,17,18,9,5,12,8,422,390,659,874,1155,595,25,14,27,3,8,7,316,306,900,731,608,1212,8,15,9,7,10,5,281,321,528,544,633,658,14,29,11,12,13,13,9 +191,121,615,648,615,699,1,15,4,8,11,4,206,382,656,609,656,1040,4,26,35,11,9,18,250,468,695,644,1011,777,35,22,25,15,3,13,330,524,743,729,794,936,25,28,35,10,15,10,289,529,711,787,902,798,36,28,25,11,16,11,291,419,554,817,1057,782,35,22,12,15,9,11,263,427,771,582,731,1108,10,24,35,8,9,15,329,275,694,483,753,966,7,24,28,15,10,13,384,312,813,573,733,1044,19,15,27,8,15,8,468,358,563,861,1004,773,27,22,21,9,16,11,351,273,439,748,922,805,26,23,7,15,10,17,275,173,648,675,705,807,10,14,8,16,10,12,205,145,662,661,759,761,8,12,10,9,9,15,237,355,650,643,781,1054,15,19,20,7,3,10,317,355,623,698,1005,830,18,21,17,14,4,11,467,367,701,969,1222,651,26,13,7,8,18,10,365,341,916,708,611,1266,7,14,27,6,18,4,346,352,544,515,584,658,15,30,15,13,17,12,9 +182,176,640,611,637,653,8,22,4,10,8,7,299,315,663,574,680,1022,5,33,31,11,8,19,239,375,654,573,1039,733,28,15,21,11,6,12,331,393,736,694,818,932,24,23,31,14,12,9,346,390,716,718,932,752,29,23,21,15,13,14,224,298,543,742,1085,732,28,13,12,9,10,10,300,336,774,511,761,1092,11,25,31,14,6,12,344,276,715,426,781,934,8,17,24,7,7,16,489,267,798,544,753,1016,18,20,23,14,14,15,309,305,608,788,1024,751,24,23,21,9,13,10,282,254,470,673,946,747,25,26,7,3,7,16,178,178,693,640,739,773,17,13,12,2,7,11,310,140,677,632,791,705,15,19,12,13,6,18,318,308,627,572,805,1000,16,22,18,15,6,13,208,308,610,629,1029,776,19,12,17,8,7,8,348,374,724,900,1222,609,25,18,11,10,15,9,490,378,905,675,629,1228,14,21,23,16,15,7,343,335,583,490,630,672,12,23,11,11,14,15,9 +233,435,876,871,609,631,20,27,17,14,16,14,138,294,609,782,562,694,15,18,14,7,14,6,150,336,810,661,717,613,20,6,4,7,4,9,332,306,852,862,682,790,22,16,14,10,8,10,287,301,832,838,770,588,17,16,4,9,9,7,143,255,701,716,747,532,16,6,9,9,4,9,153,265,698,683,521,742,9,10,14,8,4,9,183,255,673,700,507,608,12,8,7,3,11,11,320,268,714,856,721,726,38,21,6,8,8,14,284,264,880,782,724,761,8,22,38,15,9,9,177,251,726,683,614,509,7,9,14,13,9,5,295,361,965,936,507,589,11,28,13,12,15,10,301,355,941,940,577,549,13,34,11,9,16,9,193,97,489,690,555,638,4,11,1,7,4,8,165,93,698,503,653,562,1,3,4,8,3,7,341,393,942,790,882,637,7,27,28,14,11,8,359,391,737,927,605,880,26,32,6,6,11,14,262,222,871,834,700,764,20,8,22,7,10,12,9 +170,142,660,610,674,698,10,20,11,3,15,3,203,355,603,573,717,1067,13,25,28,10,13,17,231,377,660,530,1076,778,26,19,20,10,5,10,309,441,774,693,855,977,16,27,28,11,7,11,282,444,744,713,967,797,27,27,20,10,8,10,228,338,571,701,1122,777,26,19,19,12,5,8,232,362,730,498,798,1137,19,21,28,7,5,14,260,278,667,405,818,979,16,19,21,14,12,12,393,287,758,543,790,1061,14,16,20,7,7,11,385,285,616,743,1061,790,22,23,20,6,8,8,266,270,468,630,983,792,23,18,14,10,10,14,250,150,701,641,776,818,19,19,15,9,14,9,232,144,697,631,828,750,17,17,17,8,15,14,260,348,571,561,842,1045,24,18,25,8,5,9,264,346,632,582,1066,821,27,20,24,3,4,8,376,336,748,851,1251,650,23,16,14,3,10,7,390,358,847,680,666,1273,16,17,20,9,10,3,305,385,591,489,667,709,10,27,14,10,11,11,9 +226,166,641,607,636,683,7,18,8,9,4,9,357,391,652,572,679,1052,8,29,33,12,6,19,295,363,665,539,1056,763,29,21,23,12,10,10,261,437,743,688,843,962,21,27,33,9,8,11,304,446,729,722,957,782,30,27,23,10,9,14,216,338,560,714,1100,762,29,19,16,10,10,8,304,346,779,505,758,1122,14,27,33,13,10,14,340,252,708,392,776,964,11,21,26,10,5,16,455,335,811,534,760,1046,15,14,25,9,12,17,293,255,599,784,1031,775,31,19,19,8,5,8,300,224,457,643,953,777,30,22,11,8,5,14,198,132,684,638,734,803,16,9,12,7,5,9,334,164,670,622,794,735,14,15,14,10,6,18,388,296,604,574,802,1030,19,24,24,12,10,13,242,294,627,587,1026,806,22,18,21,5,11,6,294,296,717,858,1247,635,30,16,9,9,7,7,446,370,884,671,628,1258,13,15,25,11,9,9,377,343,566,480,635,694,19,27,19,8,12,17,9 +211,227,688,606,657,722,27,17,2,6,17,6,332,322,583,559,698,889,22,32,33,11,15,8,330,352,642,592,1095,766,25,16,23,11,3,11,370,374,774,701,890,953,15,18,35,16,9,10,307,373,748,743,1006,787,10,18,23,15,10,3,307,339,567,767,1137,705,9,14,10,11,3,9,327,401,716,534,777,905,16,24,33,14,3,13,389,417,659,435,793,825,19,22,28,9,10,11,484,274,752,527,789,933,37,19,29,14,9,12,410,296,668,797,1060,838,1,24,19,3,10,9,307,289,514,696,980,598,0,27,7,5,8,13,179,251,753,623,751,668,18,16,10,6,16,10,349,251,723,615,819,612,20,20,10,13,15,9,355,381,521,599,821,839,11,25,22,15,3,0,305,359,620,650,1045,749,8,15,17,12,2,7,357,349,780,917,1272,712,0,19,9,6,12,8,507,477,811,668,649,1073,33,20,25,16,12,6,376,352,645,459,668,745,13,24,13,13,11,12,9 +167,105,598,600,594,654,2,17,0,8,11,7,210,374,635,555,637,1023,3,26,31,11,9,19,218,426,650,586,1032,734,34,22,21,15,3,12,360,490,708,685,827,933,26,28,33,10,15,9,301,491,686,719,943,753,35,28,21,11,16,14,251,393,541,753,1074,733,34,20,8,15,9,10,241,385,754,518,714,1093,9,22,31,8,9,14,311,265,679,429,736,935,6,22,26,15,10,16,370,304,788,529,726,1017,20,13,27,8,15,11,426,320,554,781,997,746,26,26,17,9,16,10,297,249,428,684,917,748,25,21,5,15,10,16,247,145,639,621,692,774,11,16,12,16,10,11,257,135,639,617,756,706,9,14,12,9,9,18,219,321,631,577,762,1001,14,19,20,7,3,13,245,321,600,636,986,777,17,19,15,14,4,8,451,341,678,909,1209,606,25,15,11,8,18,9,385,335,897,660,586,1229,8,14,23,6,18,7,324,332,533,461,605,667,14,28,11,13,17,15,9 +154,240,705,699,679,733,20,22,14,4,14,3,211,265,680,646,720,1060,17,23,25,11,12,11,251,343,709,617,1023,811,16,21,33,11,0,12,307,319,825,786,788,928,26,19,23,10,12,9,324,336,793,816,890,832,31,19,33,11,13,4,284,304,624,806,1075,816,32,17,22,13,6,10,266,348,817,601,807,1124,25,17,23,10,6,12,300,362,748,488,831,994,22,21,30,15,7,10,419,257,831,632,767,1072,4,22,31,8,12,11,407,287,657,846,1036,801,40,21,9,7,13,10,334,322,515,733,958,839,41,20,17,11,7,16,296,230,742,716,787,839,29,23,20,10,13,11,196,218,728,720,815,795,27,19,20,9,12,8,254,352,628,670,849,1088,30,16,30,9,0,3,250,350,693,639,1069,864,35,22,27,6,1,8,420,394,791,912,1198,685,41,20,19,4,15,9,402,454,906,767,671,1268,26,23,31,8,15,3,319,333,622,556,646,654,28,23,25,11,14,11,9 +176,218,687,737,607,658,12,16,17,4,15,5,179,289,628,672,616,959,11,29,14,9,13,19,223,337,697,593,929,732,28,21,4,15,5,10,275,339,783,786,806,935,18,25,14,12,7,11,218,342,763,776,894,751,25,27,4,11,8,12,164,254,582,760,957,701,24,21,15,17,5,8,152,238,745,597,655,1001,17,23,14,6,5,14,224,198,674,532,617,871,14,25,7,13,12,14,305,235,811,684,751,971,24,16,6,8,7,11,329,231,651,826,920,782,16,27,28,7,8,8,220,238,497,689,820,662,15,24,14,11,10,14,246,174,736,772,591,682,15,15,13,10,14,9,242,154,728,772,639,650,19,13,11,7,15,16,228,232,600,618,701,909,22,24,7,7,5,11,248,236,645,591,867,739,21,18,10,8,4,8,350,356,765,868,1098,634,15,14,28,2,10,7,310,318,878,795,605,1149,18,15,6,8,10,5,293,305,640,644,640,709,4,29,12,15,11,13,9 +202,138,547,660,659,690,1,21,17,3,15,5,295,325,588,611,700,1059,6,24,26,10,13,17,261,453,619,538,1097,770,37,16,20,14,1,14,329,467,667,735,892,969,25,24,24,11,11,7,342,480,643,743,1008,789,38,24,20,10,12,12,268,380,486,713,1139,769,37,14,25,16,5,12,304,396,709,536,779,1129,12,20,24,7,5,12,350,268,630,447,795,971,9,18,17,14,8,14,487,271,783,595,791,1053,19,19,18,7,11,13,407,371,495,765,1062,782,29,22,20,6,12,12,346,304,367,644,982,784,28,19,20,10,10,18,202,182,580,691,753,810,10,20,21,9,14,13,258,146,590,683,821,742,8,18,21,8,13,16,320,334,576,591,823,1037,17,17,25,8,1,11,264,338,557,576,1047,813,20,19,28,5,0,10,378,428,627,851,1274,642,28,17,18,1,14,11,468,322,844,728,651,1265,5,20,18,9,14,5,349,351,482,537,670,701,17,24,16,12,15,13,9 +156,182,631,683,567,683,6,12,13,8,18,4,249,341,636,622,608,974,1,23,26,11,14,10,251,333,683,579,1005,751,30,23,24,15,4,9,321,367,729,756,800,906,30,27,18,10,8,12,282,398,709,806,916,778,31,27,24,11,9,3,218,304,528,768,1047,740,30,21,19,15,4,7,224,280,751,599,687,1030,5,25,18,8,4,11,284,274,684,492,705,900,2,23,21,15,11,11,369,273,787,626,699,992,18,12,22,8,8,12,333,243,595,798,970,781,24,21,16,9,9,7,268,276,441,695,890,725,21,24,14,15,9,13,274,148,680,704,661,735,15,17,25,16,15,8,306,164,678,714,729,695,13,17,25,9,16,9,264,340,594,656,733,974,10,18,29,7,4,2,234,340,597,615,957,778,15,20,24,14,3,7,370,362,711,888,1182,653,21,12,24,8,11,6,386,344,882,745,559,1160,12,13,22,8,11,4,251,349,566,558,578,670,14,31,16,15,12,12,9 +140,380,734,804,632,687,21,26,21,6,16,7,173,219,695,713,675,952,18,17,16,11,14,7,207,243,724,714,956,737,15,21,36,11,2,12,371,159,858,889,719,778,25,15,26,10,10,9,298,182,828,947,813,710,30,5,36,11,11,10,208,258,663,907,1010,790,31,17,25,13,4,14,212,254,836,732,760,1008,26,9,26,12,4,14,246,342,775,619,788,898,23,19,33,13,9,10,337,235,820,751,712,968,3,32,34,8,10,11,325,239,684,847,989,717,39,15,4,5,11,10,226,346,548,844,905,813,40,20,22,9,7,16,268,302,769,803,740,773,30,35,27,8,15,11,302,304,745,839,756,769,28,29,33,9,14,10,196,310,637,799,804,1026,31,16,37,11,2,11,192,314,730,712,1024,816,36,22,32,6,1,14,382,458,816,993,1147,639,40,32,32,6,13,11,388,460,913,876,624,1110,27,31,34,10,13,7,221,261,641,651,569,554,27,13,24,11,12,11,9 +131,153,586,637,627,680,0,19,12,1,16,4,294,382,595,594,668,1003,5,24,27,10,14,14,340,376,650,545,1065,754,36,18,21,14,2,9,360,438,696,718,860,957,24,20,27,11,10,12,317,471,670,738,976,775,37,20,21,10,11,7,347,417,497,716,1107,735,36,14,20,16,4,7,347,409,708,523,747,1065,11,18,27,9,4,15,385,375,637,426,763,915,8,20,20,14,9,9,454,320,766,572,759,1009,18,19,19,9,10,10,442,312,542,756,1030,790,28,22,19,4,11,7,347,369,392,647,950,722,27,21,15,8,7,13,219,207,627,666,721,746,9,20,16,9,15,8,285,223,637,660,789,690,7,20,18,8,14,11,327,425,573,584,791,973,16,17,26,10,2,6,323,423,562,583,1015,775,19,21,25,7,1,9,421,427,668,858,1242,646,27,19,15,1,13,8,463,413,849,705,619,1201,6,20,19,11,13,2,336,390,529,514,638,713,16,24,15,14,12,10,9 +193,141,562,707,641,672,3,16,17,5,10,10,262,384,655,660,648,1035,8,27,14,10,8,20,268,376,672,569,917,752,39,21,4,14,4,11,320,432,676,760,828,945,27,23,14,11,16,12,327,461,652,774,890,773,40,25,4,10,17,17,309,405,517,742,963,751,39,19,9,16,10,9,283,367,754,557,671,1105,14,21,14,7,10,17,355,265,687,500,629,947,11,25,7,14,11,19,406,316,824,652,779,1029,21,16,6,7,16,12,470,274,514,820,926,760,31,27,34,8,17,9,341,345,438,681,824,770,30,24,14,12,11,15,261,183,599,742,607,786,12,15,13,11,9,10,271,163,615,740,651,726,10,15,11,8,8,21,265,333,657,612,719,1023,19,20,1,6,4,14,303,331,572,567,879,799,22,22,4,5,5,7,475,417,642,852,1106,626,30,16,28,3,19,8,375,337,927,769,643,1245,3,15,6,7,19,10,350,330,503,610,676,683,19,27,18,12,16,18,9 +119,177,656,672,645,674,11,16,12,4,15,4,284,274,629,649,658,939,8,29,23,7,13,14,288,380,658,588,999,734,25,21,13,15,1,13,294,372,740,739,856,937,21,21,23,14,11,8,259,381,722,763,946,751,26,23,13,13,12,7,255,317,535,763,1033,691,25,19,16,17,5,11,269,371,738,546,711,977,14,23,23,8,5,11,327,317,677,459,691,853,11,25,16,11,8,11,406,218,788,611,789,957,25,16,15,8,11,12,372,298,636,839,982,804,17,23,29,5,12,11,281,289,482,690,886,636,16,24,15,9,6,17,171,215,721,709,659,658,14,15,6,8,14,12,275,163,707,699,715,628,18,17,4,7,13,11,303,297,571,607,755,885,19,24,8,9,1,6,271,295,600,606,941,731,20,18,11,4,0,9,357,375,742,887,1172,656,16,18,19,4,14,10,417,391,867,732,643,1123,17,15,15,10,14,4,318,358,627,581,674,735,7,25,9,11,13,12,9 +202,202,684,626,670,648,19,14,1,6,13,9,183,303,687,585,689,1017,14,19,32,11,11,19,223,367,688,590,930,728,17,25,22,11,1,12,301,357,798,697,753,927,27,23,32,10,13,11,328,382,778,749,835,747,32,23,22,9,14,16,286,290,625,759,980,727,33,21,9,13,7,10,234,352,828,532,770,1087,22,21,32,8,7,16,306,338,753,435,748,929,19,21,25,15,8,18,333,265,818,565,752,1011,5,14,24,8,13,11,453,285,634,821,979,740,41,23,18,9,14,10,324,240,506,690,883,742,38,26,4,13,8,16,314,178,719,659,718,768,28,15,11,12,12,11,232,190,705,653,722,700,24,15,11,9,11,20,216,296,645,597,800,995,27,14,17,7,1,15,288,296,694,624,986,771,32,28,14,4,2,8,482,314,762,907,1127,600,38,16,10,4,16,9,302,454,919,688,662,1223,25,13,24,6,16,9,327,311,593,521,613,659,27,27,12,11,15,17,9 +98,124,654,657,613,660,3,13,2,8,1,5,309,309,675,626,630,1023,2,30,29,13,3,19,353,429,702,617,981,740,33,20,19,13,13,12,369,445,760,718,812,933,27,22,29,16,11,9,340,444,744,770,896,761,34,22,19,17,10,12,320,396,593,772,1025,739,33,18,6,11,13,10,322,414,798,545,699,1093,8,30,29,16,13,12,364,330,725,462,705,935,5,26,22,9,6,14,407,275,840,594,737,1017,21,17,21,16,9,11,359,357,612,856,962,746,25,20,15,7,8,10,288,348,478,707,878,758,24,27,1,1,8,16,250,208,697,688,663,774,12,10,14,0,2,11,338,154,691,682,719,714,10,16,14,15,3,16,340,366,663,616,739,1011,13,29,14,17,13,11,328,368,658,657,955,787,16,17,11,10,14,8,432,440,732,936,1174,612,24,15,13,8,10,9,422,382,933,713,605,1233,9,16,21,18,10,5,249,353,593,544,620,665,13,28,11,11,15,13,9 +183,267,703,757,633,644,19,14,20,6,8,3,168,326,776,676,678,991,14,27,19,11,10,15,180,248,737,681,961,714,17,17,29,11,6,10,364,284,805,834,734,901,27,19,27,10,10,13,301,299,785,874,848,729,32,19,29,9,11,8,207,249,642,856,1013,731,33,15,22,13,12,8,181,309,881,653,763,1061,18,21,27,8,6,12,237,377,824,550,791,905,15,25,26,11,7,10,326,310,895,702,713,989,5,18,27,8,14,11,360,212,667,850,992,724,37,25,11,7,11,8,237,235,573,787,908,746,34,24,19,11,13,14,261,199,752,772,743,756,28,19,24,10,7,9,281,283,728,790,759,704,20,19,30,9,8,12,185,303,734,720,807,989,23,20,34,7,6,9,185,301,697,701,1027,769,28,20,29,0,7,8,417,323,785,980,1184,598,34,18,31,6,13,7,377,501,1008,827,625,1197,25,19,27,8,13,3,266,302,624,612,566,641,27,27,17,7,14,11,9 +159,169,635,679,632,611,2,9,2,4,3,10,284,290,698,612,653,978,3,30,29,9,1,20,290,404,697,645,972,691,34,20,21,11,11,11,352,400,745,762,807,888,26,22,33,12,13,12,301,417,727,798,893,712,35,22,21,11,12,17,281,337,598,818,1022,690,34,18,8,13,11,9,299,377,827,587,718,1048,9,26,29,6,11,17,351,301,750,488,708,890,6,30,26,13,6,19,402,264,873,624,750,972,20,15,27,6,11,12,358,330,591,834,977,701,26,26,15,7,12,9,321,279,493,747,885,711,25,27,5,11,6,15,269,179,676,698,670,729,11,16,14,10,4,10,339,155,668,712,716,667,9,16,14,7,1,21,289,293,676,652,760,962,14,27,20,7,11,16,255,299,653,685,958,738,17,17,15,2,12,9,387,381,713,962,1179,563,25,15,13,4,14,8,425,395,946,751,626,1184,8,16,23,8,14,10,276,304,570,540,607,620,14,30,9,9,13,18,9 +128,252,740,611,660,673,23,16,3,4,12,7,263,363,703,598,703,1042,18,37,34,9,10,19,319,379,738,615,966,753,13,7,24,9,2,10,353,359,864,690,727,952,23,9,34,12,14,11,358,378,840,756,817,774,28,15,24,9,15,14,348,354,679,784,1022,752,29,5,11,11,8,8,344,428,844,553,790,1112,26,29,34,12,8,16,366,444,785,464,818,954,23,19,27,13,9,16,411,355,838,526,730,1036,5,30,26,8,14,9,449,325,684,838,1005,765,37,31,20,5,15,8,384,298,562,713,921,771,38,20,6,9,9,14,320,218,769,640,770,793,32,17,9,8,11,9,268,284,747,614,780,727,28,29,9,7,10,18,310,368,643,618,832,1024,31,30,19,11,2,13,314,346,746,689,1048,800,36,10,16,10,3,10,478,398,814,952,1149,625,38,28,8,4,17,9,398,562,921,661,650,1248,29,29,26,10,17,7,313,277,645,484,587,684,25,15,14,13,16,15,9 +199,139,609,624,592,635,9,16,3,6,13,5,184,324,656,589,623,1004,4,23,28,9,11,19,192,414,671,592,972,715,27,21,18,15,1,12,380,440,693,683,789,914,33,25,28,12,13,9,307,437,679,741,891,734,28,25,18,11,14,12,233,329,514,753,1012,714,27,19,9,17,7,10,223,355,751,518,698,1074,2,21,28,6,7,12,289,237,696,437,698,916,1,21,21,13,8,14,354,280,809,567,710,998,15,14,20,6,13,11,400,312,589,811,955,733,21,23,18,9,14,10,291,249,463,692,871,729,18,22,4,13,8,16,303,151,674,661,660,755,16,15,15,14,12,11,283,103,662,655,708,687,12,15,15,7,11,16,187,309,620,583,740,982,7,16,17,5,1,11,211,309,575,604,948,758,12,22,14,12,2,8,451,365,693,893,1163,591,18,16,14,6,16,9,389,349,910,680,584,1210,15,15,20,6,16,5,274,344,558,517,587,654,17,27,12,15,15,13,9 +84,202,664,696,646,656,11,16,7,13,6,8,277,305,717,627,681,1021,6,35,26,8,4,18,301,345,710,624,960,736,25,15,16,8,8,9,333,361,780,773,761,931,25,15,28,11,10,14,302,376,762,791,863,755,30,17,16,12,11,15,280,324,631,793,1006,737,31,13,15,6,8,7,290,352,852,574,766,1091,14,31,26,13,8,17,334,364,775,499,762,933,11,25,21,4,5,17,395,307,868,639,738,1015,13,22,22,11,10,10,349,293,608,821,993,744,33,23,24,12,11,7,288,284,510,724,903,754,30,30,12,6,5,13,228,188,693,719,722,772,20,13,17,5,5,8,302,222,685,727,748,712,18,23,15,10,4,19,290,312,679,639,802,1005,19,32,19,12,8,14,270,308,690,668,1006,781,24,12,22,7,9,9,388,376,734,945,1179,608,30,22,16,13,13,8,416,470,953,768,640,1227,17,21,18,13,13,8,275,291,577,567,591,663,19,25,6,8,14,16,9 +202,166,589,660,594,662,8,15,4,2,5,7,277,317,612,613,627,1009,3,30,27,13,3,17,235,419,659,604,1004,740,28,20,17,11,11,14,337,427,681,721,819,941,32,26,27,8,11,7,332,432,661,769,929,759,29,26,17,9,10,10,190,328,492,763,1046,729,28,18,4,13,11,12,254,334,715,538,696,1069,3,26,27,10,11,10,300,234,650,453,702,921,0,24,20,17,4,14,433,257,779,605,730,1009,16,15,21,10,7,15,303,317,565,819,975,764,20,24,13,5,12,12,250,258,423,706,891,726,19,23,1,9,6,18,230,154,650,689,660,750,17,12,14,10,6,13,346,124,646,693,728,694,13,14,16,11,3,14,296,308,590,609,742,977,8,27,14,9,11,9,192,306,561,618,954,771,11,17,9,8,12,10,352,372,677,905,1181,622,19,13,15,2,10,11,454,322,872,720,588,1209,14,16,19,10,10,7,323,357,540,547,611,687,16,28,11,15,13,15,9 +111,189,616,733,610,651,5,10,15,12,3,7,220,296,709,682,609,1018,0,37,16,9,3,19,274,348,692,565,852,731,31,13,6,9,11,10,360,366,724,774,773,928,29,15,16,10,13,13,349,379,704,790,809,752,32,21,6,9,14,14,303,361,563,724,902,730,31,11,7,7,11,10,281,327,802,571,612,1088,6,35,16,8,11,18,307,289,743,536,588,930,3,25,9,5,6,16,372,264,850,688,734,1012,19,24,8,8,11,9,410,308,572,798,863,745,25,25,30,11,12,10,309,367,486,673,767,751,22,26,12,9,6,14,281,241,657,770,564,769,14,11,11,8,2,9,261,169,653,776,608,707,12,23,9,9,1,18,259,311,699,620,660,1002,11,34,1,9,11,13,255,313,618,569,838,778,16,10,2,6,12,12,467,479,694,858,1059,607,22,22,26,12,14,11,367,355,965,791,610,1224,11,23,8,10,14,7,286,272,543,644,623,668,13,21,18,7,15,15,9 +190,112,566,681,607,705,5,17,5,6,10,6,245,407,675,612,648,1060,10,18,26,13,8,16,277,385,668,653,1003,785,37,28,24,11,6,7,333,445,690,750,794,956,25,20,26,8,18,16,338,490,668,806,906,804,38,22,24,7,19,11,314,442,545,822,1049,786,37,24,11,13,12,7,302,386,784,587,725,1128,12,20,26,10,12,11,356,302,713,512,745,980,13,24,27,17,13,13,425,347,846,632,725,1060,23,19,26,10,18,10,469,293,510,854,996,789,29,18,12,9,19,7,370,302,448,769,914,803,28,23,6,13,13,11,306,154,595,698,697,821,10,18,17,12,9,6,250,206,613,720,751,761,8,16,17,11,8,15,274,348,663,648,773,1054,17,13,19,9,6,12,318,338,600,693,997,830,20,29,16,10,7,9,484,392,644,964,1214,657,28,17,16,4,21,8,404,390,931,743,601,1276,5,18,26,8,21,4,373,327,497,562,588,682,19,26,14,15,14,12,9 +162,206,647,752,638,679,2,13,21,6,7,6,197,335,678,679,653,1026,3,32,10,11,9,16,195,337,699,622,930,757,34,18,0,13,7,11,313,355,741,797,825,958,26,24,10,10,7,10,276,382,727,823,923,776,35,24,0,9,8,9,176,306,552,777,952,746,34,18,13,13,11,9,174,252,775,594,668,1086,9,26,10,8,7,13,240,232,718,557,612,938,6,26,3,11,6,13,331,273,813,709,782,1026,20,19,2,8,13,14,323,257,615,833,931,781,26,22,36,7,8,9,226,292,469,724,833,743,25,21,18,11,10,15,226,164,700,781,592,767,11,18,17,10,6,10,282,188,684,797,642,711,9,14,15,9,7,13,224,318,650,653,722,994,14,25,5,7,7,8,196,320,623,600,860,788,17,15,8,0,8,7,370,394,725,897,1095,639,25,13,32,6,10,8,352,326,934,812,640,1226,8,18,2,8,10,6,283,307,594,659,679,702,14,26,20,7,11,14,9 +199,167,643,620,585,676,14,19,2,6,12,5,208,320,606,581,628,961,9,26,33,9,10,13,168,406,675,566,1023,736,22,20,23,15,2,10,328,430,735,697,818,941,28,26,33,12,12,11,313,417,711,725,934,757,23,26,23,11,13,6,189,327,528,735,1065,705,22,18,10,17,8,8,203,331,719,508,705,1009,5,20,33,6,6,14,265,265,656,421,725,875,6,20,26,13,7,12,390,262,775,557,717,973,22,15,25,6,14,13,356,292,617,791,988,794,14,26,19,9,13,8,281,251,463,666,908,670,13,21,5,13,7,14,239,175,702,653,681,690,11,18,10,12,11,9,233,147,698,645,747,648,13,16,10,7,10,10,219,307,568,575,753,921,4,19,18,5,2,5,183,311,591,608,977,747,5,19,15,10,3,6,393,333,731,887,1200,650,13,17,9,4,15,7,407,339,854,682,577,1151,20,16,25,6,15,5,324,390,602,509,596,723,20,26,13,17,16,13,9 +181,101,619,588,653,718,5,20,6,7,6,5,318,396,604,565,684,1015,6,31,37,8,6,17,308,410,631,550,1061,786,31,19,27,10,8,12,328,490,719,665,878,987,23,27,37,13,10,9,297,491,697,703,986,805,32,27,27,12,11,10,269,397,518,723,1099,755,31,19,14,12,8,10,287,387,729,494,755,1055,12,27,37,11,8,12,347,321,662,381,755,929,9,19,30,10,5,12,442,318,757,517,789,1027,17,16,29,11,12,13,392,292,587,795,1034,834,23,21,23,6,7,10,271,299,433,652,948,716,22,22,9,6,3,16,171,177,672,625,719,736,14,13,10,5,5,11,309,183,654,605,781,698,12,17,12,10,4,14,339,381,568,559,799,963,17,22,22,12,8,9,287,383,583,592,1007,799,20,16,19,5,9,8,375,329,705,863,1234,688,22,16,5,7,9,9,439,357,850,650,647,1203,11,17,29,13,9,5,340,418,562,483,670,759,11,27,17,10,10,13,9 +163,137,676,647,645,656,12,18,2,5,3,5,230,328,741,612,662,1025,7,31,33,8,7,19,248,410,728,631,961,736,24,19,23,8,11,12,368,422,776,720,800,935,28,25,33,13,11,9,319,433,758,776,884,755,31,25,23,10,12,12,251,347,603,792,993,735,32,19,10,10,11,10,251,375,838,557,733,1095,9,27,33,9,11,12,307,315,779,466,713,937,6,21,26,12,6,14,388,286,874,582,753,1019,12,16,25,7,13,11,398,316,644,852,972,754,28,21,19,6,12,10,261,263,528,729,884,752,25,24,5,10,8,16,227,151,729,676,687,776,21,13,10,9,2,11,283,175,717,670,711,708,17,15,10,6,5,16,247,333,703,622,771,1005,14,24,18,8,11,11,237,333,664,669,961,781,19,16,15,5,12,8,447,363,760,950,1158,612,25,16,9,5,14,9,399,403,983,701,637,1231,18,17,25,9,14,5,318,352,611,536,632,675,20,27,13,12,15,13,9 +149,125,621,636,637,625,2,14,3,8,2,6,350,376,694,627,674,988,3,29,34,13,4,18,368,438,707,630,991,705,34,21,24,13,16,13,368,478,713,715,806,904,26,21,34,16,14,8,337,485,699,765,906,724,35,25,24,17,15,13,343,413,544,797,1041,698,34,19,11,11,16,11,369,433,779,562,749,1058,9,31,34,16,16,13,415,345,726,471,747,900,6,23,27,9,9,15,450,340,831,559,747,982,20,16,26,16,10,10,390,350,589,853,1002,729,26,17,20,7,9,11,311,307,491,728,914,713,25,28,6,1,11,17,205,189,674,667,709,739,11,5,9,0,3,12,373,189,666,647,747,671,9,19,9,15,4,17,373,361,680,623,789,966,14,30,19,17,16,12,337,361,603,680,997,742,17,18,16,10,17,9,421,399,697,955,1210,587,25,20,8,8,11,10,467,433,964,690,633,1194,8,15,26,18,11,6,292,302,566,521,600,652,14,25,14,11,16,14,9 +170,206,568,687,633,681,2,20,16,9,4,4,351,425,667,622,682,968,7,35,19,12,8,12,345,395,678,647,1051,739,38,15,39,12,14,11,381,403,684,780,842,828,26,19,35,17,12,10,356,420,660,838,958,744,39,23,39,16,13,7,342,432,521,840,1095,772,38,15,26,12,16,9,350,396,764,627,755,1028,13,29,35,15,14,13,402,334,697,508,779,910,10,21,42,8,7,11,513,383,832,610,755,990,20,22,43,15,14,12,385,331,518,846,1030,729,30,23,5,6,13,9,312,370,450,765,950,795,29,26,23,8,13,15,196,236,603,696,731,773,11,11,24,9,3,10,338,240,621,698,783,751,9,21,24,14,6,11,368,326,669,698,807,1026,18,26,38,16,14,8,312,326,578,671,1031,810,21,12,33,15,15,9,388,494,648,946,1248,641,29,22,23,9,15,8,524,396,939,751,627,1172,4,21,41,17,15,4,355,269,511,530,620,582,18,23,15,10,14,12,9 +132,422,707,740,595,659,21,28,11,8,6,9,223,329,762,655,628,934,18,25,22,9,10,11,221,293,667,730,909,707,15,19,34,7,12,6,349,255,837,831,682,804,27,7,38,10,10,5,342,250,809,897,794,716,30,3,34,11,11,12,226,332,666,921,957,762,31,15,21,7,14,12,220,310,893,696,729,996,26,17,38,14,12,8,270,374,816,577,753,874,23,27,39,9,9,12,397,389,841,675,651,954,17,40,40,10,16,13,309,227,645,869,930,687,31,23,8,5,11,4,240,332,545,846,846,791,28,28,18,7,11,10,238,314,730,733,705,743,16,29,21,6,5,5,282,416,700,763,701,747,16,31,21,9,8,14,258,236,716,757,755,996,21,24,33,13,12,13,214,234,735,736,969,786,22,22,28,14,13,12,368,440,785,1017,1134,609,28,40,20,6,13,9,438,526,994,808,573,1150,27,39,36,12,13,7,267,189,598,583,510,542,15,11,12,13,12,13,9 +120,228,723,671,650,679,22,20,1,7,13,3,209,317,724,602,693,1012,17,31,32,10,11,17,257,335,735,631,974,757,14,19,24,10,1,12,359,337,839,762,737,894,24,19,36,11,13,11,306,358,823,794,833,778,29,19,24,10,14,10,278,308,676,800,1028,762,30,17,11,12,7,10,264,354,867,577,780,1078,23,23,32,11,7,16,292,378,798,474,808,940,20,21,29,12,8,12,323,283,867,610,728,1018,4,18,30,7,13,9,423,273,669,810,1007,747,38,21,18,6,14,10,310,266,555,731,923,785,39,26,8,10,8,16,262,198,754,690,760,785,31,13,11,9,12,11,260,240,730,698,774,741,25,21,11,8,11,14,242,318,670,646,822,1034,28,24,23,10,1,9,270,300,745,673,1042,810,33,16,18,5,2,10,452,344,795,946,1175,631,39,22,10,7,16,9,348,486,944,747,640,1240,28,17,26,9,16,3,273,301,630,528,581,608,26,21,12,10,15,11,9 +103,409,789,734,701,706,22,24,22,9,15,7,180,268,738,637,732,993,17,29,23,12,13,7,252,252,729,644,955,768,14,15,37,12,1,10,338,158,909,827,712,837,24,13,27,9,11,11,283,221,879,845,798,767,29,9,37,8,12,6,247,299,710,831,1015,805,30,13,32,10,5,12,245,331,881,632,835,1053,25,21,27,15,5,12,279,423,824,531,861,935,22,27,34,14,8,8,348,308,835,673,739,1015,4,34,35,9,11,9,362,220,745,813,986,750,38,23,3,8,12,8,291,349,599,758,920,828,39,28,29,10,6,14,283,311,830,741,813,800,31,25,32,9,14,9,243,353,794,761,799,784,27,27,32,10,13,6,241,367,654,697,855,1055,30,22,42,14,1,7,253,353,777,658,1063,839,35,16,39,9,0,12,403,427,875,935,1130,662,39,34,31,9,14,9,381,537,940,812,675,1161,28,33,35,11,14,7,242,308,700,583,612,587,26,15,23,12,13,9,9 +207,151,652,652,647,665,3,18,3,5,10,7,266,380,707,629,692,1034,2,31,34,12,8,19,232,430,720,632,1031,745,33,19,24,14,4,10,316,482,754,735,812,944,27,27,34,9,16,11,287,503,740,785,926,764,34,27,24,10,17,14,235,369,593,805,1079,744,33,21,11,14,10,8,241,411,824,574,771,1104,8,23,34,9,10,16,323,283,759,469,795,946,5,21,27,16,11,16,398,330,860,579,755,1028,21,16,26,9,16,13,396,318,608,849,1026,757,25,27,20,8,17,8,297,231,494,734,950,759,24,22,6,12,11,14,207,151,693,683,751,785,12,17,9,11,9,9,303,185,681,667,795,717,10,15,9,10,8,18,269,313,683,641,819,1012,13,24,19,8,4,13,237,309,652,686,1043,788,16,16,16,9,5,6,403,307,722,955,1236,617,24,14,8,3,19,7,407,361,955,712,639,1240,9,17,26,7,19,7,366,368,587,529,626,676,13,29,14,16,16,15,9 +171,335,638,718,582,656,11,25,16,4,16,10,226,236,601,657,611,927,6,10,19,11,12,4,320,266,686,558,988,716,25,30,17,13,6,13,398,248,728,781,805,919,27,22,15,10,6,14,337,279,708,801,913,735,26,12,17,9,7,7,279,293,523,733,1022,677,25,26,18,15,6,15,265,301,726,600,684,991,8,10,15,8,6,11,231,353,663,519,682,841,5,12,14,15,13,1,280,242,780,669,716,943,21,25,15,8,6,8,394,272,612,759,961,774,17,12,23,7,7,15,311,361,458,668,875,648,16,17,13,11,11,9,369,275,697,741,646,672,12,30,22,10,15,14,293,263,695,757,704,614,16,20,18,9,14,1,303,377,549,649,728,899,13,9,22,7,6,10,303,377,588,598,932,721,16,27,23,8,5,17,441,465,722,869,1161,628,16,27,27,2,13,16,365,441,839,780,574,1127,17,24,15,8,9,10,144,328,591,605,597,703,11,16,11,15,14,2,9 +239,143,615,608,640,724,1,18,5,6,13,5,222,374,626,567,683,1065,4,23,36,11,11,17,176,460,659,570,1060,802,35,21,26,15,1,12,318,506,727,691,847,947,25,29,36,10,13,9,341,493,701,737,961,821,36,29,26,11,14,10,241,397,532,749,1104,807,35,21,13,15,7,10,245,365,743,522,762,1131,10,23,36,8,7,12,287,261,670,405,780,991,7,21,29,15,8,12,432,282,775,535,764,1071,19,14,28,8,13,13,412,346,571,797,1035,802,27,21,22,9,14,10,327,323,425,676,957,826,26,20,8,13,8,16,265,207,656,633,738,836,10,17,9,14,12,11,227,165,656,623,798,784,8,15,11,9,11,14,247,371,608,593,806,1075,15,16,21,7,1,9,227,369,601,616,1030,851,18,22,18,12,2,8,415,369,699,887,1251,676,26,14,6,6,16,9,419,309,880,666,632,1261,7,15,28,6,16,5,374,424,546,477,639,687,15,29,16,15,15,13,9 +126,252,740,655,635,653,21,17,2,5,11,5,263,335,743,618,678,1008,16,36,33,12,9,15,303,305,730,633,941,733,15,10,23,12,3,8,395,313,850,732,702,904,25,10,33,9,15,13,376,348,832,794,806,754,30,16,23,12,16,8,328,338,677,814,997,732,31,8,10,14,9,8,320,372,880,587,765,1076,22,28,33,13,9,14,344,430,813,472,793,928,19,22,26,14,10,10,381,343,858,590,705,1008,3,27,27,9,15,9,417,261,696,848,980,737,39,28,19,4,16,8,334,324,560,739,896,751,38,23,5,8,10,12,308,200,781,684,745,767,30,18,10,7,10,7,322,284,757,678,755,707,24,30,10,10,9,12,290,376,691,652,807,1004,27,29,20,12,3,7,284,366,748,691,1023,780,32,9,15,7,4,10,462,384,818,958,1150,605,38,27,9,5,18,9,400,540,971,719,627,1226,27,26,25,11,18,1,261,311,653,534,566,626,27,18,13,12,17,9,9 +164,226,598,740,632,694,4,21,27,4,16,10,191,335,605,659,647,1063,7,20,8,11,14,12,229,317,668,604,898,774,32,24,6,13,4,9,301,335,722,787,815,973,22,18,4,10,8,16,310,388,690,807,889,793,33,18,6,9,9,13,212,318,525,767,910,773,32,20,19,15,4,11,200,240,722,584,664,1133,13,18,4,8,4,11,210,242,647,541,592,975,10,22,3,15,11,11,353,299,758,693,766,1057,16,21,4,8,8,6,353,205,550,815,917,786,24,12,34,7,9,11,250,280,416,708,819,788,23,21,24,11,9,7,286,134,635,765,580,814,13,24,23,10,15,10,214,214,643,781,620,746,11,16,21,9,16,13,276,308,603,641,716,1041,18,17,11,7,4,14,244,310,592,580,838,817,21,23,14,4,3,13,398,362,690,875,1073,646,23,19,38,2,11,12,346,356,869,802,632,1269,10,24,4,8,11,6,293,313,525,631,647,705,12,20,20,11,12,10,9 +187,363,617,719,667,697,8,31,17,4,7,5,298,278,652,624,716,952,13,20,18,7,9,11,262,306,651,649,1015,743,28,24,40,7,7,10,298,232,749,820,784,792,24,12,34,12,9,9,269,291,719,860,892,718,29,2,40,9,10,14,253,361,568,848,1067,800,30,20,27,9,11,12,281,271,787,647,795,1006,19,12,34,10,7,12,345,287,710,528,823,896,16,22,41,11,8,12,448,288,817,648,759,972,10,35,42,8,15,13,360,306,559,812,1040,721,36,20,4,5,10,8,329,399,447,777,956,827,35,23,24,9,8,14,199,283,644,712,775,779,17,30,25,8,6,9,277,293,646,736,801,783,15,26,25,7,7,14,313,249,614,716,845,1032,24,19,39,9,7,13,249,261,639,641,1067,822,27,23,34,10,8,12,351,529,701,922,1236,647,35,35,24,4,12,9,455,413,888,787,663,1136,14,34,42,10,12,5,356,204,530,558,608,562,24,10,16,15,13,13,9 +210,248,695,701,697,720,16,13,16,9,5,6,317,293,702,630,740,1029,15,34,25,10,5,18,261,305,665,619,1007,790,20,16,35,8,9,11,251,321,819,794,774,885,30,20,35,9,9,10,292,314,787,818,880,811,35,26,35,10,10,11,210,254,626,804,1061,811,36,14,26,10,9,9,256,292,839,605,827,1091,23,34,29,15,9,13,314,282,766,496,855,967,20,20,32,12,2,13,405,273,837,634,767,1047,8,19,33,9,9,14,359,239,643,814,1042,776,42,22,5,8,8,9,274,240,507,731,958,834,39,29,23,8,4,15,186,176,728,718,807,818,25,8,24,7,4,10,278,204,704,722,817,790,23,18,24,8,5,15,352,202,640,670,869,1073,28,33,38,14,9,10,266,208,697,653,1085,853,33,13,33,11,10,7,356,346,783,928,1224,676,39,19,23,9,8,8,380,406,922,775,687,1217,22,20,33,11,8,6,345,263,600,552,624,623,24,26,15,12,11,14,9 +132,212,703,655,623,646,21,14,0,4,6,5,255,351,742,604,660,993,16,33,31,11,10,19,299,347,731,663,941,724,15,15,21,11,8,12,385,369,811,734,710,889,25,17,33,10,14,11,348,378,793,794,810,745,30,17,21,11,15,12,318,336,664,830,995,729,31,13,8,13,12,10,312,400,883,591,747,1061,20,25,31,10,8,16,336,422,808,502,771,913,17,25,26,15,9,14,367,333,869,578,705,993,3,20,27,8,16,9,419,291,661,854,974,722,39,27,17,7,15,10,348,284,553,761,890,752,36,28,5,11,9,16,318,196,746,672,723,754,30,19,12,10,5,11,312,254,720,666,747,708,22,21,12,9,8,16,284,344,694,648,789,1001,25,26,20,9,8,11,276,334,719,717,1009,777,30,14,15,6,9,10,470,376,781,988,1154,598,36,20,11,4,17,9,400,524,970,709,617,1213,27,21,23,8,17,5,281,287,618,506,562,611,27,25,11,11,12,13,9 +134,406,762,756,701,740,24,26,17,13,11,3,227,251,645,669,740,1053,23,29,22,12,11,11,349,251,720,610,985,814,12,17,26,8,9,12,315,191,884,843,744,909,22,7,20,11,3,9,276,238,850,843,830,835,27,11,26,12,4,4,288,300,681,797,1043,827,28,13,25,6,9,10,282,342,796,642,831,1115,31,21,16,17,9,14,264,436,737,553,859,991,28,19,23,8,14,6,299,293,780,699,759,1071,6,32,24,11,5,7,375,221,712,801,1012,800,36,27,14,12,4,10,296,336,572,732,946,850,37,22,22,6,14,16,312,318,797,771,811,842,33,21,29,5,10,11,256,356,777,787,813,806,31,31,27,10,13,8,324,380,577,693,867,1095,36,22,31,16,9,5,364,356,736,638,1081,873,41,18,32,9,8,12,408,418,850,913,1132,694,37,32,28,13,6,11,312,534,857,832,685,1241,30,31,24,13,10,3,251,313,673,615,622,647,24,15,14,8,15,7,9 +170,162,628,652,629,706,2,14,3,2,11,7,295,357,689,613,676,1075,7,23,34,11,9,19,295,425,668,610,987,786,34,23,24,13,3,10,289,453,758,731,762,985,26,23,34,10,15,13,348,486,730,779,874,805,37,25,24,11,16,14,322,402,589,787,1037,785,38,19,11,15,9,8,340,434,814,564,755,1145,13,25,34,8,9,16,390,358,737,453,783,987,10,27,27,15,10,16,463,329,842,587,723,1069,16,18,26,8,15,11,435,329,566,847,1002,798,30,19,20,5,16,8,372,306,468,714,920,800,29,24,6,9,10,14,278,182,651,681,735,826,11,17,9,8,10,9,240,200,655,675,761,758,9,15,9,9,9,18,316,360,663,633,805,1053,18,18,19,9,3,13,300,362,656,662,1027,829,21,26,16,6,4,8,448,344,706,931,1212,658,29,14,8,0,18,7,410,472,935,714,623,1281,8,17,26,10,18,7,379,343,537,537,574,717,18,29,14,13,17,15,9 +113,153,670,691,599,675,10,18,7,5,16,2,210,342,635,650,640,1000,9,25,26,16,14,16,272,354,686,617,1037,753,26,21,20,10,4,13,326,398,774,772,832,954,20,23,26,5,8,8,271,411,756,802,948,772,27,23,20,6,9,9,257,339,589,790,1079,732,26,19,15,10,4,11,247,341,760,589,719,1052,15,17,26,13,4,11,297,303,691,490,735,912,12,21,19,20,11,11,316,314,826,620,731,1006,18,16,20,13,8,10,424,262,622,826,1002,789,18,27,20,8,9,11,295,263,480,719,922,711,19,22,10,12,9,17,245,127,707,716,693,733,19,17,17,13,15,12,245,169,699,708,761,691,17,19,17,14,16,13,263,317,619,652,763,960,20,18,25,12,4,8,297,315,652,671,987,770,23,22,20,11,3,9,441,351,740,940,1214,645,19,20,16,5,11,10,343,423,889,751,591,1196,16,15,18,11,11,4,280,324,601,560,612,712,6,23,12,14,10,10,9 +208,186,608,636,621,603,11,19,4,10,9,1,237,329,681,539,666,962,6,24,27,11,7,15,279,329,674,606,1005,677,25,18,27,11,5,12,479,369,684,721,786,872,31,22,39,10,17,9,404,398,690,759,902,696,26,22,27,11,18,8,306,334,519,773,1053,692,27,16,14,9,11,10,314,338,752,542,745,1032,6,18,33,12,11,14,328,334,715,439,769,874,3,20,32,7,12,10,421,299,784,579,729,956,13,17,33,10,17,9,415,277,580,761,1000,685,25,24,13,9,18,10,302,262,470,704,924,709,22,19,11,7,12,16,332,132,665,633,725,715,18,20,16,6,8,11,362,194,647,667,769,667,14,24,16,11,7,12,258,336,645,611,793,952,11,17,26,11,5,7,266,332,582,644,1017,730,16,15,21,4,6,10,466,384,672,919,1210,555,22,19,15,10,20,9,470,436,925,708,613,1168,17,18,29,12,20,3,279,347,541,487,600,604,19,24,7,7,15,9,9 +128,154,626,685,607,652,4,17,8,4,12,12,245,343,679,654,620,1021,1,28,23,9,10,20,241,371,696,599,939,732,32,20,13,15,2,11,323,409,734,750,810,931,28,26,23,12,14,12,306,426,718,774,880,751,33,26,13,11,15,17,248,350,581,774,987,731,32,20,14,17,8,9,258,356,796,557,673,1091,7,22,23,6,8,17,318,260,719,474,653,933,4,22,16,13,9,21,371,299,832,626,739,1015,20,17,15,6,14,14,387,261,582,850,936,746,24,24,23,7,15,9,304,278,470,707,840,746,23,21,9,11,9,15,240,136,667,720,617,772,13,16,8,10,11,10,274,158,671,714,669,704,11,14,6,7,10,23,240,286,681,622,717,999,12,21,8,7,2,14,228,292,636,617,903,775,15,19,11,8,3,7,424,366,702,900,1130,604,23,15,19,2,17,8,380,364,945,745,603,1227,10,16,15,8,17,12,313,319,557,592,604,667,12,28,9,15,16,20,9 +72,400,716,741,683,707,12,25,24,12,16,6,231,293,679,682,690,1022,7,28,9,9,12,10,341,305,720,569,971,773,24,18,3,9,6,9,345,279,804,808,874,970,30,12,7,12,6,14,306,332,782,804,960,790,25,14,3,13,7,5,294,394,597,742,979,752,24,14,16,7,6,11,296,370,792,605,713,1072,1,20,7,12,6,17,290,394,733,530,641,938,4,20,0,5,13,5,361,321,824,682,831,1028,18,27,1,12,6,6,371,343,692,800,976,807,16,26,37,11,7,11,294,474,538,677,874,731,15,25,21,5,11,11,270,388,777,770,633,753,13,20,20,4,15,10,258,354,755,770,677,701,9,26,18,11,14,7,326,514,631,654,761,980,4,21,8,13,6,6,330,516,658,581,887,800,7,21,11,6,5,13,412,542,802,864,1128,665,15,25,35,12,13,12,394,432,921,805,685,1216,18,26,1,14,9,4,233,405,665,632,724,734,20,18,21,9,14,6,9 +148,266,657,662,633,671,19,20,8,4,15,4,147,319,618,573,660,1040,14,19,23,13,13,10,223,319,665,590,1013,751,25,23,21,11,1,11,373,357,745,715,834,950,19,23,23,8,11,10,320,350,725,751,934,770,18,23,21,7,12,3,228,306,552,735,1049,752,17,19,8,13,5,11,230,314,735,518,729,1110,16,21,23,10,5,13,236,350,662,471,727,952,13,21,18,13,8,5,351,279,787,623,759,1034,29,20,19,10,11,6,365,293,633,767,996,763,9,13,19,7,12,11,272,302,481,680,914,769,8,18,7,11,6,15,304,228,718,679,691,791,10,21,16,10,14,10,234,226,706,711,743,727,20,17,16,11,13,7,232,398,580,587,773,1020,19,14,16,9,1,6,240,396,621,602,975,796,16,24,13,2,0,13,408,412,743,891,1200,623,8,16,19,4,14,12,386,412,870,730,625,1246,25,21,19,8,14,4,243,377,614,553,646,684,5,23,23,9,13,6,9 +188,164,621,615,641,681,5,22,8,5,14,5,295,429,626,580,682,1028,6,27,33,16,12,17,287,341,647,549,1079,759,31,13,23,8,0,10,357,397,719,694,874,960,23,21,33,7,12,11,324,464,703,728,990,778,32,21,23,8,13,10,310,414,532,720,1121,748,31,11,16,10,6,8,316,366,759,509,761,1088,12,19,33,13,6,14,374,360,684,400,777,940,9,19,26,12,7,12,479,381,787,546,773,1028,17,22,25,13,12,13,415,259,581,784,1044,783,23,23,19,8,13,8,356,330,439,651,964,745,22,22,11,10,7,14,218,154,666,648,735,769,14,19,12,9,13,9,294,254,646,634,803,713,12,21,14,14,12,14,306,398,594,578,805,996,17,20,24,12,0,9,278,394,597,593,1029,790,20,16,21,5,1,6,390,364,693,866,1256,641,22,18,9,5,15,7,484,454,868,679,633,1228,11,23,25,11,15,5,329,361,556,496,652,704,11,21,19,8,14,13,9 +201,231,722,597,620,662,20,16,2,4,11,5,204,310,705,564,653,1031,15,25,33,11,9,19,220,356,674,591,954,742,16,15,23,11,3,12,362,350,840,684,719,941,26,17,33,10,15,9,357,351,812,740,825,761,31,17,23,11,16,12,273,265,645,764,1006,741,32,13,10,13,9,10,253,353,844,533,752,1101,23,19,33,8,9,12,309,341,775,428,774,943,20,21,26,15,10,14,356,296,782,522,698,1025,4,20,27,8,15,13,418,302,678,800,967,754,40,23,19,7,16,10,315,229,532,693,889,756,39,14,5,11,10,16,331,173,763,622,730,782,29,25,10,10,10,11,291,215,721,610,746,714,25,25,10,9,9,16,213,275,657,598,782,1009,28,18,20,7,3,11,227,277,714,645,1000,785,33,14,15,4,4,8,473,341,806,914,1137,614,39,20,9,2,18,9,371,463,935,657,604,1237,26,21,25,8,18,5,276,280,627,464,577,673,28,23,13,11,17,13,9 +140,174,616,679,618,684,3,15,6,5,11,4,297,395,657,596,669,1003,2,26,25,16,9,14,287,329,664,641,1014,758,33,18,23,10,3,9,363,355,738,758,793,871,27,18,35,11,15,12,354,418,710,808,905,779,34,16,23,12,16,7,318,422,547,820,1060,773,33,16,10,10,9,7,342,356,768,593,744,1067,8,20,29,13,9,11,394,330,695,476,772,937,5,24,28,18,10,11,463,367,790,614,728,1015,21,21,29,13,15,12,369,271,566,812,1009,744,27,24,11,8,16,7,336,350,436,747,925,796,24,25,7,8,10,13,262,172,651,690,724,786,12,22,12,9,10,8,332,234,651,702,760,752,10,22,18,14,9,11,306,378,643,664,796,1039,13,19,22,12,3,6,282,378,618,679,1020,817,18,21,17,7,4,7,420,436,702,952,1227,638,24,21,17,5,18,6,464,422,915,737,614,1211,9,20,25,13,18,4,315,311,535,528,575,597,13,26,9,12,17,12,9 +143,123,611,614,607,700,3,19,3,3,13,4,216,376,620,565,648,1009,2,20,34,12,11,10,246,388,649,574,1045,774,33,22,24,14,1,9,340,458,709,693,840,955,27,24,34,9,13,12,315,465,689,747,956,797,34,24,24,10,14,3,285,371,508,757,1087,757,33,18,11,14,7,7,277,377,729,534,727,1057,8,20,34,9,7,11,313,337,668,419,743,929,5,20,27,16,8,11,420,316,775,553,741,1021,21,17,26,9,13,12,412,288,575,811,1010,808,25,18,20,6,14,7,329,305,421,684,930,736,24,19,6,10,8,13,261,191,660,639,701,750,12,18,9,11,12,8,223,193,652,641,769,712,10,16,9,10,11,9,257,391,582,599,771,985,13,13,19,8,1,2,261,389,577,614,995,797,16,25,16,9,2,7,417,359,691,885,1222,672,24,17,8,3,16,6,423,399,868,680,599,1213,9,18,26,9,16,4,300,408,558,491,622,705,13,26,14,16,15,12,9 +136,150,701,625,596,631,13,16,1,0,11,5,251,319,668,612,645,1000,8,29,30,11,9,19,323,423,721,663,1000,711,23,19,20,13,3,12,425,443,809,696,779,910,23,21,30,10,15,9,394,438,791,768,891,732,24,23,20,13,16,12,356,388,624,812,1046,710,23,17,7,15,9,10,354,446,797,567,718,1070,12,21,30,10,9,14,354,372,730,502,742,912,9,25,23,15,10,14,417,291,819,558,714,994,17,18,24,10,15,7,435,355,651,874,993,723,23,27,16,3,16,10,364,314,511,749,911,729,24,26,2,7,10,16,336,192,736,660,694,751,22,17,13,8,10,11,306,174,726,646,744,685,20,17,13,9,9,16,314,366,648,622,770,982,17,22,17,11,3,11,314,370,691,715,994,758,22,20,12,6,4,12,482,424,769,990,1211,583,24,16,12,2,18,11,440,444,918,681,590,1206,19,17,22,12,18,5,263,327,620,496,561,642,11,27,10,13,17,13,9 +129,235,599,752,607,632,2,15,22,7,12,7,260,332,644,681,612,977,3,38,9,10,10,17,292,336,665,618,893,712,34,10,1,14,2,8,384,336,709,797,788,909,26,10,13,13,14,13,351,365,691,821,874,735,35,16,1,14,15,14,311,387,548,781,933,705,34,8,14,12,8,8,301,323,757,594,619,1043,9,30,9,13,8,18,339,273,682,551,589,889,6,24,6,10,9,16,354,304,827,703,755,977,20,27,7,13,14,9,410,280,549,865,882,734,26,28,27,6,15,8,291,383,441,722,784,702,25,25,19,4,9,12,249,213,634,773,559,720,11,16,18,3,11,7,313,211,642,791,627,670,9,28,16,12,10,18,281,335,644,653,671,953,14,31,6,14,2,13,285,353,607,614,841,745,17,9,9,7,3,10,473,485,671,903,1068,596,25,27,33,7,17,9,379,383,910,810,611,1179,8,26,3,15,17,7,250,278,546,625,654,655,14,20,11,10,16,15,9 +211,265,718,621,639,692,21,17,10,5,6,9,258,410,749,610,672,1061,18,32,33,12,8,19,236,376,696,575,951,772,15,18,23,12,8,10,264,428,842,710,732,971,25,26,33,9,6,11,297,419,814,744,846,791,30,26,23,10,7,16,209,283,665,746,1001,771,31,20,18,14,10,8,227,407,886,535,769,1131,26,24,33,11,8,16,301,337,811,440,793,973,23,22,26,16,5,18,370,370,862,540,703,1055,13,17,25,9,12,13,366,262,664,812,964,784,35,28,21,8,7,8,267,167,546,673,886,788,32,23,13,12,9,14,229,205,749,654,749,812,24,18,14,11,5,9,277,271,729,628,759,744,28,14,16,10,6,20,287,231,689,596,799,1041,31,25,24,10,8,13,249,221,732,641,1013,817,30,15,23,9,9,6,391,257,800,904,1156,644,32,13,9,3,9,7,321,449,969,683,621,1267,27,18,25,7,9,9,340,260,621,506,592,703,19,28,17,12,10,17,9 +196,372,739,772,665,699,24,23,16,4,15,6,195,267,696,667,708,952,21,14,17,15,13,8,161,261,701,700,971,743,12,26,39,13,1,11,303,215,861,871,732,798,22,18,33,6,11,10,302,218,827,903,824,724,27,8,39,9,12,13,178,232,658,895,1027,802,28,22,26,11,5,13,206,264,835,690,795,1010,29,12,33,12,5,13,244,308,766,571,823,898,26,16,40,17,8,13,383,249,799,705,735,976,6,29,41,12,11,14,315,243,693,841,1010,719,36,12,3,7,12,9,274,282,549,822,926,833,37,21,23,11,6,15,254,288,778,759,775,781,33,30,26,10,14,10,234,286,748,793,785,789,31,24,26,13,13,13,218,212,646,759,837,1032,34,13,38,11,1,14,160,198,719,688,1053,824,39,29,33,6,0,13,350,406,831,969,1146,649,37,29,25,4,14,10,408,432,924,844,655,1138,30,28,41,10,14,6,309,195,646,611,592,560,24,18,17,11,13,14,9 +226,164,601,608,674,691,2,18,5,7,11,6,241,399,632,557,705,1060,3,21,36,12,9,16,203,375,653,566,1038,771,34,21,26,12,3,7,299,461,723,693,847,970,26,25,36,9,15,14,292,472,695,741,949,790,35,25,26,8,16,9,270,372,534,747,1076,770,34,17,13,14,9,5,240,376,749,526,784,1130,9,21,36,9,9,9,354,284,676,411,782,972,6,21,29,16,10,13,409,345,783,537,786,1054,20,16,28,9,15,14,449,281,551,803,1031,783,26,19,22,10,16,5,328,232,417,676,949,785,25,20,8,14,10,11,240,164,636,631,746,811,11,17,9,13,10,6,202,198,640,625,782,743,9,15,11,10,9,13,234,318,612,595,824,1038,14,14,21,8,3,8,290,316,603,604,1030,814,17,24,18,11,4,5,446,324,687,877,1241,643,25,16,6,5,18,4,382,396,886,672,666,1266,8,17,28,7,18,6,397,343,528,475,659,702,14,27,16,16,17,14,9 +155,183,628,649,659,703,15,22,10,5,16,5,184,282,553,564,678,1072,20,17,23,10,14,9,244,348,650,595,993,783,29,23,21,10,2,8,296,364,732,710,832,982,13,25,21,11,10,13,287,371,698,754,922,802,26,25,21,10,11,4,229,277,525,748,1023,782,25,19,16,12,4,6,209,295,680,521,743,1142,26,19,21,7,4,10,269,271,617,458,723,984,23,19,18,14,9,10,356,242,732,610,775,1066,19,18,19,7,10,11,400,270,596,772,994,795,17,13,19,8,11,6,295,263,442,693,908,797,18,16,11,12,7,12,289,169,681,666,693,823,20,21,22,11,15,7,189,141,679,698,729,755,22,17,22,8,14,8,235,311,517,592,787,1050,29,12,24,6,2,3,273,309,576,607,971,826,26,22,21,3,1,8,425,369,722,896,1192,655,18,18,21,3,13,7,343,365,795,717,649,1278,17,19,19,7,13,5,298,360,571,536,656,714,7,25,25,10,12,11,9 +205,221,640,662,620,675,4,16,14,6,7,13,258,294,713,637,623,1044,1,31,17,13,3,19,194,402,716,548,888,755,32,19,15,11,13,12,284,380,750,713,767,954,28,25,17,8,9,9,339,377,732,739,815,774,33,27,15,7,10,18,185,339,589,709,938,754,32,21,6,13,13,10,233,283,828,512,662,1114,7,27,17,10,13,14,293,179,761,455,654,956,4,25,18,11,6,22,416,250,866,607,734,1038,20,18,17,10,9,15,344,308,596,793,903,773,24,27,25,9,14,10,285,293,492,644,811,769,23,24,11,13,8,16,211,201,681,703,608,795,13,15,12,12,8,11,271,153,677,695,654,727,11,13,14,11,5,24,285,205,693,577,700,1022,12,28,10,9,13,15,191,215,644,570,902,798,15,16,7,2,14,8,397,419,718,853,1113,631,23,12,25,6,12,9,379,281,963,720,616,1250,10,17,17,8,12,13,358,232,571,585,601,694,12,29,21,7,13,21,9 +161,241,691,630,640,661,22,13,5,6,10,4,216,306,696,577,669,1014,17,28,30,11,8,18,222,294,691,594,954,739,14,14,26,11,4,11,358,326,791,709,721,910,24,18,30,10,16,10,303,339,771,749,825,758,29,20,26,9,17,11,249,287,612,775,1008,744,30,12,13,13,10,9,251,329,835,540,766,1082,21,24,30,10,10,15,299,379,766,445,784,934,18,26,25,13,11,13,376,298,821,565,720,1014,4,21,26,8,16,10,386,256,657,815,973,747,38,22,16,7,17,9,295,291,517,704,895,763,37,17,8,11,11,15,283,213,742,655,740,775,31,22,13,10,9,10,283,257,716,653,762,721,23,22,13,9,8,15,221,363,646,601,798,1012,26,21,21,9,4,10,223,361,673,640,1014,788,31,17,18,4,5,9,431,359,775,915,1141,617,37,19,12,6,19,8,395,483,924,694,630,1230,28,22,26,8,19,4,280,342,616,507,611,642,26,22,16,9,16,12,9 +273,381,715,784,567,645,26,21,16,8,11,7,184,234,586,707,550,854,21,30,15,13,9,13,142,292,717,592,787,687,12,20,5,11,5,10,316,256,761,785,692,892,24,20,15,8,9,11,263,263,743,775,778,702,13,24,5,7,10,6,173,245,564,673,831,620,14,18,8,13,3,8,137,265,703,600,519,910,15,24,15,10,3,14,241,235,656,609,527,766,18,20,8,11,4,14,302,220,773,761,693,872,30,19,7,8,11,15,320,278,705,757,772,777,10,18,33,11,8,8,209,261,551,640,674,569,9,21,13,15,2,14,261,319,790,837,485,621,17,18,12,14,10,9,313,293,774,849,563,555,19,22,10,9,9,12,181,149,512,613,577,820,10,25,0,9,5,5,211,147,601,496,741,668,7,17,3,4,4,6,381,397,795,799,964,635,9,21,27,6,10,7,321,353,812,840,563,1048,32,18,7,8,10,7,316,242,702,729,638,724,22,18,17,7,9,15,9 +135,213,628,668,610,640,2,14,11,11,6,2,288,320,637,609,617,997,3,33,20,10,4,16,350,342,676,586,950,720,34,17,10,10,8,11,422,388,740,733,809,907,26,17,22,13,12,10,395,411,720,763,871,741,35,17,10,14,13,9,359,409,557,747,994,719,34,15,5,8,8,11,359,399,762,536,664,1067,9,27,20,13,8,15,359,369,687,471,670,915,6,27,15,6,7,11,380,288,804,617,744,995,20,20,16,13,12,6,414,312,582,825,929,724,26,23,18,10,13,11,343,415,446,682,847,740,25,28,8,4,7,15,305,247,667,691,626,754,11,17,15,3,5,10,333,227,665,705,688,696,9,21,13,12,4,13,335,393,625,605,706,991,14,28,9,14,8,8,327,395,626,624,922,767,17,14,6,7,9,13,481,483,708,903,1143,592,25,20,22,11,15,12,429,403,893,736,608,1213,8,19,12,15,15,2,238,354,561,541,637,639,14,27,14,10,14,10,9 +360,312,641,644,480,518,15,28,8,8,12,10,303,303,738,555,519,879,12,17,23,13,14,8,351,389,631,670,848,598,25,7,23,13,16,17,517,325,759,723,637,789,21,17,31,16,12,18,514,348,733,783,747,619,26,17,23,17,11,11,384,274,594,825,894,607,21,7,16,11,10,19,414,328,833,582,608,949,20,9,25,16,12,15,266,290,768,513,634,793,17,7,24,9,11,3,337,285,733,573,572,873,23,20,25,16,12,4,341,361,593,733,845,610,21,21,17,7,11,19,264,256,515,760,763,638,18,8,13,1,9,13,402,262,678,605,586,634,20,29,20,0,15,18,406,240,614,661,608,586,22,33,20,15,14,5,364,204,722,637,648,871,25,10,28,17,16,14,336,202,651,730,870,647,26,2,23,10,15,21,436,420,725,1001,1065,480,18,28,19,8,9,20,468,432,996,704,474,1091,21,31,21,18,11,10,221,145,536,467,427,535,5,9,11,11,6,2,9 +195,407,725,812,649,672,25,15,28,6,15,10,192,202,610,705,646,861,20,38,13,11,11,8,194,210,709,640,851,712,19,10,7,13,7,11,314,154,789,847,804,911,17,14,3,10,5,10,261,181,767,855,892,723,12,20,7,9,6,5,147,217,588,775,851,641,11,8,20,13,7,9,171,221,733,648,621,903,14,30,3,8,7,11,221,319,680,635,519,783,17,20,4,11,14,13,326,218,795,787,793,895,37,25,5,8,5,14,282,226,711,807,868,804,3,28,33,7,6,9,197,303,557,736,764,560,2,21,25,11,12,9,243,323,796,837,533,636,16,16,24,10,12,10,323,329,782,875,619,560,18,28,22,9,13,11,233,321,530,685,685,811,9,31,12,7,7,4,197,313,631,574,759,689,6,7,15,0,6,7,341,421,813,877,1006,660,2,23,39,6,8,8,351,447,828,880,653,1045,31,26,5,8,8,10,272,300,708,717,712,751,15,18,25,7,13,14,9 +165,125,643,626,615,655,2,12,3,4,10,11,286,372,712,605,656,1024,3,25,34,13,8,19,262,428,711,626,989,735,34,21,24,13,4,10,302,482,757,705,774,934,26,23,34,8,16,11,327,489,733,759,880,754,35,25,24,9,17,16,283,401,592,797,1035,734,34,19,11,13,10,8,295,407,825,554,735,1094,9,25,34,10,10,16,355,295,752,463,759,936,6,27,27,17,11,20,452,326,855,551,717,1018,20,16,26,10,16,13,396,330,597,855,988,755,26,21,20,7,17,8,353,273,487,726,906,751,25,26,6,11,11,14,249,169,682,657,711,775,11,15,9,10,9,9,255,169,688,639,751,707,9,15,9,11,8,22,301,333,690,611,783,1004,14,18,19,9,4,13,267,331,647,678,1007,780,17,24,16,8,5,6,411,355,725,949,1208,611,25,14,8,2,19,7,449,377,962,682,611,1230,8,15,26,8,19,11,364,340,572,513,566,678,14,31,14,15,16,19,9 +117,141,648,633,586,650,4,13,3,3,4,5,276,346,715,610,631,1017,1,28,34,8,8,19,304,446,720,633,990,728,32,22,24,10,12,12,360,466,748,710,785,929,28,24,34,13,10,9,331,463,734,778,901,749,33,24,24,14,11,12,299,387,571,808,1032,729,32,20,11,12,12,10,299,405,804,575,710,1087,7,24,34,9,12,12,343,295,749,476,734,929,4,26,27,12,7,14,420,310,866,564,694,1011,20,15,26,9,14,11,408,350,608,868,965,752,24,24,20,4,11,10,315,299,492,735,889,744,23,25,6,8,9,16,251,185,693,664,690,768,13,14,9,9,3,11,291,169,697,652,734,700,11,14,9,8,6,16,293,331,693,634,758,997,12,25,19,10,12,11,281,337,636,697,982,773,15,19,16,9,13,8,437,393,724,964,1187,610,23,15,8,3,13,9,427,381,977,691,578,1223,10,14,26,11,13,5,320,302,583,524,567,673,12,28,14,16,14,13,9 +154,410,678,792,610,694,17,24,24,12,11,6,219,279,731,683,649,959,12,29,21,13,13,12,201,209,680,656,906,744,19,11,33,9,3,11,361,159,802,877,675,793,29,5,23,12,9,10,334,200,780,889,789,725,34,11,33,13,10,13,204,310,651,845,958,797,35,7,30,7,11,11,212,280,870,692,740,1017,20,21,23,18,3,13,260,338,793,595,768,903,17,19,30,9,6,13,385,323,852,737,668,983,7,32,31,12,11,14,295,211,618,785,939,722,39,27,7,11,10,9,220,310,530,774,855,824,36,20,27,5,16,15,224,288,703,785,720,780,26,25,32,4,10,10,308,364,689,825,722,780,22,33,34,11,11,15,244,258,673,743,776,1033,25,24,38,17,3,14,192,258,712,650,990,823,30,14,37,10,4,11,370,400,752,931,1127,646,36,32,35,12,12,8,426,486,951,862,594,1107,23,31,31,14,12,6,257,221,575,639,537,561,25,15,21,9,13,14,9 +189,179,612,631,614,631,6,14,0,9,3,8,318,348,655,592,659,992,3,29,31,12,5,20,288,378,672,591,1000,709,30,21,21,12,13,11,322,408,700,706,785,910,26,25,31,15,9,10,303,401,684,750,899,728,31,25,21,16,10,15,209,295,515,762,1046,702,30,19,8,10,13,9,275,339,746,535,738,1062,9,31,31,15,13,13,337,273,691,436,762,904,6,23,24,8,6,17,444,302,786,562,722,986,18,14,25,15,11,16,290,282,586,800,993,733,26,17,17,8,6,9,243,217,460,691,917,717,25,24,3,2,8,15,187,135,671,656,718,743,15,5,12,1,4,10,361,159,653,650,762,675,13,17,12,14,5,19,343,289,633,604,786,970,14,30,18,16,13,14,243,291,580,641,1010,746,17,18,13,9,14,7,331,333,692,912,1207,591,25,16,11,9,8,8,465,401,919,687,606,1198,12,15,23,17,8,8,302,312,557,502,595,656,14,27,11,12,15,16,9 +109,251,678,683,619,696,20,16,8,3,16,3,258,300,633,626,628,943,15,27,23,12,14,13,274,288,684,607,961,756,24,19,13,12,2,10,304,330,768,738,824,959,20,19,23,9,10,11,267,353,746,766,914,773,17,19,13,8,11,6,265,323,561,762,985,705,16,17,10,14,4,8,273,333,754,537,679,973,15,19,23,9,4,14,327,365,691,478,643,859,12,25,16,16,9,10,382,264,802,630,765,967,32,20,15,9,10,11,382,232,652,828,950,826,8,27,25,6,11,8,307,319,498,699,854,634,7,26,5,10,7,14,213,231,737,718,623,668,11,21,20,9,15,9,259,239,727,718,667,630,19,21,16,10,14,10,271,347,577,606,723,881,14,20,18,8,2,5,247,341,624,613,893,747,11,22,15,5,1,8,395,393,764,902,1126,678,7,20,19,1,13,7,379,437,869,743,619,1123,26,19,15,9,13,3,320,352,639,590,656,757,10,25,23,12,12,11,9 +149,145,631,623,589,655,9,13,2,5,5,5,256,364,596,580,626,1024,10,28,29,12,7,19,260,376,633,607,1023,735,27,22,19,12,9,12,288,446,743,698,818,934,19,26,31,9,11,9,247,451,723,750,934,754,28,26,19,8,12,12,211,347,558,772,1065,734,27,20,6,14,9,10,235,333,735,537,705,1094,16,26,29,9,9,12,303,257,676,444,721,936,13,26,24,16,6,14,372,312,787,562,725,1018,13,13,25,9,13,13,338,280,585,812,988,747,27,22,15,8,8,10,265,221,445,709,908,749,28,25,3,12,4,16,221,117,670,652,679,775,18,12,14,11,4,11,297,161,644,650,747,707,16,14,14,10,5,16,287,291,568,598,749,1002,21,27,18,8,9,11,241,297,627,649,973,778,24,19,13,7,10,8,359,303,709,930,1200,607,28,13,13,3,10,9,373,367,840,685,583,1230,15,14,21,7,10,5,306,356,558,494,606,666,15,30,9,14,11,13,9 +144,116,656,641,579,633,7,13,3,7,7,7,297,375,685,616,614,954,2,30,34,12,5,19,289,385,718,619,983,711,29,20,24,14,7,10,339,451,746,716,806,908,31,22,34,9,11,11,316,454,728,756,904,734,30,24,24,10,12,14,268,390,553,788,1027,694,29,18,11,14,7,8,280,366,790,553,687,1014,4,26,34,9,7,14,334,284,727,462,693,866,1,28,27,16,4,16,433,339,858,564,709,960,17,17,26,11,11,11,339,291,630,846,954,747,21,26,20,8,10,8,296,262,488,717,868,673,20,27,6,14,4,14,240,136,715,672,647,689,16,16,9,15,6,9,316,164,713,652,707,651,14,16,9,10,5,18,314,318,645,612,729,924,9,27,19,10,7,13,256,310,618,665,945,732,12,17,16,13,8,8,374,356,740,940,1164,607,20,15,8,7,12,7,456,386,933,695,575,1152,13,16,26,11,12,7,307,313,603,518,590,674,15,30,14,16,13,15,9 +134,176,687,700,623,678,11,15,7,5,14,4,189,311,692,651,666,1033,8,24,24,12,12,18,227,357,703,664,965,758,25,22,22,12,0,11,347,387,809,769,730,929,27,26,28,9,12,12,304,402,785,813,830,777,32,28,22,10,13,11,264,316,626,837,1017,761,27,22,9,14,6,9,240,344,825,602,747,1101,16,24,24,9,6,17,278,334,750,517,775,953,13,26,21,16,7,13,323,251,827,643,715,1033,13,15,22,9,12,8,413,271,635,867,990,762,33,22,16,8,13,9,296,270,509,770,906,780,32,25,6,12,7,15,270,176,720,729,727,794,20,14,17,11,13,10,246,176,714,731,751,738,18,12,19,10,12,15,216,340,662,661,795,1029,21,17,21,8,0,10,244,340,695,696,1017,805,26,25,16,7,1,11,460,348,769,983,1168,630,32,13,18,3,15,10,324,410,934,762,615,1249,17,14,20,7,15,4,281,375,598,569,574,655,19,30,10,14,14,12,9 +200,162,644,715,593,696,8,18,12,4,11,4,241,343,737,648,642,1005,3,27,19,15,9,18,197,315,704,643,961,766,28,17,27,11,3,11,347,387,756,798,740,861,32,23,35,6,15,12,332,414,734,832,854,787,35,23,27,7,16,11,232,338,599,826,1009,787,30,17,18,11,9,9,256,312,834,619,723,1067,11,21,29,12,9,13,312,278,771,510,751,943,8,21,28,19,10,13,423,313,872,650,691,1023,16,18,29,12,15,12,383,225,602,844,972,754,30,25,13,7,16,9,302,268,512,753,890,810,27,22,15,11,10,15,246,126,687,732,703,794,17,19,20,10,10,10,284,208,687,738,729,766,13,15,24,13,9,15,250,294,715,684,771,1049,16,20,30,11,3,10,208,292,654,675,993,829,21,20,25,8,4,7,418,312,728,950,1186,654,27,16,23,4,18,8,428,392,985,777,589,1193,14,19,25,10,18,4,363,345,571,574,540,603,16,27,15,13,17,12,9 +98,178,593,755,622,644,5,11,17,9,3,8,317,317,618,672,641,1013,10,34,14,12,7,20,337,359,649,637,974,724,35,16,4,12,11,11,281,387,713,810,829,923,23,18,16,15,7,12,280,398,693,834,929,743,36,20,4,16,8,15,280,358,542,808,1008,725,35,14,9,10,11,9,300,328,751,609,688,1083,16,32,14,15,11,17,348,280,674,552,666,925,13,26,9,8,6,17,375,271,823,704,766,1007,17,19,10,15,13,10,327,295,537,862,959,736,27,22,24,8,6,9,266,326,421,749,865,744,26,29,14,2,6,15,216,176,622,778,634,764,14,14,15,1,4,10,320,160,620,792,690,702,12,22,15,14,5,19,348,318,612,672,736,993,21,33,5,16,11,14,316,318,613,645,916,769,24,13,8,9,12,9,370,434,667,932,1147,596,26,19,28,9,8,8,374,356,876,819,622,1219,7,20,6,17,10,8,261,297,518,624,659,655,15,24,12,12,13,16,9 +262,180,636,681,650,720,11,21,12,7,11,6,231,329,663,610,691,1075,16,24,27,12,9,20,195,391,654,623,1008,800,31,20,27,12,3,11,281,423,764,760,783,971,19,26,25,9,15,12,302,434,738,810,889,819,32,28,27,8,16,13,236,316,589,810,1058,801,31,22,20,14,9,9,228,350,804,597,772,1143,22,22,25,9,9,13,314,262,729,498,794,995,19,20,24,16,10,15,403,287,846,622,752,1075,13,19,25,9,15,14,411,283,574,858,1023,804,33,22,13,10,16,9,312,210,468,741,941,818,34,19,15,14,10,15,266,152,659,698,746,836,20,20,18,13,10,10,254,168,649,710,786,776,18,18,18,10,9,17,250,246,611,660,818,1069,27,19,28,8,3,12,252,246,658,655,1042,845,30,23,25,5,4,7,404,304,712,928,1229,672,34,15,17,5,18,8,366,376,885,749,646,1291,11,18,25,7,18,6,413,317,537,550,601,697,21,28,23,10,17,14,9 +155,149,627,611,636,638,5,14,4,1,2,10,314,372,702,588,687,997,6,27,35,10,6,20,304,446,691,645,1022,718,31,23,25,12,16,11,310,486,737,694,795,907,23,27,35,11,14,12,307,503,715,760,907,739,32,27,25,14,15,17,281,399,584,810,1070,719,31,21,12,14,16,9,309,433,823,567,760,1067,12,23,35,9,16,17,373,301,750,484,786,913,9,25,28,14,9,19,434,320,865,532,746,993,23,12,27,9,12,12,420,324,583,854,1027,722,23,23,21,4,9,9,313,255,489,741,945,740,22,24,7,8,11,15,201,163,668,640,738,752,8,13,8,9,3,10,301,191,664,620,780,696,10,13,10,8,4,21,323,315,678,622,812,991,15,24,20,10,16,14,287,315,639,705,1036,767,14,20,17,7,17,7,419,345,707,972,1247,592,22,14,7,1,11,8,429,409,950,669,630,1211,11,13,27,11,11,10,350,322,558,478,591,641,11,29,15,14,16,18,9 +191,175,647,660,676,723,15,14,6,7,10,6,290,338,684,611,697,1092,14,29,37,12,8,20,298,414,675,598,948,803,21,19,27,12,4,11,314,440,779,735,767,1002,31,23,37,9,16,12,349,463,751,769,855,822,36,23,27,8,17,13,331,363,602,773,992,802,37,17,14,12,10,9,335,435,821,550,776,1162,22,23,37,9,10,17,375,387,744,449,770,1004,19,25,30,10,11,15,450,310,837,595,758,1086,9,18,29,9,16,10,464,338,591,823,987,815,41,23,23,6,17,9,379,319,481,700,897,817,38,22,9,10,11,15,305,203,676,687,730,843,24,17,10,9,9,10,241,231,674,683,746,775,22,15,12,10,8,17,305,359,646,619,810,1070,27,22,22,8,4,12,303,367,673,640,1008,846,32,18,19,1,5,9,475,337,731,915,1165,675,38,14,5,7,19,8,379,477,920,724,668,1298,21,17,29,9,19,6,392,354,562,539,619,734,23,27,17,6,16,14,9 +119,203,694,623,639,642,13,12,2,3,9,10,228,332,739,580,682,1005,8,31,33,12,7,20,250,382,718,615,969,722,23,19,23,12,5,11,336,398,806,716,734,915,33,21,35,9,13,12,309,403,786,742,836,743,38,23,23,12,14,17,261,301,657,780,1021,721,35,17,10,14,9,9,265,393,870,541,769,1075,16,25,33,9,7,17,315,335,793,466,797,917,13,29,28,16,8,19,390,298,864,548,713,999,11,18,29,9,13,12,398,304,648,810,994,728,35,27,19,6,14,9,309,233,540,711,910,740,32,26,7,10,8,15,243,171,733,642,749,756,22,17,10,9,8,10,245,203,727,636,759,696,18,17,10,10,7,21,243,271,701,600,811,993,21,26,22,8,5,14,239,273,712,681,1027,769,26,16,17,5,6,7,429,339,774,948,1180,594,32,16,9,1,16,8,397,459,977,687,629,1215,19,17,25,9,16,10,330,280,609,480,566,647,21,29,13,12,15,18,9 +95,271,687,713,604,646,14,16,9,3,16,4,210,286,656,658,617,937,9,29,22,10,14,10,270,304,675,663,974,708,22,17,16,14,2,11,396,322,765,760,815,917,20,17,24,11,10,10,321,335,749,812,911,733,23,17,16,12,11,3,273,337,560,812,1000,683,22,15,7,16,4,9,281,345,765,577,680,977,15,21,22,11,4,13,299,381,708,522,660,851,12,25,17,14,9,7,376,256,799,670,748,949,24,20,18,11,10,8,344,284,671,874,955,764,14,25,16,2,11,9,269,347,517,755,863,644,13,24,6,6,7,15,261,235,756,746,636,658,15,21,17,5,15,10,297,239,726,758,682,624,21,21,17,10,14,7,255,393,596,648,722,891,20,22,19,12,2,4,259,393,625,655,908,725,21,18,14,5,1,11,405,439,773,950,1143,620,13,20,20,3,13,10,435,437,892,773,602,1125,20,19,14,13,13,4,240,360,652,602,633,693,4,25,10,10,12,8,9 +210,168,627,593,560,678,7,16,0,9,6,4,163,343,632,552,583,1005,2,15,31,10,4,10,275,381,683,563,974,752,29,27,21,14,14,9,303,401,719,658,777,953,31,23,31,11,6,12,262,392,701,700,885,771,30,23,21,10,7,3,268,312,522,708,1016,731,29,23,8,16,14,9,208,312,749,475,664,1075,4,23,31,7,14,13,260,252,686,410,680,917,1,25,24,14,7,7,305,301,795,536,692,1007,17,18,23,7,6,8,429,283,597,764,939,788,23,15,17,12,13,9,330,208,443,651,859,730,20,22,3,16,9,13,350,144,682,622,636,756,16,19,12,17,7,8,182,158,676,624,698,690,14,13,12,8,4,7,236,250,592,544,708,983,9,16,16,6,14,4,326,250,593,603,932,773,14,28,13,13,15,11,446,334,709,882,1153,644,20,14,11,9,11,10,328,378,878,655,554,1211,13,19,23,5,9,4,269,289,562,484,577,711,15,25,15,12,14,8,9 +179,161,634,755,634,627,3,8,8,4,12,9,186,354,689,676,651,996,2,27,23,15,10,19,182,366,712,679,938,707,33,21,17,9,2,12,350,394,748,808,807,906,27,23,29,6,14,11,297,423,728,850,885,726,34,23,17,7,15,16,211,347,577,834,968,708,33,19,4,11,8,10,215,297,802,615,702,1066,8,27,23,12,8,16,263,263,727,552,666,908,5,29,22,17,9,18,358,302,836,704,754,990,21,16,23,12,14,11,352,282,584,864,955,721,25,21,11,7,15,10,257,257,466,777,859,727,24,24,5,11,9,16,279,135,669,772,634,747,12,15,10,10,11,11,283,165,679,792,674,685,10,15,14,13,10,20,189,327,683,684,748,976,13,20,16,11,2,15,189,327,648,683,916,752,16,20,11,6,3,8,401,381,710,976,1139,581,24,14,19,4,17,9,395,351,949,811,628,1202,9,15,19,10,17,9,262,320,559,616,613,642,13,29,11,13,16,17,9 +185,191,635,668,643,711,2,17,10,4,15,5,236,322,656,595,684,1036,3,30,21,9,13,13,222,340,669,556,1029,779,34,18,23,9,1,10,320,386,741,753,816,928,26,24,25,12,11,11,255,393,715,761,930,802,35,24,23,11,12,6,205,305,540,729,1075,788,34,16,20,11,5,8,233,303,763,554,769,1102,9,22,21,6,5,14,305,299,696,461,789,962,6,22,20,13,8,12,408,256,797,607,749,1042,20,17,21,6,11,13,362,298,603,749,1020,795,26,26,17,7,12,8,267,307,453,660,940,803,25,25,17,11,10,14,169,217,688,687,747,807,11,16,22,10,14,9,269,197,676,695,791,761,9,16,22,7,13,10,259,367,636,609,811,1048,14,23,28,7,1,5,217,367,609,592,1033,826,17,15,27,2,0,6,357,393,727,869,1220,669,25,15,21,4,14,7,419,359,914,740,633,1232,8,18,21,8,14,5,332,370,578,529,630,682,14,26,11,9,15,13,9 +234,162,596,597,637,695,5,17,3,7,4,6,241,361,651,558,682,1036,8,28,34,8,8,18,193,405,648,587,1021,773,31,22,24,8,12,11,295,449,712,682,800,930,23,28,34,13,12,10,306,438,686,742,912,792,32,28,24,10,13,11,236,340,547,770,1069,778,31,20,11,10,12,9,220,324,780,537,761,1102,14,24,34,5,12,13,332,238,705,426,785,962,11,22,27,12,7,13,389,301,810,528,745,1042,15,13,26,5,14,14,421,299,552,818,1016,771,31,22,20,10,11,9,290,224,436,697,940,797,30,21,6,14,7,15,214,150,637,622,741,807,14,14,9,13,3,10,252,142,627,616,785,755,12,14,9,6,6,15,250,262,613,596,809,1046,19,25,19,4,12,10,252,268,606,629,1033,822,22,19,16,7,13,7,432,326,684,900,1228,647,30,15,8,5,13,8,364,334,887,659,629,1246,11,14,26,5,13,6,377,321,523,468,616,666,19,28,14,14,14,14,9 +201,157,623,609,592,676,6,15,0,7,13,9,236,370,644,580,637,1045,3,26,31,12,11,19,212,390,665,599,988,756,30,22,21,14,1,10,312,454,745,678,767,955,26,26,31,9,13,11,319,453,717,742,879,775,31,26,21,10,14,16,227,347,564,766,1034,755,30,20,8,14,7,8,221,353,765,527,716,1115,9,22,31,9,7,16,321,239,690,442,740,957,6,24,24,16,8,18,360,322,775,544,702,1039,18,13,23,9,13,13,406,296,573,812,973,768,26,24,17,10,14,8,293,203,445,697,897,770,25,23,3,14,8,14,257,143,658,644,696,796,15,16,12,15,12,9,251,153,662,632,740,728,13,16,12,10,11,20,223,267,624,586,764,1023,14,19,16,8,1,13,233,267,633,639,988,799,19,19,13,13,2,6,461,315,709,924,1195,628,25,15,11,7,16,7,357,355,896,663,584,1251,12,14,23,7,16,9,338,310,536,494,571,689,14,28,11,14,15,17,9 +124,224,613,629,653,686,7,16,2,13,12,2,311,313,624,588,674,1055,12,37,33,8,10,16,369,419,637,565,1013,766,31,9,23,8,2,13,391,389,729,700,856,965,19,13,33,11,14,8,390,406,705,736,944,785,32,19,23,12,15,9,390,432,546,736,1055,765,31,7,10,6,8,11,392,428,757,517,737,1125,18,29,33,13,8,11,410,420,684,416,731,967,15,21,26,4,9,11,461,331,803,568,781,1049,13,26,25,11,14,8,427,387,563,800,1000,778,31,29,19,12,15,11,382,440,429,669,912,782,32,22,5,6,9,17,314,276,648,658,693,806,16,17,10,5,11,12,298,266,640,656,749,740,14,29,10,10,10,13,356,462,584,584,781,1033,23,30,18,12,2,8,352,462,615,589,981,809,26,6,15,7,3,11,466,502,693,870,1202,638,32,24,9,13,17,10,446,456,860,691,645,1261,11,27,25,13,17,4,279,395,534,514,664,697,19,17,13,8,16,10,9 +171,151,572,678,612,651,2,17,13,5,13,7,194,344,617,625,635,1020,3,20,18,12,11,19,206,406,644,594,990,731,34,22,18,12,1,10,330,456,684,745,829,930,26,28,20,9,13,11,285,467,664,785,931,750,35,28,18,8,14,14,231,345,513,765,1018,730,34,20,15,14,7,8,213,355,734,564,696,1090,9,22,18,9,7,16,281,247,659,469,676,932,6,20,15,16,8,16,330,274,790,621,752,1014,20,13,16,9,13,11,404,298,526,789,971,743,26,22,22,8,14,8,277,257,396,696,881,747,25,21,12,12,8,14,267,137,611,705,648,771,11,16,21,11,12,9,263,145,617,709,700,705,9,14,19,10,11,18,199,307,613,633,742,998,14,15,23,8,1,13,233,303,582,624,926,774,17,23,22,9,2,8,441,349,652,907,1159,603,25,15,24,3,16,7,341,315,879,736,608,1226,8,14,16,7,16,7,282,358,513,549,635,662,14,28,8,16,15,15,9 +140,132,568,626,583,659,0,19,0,3,10,8,257,315,641,589,606,1026,5,28,31,8,8,20,281,445,642,586,915,739,36,20,21,14,4,11,397,457,690,691,754,936,24,24,31,13,16,12,382,474,666,741,840,760,37,24,21,12,17,15,304,358,537,751,961,740,36,18,8,16,10,9,308,416,760,518,679,1096,11,20,31,11,10,17,320,304,683,419,659,938,8,20,24,12,11,17,453,259,788,563,697,1020,18,17,23,11,16,10,417,359,514,801,926,751,28,26,17,2,17,9,314,290,424,684,830,761,27,23,3,6,11,15,258,182,599,659,627,777,9,16,12,7,9,10,254,168,607,651,655,717,7,18,12,10,8,19,308,322,633,587,715,1012,16,21,16,12,4,14,282,328,592,610,907,788,19,17,13,5,5,11,452,376,648,895,1118,615,27,19,11,3,19,10,456,368,901,682,579,1232,6,16,23,13,19,8,331,349,489,509,560,672,16,24,11,12,16,16,9 +147,143,634,697,638,678,2,20,3,4,9,4,268,304,677,624,689,1007,3,31,28,7,7,18,280,412,694,659,1006,752,34,19,22,9,5,11,330,416,748,786,775,889,26,25,34,14,9,12,269,435,730,828,879,773,35,27,22,13,10,11,251,335,595,828,1056,765,34,21,9,11,5,9,277,359,804,609,764,1073,9,27,28,6,5,15,319,297,727,506,792,935,6,21,27,11,4,13,386,232,838,638,740,1013,20,18,28,6,9,10,366,316,588,830,1021,742,26,23,14,7,10,9,277,267,474,759,939,788,25,24,6,11,4,15,241,183,673,708,744,780,11,15,15,10,8,10,311,149,671,726,778,744,9,17,15,5,7,15,287,325,655,678,816,1033,14,24,21,7,5,10,241,321,658,697,1040,811,17,16,16,4,6,9,383,373,714,974,1221,632,25,16,14,4,12,8,387,355,925,765,634,1235,8,17,24,8,12,4,334,386,565,554,585,603,14,27,8,11,11,12,9 +170,188,597,764,647,656,4,15,33,4,17,8,207,337,598,691,654,1005,9,18,2,11,15,14,297,359,663,656,935,728,36,26,12,13,3,9,299,403,721,823,838,915,24,20,12,10,9,16,296,442,689,849,924,749,37,20,12,9,10,11,278,366,522,825,955,747,36,22,25,15,3,11,270,348,725,622,677,1075,15,22,6,8,3,13,258,328,644,561,611,917,12,28,9,13,10,11,397,305,801,713,795,999,20,21,10,8,9,6,421,281,545,851,940,728,28,14,28,7,10,11,348,340,409,762,838,770,27,23,30,11,8,9,294,194,630,789,597,756,13,20,29,10,16,10,156,214,644,801,653,726,11,16,27,9,15,13,306,386,582,687,725,1009,20,15,17,7,3,12,318,392,589,650,863,789,23,29,20,2,2,13,408,388,685,941,1092,612,27,17,44,4,12,12,396,410,852,828,649,1215,6,20,10,8,12,4,275,383,530,641,688,647,16,24,22,9,11,10,9 +150,192,665,698,609,654,8,14,9,9,6,4,267,279,628,663,626,955,3,31,22,12,4,14,263,337,693,612,985,714,28,19,12,12,8,11,379,349,737,751,816,913,32,19,22,15,12,10,338,358,721,783,918,731,29,19,12,16,11,7,254,328,530,771,1027,685,28,17,1,10,8,9,270,324,731,554,683,1007,3,29,22,15,8,13,328,304,674,493,683,867,0,27,15,8,5,11,427,255,785,645,753,961,20,18,14,15,10,12,343,297,649,845,958,772,20,21,22,8,11,9,242,314,495,710,870,664,19,30,6,2,5,15,212,206,734,735,641,688,17,13,9,1,5,10,322,156,716,733,709,640,13,19,11,14,4,11,278,314,590,619,729,915,8,30,7,16,8,6,236,314,593,628,935,727,11,16,4,9,9,7,402,426,749,913,1162,626,19,18,20,9,13,8,466,380,882,756,609,1149,14,17,14,17,13,4,297,313,640,601,644,701,16,27,20,12,12,12,9 +216,130,552,641,616,682,1,19,2,5,12,5,201,403,595,582,647,1051,6,20,29,14,10,19,225,435,628,581,1024,762,37,20,19,10,2,10,343,503,676,708,841,961,25,28,29,7,14,11,310,522,648,750,949,781,38,28,19,6,15,12,270,416,491,756,1058,761,37,18,6,12,8,8,244,394,720,531,718,1121,12,22,29,11,8,16,310,264,641,438,716,963,9,20,22,18,9,14,415,321,794,582,754,1045,19,15,21,11,14,11,445,319,498,810,997,774,29,16,15,8,15,8,330,298,372,685,911,776,28,19,1,12,9,14,274,142,583,670,682,802,10,18,14,11,11,9,216,178,593,670,740,734,8,16,14,12,10,16,238,350,581,598,762,1029,17,15,14,10,2,11,270,352,562,609,966,805,20,23,11,9,3,8,426,350,632,892,1197,634,28,15,13,3,17,7,412,312,849,705,610,1257,5,16,21,9,17,5,331,389,483,528,637,693,17,28,13,14,16,13,9 +159,277,607,775,600,619,2,13,22,6,11,5,206,286,666,682,597,950,3,32,9,9,9,19,228,306,663,603,878,695,34,12,3,15,3,12,370,288,705,808,759,880,26,12,15,12,15,9,307,329,687,822,845,718,35,18,3,11,16,12,259,353,538,750,920,700,34,10,14,13,9,10,253,277,777,607,588,1020,9,24,9,6,9,14,307,261,706,584,576,862,6,26,8,11,10,14,346,264,833,736,744,948,20,25,9,6,15,11,404,282,575,832,853,705,26,30,25,7,16,10,301,393,457,703,765,697,25,23,19,11,10,16,285,247,660,794,540,697,11,22,18,10,10,11,283,231,656,824,624,665,9,26,16,7,9,16,223,311,644,652,640,944,14,25,6,7,3,11,237,333,597,597,828,734,17,15,9,2,4,8,449,505,689,886,1055,583,25,25,33,6,18,9,387,345,930,835,604,1158,8,24,5,8,18,5,284,244,566,654,659,626,14,22,11,9,17,13,9 +208,222,549,706,608,633,3,13,5,8,9,11,235,369,662,669,621,1002,8,28,26,9,7,19,209,453,673,638,962,713,35,22,16,15,5,12,297,491,665,761,819,912,27,26,26,12,17,11,290,476,647,803,909,732,36,26,16,11,18,18,250,386,514,801,996,712,35,20,3,17,11,10,226,346,759,574,674,1072,10,24,26,6,11,16,322,172,692,495,654,914,7,26,19,13,12,20,381,317,839,647,752,996,21,13,20,8,17,13,417,363,499,867,945,725,27,28,14,11,18,10,326,282,445,736,849,729,26,23,2,15,12,16,252,208,584,733,622,753,10,14,13,16,8,11,238,200,606,735,678,685,6,12,15,7,7,22,238,240,660,643,718,982,15,21,13,5,5,15,246,244,569,652,904,758,18,19,8,12,6,8,426,390,625,937,1135,585,26,13,16,8,20,9,378,304,934,762,606,1208,7,14,18,4,20,11,385,273,496,583,637,644,19,30,12,13,15,19,9 +201,167,618,604,646,720,5,18,6,5,11,4,286,322,651,561,689,1061,10,29,37,8,9,18,252,428,642,558,1010,798,31,19,27,8,3,11,324,448,740,689,785,943,27,27,37,13,15,10,323,461,716,733,897,817,32,27,27,12,16,11,263,329,561,739,1060,803,33,17,14,10,9,9,281,397,780,516,772,1127,16,23,37,5,9,15,343,329,705,401,796,987,13,21,30,12,10,13,464,284,810,535,744,1067,13,16,29,5,15,12,420,312,562,789,1015,796,33,23,23,8,16,9,339,273,442,668,937,822,32,22,9,12,10,15,233,163,647,631,752,832,14,17,10,11,10,10,257,177,639,623,788,780,12,15,12,6,9,15,295,335,613,587,818,1071,21,22,22,6,3,10,245,335,632,600,1040,847,24,16,19,5,4,7,411,331,696,873,1213,672,32,14,5,3,18,8,451,405,891,672,638,1263,11,17,29,7,18,4,378,368,529,475,619,679,21,27,17,12,17,12,9 +148,146,649,658,618,708,0,16,4,4,12,3,261,389,660,619,647,1031,5,27,35,11,10,13,287,423,705,624,1022,782,36,19,25,13,2,12,329,479,753,731,841,985,24,21,35,10,14,9,324,472,729,777,947,803,37,23,25,9,15,6,318,416,556,793,1056,763,36,17,12,15,8,10,316,426,777,560,720,1087,11,23,35,8,8,12,356,382,708,457,718,943,8,25,28,15,9,10,451,329,825,595,752,1037,18,20,27,8,14,11,419,333,613,855,995,818,28,21,21,5,15,10,360,348,459,724,909,746,27,22,7,11,9,16,274,220,698,691,682,768,9,19,8,12,11,11,244,212,698,683,738,718,7,17,10,9,10,10,292,426,626,625,764,997,16,20,20,9,2,5,286,424,627,652,968,803,19,22,17,10,3,8,424,414,735,933,1195,674,27,16,7,4,17,9,444,410,908,718,610,1227,6,19,27,10,17,3,333,425,594,551,635,741,16,27,15,17,16,11,9 +131,109,636,654,620,657,4,15,3,3,13,7,268,390,687,629,669,1012,1,26,34,12,11,19,260,416,706,624,1024,737,32,22,24,12,1,12,334,486,740,735,803,908,28,26,34,9,13,11,307,503,726,779,915,758,33,26,24,8,14,14,267,397,589,793,1070,736,32,20,11,14,7,10,283,417,804,564,742,1080,7,22,34,9,7,16,337,299,727,463,768,932,4,24,27,16,8,16,406,334,836,583,738,1012,20,13,26,9,13,11,392,298,594,837,1017,741,24,28,20,6,14,10,307,261,472,724,935,755,23,23,6,10,8,16,229,127,679,683,720,771,13,14,9,11,12,11,283,175,683,671,768,711,11,14,9,10,11,18,267,353,681,631,794,1008,12,19,19,8,1,13,245,351,646,676,1018,784,15,21,16,9,2,8,411,323,712,945,1235,609,23,15,8,3,16,9,413,373,947,714,614,1230,10,14,26,9,16,7,322,372,569,533,585,630,12,28,14,16,15,15,9 +117,147,595,739,619,682,1,10,14,2,13,4,230,342,638,670,634,1007,6,27,17,9,11,16,246,372,649,633,955,760,37,17,7,15,1,11,324,408,705,792,812,961,25,21,17,12,13,10,293,433,681,820,910,779,38,23,7,11,14,9,255,353,526,780,981,739,37,15,6,17,7,9,257,339,751,591,669,1059,12,27,17,8,7,13,307,295,676,546,641,919,9,25,10,13,8,11,386,270,823,698,763,1013,19,20,9,8,13,12,364,276,557,828,940,796,29,19,25,5,14,9,293,315,429,727,846,718,28,18,11,9,8,15,239,171,642,764,617,740,10,19,10,8,12,10,243,171,650,786,663,698,8,19,8,7,11,13,243,363,622,650,717,967,17,20,2,9,1,8,241,361,591,633,889,777,20,18,1,4,2,7,395,407,683,926,1124,652,28,16,25,2,16,8,393,363,898,801,621,1203,5,19,9,10,16,4,292,352,552,640,660,719,17,25,19,11,15,12,9 +99,115,641,674,604,656,4,15,1,1,11,4,286,378,652,633,625,981,5,30,30,12,9,18,314,376,691,644,982,734,32,16,20,12,3,9,374,426,745,739,823,935,24,18,30,9,15,12,331,463,727,783,919,755,33,20,20,10,16,11,327,423,560,801,1008,715,32,14,7,14,9,7,329,387,765,564,688,1033,11,22,30,9,9,15,371,345,694,483,668,893,8,26,23,16,10,13,436,332,839,613,746,987,18,21,22,9,15,10,388,306,597,869,963,770,24,24,16,4,16,7,333,325,449,736,871,694,23,23,2,8,10,13,269,171,682,707,644,714,13,20,13,9,10,8,307,203,684,701,690,672,11,20,13,10,9,15,297,371,640,629,730,943,16,23,15,10,3,10,291,369,631,674,916,753,19,19,12,7,4,9,419,405,715,957,1151,626,23,19,12,1,18,8,453,397,910,732,600,1177,10,20,22,11,18,4,280,338,588,561,631,693,12,26,10,14,17,12,9 +144,266,590,754,651,628,1,22,30,13,14,4,211,277,607,651,672,995,4,31,3,8,12,18,215,309,628,608,965,706,35,11,9,8,0,9,383,319,686,809,834,905,25,17,9,11,12,12,322,340,672,827,940,727,36,17,9,12,13,11,236,306,509,769,987,711,35,9,22,6,6,7,244,290,736,606,683,1065,10,23,3,11,6,15,290,314,661,561,647,907,7,19,6,4,7,13,397,249,780,713,789,989,19,24,7,11,12,12,347,293,548,809,954,728,27,27,31,12,13,7,256,348,414,718,864,726,26,22,27,6,7,13,250,240,633,769,627,746,10,15,26,5,13,8,288,236,619,801,669,684,8,27,24,10,12,15,224,382,589,659,739,975,15,24,14,12,0,10,216,382,574,598,895,751,18,10,17,7,1,7,384,444,660,891,1130,586,26,22,41,13,15,6,434,380,859,820,651,1201,7,25,7,13,15,4,261,335,525,625,692,649,15,19,19,8,14,12,9 +299,205,588,622,619,698,3,19,8,10,11,8,226,338,609,571,662,1039,8,18,33,9,9,20,182,430,638,588,1039,776,33,22,27,15,3,11,300,456,716,705,826,925,21,28,33,12,15,10,335,451,688,765,940,795,34,28,27,13,16,13,245,339,533,773,1083,781,33,18,16,17,9,9,227,345,732,560,739,1105,14,22,33,6,9,13,325,199,657,443,761,965,11,20,26,13,10,15,408,294,782,555,743,1045,15,15,25,6,15,16,444,326,536,821,1014,774,25,18,19,11,16,9,355,243,414,700,936,800,24,19,11,17,10,15,279,173,621,645,717,810,12,18,12,18,10,10,207,167,631,643,775,758,10,16,14,7,9,17,245,237,599,619,787,1049,19,15,24,5,3,12,277,237,602,626,1011,825,22,25,21,12,4,7,437,353,674,899,1232,650,24,15,9,10,18,8,387,303,867,686,611,1245,9,16,25,4,18,8,410,302,521,493,616,663,13,28,19,11,17,16,9 +171,243,733,672,616,685,17,18,1,5,11,3,266,332,742,629,649,1012,14,25,32,14,9,17,320,336,717,650,930,763,19,15,22,12,3,12,414,334,857,755,701,880,29,11,32,7,15,9,415,357,829,815,801,784,34,15,22,8,16,10,359,355,670,829,984,768,35,11,9,12,9,10,343,381,881,602,740,1076,22,19,32,11,9,14,371,413,808,485,764,946,19,23,25,14,10,12,396,340,845,599,694,1024,7,26,26,11,15,11,438,294,683,855,963,753,41,23,18,6,16,10,369,349,551,756,879,791,38,16,4,10,10,16,371,213,768,697,716,791,26,25,11,9,10,11,339,267,740,687,736,747,24,29,11,12,9,14,303,377,696,669,778,1040,27,18,19,10,3,9,311,375,741,696,998,816,32,18,14,3,4,8,501,399,815,967,1145,637,38,26,10,5,18,9,415,531,972,730,608,1226,23,25,24,9,18,3,276,308,636,531,551,610,25,19,12,8,17,11,9 +234,146,614,612,642,681,1,14,4,5,6,5,371,397,625,591,683,970,4,29,35,8,10,17,325,415,642,624,1080,755,35,21,25,14,14,10,347,483,714,697,875,936,25,23,35,13,10,11,336,474,688,757,991,778,36,25,25,16,11,10,296,406,509,803,1122,728,35,19,12,16,14,8,336,400,734,562,762,1020,10,27,35,9,14,14,400,334,667,463,778,888,7,27,28,12,9,12,497,337,776,537,776,986,19,16,27,9,16,13,415,325,584,851,1045,799,27,23,21,6,9,8,354,264,430,732,965,689,26,26,7,12,9,14,190,202,669,637,736,701,10,13,8,13,5,9,346,216,657,625,804,675,8,15,10,8,8,14,388,318,599,617,806,936,15,28,20,10,14,9,304,314,576,686,1030,766,18,18,17,11,13,6,352,354,704,951,1257,661,26,14,7,5,11,7,494,390,879,672,634,1170,7,15,27,11,13,5,415,315,567,481,657,706,15,29,15,16,12,13,9 +171,123,638,590,656,704,10,21,4,3,9,3,268,368,649,553,683,1073,7,30,35,10,7,17,274,402,658,566,1014,784,26,16,25,10,5,10,360,466,754,673,813,983,26,24,35,11,17,11,339,473,728,721,917,803,31,24,25,10,18,10,303,381,569,741,1062,783,30,16,12,12,11,8,307,399,784,510,764,1143,15,22,35,7,11,14,351,337,711,401,778,985,12,18,28,14,12,12,428,320,798,517,762,1067,14,19,27,7,17,11,456,310,594,799,1009,796,34,26,21,6,18,8,333,305,452,670,929,798,31,23,7,10,12,14,253,161,679,617,736,824,19,18,8,9,8,9,285,191,665,605,780,756,17,18,10,8,7,14,273,389,611,575,802,1051,20,21,20,8,5,9,289,393,640,616,1022,827,25,15,17,3,6,8,471,367,726,887,1197,656,31,17,7,3,20,7,407,419,887,652,644,1279,16,20,27,9,20,3,344,400,561,467,647,715,18,24,15,10,15,11,9 +186,162,634,675,601,674,2,15,1,7,12,8,241,345,673,636,626,997,3,24,30,10,10,20,237,383,690,623,981,752,34,22,20,14,2,11,289,411,752,742,812,951,26,18,30,11,14,10,318,400,720,782,906,775,35,20,20,10,15,15,288,354,553,792,1023,735,34,18,7,16,8,9,270,354,782,559,701,1061,9,22,30,7,8,13,336,294,711,464,705,909,6,24,23,14,9,17,421,315,820,612,721,1003,20,21,22,7,14,14,415,321,588,854,962,786,26,18,16,10,15,9,386,316,458,725,874,722,25,21,2,14,9,15,288,194,673,706,659,742,11,20,13,15,11,10,210,186,677,700,713,694,9,20,13,8,10,19,266,326,657,628,743,973,14,17,15,6,2,14,280,326,620,647,955,771,17,25,12,13,3,7,424,404,716,928,1172,646,25,19,12,7,17,8,416,382,933,735,595,1197,8,20,22,5,17,8,355,299,565,552,608,709,14,26,10,14,16,16,9 +200,214,588,679,602,643,4,15,14,4,8,3,265,269,587,614,629,962,1,28,17,13,4,11,267,363,648,593,1004,713,32,20,7,11,8,14,389,343,670,734,809,898,28,20,19,8,14,7,330,352,654,764,917,738,33,20,7,7,15,4,268,316,465,738,1046,700,32,18,6,13,8,12,288,342,688,535,686,1022,7,20,17,10,12,10,338,314,629,486,702,880,4,26,12,17,9,10,409,255,754,634,742,968,20,17,13,10,14,11,387,335,566,792,969,749,24,24,21,7,15,12,304,316,414,681,889,697,23,21,11,11,9,16,300,212,651,708,660,715,13,20,10,10,9,13,350,154,643,722,728,665,11,22,8,11,6,8,266,344,559,600,730,948,12,21,6,9,8,3,246,344,530,613,954,740,15,17,1,6,9,10,424,440,668,900,1181,611,23,17,25,2,17,11,438,402,847,743,600,1152,10,16,9,8,17,5,285,331,559,560,631,670,12,26,19,13,12,11,9 +325,363,780,746,565,621,22,16,15,14,11,11,246,364,499,661,610,742,17,13,16,13,9,11,142,246,772,734,1003,625,14,27,34,15,3,2,350,288,774,829,798,746,20,25,32,8,15,7,377,249,746,895,914,668,15,21,34,11,16,10,153,225,621,927,1045,582,14,23,21,13,9,2,293,297,654,696,685,804,11,19,32,10,9,4,233,303,603,591,705,684,14,17,39,17,10,16,480,316,712,683,697,774,30,16,40,12,15,17,280,202,782,873,968,701,6,17,2,15,16,0,331,167,628,852,888,577,5,26,18,21,10,6,285,287,867,741,659,593,13,21,23,22,10,1,319,305,841,771,727,541,15,17,27,11,9,14,297,143,529,751,733,796,6,12,33,9,3,9,91,119,622,760,957,620,3,30,28,16,4,2,279,295,860,1037,1180,615,5,18,26,14,18,1,531,435,727,810,559,950,28,15,36,8,18,9,320,246,763,589,578,596,18,25,18,13,17,17,10 +261,357,837,713,569,664,28,26,8,10,17,13,306,352,552,616,614,751,23,19,23,13,15,9,212,192,829,699,1007,670,14,31,31,15,3,0,344,208,849,802,802,809,14,23,39,8,9,5,367,221,817,870,918,717,9,13,31,11,10,10,191,231,682,888,1049,619,8,29,18,13,3,4,311,333,709,663,689,801,17,11,37,10,7,2,279,401,666,544,709,685,20,17,36,17,12,14,492,382,757,642,701,797,32,24,37,12,9,15,252,168,833,852,972,746,2,19,9,11,10,2,281,183,679,813,892,552,1,14,15,17,8,4,261,261,918,702,663,610,19,25,20,18,16,1,379,335,892,730,731,540,21,17,20,11,15,12,323,245,548,730,737,777,12,12,30,9,3,11,153,221,691,729,961,665,9,28,25,16,2,4,279,293,921,1004,1184,656,1,28,19,10,12,3,513,531,748,777,561,953,34,23,33,10,14,9,356,262,808,552,580,645,12,15,11,17,11,15,10 +294,210,916,596,613,673,26,13,4,6,9,10,453,465,595,573,660,864,21,28,35,13,13,12,373,309,876,622,1049,717,18,22,25,15,11,3,295,373,856,687,844,920,16,24,35,16,9,18,324,404,834,751,960,730,11,26,25,17,10,9,276,318,739,795,1091,648,10,20,12,13,11,1,390,384,654,560,735,906,15,30,35,16,13,13,424,414,647,471,755,788,18,28,28,17,12,17,523,401,642,513,743,900,36,15,29,16,19,18,267,207,920,831,1014,805,2,20,21,5,2,1,354,164,766,722,934,565,1,27,7,9,8,7,214,180,1005,615,709,639,17,10,8,10,8,2,430,298,985,601,773,559,19,14,10,15,11,15,484,314,593,615,783,816,10,29,22,17,11,8,286,282,730,696,1007,696,7,19,17,10,10,1,230,250,976,959,1230,659,1,13,7,8,4,0,518,538,639,654,607,1048,32,14,27,18,16,10,441,323,911,457,622,746,14,30,15,15,15,18,10 +283,351,855,738,578,682,27,20,12,8,16,11,308,320,556,647,623,749,22,15,19,13,14,11,190,162,809,716,1012,668,13,35,33,15,2,2,298,214,865,827,807,781,15,27,35,8,10,3,345,209,831,895,923,707,10,17,33,11,11,8,157,225,700,909,1054,637,9,33,20,13,4,6,313,273,731,686,700,799,16,15,35,10,6,4,263,353,684,567,722,687,19,21,38,17,11,16,500,312,737,671,706,789,31,20,39,10,10,17,194,158,851,873,977,736,3,17,5,9,11,0,309,189,697,834,897,616,0,16,17,15,7,6,277,269,936,735,678,626,18,21,22,16,15,1,363,301,898,759,736,570,20,11,24,11,14,14,343,217,558,753,748,803,11,16,32,9,2,9,117,193,709,724,972,681,8,32,27,14,1,6,229,313,939,1003,1191,664,0,22,23,8,13,3,505,481,744,802,570,953,33,19,35,10,13,9,348,252,820,581,585,621,13,21,15,15,12,17,10 +344,380,815,810,615,680,29,18,18,16,9,14,409,285,520,705,660,815,24,23,19,17,11,12,303,203,815,726,1053,688,15,27,41,17,13,3,305,221,833,907,848,783,17,25,31,14,1,2,320,188,799,939,964,685,8,15,41,15,2,9,216,202,662,919,1095,685,7,25,28,15,9,9,388,276,689,724,735,841,18,21,31,14,7,5,314,328,646,611,755,737,21,27,38,13,10,17,529,273,695,741,747,843,33,22,39,16,13,18,169,187,811,837,1018,742,3,15,1,13,0,1,352,220,657,850,938,650,2,22,25,15,6,7,304,306,896,785,709,632,20,21,28,16,10,2,440,316,874,829,777,622,22,21,28,15,11,15,444,198,528,793,783,843,13,22,40,13,13,8,190,178,673,712,1007,705,10,24,35,10,12,9,136,348,901,997,1230,662,2,22,27,16,2,6,518,454,696,880,607,943,35,21,39,12,14,12,357,211,794,641,626,627,15,21,19,7,11,18,10 +263,329,773,890,721,648,33,27,18,4,16,8,226,208,658,791,762,867,32,14,19,13,14,10,126,288,689,804,1041,660,19,20,41,13,4,11,310,252,847,985,804,675,13,20,31,8,8,0,331,219,813,1027,898,605,18,20,41,11,9,9,117,205,650,1005,1095,741,19,22,28,13,4,19,241,241,783,814,851,897,40,20,31,10,4,3,205,219,722,699,879,789,37,14,38,17,11,15,432,146,761,819,795,861,15,17,39,10,8,16,226,296,755,859,1074,628,27,6,1,7,9,5,267,283,601,938,990,802,28,19,25,11,9,11,275,295,840,843,831,706,30,32,28,10,15,8,309,227,792,907,841,742,34,20,28,11,16,13,273,229,608,883,891,937,39,19,40,9,4,10,91,229,685,762,1109,745,36,19,35,6,3,17,267,433,869,1037,1218,582,28,17,27,2,11,16,473,327,894,954,709,1013,39,28,39,8,11,12,298,302,710,709,648,501,17,12,19,13,10,16,10 +287,285,641,923,606,691,11,24,20,5,7,9,268,214,612,814,655,892,14,17,21,12,7,11,178,372,665,791,1022,693,25,23,39,12,7,12,318,318,715,1016,817,700,15,25,29,9,9,1,331,331,687,1042,933,602,26,25,39,8,8,8,147,263,540,994,1064,756,25,25,30,14,9,18,293,287,721,827,728,888,20,25,29,9,7,4,245,183,650,720,754,772,17,19,36,16,2,16,476,178,785,864,724,834,29,12,37,9,9,17,232,348,625,858,1003,693,17,7,1,8,8,6,305,295,485,935,921,811,16,14,27,12,10,12,267,243,710,886,706,731,6,27,30,13,6,9,323,177,686,952,754,769,10,17,30,10,5,14,331,197,604,890,780,924,15,20,42,8,7,9,123,207,573,747,1004,748,12,22,37,11,8,16,227,425,739,994,1221,649,16,12,29,5,10,17,523,253,872,1001,600,962,17,25,37,7,10,11,282,318,598,756,595,608,9,17,21,16,11,17,10 +330,286,1015,571,605,688,27,18,8,9,11,13,393,571,692,562,646,587,22,29,39,10,15,9,287,321,905,605,1043,628,17,15,29,18,9,0,377,449,951,652,838,735,15,31,39,11,7,15,388,442,933,718,954,569,10,31,29,14,8,12,266,370,838,770,1085,593,9,19,16,16,9,2,404,458,747,525,725,705,16,31,39,9,11,10,326,472,742,452,741,557,19,21,32,14,14,14,587,471,731,482,737,627,35,20,31,9,19,15,213,235,1019,838,1008,762,1,21,25,10,4,2,330,166,865,699,928,590,0,20,11,16,10,4,328,256,1104,596,699,628,18,19,12,17,10,1,446,362,1084,570,767,568,20,17,14,8,13,12,412,352,582,580,769,555,11,24,24,10,9,11,208,318,829,673,993,599,8,12,21,15,8,4,212,152,1075,940,1220,672,0,6,3,9,6,3,594,532,622,621,597,761,33,21,31,11,18,9,331,395,1012,446,616,801,13,23,19,18,15,15,10 +333,293,848,725,579,670,22,14,12,6,12,10,348,354,533,670,622,741,17,25,19,11,10,12,228,194,816,709,1013,634,14,21,29,15,2,3,384,240,834,804,808,741,20,21,35,10,14,8,415,287,802,874,924,645,15,19,29,11,15,9,215,287,681,896,1055,609,14,19,16,15,8,1,375,265,688,667,699,775,11,21,35,8,8,5,315,317,653,558,719,659,14,23,34,15,9,17,572,350,694,668,707,753,32,18,35,8,14,18,232,132,848,894,978,726,6,23,5,7,15,1,321,223,694,823,898,640,5,22,13,13,9,7,311,177,933,748,675,622,13,23,18,14,11,2,421,275,913,756,737,594,15,21,24,9,10,15,369,245,527,722,747,763,6,18,28,9,2,8,129,225,686,737,971,635,3,18,23,12,3,1,233,313,924,1014,1192,658,5,18,23,6,17,0,593,457,701,789,571,927,28,17,31,10,17,10,324,280,839,586,586,647,18,27,15,17,16,18,10 +298,216,894,639,600,649,20,21,3,2,9,10,333,447,571,608,617,718,15,24,34,11,7,12,215,297,850,603,1000,597,16,12,24,13,5,3,379,363,852,710,815,740,22,28,34,10,17,14,430,420,826,744,911,568,17,28,24,11,18,9,214,336,721,760,1042,576,16,16,11,15,11,1,386,350,672,527,686,776,9,28,34,10,11,9,334,372,651,456,702,632,12,18,27,15,12,17,575,393,662,574,740,718,32,23,26,10,17,18,271,175,898,830,965,707,8,18,20,3,18,1,362,202,744,695,885,641,7,17,6,9,12,7,288,130,983,672,658,613,11,24,9,10,8,2,396,278,955,662,724,593,13,20,9,9,7,15,376,312,549,592,730,708,4,21,19,11,5,8,142,296,716,659,954,586,1,15,16,8,6,1,280,224,962,932,1177,631,7,9,8,2,20,0,604,490,671,701,596,924,26,24,26,12,20,10,375,369,879,528,629,722,20,22,14,15,15,18,10 +288,334,787,785,618,704,22,18,16,7,13,13,329,293,500,694,659,797,17,17,15,12,13,13,227,205,783,733,1056,698,20,33,35,14,7,4,291,217,799,866,851,809,20,27,31,9,7,3,330,218,765,928,967,711,15,17,35,10,8,10,170,228,632,924,1098,673,14,31,22,14,7,8,332,244,667,713,738,805,11,17,31,9,5,6,304,314,612,596,754,717,14,21,38,16,8,18,519,275,709,730,750,827,38,20,39,9,11,19,201,169,783,888,1021,768,6,19,1,8,6,2,334,226,629,853,941,610,5,16,19,14,6,8,274,242,868,788,712,630,13,21,24,15,12,3,378,282,858,818,780,608,15,11,28,10,13,16,374,210,514,776,782,809,6,18,34,8,7,7,150,200,641,719,1006,705,3,30,29,13,6,8,190,346,871,1002,1233,692,5,20,27,7,8,5,514,440,706,851,610,935,28,19,37,9,12,11,343,229,778,638,629,665,18,23,19,16,11,19,10 +342,346,792,791,655,760,22,29,23,5,14,13,415,335,509,680,696,831,17,18,18,10,12,13,301,173,782,691,1093,746,20,28,38,14,6,4,365,177,810,874,888,825,20,14,28,11,6,3,386,256,780,904,1004,747,15,6,38,10,7,10,240,290,637,868,1135,711,14,24,33,16,6,8,412,292,674,683,775,849,11,10,28,7,6,6,358,394,629,590,791,747,14,20,35,14,13,18,599,371,698,742,787,853,38,33,36,7,6,19,249,139,786,834,1058,822,6,18,4,8,7,2,400,264,632,809,978,654,5,21,30,12,11,8,276,246,871,786,749,700,13,32,29,11,13,3,434,336,853,830,817,642,15,24,27,8,14,16,442,310,483,750,819,857,6,17,39,6,6,7,190,290,650,659,1043,749,3,27,34,5,5,8,186,334,874,950,1270,750,5,33,30,3,9,5,598,516,695,867,647,941,28,32,36,7,9,11,371,291,781,650,666,727,18,12,16,12,12,19,10 +283,321,770,781,620,630,22,17,13,6,14,15,318,314,499,686,659,881,21,14,18,15,18,11,212,228,732,759,1014,668,18,28,34,11,6,2,290,254,790,870,799,749,10,28,34,6,6,1,345,247,752,926,905,659,15,18,34,7,7,8,155,235,621,952,1060,733,14,26,21,11,6,10,303,267,656,723,736,939,21,18,34,12,10,4,281,295,605,616,756,827,24,16,39,19,15,16,496,286,672,718,738,905,32,19,40,12,12,17,222,188,764,852,1007,646,8,16,4,7,7,0,315,193,610,881,925,770,5,9,18,13,11,6,289,237,849,762,708,706,13,26,23,14,13,1,373,255,811,806,764,726,15,18,25,13,16,14,349,181,535,780,784,957,16,13,33,11,6,9,133,169,632,745,1008,749,13,25,28,12,5,10,249,323,858,1030,1225,576,5,19,24,6,9,7,501,425,719,849,616,1095,28,18,36,10,17,13,350,232,733,612,591,493,8,24,16,13,12,17,10 +245,363,777,757,611,683,23,29,12,7,16,12,328,346,520,662,652,794,18,16,19,18,16,10,224,198,773,725,1049,689,19,28,31,8,4,1,334,182,807,842,844,830,19,16,35,9,8,2,353,235,775,896,960,726,14,6,31,10,9,9,213,295,626,912,1091,652,13,24,18,8,4,7,333,333,681,687,731,834,12,8,35,15,8,3,297,411,630,574,747,716,15,18,36,22,13,15,520,396,725,698,745,830,37,31,37,15,10,16,240,158,769,870,1014,761,5,18,5,10,9,1,305,243,615,839,934,595,4,19,15,12,9,5,257,257,854,754,705,633,14,32,20,13,15,0,371,349,838,786,773,577,16,22,24,16,16,13,349,283,478,748,775,816,7,15,30,14,4,10,165,257,645,735,999,690,4,25,25,11,3,7,245,335,861,1014,1226,671,4,31,23,7,11,4,543,555,714,825,603,974,29,30,33,13,15,10,328,268,762,606,626,660,17,12,15,12,10,16,10 +247,401,857,781,700,667,32,16,15,3,10,10,348,250,554,688,749,938,31,23,16,12,14,12,260,152,773,737,1048,717,20,23,36,12,10,3,240,168,863,868,813,788,8,23,32,9,2,4,297,171,831,932,913,712,7,17,36,12,3,9,161,181,698,930,1100,770,8,21,23,14,10,5,299,223,695,721,828,996,33,19,32,9,10,5,309,357,662,602,856,882,36,21,39,16,13,17,454,286,681,720,792,962,22,20,40,9,14,18,208,178,855,858,1073,697,16,21,2,6,3,1,307,267,701,857,989,797,17,16,20,10,9,7,241,299,940,768,808,751,23,25,25,9,9,2,363,323,894,808,834,753,25,19,27,10,12,15,385,297,540,790,878,1006,28,16,35,8,10,8,171,271,705,741,1100,794,25,20,30,5,9,5,223,391,939,1022,1241,617,17,20,26,1,5,2,445,475,730,851,696,1134,38,19,38,9,17,10,386,286,822,620,643,538,16,25,18,12,14,18,10 +365,231,954,651,625,717,22,20,2,4,9,11,420,496,631,604,668,698,17,29,33,13,11,13,286,294,892,647,1063,675,18,17,23,15,13,4,382,366,914,742,858,806,20,33,33,12,7,13,377,395,886,798,974,632,15,33,23,13,8,10,239,369,781,824,1105,644,14,21,10,13,9,2,411,393,726,593,745,764,11,29,33,12,11,8,345,397,711,484,765,640,14,19,26,17,10,18,582,428,712,574,757,724,36,18,27,12,17,19,258,180,958,856,1028,779,6,25,19,5,0,2,363,203,804,751,948,653,5,18,5,11,6,8,273,181,1043,672,721,663,13,17,10,12,10,3,469,305,1023,662,787,577,15,17,10,11,11,16,431,301,559,658,793,684,6,22,20,13,13,7,191,283,776,697,1017,668,3,14,15,10,12,0,211,173,1022,966,1240,701,5,8,9,4,2,1,573,469,621,713,617,892,28,19,25,14,14,11,410,378,951,510,636,744,18,25,13,15,13,19,10 +274,272,934,614,578,696,27,13,2,4,8,12,429,473,611,599,619,821,22,28,33,11,12,10,353,235,890,652,1016,724,19,22,23,17,12,1,293,279,904,689,811,929,15,22,33,14,10,12,324,340,874,759,927,733,10,22,23,15,11,11,272,312,763,801,1058,641,9,20,10,15,10,1,378,396,714,560,698,865,16,28,33,14,14,7,396,454,697,493,714,751,19,28,26,15,11,15,513,439,706,545,710,865,37,15,25,14,18,16,229,151,938,877,981,814,1,20,19,5,1,1,330,182,784,740,901,534,0,27,5,11,7,5,254,238,1023,653,672,648,18,12,10,12,9,0,426,346,1001,633,740,546,20,16,10,13,10,13,466,314,579,615,742,785,11,29,18,15,12,10,292,274,762,708,966,699,8,19,15,10,11,3,256,244,1006,981,1193,690,0,15,9,6,3,2,516,582,637,672,570,1007,33,14,25,16,15,8,403,333,925,493,589,765,13,28,13,17,14,16,10 +318,370,814,688,616,682,24,21,12,5,13,12,417,319,535,613,659,731,19,20,21,10,11,10,303,269,806,666,1054,670,14,30,35,16,1,1,407,209,834,787,849,799,18,16,37,15,13,4,424,234,804,839,965,697,13,10,35,18,14,9,284,270,659,859,1096,619,12,26,22,18,7,5,422,378,700,634,736,787,13,14,37,13,7,3,392,454,655,515,754,671,16,22,40,10,8,15,609,357,726,611,748,777,32,31,41,13,13,16,241,223,808,859,1019,760,4,18,7,6,14,1,362,276,654,784,939,592,3,21,19,12,8,5,286,288,893,689,710,632,15,30,22,13,12,0,444,332,871,699,778,580,17,22,22,12,11,13,446,314,499,699,782,773,8,19,34,14,1,10,250,284,674,686,1006,661,5,29,29,11,2,5,274,386,896,965,1231,676,3,31,21,5,16,2,634,576,707,754,608,939,30,30,37,15,16,8,383,235,795,529,627,659,16,20,13,14,15,16,10 +258,262,856,672,583,643,20,11,3,2,11,10,359,385,543,647,596,780,15,26,28,11,9,12,267,241,824,606,947,647,16,18,18,13,3,3,369,273,792,727,794,832,22,18,28,12,15,18,404,304,774,763,884,628,17,20,18,13,16,9,224,292,679,763,987,564,16,16,5,15,9,1,356,330,636,534,651,838,9,24,28,12,9,13,380,394,597,465,643,692,12,24,21,15,10,17,541,365,702,613,729,794,32,21,20,12,15,18,243,169,860,847,926,771,8,24,16,3,16,1,330,224,706,698,834,563,7,21,0,7,10,7,252,188,945,713,607,621,11,20,15,8,10,2,410,308,927,701,669,551,13,22,15,11,9,15,364,276,563,605,693,746,4,19,13,13,3,8,196,254,670,634,895,612,1,19,10,6,4,1,302,304,916,917,1122,641,7,21,14,4,18,0,570,516,657,728,583,976,26,20,20,14,18,10,331,271,851,565,618,746,20,26,14,13,17,18,10 +320,266,995,654,588,739,29,20,2,2,16,11,357,421,672,623,621,678,24,27,33,11,14,13,241,239,863,662,1018,667,23,11,23,13,2,4,363,295,955,721,813,766,13,27,33,10,10,13,402,346,927,773,929,630,8,27,23,11,11,10,206,254,822,801,1060,664,7,15,10,15,4,2,380,300,753,562,700,694,18,29,33,8,8,8,304,368,748,503,716,596,21,19,26,15,13,18,579,369,693,595,728,690,35,24,25,8,10,19,233,127,999,869,983,767,1,17,19,5,11,2,324,178,845,746,903,649,2,16,5,9,7,8,308,206,1084,689,674,639,20,21,10,8,15,3,412,284,1042,683,742,641,22,21,10,9,14,16,376,310,580,619,744,632,13,22,18,9,2,7,134,286,817,702,968,666,10,10,15,6,1,0,226,212,1063,983,1195,713,2,10,9,0,13,1,598,482,670,714,584,834,35,25,25,10,15,11,329,381,974,533,611,786,13,19,13,13,12,19,10 +318,304,874,730,673,625,23,19,18,5,16,11,259,455,551,663,692,704,18,22,25,12,14,13,195,293,844,586,1021,567,15,18,15,12,4,4,315,391,840,801,880,724,19,32,21,9,8,11,322,438,816,807,980,560,14,32,15,8,9,10,122,318,699,765,1039,538,13,20,26,14,4,2,268,360,654,598,739,770,12,30,21,9,4,6,210,364,639,519,701,616,15,20,14,16,11,18,447,395,650,669,815,706,33,17,13,11,8,19,243,227,878,821,1010,701,5,14,25,8,9,2,308,182,724,698,916,597,4,19,21,12,9,8,284,220,963,753,679,605,14,20,18,13,15,3,304,320,953,757,721,569,16,16,16,10,16,16,340,280,515,651,787,678,7,23,20,8,4,7,138,256,696,612,947,538,4,21,23,11,3,0,216,168,940,891,1186,611,4,7,21,5,11,1,502,428,681,796,671,906,29,20,13,7,11,11,295,397,879,605,702,740,17,24,15,16,12,19,10 +381,347,806,766,624,645,24,15,12,12,10,11,376,362,485,677,665,796,21,20,19,13,12,13,262,286,808,754,1062,667,22,26,35,15,14,4,366,338,800,857,857,782,16,26,35,8,8,3,349,303,764,927,973,686,17,24,35,11,9,10,203,241,645,947,1104,672,16,24,22,13,8,6,365,317,638,726,744,844,15,20,35,10,12,6,323,263,603,607,760,732,18,18,40,17,9,18,526,308,648,699,756,838,38,13,41,12,16,19,284,232,806,865,1027,705,8,20,5,13,1,2,371,151,652,872,947,637,7,13,19,19,7,8,283,277,891,747,718,601,15,22,24,20,11,3,421,273,881,787,786,613,17,18,24,11,12,16,399,127,525,785,788,842,10,13,34,9,14,7,167,95,650,756,1012,694,7,23,29,16,13,6,221,277,888,1037,1239,629,7,17,23,12,1,3,509,403,631,830,616,990,26,12,37,8,13,11,428,250,809,599,635,572,16,26,15,15,12,19,10 +260,262,777,711,584,607,19,17,8,7,3,13,183,439,504,644,619,784,14,12,23,12,5,9,131,223,765,691,986,597,17,32,25,12,13,0,343,305,781,780,799,774,23,24,37,9,15,9,354,326,753,832,899,624,18,20,25,8,16,12,136,336,618,844,1028,562,17,28,12,14,13,2,234,308,659,613,692,850,8,18,31,9,13,4,204,370,610,528,708,710,11,22,30,16,6,14,419,411,699,650,704,792,29,17,31,9,11,15,291,169,775,896,959,707,9,20,9,8,12,2,276,194,621,785,877,603,8,27,9,14,8,4,310,186,860,726,660,613,10,18,14,15,2,1,260,288,824,738,718,567,12,18,20,10,3,12,258,240,526,678,736,798,3,11,24,8,13,11,150,232,621,733,960,584,0,33,19,13,14,4,324,240,855,1012,1177,601,8,19,19,7,14,3,486,490,760,771,578,996,25,16,27,7,14,9,287,325,750,570,587,660,21,24,11,14,15,15,10 +295,269,904,653,606,707,24,14,2,5,17,10,356,444,581,606,647,740,19,29,33,12,15,12,246,202,854,643,1044,681,16,17,23,16,3,3,348,274,882,742,839,810,18,23,33,9,9,10,371,333,854,806,955,658,13,23,23,12,10,9,207,319,737,830,1086,640,12,17,10,14,3,1,363,337,722,601,726,784,13,25,33,9,7,5,337,391,687,484,742,666,16,25,26,16,12,17,558,420,726,570,738,766,34,18,27,9,9,18,230,124,908,864,1009,775,4,23,19,6,10,1,341,207,754,755,929,635,3,22,5,12,8,7,255,207,993,670,700,647,15,19,10,13,16,2,417,325,969,658,768,595,17,15,10,10,15,15,385,261,545,666,770,746,8,22,20,10,3,8,167,231,736,685,994,674,5,18,15,11,2,1,207,233,980,956,1221,693,3,14,9,5,12,0,573,525,687,709,598,936,30,19,25,11,14,10,338,322,895,506,617,716,16,27,13,16,11,18,10 +279,215,817,685,624,669,19,15,11,6,10,11,296,456,508,622,669,772,14,18,24,11,8,13,216,284,801,631,1062,623,17,24,34,13,4,4,348,366,801,776,857,746,23,28,40,10,10,9,359,417,773,814,973,642,18,28,34,9,11,10,181,333,648,812,1104,600,17,20,21,15,4,2,325,345,651,597,744,796,8,26,40,8,4,6,253,367,608,484,764,674,11,22,39,15,5,18,512,400,663,618,756,774,33,15,40,10,10,19,224,164,819,834,1027,739,9,18,10,7,11,2,315,223,665,741,947,627,8,23,18,13,5,8,291,167,904,702,718,623,10,16,19,14,9,3,335,271,884,706,786,615,12,16,19,9,8,16,365,291,510,666,792,764,3,19,33,9,4,7,157,283,649,655,1016,610,0,27,28,12,5,0,189,201,891,932,1239,661,8,11,18,6,13,1,575,463,706,755,616,918,25,16,36,10,13,11,256,386,810,542,635,700,21,28,10,17,12,19,10 +233,215,864,642,574,626,22,14,1,6,9,12,394,434,543,593,621,933,17,27,30,13,13,10,302,262,816,680,1012,700,20,23,20,15,11,1,300,308,832,719,807,885,12,23,32,12,7,12,361,371,800,791,923,727,15,25,20,13,8,11,261,331,695,833,1054,695,14,21,7,13,11,1,343,359,648,592,696,997,21,23,30,12,11,7,387,379,629,519,718,847,20,27,25,17,12,15,492,382,660,571,706,939,32,14,26,12,19,16,280,168,868,857,977,722,6,23,16,7,2,1,341,199,714,772,897,674,5,24,4,13,8,5,243,177,953,667,670,674,13,15,13,14,8,0,381,287,921,659,736,652,15,15,13,11,11,13,405,269,571,647,746,921,16,24,19,13,11,10,241,247,694,732,970,727,13,20,14,12,10,3,333,277,938,1007,1191,600,5,16,12,6,4,2,483,507,697,698,568,1137,28,13,22,14,16,8,388,308,843,493,585,643,8,27,10,15,15,16,10 +318,396,897,622,656,742,28,21,2,10,11,17,415,463,584,569,697,775,23,20,33,17,15,5,411,261,751,636,1094,740,24,30,25,17,9,4,407,263,917,713,889,913,14,22,37,20,5,7,354,298,881,775,1005,733,9,20,25,21,6,12,334,340,740,813,1136,671,8,28,12,15,9,6,422,488,751,582,776,751,17,26,33,20,11,2,396,556,712,475,792,727,20,32,30,13,14,10,555,497,745,543,788,833,36,25,31,20,17,11,221,241,893,837,1059,848,0,8,19,7,4,6,302,254,739,740,979,576,1,27,9,3,10,0,308,336,978,635,750,680,19,14,10,4,10,5,474,472,918,631,818,592,21,18,10,19,13,8,494,382,536,641,820,681,12,27,24,21,9,13,376,352,757,692,1044,713,9,27,19,14,8,8,286,318,977,961,1271,740,1,29,9,12,6,7,572,696,702,684,648,919,34,24,27,22,18,13,359,341,864,469,667,791,14,20,13,11,15,11,10 +280,374,809,731,614,697,22,24,14,0,16,11,341,295,524,648,647,778,17,17,17,11,14,11,227,165,765,717,1044,675,18,27,29,13,2,2,355,161,819,800,839,802,20,19,33,10,10,5,404,218,791,856,955,702,15,9,29,11,11,10,204,254,650,868,1086,650,14,23,16,15,4,4,364,284,679,633,726,816,11,11,33,10,6,4,290,374,640,560,742,704,14,15,34,15,11,16,561,331,699,680,750,804,36,28,35,10,10,17,217,181,807,870,1009,753,6,15,3,3,11,0,312,268,653,815,929,649,5,22,13,7,7,6,294,266,892,740,700,635,13,29,18,8,15,1,390,326,862,768,768,583,15,19,26,9,14,14,360,294,480,698,770,792,6,12,28,11,2,9,136,272,659,729,994,688,3,30,23,6,1,4,236,374,891,1010,1221,673,5,28,25,2,13,1,590,502,698,793,608,962,28,27,31,12,13,9,325,239,792,588,631,680,18,17,17,13,12,17,10 +319,349,801,882,676,672,25,24,17,3,8,11,356,214,536,777,727,895,22,21,18,10,12,13,248,274,761,784,1062,688,23,25,40,14,12,6,294,228,843,979,835,697,7,25,32,11,2,3,305,239,809,1015,943,627,12,23,40,12,3,10,165,217,658,981,1110,767,11,27,27,16,10,14,337,235,697,800,800,927,28,23,32,7,8,6,281,225,648,683,828,821,27,17,39,14,11,18,494,176,691,813,786,885,25,14,40,7,14,19,190,258,789,855,1067,658,11,15,2,6,1,2,331,257,635,920,985,822,12,12,24,10,7,8,285,287,874,845,780,732,16,29,27,11,9,3,393,245,834,901,820,768,18,15,27,8,10,16,387,179,562,869,852,969,23,18,39,8,12,7,143,183,679,738,1076,773,20,22,34,9,11,14,175,391,889,1021,1287,608,12,14,26,3,3,11,487,343,768,954,670,1037,31,25,40,9,15,13,370,256,758,705,629,525,9,17,18,16,12,19,10 +273,269,860,632,578,639,22,15,1,11,10,11,244,492,537,605,625,706,17,22,32,10,8,11,150,252,832,670,1014,607,14,20,22,18,4,2,326,358,828,709,809,778,20,30,32,11,16,13,355,357,800,777,925,584,15,30,22,14,17,10,149,353,691,819,1056,560,14,22,9,16,10,0,291,375,676,578,700,766,11,28,32,7,10,8,265,391,645,511,720,624,14,24,25,14,11,16,482,442,690,565,708,720,32,15,24,9,16,17,252,200,864,885,979,725,6,20,18,12,17,0,305,197,710,758,899,581,5,23,4,18,11,6,259,211,949,665,674,599,13,16,11,19,9,1,321,317,929,653,738,567,15,12,11,8,8,14,299,251,529,633,748,702,6,21,17,8,4,9,117,229,688,726,972,584,3,23,14,15,5,2,263,205,932,997,1195,637,5,9,10,11,19,1,519,473,679,692,572,914,28,16,24,9,19,9,298,330,855,503,587,714,18,30,12,16,16,17,10 +329,247,983,633,584,713,28,15,1,11,9,11,440,476,660,598,625,814,23,34,30,18,11,11,358,244,893,653,1022,733,20,16,20,18,13,2,296,300,943,710,817,928,14,24,32,21,9,15,335,355,915,776,933,732,9,26,20,22,10,10,269,285,810,812,1064,646,8,20,7,16,9,0,425,367,735,573,704,838,17,36,30,21,13,10,379,421,734,490,720,752,20,24,25,14,10,16,528,426,727,562,716,866,36,21,26,21,17,17,152,162,987,852,987,837,0,22,16,8,0,0,325,115,833,747,907,539,1,25,4,4,6,6,307,207,1072,656,678,667,19,8,13,5,10,1,457,319,1048,650,746,553,21,16,13,20,11,14,507,305,580,632,748,756,12,31,19,22,13,9,283,269,805,703,972,702,9,13,14,15,12,2,193,215,1051,978,1199,707,1,13,12,13,2,1,517,551,614,689,576,986,34,20,22,23,14,9,410,330,972,494,597,766,12,26,10,12,13,17,10 +279,423,741,793,622,715,23,31,20,5,16,15,364,276,536,690,663,816,18,18,21,16,14,9,282,208,759,693,1060,713,17,24,37,12,4,2,372,150,785,886,855,810,19,14,27,15,8,1,367,201,753,910,971,726,14,4,37,16,9,10,255,273,598,880,1102,684,13,20,30,10,4,10,367,347,685,695,742,854,12,10,27,15,4,2,355,435,626,590,758,742,15,20,34,16,11,14,552,328,745,730,754,852,35,33,35,15,8,15,268,192,731,844,1025,785,5,18,3,8,9,2,299,323,577,811,945,641,4,21,27,6,9,4,245,311,816,788,716,659,14,30,32,7,15,1,413,365,800,818,784,625,16,26,32,14,16,12,399,347,486,758,786,846,7,17,42,16,4,11,237,325,621,687,1010,718,4,23,37,9,3,10,257,403,831,972,1237,703,4,33,31,7,11,7,573,555,748,865,614,938,29,32,35,17,11,13,358,286,724,638,633,680,17,10,23,12,10,15,10 +217,165,734,625,597,631,13,13,1,6,13,5,396,368,565,594,646,930,14,32,32,13,11,17,356,364,682,653,1023,705,27,16,22,15,1,8,364,412,706,700,818,904,15,20,32,10,13,13,349,431,652,762,934,732,24,22,22,11,14,10,325,381,593,810,1065,682,23,16,9,13,7,6,401,387,630,565,719,1004,20,26,32,10,7,16,463,345,573,490,743,842,17,28,25,17,10,12,536,346,702,548,723,940,31,21,26,10,13,13,330,290,738,858,998,749,15,24,18,7,14,6,399,281,584,743,918,667,14,21,4,13,8,12,225,143,823,650,695,681,8,20,11,14,12,7,415,215,803,636,751,631,12,18,11,11,11,14,395,317,583,620,771,918,17,25,19,11,1,9,285,317,582,705,995,718,14,17,14,12,2,6,343,383,828,978,1214,611,14,17,10,6,16,5,527,465,757,679,593,1138,19,20,24,12,16,5,368,286,729,484,600,674,7,26,12,15,15,13,10 +268,224,828,663,631,672,19,17,2,5,11,10,283,385,511,602,674,787,14,18,33,10,9,12,189,269,792,641,1061,666,17,28,23,16,3,3,365,335,810,758,856,797,23,26,35,11,15,10,374,348,782,808,972,673,18,24,23,14,16,9,186,314,659,830,1103,615,17,24,10,16,9,1,336,278,664,603,751,839,8,18,33,9,9,5,296,316,627,484,771,723,11,20,28,14,10,17,521,361,678,588,755,817,33,15,29,9,15,18,275,183,830,840,1026,752,9,24,19,6,16,1,320,222,676,755,948,630,8,27,7,12,10,7,232,144,915,678,727,638,10,16,10,13,10,2,352,242,891,676,787,588,12,18,10,8,9,15,336,242,529,668,799,817,3,11,22,10,3,8,142,234,660,683,1023,657,0,31,17,11,4,1,242,296,902,954,1244,658,8,19,9,5,18,0,562,440,705,729,623,999,25,14,25,11,18,10,323,293,815,506,634,655,21,24,13,18,17,18,10 +281,291,853,668,568,672,23,15,9,6,13,12,372,434,546,625,617,697,18,24,22,11,11,10,262,232,827,676,1004,640,15,26,26,17,1,1,364,254,853,747,799,777,19,26,38,12,13,8,401,321,823,811,915,625,14,20,26,13,14,11,249,345,690,849,1046,597,13,24,13,15,7,1,383,335,709,612,690,759,12,20,32,12,7,3,351,411,668,519,716,619,15,22,31,15,10,15,568,420,725,609,698,717,33,17,32,12,13,16,242,114,851,883,969,746,5,24,8,7,14,1,327,257,697,788,889,612,4,19,10,13,8,5,277,215,936,693,668,636,14,20,15,14,12,0,431,339,910,697,728,582,16,16,21,11,11,13,391,297,506,667,742,721,7,17,25,13,1,10,203,269,697,714,966,623,4,23,20,12,2,3,279,273,931,987,1185,668,4,17,20,6,16,2,587,531,690,734,564,901,29,16,28,14,16,8,368,334,836,535,579,685,17,26,12,17,15,16,10 +292,282,912,627,634,709,24,21,7,4,15,12,387,517,587,580,677,712,19,28,38,13,13,10,265,269,868,615,1072,661,16,14,28,13,1,1,355,333,896,718,867,784,18,30,38,10,11,10,380,356,864,770,983,626,13,30,28,11,12,11,238,410,743,794,1114,638,12,18,15,13,5,1,396,392,724,563,754,776,13,28,38,10,5,5,354,448,695,450,774,638,16,18,31,17,10,15,585,485,720,550,766,726,34,21,30,10,11,16,245,161,914,836,1037,765,4,24,24,5,12,1,362,250,760,721,957,657,3,19,10,11,6,5,256,224,999,648,730,653,15,20,11,12,14,0,420,370,975,638,796,605,17,18,13,11,13,13,408,328,543,628,802,712,8,21,23,11,1,10,188,304,746,657,1026,660,5,11,20,10,0,3,224,208,986,930,1249,691,3,9,4,4,14,2,590,552,667,691,626,908,30,22,30,12,14,8,371,395,899,488,645,720,16,24,18,15,13,16,10 +329,295,812,718,586,601,24,17,9,6,8,12,386,362,497,629,625,814,23,22,22,17,12,10,298,270,806,746,1022,645,24,28,28,11,12,1,334,310,806,801,817,800,14,28,38,14,10,6,339,297,770,855,933,680,17,22,28,15,11,11,243,245,653,893,1064,646,16,26,15,9,10,3,379,309,634,654,704,876,17,18,34,14,14,3,333,305,607,587,720,744,20,22,33,21,11,15,508,314,628,655,724,844,36,15,34,16,18,16,238,206,810,855,987,679,8,14,8,9,1,1,297,153,656,834,907,627,7,17,12,11,7,5,291,225,895,705,678,585,15,20,17,12,9,0,437,243,879,743,746,601,17,16,21,15,10,13,427,165,531,709,748,838,12,17,27,15,12,10,241,135,658,784,972,670,9,25,22,10,11,3,251,289,894,1061,1199,585,7,19,20,6,3,2,513,435,617,782,580,1030,26,14,30,16,15,8,418,230,805,557,607,580,16,24,12,11,14,16,10 +255,269,635,909,560,658,10,25,17,6,11,12,286,212,564,816,609,855,15,16,14,11,9,14,180,362,655,839,996,658,26,20,36,15,3,11,352,322,693,998,791,703,14,26,30,10,15,4,389,339,663,1050,907,625,27,26,36,11,16,11,193,257,510,1032,1038,739,26,22,23,15,9,15,319,287,677,835,682,897,21,24,30,10,9,7,277,187,610,722,706,783,18,18,37,15,10,19,508,180,751,856,690,863,28,15,38,10,15,20,236,328,623,902,961,638,18,8,0,7,16,5,281,293,479,965,881,782,17,13,20,13,10,11,283,229,708,884,658,694,7,26,25,14,10,8,367,157,688,944,720,746,11,20,29,9,9,17,327,203,554,904,734,913,16,19,35,11,3,8,143,213,539,805,958,729,13,19,30,12,4,13,261,423,729,1074,1177,604,17,13,28,6,18,14,557,289,824,983,554,1007,16,26,38,12,18,12,300,288,608,748,569,523,8,18,20,17,17,20,10 +246,244,827,632,616,710,19,17,5,3,12,10,421,433,530,597,629,969,20,30,36,14,10,12,313,269,793,576,970,770,17,16,26,10,2,3,277,323,777,703,823,973,17,18,36,11,14,16,404,372,751,739,909,787,18,20,26,12,15,9,282,356,652,743,1002,719,17,14,13,12,8,1,408,360,583,516,684,1035,14,22,36,11,8,11,428,416,570,421,664,881,17,24,29,18,9,17,585,401,641,567,752,981,35,23,28,13,14,18,327,199,831,809,951,840,9,22,22,6,15,1,412,254,677,674,859,690,8,21,8,8,9,7,234,184,916,665,636,720,10,22,9,9,11,2,336,324,896,655,678,660,12,20,11,12,10,15,442,306,516,587,726,943,9,23,21,12,2,8,240,292,645,616,912,761,6,19,18,7,3,1,334,290,891,893,1143,692,8,19,6,3,17,0,510,540,646,694,612,1171,25,22,28,13,17,10,437,311,818,527,641,771,15,24,16,14,16,18,10 +388,244,817,608,622,593,17,21,2,10,13,10,319,467,496,547,667,700,12,22,31,15,11,12,225,301,793,612,1060,543,19,12,25,13,7,3,439,401,763,701,855,692,25,28,37,6,17,14,424,422,743,757,971,534,20,28,25,9,18,9,240,338,646,793,1102,530,19,16,12,11,13,1,384,394,605,560,742,754,6,28,31,12,11,9,310,344,582,451,762,612,9,18,30,19,14,17,569,409,601,533,754,696,31,23,31,12,17,18,321,251,821,811,1025,665,11,14,17,11,18,1,414,130,667,720,945,603,10,15,9,17,16,7,312,184,906,621,716,583,8,24,12,18,12,2,382,276,888,621,784,563,10,20,12,13,11,15,378,232,510,619,790,698,1,21,24,11,7,8,168,224,639,668,1014,524,2,15,19,16,6,1,282,220,883,937,1237,587,10,9,11,10,20,0,636,458,618,674,614,910,23,24,27,10,20,10,313,285,812,459,633,650,23,20,11,15,11,18,10 +322,302,795,795,556,637,21,11,11,9,12,11,303,281,534,708,601,858,20,18,20,12,10,13,205,289,725,795,990,671,15,24,32,16,2,4,317,311,781,882,785,788,11,24,36,9,14,3,348,292,743,948,901,688,16,22,32,12,15,10,174,214,634,986,1032,708,15,22,19,14,8,6,316,278,667,751,678,912,20,26,36,9,8,6,280,238,628,642,700,798,23,18,37,16,9,18,511,235,717,730,684,890,33,15,38,9,14,19,227,239,795,896,955,675,11,14,6,10,15,2,296,190,641,911,875,713,8,19,16,16,9,8,316,230,880,778,656,661,12,18,21,17,11,3,386,216,836,818,714,679,14,16,23,10,10,16,340,144,600,806,726,912,15,19,31,8,2,7,132,138,637,799,950,728,12,23,26,15,3,6,230,332,877,1080,1169,601,8,15,22,9,17,3,510,354,758,861,548,1074,27,14,34,9,17,11,327,255,760,630,565,538,9,28,14,16,16,19,10 +254,284,671,730,565,623,16,16,12,10,6,11,223,291,532,635,612,826,15,11,19,13,6,11,169,313,685,726,995,657,20,33,33,15,12,2,339,329,695,819,790,772,16,29,35,8,16,3,364,308,667,889,906,676,21,19,33,11,17,8,184,268,524,919,1037,670,20,31,20,13,12,6,290,264,657,692,687,890,15,19,35,10,12,4,260,260,586,577,709,766,18,17,38,17,9,16,475,269,729,657,691,852,30,18,39,10,14,17,267,265,665,847,966,685,14,11,5,11,15,0,308,246,513,844,886,675,11,20,17,17,9,6,282,222,750,709,661,635,7,25,22,18,5,1,308,210,712,745,719,639,9,17,24,11,4,14,290,160,546,747,737,888,10,18,32,9,12,9,154,166,541,734,961,690,7,32,27,16,13,6,288,382,753,1013,1182,607,11,18,23,10,17,3,538,388,788,788,559,1040,22,17,35,8,17,9,281,219,634,559,568,558,14,25,15,15,16,17,10 +297,287,826,632,605,679,22,16,3,4,12,12,364,438,525,593,646,752,17,21,34,13,10,10,262,258,794,612,1043,647,14,19,24,15,2,1,412,266,828,719,838,770,20,19,34,12,14,8,423,331,800,781,954,614,15,19,24,13,15,11,269,353,663,799,1085,610,14,17,11,13,8,1,399,347,682,572,725,798,11,19,34,12,8,3,385,421,641,453,743,670,14,19,27,17,9,15,590,434,688,553,737,764,32,18,26,12,14,16,258,160,824,839,1008,749,6,21,20,5,15,1,327,281,670,724,928,643,5,20,6,11,9,5,279,219,909,651,699,637,13,25,9,12,11,0,431,343,879,641,767,601,15,23,9,11,10,13,389,319,493,641,771,754,6,14,19,13,2,10,221,301,670,654,995,638,3,20,16,10,3,3,307,293,904,925,1220,665,5,18,8,4,17,2,625,541,689,688,597,948,28,17,26,14,17,8,346,330,805,493,616,696,18,25,14,15,16,16,10 +318,364,798,814,586,683,25,22,15,5,9,14,421,263,523,715,629,850,24,19,16,12,13,10,325,195,774,754,1024,709,23,25,34,16,11,1,327,181,828,901,819,790,13,23,32,15,1,0,374,196,796,953,935,708,16,13,34,16,2,9,246,230,651,949,1066,728,15,25,21,14,9,9,406,248,690,740,706,880,18,15,32,15,9,3,338,338,641,623,724,784,21,19,39,16,12,15,547,267,702,753,718,884,35,24,40,15,13,16,179,177,790,865,989,735,7,17,2,4,2,1,318,276,636,876,909,697,6,12,18,10,8,5,292,258,875,795,680,641,16,31,23,11,8,0,452,306,855,841,748,683,18,25,27,14,11,13,460,252,505,809,752,892,13,16,33,16,11,10,234,242,666,742,976,744,10,24,28,9,10,9,198,392,886,1025,1201,663,6,24,26,7,4,6,564,460,701,880,578,1006,27,25,36,17,16,12,365,225,781,653,597,582,17,17,18,16,13,16,10 +280,264,773,677,646,690,18,21,20,4,12,11,373,515,480,614,687,789,13,16,25,11,10,11,255,295,773,607,1084,670,18,28,41,13,2,2,371,345,777,764,879,799,24,26,31,10,14,5,400,364,749,800,995,655,19,16,41,11,15,10,252,426,616,794,1126,615,18,24,30,15,8,4,406,380,645,583,766,849,7,14,31,10,8,4,386,410,606,468,782,713,10,14,38,15,9,16,587,489,667,606,778,799,34,21,39,10,14,17,303,179,771,838,1049,780,10,20,11,5,15,0,378,290,617,723,969,656,9,21,25,11,9,6,220,192,856,692,740,672,9,22,26,12,11,1,404,360,842,694,808,630,11,16,28,9,10,14,408,322,468,652,810,801,2,9,38,11,2,9,198,304,621,619,1034,643,1,31,35,10,3,4,246,252,853,898,1261,690,9,23,17,4,17,1,600,520,678,743,638,983,24,20,39,12,17,9,369,345,772,530,657,709,22,20,19,17,16,17,10 +283,287,737,713,623,620,18,21,14,8,6,11,238,292,520,622,672,751,13,6,21,9,4,11,172,306,743,693,1051,614,18,38,37,17,8,2,396,290,753,814,846,729,24,26,37,12,12,3,365,297,725,872,962,643,19,16,37,13,13,8,209,257,578,884,1093,603,18,34,24,17,8,6,309,245,653,663,745,807,7,14,37,6,8,4,229,265,596,546,769,687,10,18,42,13,7,16,494,266,723,644,745,781,30,21,43,6,12,17,326,264,733,852,1020,690,10,16,7,9,13,0,337,243,579,811,940,606,9,23,21,15,7,6,277,225,818,706,721,588,9,22,22,16,5,1,291,227,788,732,775,578,11,12,22,7,4,14,315,167,508,730,797,813,2,13,36,7,8,9,175,163,591,697,1021,627,1,33,31,14,9,6,285,377,817,976,1238,616,9,23,21,8,15,3,557,391,770,785,617,957,24,20,39,8,15,9,252,200,714,554,624,581,22,20,13,15,14,17,10 +261,387,715,817,663,805,15,29,35,5,16,11,416,330,502,698,710,1076,20,26,16,16,14,13,318,220,707,673,1085,853,23,20,26,8,2,4,286,220,729,890,872,902,15,6,16,9,10,3,353,309,701,906,986,810,24,4,26,10,11,10,239,325,556,848,1129,904,23,16,39,10,4,6,373,257,621,689,785,1130,16,18,16,13,4,6,397,387,556,620,805,1012,19,28,23,12,9,18,552,366,677,772,789,1070,33,41,24,11,10,19,314,220,711,818,1064,839,15,24,14,8,11,2,403,373,557,795,984,933,14,29,42,8,9,8,193,291,796,814,759,895,6,30,29,7,15,3,349,369,776,860,817,891,8,32,27,14,14,16,443,385,496,746,833,1138,11,25,31,12,2,7,215,387,567,643,1057,928,8,23,34,5,1,6,243,377,795,936,1280,755,14,41,42,5,13,3,521,509,744,893,657,1186,19,40,24,11,13,11,408,314,704,682,642,708,13,12,20,8,14,19,10 +258,322,772,792,632,693,24,26,12,3,11,14,337,331,527,687,673,760,19,9,19,12,15,12,223,203,776,726,1070,675,16,31,35,12,9,3,327,237,800,885,865,788,18,23,35,9,3,2,366,240,772,917,981,702,13,13,35,10,4,9,192,228,619,913,1112,644,12,29,22,14,9,9,338,274,690,700,752,792,13,9,35,9,9,5,280,344,633,591,768,682,16,11,40,16,14,17,531,325,730,729,764,794,34,24,41,9,11,18,215,163,766,859,1035,753,4,15,5,4,4,1,314,194,612,842,955,597,3,16,19,10,10,7,270,224,851,779,726,631,15,27,24,11,10,2,378,278,843,817,794,585,17,17,24,10,13,15,368,232,483,769,796,788,8,8,34,10,9,8,144,208,636,708,1020,678,5,26,29,9,8,9,208,318,856,995,1247,681,3,28,23,3,6,6,558,472,717,864,624,910,30,23,37,11,16,12,331,247,765,635,643,656,16,15,15,16,15,18,10 +291,267,942,653,618,690,29,13,2,3,9,11,386,454,619,578,653,811,24,24,29,14,13,11,296,232,854,679,1050,716,23,26,25,12,11,2,276,276,902,734,845,917,13,26,37,9,9,15,303,331,874,794,961,731,8,26,25,10,10,10,221,281,769,834,1092,639,7,24,12,12,11,0,373,355,702,591,732,817,18,26,31,11,13,10,341,403,695,522,748,745,21,30,30,18,12,16,504,414,712,580,754,859,35,13,31,11,19,17,194,142,946,850,1015,808,1,18,15,6,2,0,319,131,792,769,935,506,2,27,9,8,8,6,255,211,1031,656,706,632,20,12,14,9,8,1,425,319,995,668,774,534,22,14,14,12,11,14,433,289,577,648,776,747,13,25,24,10,11,9,223,251,764,739,1000,693,10,23,19,7,10,2,177,233,1010,1010,1227,684,2,15,13,3,4,1,507,537,633,711,612,977,35,12,27,11,16,9,376,320,923,490,635,749,13,28,9,14,15,17,10 +317,299,1004,567,588,705,27,13,7,7,10,11,448,532,681,574,629,848,22,30,38,18,12,11,352,290,938,601,1026,733,15,20,28,10,14,2,288,392,948,648,821,926,15,26,38,13,12,17,319,425,928,714,937,734,10,26,28,14,13,10,271,319,829,766,1068,642,9,20,15,8,8,0,403,455,730,521,708,898,16,32,38,15,16,12,395,439,741,448,724,772,19,26,31,20,13,16,512,464,740,482,720,886,33,17,30,15,16,17,232,224,1008,844,991,837,1,22,24,10,1,0,357,107,854,695,911,555,0,25,10,10,7,6,249,249,1093,602,682,675,18,8,11,11,11,1,421,359,1073,570,750,551,20,12,13,16,12,14,495,299,619,576,752,806,11,29,23,14,14,9,271,273,822,669,976,702,8,17,20,9,13,2,221,195,1068,936,1203,695,0,11,4,7,1,1,473,571,595,621,580,1038,33,16,30,15,13,9,442,372,991,458,599,790,13,28,18,10,12,17,10 +257,401,768,740,584,685,25,25,13,11,16,14,316,262,553,653,629,776,20,16,18,12,14,8,260,240,766,716,1022,687,17,26,34,16,2,1,370,152,808,829,817,806,17,16,34,9,10,2,349,187,774,897,933,724,12,6,34,12,11,11,237,245,625,909,1064,658,11,22,21,14,4,9,333,309,706,690,704,814,14,10,34,9,6,1,331,409,643,571,724,712,17,18,39,16,11,13,516,288,760,677,716,822,35,31,40,11,10,14,256,224,758,877,987,753,3,14,4,12,11,3,307,299,604,834,907,591,2,19,18,18,7,3,291,311,843,743,678,615,16,34,23,19,15,2,387,319,825,765,746,585,18,24,25,10,14,11,345,309,515,755,752,806,9,15,33,8,2,12,217,287,646,728,976,694,6,29,28,15,1,9,281,417,858,1007,1199,677,2,31,24,11,13,6,543,527,767,808,576,958,31,30,36,9,13,12,310,242,749,587,595,628,15,16,16,16,12,14,10 +322,238,831,667,593,614,20,15,4,7,9,11,365,415,526,588,638,763,15,28,29,12,7,11,257,257,805,675,1031,618,16,18,27,16,5,2,417,285,807,750,826,787,22,22,39,9,17,11,462,350,779,818,942,629,17,24,27,12,18,10,264,324,664,854,1073,567,16,18,14,14,11,0,428,344,657,623,713,829,9,26,33,9,11,6,346,366,616,514,735,689,12,26,32,16,12,16,617,375,675,590,725,783,28,21,33,9,17,17,243,173,835,842,996,716,8,18,15,8,18,0,364,208,681,779,916,570,7,21,11,14,12,6,332,156,920,668,687,590,11,20,14,15,8,1,418,278,890,678,755,552,13,16,14,10,7,14,416,256,568,678,763,775,4,21,26,10,5,9,182,232,665,725,987,597,1,21,21,13,6,2,284,300,905,996,1208,610,7,15,13,7,20,1,658,496,706,725,585,983,26,20,29,11,20,9,347,289,814,502,604,647,20,26,9,16,15,17,10 +284,216,791,646,627,699,21,11,6,8,11,12,321,399,516,619,658,946,16,18,37,11,9,14,255,363,751,640,1055,759,19,26,27,13,3,5,281,431,727,725,852,948,21,26,37,10,15,16,348,420,709,775,966,780,20,26,27,9,16,11,226,320,614,797,1097,712,19,22,14,15,9,3,322,366,559,562,737,996,10,24,37,8,9,11,316,332,532,473,753,864,13,24,30,15,10,19,513,343,665,579,763,964,35,11,29,10,15,20,367,253,795,861,1020,821,11,24,23,9,16,3,418,172,641,732,940,673,10,27,9,15,10,9,266,156,880,679,711,691,12,12,10,16,10,4,256,244,862,667,779,653,14,12,12,9,9,17,346,262,532,627,781,924,5,17,22,7,3,8,218,260,605,684,1005,752,2,29,19,14,4,1,312,256,851,959,1232,683,10,13,5,8,18,2,500,450,654,708,621,1150,23,12,29,8,18,12,363,323,788,529,644,732,19,30,17,15,17,20,10 +243,369,721,806,592,692,20,26,15,8,15,12,320,224,544,701,637,867,23,11,16,13,15,10,240,258,735,732,1030,714,20,31,38,15,5,5,298,204,773,901,825,767,12,21,32,10,7,0,311,207,739,947,941,681,17,11,38,11,8,9,193,229,584,929,1072,753,16,27,25,13,5,13,313,249,677,734,712,907,19,9,32,12,7,3,317,307,618,615,732,795,22,13,39,17,12,15,494,222,735,739,724,885,34,26,40,14,9,16,244,252,709,869,995,724,8,15,2,9,8,1,309,293,555,860,915,754,7,16,22,15,10,5,239,293,794,793,686,692,11,29,27,16,14,2,355,267,772,827,754,724,13,19,27,13,17,13,357,209,524,805,760,933,14,10,37,11,5,10,177,213,609,702,984,761,11,26,32,14,4,13,249,413,813,985,1207,666,7,28,26,8,10,10,501,429,770,874,584,1027,26,25,40,12,14,14,358,188,690,643,603,577,10,15,18,17,11,16,10 +262,320,744,731,586,628,23,22,10,8,12,13,335,345,495,648,627,801,18,15,21,15,10,9,257,243,748,743,1024,656,15,29,29,13,2,0,383,241,760,810,819,815,19,23,37,10,14,3,384,268,726,874,935,697,14,13,29,11,15,10,268,260,593,914,1066,637,13,27,16,11,8,6,368,324,658,675,706,869,12,13,35,12,8,2,354,392,599,580,722,729,15,17,34,19,9,14,547,325,704,670,718,825,33,24,35,14,14,15,285,197,738,862,989,708,5,17,7,9,15,2,320,260,584,849,909,612,4,14,13,15,9,4,290,222,823,724,680,602,14,27,18,16,11,1,408,294,803,758,748,576,16,17,22,13,10,12,366,272,511,730,750,839,7,14,28,11,2,11,216,252,602,771,974,667,4,30,23,14,3,6,308,364,828,1046,1201,614,4,24,21,8,17,3,568,516,719,797,578,1027,29,23,31,12,17,9,357,237,725,574,599,599,17,19,13,15,16,15,10 +262,278,626,882,628,654,10,29,16,6,11,9,295,249,591,783,677,877,15,16,15,17,9,9,207,339,646,800,1032,670,26,20,37,11,3,10,379,297,700,977,819,701,14,20,31,8,15,1,380,306,666,1017,933,627,27,18,37,9,16,10,230,302,519,999,1078,749,26,22,24,9,9,18,338,264,700,804,750,919,19,18,31,14,9,2,324,204,629,689,774,811,18,12,38,21,10,14,529,241,764,813,746,883,28,19,39,14,15,17,283,311,608,863,1025,642,18,10,1,9,16,4,324,358,478,932,943,804,17,17,21,13,10,10,272,248,693,841,726,714,5,34,26,14,10,7,374,182,683,901,776,750,9,20,28,15,9,12,330,234,587,873,802,955,14,17,36,13,3,11,176,258,554,764,1026,755,11,17,31,12,4,18,294,480,722,1045,1243,590,17,19,27,6,18,15,570,348,857,948,622,1037,16,30,39,12,18,13,317,209,593,703,593,507,10,12,19,13,17,15,10 +278,350,802,704,563,687,23,23,15,6,13,11,289,383,521,617,612,750,18,14,16,17,11,11,169,181,778,636,989,661,13,30,36,7,1,2,333,221,814,797,784,760,19,24,32,8,13,3,378,238,782,827,900,692,14,14,36,9,14,8,166,322,649,819,1031,622,13,28,23,9,7,6,310,300,690,610,685,802,12,12,32,14,7,4,268,378,645,501,709,680,15,16,39,21,8,16,497,395,712,647,687,774,31,23,40,14,13,17,227,135,798,813,962,755,5,16,2,9,14,0,290,252,644,748,882,641,4,17,20,11,8,6,282,244,883,713,661,651,14,26,25,12,12,1,368,362,855,735,715,615,16,16,27,15,11,14,306,262,505,679,737,796,7,13,35,13,1,9,114,252,656,644,961,654,4,31,30,10,2,6,262,276,886,925,1178,685,4,25,26,6,16,3,524,514,719,782,557,920,29,22,38,12,16,9,329,319,779,563,562,652,17,18,18,11,15,17,10 +216,306,676,802,604,669,18,17,17,4,11,13,253,199,581,695,649,816,13,10,18,11,9,9,221,329,710,712,1042,667,18,30,40,15,3,4,395,267,742,899,837,740,24,26,32,10,15,1,386,258,714,927,953,666,19,16,40,11,16,10,260,290,545,903,1084,686,18,28,27,15,9,12,330,294,698,712,724,862,7,18,32,10,9,2,290,308,635,601,744,758,10,14,39,15,10,14,505,187,762,739,736,842,26,21,40,10,15,15,263,313,662,823,1007,721,10,8,2,5,16,2,304,362,508,836,927,679,9,19,24,11,10,4,296,270,747,779,698,627,9,26,27,12,10,1,340,222,733,827,766,661,11,20,27,9,9,12,328,286,557,781,772,874,2,17,39,11,3,11,200,278,588,696,996,698,1,29,34,10,4,12,280,484,766,981,1219,655,9,21,26,4,18,9,578,382,837,878,596,968,24,20,40,12,18,15,259,289,653,639,615,582,22,22,18,17,17,15,10 +358,292,855,722,634,705,23,16,13,3,9,10,425,429,540,621,675,696,18,21,22,12,13,12,295,217,819,684,1072,671,19,29,36,12,11,3,375,259,851,817,867,780,19,29,38,11,5,6,394,294,821,863,983,690,14,21,36,12,6,11,260,308,692,869,1114,636,13,27,23,14,11,3,428,318,699,648,754,738,12,21,38,11,9,5,350,376,658,533,770,628,15,27,41,16,12,17,605,405,709,659,766,736,37,18,42,11,17,18,241,127,855,833,1037,769,5,17,8,4,2,1,392,182,701,798,957,607,4,22,20,10,8,7,292,200,940,713,728,637,14,19,21,11,8,2,470,308,922,747,796,601,16,13,21,10,11,15,448,256,506,719,798,710,7,22,35,12,11,10,192,218,697,694,1022,662,4,26,30,9,10,3,194,258,935,975,1249,705,4,18,20,3,4,0,606,504,660,796,626,866,29,17,38,13,16,10,371,307,854,567,645,674,17,25,12,16,13,18,10 +300,348,878,744,591,720,27,13,12,5,10,10,381,373,559,669,632,793,22,30,19,14,14,12,295,157,800,724,1029,716,21,20,29,12,10,3,327,189,878,817,824,869,15,20,35,15,4,6,354,230,846,873,940,747,10,18,29,16,5,11,220,290,715,889,1071,659,9,18,16,12,10,3,362,368,706,658,711,773,16,26,35,15,10,5,334,434,673,567,727,719,19,32,34,16,13,17,539,423,736,687,727,835,37,23,35,15,16,18,177,141,876,895,994,808,1,22,5,6,3,1,280,216,722,832,914,552,0,27,13,6,9,7,266,252,961,759,685,648,18,20,18,7,9,2,450,366,933,775,753,566,20,22,24,14,12,15,426,286,533,719,755,749,11,27,28,16,10,10,226,268,722,746,979,705,8,17,23,9,9,3,210,282,956,1023,1206,710,0,23,23,7,5,0,546,580,695,806,585,931,33,22,31,17,17,10,335,333,863,601,608,723,13,28,15,12,14,18,10 +335,213,922,582,614,656,21,21,7,3,10,11,364,472,599,583,647,717,16,24,38,10,8,13,260,342,852,590,1044,592,15,10,28,14,4,4,430,410,860,659,841,715,21,26,38,11,16,17,457,457,840,713,955,561,16,26,28,10,17,10,269,365,745,749,1086,573,15,14,15,16,10,2,427,413,660,506,726,757,10,28,38,9,10,12,359,393,657,435,742,615,13,18,31,14,11,18,616,414,662,503,750,713,33,25,30,9,16,19,288,224,926,833,1009,712,7,14,24,4,17,2,397,199,772,682,929,628,6,13,10,10,11,8,297,169,1011,619,700,606,12,24,11,11,9,3,425,291,991,591,768,592,14,22,13,8,8,16,415,309,551,567,770,675,5,21,23,10,4,7,191,289,736,654,994,577,2,13,20,9,5,0,277,247,982,923,1221,630,6,11,4,3,19,1,663,515,649,638,608,897,27,26,30,11,19,11,354,342,919,483,631,755,19,18,18,16,16,19,10 +259,315,673,850,586,641,18,21,18,6,12,12,288,220,544,749,631,798,13,14,19,11,10,12,224,292,715,750,1024,631,18,26,39,15,2,5,396,238,725,941,819,674,24,26,29,10,14,2,439,257,697,985,935,606,19,18,39,11,15,9,241,239,538,945,1066,670,18,28,28,15,8,13,363,255,663,770,706,840,7,22,29,10,8,5,265,267,598,657,726,732,10,16,36,15,9,17,540,212,739,791,718,796,24,19,37,10,14,18,238,266,661,847,989,681,10,4,1,7,15,1,307,295,511,882,909,703,9,21,25,13,11,7,331,255,746,825,680,643,9,28,30,14,11,2,355,231,726,879,748,661,11,20,30,9,10,15,369,211,528,837,754,878,2,21,40,11,2,8,169,213,565,714,978,678,1,27,35,12,3,13,273,417,761,999,1201,625,9,19,29,6,17,10,615,393,806,922,580,940,24,24,37,12,17,14,278,232,644,689,599,552,22,18,21,17,16,18,10 +338,324,942,689,599,694,28,17,7,7,9,11,399,347,617,612,640,805,23,26,24,18,11,11,313,197,890,701,1037,706,18,24,28,14,13,2,327,237,922,774,832,859,14,24,40,17,11,9,338,234,888,844,948,741,9,20,28,18,12,10,214,210,777,886,1079,657,8,22,15,12,9,0,378,296,714,647,719,819,17,26,34,17,15,4,346,364,705,542,735,743,20,28,33,14,12,16,523,327,722,616,731,851,36,17,34,17,17,17,221,163,944,870,1002,772,0,16,10,8,0,0,308,162,790,813,922,564,1,27,12,4,6,6,272,260,1029,694,693,624,19,12,17,5,10,1,454,270,1003,704,761,564,21,18,19,16,11,14,442,222,605,702,763,799,12,27,27,18,13,9,220,196,778,739,987,709,9,21,22,11,12,2,218,296,1020,1012,1214,674,1,19,18,9,2,1,506,488,667,747,591,987,34,16,30,19,14,9,425,255,925,526,610,683,12,24,10,10,13,17,10 +336,426,777,821,540,670,24,27,20,12,13,14,279,217,566,724,587,743,19,12,13,11,11,12,163,205,753,757,970,648,12,32,35,17,1,3,369,177,803,902,765,701,18,20,27,10,13,2,412,190,769,964,881,637,13,10,35,13,14,9,158,232,630,956,1012,631,12,28,22,15,7,11,310,232,723,761,660,783,13,8,27,8,7,5,242,282,664,654,686,671,16,14,34,15,8,17,509,219,761,774,666,757,28,27,35,10,13,18,255,201,771,886,937,714,6,16,3,13,14,1,322,272,617,891,857,632,3,17,19,19,8,7,304,344,856,824,638,622,15,28,24,20,12,2,380,344,818,862,694,602,17,18,32,9,11,15,312,200,548,816,712,813,8,11,34,7,1,8,64,200,647,733,936,657,5,27,29,14,2,11,282,394,865,1016,1153,658,3,29,31,12,16,8,518,410,784,893,536,891,30,26,35,8,16,14,363,201,740,676,551,593,16,14,23,15,15,18,10 +257,255,879,653,631,682,22,16,2,5,6,10,414,402,560,614,638,881,17,31,33,14,10,12,308,234,825,583,949,718,14,19,23,10,8,3,276,284,821,720,826,915,20,19,33,11,6,18,353,339,797,754,892,725,15,21,23,12,7,9,243,325,702,750,987,637,14,17,10,12,8,1,359,319,631,529,683,949,11,27,33,11,8,13,397,381,614,442,663,793,14,25,26,12,9,17,508,382,627,592,755,893,32,18,25,11,16,18,304,142,883,818,942,814,6,21,19,6,7,1,349,239,729,681,848,604,5,28,5,6,5,7,213,185,968,686,633,676,13,13,10,5,5,2,381,317,944,680,669,576,15,19,10,12,8,15,433,295,584,598,727,857,6,28,18,12,8,8,223,269,693,613,911,691,3,16,15,5,9,1,313,267,939,894,1136,670,5,18,9,5,9,0,477,509,622,713,627,1085,28,17,25,13,13,10,430,332,868,554,646,761,18,25,13,8,10,18,10 +274,320,729,721,617,600,17,24,9,9,11,11,241,371,506,628,666,749,12,7,22,12,9,11,157,255,715,711,1033,588,19,37,32,16,7,2,347,303,749,810,828,719,25,25,38,9,19,3,368,288,721,878,944,639,20,17,32,12,20,8,186,258,590,900,1075,571,19,35,19,14,13,6,300,268,657,677,739,811,6,11,38,9,13,4,232,298,608,558,763,687,9,17,37,16,14,16,483,351,693,652,735,767,31,22,38,9,19,17,281,231,725,862,1014,670,11,17,8,10,20,0,322,208,575,825,932,610,10,22,16,16,14,6,302,242,810,714,715,602,8,23,21,17,10,1,308,260,790,740,765,570,10,15,21,10,9,14,312,154,520,738,791,805,1,10,31,8,7,9,138,144,601,727,1015,595,2,32,26,15,8,6,276,330,811,1006,1232,596,10,26,20,9,22,3,538,438,760,785,611,965,23,21,34,7,22,9,273,205,716,562,606,577,23,17,12,14,13,17,10 +218,316,689,771,618,657,14,17,17,6,3,12,239,275,594,666,661,848,9,10,18,15,3,6,243,265,713,675,1052,669,22,34,40,13,11,5,381,255,751,870,847,732,28,26,32,10,13,4,332,282,723,894,963,656,23,16,40,11,12,13,226,272,552,872,1094,700,22,30,27,11,11,13,298,258,703,681,738,896,3,18,32,12,11,1,236,270,640,570,758,792,6,20,39,19,4,11,455,269,773,702,746,870,24,21,40,12,7,14,255,243,677,828,1017,703,14,12,2,7,10,5,278,322,523,803,937,711,13,23,24,13,6,5,306,216,762,762,714,667,11,26,27,14,4,4,304,244,744,790,776,679,7,16,27,13,3,9,340,236,568,750,786,916,2,17,39,11,11,14,228,252,591,671,1010,720,5,35,34,12,12,13,256,424,777,952,1231,635,13,21,26,6,10,10,528,404,852,841,610,1004,20,20,40,12,10,16,219,239,664,610,625,574,22,24,18,13,13,12,10 +330,252,905,689,556,660,24,13,11,3,15,11,387,403,582,642,593,691,19,28,20,12,13,13,261,235,845,705,972,628,14,22,24,14,1,4,393,287,863,758,771,765,18,24,36,11,11,11,450,332,833,812,883,617,13,26,24,12,12,10,216,270,734,844,1014,585,12,20,11,14,5,2,392,306,677,605,668,751,13,24,30,11,5,6,336,334,662,546,690,611,16,26,29,16,10,18,593,345,697,634,680,711,32,15,30,11,11,19,259,131,909,892,943,734,4,26,6,4,12,2,348,174,755,789,863,598,3,27,8,10,6,8,308,190,994,716,642,624,15,14,13,11,14,3,444,262,962,722,700,570,17,14,21,10,13,16,402,248,562,660,718,715,8,21,23,12,1,7,156,230,729,741,942,611,5,21,18,9,0,0,280,224,975,1020,1159,656,3,13,22,3,14,1,590,452,652,753,550,901,30,14,26,13,14,11,417,337,886,554,565,679,16,30,14,16,13,19,10 +330,222,919,645,613,662,22,18,3,3,12,12,379,467,596,600,652,691,17,27,34,12,10,14,263,317,875,637,1047,616,14,13,24,14,2,5,393,381,855,726,842,759,20,29,34,11,14,16,428,424,837,774,958,565,15,29,24,12,15,11,246,324,744,804,1089,577,14,17,11,14,8,3,422,358,681,569,729,771,11,31,34,11,8,11,360,392,666,470,747,611,14,21,27,16,9,19,617,401,687,572,747,701,32,22,26,11,14,20,257,183,923,848,1012,746,6,19,20,4,15,3,390,180,769,735,932,610,5,18,6,10,9,9,288,132,1008,670,703,620,13,23,9,11,11,4,440,282,984,660,771,582,15,19,9,10,10,17,416,326,564,628,775,663,6,24,19,12,2,8,156,300,733,683,999,587,3,12,16,9,3,1,234,220,979,956,1224,654,5,8,8,3,17,2,624,484,628,705,605,889,28,23,26,13,17,12,373,367,908,508,628,767,18,23,14,16,16,20,10 +282,258,798,728,604,636,22,17,9,9,12,11,299,391,495,635,643,767,17,16,24,12,10,11,181,269,794,720,1040,650,14,32,32,16,2,2,337,327,794,817,835,797,20,32,40,9,14,7,370,314,762,875,951,699,15,24,32,12,15,10,170,268,637,907,1082,609,14,30,19,14,8,2,326,298,668,678,722,829,11,18,38,9,8,4,262,306,617,561,738,701,14,18,37,16,9,16,519,345,682,659,740,799,32,13,38,9,14,17,241,181,798,853,1005,718,6,20,10,10,15,0,322,146,644,832,925,580,5,19,16,16,9,6,266,188,883,717,696,590,13,16,19,17,11,1,350,242,865,747,764,560,15,14,19,10,10,14,340,202,529,733,766,801,6,11,31,8,2,9,116,172,640,750,990,649,3,31,26,15,3,2,248,256,878,1025,1217,626,5,19,18,9,17,1,532,432,689,794,598,983,28,12,34,9,17,9,349,263,789,565,621,601,18,24,10,16,16,17,10 +273,199,755,653,650,765,19,17,8,3,8,11,452,430,496,598,691,1024,24,30,39,14,12,13,396,326,749,587,1088,835,33,20,29,10,12,4,262,392,729,730,883,970,11,24,39,9,2,13,323,437,701,758,999,866,24,26,29,10,3,10,297,361,582,758,1130,818,23,20,16,12,10,2,403,359,559,539,770,1072,24,26,39,11,8,8,449,361,524,440,786,956,27,24,32,18,11,18,502,382,629,588,782,1052,29,17,31,13,14,19,338,222,759,808,1053,861,15,24,25,6,1,2,393,245,605,689,973,779,14,25,11,10,7,8,207,153,844,682,744,777,10,14,12,11,9,3,403,283,832,676,812,765,14,14,14,12,10,16,485,321,498,608,814,1028,19,27,24,10,12,7,307,313,581,625,1038,852,16,17,21,9,11,0,257,239,825,900,1265,745,14,15,3,3,3,1,439,485,682,721,642,1214,19,16,31,11,15,11,448,378,752,528,661,720,11,28,19,14,12,19,10 +277,277,894,614,624,687,22,12,7,7,10,12,368,548,571,573,669,696,17,23,38,12,14,10,270,282,868,624,1062,667,18,25,28,14,10,1,334,364,872,707,857,820,20,29,38,9,6,10,343,369,840,769,973,636,15,29,28,10,7,11,235,399,729,797,1104,608,14,23,15,14,10,1,371,439,710,566,744,778,11,25,38,9,10,5,363,447,679,459,764,632,14,21,31,16,13,15,540,490,710,535,756,730,36,10,30,11,18,16,256,202,898,843,1027,777,6,27,24,8,3,1,335,227,744,726,947,597,5,20,10,14,9,5,235,237,983,633,718,647,13,13,11,15,9,0,415,369,963,623,786,575,15,13,13,10,12,13,399,309,531,631,792,702,6,18,23,10,10,10,207,285,728,670,1016,640,3,22,20,13,9,3,233,179,972,941,1239,687,5,12,4,7,5,2,543,541,647,676,616,910,28,11,30,11,17,8,388,398,889,475,635,736,18,31,18,16,14,16,10 +215,291,722,665,641,683,15,17,12,4,14,11,402,392,483,610,648,986,18,36,19,15,12,11,316,282,712,573,955,757,21,8,9,9,0,2,280,286,696,732,838,960,13,8,19,10,12,13,411,351,668,756,926,776,22,14,9,11,13,10,311,363,551,744,973,726,21,4,4,11,6,0,395,345,562,535,685,1046,18,28,19,12,6,8,435,413,501,452,633,898,21,20,12,15,7,16,544,384,644,604,789,996,33,29,11,14,12,17,366,216,726,804,952,805,13,32,27,7,13,0,407,339,572,677,852,701,12,21,9,7,7,6,231,223,811,696,617,727,6,18,14,6,13,1,323,331,801,692,655,677,8,30,16,13,12,14,409,343,485,600,731,954,13,29,10,11,0,9,273,343,550,587,881,764,10,11,9,4,1,2,389,341,794,870,1118,659,12,29,23,4,15,1,491,533,691,729,643,1184,21,30,11,12,15,9,406,320,723,558,682,730,11,16,21,11,14,17,10 +276,372,728,825,599,684,23,25,17,4,14,14,355,271,531,718,642,817,18,12,16,15,12,10,235,213,738,733,1037,688,13,26,38,9,0,3,355,177,766,918,832,775,19,20,30,10,12,0,412,206,736,950,948,675,14,10,38,11,13,9,214,240,585,924,1079,689,13,22,25,11,6,11,372,280,670,733,719,861,12,10,30,12,6,3,326,368,613,624,737,745,15,14,37,19,7,15,569,271,740,762,731,837,31,27,38,14,12,16,235,201,720,850,1002,742,5,14,0,7,13,1,332,296,566,861,922,680,4,15,22,11,7,5,266,272,805,806,693,646,14,34,27,12,13,0,398,306,779,850,761,648,16,24,29,13,12,13,376,290,509,802,765,869,7,11,37,11,0,10,154,284,602,711,989,705,4,23,32,10,1,11,262,412,818,998,1214,664,4,27,28,4,15,8,592,490,763,897,591,959,29,26,38,12,15,14,355,247,701,662,612,627,17,16,20,13,14,16,10 +346,316,911,597,675,692,22,20,9,4,14,10,399,561,588,574,706,641,17,27,40,15,12,12,273,357,853,579,1083,634,18,15,30,9,0,3,387,455,871,680,902,737,20,31,40,10,12,14,392,456,843,726,1006,573,15,31,30,11,13,9,238,422,738,758,1117,595,14,19,17,11,6,1,406,510,675,523,777,755,11,29,40,12,6,9,366,450,664,414,775,585,14,19,33,19,11,17,587,497,671,522,811,657,36,20,32,14,12,18,301,289,917,822,1056,768,6,23,26,7,13,1,378,222,761,683,970,624,5,18,12,11,7,7,238,266,1000,622,743,652,13,21,13,12,13,2,432,378,984,610,799,590,15,17,15,13,12,15,424,326,518,582,819,627,6,22,25,11,0,8,180,314,733,629,1025,603,3,12,22,10,1,1,222,160,979,900,1256,678,5,8,2,4,15,0,582,520,584,659,669,837,28,21,32,12,15,10,401,407,916,474,692,807,18,25,20,13,14,18,10 +308,322,863,736,600,684,24,19,11,7,15,12,239,417,546,661,635,753,19,18,20,12,13,10,149,185,825,716,1024,670,16,32,28,12,1,1,337,275,859,809,823,809,18,32,36,9,11,6,344,286,825,859,935,673,13,22,28,8,12,11,140,312,702,881,1066,621,12,30,15,14,5,3,258,314,715,646,714,807,13,16,34,9,5,3,252,384,672,559,732,683,16,16,33,16,10,15,453,405,719,677,726,787,34,15,34,9,11,16,263,169,861,881,989,762,4,20,6,8,12,1,280,204,707,820,909,608,3,15,12,14,6,5,264,230,946,749,688,636,15,18,17,15,14,0,358,332,918,765,750,564,17,14,23,10,13,13,272,278,534,707,760,769,8,11,27,8,1,10,124,266,707,744,984,663,5,29,22,13,0,3,294,222,943,1021,1205,666,3,21,22,7,14,2,458,516,702,800,592,945,30,14,30,7,14,8,357,359,842,585,611,693,16,22,14,14,13,16,10 +328,248,1024,610,602,687,30,13,1,11,9,11,435,495,701,567,643,836,25,28,32,18,11,13,373,259,926,652,1040,723,20,22,22,18,13,4,285,339,976,701,835,932,12,24,34,21,11,15,310,368,948,767,951,738,7,26,22,22,12,10,254,276,849,815,1082,650,6,20,9,16,9,2,400,378,756,574,722,858,19,34,32,21,15,10,380,420,767,493,738,766,22,28,27,14,12,18,499,425,738,529,734,878,34,15,28,21,17,19,205,171,1028,843,1005,805,2,18,18,8,0,2,328,110,874,748,925,531,3,27,6,4,6,8,294,222,1113,625,696,633,21,6,11,5,10,3,430,312,1089,617,764,551,23,14,11,20,11,16,498,298,609,629,766,778,14,29,21,22,13,7,286,262,842,712,990,702,11,19,16,15,12,0,194,204,1088,979,1217,679,3,13,10,13,2,1,486,542,617,668,594,1008,36,14,24,23,14,11,443,345,1013,459,613,750,14,30,12,12,13,19,10 +312,254,884,618,636,648,20,20,7,3,9,10,317,507,561,591,667,745,15,21,38,12,7,12,211,371,838,602,1058,590,16,15,28,12,5,3,371,455,844,699,861,725,22,31,38,9,17,14,398,490,816,747,969,563,17,31,28,8,18,9,218,382,711,769,1100,573,16,19,15,14,11,1,382,432,646,536,740,815,9,29,38,9,11,9,294,408,637,441,756,657,12,19,31,16,12,17,563,439,634,543,772,741,30,20,30,9,17,18,265,263,888,833,1023,712,8,13,24,6,18,1,364,232,734,700,943,660,7,18,10,10,12,7,302,184,973,649,714,638,11,21,11,11,8,2,362,320,953,631,782,602,13,17,13,10,7,15,374,348,541,601,784,727,4,22,23,8,5,8,144,338,706,658,1008,573,1,18,20,9,6,1,228,202,952,929,1235,624,7,8,4,3,20,0,602,494,673,678,630,951,26,21,30,9,20,10,303,425,881,501,653,749,20,23,18,16,15,18,10 +269,381,745,797,592,695,22,26,15,4,16,15,374,242,528,692,633,838,21,13,16,13,14,11,274,238,761,719,1030,709,18,27,38,15,4,2,356,178,785,890,825,796,16,19,32,14,8,1,377,215,755,922,941,714,15,9,38,15,9,8,245,243,598,912,1072,722,14,23,25,13,4,10,375,267,679,709,712,882,15,9,32,14,4,4,349,363,622,598,728,772,18,15,39,17,11,16,556,246,733,734,724,878,36,28,40,14,8,17,228,216,735,848,995,745,6,13,2,5,9,0,299,311,581,839,915,693,5,16,22,9,9,6,249,281,820,784,686,651,13,33,27,10,15,1,417,299,800,822,754,667,15,23,27,13,16,14,403,297,508,778,756,888,10,12,37,15,4,9,223,293,621,709,980,738,7,26,32,8,3,10,257,423,831,992,1207,677,5,28,26,6,11,7,577,481,754,867,584,992,28,27,40,16,11,13,354,254,722,636,603,596,14,15,18,15,10,17,10 +410,296,913,557,622,658,21,18,8,10,10,11,385,489,590,542,663,663,16,25,39,11,8,13,271,365,865,579,1060,594,15,15,29,17,6,4,435,491,849,642,855,693,21,31,39,10,18,17,432,504,831,700,971,539,16,31,29,13,19,10,252,366,736,750,1102,565,15,19,16,15,12,2,426,450,633,509,742,735,10,31,39,8,12,12,356,368,640,422,758,569,13,21,32,15,13,18,623,431,637,474,754,645,31,20,31,8,18,19,303,289,917,816,1025,718,7,17,25,11,19,2,424,188,763,679,945,632,6,18,11,17,13,8,328,232,1002,586,716,624,12,21,12,18,9,3,438,330,988,562,784,590,14,17,14,9,8,16,428,274,542,564,786,643,5,24,24,7,6,7,172,254,727,645,1010,569,2,12,21,14,7,0,248,180,973,910,1237,644,6,6,3,10,21,1,636,452,564,615,614,845,27,21,31,8,21,11,369,361,916,434,633,749,19,23,19,15,14,19,10 +309,281,779,747,580,629,18,15,7,6,8,12,410,350,486,646,625,834,23,26,24,17,10,10,324,246,769,739,1018,673,22,24,30,11,8,1,364,268,777,834,813,808,12,24,40,12,10,6,381,293,743,898,929,708,19,18,30,13,11,11,269,269,618,926,1060,674,18,22,17,9,8,3,405,303,639,699,700,898,19,20,36,14,8,3,399,357,596,580,720,770,22,24,35,21,9,15,574,318,675,678,712,872,34,19,36,16,16,16,232,202,779,860,983,707,10,20,10,9,5,1,341,233,625,851,903,653,9,19,14,13,5,5,277,193,864,728,674,619,9,24,19,14,7,0,467,253,844,766,742,623,11,18,19,15,8,13,447,235,558,758,748,872,14,19,29,13,8,10,263,231,623,767,972,698,11,21,24,12,7,3,257,351,861,1044,1195,613,9,19,18,6,7,2,579,481,708,813,572,1046,24,18,32,14,13,8,384,246,766,580,591,586,10,26,10,13,12,16,10 +294,296,851,651,633,692,25,18,9,6,10,12,339,475,526,578,674,701,20,23,24,17,10,10,227,217,799,643,1071,658,19,27,32,9,8,1,361,271,849,740,866,789,17,27,40,8,8,6,370,286,813,798,982,645,12,21,32,9,9,11,220,342,690,822,1113,627,11,25,19,9,8,3,356,362,689,591,753,761,14,17,38,14,6,3,316,426,654,480,769,639,17,21,37,21,9,15,551,463,685,578,765,737,37,16,38,14,16,16,255,141,849,816,1036,750,3,19,10,9,5,1,334,214,695,751,956,616,2,18,16,11,5,5,270,224,934,658,727,630,16,17,19,12,9,0,410,368,914,666,795,578,18,13,19,15,8,13,356,298,492,656,797,717,9,18,31,13,8,10,162,274,697,673,1021,657,6,24,26,10,7,3,246,224,929,948,1248,676,2,20,18,6,7,2,556,536,646,715,625,905,31,17,34,12,13,8,349,351,842,486,644,685,15,23,10,11,12,16,10 +243,287,683,741,594,582,14,18,13,10,4,13,260,344,532,652,641,797,9,9,18,15,2,9,224,256,721,693,1032,576,22,39,36,13,14,0,390,286,725,832,827,675,28,25,34,8,16,1,379,299,697,890,943,593,23,17,36,9,15,10,253,309,536,890,1074,607,22,35,23,11,14,8,337,251,629,677,716,831,3,17,34,12,14,2,251,293,570,558,738,719,6,23,41,19,7,14,490,336,709,678,726,797,28,22,42,14,10,15,250,218,673,860,997,646,14,17,4,11,11,2,289,269,537,817,917,664,13,24,20,17,9,4,335,187,758,742,690,612,11,23,25,18,5,1,313,257,734,766,756,626,7,13,25,13,2,12,353,199,516,748,766,847,2,16,35,11,14,11,195,209,561,699,990,633,5,38,30,16,15,8,259,381,769,978,1211,582,13,22,24,10,13,5,581,437,802,809,588,975,20,21,38,10,13,11,218,210,656,590,605,539,22,23,16,17,16,15,10 +247,281,908,599,647,711,26,24,8,2,15,13,338,488,589,564,688,752,21,25,39,11,13,9,242,268,792,619,1085,683,24,15,29,15,1,0,384,318,890,684,880,854,16,23,39,12,11,13,391,371,862,746,996,654,11,23,29,13,12,12,257,355,739,790,1127,638,10,15,16,15,5,2,375,399,712,555,767,764,15,21,39,12,9,8,331,463,689,462,783,690,18,17,32,15,14,14,554,456,676,516,779,798,38,24,31,12,11,15,280,166,910,834,1050,797,2,21,25,3,12,2,319,213,756,719,970,591,1,18,11,7,6,4,221,219,995,618,741,643,17,25,12,8,14,1,371,369,957,604,809,579,19,21,14,11,13,12,377,357,523,610,811,698,10,20,24,13,1,11,201,319,740,683,1035,670,7,18,21,6,0,4,259,247,982,950,1262,699,1,16,3,4,14,3,597,587,703,657,639,928,32,25,31,14,16,9,320,358,889,458,658,784,14,21,19,13,13,15,10 +260,472,844,921,681,635,28,26,21,13,13,11,231,265,679,810,704,840,27,23,16,16,13,7,195,199,698,867,895,645,16,3,36,8,7,16,361,207,938,1006,654,632,18,13,26,11,5,3,368,174,894,1054,724,588,23,17,36,12,6,12,196,190,739,1070,957,736,24,5,25,6,7,22,238,284,826,857,813,862,35,15,26,21,7,0,190,348,771,766,843,766,32,11,33,12,14,12,387,269,726,870,717,844,10,24,34,11,7,19,231,223,820,918,918,605,32,19,4,12,6,10,148,242,668,1003,876,793,33,12,22,6,12,16,308,378,905,894,789,683,35,27,27,5,12,13,396,376,847,958,759,731,35,35,33,10,15,10,240,210,585,910,827,926,40,16,37,20,7,13,194,214,774,825,1035,734,41,6,32,13,6,20,294,370,950,1094,1014,571,33,24,32,13,8,21,426,484,873,995,667,994,34,37,34,17,12,15,241,253,763,758,578,462,20,5,24,12,13,13,10 +234,204,763,612,635,694,15,17,7,6,11,11,355,463,520,591,672,969,18,22,38,15,9,11,281,337,727,586,1025,754,21,24,28,11,3,2,279,389,721,693,850,957,19,22,38,8,15,13,396,448,693,735,948,771,22,24,28,9,16,10,284,412,588,759,1069,703,21,20,15,11,9,0,380,380,581,522,747,1033,12,20,38,12,9,8,368,398,528,423,745,881,15,22,31,19,10,16,549,431,649,541,753,971,33,17,30,12,15,17,381,237,767,837,1004,824,13,22,24,7,16,0,422,276,613,686,916,688,12,23,10,13,10,6,254,162,852,647,707,714,6,16,11,14,10,1,266,288,826,629,747,658,8,16,13,13,9,14,384,346,524,591,787,941,7,15,23,11,3,9,250,334,581,642,995,745,4,27,20,12,4,2,358,296,827,911,1210,676,12,17,4,6,18,1,506,526,708,674,631,1171,21,16,30,10,18,9,371,367,754,505,636,755,17,26,18,13,17,17,10 +254,270,853,560,611,696,24,13,8,4,11,11,407,477,554,567,652,935,19,24,39,13,9,11,321,325,803,584,1043,740,14,18,29,15,3,2,371,377,807,641,838,935,18,20,39,12,15,17,432,436,781,697,954,751,13,20,29,13,16,10,330,406,680,751,1085,679,12,14,16,13,9,0,422,424,621,506,729,995,13,24,39,12,9,12,442,480,602,431,749,847,16,24,32,17,10,16,603,439,687,481,739,941,32,19,31,12,15,17,331,265,857,835,1008,816,4,18,25,5,16,0,412,288,703,678,928,652,3,19,11,11,10,6,250,222,942,599,705,690,15,20,12,12,10,1,374,344,914,569,767,622,17,20,14,11,9,14,422,378,558,561,777,903,8,17,24,13,3,9,290,362,671,654,1001,731,5,21,21,10,4,2,370,342,917,919,1222,672,3,17,3,4,18,1,600,606,694,618,603,1135,30,20,31,14,18,9,401,343,838,467,622,755,16,24,19,15,17,17,10 +301,271,853,648,593,681,24,14,2,8,13,11,370,396,534,601,640,780,19,29,33,13,11,13,270,220,817,664,1031,691,16,19,23,15,1,4,354,270,825,735,826,856,18,19,35,8,13,11,369,299,797,801,942,706,13,19,23,11,14,10,223,271,682,843,1073,620,12,17,10,13,7,2,377,363,655,608,715,836,13,21,33,10,7,6,381,419,626,501,737,710,16,27,28,17,10,18,566,366,693,573,725,816,34,20,29,10,13,19,278,172,857,863,996,779,4,27,19,9,14,2,375,215,703,770,916,569,3,26,7,15,8,8,255,211,942,669,689,631,15,21,10,16,12,3,399,305,914,661,755,563,17,21,10,11,11,16,393,281,558,663,765,792,8,22,22,9,1,7,189,255,681,708,989,672,5,20,17,14,2,0,259,291,925,979,1210,675,3,20,9,8,16,1,575,543,682,710,587,994,30,19,25,10,16,11,396,268,840,501,604,704,16,27,13,15,15,19,10 +269,337,714,803,608,644,21,20,14,6,12,13,314,256,549,700,655,777,16,9,17,13,10,9,214,254,716,737,1044,644,15,27,37,13,2,4,376,220,760,896,839,749,21,23,33,10,14,1,397,231,728,942,955,649,16,13,37,11,15,10,241,233,581,930,1086,631,15,25,24,13,8,12,371,287,686,727,730,835,10,15,33,10,8,2,317,359,625,610,750,715,13,11,40,17,9,14,556,260,750,740,738,799,31,24,41,12,14,15,240,232,702,846,1009,706,7,9,3,7,15,2,323,279,548,861,929,642,6,16,21,13,9,4,289,265,787,782,704,618,12,29,26,14,11,1,383,265,761,828,768,604,14,23,26,11,10,12,355,269,521,796,778,837,5,14,36,11,2,11,159,259,602,723,1002,655,2,26,31,12,3,12,265,391,806,1008,1225,628,6,24,25,6,17,9,597,479,781,875,602,953,27,23,39,12,17,15,308,224,683,640,617,597,19,19,17,15,16,15,10 +260,290,838,732,580,691,25,14,7,5,16,12,271,385,539,643,621,814,20,19,24,12,14,10,157,197,810,682,1018,701,13,25,24,12,2,1,301,253,830,821,813,836,17,25,36,9,10,10,352,296,802,859,929,720,12,23,24,8,11,11,136,270,671,863,1060,642,11,23,11,14,4,1,286,280,672,642,700,874,14,21,30,9,4,5,244,344,635,529,716,748,17,23,29,16,9,15,481,359,710,673,712,844,31,14,30,9,10,16,207,131,838,849,983,779,3,23,10,6,11,1,290,158,684,792,903,623,2,28,8,12,7,5,258,168,923,741,674,657,16,15,13,13,15,0,330,294,891,761,742,573,18,15,19,10,14,13,310,260,535,711,744,840,9,14,23,8,2,10,100,236,676,720,968,694,6,28,18,11,1,3,236,260,914,995,1195,671,2,16,18,5,13,2,516,486,709,794,572,1018,31,13,26,9,13,8,295,323,813,583,591,670,15,27,10,16,12,16,10 +276,316,832,673,635,722,24,18,7,3,17,12,393,407,525,612,676,829,19,25,26,12,15,10,307,215,802,641,1073,734,18,25,30,14,3,1,333,237,828,770,868,893,18,25,42,11,9,8,348,302,798,816,984,761,13,17,30,12,10,11,260,310,669,820,1115,669,12,23,17,14,3,1,390,374,672,601,755,859,13,17,36,11,5,3,396,460,639,484,771,757,16,23,35,16,10,15,565,409,704,602,767,871,36,22,36,11,9,16,265,171,832,834,1038,820,4,23,12,4,10,1,354,274,678,747,958,578,3,20,14,10,8,5,222,258,917,688,729,662,15,23,17,11,16,0,416,338,897,690,797,580,17,17,17,10,15,13,430,350,521,672,799,817,8,18,29,12,3,10,240,324,674,675,1023,719,5,24,24,9,2,3,234,318,912,950,1250,710,3,22,16,3,12,2,558,582,699,743,627,1005,30,21,32,13,12,8,381,327,819,522,646,741,16,23,8,16,11,16,10 +248,346,831,710,635,738,24,32,10,2,10,12,351,361,562,635,676,841,19,15,25,13,14,10,285,173,813,652,1073,740,16,29,33,11,10,1,329,189,845,805,868,869,18,17,41,10,2,4,320,260,815,835,984,761,13,7,33,11,3,9,232,304,674,833,1115,685,12,25,20,13,10,5,340,364,719,618,755,879,13,7,39,10,10,3,348,452,668,509,771,767,16,17,38,17,13,15,501,399,739,647,767,877,34,30,39,10,12,16,255,159,827,833,1038,820,4,19,11,5,3,1,286,264,673,762,958,636,3,18,17,9,9,5,228,254,912,723,729,684,15,29,18,10,9,0,414,372,886,735,797,596,17,23,18,11,12,13,382,348,524,687,799,847,8,14,32,11,10,10,230,322,685,668,1023,737,5,24,27,8,9,5,244,318,913,949,1250,716,3,34,17,2,5,2,522,580,730,784,627,997,30,29,35,12,17,8,365,309,814,561,646,735,16,9,9,15,14,16,10 +355,379,867,826,638,738,27,20,16,5,8,14,386,328,552,717,679,817,22,19,17,16,12,14,272,150,799,738,1076,712,21,31,39,8,12,5,344,222,881,919,871,791,15,29,31,7,2,4,363,221,845,947,987,711,10,19,39,8,3,11,205,241,714,927,1118,699,9,29,26,10,10,11,381,259,721,730,758,789,16,15,31,13,8,7,299,335,676,623,774,727,19,19,38,20,11,19,544,324,737,763,770,833,37,18,39,13,14,20,244,164,861,853,1041,774,1,17,1,8,1,3,369,211,707,860,961,622,0,14,23,10,7,9,313,277,946,807,732,650,18,23,28,11,9,4,429,329,918,851,800,628,20,13,28,14,10,17,417,221,532,799,802,801,11,14,38,12,12,8,151,207,723,704,1026,733,8,28,33,9,11,11,211,299,951,991,1253,712,0,22,27,5,3,8,537,479,710,898,630,899,33,17,39,11,15,14,386,296,846,665,651,685,13,21,19,12,12,20,10 +323,329,871,702,637,704,28,19,12,7,9,11,392,360,540,617,678,795,23,18,23,12,11,11,296,202,819,686,1075,706,20,32,35,14,13,2,298,242,873,803,870,841,14,28,39,9,7,3,309,251,835,851,986,745,9,18,35,10,8,8,215,223,714,873,1117,677,8,30,22,14,9,6,371,317,683,644,757,803,17,16,39,9,11,4,341,375,658,529,773,727,20,22,40,16,10,16,516,348,715,633,769,839,36,19,41,9,17,17,230,172,867,849,1040,770,0,16,9,8,0,0,349,157,713,800,960,582,1,17,19,14,6,6,257,247,952,701,731,624,19,20,20,15,10,1,419,297,940,721,799,590,21,10,20,10,11,14,441,223,548,709,801,793,12,17,34,8,13,9,215,195,721,692,1025,713,9,29,29,13,12,6,177,291,953,973,1252,696,1,21,19,7,2,3,513,505,676,774,629,963,34,18,37,9,14,9,390,248,860,543,648,641,12,22,11,16,13,17,10 +320,402,826,750,597,705,25,25,13,2,12,13,407,263,549,661,638,766,20,20,18,9,16,11,291,207,810,714,1035,687,15,30,34,17,8,2,363,165,838,851,830,782,17,22,34,12,4,1,390,194,802,903,946,718,12,12,34,13,5,8,250,250,673,905,1077,660,11,28,21,17,8,8,402,294,712,688,717,800,14,12,34,12,10,4,360,382,657,571,735,698,17,18,39,13,15,16,577,279,736,681,729,802,33,25,40,12,12,17,227,205,820,879,1000,755,3,20,4,3,5,0,338,288,666,832,920,633,2,15,18,9,11,6,264,300,905,745,691,641,16,26,23,10,11,1,460,316,883,769,759,589,18,18,25,11,14,14,416,270,523,759,763,814,9,13,33,13,8,9,216,256,682,710,987,702,6,27,28,8,7,8,226,406,910,993,1212,685,2,27,24,4,7,5,578,502,725,820,589,950,31,24,36,14,17,11,375,225,807,591,608,640,15,16,16,15,14,17,10 +288,272,784,745,579,651,23,17,12,3,9,10,345,421,487,664,608,804,18,24,19,12,7,12,219,211,786,713,1005,651,13,26,27,12,5,3,349,251,784,818,800,804,19,26,35,9,17,6,406,306,752,854,916,698,14,18,27,10,18,11,212,334,631,864,1047,606,13,24,14,14,11,3,366,326,658,633,687,868,12,18,33,9,11,5,320,358,615,560,703,734,15,22,32,16,12,17,553,409,670,692,721,816,29,21,33,11,17,18,251,125,782,890,970,735,5,24,5,4,18,1,346,214,628,805,890,613,4,21,11,10,12,7,298,182,867,758,661,641,14,22,16,11,8,2,398,322,847,780,729,571,16,16,24,10,7,15,378,274,517,696,731,836,7,17,26,10,5,10,146,252,632,743,955,646,4,25,21,9,6,3,268,268,862,1026,1182,641,4,21,23,3,20,0,556,514,689,811,577,1008,29,20,29,11,20,10,385,323,765,602,608,646,17,24,15,16,15,18,10 +307,237,924,658,570,688,27,9,1,8,9,11,414,484,601,613,607,847,22,28,32,13,11,13,332,276,898,666,1004,728,15,22,22,13,13,4,288,342,884,743,799,905,15,24,32,8,9,13,315,387,856,801,915,753,10,24,22,9,10,10,227,299,751,837,1046,671,9,20,9,13,9,2,357,391,688,602,686,909,16,26,32,10,13,8,371,393,677,503,702,781,19,30,25,17,10,18,500,414,686,581,706,889,33,13,26,12,17,19,240,184,928,875,969,794,1,24,18,9,0,2,365,121,774,772,889,606,0,27,4,15,6,8,263,213,1013,681,660,652,18,16,11,16,10,3,417,297,991,669,728,590,20,16,11,11,11,16,451,283,591,657,730,855,11,27,19,9,13,7,239,251,746,714,954,715,8,19,14,14,12,0,221,181,992,985,1181,678,0,13,10,8,2,1,495,513,629,716,564,1061,33,14,24,10,14,11,410,344,909,517,587,697,13,30,12,15,13,19,10 +340,310,755,815,586,657,21,15,18,8,13,12,355,329,484,716,629,776,16,18,13,13,11,14,243,227,749,753,1024,659,15,22,35,13,1,5,395,247,757,902,819,748,21,22,29,8,13,4,434,252,723,956,935,672,16,18,35,9,14,11,220,246,602,944,1066,648,15,20,22,13,7,7,398,248,645,741,706,836,10,20,29,10,7,7,322,288,592,624,724,718,13,16,36,17,8,19,593,291,693,754,718,810,31,19,37,12,13,20,263,155,753,860,989,713,7,18,1,9,14,3,366,212,599,873,909,645,6,13,19,15,8,9,316,214,838,798,680,621,12,24,24,16,12,4,430,262,818,842,748,611,14,20,30,11,11,17,386,200,512,810,752,846,5,13,34,9,1,8,126,180,605,745,976,674,2,21,29,14,2,7,258,330,837,1028,1201,645,6,19,29,8,16,4,612,420,706,877,578,960,27,18,37,10,16,12,367,243,740,652,597,574,19,24,21,15,15,20,10 +328,370,889,760,617,739,27,22,15,4,10,11,369,337,590,665,650,794,22,21,16,11,14,13,259,141,829,692,1041,713,17,23,38,13,10,4,335,191,893,853,842,808,15,23,32,10,2,3,354,230,863,895,952,734,10,13,38,9,3,10,174,280,728,879,1083,684,9,21,25,15,10,6,350,292,743,678,731,790,16,13,32,8,10,6,278,388,706,567,747,714,19,19,39,15,13,18,527,377,757,697,745,824,35,24,40,8,12,19,235,143,887,857,1006,795,1,23,2,5,3,2,332,234,733,810,926,637,0,20,22,11,9,8,280,260,972,755,703,665,18,25,27,12,9,3,396,352,944,785,765,603,20,19,27,9,12,16,398,282,538,747,775,784,11,14,37,9,10,7,148,270,735,686,999,722,8,26,32,10,9,6,212,298,969,971,1220,721,0,24,26,4,5,3,528,530,730,832,609,902,33,23,40,10,17,11,383,303,868,607,628,708,13,19,18,17,14,19,10 +330,328,877,669,571,669,27,14,9,9,8,10,367,415,552,586,614,736,22,25,22,12,12,12,259,179,845,687,1009,671,17,25,28,14,12,3,317,243,857,754,804,834,15,25,38,9,8,8,336,272,823,822,920,700,10,21,28,10,9,9,188,232,710,852,1051,612,9,23,15,14,10,1,352,340,669,615,691,774,16,23,34,9,12,5,306,390,652,524,709,672,19,29,33,16,11,17,513,391,681,600,703,786,35,16,34,11,18,18,213,167,879,846,974,757,1,21,8,10,1,1,330,128,725,793,894,533,0,24,12,16,7,7,278,252,964,668,665,615,18,17,17,17,9,2,414,310,938,688,733,527,20,17,21,10,10,15,394,238,538,674,737,738,11,24,27,8,12,8,172,208,711,719,961,658,8,22,22,15,11,1,218,248,953,994,1186,661,0,16,20,9,3,0,518,526,634,729,563,928,33,15,30,9,15,10,385,303,860,510,582,682,13,27,12,16,14,18,10 +339,371,902,765,591,709,28,15,17,8,11,11,416,334,575,678,634,798,23,24,14,19,13,13,336,160,840,729,1029,711,22,26,34,11,15,4,312,208,896,850,824,812,14,26,30,14,7,5,343,213,866,922,940,738,9,20,34,15,8,10,219,243,737,920,1071,682,8,24,21,9,9,4,399,269,706,709,711,786,17,26,30,16,11,6,333,335,691,592,729,730,20,30,37,17,8,18,528,340,706,706,723,842,36,17,38,16,15,19,178,120,902,868,994,775,0,14,0,11,2,2,327,191,748,847,914,575,1,27,18,7,8,8,315,259,987,762,685,625,19,14,23,8,12,3,457,323,967,794,753,593,21,16,29,17,13,16,473,227,563,772,757,788,12,25,33,15,15,9,235,203,742,733,981,718,9,23,28,8,14,4,159,297,980,1014,1206,701,1,17,28,8,0,1,497,473,665,829,583,926,34,16,36,16,12,11,402,298,889,608,602,644,12,26,20,9,11,19,10 +275,381,844,755,606,715,27,22,15,4,9,11,342,296,557,664,649,798,22,19,16,11,13,11,230,140,818,701,1042,703,15,31,34,13,11,2,296,138,856,838,837,814,15,23,32,10,1,3,353,213,824,894,953,736,10,13,34,9,2,8,189,247,687,888,1084,666,9,29,21,15,9,6,339,285,722,677,726,824,16,13,32,8,9,4,305,399,671,564,746,722,19,21,39,15,12,16,510,336,742,698,736,832,33,24,40,8,13,17,202,150,840,858,1007,781,1,21,2,5,2,0,307,253,686,817,927,623,0,14,18,11,8,6,271,263,925,756,702,649,18,25,23,12,8,1,399,349,893,786,766,587,20,15,27,9,11,14,367,315,543,746,774,812,11,16,33,9,11,9,159,291,698,705,998,710,8,28,28,10,10,6,227,349,926,988,1219,697,0,24,26,4,4,3,517,523,743,825,598,946,33,23,36,10,16,9,362,286,815,608,615,686,13,19,18,17,13,17,10 +321,295,922,700,628,748,26,12,12,4,12,10,350,414,601,631,669,737,21,29,21,9,16,12,234,206,858,652,1066,700,18,21,35,15,8,3,328,264,908,791,861,809,16,23,37,12,4,8,335,307,878,833,977,679,11,23,35,11,5,9,175,303,755,837,1108,679,10,19,22,17,8,1,339,295,740,616,748,779,15,23,37,6,10,5,283,393,707,501,764,671,18,27,40,13,15,17,530,410,748,633,760,767,36,14,41,6,12,18,224,110,922,849,1031,804,2,27,7,7,5,1,345,201,768,766,951,664,1,22,19,11,11,7,269,203,1007,715,722,678,17,15,22,12,11,2,391,315,979,721,790,622,19,15,22,7,14,15,369,291,547,687,792,719,10,22,34,7,8,8,127,275,758,674,1016,701,7,18,29,10,7,1,205,251,998,953,1243,730,1,14,21,4,7,0,529,515,697,770,620,879,32,15,37,8,17,10,352,348,903,555,639,759,14,29,13,17,14,18,10 +341,363,709,824,602,647,21,22,16,11,13,11,332,272,534,733,643,738,16,11,15,14,11,11,222,270,733,772,1040,635,15,25,37,14,1,6,360,252,749,917,835,706,21,25,31,7,13,1,377,229,713,983,951,626,16,15,37,10,14,8,215,221,570,971,1082,638,15,27,24,12,7,14,367,271,679,772,722,784,10,17,31,11,7,4,311,291,612,653,738,670,13,11,38,18,8,16,562,256,739,761,734,762,33,22,39,13,13,17,238,236,699,877,1005,685,7,7,1,12,14,0,347,253,545,902,925,637,6,16,21,18,8,6,291,289,784,807,696,597,12,31,26,19,12,3,401,281,772,849,764,607,14,23,28,12,11,14,371,159,512,841,766,808,5,16,36,10,1,9,147,155,587,746,990,654,2,24,31,17,2,14,233,379,801,1029,1217,629,6,22,27,11,16,11,583,421,758,892,594,910,27,25,39,9,16,13,318,170,698,661,613,566,19,17,19,16,15,17,10 +278,348,811,746,582,683,23,24,11,6,12,13,367,299,536,663,623,780,18,17,20,11,16,9,273,207,803,724,1020,691,17,33,32,17,8,0,335,201,831,831,815,816,19,23,36,10,4,3,338,210,797,885,931,734,14,13,32,13,5,10,238,216,660,915,1062,656,13,31,19,15,8,6,360,288,699,688,702,830,12,11,36,8,12,2,316,374,650,575,718,716,15,21,37,15,15,14,529,305,727,685,718,828,35,24,38,8,14,15,231,183,805,871,985,757,5,21,6,7,5,2,322,238,651,840,905,595,4,12,16,13,11,4,286,246,890,743,676,621,14,25,21,14,11,1,414,290,870,773,744,585,16,15,23,9,14,12,388,270,514,743,746,814,7,16,31,9,8,11,208,248,673,744,970,694,4,30,26,12,7,6,228,358,897,1021,1197,675,4,26,22,6,7,3,540,500,712,814,576,972,29,23,34,10,19,9,345,233,794,593,601,630,17,17,14,17,14,15,10 +274,192,763,622,652,622,15,15,5,4,10,11,327,441,494,579,693,837,10,20,36,13,8,11,285,319,735,620,1090,626,21,26,26,15,6,2,429,383,737,713,885,795,27,20,36,10,18,13,428,448,709,769,1001,649,22,22,26,11,19,10,306,408,598,797,1132,601,21,22,13,13,12,0,408,376,617,566,772,893,4,20,36,10,12,8,342,356,574,459,788,765,7,22,29,17,13,16,583,423,641,537,784,849,31,17,28,10,18,17,331,245,767,833,1055,716,13,20,22,5,19,0,392,290,613,724,975,642,12,25,8,11,13,6,296,140,852,639,746,628,10,18,9,12,9,1,372,282,832,625,814,602,8,18,11,11,8,14,400,312,520,631,816,841,1,13,21,11,6,9,264,310,597,678,1040,633,4,29,18,10,7,2,296,332,835,945,1267,612,12,17,6,4,21,1,644,498,720,680,644,1059,21,16,28,12,21,9,301,301,760,475,663,657,25,26,16,15,14,17,10 +291,305,914,599,643,715,24,12,7,4,15,12,408,504,595,564,686,762,19,31,38,11,17,10,320,272,844,615,1079,709,20,19,28,17,5,1,368,308,896,690,874,878,18,21,38,14,7,12,381,355,868,754,990,684,13,21,28,15,8,11,277,383,745,792,1121,648,12,17,15,15,5,1,407,427,714,561,763,804,13,23,38,14,13,7,401,479,695,454,783,708,16,27,31,15,18,15,588,476,720,514,773,808,38,16,30,14,15,16,268,182,916,840,1044,809,4,27,24,3,8,1,333,247,762,719,964,609,3,24,10,9,10,5,219,245,1001,620,739,665,15,17,11,10,14,0,437,373,977,602,803,573,17,17,13,13,17,13,445,349,545,618,811,738,8,24,23,15,5,10,257,313,746,673,1035,690,5,16,20,8,4,3,259,273,988,940,1256,705,3,16,4,6,10,2,597,605,677,657,635,958,30,17,30,16,20,8,392,354,901,460,652,768,16,29,18,15,11,16,10 +238,256,819,628,570,649,24,16,1,5,12,11,275,485,508,601,607,814,19,19,32,14,10,11,179,271,769,608,970,661,12,23,22,12,2,2,345,337,791,707,771,846,18,25,32,9,14,13,380,382,763,761,883,648,13,25,22,10,15,10,174,334,648,779,1012,572,12,21,9,12,8,0,286,388,623,548,692,878,13,19,32,11,8,8,300,406,588,443,724,726,16,19,25,18,9,16,471,415,671,559,682,822,28,12,24,11,14,17,283,191,823,825,941,779,6,23,18,6,15,0,294,156,669,708,861,573,3,22,4,12,9,6,238,194,908,659,644,643,15,15,11,13,11,1,338,322,870,647,720,551,17,17,11,12,10,14,286,302,544,617,722,786,8,12,17,10,2,9,134,280,647,664,938,624,5,26,14,11,3,2,326,208,891,931,1157,643,3,18,10,5,17,1,502,534,676,686,560,1014,30,13,24,11,17,9,341,377,794,505,577,746,16,25,12,14,16,17,10 +252,380,799,705,591,697,24,24,13,8,11,11,317,277,580,618,634,804,19,13,20,11,9,11,201,219,777,677,1021,687,12,31,36,17,3,2,331,179,829,800,816,790,18,19,36,10,15,3,374,206,801,860,932,718,13,9,36,13,16,8,198,242,646,872,1063,660,12,27,23,15,9,6,342,312,723,651,711,852,13,11,36,8,9,4,324,388,674,532,733,742,16,17,41,15,10,16,531,295,771,632,715,838,26,28,42,8,15,17,271,207,793,872,986,755,8,11,6,9,16,0,344,288,639,797,908,659,5,22,20,15,10,6,262,280,878,698,689,655,15,29,23,16,10,1,340,306,834,720,747,615,17,19,23,9,9,14,344,290,552,720,759,864,8,12,35,7,3,9,158,272,665,679,983,698,5,32,30,14,4,6,280,408,881,960,1204,681,5,28,22,8,18,3,560,508,806,769,583,1006,30,27,38,8,18,9,345,231,760,544,594,640,16,17,14,15,17,17,10 +341,309,953,634,590,681,26,18,1,10,13,12,280,482,630,599,629,666,21,23,32,13,11,14,192,258,883,654,1026,619,16,17,22,15,1,5,328,362,893,713,821,750,16,33,32,8,13,14,363,377,873,765,937,588,11,33,22,11,14,11,151,303,778,805,1068,606,10,21,9,13,7,3,301,377,695,566,708,720,15,31,32,10,7,9,243,387,696,497,724,588,18,21,25,17,12,19,496,394,713,567,728,684,34,18,26,10,13,20,266,184,957,869,991,721,2,17,18,11,14,3,347,169,803,744,911,627,1,20,4,17,8,9,303,243,1042,661,682,609,17,19,11,18,12,4,331,301,1014,655,750,593,19,15,11,11,11,17,339,269,570,621,752,664,10,24,19,9,1,8,109,259,771,714,976,618,7,18,14,16,2,1,247,139,1017,985,1203,659,1,6,10,10,16,2,513,441,656,698,584,864,32,19,24,8,16,12,346,398,938,503,611,734,14,27,12,13,15,20,10 +211,435,796,750,594,748,26,26,17,5,16,13,332,250,571,675,633,857,21,15,16,12,14,9,260,184,776,678,1024,750,18,29,38,16,4,0,308,146,830,837,819,833,16,17,30,11,8,1,323,205,798,887,935,767,11,7,38,12,9,10,211,259,649,873,1066,731,10,25,25,14,4,8,321,297,710,674,710,873,15,9,30,11,4,2,331,405,663,559,732,791,18,17,37,16,11,14,504,284,758,687,722,897,36,30,38,11,8,15,232,198,786,865,989,802,2,13,0,6,9,2,289,351,632,800,909,670,1,20,22,12,9,4,225,337,871,761,688,676,17,31,27,13,15,1,365,373,839,775,748,658,19,21,29,10,16,12,373,381,521,743,758,885,10,14,37,12,4,11,209,359,668,686,982,771,7,30,32,11,3,8,255,415,882,965,1203,726,1,30,28,5,11,5,513,521,779,818,586,995,32,29,38,13,11,11,334,320,765,603,605,665,14,15,20,16,10,15,10 +327,357,878,764,622,767,25,29,23,9,8,12,418,332,579,657,663,784,20,16,24,12,12,12,308,156,818,662,1060,735,21,30,36,12,12,3,338,166,894,853,855,824,17,18,26,15,0,2,351,233,864,873,971,756,12,8,36,16,1,9,231,311,723,845,1102,698,11,26,33,10,8,7,397,301,750,656,742,782,14,14,26,15,8,5,317,401,707,561,758,702,17,22,33,8,11,17,556,390,766,707,754,816,39,29,34,15,12,18,202,128,872,817,1025,835,3,18,4,8,1,1,325,251,718,778,945,637,2,17,30,2,7,7,265,255,957,761,716,691,16,24,33,1,9,2,451,381,931,795,784,647,18,20,33,14,10,15,445,315,529,721,786,760,9,17,41,16,12,8,209,299,734,654,1010,728,6,27,40,9,11,7,173,305,960,939,1237,765,2,31,32,9,3,4,557,543,731,840,614,860,31,28,34,17,15,10,376,314,861,617,633,758,15,12,24,12,12,18,10 +269,271,862,672,613,697,24,18,15,2,11,12,320,444,545,607,622,648,19,29,16,9,15,10,226,234,782,558,927,645,18,13,6,15,9,1,302,282,834,725,810,770,18,29,16,12,3,12,325,347,812,743,898,590,13,29,6,11,4,11,189,295,687,723,951,600,12,17,13,17,9,1,315,319,658,522,661,740,13,31,16,10,9,7,283,351,639,471,613,586,16,21,9,13,14,15,494,384,632,623,757,682,36,22,8,10,9,16,192,128,866,785,924,781,4,19,32,3,4,1,275,171,712,662,824,587,3,16,12,7,10,5,275,179,951,705,593,639,15,17,17,8,10,0,401,281,929,711,631,577,17,19,9,9,13,13,345,275,447,581,707,596,8,24,5,11,9,10,175,253,684,560,861,614,5,10,8,6,8,3,215,203,928,849,1092,685,3,8,26,2,6,2,503,467,585,736,613,828,30,23,8,12,14,8,326,370,859,579,654,812,16,21,16,13,15,16,10 +352,286,935,661,602,732,25,21,7,6,10,10,417,513,610,620,643,667,20,30,24,15,12,12,293,231,867,645,1040,678,19,16,28,13,14,3,355,329,915,742,835,789,17,32,40,12,6,10,366,358,885,810,951,653,12,32,28,13,7,9,226,348,766,828,1082,653,11,20,15,11,8,1,400,380,731,601,722,729,14,28,34,12,10,5,326,412,712,482,738,617,17,18,33,19,9,17,561,435,729,596,734,707,37,19,34,14,16,18,241,143,937,856,1005,790,3,26,10,7,1,1,354,198,783,753,925,632,2,17,12,13,7,7,292,226,1022,690,696,666,16,18,17,14,11,2,444,348,1008,684,764,604,18,18,19,13,12,15,436,296,540,668,766,651,9,21,27,13,14,8,188,280,767,683,990,667,6,13,22,12,13,1,206,142,1009,956,1217,724,2,9,18,6,1,0,542,494,634,725,594,829,31,20,30,14,13,10,409,399,934,528,613,743,15,24,10,13,12,18,10 +287,277,1004,625,568,711,28,14,1,3,11,10,378,446,681,618,597,740,23,33,32,12,13,12,280,204,896,619,992,705,20,17,22,14,11,3,300,302,940,692,793,882,14,23,32,9,11,18,343,333,922,738,903,674,9,23,22,10,12,9,193,275,827,768,1034,628,8,15,9,14,7,1,361,361,720,527,674,784,17,25,32,9,13,13,329,401,731,454,690,690,20,25,25,16,12,17,532,404,742,558,710,790,36,18,24,9,15,18,192,158,1008,852,957,829,0,25,18,4,2,1,339,145,854,705,877,553,1,24,4,10,6,7,293,229,1093,664,648,657,19,17,11,11,12,2,411,321,1057,646,716,569,21,17,11,10,13,15,421,269,607,586,718,672,12,26,17,10,11,8,181,233,818,665,942,670,9,14,14,9,10,1,189,205,1064,940,1169,709,1,14,10,3,4,0,523,533,633,681,564,912,34,19,24,11,14,10,370,334,989,510,595,814,12,25,12,16,11,18,10 +260,372,974,805,623,646,21,19,18,10,17,10,297,265,651,710,610,631,16,34,13,11,15,12,191,291,888,635,827,580,19,4,3,9,3,3,329,265,912,826,778,695,21,20,13,10,9,14,404,256,892,824,850,545,16,26,3,11,10,9,156,222,795,750,839,543,15,8,10,9,3,1,310,276,706,631,589,677,10,26,13,12,3,9,256,254,707,624,507,527,13,12,6,7,10,17,505,217,698,776,771,643,37,31,5,10,9,18,187,235,978,812,840,728,7,26,39,9,10,1,280,226,824,707,730,556,6,13,15,7,8,7,256,296,1063,844,523,594,12,20,14,6,16,2,378,276,1047,864,597,588,14,28,12,11,15,15,332,126,577,656,643,571,5,25,2,11,3,8,96,128,786,567,747,537,2,1,5,4,2,1,240,356,1032,868,986,644,6,17,29,10,12,0,512,384,681,867,629,799,27,32,5,12,12,10,333,221,977,732,700,775,19,12,23,7,11,18,10 +339,343,819,748,634,700,20,22,16,9,10,12,370,384,506,651,675,717,15,17,17,12,12,12,244,218,799,678,1072,666,18,33,39,16,10,3,366,276,823,841,867,755,22,27,31,9,4,2,363,263,787,879,983,701,17,19,39,12,5,9,203,303,664,871,1114,635,16,31,26,14,8,7,377,257,685,666,754,753,9,13,31,9,6,5,301,317,642,549,770,641,12,19,38,16,9,17,554,358,693,677,766,745,36,20,39,11,12,18,268,172,815,841,1037,758,8,17,1,10,3,1,363,235,661,796,957,618,7,14,23,16,5,7,261,243,900,741,728,630,11,21,28,17,11,2,405,309,880,765,796,608,13,13,28,10,12,15,391,185,488,735,798,745,4,14,38,10,10,8,145,173,671,682,1022,663,1,30,33,15,9,7,213,293,903,963,1249,698,7,24,27,9,5,4,543,447,660,812,626,867,26,19,39,11,13,10,384,272,814,589,645,651,20,19,19,16,12,18,10 +277,271,772,727,534,579,19,14,23,8,2,11,238,402,557,642,577,804,14,21,10,15,6,13,206,234,774,693,962,563,17,21,32,13,12,4,390,320,760,788,757,668,23,21,24,8,10,9,449,349,732,842,873,592,18,23,32,9,11,10,213,327,613,870,1004,592,17,17,19,11,14,2,311,281,634,635,652,832,8,27,24,12,12,6,183,301,589,560,674,714,11,25,31,19,5,18,458,368,690,680,660,794,23,22,32,12,12,19,264,138,774,890,931,637,11,15,6,9,11,2,271,239,636,809,851,665,8,20,20,15,11,8,383,171,859,748,626,603,10,23,21,16,1,3,325,281,833,768,686,627,12,19,29,13,4,16,347,233,561,694,702,826,3,20,31,11,12,7,157,225,616,719,926,610,2,24,26,14,13,0,299,263,846,994,1147,575,8,16,34,8,13,1,553,423,789,797,528,962,25,23,32,10,13,11,244,322,745,600,545,568,21,21,20,15,14,19,10 +254,252,780,646,644,691,18,16,12,4,12,11,335,389,465,601,659,980,13,27,19,11,10,11,231,245,726,546,986,745,18,17,9,13,2,2,311,303,748,711,841,944,24,21,19,10,14,13,362,378,720,735,939,764,19,21,9,9,15,10,216,316,611,717,1026,710,18,15,4,15,8,0,340,286,588,514,700,1050,7,21,19,8,8,8,356,354,559,437,684,896,10,23,12,13,9,16,529,381,582,589,786,976,32,18,11,8,14,17,313,169,784,787,969,793,10,23,25,5,15,0,360,278,630,650,875,719,9,22,9,9,9,6,222,182,869,677,646,737,9,19,8,8,11,1,336,284,839,677,708,677,11,19,8,9,10,14,362,330,509,579,746,970,2,20,4,9,2,9,178,326,608,568,934,756,1,18,1,2,3,2,322,292,852,849,1161,657,9,16,23,4,17,1,518,482,625,710,642,1192,24,19,11,10,17,9,399,341,765,537,677,722,22,25,21,9,16,17,10 +282,308,908,692,584,644,20,20,12,4,12,11,287,349,585,651,585,705,15,33,19,11,10,13,181,277,872,532,894,598,16,3,9,13,2,4,353,309,832,727,757,739,22,19,19,10,14,17,428,286,822,735,843,561,17,25,9,9,15,10,164,280,729,687,936,555,16,7,4,15,8,2,336,252,632,526,598,775,9,31,19,8,8,14,282,282,627,497,592,617,12,17,12,13,9,18,527,313,672,649,730,719,34,32,11,10,14,19,255,205,912,771,869,736,8,23,31,5,15,2,324,220,758,628,781,590,7,12,9,9,9,8,290,230,997,733,556,612,11,21,8,8,11,3,364,256,983,737,618,576,13,29,8,9,10,16,330,152,559,567,644,673,4,30,4,9,2,7,106,132,718,544,844,567,1,6,1,2,3,0,278,342,964,831,1071,634,7,18,23,4,17,1,556,416,613,750,588,903,26,33,11,10,17,11,369,217,909,629,645,759,20,13,21,9,16,19,10 +408,312,891,687,629,697,24,13,10,11,9,11,367,415,566,594,672,732,19,28,23,12,11,13,255,233,835,663,1065,677,20,22,33,16,13,4,381,325,873,776,860,800,18,26,39,9,7,7,352,304,841,832,976,698,13,26,33,12,8,10,204,288,726,850,1107,642,12,20,20,14,9,2,356,300,687,625,749,758,13,24,39,9,11,6,310,334,670,506,769,670,16,26,38,16,10,18,537,383,679,624,759,776,38,13,39,9,17,19,293,211,893,818,1030,761,4,22,9,12,0,2,374,164,739,775,950,609,3,25,17,18,6,8,292,224,978,692,725,635,15,14,20,19,10,3,422,276,956,712,789,559,17,14,20,10,11,16,390,232,524,692,797,740,8,25,32,8,13,9,172,216,727,687,1021,680,5,19,27,15,12,2,250,222,969,962,1242,685,3,13,19,11,2,1,526,458,612,757,621,910,30,14,35,7,14,11,401,333,882,530,640,660,16,30,11,14,13,19,10 +340,238,850,611,620,645,17,22,7,5,10,10,363,447,531,596,633,806,12,27,38,8,8,12,251,307,818,557,1008,639,19,19,28,16,6,3,385,389,786,680,831,810,25,23,38,13,18,18,418,438,768,716,925,616,20,25,28,12,19,9,246,366,673,724,1050,576,19,19,15,18,12,1,388,386,598,495,694,876,6,19,38,5,12,13,354,350,579,408,706,718,9,19,31,12,13,17,577,413,620,542,764,812,31,18,30,7,18,18,377,221,854,802,973,767,11,27,24,8,19,1,398,202,700,653,893,611,10,22,10,12,13,7,290,190,939,648,664,649,8,21,11,13,9,2,382,296,925,630,732,585,10,19,13,6,8,15,398,240,557,564,736,782,1,20,23,6,6,8,200,230,664,611,958,602,2,22,20,11,7,1,356,242,910,882,1185,641,10,20,4,5,21,0,576,490,609,671,618,1010,23,17,30,7,21,10,415,301,851,518,649,752,23,23,18,16,14,18,10 +309,301,727,876,647,688,23,20,29,5,14,14,316,310,456,759,688,913,22,13,18,14,12,12,210,228,741,766,1085,720,25,29,28,10,6,3,308,268,745,957,880,847,15,31,18,7,6,2,315,295,709,977,996,697,22,21,28,8,7,9,153,223,576,951,1127,739,21,27,31,12,6,9,307,231,621,764,767,951,16,17,18,11,6,5,269,279,566,677,783,823,19,13,25,18,13,17,484,294,663,829,779,921,37,16,26,13,6,18,244,196,721,859,1050,754,13,17,12,6,7,1,325,195,567,886,970,736,12,6,28,12,11,7,257,209,806,855,741,700,14,27,31,13,13,2,345,245,794,917,809,710,16,17,29,12,14,15,361,213,498,823,811,929,11,10,33,10,6,8,139,215,587,732,1035,755,8,26,36,11,5,9,201,311,813,1021,1262,664,12,20,40,5,9,6,479,419,686,950,639,1053,21,17,26,9,11,12,380,290,720,727,662,667,15,23,18,14,12,18,10 +313,305,812,662,605,652,22,19,4,10,10,13,380,468,505,601,646,743,17,24,29,15,8,9,290,240,808,654,1043,648,14,26,27,13,4,0,382,258,806,753,838,797,20,26,39,8,16,9,375,313,774,815,954,645,15,16,27,9,17,12,269,337,655,837,1085,583,14,24,14,11,10,2,397,377,678,610,725,811,11,16,33,12,10,4,385,431,631,491,741,675,14,22,32,19,11,14,576,462,688,583,737,765,32,21,33,14,16,15,292,182,812,851,1008,750,6,22,15,11,17,2,371,225,658,762,928,600,5,19,11,17,11,4,275,221,897,671,699,636,13,22,14,18,9,1,433,375,879,671,767,568,15,16,14,13,8,12,405,271,513,677,769,771,6,17,26,11,4,11,235,231,654,702,993,623,3,23,21,16,5,4,271,287,892,973,1220,650,5,21,13,10,19,3,585,575,675,722,597,963,28,20,29,10,19,9,384,286,803,505,616,675,18,22,9,17,16,15,10 +368,258,940,579,629,673,20,20,7,7,11,11,385,485,617,584,670,662,15,27,38,10,9,13,273,365,856,597,1067,609,18,13,28,18,3,4,427,487,864,656,862,700,22,29,38,11,15,17,438,492,854,714,978,552,17,29,28,14,16,10,254,364,761,756,1109,578,16,17,15,16,9,2,436,444,652,515,749,722,9,29,38,9,9,14,362,378,659,440,765,570,12,19,31,14,10,18,629,415,662,502,765,658,36,22,30,9,15,19,309,281,944,840,1032,741,8,21,24,8,16,2,424,182,790,687,952,605,7,20,10,14,10,8,272,214,1029,616,723,613,11,23,11,15,10,3,440,298,1007,590,791,603,13,19,13,8,9,16,428,274,555,574,793,616,4,22,23,10,3,7,166,248,750,659,1017,580,1,12,20,13,4,0,242,216,996,928,1244,657,7,8,4,7,18,1,640,460,567,635,623,826,26,23,30,11,18,11,367,347,939,474,646,786,20,23,18,18,17,19,10 +338,286,965,664,557,666,29,10,3,6,9,10,387,439,642,621,592,723,24,29,28,13,11,12,289,225,917,674,987,670,17,21,20,13,13,3,325,283,913,733,782,861,13,21,32,10,9,16,358,322,889,789,898,655,8,21,20,11,10,9,208,246,790,825,1029,593,7,19,7,13,9,1,368,362,703,582,669,783,18,27,28,10,13,11,326,390,704,509,687,663,21,31,25,17,10,17,531,395,709,599,691,771,35,16,26,12,17,18,183,187,969,873,952,786,1,25,14,7,0,1,324,98,815,764,872,538,2,28,4,13,6,7,322,242,1054,687,643,636,20,17,15,14,10,2,460,304,1022,687,711,530,22,17,15,11,11,15,420,244,608,639,715,695,13,28,19,11,13,8,198,212,783,718,939,637,10,18,14,12,12,1,214,204,1029,995,1164,666,2,16,14,6,2,0,520,530,634,722,549,917,35,15,22,12,14,10,369,305,944,515,574,735,13,29,8,15,13,18,10 +331,339,862,729,581,676,24,17,12,12,10,12,340,346,543,646,624,739,19,22,19,11,12,10,242,196,842,719,1015,676,18,28,29,17,14,1,316,256,854,808,810,805,18,28,35,10,8,6,327,237,818,868,926,709,13,18,29,13,9,11,197,227,701,900,1057,619,12,26,16,15,8,3,337,281,686,665,699,781,13,18,35,8,12,3,311,327,657,568,719,673,16,24,34,15,9,15,496,314,696,672,713,787,36,19,35,10,16,16,240,170,862,872,980,760,4,18,5,13,1,1,345,173,708,833,900,556,3,19,13,19,7,5,297,253,947,734,673,618,15,20,18,20,11,0,407,285,925,760,739,550,17,14,24,9,12,13,367,187,557,722,747,759,8,19,28,7,14,10,161,169,706,749,971,665,5,25,23,14,13,3,237,293,944,1024,1194,668,3,19,23,12,1,2,481,461,675,795,575,925,30,18,31,8,13,8,394,264,849,582,594,655,16,24,15,15,12,16,10 +230,288,760,636,573,625,20,19,1,4,10,14,353,421,511,601,610,864,15,24,30,13,8,8,313,303,732,650,995,669,16,22,20,13,6,1,415,311,740,709,794,878,22,20,32,10,18,12,388,372,712,761,906,686,17,16,20,11,19,13,328,350,603,801,1037,608,16,18,7,13,12,3,378,396,644,558,685,934,9,16,30,10,12,7,436,454,593,491,705,778,12,22,25,17,13,13,523,407,712,563,701,862,30,23,26,10,18,14,383,247,764,875,964,749,8,24,16,5,19,3,376,298,610,738,884,603,7,25,4,11,13,3,282,224,849,659,659,635,11,24,13,12,9,2,408,326,821,651,723,563,13,22,13,11,8,11,352,344,569,613,733,854,4,17,19,11,6,12,290,322,602,706,957,650,1,25,14,10,7,5,410,384,838,979,1180,613,7,23,12,4,21,4,554,578,741,690,567,1076,26,22,22,12,21,10,371,283,747,491,588,690,20,22,10,15,14,14,10 +256,230,816,653,606,702,20,17,4,7,13,10,383,423,529,614,647,909,15,28,35,12,11,12,271,283,792,601,1044,746,16,20,25,14,1,3,313,347,776,740,839,917,22,22,35,9,13,14,376,392,748,772,955,765,17,24,25,10,14,9,232,332,643,780,1086,687,16,18,12,14,7,1,362,364,606,557,726,977,9,20,35,9,7,9,386,362,573,446,742,835,12,24,28,16,8,17,535,383,650,578,738,929,30,17,27,11,13,18,337,189,820,830,1009,818,8,28,21,8,14,1,392,194,666,707,929,662,7,25,7,14,8,7,208,184,905,680,700,686,11,16,8,15,12,2,342,298,885,666,768,636,13,16,10,10,11,15,400,248,559,626,770,913,4,21,20,10,1,8,186,230,638,655,994,729,1,21,17,13,2,1,300,226,884,924,1221,692,7,17,7,7,16,0,512,498,661,719,598,1131,26,16,27,11,16,10,437,321,807,524,617,701,20,26,15,16,15,18,10 +263,289,943,691,591,717,31,13,4,3,9,11,342,450,618,626,622,904,26,22,27,12,13,11,286,188,841,677,1005,759,21,28,23,12,11,2,230,246,929,768,812,942,11,28,35,13,7,11,279,299,901,820,920,792,6,26,23,14,8,10,183,303,774,836,1047,716,5,26,10,14,11,0,315,345,747,605,693,912,20,28,29,13,11,6,305,437,730,510,707,834,23,30,28,16,12,16,426,458,719,628,723,942,33,11,29,13,19,17,186,134,945,872,970,825,3,16,13,4,2,0,265,177,791,773,890,625,4,29,7,6,8,6,247,225,1030,708,661,661,22,8,14,7,8,1,361,347,998,716,729,629,24,14,16,12,11,14,415,337,568,670,737,864,15,23,22,14,11,9,231,307,775,723,959,754,12,25,17,7,10,2,211,231,1017,998,1182,701,4,15,15,5,4,1,427,569,672,755,583,1082,37,10,25,15,16,9,386,400,924,548,604,740,15,28,7,12,15,17,10 +376,342,851,692,610,653,20,11,10,14,12,12,313,445,528,621,651,670,15,24,21,11,10,14,211,275,843,686,1048,601,16,24,31,17,2,5,351,367,827,779,843,718,22,28,37,10,14,8,356,318,797,849,959,590,17,28,31,13,15,11,178,318,686,875,1090,578,16,22,18,15,8,3,332,338,671,650,730,720,9,26,37,8,8,7,278,334,638,531,746,580,12,26,36,15,9,19,533,377,677,621,742,676,34,11,37,10,14,20,289,243,855,869,1013,709,8,24,7,15,15,3,384,216,701,800,933,611,7,27,15,21,9,9,298,268,940,699,704,609,11,12,20,22,11,4,358,306,928,709,772,585,13,10,22,9,10,17,360,188,512,707,774,690,4,19,30,7,2,8,128,174,683,712,998,596,1,23,25,14,3,1,242,250,927,987,1225,647,7,11,21,14,17,2,536,420,634,752,602,858,26,12,33,6,17,12,355,295,854,539,621,658,20,32,13,13,16,20,10 +305,351,791,782,609,682,24,19,15,13,10,13,326,276,486,677,656,879,27,16,18,14,14,11,230,252,783,718,1045,720,22,28,38,16,10,2,314,250,805,879,840,801,14,28,34,13,2,1,289,225,769,917,956,717,17,20,38,12,3,8,157,205,638,909,1087,743,16,26,25,18,10,8,313,273,653,702,731,925,21,16,34,15,10,4,301,287,610,585,751,819,24,20,41,10,13,16,488,244,679,723,739,915,32,17,42,13,14,17,242,230,785,833,1010,736,12,16,4,12,3,0,301,227,631,838,930,718,11,15,22,16,9,6,217,275,870,761,705,678,15,20,25,17,9,1,375,275,848,811,769,698,17,18,25,14,12,14,369,165,510,773,779,931,16,17,37,14,10,9,167,153,647,714,1003,763,13,25,32,11,9,8,201,349,875,995,1226,662,11,21,24,11,5,5,481,415,684,862,603,1049,26,16,40,13,17,11,370,192,772,621,618,579,16,22,16,6,14,17,10 +337,331,827,727,611,689,24,17,13,6,13,12,290,308,514,640,654,790,19,18,18,11,11,14,182,228,779,705,1049,669,18,28,30,15,1,5,346,270,811,806,844,802,18,28,34,10,13,6,371,271,779,866,960,710,13,22,30,11,14,11,151,241,662,888,1091,646,12,26,17,15,7,3,313,223,665,657,733,836,13,18,34,8,7,7,251,275,630,550,751,724,16,18,35,15,8,19,512,300,677,670,743,822,36,15,36,8,13,20,272,202,829,856,1014,741,4,22,4,7,14,3,351,209,675,819,934,643,3,21,14,13,8,9,293,239,914,728,709,625,15,18,19,14,12,4,339,269,888,758,773,583,17,16,25,9,11,17,331,193,524,716,777,814,8,11,29,7,1,10,95,183,663,715,1001,688,5,27,24,12,2,3,253,325,905,996,1226,663,3,19,24,6,16,2,531,419,694,793,603,982,30,14,32,8,16,12,346,270,816,578,622,658,16,24,16,15,15,20,10 +282,408,722,757,578,679,24,30,17,5,12,15,359,277,509,670,619,764,19,17,14,14,16,9,277,213,738,715,1016,677,18,25,34,12,8,2,383,149,770,836,811,780,18,15,30,15,4,1,404,202,738,906,927,704,13,5,34,16,5,10,260,266,581,904,1058,652,12,21,21,12,8,10,362,326,666,691,698,814,13,9,30,15,10,2,332,402,609,574,714,696,16,19,37,18,15,14,547,321,714,704,710,806,36,32,38,15,12,15,253,197,710,856,981,741,4,17,0,6,5,2,284,298,556,831,901,611,3,20,18,8,11,4,290,298,795,762,672,627,15,31,23,9,11,1,428,352,781,792,740,587,17,25,29,14,14,12,384,292,449,752,742,816,8,16,33,16,8,11,234,270,606,713,966,686,5,24,28,9,7,10,300,406,810,996,1193,669,3,32,28,7,7,7,578,528,711,821,570,942,30,31,36,17,17,13,337,233,705,610,589,606,16,11,20,14,14,15,10 +238,236,806,660,609,649,21,14,3,6,10,11,269,379,509,593,650,804,16,17,30,11,8,11,191,251,780,666,1047,651,15,29,26,17,4,2,341,295,792,749,842,794,21,25,38,10,16,9,386,326,764,813,958,670,16,25,26,13,17,10,206,294,645,851,1089,606,15,25,13,15,10,0,342,306,666,620,729,860,10,21,32,8,10,4,286,340,621,505,747,738,13,23,31,15,11,16,519,351,686,589,741,826,29,14,32,8,16,17,263,181,810,847,1012,731,7,25,16,7,17,0,330,202,656,776,932,621,6,28,10,13,11,6,270,144,895,669,703,627,12,15,13,14,9,1,326,260,867,677,771,575,14,15,13,9,8,14,328,248,549,675,775,834,5,14,25,9,4,9,152,228,650,708,999,644,2,32,20,12,5,2,260,310,884,979,1224,633,6,16,12,6,19,1,570,464,739,726,601,1026,27,13,28,10,19,9,301,279,791,505,620,648,19,27,10,17,16,17,10 +251,387,729,779,585,668,20,24,16,7,13,12,312,220,562,694,626,743,15,11,15,12,11,10,202,264,745,733,1023,644,16,33,35,16,1,5,374,182,783,870,818,729,22,21,31,11,13,0,415,205,755,934,934,663,17,11,35,12,14,9,229,239,590,928,1065,631,16,29,22,14,7,13,359,285,697,721,705,789,9,11,31,11,7,3,299,345,644,602,721,677,12,17,38,16,8,15,548,234,767,722,717,779,30,26,39,11,13,16,226,240,717,874,988,712,8,11,1,8,14,1,309,303,563,855,908,614,7,22,19,14,8,5,281,315,802,780,679,604,11,27,24,15,12,2,373,291,784,810,747,600,13,17,28,10,11,13,347,259,506,790,749,799,4,10,34,12,1,10,155,247,623,715,973,653,1,32,29,13,2,13,261,423,819,998,1200,656,7,26,27,7,16,10,595,461,790,849,577,915,26,25,37,13,16,14,304,214,704,630,596,591,20,17,19,16,15,16,10 +230,230,727,701,639,704,17,17,15,2,10,11,373,387,476,636,654,1009,14,38,16,13,8,11,275,261,715,579,959,772,25,6,6,11,4,2,241,291,699,754,826,977,23,10,16,8,16,13,398,354,671,778,924,791,26,16,6,9,17,10,260,366,556,738,985,733,25,4,7,13,10,0,366,300,579,553,681,1073,8,30,16,10,10,8,390,338,528,504,649,921,11,20,9,15,11,16,529,373,639,656,779,1009,35,29,8,12,16,17,355,203,731,794,944,832,17,32,34,5,17,0,414,310,579,679,850,728,16,21,12,9,11,6,246,156,816,730,623,754,8,18,11,8,9,1,310,270,798,744,667,698,10,28,9,11,8,14,386,298,530,612,731,981,5,31,1,9,4,9,228,296,555,579,897,771,8,9,2,4,5,2,370,360,799,868,1128,684,16,27,26,2,19,1,454,470,686,765,639,1211,17,30,8,10,19,9,441,283,722,606,676,759,21,16,18,11,16,17,10 +312,280,934,682,590,698,27,9,5,7,9,10,387,479,611,625,631,785,22,26,26,14,11,12,309,205,852,694,1028,714,21,24,22,12,13,3,271,261,906,755,823,891,15,24,34,9,7,12,310,304,878,817,939,723,10,24,22,10,8,9,224,296,763,845,1070,637,9,22,9,12,9,1,376,388,718,610,710,803,16,28,28,11,11,7,340,408,701,525,726,723,19,32,27,18,10,17,491,443,712,619,724,835,37,13,28,13,17,18,161,165,938,873,993,806,1,20,12,8,0,1,310,144,784,786,913,536,0,29,6,14,6,7,302,226,1023,703,684,648,18,14,13,15,10,2,442,344,1005,707,752,542,20,14,17,12,11,15,452,276,565,669,754,745,11,27,21,10,13,8,244,254,762,732,978,689,8,21,16,13,12,1,168,200,1006,1011,1205,694,0,13,16,7,2,0,492,546,629,742,582,957,33,12,24,11,14,10,367,351,935,537,605,729,13,32,8,14,13,18,10 +328,248,830,619,609,666,23,14,3,10,11,11,305,423,509,570,650,757,18,27,32,11,9,11,187,247,784,641,1047,668,17,21,26,17,3,2,331,313,808,706,842,831,19,25,38,10,15,9,338,328,776,764,958,675,14,25,26,13,16,10,198,288,663,810,1089,603,13,19,13,15,9,0,330,318,658,571,729,803,12,23,32,8,9,4,316,342,621,478,745,691,15,25,31,15,10,16,521,365,644,548,741,797,35,14,32,8,15,17,279,161,832,834,1012,760,5,25,18,11,16,0,374,152,678,745,932,562,4,24,10,17,10,6,268,182,917,640,703,606,14,15,11,18,10,1,348,266,893,636,771,568,16,15,11,9,9,14,336,230,525,626,773,765,7,20,25,7,3,9,148,194,664,683,997,647,4,18,20,14,4,2,252,250,906,954,1224,662,4,14,10,10,18,1,542,474,659,685,601,965,29,15,28,6,18,9,337,295,819,472,622,695,17,29,12,13,17,17,10 +255,303,705,856,663,714,23,31,21,0,9,9,366,186,526,741,710,935,28,14,22,11,15,11,308,324,719,734,1085,728,33,20,40,13,13,10,310,266,793,945,872,737,7,22,30,10,1,1,299,281,765,969,986,671,20,18,40,11,0,8,239,279,586,925,1129,811,19,20,31,15,7,18,347,269,673,754,785,969,26,14,30,10,7,4,329,243,618,653,805,861,29,12,37,15,10,16,490,174,731,801,789,925,27,19,38,10,9,17,220,306,687,819,1064,698,11,14,0,3,0,4,305,335,533,862,984,862,10,13,28,7,10,10,249,265,772,827,759,774,14,32,29,8,10,7,401,217,772,889,817,810,16,24,29,9,13,14,425,217,526,817,833,1009,21,13,43,11,13,9,271,231,637,682,1057,813,18,15,38,6,12,16,191,459,799,963,1280,652,10,23,28,2,2,15,515,347,762,936,657,1059,23,28,38,12,14,11,354,264,674,695,642,567,15,14,20,13,11,17,10 +277,253,886,618,622,672,22,20,6,7,15,10,310,520,563,593,663,703,17,21,37,12,13,12,194,300,838,620,1060,634,18,15,27,16,1,3,356,384,858,707,855,789,20,31,37,9,11,12,369,419,830,763,971,603,15,31,27,12,12,9,187,377,715,797,1102,587,14,19,14,14,5,1,345,421,676,562,742,751,11,29,37,9,5,7,303,421,653,457,758,617,14,19,30,16,10,17,534,438,678,545,756,723,36,20,29,9,11,18,260,196,890,847,1025,756,6,17,23,8,12,1,331,189,736,724,945,586,5,18,9,14,6,7,217,191,975,645,716,620,13,21,10,15,14,2,355,335,955,633,784,584,15,17,12,10,13,15,341,309,521,625,786,681,6,22,22,10,1,8,125,277,714,670,1010,609,3,18,19,13,0,1,227,171,958,939,1237,668,5,8,5,7,14,0,573,515,657,682,614,901,28,21,29,11,14,10,324,380,885,493,637,735,18,25,17,16,13,18,10 +211,247,775,618,608,594,19,17,2,3,6,17,260,414,536,585,651,829,14,10,33,10,4,5,290,312,757,642,1032,608,17,34,23,16,10,4,450,348,783,693,827,813,23,22,33,13,14,11,415,403,755,759,943,625,18,18,23,14,15,12,317,377,612,805,1074,565,17,30,10,16,10,6,365,395,663,562,728,899,8,18,33,13,10,6,329,427,616,483,748,741,11,22,26,14,9,10,508,404,713,541,732,829,29,19,25,13,14,11,356,254,773,859,1003,706,9,18,19,2,15,6,307,301,619,736,925,598,8,25,5,8,9,0,311,189,858,643,704,606,10,20,10,9,5,5,325,281,836,629,764,550,12,14,10,12,4,8,347,343,528,617,776,817,3,11,18,14,10,13,279,337,623,700,1000,607,0,31,15,7,11,8,409,381,853,971,1221,584,8,19,9,5,17,7,577,555,784,672,600,1037,25,18,25,15,17,13,288,296,758,481,607,679,21,24,13,14,16,11,10 +328,278,807,652,621,666,23,16,5,7,9,13,413,455,488,577,662,723,18,21,28,12,13,9,337,229,809,640,1059,666,19,29,28,16,11,0,371,279,799,751,854,815,19,29,40,11,7,7,372,338,765,799,970,679,14,19,28,12,8,12,276,324,646,823,1101,601,13,27,15,14,11,2,408,362,647,596,741,781,12,19,34,11,11,2,396,386,610,477,757,655,15,25,33,16,12,14,573,423,649,577,753,767,37,18,34,11,19,15,259,173,807,823,1024,758,5,17,14,8,2,2,350,190,653,748,944,568,4,20,12,14,8,4,278,200,892,661,715,634,14,21,15,15,8,1,472,338,884,665,783,540,16,13,15,10,11,12,452,246,486,661,785,749,7,20,27,12,11,11,272,206,649,682,1009,645,4,26,22,13,10,4,236,276,889,953,1236,660,4,18,14,7,4,3,578,534,616,718,613,937,29,17,30,13,16,9,401,279,812,497,632,671,17,25,8,16,15,15,10 +319,291,869,675,597,672,22,20,6,11,15,10,330,494,546,624,638,641,17,25,25,12,17,12,216,248,837,701,1035,624,20,15,23,16,5,3,342,338,841,748,830,759,20,31,35,9,7,10,359,339,809,808,946,593,15,31,23,12,8,9,187,343,700,844,1077,593,14,19,10,14,5,1,349,381,675,605,717,711,11,29,29,9,11,5,287,383,646,538,733,567,14,19,28,16,16,17,540,428,693,614,733,663,38,20,29,11,13,18,248,192,873,886,1000,738,6,21,11,12,8,1,355,195,719,789,920,598,5,18,7,18,10,7,279,221,958,698,691,626,13,21,12,19,14,2,389,321,948,702,759,568,15,17,18,10,17,15,361,247,490,660,761,645,6,22,22,8,5,8,125,225,699,745,985,609,3,14,17,15,4,1,243,197,943,1016,1212,666,5,8,17,11,10,0,537,465,610,735,591,843,28,21,25,9,18,10,350,330,878,534,616,715,18,25,9,16,11,18,10 +308,374,746,822,592,670,24,26,16,11,12,13,313,239,531,725,633,779,19,9,15,12,16,11,195,265,760,754,1030,668,16,27,37,16,8,4,327,229,788,915,825,739,18,23,31,9,4,1,346,234,754,969,941,657,13,13,37,12,5,8,158,208,603,953,1072,679,12,25,24,14,8,12,308,264,680,756,712,815,13,9,31,9,10,4,260,282,623,637,728,705,16,11,38,16,15,16,493,211,724,759,724,805,34,24,39,11,12,17,243,233,736,869,995,712,4,15,1,12,5,0,312,242,582,886,915,664,3,12,21,18,11,6,268,304,821,807,686,620,15,31,26,19,11,1,368,288,797,847,754,632,17,21,28,10,14,14,342,168,511,827,756,839,8,8,36,8,8,9,134,166,624,734,980,691,5,22,31,15,7,12,258,360,836,1017,1207,650,3,28,27,11,7,9,498,406,743,894,584,939,30,23,39,9,17,15,373,199,717,661,605,575,16,15,19,16,14,17,10 +284,292,942,776,606,668,16,11,14,4,11,11,285,337,623,697,601,655,11,38,17,13,9,13,169,303,882,614,882,598,20,12,7,11,3,4,331,341,890,803,773,707,26,28,17,8,9,15,396,326,866,811,859,553,21,34,7,7,10,10,134,246,767,751,904,585,20,16,6,13,3,2,300,292,682,604,612,743,5,40,17,10,3,10,244,248,681,587,566,573,8,22,10,13,4,18,493,265,684,739,748,651,32,23,9,10,9,19,225,225,946,817,875,746,12,26,35,7,10,2,304,168,792,700,775,624,11,21,11,11,4,8,270,210,1031,809,558,624,9,12,10,10,10,3,354,204,1017,827,590,580,9,20,8,11,9,16,308,144,587,643,660,599,0,35,2,9,3,7,72,132,760,592,812,561,3,9,1,2,4,0,260,286,1006,889,1047,666,11,9,25,4,12,1,512,370,699,834,608,807,22,24,9,8,12,11,343,261,945,699,669,795,24,22,19,9,11,19,10 +353,261,946,644,619,719,22,20,8,5,14,11,402,524,623,593,668,644,17,29,39,14,12,13,274,312,894,630,1055,657,18,13,29,10,4,4,388,404,906,731,850,770,20,29,39,9,10,13,387,425,878,777,966,606,15,29,29,10,9,10,233,355,773,799,1097,628,14,17,16,12,2,2,413,421,714,568,741,748,11,29,39,11,6,8,337,435,705,463,765,588,14,19,32,18,9,18,598,452,710,573,749,656,36,22,31,13,10,19,270,220,950,841,1020,777,6,23,25,6,9,2,395,175,796,730,940,663,5,20,11,12,5,8,281,215,1035,667,717,681,13,21,12,13,13,3,439,331,1005,661,779,617,15,19,14,12,12,16,421,335,541,633,793,658,6,22,24,10,4,7,165,311,768,668,1017,632,3,10,21,11,3,0,215,147,1014,943,1236,707,5,8,3,5,11,1,591,515,611,710,613,846,28,23,31,11,11,11,382,414,931,511,628,788,18,23,19,14,10,19,10 +302,266,842,609,630,640,19,19,8,9,10,11,337,509,519,582,671,711,14,22,39,12,8,11,239,363,824,587,1068,582,17,16,29,16,4,2,405,439,814,696,863,713,23,28,39,9,16,13,426,482,786,738,979,577,18,28,29,12,17,10,264,412,671,766,1110,559,17,18,16,14,10,0,406,442,628,533,750,763,8,30,39,9,10,8,342,406,609,426,766,623,11,20,32,16,11,16,589,451,628,526,762,707,33,21,31,11,16,17,247,249,846,830,1033,700,9,12,25,10,17,0,358,236,692,691,953,636,8,17,11,16,11,6,296,190,931,638,724,620,10,24,12,17,9,1,396,338,919,614,792,602,12,20,14,10,8,14,394,312,497,598,794,707,3,23,24,10,4,9,194,296,670,645,1018,557,0,19,21,15,5,2,232,232,914,912,1245,630,8,9,3,9,19,1,644,506,653,669,622,923,25,24,31,11,19,9,305,377,845,486,641,681,21,22,19,16,16,17,10 +317,309,697,803,619,643,18,24,15,9,9,13,324,278,538,698,664,762,13,9,20,16,7,11,214,278,713,745,1057,633,18,27,38,12,5,4,386,268,735,902,852,714,24,27,36,7,17,1,411,263,703,944,968,634,19,17,38,8,18,8,233,237,572,942,1099,638,18,27,25,10,11,12,383,275,677,731,739,814,7,15,36,13,11,4,315,297,618,612,759,698,10,9,43,20,12,16,572,262,729,738,751,782,32,20,44,13,17,17,274,252,689,850,1022,683,10,9,6,10,18,0,367,251,535,869,942,659,9,14,22,16,12,6,293,223,774,778,713,609,9,33,23,17,8,1,389,233,752,826,781,629,11,21,23,14,7,14,375,199,526,802,787,834,2,14,37,12,5,9,137,185,583,717,1011,650,1,22,32,15,6,12,253,379,787,1000,1234,625,9,22,22,9,20,9,615,421,772,877,611,948,24,23,40,11,20,15,318,200,676,636,630,554,22,19,14,16,15,17,10 +335,307,883,613,601,637,23,21,7,5,10,11,394,528,562,568,650,684,18,28,38,14,8,11,282,288,841,621,1033,581,13,8,28,14,4,2,432,328,859,706,828,714,19,24,38,13,16,11,477,363,831,768,944,566,14,24,28,14,17,10,293,403,720,798,1075,558,13,12,15,12,10,0,453,431,701,567,723,742,12,28,38,13,10,6,401,459,674,458,747,594,15,18,31,18,11,16,640,490,701,528,727,682,29,27,30,13,16,17,262,198,887,840,1000,697,5,18,24,6,17,0,397,237,733,725,920,617,4,17,10,12,11,6,311,247,972,630,699,605,14,22,11,13,9,1,453,387,940,616,757,585,16,24,13,12,8,14,441,337,546,630,775,692,7,21,23,14,4,9,217,297,717,667,999,566,4,11,20,11,5,2,305,253,959,938,1216,629,4,13,4,5,19,1,673,593,698,673,595,894,29,28,30,15,19,9,382,356,860,468,606,688,17,18,18,14,16,17,10 +251,411,759,751,591,691,24,26,16,6,14,14,320,268,554,674,628,760,19,17,15,11,12,8,230,220,737,701,1025,677,16,29,35,15,0,1,384,160,801,836,820,770,18,15,31,10,12,2,405,205,773,896,936,706,13,7,35,11,13,11,251,269,616,894,1067,640,12,25,22,15,6,9,363,333,707,687,707,796,13,9,31,10,6,1,329,433,654,570,723,696,16,19,38,15,7,13,544,308,753,694,727,804,34,32,39,10,12,14,246,192,749,868,990,757,4,15,1,7,13,3,319,329,595,823,910,599,3,20,19,13,7,3,285,309,834,762,681,619,15,33,24,14,13,2,379,365,816,782,749,599,17,23,28,9,12,11,349,349,496,748,751,796,8,16,34,11,0,12,189,331,641,707,975,676,5,30,29,12,1,9,291,413,849,988,1202,687,3,32,27,6,15,6,591,547,772,821,585,920,30,31,37,12,15,12,312,288,736,604,608,634,16,15,19,17,14,14,10 +200,216,782,707,569,648,23,12,7,7,9,12,273,407,485,632,604,841,18,15,24,14,9,10,199,265,746,717,997,686,15,31,26,12,5,1,293,321,770,786,794,849,19,31,38,9,9,8,320,344,740,844,908,729,14,23,26,10,10,11,154,286,623,878,1039,653,13,29,13,12,7,1,284,286,638,639,681,909,12,23,32,11,5,3,282,348,599,552,703,769,15,23,31,18,8,15,471,355,694,640,701,859,33,14,32,13,15,16,223,165,782,874,962,742,5,21,10,8,10,1,268,174,628,817,882,632,4,26,10,14,4,5,218,164,867,716,655,634,14,15,15,15,8,0,312,254,833,728,721,594,16,11,19,12,7,13,318,260,537,696,729,869,7,16,25,10,5,10,160,228,620,755,953,687,4,32,20,13,6,3,254,252,860,1030,1174,632,4,14,18,7,12,2,496,458,709,767,561,1067,29,13,28,11,12,8,319,309,759,548,582,629,17,29,10,14,13,16,10 +323,387,864,808,584,680,24,17,14,6,9,13,406,338,591,715,629,687,19,10,17,11,11,11,302,222,870,764,1022,660,16,40,37,17,13,2,302,252,890,901,817,745,18,26,33,16,5,1,341,225,858,961,933,695,13,20,37,19,6,8,237,211,713,959,1064,623,12,38,24,19,9,8,387,303,766,748,704,727,13,18,33,14,9,4,315,349,719,629,724,623,16,24,40,9,10,16,530,312,772,737,716,749,34,21,41,14,17,17,168,204,858,911,987,750,4,18,3,7,0,0,337,187,704,886,907,566,3,23,21,13,6,6,305,313,943,799,678,622,15,22,26,14,10,1,443,315,923,825,746,572,17,12,26,13,11,14,441,167,549,819,750,733,8,17,36,15,13,9,215,139,728,764,974,651,5,37,31,12,12,8,167,311,950,1045,1199,692,3,21,25,6,2,5,535,483,747,872,578,861,30,20,39,16,14,11,340,224,845,645,595,603,16,24,17,13,13,17,10 +306,288,845,707,608,686,20,20,13,9,14,11,257,437,536,642,645,747,15,21,18,10,12,13,177,289,799,643,1042,622,16,19,30,14,0,4,345,357,837,792,837,735,22,33,34,11,12,7,340,376,809,830,953,641,17,33,30,10,13,10,134,292,678,828,1084,607,16,21,23,16,6,2,288,306,671,615,724,759,9,29,34,7,6,6,214,356,640,514,740,645,12,19,35,14,7,18,473,361,667,646,744,751,34,16,36,9,12,19,271,161,845,850,1007,740,8,15,10,10,13,2,316,196,691,757,927,632,7,18,20,16,7,8,280,190,930,724,698,622,11,19,25,17,13,3,300,282,910,734,766,626,13,17,25,8,12,16,326,292,500,682,768,731,4,22,33,6,0,9,122,274,683,661,992,609,1,22,30,13,1,2,240,200,921,940,1219,674,7,8,24,9,15,1,526,434,706,777,602,877,26,19,32,7,15,11,291,379,834,570,625,717,20,25,16,14,14,19,10 +370,322,972,631,613,774,25,16,7,8,9,12,473,497,647,596,658,687,20,43,38,15,13,10,389,251,860,591,1051,728,21,7,28,15,11,1,367,299,948,716,846,869,17,23,38,18,3,12,382,344,918,758,962,675,12,29,28,19,4,11,308,372,803,768,1093,683,11,11,15,13,11,1,456,412,764,541,733,763,14,35,38,18,9,7,424,480,745,430,753,673,17,17,31,11,12,15,597,485,758,558,745,749,39,28,30,18,15,16,159,177,974,832,1016,858,3,31,24,5,2,1,354,220,820,693,936,640,2,22,10,1,8,5,288,246,1059,658,707,712,16,17,11,2,8,0,510,402,1033,646,775,614,18,25,13,17,11,13,526,370,575,612,781,617,9,30,23,19,11,10,312,334,804,639,1005,701,6,4,20,12,10,3,216,238,1046,912,1228,766,2,14,4,10,4,2,592,612,689,695,605,837,31,29,30,20,16,8,409,397,963,506,624,851,15,17,18,9,13,16,10 +323,439,861,827,597,753,28,24,18,4,9,14,386,216,586,718,640,818,23,15,17,7,11,12,268,162,809,731,1033,727,18,33,39,13,13,3,318,136,897,918,828,780,14,21,29,14,1,2,351,143,865,950,944,722,9,11,39,13,2,9,199,187,714,918,1075,718,8,29,26,15,9,11,365,233,757,731,717,796,17,13,29,8,7,5,281,339,706,624,739,738,20,23,36,11,10,17,524,230,753,770,727,836,36,26,37,8,13,18,196,240,851,852,998,783,0,21,1,5,0,1,335,291,697,857,918,655,1,16,23,9,6,7,305,357,936,812,695,661,19,27,28,8,10,2,425,337,904,858,757,657,21,17,30,7,11,15,403,279,554,800,765,830,12,20,38,9,13,8,169,259,735,699,989,750,9,30,33,6,12,11,195,409,947,988,1210,725,1,26,29,4,2,8,521,459,768,903,589,914,34,25,37,10,14,14,362,258,830,674,606,662,12,17,21,13,11,18,10 +237,321,714,760,576,641,21,20,13,6,13,13,298,278,525,673,617,812,20,9,18,11,11,9,212,274,742,752,1014,669,15,33,30,15,1,0,374,244,750,843,809,792,17,23,34,10,13,1,395,253,722,915,925,696,16,13,30,11,14,10,235,245,571,939,1056,668,15,29,17,15,7,8,337,289,664,706,696,878,14,15,34,10,7,2,321,347,599,595,712,750,17,17,35,15,8,14,522,270,740,705,708,844,33,24,36,10,13,15,244,240,706,877,979,707,7,11,4,7,14,2,291,275,552,866,899,655,6,22,14,13,8,4,277,251,791,757,670,621,12,27,19,14,12,1,365,267,775,793,738,619,14,17,25,9,11,12,327,259,509,765,740,870,9,14,29,11,1,11,181,233,586,760,964,692,6,32,24,12,2,8,287,395,802,1041,1191,627,6,24,24,6,16,5,567,471,761,828,568,1024,27,23,32,12,16,11,284,218,699,607,587,572,15,21,16,17,15,15,10 +368,270,880,657,604,651,22,15,9,10,11,11,369,457,559,588,649,676,17,30,24,11,9,13,259,237,848,657,1042,605,14,18,32,17,3,4,391,301,858,758,837,738,20,26,40,10,15,9,406,328,828,814,953,586,15,26,32,13,16,10,236,330,713,842,1084,576,14,18,19,15,9,2,406,330,698,611,724,736,11,26,38,8,9,6,334,366,669,496,744,588,14,24,37,15,10,18,607,403,694,584,736,684,32,17,38,8,15,19,269,165,882,844,1007,713,6,22,10,11,16,2,390,180,728,767,927,605,5,21,16,17,10,8,318,186,967,664,698,607,13,18,19,18,10,3,428,290,939,672,766,583,15,14,19,9,9,16,410,240,535,676,772,690,6,23,31,7,3,7,152,206,712,691,996,594,3,15,26,14,4,0,230,260,954,964,1219,645,5,11,18,10,18,1,616,480,663,729,596,874,28,18,34,8,18,11,351,299,863,502,615,670,18,26,10,15,17,19,10 +290,396,784,777,603,680,26,21,16,7,12,15,383,245,535,676,644,829,25,14,17,10,16,9,281,239,768,719,1041,698,20,26,39,18,8,2,339,167,816,868,836,795,12,18,31,11,4,1,370,180,782,920,952,715,11,10,39,14,5,10,238,224,639,912,1083,707,10,22,26,16,8,10,372,284,684,707,723,865,19,14,31,11,8,2,338,372,633,588,739,767,22,16,38,14,15,14,549,257,742,702,735,873,34,29,39,11,10,15,187,219,776,850,1006,736,2,12,1,8,5,2,320,296,622,837,926,664,3,19,23,14,11,4,286,316,861,758,697,620,17,30,28,15,11,1,414,306,841,790,765,650,19,24,28,10,14,12,418,282,507,776,767,859,14,13,38,12,8,11,226,264,654,721,991,725,11,29,33,13,7,10,222,414,874,1004,1218,662,3,29,27,7,7,7,564,490,737,837,595,991,32,28,39,13,15,13,343,229,763,606,614,589,14,18,19,18,14,15,10 +262,272,767,687,593,673,20,17,4,6,12,12,409,397,466,610,634,952,23,28,27,17,10,10,315,271,743,691,1019,743,20,20,25,11,2,1,337,275,751,766,814,892,14,20,37,12,14,10,376,342,719,814,930,770,19,16,25,13,15,11,298,346,600,848,1061,744,18,18,12,9,8,1,398,356,611,613,709,1018,17,20,31,14,8,5,444,412,570,528,729,884,20,26,30,21,9,15,577,395,653,620,719,974,36,23,31,14,14,16,315,225,767,864,988,757,10,26,13,9,15,1,382,304,613,785,908,729,9,25,9,11,9,5,228,190,852,694,683,723,11,24,14,12,11,0,406,306,830,708,743,701,13,22,16,15,10,13,426,322,524,672,757,972,12,21,24,13,2,10,262,322,603,741,981,774,9,21,19,10,3,3,332,380,843,1012,1204,645,9,23,15,6,17,2,564,540,686,751,585,1172,24,22,27,14,17,8,425,295,756,530,608,634,12,24,7,11,16,16,10 +290,472,776,818,618,763,27,28,22,6,11,11,313,195,571,713,661,842,22,11,21,15,11,13,203,177,750,666,1054,737,17,31,35,11,11,6,299,159,824,911,849,768,15,21,25,8,1,3,332,150,792,925,965,698,10,11,35,9,2,10,130,238,635,865,1096,724,9,29,30,11,9,14,296,250,714,722,738,818,16,7,25,12,9,6,238,322,657,619,758,734,19,13,32,19,12,18,477,231,762,757,748,806,35,26,33,12,5,19,187,231,764,817,1019,797,1,17,5,7,2,2,290,298,610,806,939,669,0,16,27,13,12,8,274,374,849,809,714,687,18,27,32,14,8,3,372,366,825,845,778,661,20,19,34,13,13,16,352,250,489,777,786,846,11,10,40,11,11,7,112,250,660,620,1010,758,8,26,37,12,10,14,196,426,864,903,1231,737,0,30,33,6,4,11,480,450,767,888,610,868,33,25,33,10,10,13,353,233,745,663,627,710,13,13,23,13,13,19,10 +230,274,774,654,606,638,20,20,3,5,10,13,299,403,507,589,649,769,15,13,28,12,8,9,247,259,768,684,1044,648,16,33,26,16,4,0,405,275,780,737,839,841,22,27,38,11,16,9,384,340,752,793,955,667,17,19,26,12,17,12,280,316,611,837,1086,583,16,29,13,14,10,2,368,358,662,598,726,827,9,15,32,11,10,4,360,416,609,527,744,693,12,17,31,16,11,14,543,383,704,583,740,793,34,20,32,11,16,15,301,199,772,869,1009,738,8,19,14,6,17,2,316,274,618,774,929,546,7,26,10,12,11,4,264,208,857,665,700,586,11,21,15,13,9,1,368,300,837,671,768,542,13,17,15,10,8,12,346,306,507,653,772,771,4,10,25,12,4,11,232,280,620,746,996,629,1,36,20,11,5,4,312,350,852,1015,1221,632,7,22,14,5,19,3,596,540,725,716,598,977,26,19,28,13,19,9,317,277,763,499,621,689,20,21,8,16,16,15,10 +304,286,819,686,641,680,24,21,5,5,10,13,419,415,502,593,682,823,19,24,30,12,14,9,347,251,771,684,1079,714,22,26,28,16,10,0,389,253,821,773,874,871,18,26,40,15,4,7,374,322,787,835,990,749,13,16,28,16,5,12,310,318,658,865,1121,667,12,24,15,14,10,2,416,370,657,634,761,859,13,18,34,15,10,2,404,436,614,521,777,763,16,24,33,16,13,14,577,403,693,615,773,871,40,21,34,15,16,15,269,183,817,835,1044,776,4,16,16,4,3,2,326,222,663,792,964,576,3,19,12,8,9,4,244,206,902,683,735,620,15,20,13,9,9,1,472,348,888,703,803,576,17,16,13,14,12,12,452,316,498,697,805,819,8,19,27,16,10,11,288,288,665,726,1029,707,5,23,22,9,9,4,256,324,899,997,1256,668,3,23,12,7,5,3,588,560,658,752,633,1019,30,20,30,17,17,9,389,277,810,525,652,663,16,20,10,14,14,15,10 +294,424,842,694,637,708,28,27,18,2,16,11,353,259,575,607,680,765,23,16,19,13,14,11,235,163,786,630,1053,682,14,28,41,13,4,2,355,127,862,795,848,753,14,16,33,8,8,3,392,184,832,839,964,705,9,6,41,9,9,8,214,260,687,823,1095,665,8,24,28,13,4,6,366,304,726,624,761,805,17,8,33,10,4,4,318,408,683,507,781,699,20,18,40,17,11,16,567,301,736,623,753,797,32,31,41,10,8,17,231,185,836,801,1024,752,2,16,3,5,9,0,342,314,682,752,946,672,1,19,25,9,9,6,290,316,921,693,739,652,19,32,26,8,15,1,406,374,881,711,791,594,21,22,26,11,16,14,370,334,513,693,805,813,12,15,40,9,4,9,156,314,702,640,1029,701,9,27,35,6,3,6,254,404,924,921,1238,684,1,31,25,2,11,3,590,532,751,764,629,931,34,30,41,10,11,9,341,271,805,533,630,643,12,14,17,13,10,17,10 +324,350,826,744,613,680,23,22,11,7,15,12,361,311,525,647,654,759,18,21,20,12,13,10,247,205,798,716,1051,672,19,29,32,16,1,1,363,219,832,833,846,787,19,23,36,9,11,4,380,216,798,895,962,719,14,13,32,12,12,9,226,242,669,905,1093,635,13,27,19,14,5,5,382,264,698,684,733,801,12,13,36,9,5,3,306,338,651,565,749,699,15,19,37,16,10,15,575,317,712,675,745,803,37,24,38,9,11,16,247,179,822,861,1016,742,5,21,6,8,12,1,366,234,668,830,936,600,4,16,16,14,6,5,274,248,907,733,707,616,14,25,21,15,14,0,408,298,887,763,775,566,16,15,23,10,13,13,378,228,515,755,777,795,7,14,31,8,1,10,154,208,676,734,1001,681,4,26,26,13,0,5,240,354,908,1011,1228,664,4,24,22,7,14,2,584,478,713,806,605,953,29,23,34,9,14,8,345,217,813,583,624,631,17,19,14,16,13,16,10 +264,334,765,767,594,673,23,22,13,8,15,13,311,297,536,662,641,788,18,11,20,11,13,9,205,221,759,707,1032,685,15,31,36,15,1,0,327,229,791,864,827,784,19,21,36,10,11,1,348,230,757,900,943,708,14,11,36,11,12,10,186,210,618,898,1074,664,13,27,23,15,5,8,324,286,689,685,716,844,12,13,36,8,5,2,284,346,628,570,738,724,15,15,41,15,8,14,519,291,741,700,726,828,33,26,42,10,11,15,209,187,757,838,997,741,5,11,6,9,12,2,310,210,603,825,917,641,4,20,20,15,6,4,262,260,842,754,690,631,14,29,23,16,14,1,362,278,818,788,756,611,16,19,23,9,13,12,348,228,514,754,766,852,7,12,35,9,1,11,144,206,631,709,990,694,4,30,30,14,0,8,210,326,853,990,1211,663,4,26,22,8,14,5,544,470,750,839,588,974,29,25,38,10,14,11,289,215,742,604,605,600,17,19,14,17,13,15,10 +223,363,719,859,592,707,22,20,19,4,17,11,276,180,580,760,635,874,23,9,16,11,15,11,178,252,739,763,1030,721,22,27,38,13,3,6,286,198,777,948,825,780,8,25,28,10,9,1,349,189,749,994,941,678,15,15,38,9,10,8,149,225,582,956,1072,748,14,27,25,15,3,14,293,243,707,777,712,872,23,17,28,8,3,4,263,281,650,666,730,786,26,11,35,15,10,16,482,164,769,802,724,874,30,22,36,8,9,17,200,286,707,866,995,749,6,7,2,5,10,0,281,335,553,895,915,721,7,16,22,11,8,6,249,325,792,840,686,663,13,29,27,12,16,3,333,259,764,890,754,711,15,23,31,9,15,14,321,291,536,846,758,894,18,16,37,9,3,9,125,293,617,723,982,758,15,26,32,10,2,14,231,461,811,1010,1207,683,7,22,30,4,12,11,517,383,816,929,584,970,28,23,36,10,12,13,300,278,682,700,603,638,10,19,22,17,11,17,10 +252,230,785,682,570,622,21,14,4,7,10,11,331,399,502,631,601,825,16,19,27,14,8,11,241,277,761,688,988,656,15,23,21,12,4,2,365,323,735,751,793,861,21,23,33,9,16,15,408,354,711,807,899,677,16,23,21,10,17,10,226,300,614,833,1030,595,15,21,8,12,10,0,356,340,597,594,674,895,10,21,27,11,10,10,356,372,564,523,690,745,13,21,26,18,11,16,543,351,681,621,704,835,31,14,27,13,16,17,307,199,789,899,953,742,7,21,13,8,17,0,356,192,635,774,873,580,6,26,5,14,11,6,254,158,874,707,644,618,12,17,14,15,9,1,372,256,852,709,712,544,14,17,16,12,8,14,344,260,562,653,718,827,5,14,20,10,4,9,182,234,607,730,942,637,2,26,15,13,5,2,324,298,851,1009,1165,614,6,16,15,7,19,1,568,496,676,738,562,1043,27,13,23,11,19,9,377,263,778,543,587,677,19,27,7,14,16,17,10 +291,269,872,642,633,696,23,18,4,3,14,10,362,442,551,587,674,755,18,25,31,12,12,12,246,252,832,630,1071,658,15,17,27,14,0,3,386,302,850,735,866,789,19,21,39,9,12,10,415,351,822,781,982,641,14,21,27,10,13,9,241,353,705,805,1113,627,13,13,14,14,6,1,401,345,690,574,753,789,12,21,33,9,6,5,357,409,659,463,769,673,15,21,32,16,9,17,588,420,690,571,765,769,33,20,33,9,12,18,256,152,876,833,1036,756,5,23,17,4,13,1,369,239,722,734,956,642,4,22,11,10,7,7,273,185,961,659,727,638,14,21,12,11,13,2,407,331,937,659,795,608,16,19,12,10,12,15,395,319,533,639,797,757,7,18,26,10,0,8,173,297,704,666,1021,655,4,20,21,9,1,1,251,265,948,939,1248,680,4,16,11,3,15,0,627,535,695,710,625,953,29,21,29,11,15,10,346,360,861,501,644,699,17,25,11,16,14,18,10 +300,384,865,732,605,753,28,21,17,6,8,11,393,307,556,641,650,802,23,18,18,9,12,11,303,163,809,656,1043,743,20,32,40,17,12,2,307,163,877,829,838,820,14,24,32,12,2,3,328,200,845,865,954,760,9,16,40,13,3,8,220,252,710,847,1085,698,8,30,27,17,10,6,376,320,717,650,725,786,17,18,32,10,8,4,346,394,680,535,745,728,20,24,39,13,11,16,527,353,745,669,737,840,36,23,40,10,14,17,197,141,861,829,1008,823,0,16,2,7,1,0,326,226,707,776,928,601,1,19,24,13,7,6,256,278,946,735,699,683,19,22,27,14,9,1,442,354,930,757,767,611,21,14,27,9,10,14,434,264,534,719,773,792,12,19,39,11,12,9,218,238,719,658,997,740,9,29,34,12,11,6,170,330,949,937,1220,747,1,23,26,6,3,3,520,524,722,808,597,900,34,22,40,12,15,9,375,263,854,579,616,700,12,20,18,17,12,17,10 +278,316,735,720,607,637,20,19,11,9,11,11,213,393,490,637,648,758,15,10,20,14,9,11,133,195,737,702,1045,633,16,30,30,12,3,2,315,281,747,801,840,790,22,28,36,7,15,3,330,274,715,853,956,680,17,18,30,8,16,8,134,274,586,881,1087,588,16,28,17,12,9,6,248,286,651,646,727,810,9,16,36,11,9,4,236,332,596,543,743,686,12,16,35,18,10,16,437,373,689,661,743,780,34,19,36,11,15,17,275,195,731,851,1010,715,8,14,6,10,16,0,282,186,577,814,930,569,7,17,14,16,10,6,270,220,816,727,701,597,11,24,19,17,10,1,292,276,798,749,769,547,13,14,23,12,9,14,268,200,484,705,771,784,4,13,29,10,3,9,138,182,591,714,995,630,1,31,24,15,4,6,292,282,819,995,1222,629,7,21,22,9,18,3,482,478,698,788,601,960,26,18,32,9,18,9,311,275,722,569,624,626,20,22,14,14,17,17,10 +285,371,782,735,588,655,23,23,11,11,12,11,268,268,553,632,635,752,18,14,22,12,10,11,178,230,782,689,1026,643,13,30,34,16,2,2,362,192,806,834,821,756,19,18,38,9,14,3,387,171,778,874,937,692,14,8,34,12,15,8,227,215,627,878,1068,612,13,26,21,14,8,6,325,289,704,661,710,804,12,12,38,9,8,4,263,373,647,542,732,692,15,16,39,16,9,16,508,290,748,668,720,794,29,29,40,11,14,17,242,214,776,832,991,725,5,12,8,12,15,0,297,267,622,803,911,589,4,21,18,18,9,6,317,283,861,724,684,589,14,30,21,19,11,1,333,293,829,756,750,585,16,20,21,10,10,14,321,257,535,732,760,790,7,13,33,8,2,9,147,239,644,703,984,642,4,31,28,15,3,6,263,387,864,982,1205,651,4,29,20,11,17,3,579,495,789,807,582,940,29,28,36,9,17,9,272,198,751,574,599,608,17,18,12,16,16,17,10 +315,267,923,630,643,715,24,16,3,6,9,10,386,530,600,591,680,714,19,31,34,13,13,12,270,274,859,632,1077,685,22,19,24,13,11,3,346,368,887,717,872,828,18,29,34,8,5,14,355,377,859,773,988,642,13,29,24,9,6,9,229,399,750,807,1119,644,12,21,11,13,11,1,387,417,701,576,759,784,13,27,34,10,9,9,353,429,680,471,775,666,16,23,27,17,12,17,554,480,705,551,779,756,40,16,28,10,17,18,258,194,927,845,1042,793,4,27,20,7,2,1,353,209,773,736,962,629,3,22,6,13,8,7,239,213,1012,651,733,665,15,17,9,14,8,2,429,365,996,639,801,587,17,13,9,11,11,15,411,319,544,631,803,702,8,24,21,9,11,8,187,295,745,688,1027,674,5,16,16,12,10,1,207,169,991,957,1254,701,3,10,8,6,4,0,549,533,626,690,637,916,30,17,26,10,16,10,392,388,926,489,660,752,16,29,14,15,13,18,10 +267,317,677,819,581,631,16,21,15,8,11,14,288,264,524,728,616,810,21,10,16,13,9,12,180,270,701,789,1011,651,20,26,34,13,3,3,346,250,719,908,806,736,16,26,32,8,15,2,395,245,691,964,922,654,21,16,34,9,16,9,201,251,542,980,1053,676,20,28,21,13,9,11,335,231,653,757,693,870,15,18,32,10,9,5,289,283,588,654,711,754,18,12,39,17,10,17,522,246,729,766,715,834,34,21,40,12,15,18,242,234,667,880,976,675,12,6,2,9,16,1,313,281,515,907,896,699,11,17,18,15,10,7,297,227,752,806,667,643,7,30,23,16,10,2,361,257,728,854,735,655,9,22,27,11,9,15,321,199,520,814,739,888,10,17,33,9,3,8,135,197,559,769,963,690,7,25,28,14,4,11,277,405,763,1054,1188,611,11,21,26,8,18,8,571,409,774,893,573,1004,22,24,36,10,18,14,304,208,652,662,596,534,14,18,18,15,17,18,10 +314,384,773,852,639,738,25,26,22,5,15,12,311,219,562,741,680,837,20,9,23,12,13,12,209,229,769,716,1077,718,17,29,39,12,5,5,327,211,809,945,872,759,17,27,29,9,7,2,340,206,775,965,988,681,12,17,39,8,8,9,142,178,630,909,1119,717,11,29,32,14,5,13,312,256,707,752,759,837,14,13,29,9,5,5,234,268,652,649,777,741,17,11,36,16,12,17,511,187,765,791,771,819,35,20,37,9,7,18,241,251,763,825,1042,770,3,11,1,6,8,1,328,250,609,852,962,694,2,16,29,12,10,7,260,314,848,829,733,670,16,29,30,13,14,2,354,278,826,879,801,676,18,19,30,10,15,15,364,208,526,813,805,861,9,12,44,8,5,8,116,198,647,674,1029,743,6,24,39,11,4,13,208,384,863,961,1254,708,2,24,29,5,10,10,508,390,780,928,631,903,31,23,37,9,10,14,329,245,748,691,650,679,15,19,21,16,11,18,10 +321,319,813,715,633,720,21,30,15,5,13,11,430,406,520,642,674,739,16,19,16,16,15,11,314,240,791,661,1071,696,19,31,36,10,7,2,376,242,825,802,866,797,21,17,32,13,5,5,397,297,797,858,982,721,16,9,36,14,6,10,267,365,654,852,1113,655,15,27,23,10,7,4,419,335,683,643,753,783,10,11,32,13,7,4,379,393,642,528,769,669,13,19,39,16,14,16,600,436,705,646,765,779,37,30,40,13,9,17,258,136,809,858,1036,792,7,21,2,8,6,0,349,285,655,779,956,628,6,18,20,6,12,6,255,235,894,722,727,660,12,27,25,7,12,1,455,365,874,734,795,608,14,21,27,14,15,14,459,281,464,712,797,765,5,14,35,14,7,9,241,263,665,679,1021,687,2,26,30,7,6,4,237,299,893,960,1248,718,6,32,26,5,8,1,609,535,672,777,625,903,27,29,38,15,14,9,404,310,802,564,644,691,19,11,18,12,13,17,10 +308,278,910,653,644,719,25,20,5,10,11,14,395,437,581,588,685,748,20,17,30,17,13,8,353,217,828,643,1082,713,23,33,28,17,15,1,329,305,906,744,877,870,17,31,40,20,9,8,302,328,872,794,993,712,12,23,28,21,10,13,282,290,749,820,1124,650,11,31,15,15,9,3,392,348,716,589,764,768,14,23,34,20,13,3,376,388,695,480,780,694,17,27,33,13,10,13,505,399,732,574,776,804,39,16,34,20,15,14,245,161,908,832,1047,815,3,9,16,7,2,3,298,152,754,747,967,569,2,24,12,3,8,3,276,210,993,664,738,653,16,15,13,4,12,2,462,324,961,662,806,577,18,15,13,19,13,11,464,254,563,654,808,710,9,22,27,21,15,12,306,214,754,689,1032,690,6,30,22,14,14,5,198,234,990,960,1259,717,2,22,12,12,0,4,484,518,669,715,636,920,31,15,30,22,12,10,413,285,895,498,655,734,15,21,10,11,11,14,10 +291,297,696,830,631,688,14,20,19,8,14,11,292,182,569,725,674,851,19,11,20,9,12,13,212,350,696,738,1063,692,22,27,42,17,0,6,312,278,736,929,858,737,12,27,32,12,12,3,331,271,708,961,974,665,23,17,42,15,13,10,173,271,551,937,1105,741,22,29,29,17,6,14,323,279,690,748,751,885,19,19,32,8,6,6,285,187,619,633,771,781,22,13,39,13,7,18,506,166,754,759,757,869,32,20,40,8,12,19,224,352,686,833,1028,700,14,5,2,9,13,2,335,313,532,868,948,754,13,18,26,15,7,8,277,271,771,797,727,684,5,29,27,16,13,3,333,179,741,847,787,718,9,21,27,7,12,16,357,187,555,817,799,915,14,18,41,9,0,7,153,203,576,706,1023,747,11,26,36,14,1,14,199,461,784,987,1244,648,13,20,26,8,15,11,547,299,817,902,623,997,20,23,40,10,15,13,290,270,665,657,636,567,10,19,18,17,14,19,10 +309,315,951,602,603,734,27,17,7,4,13,12,424,518,632,579,646,707,22,36,38,11,17,10,336,278,861,610,1041,706,19,14,28,17,7,1,372,314,933,689,836,867,15,24,38,14,5,12,391,361,905,753,952,659,10,24,28,15,6,11,281,379,782,787,1083,651,9,14,15,17,7,1,415,427,751,556,723,769,16,28,38,14,13,7,395,485,732,449,741,665,19,22,31,13,16,15,590,496,745,513,735,761,37,21,30,14,17,16,226,168,953,849,1006,826,1,26,24,3,6,1,335,233,799,714,926,604,0,25,10,9,12,5,255,255,1038,627,697,674,18,14,11,10,12,0,463,387,1010,601,765,606,20,18,13,13,15,13,463,367,562,617,769,669,11,25,23,15,7,10,275,325,783,668,993,679,8,11,20,8,6,3,243,247,1025,935,1218,732,0,13,4,6,8,2,601,613,682,656,595,891,33,22,30,16,20,8,378,388,938,471,614,803,13,22,18,15,13,16,10 +264,300,641,867,618,681,16,24,18,4,17,10,339,171,534,760,659,888,21,13,19,11,15,12,231,323,663,745,1056,699,26,23,39,15,3,7,371,245,703,960,851,700,12,23,29,10,9,2,390,252,675,990,967,632,25,17,39,11,10,9,222,276,506,944,1098,766,24,25,28,15,3,15,362,258,651,775,738,906,19,19,29,10,3,5,318,236,584,666,754,806,22,13,36,15,10,17,557,177,721,804,750,870,34,20,37,10,9,18,221,315,627,800,1021,681,16,5,1,5,10,1,312,350,473,883,941,795,15,18,25,11,8,7,262,270,712,824,712,723,7,33,30,12,16,4,402,210,690,892,780,759,9,21,30,9,15,15,358,252,518,842,782,952,14,18,40,11,3,8,156,266,541,699,1006,772,11,22,35,10,2,15,244,474,731,980,1233,631,15,20,29,4,12,12,600,344,788,939,610,996,18,27,37,12,12,12,311,271,610,692,631,542,10,15,21,17,11,18,10 +241,311,801,802,661,647,22,18,13,3,11,14,286,284,542,709,712,928,23,15,18,14,15,8,226,216,751,770,1047,697,22,27,34,12,9,1,296,244,823,891,820,804,6,27,34,7,3,2,315,249,785,951,928,692,15,19,34,8,4,11,161,221,656,961,1095,746,14,25,21,12,9,9,283,221,687,740,785,990,25,17,34,11,11,1,275,291,632,623,811,864,26,15,39,18,14,13,448,278,711,741,771,946,28,18,40,11,13,14,228,198,795,869,1052,685,8,17,4,6,4,3,265,239,641,888,970,777,9,8,18,10,10,3,249,229,880,783,763,737,13,27,23,11,10,2,361,247,842,829,805,735,15,19,25,12,13,11,329,229,568,805,837,982,20,10,33,10,9,12,159,225,665,768,1061,770,17,24,28,9,8,9,255,363,893,1051,1272,597,9,20,24,3,6,6,457,415,770,872,655,1124,28,17,36,9,18,12,342,262,764,637,614,556,10,23,16,14,15,14,10 +252,308,773,731,632,683,19,19,11,5,10,10,325,339,560,626,675,982,18,20,24,16,8,12,235,231,709,701,1026,745,17,20,34,8,4,3,361,233,773,826,809,850,15,18,40,11,16,6,402,300,745,870,923,762,22,14,34,12,17,11,234,306,618,880,1072,782,17,16,21,10,10,3,358,298,679,653,758,1046,20,16,40,13,10,5,348,368,622,538,782,918,23,18,39,14,11,17,539,345,717,668,740,998,29,23,40,13,16,18,303,221,773,826,1011,729,17,20,10,8,17,1,350,292,623,809,935,805,14,21,18,6,11,7,260,204,858,720,738,777,10,28,19,5,9,2,354,272,806,756,778,761,12,24,19,14,8,15,346,314,586,724,804,1032,15,13,33,12,4,10,192,312,625,719,1026,816,12,23,28,5,5,3,316,394,853,998,1233,639,14,23,18,5,19,0,584,490,820,805,624,1196,25,22,36,13,19,10,371,275,730,570,609,576,9,22,10,10,16,18,10 +330,276,894,581,626,644,19,16,6,8,8,10,427,489,571,574,669,753,14,33,37,13,4,12,305,337,862,601,1064,628,17,17,27,15,10,3,387,445,836,666,859,793,23,23,37,10,12,16,400,476,812,728,975,583,18,23,27,11,13,9,276,388,719,772,1106,555,17,17,14,13,10,1,426,430,642,537,746,833,8,25,37,10,14,11,420,376,637,446,764,665,11,23,30,17,9,17,615,453,652,498,758,755,33,18,29,12,12,18,315,269,898,844,1029,760,9,27,23,9,15,1,408,196,744,701,949,596,8,26,9,15,9,7,248,222,983,614,720,640,10,15,10,16,9,2,440,334,969,586,788,562,12,15,12,11,6,15,456,272,569,592,792,723,3,26,22,11,10,8,226,252,712,671,1016,591,0,14,19,14,11,1,252,246,956,934,1241,640,8,14,5,8,15,0,606,514,591,639,618,955,25,19,29,12,15,10,423,329,895,468,637,755,21,27,17,15,12,18,10 +350,280,917,688,615,712,24,18,10,4,16,11,413,421,594,633,656,725,19,33,21,13,14,13,285,181,853,678,1053,662,18,13,29,13,2,4,395,257,889,769,848,791,18,23,37,10,10,9,414,318,857,831,964,643,13,23,29,11,11,10,242,310,750,859,1095,643,12,15,16,13,4,2,420,318,715,624,735,771,13,27,35,10,6,6,344,364,690,517,753,643,16,21,34,17,11,18,615,399,715,625,747,743,36,22,35,10,10,19,255,111,921,875,1018,766,4,23,7,5,11,2,380,214,767,788,938,640,3,22,13,11,7,8,296,198,1006,711,709,640,15,15,18,12,15,3,448,306,982,713,777,606,17,19,22,11,14,16,426,268,546,683,781,711,8,24,28,11,2,7,168,250,749,704,1005,665,5,10,23,10,1,0,224,250,993,981,1230,694,3,14,21,4,13,1,608,510,656,752,607,893,30,23,31,12,13,11,395,337,912,547,626,739,16,21,13,15,12,19,10 +346,320,997,630,619,769,29,13,2,7,10,12,413,517,678,579,660,728,24,28,31,14,14,10,353,243,841,636,1057,741,23,22,25,14,10,1,331,287,979,723,852,894,13,26,37,17,6,12,346,326,951,785,968,696,8,26,25,18,7,11,264,362,828,813,1099,688,7,20,12,12,10,1,404,414,797,582,739,730,18,32,31,17,10,7,366,480,778,475,755,700,21,26,30,10,13,15,547,509,741,547,751,786,35,13,31,17,18,16,157,157,999,843,1022,861,1,18,17,6,3,1,302,210,845,740,942,617,2,25,9,0,9,5,286,250,1084,643,713,705,20,6,12,1,9,0,466,396,1034,635,781,617,22,16,12,16,12,13,494,364,602,647,783,608,13,29,24,18,10,10,306,328,829,694,1007,714,10,19,19,11,9,3,190,232,1071,961,1234,767,2,13,11,9,5,2,560,602,708,690,611,840,35,14,27,19,17,8,363,415,974,479,630,830,13,30,11,10,14,16,10 +339,337,804,789,609,666,25,17,12,11,16,12,292,348,497,684,650,773,20,14,19,12,14,12,194,246,798,739,1047,672,17,26,35,14,4,3,330,292,804,886,842,777,17,28,35,9,8,2,351,269,766,928,958,699,12,24,35,10,9,9,151,193,647,928,1089,657,11,24,22,14,4,7,301,281,648,713,729,805,14,20,35,9,6,5,241,277,609,596,745,705,17,12,40,16,11,17,504,288,708,724,741,815,35,13,41,11,8,18,268,192,802,838,1012,728,3,18,5,12,9,1,345,135,648,855,932,602,2,11,19,18,9,7,287,265,887,764,703,596,16,24,24,19,15,2,347,261,867,812,771,592,18,18,24,10,16,15,341,177,525,784,773,803,9,13,34,8,4,8,111,147,652,737,997,685,6,25,29,15,3,7,239,255,888,1020,1224,654,2,17,23,11,11,4,501,411,699,859,601,941,31,14,37,7,13,10,356,280,789,622,620,587,15,26,15,14,10,18,10 +294,328,821,693,626,700,22,19,6,3,14,14,393,333,514,616,667,817,17,24,25,10,12,8,307,213,801,665,1064,710,18,26,29,16,0,1,381,227,819,788,859,839,20,22,41,11,12,6,386,268,783,838,975,751,15,14,29,12,13,11,262,262,664,850,1106,665,14,24,16,16,6,3,398,340,683,627,746,855,11,16,35,11,6,1,394,420,636,510,762,757,14,22,34,14,9,13,587,339,711,626,758,859,36,25,35,11,12,14,247,181,819,850,1029,776,6,22,11,4,13,3,354,278,665,777,949,610,5,19,13,10,7,3,240,246,904,704,720,634,13,26,18,11,13,2,432,306,884,714,788,602,15,16,18,10,12,11,424,318,534,696,790,839,6,17,28,12,0,12,236,294,669,697,1014,715,3,25,23,9,1,5,250,350,905,974,1241,682,5,25,17,3,15,4,592,540,714,765,618,1015,28,24,31,13,15,10,377,271,810,544,637,663,18,22,9,16,14,14,10 +379,257,916,685,610,705,24,13,7,11,9,12,464,428,593,614,655,678,19,28,24,18,11,14,352,212,874,667,1048,665,20,22,30,18,13,5,372,280,890,776,843,808,18,22,40,21,7,8,381,321,858,826,959,662,13,22,30,22,8,11,267,293,747,846,1090,632,12,20,17,16,9,3,441,317,712,617,730,734,13,28,36,21,11,7,375,355,685,504,750,622,16,28,35,14,10,19,600,384,708,610,742,724,38,15,36,21,17,20,222,126,920,850,1013,771,4,18,10,8,0,3,369,173,766,773,933,603,3,27,14,4,6,9,309,203,1005,694,704,641,15,12,19,5,10,4,501,297,985,698,772,575,17,16,19,20,11,17,491,245,555,686,778,668,8,29,29,22,13,8,249,207,746,693,1002,656,5,19,24,15,12,1,193,233,990,970,1225,701,3,15,18,13,2,2,589,479,649,745,602,860,30,14,32,23,14,12,420,304,911,530,621,706,16,28,10,12,13,20,10 +309,285,1011,633,604,745,29,12,1,9,9,12,388,476,686,580,645,700,24,29,32,16,13,10,306,206,873,653,1042,713,21,21,22,16,11,1,292,270,989,716,837,878,13,25,34,19,9,12,319,305,957,784,953,674,8,25,22,20,10,11,221,309,842,830,1084,666,7,19,9,14,11,1,375,377,787,589,724,716,18,29,32,19,13,7,323,437,778,492,740,672,21,27,27,12,12,15,514,462,773,552,736,764,35,14,28,19,19,16,166,138,1013,854,1007,833,1,19,18,6,2,1,287,171,859,757,927,595,2,26,6,2,8,5,269,229,1098,648,698,677,20,11,11,3,8,0,437,351,1052,640,766,595,22,15,11,18,11,13,441,315,616,644,768,600,13,30,21,20,11,10,237,279,843,709,992,690,10,18,16,13,10,3,189,205,1085,978,1219,743,2,12,10,11,4,2,515,555,694,687,596,824,35,15,24,21,16,8,366,378,994,480,615,814,13,31,12,10,15,16,10 +308,352,742,761,613,652,23,22,12,6,14,14,381,309,525,660,654,783,18,13,21,13,12,10,281,265,754,715,1051,666,15,27,35,15,0,1,411,231,768,856,846,777,19,19,37,12,12,0,410,256,734,904,962,695,14,9,35,13,13,9,280,264,593,908,1093,661,13,23,22,13,6,9,406,312,678,691,733,843,12,13,37,12,6,3,388,378,615,572,749,723,15,15,40,17,7,15,599,299,738,686,745,827,33,28,41,12,12,16,237,229,734,842,1016,714,5,11,7,7,13,1,346,296,580,833,936,634,4,18,19,13,7,5,274,276,819,740,707,604,14,31,22,14,13,0,448,288,799,774,775,606,16,23,22,11,12,13,404,290,523,762,777,837,7,12,34,13,0,10,232,272,608,721,1001,685,4,28,29,12,1,9,284,414,828,1002,1228,638,4,28,21,6,15,6,624,500,755,825,605,977,29,27,37,14,15,12,347,249,721,590,624,571,17,19,13,15,14,16,10 +315,281,873,623,597,680,27,13,5,4,9,11,396,458,548,564,628,731,22,30,26,15,13,11,290,194,811,637,1023,678,19,20,28,11,11,2,334,256,849,702,824,839,15,26,40,14,7,9,371,307,815,758,934,691,10,26,28,15,8,10,227,311,706,788,1065,615,9,18,15,11,11,0,389,355,661,553,705,745,16,26,34,14,11,4,349,417,636,472,721,669,19,26,33,17,12,16,560,440,667,556,733,781,37,15,34,14,19,17,204,114,875,810,988,772,1,22,12,7,2,0,327,183,721,727,908,528,0,25,12,7,8,6,283,219,960,640,679,614,18,16,17,8,8,1,453,333,936,644,747,538,20,18,17,13,11,14,431,295,518,612,749,705,11,25,27,15,11,9,207,263,707,675,973,659,8,17,22,8,10,2,229,213,949,950,1200,674,0,11,16,6,4,1,565,549,606,687,591,905,33,16,30,16,16,9,374,368,862,474,614,701,13,30,8,13,15,17,10 +237,229,626,912,628,642,8,25,17,4,13,9,238,192,611,813,679,857,13,16,14,13,11,11,156,400,662,846,1024,650,28,24,36,15,1,10,346,340,714,1003,803,669,16,24,30,8,13,1,387,327,686,1067,915,595,29,24,36,11,14,8,189,309,507,1049,1070,733,28,26,23,13,7,18,299,305,722,854,752,887,15,24,30,10,7,4,245,175,651,735,778,779,16,18,37,17,8,16,484,150,770,855,738,851,26,13,38,10,13,17,248,356,608,899,1019,620,20,8,0,5,14,4,289,327,460,982,937,796,19,15,20,11,8,10,291,265,693,879,730,696,1,28,25,12,12,7,319,149,675,943,772,732,5,16,29,11,11,14,297,219,601,923,804,931,10,21,35,9,1,9,133,241,572,804,1028,735,11,21,30,10,2,16,277,467,720,1079,1239,574,19,13,28,4,16,15,553,253,871,982,624,1013,14,26,38,10,16,11,268,312,589,743,589,495,14,18,20,15,15,17,10 +352,354,853,729,571,640,25,14,11,7,7,12,423,367,528,658,606,705,20,29,20,18,9,14,303,215,839,753,1003,628,17,21,26,8,11,5,365,267,831,802,798,797,17,21,36,11,13,8,398,240,797,862,914,679,12,19,26,12,12,11,232,242,688,892,1045,585,11,19,13,8,11,3,406,310,659,653,685,773,14,25,32,15,13,7,344,334,638,596,701,637,17,29,31,22,10,19,585,343,681,674,707,745,35,18,32,17,13,20,227,197,855,924,968,714,3,21,6,10,4,3,358,180,701,837,888,550,2,26,10,12,6,9,326,268,940,736,659,592,16,17,15,13,8,4,464,312,926,762,727,528,18,21,23,16,9,17,442,174,538,710,729,739,9,26,25,14,11,10,206,142,689,783,953,625,6,18,20,11,12,3,230,308,931,1068,1180,636,2,18,22,7,4,2,578,472,638,793,565,927,31,17,28,13,10,12,399,229,852,582,588,645,15,27,14,12,13,20,10 +221,155,805,623,606,689,20,17,2,7,11,11,308,414,528,606,645,988,19,22,33,14,9,11,228,320,755,625,1032,757,20,24,23,14,3,2,282,382,755,700,827,958,18,24,33,7,15,17,347,425,729,756,943,776,21,26,23,10,16,10,233,361,630,796,1074,726,20,20,10,12,9,0,321,343,577,559,722,1054,13,22,33,11,9,12,337,335,552,462,742,900,16,24,26,18,10,16,502,380,647,544,730,998,38,17,25,11,15,17,338,214,809,846,997,805,12,20,19,8,16,0,369,217,655,725,919,709,11,23,5,14,10,6,231,119,894,652,698,735,11,16,10,15,10,1,265,243,866,632,758,673,13,14,10,12,9,14,331,287,520,618,770,962,8,15,18,10,3,9,209,281,623,679,994,770,5,27,15,13,4,2,327,289,869,950,1215,659,11,15,9,7,18,1,497,459,682,679,598,1190,22,16,25,9,18,9,356,318,792,502,613,730,16,28,13,14,17,17,10 +339,307,997,603,631,765,26,20,6,9,8,11,432,572,674,580,672,672,21,35,37,16,12,11,328,286,859,629,1069,719,24,15,27,16,12,2,340,374,969,684,864,866,16,31,37,19,10,13,355,391,941,740,980,670,11,31,27,20,11,10,257,379,826,786,1111,678,10,19,14,14,10,0,415,435,771,545,751,730,15,29,37,19,14,8,363,473,762,468,767,658,18,19,30,12,11,16,552,482,735,528,765,740,38,20,29,19,18,17,204,196,1001,850,1034,841,2,25,23,6,1,0,323,197,847,721,954,619,1,18,9,2,7,6,249,253,1086,634,725,693,17,15,10,3,9,1,473,383,1046,616,793,607,19,17,12,18,10,14,475,341,584,600,795,594,10,22,22,20,12,9,249,321,825,687,1019,694,7,12,19,13,11,2,191,143,1069,954,1246,759,1,8,5,11,3,1,555,545,652,663,623,812,32,21,29,21,15,9,416,430,982,486,646,840,14,25,17,10,14,17,10 +304,242,927,626,564,674,25,17,0,7,10,10,399,433,604,617,603,815,20,34,31,14,8,12,287,267,861,650,996,694,15,14,21,14,4,3,343,331,869,697,791,895,17,22,31,11,8,16,384,360,847,759,907,695,12,24,21,12,9,9,222,280,752,799,1038,609,11,18,8,12,4,1,386,386,661,556,678,873,14,28,31,11,8,11,334,376,664,483,698,727,17,24,24,18,7,17,571,375,673,559,696,833,33,23,23,13,8,18,249,189,931,877,961,798,3,24,17,8,9,1,352,118,777,738,881,558,2,23,3,14,3,7,270,194,1016,667,652,642,16,16,12,15,9,2,402,294,990,647,720,552,18,18,12,12,8,15,422,248,564,611,726,787,9,27,16,12,4,8,176,214,745,694,950,665,6,13,13,13,5,1,242,208,991,971,1173,670,2,15,11,7,11,0,558,504,608,682,556,1011,31,22,23,13,11,10,397,293,912,507,577,757,15,24,11,14,10,18,10 +324,330,919,713,609,693,28,16,8,9,10,11,419,345,590,620,650,896,25,27,23,16,12,11,347,163,865,695,1047,733,24,23,29,16,14,2,281,197,913,798,842,866,8,23,39,19,6,7,320,246,881,866,958,770,9,17,29,20,7,10,252,254,756,880,1089,728,8,21,16,14,8,2,398,296,723,653,729,922,23,29,35,19,10,4,370,386,706,534,745,834,26,31,34,12,9,16,507,349,701,644,741,934,30,20,35,19,16,17,149,121,917,848,1012,765,6,15,9,6,1,0,302,218,763,805,932,675,7,30,13,2,7,6,306,218,1002,710,703,647,19,13,18,3,11,1,452,320,980,732,771,661,21,19,20,18,12,14,486,278,562,724,773,904,18,28,28,20,14,9,284,254,761,729,997,762,15,20,23,13,13,2,190,306,997,1004,1224,665,7,20,19,11,1,1,498,512,662,775,601,1088,34,19,31,21,13,9,395,287,898,554,620,632,12,25,11,10,12,17,10 +337,299,852,724,581,660,22,14,10,10,11,13,272,424,529,649,628,741,17,23,21,11,9,15,176,236,812,700,1011,630,14,23,29,15,3,6,348,324,824,805,806,775,20,23,37,10,15,9,367,323,796,857,922,641,15,23,29,11,16,12,143,301,683,877,1053,587,14,21,16,15,9,4,301,315,670,646,701,785,11,21,35,8,9,8,253,351,633,541,725,659,14,23,34,15,10,20,498,390,688,663,707,755,32,16,35,10,15,21,278,196,856,881,978,738,6,25,7,11,16,4,343,179,702,810,898,606,5,28,13,17,10,10,287,225,941,737,677,622,13,17,18,18,10,5,335,271,915,751,735,588,15,17,22,9,9,18,325,229,545,709,753,751,6,16,28,7,3,9,109,219,680,722,977,615,3,26,23,14,4,2,255,217,924,999,1194,654,5,16,21,10,18,3,515,461,683,790,575,929,28,15,31,8,18,13,358,348,841,579,590,681,18,27,13,15,17,21,10 +247,261,866,633,565,615,24,15,2,4,9,13,328,488,557,604,614,814,19,26,33,15,7,9,244,262,802,639,977,635,12,22,23,13,5,0,366,310,838,714,772,834,18,22,33,10,17,15,381,353,810,774,888,634,13,22,23,11,18,12,239,369,699,806,1019,552,12,20,10,11,11,2,331,395,686,571,687,886,13,20,33,12,11,10,361,435,651,484,713,726,16,24,26,19,12,14,522,450,692,554,679,812,28,15,25,12,17,15,306,162,870,844,956,747,6,26,19,7,18,2,317,205,716,737,874,565,3,25,5,11,12,4,255,209,955,658,665,631,15,16,10,12,8,1,381,355,917,642,707,529,17,16,10,13,7,12,343,313,609,634,739,796,8,19,18,11,5,11,205,281,694,699,963,604,5,21,15,10,6,4,341,269,938,972,1174,609,3,17,9,4,20,3,549,569,725,687,561,1020,30,14,25,12,20,9,368,332,839,498,556,706,16,26,13,13,15,15,10 +355,379,867,826,638,738,27,20,16,5,8,14,386,328,552,717,679,817,22,19,17,16,12,14,272,150,799,738,1076,712,21,31,39,8,12,5,344,222,881,919,871,791,15,29,31,7,2,4,363,221,845,947,987,711,10,19,39,8,3,11,205,241,714,927,1118,699,9,29,26,10,10,11,381,259,721,730,758,789,16,15,31,13,8,7,299,335,676,623,774,727,19,19,38,20,11,19,544,324,737,763,770,833,37,18,39,13,14,20,244,164,861,853,1041,774,1,17,1,8,1,3,369,211,707,860,961,622,0,14,23,10,7,9,313,277,946,807,732,650,18,23,28,11,9,4,429,329,918,851,800,628,20,13,28,14,10,17,417,221,532,799,802,801,11,14,38,12,12,8,151,207,723,704,1026,733,8,28,33,9,11,11,211,299,951,991,1253,712,0,22,27,5,3,8,537,479,710,898,630,899,33,17,39,11,15,14,386,296,846,665,651,685,13,21,19,12,12,20,10 diff --git a/lib/Files/ArffFiles.cc b/tests/lib/Files/ArffFiles.cc similarity index 89% rename from lib/Files/ArffFiles.cc rename to tests/lib/Files/ArffFiles.cc index 99f29bd..299b60c 100644 --- a/lib/Files/ArffFiles.cc +++ b/tests/lib/Files/ArffFiles.cc @@ -4,8 +4,6 @@ #include #include -ArffFiles::ArffFiles() = default; - std::vector ArffFiles::getLines() const { return lines; @@ -41,7 +39,7 @@ std::vector& ArffFiles::getY() return y; } -void ArffFiles::loadCommon(std::string fileName) +void ArffFiles::loadCommon(const std::string& fileName) { std::ifstream file(fileName); if (!file.is_open()) { @@ -52,11 +50,14 @@ void ArffFiles::loadCommon(std::string fileName) std::string attribute; std::string type; std::string type_w; + // Read file while (getline(file, line)) { if (line.empty() || line[0] == '%' || line == "\r" || line == " ") { + // Skip comments and empty lines continue; } if (line.find("@attribute") != std::string::npos || line.find("@ATTRIBUTE") != std::string::npos) { + // Read attributes std::stringstream ss(line); ss >> keyword >> attribute; type = ""; @@ -68,6 +69,7 @@ void ArffFiles::loadCommon(std::string fileName) if (line[0] == '@') { continue; } + // Read data lines.push_back(line); } file.close(); @@ -118,20 +120,21 @@ void ArffFiles::generateDataset(int labelIndex) X = std::vector>(attributes.size(), std::vector(lines.size())); auto yy = std::vector(lines.size(), ""); auto removeLines = std::vector(); // Lines with missing values - for (size_t i = 0; i < lines.size(); i++) { - std::stringstream ss(lines[i]); + size_t numLine = 0; + for (numLine = 0; numLine < lines.size(); numLine++) { + std::stringstream ss(lines[numLine]); std::string value; int pos = 0; int xIndex = 0; while (getline(ss, value, ',')) { if (pos++ == labelIndex) { - yy[i] = value; + yy[numLine] = value; } else { if (value == "?") { - X[xIndex++][i] = -1; - removeLines.push_back(i); + X[xIndex++][numLine] = -1; + removeLines.push_back(numLine); } else - X[xIndex++][i] = stof(value); + X[xIndex++][numLine] = stof(value); } } } diff --git a/lib/Files/ArffFiles.h b/tests/lib/Files/ArffFiles.h similarity index 90% rename from lib/Files/ArffFiles.h rename to tests/lib/Files/ArffFiles.h index 25e5a8c..4602a05 100644 --- a/lib/Files/ArffFiles.h +++ b/tests/lib/Files/ArffFiles.h @@ -5,17 +5,8 @@ #include class ArffFiles { -private: - std::vector lines; - std::vector> attributes; - std::string className; - std::string classType; - std::vector> X; - std::vector y; - void generateDataset(int); - void loadCommon(std::string); public: - ArffFiles(); + ArffFiles() = default; void load(const std::string&, bool = true); void load(const std::string&, const std::string&); std::vector getLines() const; @@ -27,6 +18,16 @@ public: std::vector& getY(); std::vector> getAttributes() const; static std::vector factorize(const std::vector& labels_t); +protected: + std::vector lines; + std::vector> attributes; + std::string className; + std::string classType; + std::vector> X; + std::vector y; + int maxLines = 0; + void generateDataset(int); + void loadCommon(const std::string&); }; #endif \ No newline at end of file diff --git a/lib/Files/CMakeLists.txt b/tests/lib/Files/CMakeLists.txt similarity index 100% rename from lib/Files/CMakeLists.txt rename to tests/lib/Files/CMakeLists.txt diff --git a/tests/lib/catch2/.bazelrc b/tests/lib/catch2/.bazelrc new file mode 100644 index 0000000..9cb0aa1 --- /dev/null +++ b/tests/lib/catch2/.bazelrc @@ -0,0 +1,11 @@ +build --enable_platform_specific_config + +build:gcc9 --cxxopt=-std=c++2a +build:gcc11 --cxxopt=-std=c++2a +build:clang13 --cxxopt=-std=c++17 +build:vs2019 --cxxopt=/std:c++17 +build:vs2022 --cxxopt=/std:c++17 + +build:windows --config=vs2022 +build:linux --config=gcc11 +build:macos --cxxopt=-std=c++2b diff --git a/tests/lib/catch2/.clang-format b/tests/lib/catch2/.clang-format new file mode 100644 index 0000000..9efb854 --- /dev/null +++ b/tests/lib/catch2/.clang-format @@ -0,0 +1,45 @@ +--- +Language: Cpp +Standard: c++14 + +# Note that we cannot use IncludeIsMainRegex functionality, because it +# does not support includes in angle brackets (<>) +SortIncludes: true +IncludeBlocks: Regroup +IncludeCategories: + - Regex: + Priority: 1 + - Regex: <.*/.*\.hpp> + Priority: 2 + - Regex: <.*> + Priority: 3 + +AllowShortBlocksOnASingleLine: Always +AllowShortEnumsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: WithoutElse +AllowShortLambdasOnASingleLine: Inline + +AccessModifierOffset: "-4" +AlignEscapedNewlines: Left +AllowAllConstructorInitializersOnNextLine: "true" +BinPackArguments: "false" +BinPackParameters: "false" +BreakConstructorInitializers: AfterColon +ConstructorInitializerAllOnOneLineOrOnePerLine: "true" +DerivePointerAlignment: "false" +FixNamespaceComments: "true" +IndentCaseLabels: "false" +IndentPPDirectives: AfterHash +IndentWidth: "4" +NamespaceIndentation: All +PointerAlignment: Left +SpaceBeforeCtorInitializerColon: "false" +SpaceInEmptyParentheses: "false" +SpacesInParentheses: "true" +TabWidth: "4" +UseTab: Never +AlwaysBreakTemplateDeclarations: Yes +SpaceAfterTemplateKeyword: true +SortUsingDeclarations: true +ReflowComments: true diff --git a/tests/lib/catch2/.clang-tidy b/tests/lib/catch2/.clang-tidy new file mode 100644 index 0000000..539010d --- /dev/null +++ b/tests/lib/catch2/.clang-tidy @@ -0,0 +1,81 @@ +--- +# Note: Alas, `Checks` is a string, not an array. +# Comments in the block string are not parsed and are passed in the value. +# They must thus be delimited by ',' from either side - then they are +# harmless. It's terrible, but it works. +Checks: >- + clang-diagnostic-*, + clang-analyzer-*, + -clang-analyzer-optin.core.EnumCastOutOfRange, + + bugprone-*, + -bugprone-unchecked-optional-access, + ,# This is ridiculous, as it triggers on constants, + -bugprone-implicit-widening-of-multiplication-result, + -bugprone-easily-swappable-parameters, + ,# Is not really useful, has false positives, triggers for no-noexcept move constructors ..., + -bugprone-exception-escape, + -bugprone-narrowing-conversions, + -bugprone-chained-comparison,# RIP decomposers, + + modernize-*, + -modernize-avoid-c-arrays, + -modernize-use-auto, + -modernize-use-emplace, + -modernize-use-nullptr,# it went crazy with three-way comparison operators, + -modernize-use-trailing-return-type, + -modernize-return-braced-init-list, + -modernize-concat-nested-namespaces, + -modernize-use-nodiscard, + -modernize-use-default-member-init, + -modernize-type-traits,# we need to support C++14, + -modernize-deprecated-headers, + ,# There's a lot of these and most of them are probably not useful, + -modernize-pass-by-value, + + performance-*, + -performance-enum-size, + + portability-*, + + readability-*, + -readability-braces-around-statements, + -readability-container-size-empty, + -readability-convert-member-functions-to-static, + -readability-else-after-return, + -readability-function-cognitive-complexity, + -readability-function-size, + -readability-identifier-length, + -readability-implicit-bool-conversion, + -readability-isolate-declaration, + -readability-magic-numbers, + -readability-named-parameter, + -readability-qualified-auto, + -readability-redundant-access-specifiers, + -readability-simplify-boolean-expr, + -readability-static-definition-in-anonymous-namespace, + -readability-uppercase-literal-suffix, + -readability-use-anyofallof, + -readability-avoid-return-with-void-value, + + ,# time hogs, + -bugprone-throw-keyword-missing, + -modernize-replace-auto-ptr, + -readability-identifier-naming, + + ,# We cannot use this until clang-tidy supports custom unique_ptr, + -bugprone-use-after-move, + ,# Doesn't recognize unevaluated context in CATCH_MOVE and CATCH_FORWARD, + -bugprone-macro-repeated-side-effects, +WarningsAsErrors: >- + clang-analyzer-core.*, + clang-analyzer-cplusplus.*, + clang-analyzer-security.*, + clang-analyzer-unix.*, + performance-move-const-arg, + performance-unnecessary-value-param, + readability-duplicate-include, +HeaderFilterRegex: '.*\.(c|cxx|cpp)$' +FormatStyle: none +CheckOptions: {} +... diff --git a/tests/lib/catch2/.conan/build.py b/tests/lib/catch2/.conan/build.py new file mode 100644 index 0000000..e163d5f --- /dev/null +++ b/tests/lib/catch2/.conan/build.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import re +from cpt.packager import ConanMultiPackager +from cpt.ci_manager import CIManager +from cpt.printer import Printer + + +class BuilderSettings(object): + @property + def username(self): + """ Set catchorg as package's owner + """ + return os.getenv("CONAN_USERNAME", "catchorg") + + @property + def login_username(self): + """ Set Bintray login username + """ + return os.getenv("CONAN_LOGIN_USERNAME", "horenmar") + + @property + def upload(self): + """ Set Catch2 repository to be used on upload. + The upload server address could be customized by env var + CONAN_UPLOAD. If not defined, the method will check the branch name. + Only devel or CONAN_STABLE_BRANCH_PATTERN will be accepted. + The devel branch will be pushed to testing channel, because it does + not match the stable pattern. Otherwise it will upload to stable + channel. + """ + return os.getenv("CONAN_UPLOAD", "https://api.bintray.com/conan/catchorg/catch2") + + @property + def upload_only_when_stable(self): + """ Force to upload when running over tag branch + """ + return os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", "True").lower() in ["true", "1", "yes"] + + @property + def stable_branch_pattern(self): + """ Only upload the package the branch name is like a tag + """ + return os.getenv("CONAN_STABLE_BRANCH_PATTERN", r"v\d+\.\d+\.\d+") + + @property + def reference(self): + """ Read project version from branch create Conan reference + """ + return os.getenv("CONAN_REFERENCE", "catch2/{}".format(self._version)) + + @property + def channel(self): + """ Default Conan package channel when not stable + """ + return os.getenv("CONAN_CHANNEL", "testing") + + @property + def _version(self): + """ Get version name from cmake file + """ + pattern = re.compile(r"project\(Catch2 LANGUAGES CXX VERSION (\d+\.\d+\.\d+)\)") + version = "latest" + with open("CMakeLists.txt") as file: + for line in file: + result = pattern.search(line) + if result: + version = result.group(1) + return version + + @property + def _branch(self): + """ Get branch name from CI manager + """ + printer = Printer(None) + ci_manager = CIManager(printer) + return ci_manager.get_branch() + + +if __name__ == "__main__": + settings = BuilderSettings() + builder = ConanMultiPackager( + reference=settings.reference, + channel=settings.channel, + upload=settings.upload, + upload_only_when_stable=False, + stable_branch_pattern=settings.stable_branch_pattern, + login_username=settings.login_username, + username=settings.username, + test_folder=os.path.join(".conan", "test_package")) + builder.add() + builder.run() diff --git a/tests/lib/catch2/.conan/test_package/CMakeLists.txt b/tests/lib/catch2/.conan/test_package/CMakeLists.txt new file mode 100644 index 0000000..00a6af2 --- /dev/null +++ b/tests/lib/catch2/.conan/test_package/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.15) +project(PackageTest CXX) + +find_package(Catch2 CONFIG REQUIRED) + +add_executable(test_package test_package.cpp) +target_link_libraries(test_package Catch2::Catch2WithMain) +target_compile_features(test_package PRIVATE cxx_std_14) diff --git a/tests/lib/catch2/.conan/test_package/conanfile.py b/tests/lib/catch2/.conan/test_package/conanfile.py new file mode 100644 index 0000000..dc03876 --- /dev/null +++ b/tests/lib/catch2/.conan/test_package/conanfile.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from conan import ConanFile +from conan.tools.cmake import CMake, cmake_layout +from conan.tools.build import can_run +from conan.tools.files import save, load +import os + + +class TestPackageConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv" + test_type = "explicit" + + def requirements(self): + self.requires(self.tested_reference_str) + + def layout(self): + cmake_layout(self) + + def generate(self): + save(self, os.path.join(self.build_folder, "package_folder"), + self.dependencies[self.tested_reference_str].package_folder) + save(self, os.path.join(self.build_folder, "license"), + self.dependencies[self.tested_reference_str].license) + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if can_run(self): + cmd = os.path.join(self.cpp.build.bindir, "test_package") + self.run(cmd, env="conanrun") + + package_folder = load(self, os.path.join(self.build_folder, "package_folder")) + license = load(self, os.path.join(self.build_folder, "license")) + assert os.path.isfile(os.path.join(package_folder, "licenses", "LICENSE.txt")) + assert license == 'BSL-1.0' diff --git a/tests/lib/catch2/.conan/test_package/test_package.cpp b/tests/lib/catch2/.conan/test_package/test_package.cpp new file mode 100644 index 0000000..3c08090 --- /dev/null +++ b/tests/lib/catch2/.conan/test_package/test_package.cpp @@ -0,0 +1,13 @@ +#include + +int Factorial( int number ) { + return number <= 1 ? 1 : Factorial( number - 1 ) * number; +} + +TEST_CASE( "Factorial Tests", "[single-file]" ) { + REQUIRE( Factorial(0) == 1 ); + REQUIRE( Factorial(1) == 1 ); + REQUIRE( Factorial(2) == 2 ); + REQUIRE( Factorial(3) == 6 ); + REQUIRE( Factorial(10) == 3628800 ); +} \ No newline at end of file diff --git a/tests/lib/catch2/.gitattributes b/tests/lib/catch2/.gitattributes new file mode 100644 index 0000000..23f98ff --- /dev/null +++ b/tests/lib/catch2/.gitattributes @@ -0,0 +1,22 @@ +# This sets the default behaviour, overriding core.autocrlf +* text=auto + +# All source files should have unix line-endings in the repository, +# but convert to native line-endings on checkout +*.cpp text +*.h text +*.hpp text + +# Windows specific files should retain windows line-endings +*.sln text eol=crlf + +# Keep executable scripts with LFs so they can be run after being +# checked out on Windows +*.py text eol=lf + + +# Keep the single include header with LFs to make sure it is uploaded, +# hashed etc with LF +single_include/**/*.hpp eol=lf +# Also keep the LICENCE file with LFs for the same reason +LICENCE.txt eol=lf diff --git a/tests/lib/catch2/.github/FUNDING.yml b/tests/lib/catch2/.github/FUNDING.yml new file mode 100644 index 0000000..9122aa8 --- /dev/null +++ b/tests/lib/catch2/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: "horenmar" +custom: "https://www.paypal.me/horenmar" diff --git a/tests/lib/catch2/.github/ISSUE_TEMPLATE/bug_report.md b/tests/lib/catch2/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dbeff11 --- /dev/null +++ b/tests/lib/catch2/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,29 @@ +--- +name: Bug report +about: Create an issue that documents a bug +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Reproduction steps** +Steps to reproduce the bug. + + + +**Platform information:** + + - OS: **Windows NT** + - Compiler+version: **GCC v2.9.5** + - Catch version: **v1.2.3** + + +**Additional context** +Add any other context about the problem here. diff --git a/tests/lib/catch2/.github/ISSUE_TEMPLATE/feature_request.md b/tests/lib/catch2/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..be9b9ee --- /dev/null +++ b/tests/lib/catch2/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,14 @@ +--- +name: Feature request +about: Create an issue that requests a feature or other improvement +title: '' +labels: '' +assignees: '' + +--- + +**Description** +Describe the feature/change you request and why do you want it. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/tests/lib/catch2/.github/pull_request_template.md b/tests/lib/catch2/.github/pull_request_template.md new file mode 100644 index 0000000..ea2b7bb --- /dev/null +++ b/tests/lib/catch2/.github/pull_request_template.md @@ -0,0 +1,28 @@ + + + +## Description + + +## GitHub Issues + diff --git a/tests/lib/catch2/.github/workflows/linux-bazel-builds.yml b/tests/lib/catch2/.github/workflows/linux-bazel-builds.yml new file mode 100644 index 0000000..dc826ac --- /dev/null +++ b/tests/lib/catch2/.github/workflows/linux-bazel-builds.yml @@ -0,0 +1,24 @@ +name: Bazel build + +on: [push, pull_request] + +jobs: + build_and_test_ubuntu: + name: Linux Ubuntu 22.04 Bazel build + runs-on: ubuntu-22.04 + strategy: + matrix: + compilation_mode: [fastbuild, dbg, opt] + + steps: + - uses: actions/checkout@v4 + + - name: Mount bazel cache + uses: actions/cache@v3 + with: + path: "/home/runner/.cache/bazel" + key: bazel-ubuntu22-gcc11 + + - name: Build Catch2 + run: | + bazelisk build --compilation_mode=${{matrix.compilation_mode}} //... diff --git a/tests/lib/catch2/.github/workflows/linux-meson-builds.yml b/tests/lib/catch2/.github/workflows/linux-meson-builds.yml new file mode 100644 index 0000000..4a6cfd5 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/linux-meson-builds.yml @@ -0,0 +1,44 @@ +name: Linux builds (meson) + +on: [push, pull_request] + +jobs: + build: + name: meson ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}} + runs-on: ubuntu-22.04 + strategy: + matrix: + cxx: + - g++-11 + - clang++-11 + build_type: [debug, release] + std: [14, 17] + include: + - cxx: clang++-11 + other_pkgs: clang-11 + + steps: + - uses: actions/checkout@v4 + + - name: Prepare environment + run: | + sudo apt-get update + sudo apt-get install -y meson ninja-build ${{matrix.other_pkgs}} + + - name: Configure build + env: + CXX: ${{matrix.cxx}} + CXXFLAGS: -std=c++${{matrix.std}} ${{matrix.cxxflags}} + # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}. + # This is important + run: | + meson -Dbuildtype=${{matrix.build_type}} ${{runner.workspace}}/meson-build + + - name: Build tests + lib + working-directory: ${{runner.workspace}}/meson-build + run: ninja + + - name: Run tests + working-directory: ${{runner.workspace}}/meson-build + run: | + meson test --verbose diff --git a/tests/lib/catch2/.github/workflows/linux-other-builds.yml b/tests/lib/catch2/.github/workflows/linux-other-builds.yml new file mode 100644 index 0000000..6993c81 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/linux-other-builds.yml @@ -0,0 +1,154 @@ +# The builds in this file are more complex (e.g. they need custom CMake +# configuration) and thus are unsuitable to the simple build matrix +# approach used in simple-builds +name: Linux builds (complex) + +on: [push, pull_request] + +jobs: + build: + name: ${{matrix.build_description}}, ${{matrix.cxx}}, C++${{matrix.std}} ${{matrix.build_type}} + runs-on: ubuntu-20.04 + strategy: + matrix: + # We add builds one by one in this case, because there are no + # dimensions that are shared across the builds + include: + + # Single surrogate header build + - cxx: clang++-10 + build_description: Surrogates build + build_type: Debug + std: 14 + other_pkgs: clang-10 + cmake_configurations: -DCATCH_BUILD_SURROGATES=ON + + # Extras and examples with gcc-7 + - cxx: g++-7 + build_description: Extras + Examples + build_type: Debug + std: 14 + other_pkgs: g++-7 + cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON + - cxx: g++-7 + build_description: Extras + Examples + build_type: Release + std: 14 + other_pkgs: g++-7 + cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON + + # Extras and examples with Clang-10 + - cxx: clang++-10 + build_description: Extras + Examples + build_type: Debug + std: 17 + other_pkgs: clang-10 + cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON + - cxx: clang++-10 + build_description: Extras + Examples + build_type: Release + std: 17 + other_pkgs: clang-10 + cmake_configurations: -DCATCH_BUILD_EXTRA_TESTS=ON -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON + + # Configure tests with Clang-10 + - cxx: clang++-10 + build_description: CMake configuration tests + build_type: Debug + std: 14 + other_pkgs: clang-10 + cmake_configurations: -DCATCH_ENABLE_CONFIGURE_TESTS=ON + + # Valgrind test Clang-10 + - cxx: clang++-10 + build_description: Valgrind tests + build_type: Debug + std: 14 + other_pkgs: clang-10 valgrind + cmake_configurations: -DMEMORYCHECK_COMMAND=`which valgrind` -DMEMORYCHECK_COMMAND_OPTIONS="-q --track-origins=yes --leak-check=full --num-callers=50 --show-leak-kinds=definite --error-exitcode=1" + other_ctest_args: -T memcheck -LE uses-python + + + steps: + - uses: actions/checkout@v4 + + - name: Prepare environment + run: | + sudo apt-get update + sudo apt-get install -y ninja-build ${{matrix.other_pkgs}} + + - name: Configure build + working-directory: ${{runner.workspace}} + env: + CXX: ${{matrix.cxx}} + CXXFLAGS: ${{matrix.cxxflags}} + # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}. + # This is important + run: | + cmake -Bbuild -H$GITHUB_WORKSPACE \ + -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ + -DCMAKE_CXX_STANDARD=${{matrix.std}} \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_CXX_EXTENSIONS=OFF \ + -DCATCH_DEVELOPMENT_BUILD=ON \ + ${{matrix.cmake_configurations}} \ + -G Ninja + + - name: Build tests + lib + working-directory: ${{runner.workspace}}/build + run: ninja + + - name: Run tests + env: + CTEST_OUTPUT_ON_FAILURE: 1 + working-directory: ${{runner.workspace}}/build + run: ctest -C ${{matrix.build_type}} -j `nproc` ${{matrix.other_ctest_args}} + clang-tidy: + name: clang-tidy ${{matrix.version}}, ${{matrix.build_description}}, C++${{matrix.std}} ${{matrix.build_type}} + runs-on: ubuntu-22.04 + strategy: + matrix: + include: + - version: "15" + build_description: all + build_type: Debug + std: 17 + other_pkgs: '' + cmake_configurations: -DCATCH_BUILD_EXAMPLES=ON -DCATCH_ENABLE_CMAKE_HELPER_TESTS=ON + steps: + - uses: actions/checkout@v4 + + - name: Prepare environment + run: | + sudo apt-get update + sudo apt-get install -y ninja-build clang-${{matrix.version}} clang-tidy-${{matrix.version}} ${{matrix.other_pkgs}} + + - name: Configure build + working-directory: ${{runner.workspace}} + env: + CXX: clang++-${{matrix.version}} + CXXFLAGS: ${{matrix.cxxflags}} + # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}. + # This is important + run: | + clangtidy="clang-tidy-${{matrix.version}};-use-color" + # Use a dummy compiler/linker/ar/ranlib to effectively disable the + # compilation and only run clang-tidy. + cmake -Bbuild -H$GITHUB_WORKSPACE \ + -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ + -DCMAKE_CXX_STANDARD=${{matrix.std}} \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_CXX_EXTENSIONS=OFF \ + -DCATCH_DEVELOPMENT_BUILD=ON \ + -DCMAKE_CXX_CLANG_TIDY="$clangtidy" \ + -DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/true \ + -DCMAKE_AR=/usr/bin/true \ + -DCMAKE_CXX_COMPILER_AR=/usr/bin/true \ + -DCMAKE_RANLIB=/usr/bin/true \ + -DCMAKE_CXX_LINK_EXECUTABLE=/usr/bin/true \ + ${{matrix.cmake_configurations}} \ + -G Ninja + + - name: Run clang-tidy + working-directory: ${{runner.workspace}}/build + run: ninja diff --git a/tests/lib/catch2/.github/workflows/linux-simple-builds.yml b/tests/lib/catch2/.github/workflows/linux-simple-builds.yml new file mode 100644 index 0000000..4cca316 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/linux-simple-builds.yml @@ -0,0 +1,123 @@ +name: Linux builds (basic) + +on: [push, pull_request] + +jobs: + build: + name: ${{matrix.cxx}}, C++${{matrix.std}}, ${{matrix.build_type}} + runs-on: ubuntu-20.04 + strategy: + matrix: + cxx: + - g++-5 + - g++-6 + - g++-7 + - g++-8 + - g++-9 + - g++-10 + - clang++-6.0 + - clang++-7 + - clang++-8 + - clang++-9 + - clang++-10 + build_type: [Debug, Release] + std: [14] + include: + - cxx: g++-5 + other_pkgs: g++-5 + - cxx: g++-6 + other_pkgs: g++-6 + - cxx: g++-7 + other_pkgs: g++-7 + - cxx: g++-8 + other_pkgs: g++-8 + - cxx: g++-9 + other_pkgs: g++-9 + - cxx: g++-10 + other_pkgs: g++-10 + - cxx: clang++-6.0 + other_pkgs: clang-6.0 + - cxx: clang++-7 + other_pkgs: clang-7 + - cxx: clang++-8 + other_pkgs: clang-8 + - cxx: clang++-9 + other_pkgs: clang-9 + - cxx: clang++-10 + other_pkgs: clang-10 + # Clang 6 + C++17 + # does not work with the default libstdc++ version thanks + # to a disagreement on variant implementation. + # - cxx: clang++-6.0 + # build_type: Debug + # std: 17 + # other_pkgs: clang-6.0 + # - cxx: clang++-6.0 + # build_type: Release + # std: 17 + # other_pkgs: clang-6.0 + # Clang 10 + C++17 + - cxx: clang++-10 + build_type: Debug + std: 17 + other_pkgs: clang-10 + - cxx: clang++-10 + build_type: Release + std: 17 + other_pkgs: clang-10 + - cxx: clang++-10 + build_type: Debug + std: 20 + other_pkgs: clang-10 + - cxx: clang++-10 + build_type: Release + std: 20 + other_pkgs: clang-10 + - cxx: g++-10 + build_type: Debug + std: 20 + other_pkgs: g++-10 + - cxx: g++-10 + build_type: Release + std: 20 + other_pkgs: g++-10 + + steps: + - uses: actions/checkout@v4 + + - name: Add repositories for older GCC + run: | + sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic main' + sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic universe' + if: ${{ matrix.cxx == 'g++-5' || matrix.cxx == 'g++-6' }} + + - name: Prepare environment + run: | + sudo apt-get update + sudo apt-get install -y ninja-build ${{matrix.other_pkgs}} + + - name: Configure build + working-directory: ${{runner.workspace}} + env: + CXX: ${{matrix.cxx}} + CXXFLAGS: ${{matrix.cxxflags}} + # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}. + # This is important + run: | + cmake -Bbuild -H$GITHUB_WORKSPACE \ + -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ + -DCMAKE_CXX_STANDARD=${{matrix.std}} \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_CXX_EXTENSIONS=OFF \ + -DCATCH_DEVELOPMENT_BUILD=ON \ + -G Ninja + + - name: Build tests + lib + working-directory: ${{runner.workspace}}/build + run: ninja + + - name: Run tests + env: + CTEST_OUTPUT_ON_FAILURE: 1 + working-directory: ${{runner.workspace}}/build + run: ctest -C ${{matrix.build_type}} -j `nproc` diff --git a/tests/lib/catch2/.github/workflows/mac-builds.yml b/tests/lib/catch2/.github/workflows/mac-builds.yml new file mode 100644 index 0000000..259d8b3 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/mac-builds.yml @@ -0,0 +1,51 @@ +name: Mac builds + +on: [push, pull_request] + +jobs: + build: + # macos-12 updated to a toolchain that crashes when linking the + # test binary. This seems to be a known bug in that version, + # and will eventually get fixed in an update. After that, we can go + # back to newer macos images. + runs-on: macos-11 + strategy: + matrix: + cxx: + - g++-11 + - clang++ + build_type: [Debug, Release] + std: [14, 17] + include: + - build_type: Debug + examples: ON + extra_tests: ON + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + working-directory: ${{runner.workspace}} + env: + CXX: ${{matrix.cxx}} + CXXFLAGS: ${{matrix.cxxflags}} + # Note: $GITHUB_WORKSPACE is distinct from ${{runner.workspace}}. + # This is important + run: | + cmake -Bbuild -H$GITHUB_WORKSPACE \ + -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ + -DCMAKE_CXX_STANDARD=${{matrix.std}} \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCATCH_DEVELOPMENT_BUILD=ON \ + -DCATCH_BUILD_EXAMPLES=${{matrix.examples}} \ + -DCATCH_BUILD_EXTRA_TESTS=${{matrix.examples}} + + - name: Build tests + lib + working-directory: ${{runner.workspace}}/build + run: make -j `sysctl -n hw.ncpu` + + - name: Run tests + env: + CTEST_OUTPUT_ON_FAILURE: 1 + working-directory: ${{runner.workspace}}/build + run: ctest -C ${{matrix.build_type}} -j `sysctl -n hw.ncpu` diff --git a/tests/lib/catch2/.github/workflows/package-manager-builds.yaml b/tests/lib/catch2/.github/workflows/package-manager-builds.yaml new file mode 100644 index 0000000..6d90d14 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/package-manager-builds.yaml @@ -0,0 +1,31 @@ +name: Package Manager Builds + +on: [push, pull_request] + +jobs: + conan_builds: + name: Conan ${{matrix.conan_version}} + runs-on: ubuntu-20.04 + strategy: + matrix: + conan_version: + - '1.63' + - '2.1' + + include: + # Conan 1 has default profiles installed + - conan_version: '1.63' + profile_generate: 'false' + + steps: + - uses: actions/checkout@v4 + + - name: Install conan + run: pip install conan==${{matrix.conan_version}} + + - name: Setup conan profiles + if: matrix.profile_generate != 'false' + run: conan profile detect + + - name: Run conan package create + run: conan create . -tf .conan/test_package diff --git a/tests/lib/catch2/.github/workflows/validate-header-guards.yml b/tests/lib/catch2/.github/workflows/validate-header-guards.yml new file mode 100644 index 0000000..fa9d157 --- /dev/null +++ b/tests/lib/catch2/.github/workflows/validate-header-guards.yml @@ -0,0 +1,36 @@ +name: Check header guards + +on: [push, pull_request] + +jobs: + build: + # Set the type of machine to run on + runs-on: ubuntu-20.04 + steps: + + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Setup Dependencies + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Install checkguard + run: pip install guardonce + + - name: Check that include guards are properly named + run: | + wrong_files=$(checkguard -r src/catch2/ -p "name | append _INCLUDED | upper") + if [[ $wrong_files ]]; then + echo "Files with wrong header guard:" + echo $wrong_files + exit 1 + fi + + - name: Check that there are no duplicated filenames + run: | + ./tools/scripts/checkDuplicateFilenames.py + + - name: Check that all source files have the correct license header + run: | + ./tools/scripts/checkLicense.py diff --git a/tests/lib/catch2/.github/workflows/windows-simple-builds.yml b/tests/lib/catch2/.github/workflows/windows-simple-builds.yml new file mode 100644 index 0000000..5fb7b8f --- /dev/null +++ b/tests/lib/catch2/.github/workflows/windows-simple-builds.yml @@ -0,0 +1,37 @@ +name: Windows builds (basic) + +on: [push, pull_request] + +jobs: + build: + name: ${{matrix.os}}, ${{matrix.std}}, ${{matrix.build_type}}, ${{matrix.platform}} + runs-on: ${{matrix.os}} + strategy: + matrix: + os: [windows-2019, windows-2022] + platform: [Win32, x64] + build_type: [Debug, Release] + std: [14, 17] + steps: + - uses: actions/checkout@v4 + + - name: Configure build + working-directory: ${{runner.workspace}} + run: | + cmake -S $Env:GITHUB_WORKSPACE ` + -B ${{runner.workspace}}/build ` + -DCMAKE_CXX_STANDARD=${{matrix.std}} ` + -A ${{matrix.platform}} ` + --preset all-tests + + - name: Build tests + working-directory: ${{runner.workspace}} + run: cmake --build build --config ${{matrix.build_type}} --parallel %NUMBER_OF_PROCESSORS% + shell: cmd + + - name: Run tests + working-directory: ${{runner.workspace}}/build + env: + CTEST_OUTPUT_ON_FAILURE: 1 + run: ctest -C ${{matrix.build_type}} -j %NUMBER_OF_PROCESSORS% + shell: cmd diff --git a/tests/lib/catch2/.gitignore b/tests/lib/catch2/.gitignore new file mode 100644 index 0000000..4ed76b0 --- /dev/null +++ b/tests/lib/catch2/.gitignore @@ -0,0 +1,38 @@ +*.build +!meson.build +*.pbxuser +*.mode1v3 +*.ncb +*.suo +Debug +Release +*.user +*.xcuserstate +.DS_Store +xcuserdata +CatchSelfTest.xcscheme +Breakpoints.xcbkptlist +UpgradeLog.XML +Resources/DWARF +projects/Generated +*.pyc +DerivedData +*.xccheckout +Build +.idea +.vs +.vscode +cmake-build-* +benchmark-dir +.conan/test_package/build +.conan/test_package/CMakeUserPresets.json +bazel-* +build-fuzzers +debug-build +.vscode +msvc-sln* +# Currently we use Doxygen for dep graphs and the full docs are only slowly +# being filled in, so we definitely do not want git to deal with the docs. +docs/doxygen +*.cache +compile_commands.json diff --git a/tests/lib/catch2/BUILD.bazel b/tests/lib/catch2/BUILD.bazel new file mode 100644 index 0000000..c51bf57 --- /dev/null +++ b/tests/lib/catch2/BUILD.bazel @@ -0,0 +1,95 @@ +load("@bazel_skylib//rules:expand_template.bzl", "expand_template") + +expand_template( + name = "catch_user_config", + out = "catch2/catch_user_config.hpp", + substitutions = { + "@CATCH_CONFIG_CONSOLE_WIDTH@": "80", + "@CATCH_CONFIG_DEFAULT_REPORTER@": "console", + "#cmakedefine CATCH_CONFIG_ANDROID_LOGWRITE": "", + "#cmakedefine CATCH_CONFIG_BAZEL_SUPPORT": "#define CATCH_CONFIG_BAZEL_SUPPORT", + "#cmakedefine CATCH_CONFIG_COLOUR_WIN32": "", + "#cmakedefine CATCH_CONFIG_COUNTER": "", + "#cmakedefine CATCH_CONFIG_CPP11_TO_STRING": "", + "#cmakedefine CATCH_CONFIG_CPP17_BYTE": "", + "#cmakedefine CATCH_CONFIG_CPP17_OPTIONAL": "", + "#cmakedefine CATCH_CONFIG_CPP17_STRING_VIEW": "", + "#cmakedefine CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS": "", + "#cmakedefine CATCH_CONFIG_CPP17_VARIANT": "", + "#cmakedefine CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER": "", + "#cmakedefine CATCH_CONFIG_DISABLE_EXCEPTIONS": "", + "#cmakedefine CATCH_CONFIG_DISABLE_STRINGIFICATION": "", + "#cmakedefine CATCH_CONFIG_DISABLE": "", + "#cmakedefine CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS": "", + "#cmakedefine CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER": "", + "#cmakedefine CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER": "", + "#cmakedefine CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER": "", + "#cmakedefine CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER": "", + "#cmakedefine CATCH_CONFIG_EXPERIMENTAL_REDIRECT": "", + "#cmakedefine CATCH_CONFIG_FALLBACK_STRINGIFIER @CATCH_CONFIG_FALLBACK_STRINGIFIER@": "", + "#cmakedefine CATCH_CONFIG_FAST_COMPILE": "", + "#cmakedefine CATCH_CONFIG_GETENV": "", + "#cmakedefine CATCH_CONFIG_GLOBAL_NEXTAFTER": "", + "#cmakedefine CATCH_CONFIG_NO_ANDROID_LOGWRITE": "", + "#cmakedefine CATCH_CONFIG_NO_COLOUR_WIN32": "", + "#cmakedefine CATCH_CONFIG_NO_COUNTER": "", + "#cmakedefine CATCH_CONFIG_NO_CPP11_TO_STRING": "", + "#cmakedefine CATCH_CONFIG_NO_CPP17_BYTE": "", + "#cmakedefine CATCH_CONFIG_NO_CPP17_OPTIONAL": "", + "#cmakedefine CATCH_CONFIG_NO_CPP17_STRING_VIEW": "", + "#cmakedefine CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS": "", + "#cmakedefine CATCH_CONFIG_NO_CPP17_VARIANT": "", + "#cmakedefine CATCH_CONFIG_NO_GETENV": "", + "#cmakedefine CATCH_CONFIG_NO_GLOBAL_NEXTAFTER": "", + "#cmakedefine CATCH_CONFIG_NO_POSIX_SIGNALS": "", + "#cmakedefine CATCH_CONFIG_NO_USE_ASYNC": "", + "#cmakedefine CATCH_CONFIG_NO_EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT": "", + "#cmakedefine CATCH_CONFIG_NO_WCHAR": "", + "#cmakedefine CATCH_CONFIG_NO_WINDOWS_SEH": "", + "#cmakedefine CATCH_CONFIG_NOSTDOUT": "", + "#cmakedefine CATCH_CONFIG_POSIX_SIGNALS": "", + "#cmakedefine CATCH_CONFIG_PREFIX_ALL": "", + "#cmakedefine CATCH_CONFIG_PREFIX_MESSAGES": "", + "#cmakedefine CATCH_CONFIG_SHARED_LIBRARY": "", + "#cmakedefine CATCH_CONFIG_EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT": "", + "#cmakedefine CATCH_CONFIG_USE_ASYNC": "", + "#cmakedefine CATCH_CONFIG_WCHAR": "", + "#cmakedefine CATCH_CONFIG_WINDOWS_CRTDBG": "", + "#cmakedefine CATCH_CONFIG_WINDOWS_SEH": "", + }, + template = "src/catch2/catch_user_config.hpp.in", +) + +# Generated header library, modifies the include prefix to account for +# generation path so that we can include +# correctly. +cc_library( + name = "catch2_generated", + hdrs = ["catch2/catch_user_config.hpp"], + include_prefix = ".", # to manipulate -I of dependenices + visibility = ["//visibility:public"], +) + +# Static library, without main. +cc_library( + name = "catch2", + srcs = glob( + ["src/catch2/**/*.cpp"], + exclude = ["src/catch2/internal/catch_main.cpp"], + ), + hdrs = glob(["src/catch2/**/*.hpp"]), + includes = ["src/"], + linkstatic = True, + visibility = ["//visibility:public"], + deps = [":catch2_generated"], +) + +# Static library, with main. +cc_library( + name = "catch2_main", + srcs = ["src/catch2/internal/catch_main.cpp"], + includes = ["src/"], + linkstatic = True, + visibility = ["//visibility:public"], + deps = [":catch2"], +) diff --git a/tests/lib/catch2/CMake/Catch2Config.cmake.in b/tests/lib/catch2/CMake/Catch2Config.cmake.in new file mode 100644 index 0000000..c485219 --- /dev/null +++ b/tests/lib/catch2/CMake/Catch2Config.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ + + +# Avoid repeatedly including the targets +if(NOT TARGET Catch2::Catch2) + # Provide path for scripts + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") + + include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake) +endif() diff --git a/tests/lib/catch2/CMake/CatchConfigOptions.cmake b/tests/lib/catch2/CMake/CatchConfigOptions.cmake new file mode 100644 index 0000000..6eae220 --- /dev/null +++ b/tests/lib/catch2/CMake/CatchConfigOptions.cmake @@ -0,0 +1,89 @@ + +# Copyright Catch2 Authors +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE.txt or copy at +# https://www.boost.org/LICENSE_1_0.txt) + +# SPDX-License-Identifier: BSL-1.0 + +## +# This file contains options that are materialized into the Catch2 +# compiled library. All of them default to OFF, as even the positive +# forms correspond to the user _forcing_ them to ON, while being OFF +# means that Catch2 can use its own autodetection. +# +# For detailed docs look into docs/configuration.md + + +macro(AddOverridableConfigOption OptionBaseName) + option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF) + option(CATCH_CONFIG_NO_${OptionBaseName} "Read docs/configuration.md for details" OFF) + mark_as_advanced(CATCH_CONFIG_${OptionBaseName} CATCH_CONFIG_NO_${OptionBaseName}) +endmacro() + +macro(AddConfigOption OptionBaseName) + option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF) + mark_as_advanced(CATCH_CONFIG_${OptionBaseName}) +endmacro() + +set(_OverridableOptions + "ANDROID_LOGWRITE" + "BAZEL_SUPPORT" + "COLOUR_WIN32" + "COUNTER" + "CPP11_TO_STRING" + "CPP17_BYTE" + "CPP17_OPTIONAL" + "CPP17_STRING_VIEW" + "CPP17_UNCAUGHT_EXCEPTIONS" + "CPP17_VARIANT" + "GLOBAL_NEXTAFTER" + "POSIX_SIGNALS" + "USE_ASYNC" + "WCHAR" + "WINDOWS_SEH" + "GETENV" + "EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT" +) + +foreach(OptionName ${_OverridableOptions}) + AddOverridableConfigOption(${OptionName}) +endforeach() + +set(_OtherConfigOptions + "DISABLE_EXCEPTIONS" + "DISABLE_EXCEPTIONS_CUSTOM_HANDLER" + "DISABLE" + "DISABLE_STRINGIFICATION" + "ENABLE_ALL_STRINGMAKERS" + "ENABLE_OPTIONAL_STRINGMAKER" + "ENABLE_PAIR_STRINGMAKER" + "ENABLE_TUPLE_STRINGMAKER" + "ENABLE_VARIANT_STRINGMAKER" + "EXPERIMENTAL_REDIRECT" + "FAST_COMPILE" + "NOSTDOUT" + "PREFIX_ALL" + "PREFIX_MESSAGES" + "WINDOWS_CRTDBG" +) + + +foreach(OptionName ${_OtherConfigOptions}) + AddConfigOption(${OptionName}) +endforeach() +if(DEFINED BUILD_SHARED_LIBS) + set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS}) +else() + set(CATCH_CONFIG_SHARED_LIBRARY "") +endif() + +set(CATCH_CONFIG_DEFAULT_REPORTER "console" CACHE STRING "Read docs/configuration.md for details. The name of the reporter should be without quotes.") +set(CATCH_CONFIG_CONSOLE_WIDTH "80" CACHE STRING "Read docs/configuration.md for details. Must form a valid integer literal.") + +mark_as_advanced(CATCH_CONFIG_SHARED_LIBRARY CATCH_CONFIG_DEFAULT_REPORTER CATCH_CONFIG_CONSOLE_WIDTH) + +# There is no good way to both turn this into a CMake cache variable, +# and keep reasonable default semantics inside the project. Thus we do +# not define it and users have to provide it as an outside variable. +#set(CATCH_CONFIG_FALLBACK_STRINGIFIER "" CACHE STRING "Read docs/configuration.md for details.") diff --git a/tests/lib/catch2/CMake/CatchMiscFunctions.cmake b/tests/lib/catch2/CMake/CatchMiscFunctions.cmake new file mode 100644 index 0000000..84bd7cc --- /dev/null +++ b/tests/lib/catch2/CMake/CatchMiscFunctions.cmake @@ -0,0 +1,121 @@ + +# Copyright Catch2 Authors +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE.txt or copy at +# https://www.boost.org/LICENSE_1_0.txt) + +# SPDX-License-Identifier: BSL-1.0 + +include(CheckCXXCompilerFlag) +function(add_cxx_flag_if_supported_to_targets flagname targets) + string(MAKE_C_IDENTIFIER ${flagname} flag_identifier ) + check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier}) + + if (HAVE_FLAG_${flag_identifier}) + foreach(target ${targets}) + target_compile_options(${target} PRIVATE ${flagname}) + endforeach() + endif() +endfunction() + +# Assumes that it is only called for development builds, where warnings +# and Werror is desired, so it also enables Werror. +function(add_warnings_to_targets targets) + LIST(LENGTH targets TARGETS_LEN) + # For now we just assume 2 possibilities: msvc and msvc-like compilers, + # and other. + if (MSVC) + foreach(target ${targets}) + # Force MSVC to consider everything as encoded in utf-8 + target_compile_options( ${target} PRIVATE /utf-8 ) + # Enable Werror equivalent + if (CATCH_ENABLE_WERROR) + target_compile_options( ${target} PRIVATE /WX ) + endif() + + # MSVC is currently handled specially + if ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" ) + STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level + target_compile_options( ${target} PRIVATE /w44265 /w44061 /w44062 /w45038 ) + endif() + endforeach() + + endif() + + if (NOT MSVC) + set(CHECKED_WARNING_FLAGS + "-Wabsolute-value" + "-Wall" + "-Wcall-to-pure-virtual-from-ctor-dtor" + "-Wcast-align" + "-Wcatch-value" + "-Wdangling" + "-Wdeprecated" + "-Wdeprecated-register" + "-Wexceptions" + "-Wexit-time-destructors" + "-Wextra" + "-Wextra-semi" + "-Wfloat-equal" + "-Wglobal-constructors" + "-Winit-self" + "-Wmisleading-indentation" + "-Wmismatched-new-delete" + "-Wmismatched-return-types" + "-Wmismatched-tags" + "-Wmissing-braces" + "-Wmissing-declarations" + "-Wmissing-noreturn" + "-Wmissing-prototypes" + "-Wmissing-variable-declarations" + "-Wnull-dereference" + "-Wold-style-cast" + "-Woverloaded-virtual" + "-Wparentheses" + "-Wpedantic" + "-Wredundant-decls" + "-Wreorder" + "-Wreturn-std-move" + "-Wshadow" + "-Wstrict-aliasing" + "-Wsubobject-linkage" + "-Wsuggest-destructor-override" + "-Wsuggest-override" + "-Wundef" + "-Wuninitialized" + "-Wunneeded-internal-declaration" + "-Wunreachable-code-aggressive" + "-Wunused" + "-Wunused-function" + "-Wunused-parameter" + "-Wvla" + "-Wweak-vtables" + + # This is a useful warning, but our tests sometimes rely on + # functions being present, but not picked (e.g. various checks + # for stringification implementation ordering). + # Ergo, we should use it every now and then, but we cannot + # enable it by default. + # "-Wunused-member-function" + ) + foreach(warning ${CHECKED_WARNING_FLAGS}) + add_cxx_flag_if_supported_to_targets(${warning} "${targets}") + endforeach() + + if (CATCH_ENABLE_WERROR) + foreach(target ${targets}) + # Enable Werror equivalent + target_compile_options( ${target} PRIVATE -Werror ) + endforeach() + endif() + endif() +endfunction() + +# Adds flags required for reproducible build to the target +# Currently only supports GCC and Clang +function(add_build_reproducibility_settings target) + # Make the build reproducible on versions of g++ and clang that supports -ffile-prefix-map + if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + add_cxx_flag_if_supported_to_targets("-ffile-prefix-map=${CATCH_DIR}/=" "${target}") + endif() +endfunction() diff --git a/tests/lib/catch2/CMake/FindGcov.cmake b/tests/lib/catch2/CMake/FindGcov.cmake new file mode 100644 index 0000000..4141711 --- /dev/null +++ b/tests/lib/catch2/CMake/FindGcov.cmake @@ -0,0 +1,157 @@ +# This file is part of CMake-codecov. +# +# Copyright (c) +# 2015-2017 RWTH Aachen University, Federal Republic of Germany +# +# See the LICENSE file in the package base directory for details +# +# Written by Alexander Haase, alexander.haase@rwth-aachen.de +# + + +# include required Modules +include(FindPackageHandleStandardArgs) + + +# Search for gcov binary. +set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET}) +set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY}) + +get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) +foreach (LANG ${ENABLED_LANGUAGES}) + # Gcov evaluation is dependent on the used compiler. Check gcov support for + # each compiler that is used. If gcov binary was already found for this + # compiler, do not try to find it again. + if (NOT GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN) + get_filename_component(COMPILER_PATH "${CMAKE_${LANG}_COMPILER}" PATH) + + if ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "GNU") + # Some distributions like OSX (homebrew) ship gcov with the compiler + # version appended as gcov-x. To find this binary we'll build the + # suggested binary name with the compiler version. + string(REGEX MATCH "^[0-9]+" GCC_VERSION + "${CMAKE_${LANG}_COMPILER_VERSION}") + + find_program(GCOV_BIN NAMES gcov-${GCC_VERSION} gcov + HINTS ${COMPILER_PATH}) + + elseif ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "Clang") + # Some distributions like Debian ship llvm-cov with the compiler + # version appended as llvm-cov-x.y. To find this binary we'll build + # the suggested binary name with the compiler version. + string(REGEX MATCH "^[0-9]+.[0-9]+" LLVM_VERSION + "${CMAKE_${LANG}_COMPILER_VERSION}") + + # llvm-cov prior version 3.5 seems to be not working with coverage + # evaluation tools, but these versions are compatible with the gcc + # gcov tool. + if(LLVM_VERSION VERSION_GREATER 3.4) + find_program(LLVM_COV_BIN NAMES "llvm-cov-${LLVM_VERSION}" + "llvm-cov" HINTS ${COMPILER_PATH}) + mark_as_advanced(LLVM_COV_BIN) + + if (LLVM_COV_BIN) + find_program(LLVM_COV_WRAPPER "llvm-cov-wrapper" PATHS + ${CMAKE_MODULE_PATH}) + if (LLVM_COV_WRAPPER) + set(GCOV_BIN "${LLVM_COV_WRAPPER}" CACHE FILEPATH "") + + # set additional parameters + set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV + "LLVM_COV_BIN=${LLVM_COV_BIN}" CACHE STRING + "Environment variables for llvm-cov-wrapper.") + mark_as_advanced(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV) + endif () + endif () + endif () + + if (NOT GCOV_BIN) + # Fall back to gcov binary if llvm-cov was not found or is + # incompatible. This is the default on OSX, but may crash on + # recent Linux versions. + find_program(GCOV_BIN gcov HINTS ${COMPILER_PATH}) + endif () + endif () + + + if (GCOV_BIN) + set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN "${GCOV_BIN}" CACHE STRING + "${LANG} gcov binary.") + + if (NOT CMAKE_REQUIRED_QUIET) + message("-- Found gcov evaluation for " + "${CMAKE_${LANG}_COMPILER_ID}: ${GCOV_BIN}") + endif() + + unset(GCOV_BIN CACHE) + endif () + endif () +endforeach () + + + + +# Add a new global target for all gcov targets. This target could be used to +# generate the gcov files for the whole project instead of calling -gcov +# for each target. +if (NOT TARGET gcov) + add_custom_target(gcov) +endif (NOT TARGET gcov) + + + +# This function will add gcov evaluation for target . Only sources of +# this target will be evaluated and no dependencies will be added. It will call +# Gcov on any source file of once and store the gcov file in the same +# directory. +function (add_gcov_target TNAME) + set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir) + + # We don't have to check, if the target has support for coverage, thus this + # will be checked by add_coverage_target in Findcoverage.cmake. Instead we + # have to determine which gcov binary to use. + get_target_property(TSOURCES ${TNAME} SOURCES) + set(SOURCES "") + set(TCOMPILER "") + foreach (FILE ${TSOURCES}) + codecov_path_of_source(${FILE} FILE) + if (NOT "${FILE}" STREQUAL "") + codecov_lang_of_source(${FILE} LANG) + if (NOT "${LANG}" STREQUAL "") + list(APPEND SOURCES "${FILE}") + set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID}) + endif () + endif () + endforeach () + + # If no gcov binary was found, coverage data can't be evaluated. + if (NOT GCOV_${TCOMPILER}_BIN) + message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.") + return() + endif () + + set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}") + set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}") + + + set(BUFFER "") + foreach(FILE ${SOURCES}) + get_filename_component(FILE_PATH "${TDIR}/${FILE}" PATH) + + # call gcov + add_custom_command(OUTPUT ${TDIR}/${FILE}.gcov + COMMAND ${GCOV_ENV} ${GCOV_BIN} ${TDIR}/${FILE}.gcno > /dev/null + DEPENDS ${TNAME} ${TDIR}/${FILE}.gcno + WORKING_DIRECTORY ${FILE_PATH} + ) + + list(APPEND BUFFER ${TDIR}/${FILE}.gcov) + endforeach() + + + # add target for gcov evaluation of + add_custom_target(${TNAME}-gcov DEPENDS ${BUFFER}) + + # add evaluation target to the global gcov target. + add_dependencies(gcov ${TNAME}-gcov) +endfunction (add_gcov_target) diff --git a/tests/lib/catch2/CMake/FindLcov.cmake b/tests/lib/catch2/CMake/FindLcov.cmake new file mode 100644 index 0000000..beb925a --- /dev/null +++ b/tests/lib/catch2/CMake/FindLcov.cmake @@ -0,0 +1,354 @@ +# This file is part of CMake-codecov. +# +# Copyright (c) +# 2015-2017 RWTH Aachen University, Federal Republic of Germany +# +# See the LICENSE file in the package base directory for details +# +# Written by Alexander Haase, alexander.haase@rwth-aachen.de +# + + +# configuration +set(LCOV_DATA_PATH "${CMAKE_BINARY_DIR}/lcov/data") +set(LCOV_DATA_PATH_INIT "${LCOV_DATA_PATH}/init") +set(LCOV_DATA_PATH_CAPTURE "${LCOV_DATA_PATH}/capture") +set(LCOV_HTML_PATH "${CMAKE_BINARY_DIR}/lcov/html") + + + + +# Search for Gcov which is used by Lcov. +find_package(Gcov) + + + + +# This function will add lcov evaluation for target . Only sources of +# this target will be evaluated and no dependencies will be added. It will call +# geninfo on any source file of once and store the info file in the same +# directory. +# +# Note: This function is only a wrapper to define this function always, even if +# coverage is not supported by the compiler or disabled. This function must +# be defined here, because the module will be exited, if there is no coverage +# support by the compiler or it is disabled by the user. +function (add_lcov_target TNAME) + if (LCOV_FOUND) + # capture initial coverage data + lcov_capture_initial_tgt(${TNAME}) + + # capture coverage data after execution + lcov_capture_tgt(${TNAME}) + endif () +endfunction (add_lcov_target) + + + + +# include required Modules +include(FindPackageHandleStandardArgs) + +# Search for required lcov binaries. +find_program(LCOV_BIN lcov) +find_program(GENINFO_BIN geninfo) +find_program(GENHTML_BIN genhtml) +find_package_handle_standard_args(lcov + REQUIRED_VARS LCOV_BIN GENINFO_BIN GENHTML_BIN +) + +# enable genhtml C++ demangeling, if c++filt is found. +set(GENHTML_CPPFILT_FLAG "") +find_program(CPPFILT_BIN c++filt) +if (NOT CPPFILT_BIN STREQUAL "") + set(GENHTML_CPPFILT_FLAG "--demangle-cpp") +endif (NOT CPPFILT_BIN STREQUAL "") + +# enable no-external flag for lcov, if available. +if (GENINFO_BIN AND NOT DEFINED GENINFO_EXTERN_FLAG) + set(FLAG "") + execute_process(COMMAND ${GENINFO_BIN} --help OUTPUT_VARIABLE GENINFO_HELP) + string(REGEX MATCH "external" GENINFO_RES "${GENINFO_HELP}") + if (GENINFO_RES) + set(FLAG "--no-external") + endif () + + set(GENINFO_EXTERN_FLAG "${FLAG}" + CACHE STRING "Geninfo flag to exclude system sources.") +endif () + +# If Lcov was not found, exit module now. +if (NOT LCOV_FOUND) + return() +endif (NOT LCOV_FOUND) + + + + +# Create directories to be used. +file(MAKE_DIRECTORY ${LCOV_DATA_PATH_INIT}) +file(MAKE_DIRECTORY ${LCOV_DATA_PATH_CAPTURE}) + +set(LCOV_REMOVE_PATTERNS "") + +# This function will merge lcov files to a single target file. Additional lcov +# flags may be set with setting LCOV_EXTRA_FLAGS before calling this function. +function (lcov_merge_files OUTFILE ...) + # Remove ${OUTFILE} from ${ARGV} and generate lcov parameters with files. + list(REMOVE_AT ARGV 0) + + # Generate merged file. + string(REPLACE "${CMAKE_BINARY_DIR}/" "" FILE_REL "${OUTFILE}") + add_custom_command(OUTPUT "${OUTFILE}.raw" + COMMAND cat ${ARGV} > ${OUTFILE}.raw + DEPENDS ${ARGV} + COMMENT "Generating ${FILE_REL}" + ) + + add_custom_command(OUTPUT "${OUTFILE}" + COMMAND ${LCOV_BIN} --quiet -a ${OUTFILE}.raw --output-file ${OUTFILE} + --base-directory ${PROJECT_SOURCE_DIR} ${LCOV_EXTRA_FLAGS} + COMMAND ${LCOV_BIN} --quiet -r ${OUTFILE} ${LCOV_REMOVE_PATTERNS} + --output-file ${OUTFILE} ${LCOV_EXTRA_FLAGS} + DEPENDS ${OUTFILE}.raw + COMMENT "Post-processing ${FILE_REL}" + ) +endfunction () + + + + +# Add a new global target to generate initial coverage reports for all targets. +# This target will be used to generate the global initial info file, which is +# used to gather even empty report data. +if (NOT TARGET lcov-capture-init) + add_custom_target(lcov-capture-init) + set(LCOV_CAPTURE_INIT_FILES "" CACHE INTERNAL "") +endif (NOT TARGET lcov-capture-init) + + +# This function will add initial capture of coverage data for target , +# which is needed to get also data for objects, which were not loaded at +# execution time. It will call geninfo for every source file of once and +# store the info file in the same directory. +function (lcov_capture_initial_tgt TNAME) + # We don't have to check, if the target has support for coverage, thus this + # will be checked by add_coverage_target in Findcoverage.cmake. Instead we + # have to determine which gcov binary to use. + get_target_property(TSOURCES ${TNAME} SOURCES) + set(SOURCES "") + set(TCOMPILER "") + foreach (FILE ${TSOURCES}) + codecov_path_of_source(${FILE} FILE) + if (NOT "${FILE}" STREQUAL "") + codecov_lang_of_source(${FILE} LANG) + if (NOT "${LANG}" STREQUAL "") + list(APPEND SOURCES "${FILE}") + set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID}) + endif () + endif () + endforeach () + + # If no gcov binary was found, coverage data can't be evaluated. + if (NOT GCOV_${TCOMPILER}_BIN) + message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.") + return() + endif () + + set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}") + set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}") + + + set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir) + set(GENINFO_FILES "") + foreach(FILE ${SOURCES}) + # generate empty coverage files + set(OUTFILE "${TDIR}/${FILE}.info.init") + list(APPEND GENINFO_FILES ${OUTFILE}) + + add_custom_command(OUTPUT ${OUTFILE} COMMAND ${GCOV_ENV} ${GENINFO_BIN} + --quiet --base-directory ${PROJECT_SOURCE_DIR} --initial + --gcov-tool ${GCOV_BIN} --output-filename ${OUTFILE} + ${GENINFO_EXTERN_FLAG} ${TDIR}/${FILE}.gcno + DEPENDS ${TNAME} + COMMENT "Capturing initial coverage data for ${FILE}" + ) + endforeach() + + # Concatenate all files generated by geninfo to a single file per target. + set(OUTFILE "${LCOV_DATA_PATH_INIT}/${TNAME}.info") + set(LCOV_EXTRA_FLAGS "--initial") + lcov_merge_files("${OUTFILE}" ${GENINFO_FILES}) + add_custom_target(${TNAME}-capture-init ALL DEPENDS ${OUTFILE}) + + # add geninfo file generation to global lcov-geninfo target + add_dependencies(lcov-capture-init ${TNAME}-capture-init) + set(LCOV_CAPTURE_INIT_FILES "${LCOV_CAPTURE_INIT_FILES}" + "${OUTFILE}" CACHE INTERNAL "" + ) +endfunction (lcov_capture_initial_tgt) + + +# This function will generate the global info file for all targets. It has to be +# called after all other CMake functions in the root CMakeLists.txt file, to get +# a full list of all targets that generate coverage data. +function (lcov_capture_initial) + # Skip this function (and do not create the following targets), if there are + # no input files. + if ("${LCOV_CAPTURE_INIT_FILES}" STREQUAL "") + return() + endif () + + # Add a new target to merge the files of all targets. + set(OUTFILE "${LCOV_DATA_PATH_INIT}/all_targets.info") + lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_INIT_FILES}) + add_custom_target(lcov-geninfo-init ALL DEPENDS ${OUTFILE} + lcov-capture-init + ) +endfunction (lcov_capture_initial) + + + + +# Add a new global target to generate coverage reports for all targets. This +# target will be used to generate the global info file. +if (NOT TARGET lcov-capture) + add_custom_target(lcov-capture) + set(LCOV_CAPTURE_FILES "" CACHE INTERNAL "") +endif (NOT TARGET lcov-capture) + + +# This function will add capture of coverage data for target , which is +# needed to get also data for objects, which were not loaded at execution time. +# It will call geninfo for every source file of once and store the info +# file in the same directory. +function (lcov_capture_tgt TNAME) + # We don't have to check, if the target has support for coverage, thus this + # will be checked by add_coverage_target in Findcoverage.cmake. Instead we + # have to determine which gcov binary to use. + get_target_property(TSOURCES ${TNAME} SOURCES) + set(SOURCES "") + set(TCOMPILER "") + foreach (FILE ${TSOURCES}) + codecov_path_of_source(${FILE} FILE) + if (NOT "${FILE}" STREQUAL "") + codecov_lang_of_source(${FILE} LANG) + if (NOT "${LANG}" STREQUAL "") + list(APPEND SOURCES "${FILE}") + set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID}) + endif () + endif () + endforeach () + + # If no gcov binary was found, coverage data can't be evaluated. + if (NOT GCOV_${TCOMPILER}_BIN) + message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.") + return() + endif () + + set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}") + set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}") + + + set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir) + set(GENINFO_FILES "") + foreach(FILE ${SOURCES}) + # Generate coverage files. If no .gcda file was generated during + # execution, the empty coverage file will be used instead. + set(OUTFILE "${TDIR}/${FILE}.info") + list(APPEND GENINFO_FILES ${OUTFILE}) + + add_custom_command(OUTPUT ${OUTFILE} + COMMAND test -f "${TDIR}/${FILE}.gcda" + && ${GCOV_ENV} ${GENINFO_BIN} --quiet --base-directory + ${PROJECT_SOURCE_DIR} --gcov-tool ${GCOV_BIN} + --output-filename ${OUTFILE} ${GENINFO_EXTERN_FLAG} + ${TDIR}/${FILE}.gcda + || cp ${OUTFILE}.init ${OUTFILE} + DEPENDS ${TNAME} ${TNAME}-capture-init + COMMENT "Capturing coverage data for ${FILE}" + ) + endforeach() + + # Concatenate all files generated by geninfo to a single file per target. + set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/${TNAME}.info") + lcov_merge_files("${OUTFILE}" ${GENINFO_FILES}) + add_custom_target(${TNAME}-geninfo DEPENDS ${OUTFILE}) + + # add geninfo file generation to global lcov-capture target + add_dependencies(lcov-capture ${TNAME}-geninfo) + set(LCOV_CAPTURE_FILES "${LCOV_CAPTURE_FILES}" "${OUTFILE}" CACHE INTERNAL + "" + ) + + # Add target for generating html output for this target only. + file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/${TNAME}) + add_custom_target(${TNAME}-genhtml + COMMAND ${GENHTML_BIN} --quiet --sort --prefix ${PROJECT_SOURCE_DIR} + --baseline-file ${LCOV_DATA_PATH_INIT}/${TNAME}.info + --output-directory ${LCOV_HTML_PATH}/${TNAME} + --title "${CMAKE_PROJECT_NAME} - target ${TNAME}" + ${GENHTML_CPPFILT_FLAG} ${OUTFILE} + DEPENDS ${TNAME}-geninfo ${TNAME}-capture-init + ) +endfunction (lcov_capture_tgt) + + +# This function will generate the global info file for all targets. It has to be +# called after all other CMake functions in the root CMakeLists.txt file, to get +# a full list of all targets that generate coverage data. +function (lcov_capture) + # Skip this function (and do not create the following targets), if there are + # no input files. + if ("${LCOV_CAPTURE_FILES}" STREQUAL "") + return() + endif () + + # Add a new target to merge the files of all targets. + set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/all_targets.info") + lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_FILES}) + add_custom_target(lcov-geninfo DEPENDS ${OUTFILE} lcov-capture) + + # Add a new global target for all lcov targets. This target could be used to + # generate the lcov html output for the whole project instead of calling + # -geninfo and -genhtml for each target. It will also be + # used to generate a html site for all project data together instead of one + # for each target. + if (NOT TARGET lcov) + file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/all_targets) + add_custom_target(lcov + COMMAND ${GENHTML_BIN} --quiet --sort + --baseline-file ${LCOV_DATA_PATH_INIT}/all_targets.info + --output-directory ${LCOV_HTML_PATH}/all_targets + --title "${CMAKE_PROJECT_NAME}" --prefix "${PROJECT_SOURCE_DIR}" + ${GENHTML_CPPFILT_FLAG} ${OUTFILE} + DEPENDS lcov-geninfo-init lcov-geninfo + ) + endif () +endfunction (lcov_capture) + + + + +# Add a new global target to generate the lcov html report for the whole project +# instead of calling -genhtml for each target (to create an own report +# for each target). Instead of the lcov target it does not require geninfo for +# all targets, so you have to call -geninfo to generate the info files +# the targets you'd like to have in your report or lcov-geninfo for generating +# info files for all targets before calling lcov-genhtml. +file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/selected_targets) +if (NOT TARGET lcov-genhtml) + add_custom_target(lcov-genhtml + COMMAND ${GENHTML_BIN} + --quiet + --output-directory ${LCOV_HTML_PATH}/selected_targets + --title \"${CMAKE_PROJECT_NAME} - targets `find + ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name + \"all_targets.info\" -exec basename {} .info \\\;`\" + --prefix ${PROJECT_SOURCE_DIR} + --sort + ${GENHTML_CPPFILT_FLAG} + `find ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name + \"all_targets.info\"` + ) +endif (NOT TARGET lcov-genhtml) diff --git a/tests/lib/catch2/CMake/Findcodecov.cmake b/tests/lib/catch2/CMake/Findcodecov.cmake new file mode 100644 index 0000000..2c0f2fe --- /dev/null +++ b/tests/lib/catch2/CMake/Findcodecov.cmake @@ -0,0 +1,258 @@ +# This file is part of CMake-codecov. +# +# Copyright (c) +# 2015-2017 RWTH Aachen University, Federal Republic of Germany +# +# See the LICENSE file in the package base directory for details +# +# Written by Alexander Haase, alexander.haase@rwth-aachen.de +# + + +# Add an option to choose, if coverage should be enabled or not. If enabled +# marked targets will be build with coverage support and appropriate targets +# will be added. If disabled coverage will be ignored for *ALL* targets. +option(ENABLE_COVERAGE "Enable coverage build." OFF) + +set(COVERAGE_FLAG_CANDIDATES + # gcc and clang + "-O0 -g -fprofile-arcs -ftest-coverage" + + # gcc and clang fallback + "-O0 -g --coverage" +) + + +# Add coverage support for target ${TNAME} and register target for coverage +# evaluation. If coverage is disabled or not supported, this function will +# simply do nothing. +# +# Note: This function is only a wrapper to define this function always, even if +# coverage is not supported by the compiler or disabled. This function must +# be defined here, because the module will be exited, if there is no coverage +# support by the compiler or it is disabled by the user. +function (add_coverage TNAME) + # only add coverage for target, if coverage is support and enabled. + if (ENABLE_COVERAGE) + foreach (TNAME ${ARGV}) + add_coverage_target(${TNAME}) + endforeach () + endif () +endfunction (add_coverage) + + +# Add global target to gather coverage information after all targets have been +# added. Other evaluation functions could be added here, after checks for the +# specific module have been passed. +# +# Note: This function is only a wrapper to define this function always, even if +# coverage is not supported by the compiler or disabled. This function must +# be defined here, because the module will be exited, if there is no coverage +# support by the compiler or it is disabled by the user. +function (coverage_evaluate) + # add lcov evaluation + if (LCOV_FOUND) + lcov_capture_initial() + lcov_capture() + endif (LCOV_FOUND) +endfunction () + + +# Exit this module, if coverage is disabled. add_coverage is defined before this +# return, so this module can be exited now safely without breaking any build- +# scripts. +if (NOT ENABLE_COVERAGE) + return() +endif () + + + + +# Find the reuired flags foreach language. +set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET}) +set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY}) + +get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) +foreach (LANG ${ENABLED_LANGUAGES}) + # Coverage flags are not dependent on language, but the used compiler. So + # instead of searching flags foreach language, search flags foreach compiler + # used. + set(COMPILER ${CMAKE_${LANG}_COMPILER_ID}) + if (NOT COVERAGE_${COMPILER}_FLAGS) + foreach (FLAG ${COVERAGE_FLAG_CANDIDATES}) + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Try ${COMPILER} code coverage flag = [${FLAG}]") + endif() + + set(CMAKE_REQUIRED_FLAGS "${FLAG}") + unset(COVERAGE_FLAG_DETECTED CACHE) + + if (${LANG} STREQUAL "C") + include(CheckCCompilerFlag) + check_c_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED) + + elseif (${LANG} STREQUAL "CXX") + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED) + + elseif (${LANG} STREQUAL "Fortran") + # CheckFortranCompilerFlag was introduced in CMake 3.x. To be + # compatible with older Cmake versions, we will check if this + # module is present before we use it. Otherwise we will define + # Fortran coverage support as not available. + include(CheckFortranCompilerFlag OPTIONAL + RESULT_VARIABLE INCLUDED) + if (INCLUDED) + check_fortran_compiler_flag("${FLAG}" + COVERAGE_FLAG_DETECTED) + elseif (NOT CMAKE_REQUIRED_QUIET) + message("-- Performing Test COVERAGE_FLAG_DETECTED") + message("-- Performing Test COVERAGE_FLAG_DETECTED - Failed" + " (Check not supported)") + endif () + endif() + + if (COVERAGE_FLAG_DETECTED) + set(COVERAGE_${COMPILER}_FLAGS "${FLAG}" + CACHE STRING "${COMPILER} flags for code coverage.") + mark_as_advanced(COVERAGE_${COMPILER}_FLAGS) + break() + else () + message(WARNING "Code coverage is not available for ${COMPILER}" + " compiler. Targets using this compiler will be " + "compiled without it.") + endif () + endforeach () + endif () +endforeach () + +set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE}) + + + + +# Helper function to get the language of a source file. +function (codecov_lang_of_source FILE RETURN_VAR) + get_filename_component(FILE_EXT "${FILE}" EXT) + string(TOLOWER "${FILE_EXT}" FILE_EXT) + string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT) + + get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) + foreach (LANG ${ENABLED_LANGUAGES}) + list(FIND CMAKE_${LANG}_SOURCE_FILE_EXTENSIONS "${FILE_EXT}" TEMP) + if (NOT ${TEMP} EQUAL -1) + set(${RETURN_VAR} "${LANG}" PARENT_SCOPE) + return() + endif () + endforeach() + + set(${RETURN_VAR} "" PARENT_SCOPE) +endfunction () + + +# Helper function to get the relative path of the source file destination path. +# This path is needed by FindGcov and FindLcov cmake files to locate the +# captured data. +function (codecov_path_of_source FILE RETURN_VAR) + string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _source ${FILE}) + + # If expression was found, SOURCEFILE is a generator-expression for an + # object library. Currently we found no way to call this function automatic + # for the referenced target, so it must be called in the directoryso of the + # object library definition. + if (NOT "${_source}" STREQUAL "") + set(${RETURN_VAR} "" PARENT_SCOPE) + return() + endif () + + + string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" FILE "${FILE}") + if(IS_ABSOLUTE ${FILE}) + file(RELATIVE_PATH FILE ${CMAKE_CURRENT_SOURCE_DIR} ${FILE}) + endif() + + # get the right path for file + string(REPLACE ".." "__" PATH "${FILE}") + + set(${RETURN_VAR} "${PATH}" PARENT_SCOPE) +endfunction() + + + + +# Add coverage support for target ${TNAME} and register target for coverage +# evaluation. +function(add_coverage_target TNAME) + # Check if all sources for target use the same compiler. If a target uses + # e.g. C and Fortran mixed and uses different compilers (e.g. clang and + # gfortran) this can trigger huge problems, because different compilers may + # use different implementations for code coverage. + get_target_property(TSOURCES ${TNAME} SOURCES) + set(TARGET_COMPILER "") + set(ADDITIONAL_FILES "") + foreach (FILE ${TSOURCES}) + # If expression was found, FILE is a generator-expression for an object + # library. Object libraries will be ignored. + string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _file ${FILE}) + if ("${_file}" STREQUAL "") + codecov_lang_of_source(${FILE} LANG) + if (LANG) + list(APPEND TARGET_COMPILER ${CMAKE_${LANG}_COMPILER_ID}) + + list(APPEND ADDITIONAL_FILES "${FILE}.gcno") + list(APPEND ADDITIONAL_FILES "${FILE}.gcda") + endif () + endif () + endforeach () + + list(REMOVE_DUPLICATES TARGET_COMPILER) + list(LENGTH TARGET_COMPILER NUM_COMPILERS) + + if (NUM_COMPILERS GREATER 1) + message(WARNING "Can't use code coverage for target ${TNAME}, because " + "it will be compiled by incompatible compilers. Target will be " + "compiled without code coverage.") + return() + + elseif (NUM_COMPILERS EQUAL 0) + message(WARNING "Can't use code coverage for target ${TNAME}, because " + "it uses an unknown compiler. Target will be compiled without " + "code coverage.") + return() + + elseif (NOT DEFINED "COVERAGE_${TARGET_COMPILER}_FLAGS") + # A warning has been printed before, so just return if flags for this + # compiler aren't available. + return() + endif() + + + # enable coverage for target + set_property(TARGET ${TNAME} APPEND_STRING + PROPERTY COMPILE_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}") + set_property(TARGET ${TNAME} APPEND_STRING + PROPERTY LINK_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}") + + + # Add gcov files generated by compiler to clean target. + set(CLEAN_FILES "") + foreach (FILE ${ADDITIONAL_FILES}) + codecov_path_of_source(${FILE} FILE) + list(APPEND CLEAN_FILES "CMakeFiles/${TNAME}.dir/${FILE}") + endforeach() + + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + "${CLEAN_FILES}") + + + add_gcov_target(${TNAME}) + add_lcov_target(${TNAME}) +endfunction(add_coverage_target) + + + + +# Include modules for parsing the collected data and output it in a readable +# format (like gcov and lcov). +find_package(Gcov) +find_package(Lcov) diff --git a/tests/lib/catch2/CMake/catch2-with-main.pc.in b/tests/lib/catch2/CMake/catch2-with-main.pc.in new file mode 100644 index 0000000..69a790b --- /dev/null +++ b/tests/lib/catch2/CMake/catch2-with-main.pc.in @@ -0,0 +1,10 @@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +pkg_version=@Catch2_VERSION@ + +Name: Catch2-With-Main +Description: A modern, C++-native test framework for C++14 and above (links in default main) +Version: ${pkg_version} +Requires: catch2 = ${pkg_version} +Cflags: -I${includedir} +Libs: -L${libdir} -lCatch2Main diff --git a/tests/lib/catch2/CMake/catch2.pc.in b/tests/lib/catch2/CMake/catch2.pc.in new file mode 100644 index 0000000..bd1c95a --- /dev/null +++ b/tests/lib/catch2/CMake/catch2.pc.in @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ + +Name: Catch2 +Description: A modern, C++-native, test framework for C++14 and above +URL: https://github.com/catchorg/Catch2 +Version: @Catch2_VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lCatch2 diff --git a/tests/lib/catch2/CMake/llvm-cov-wrapper b/tests/lib/catch2/CMake/llvm-cov-wrapper new file mode 100755 index 0000000..2ac3310 --- /dev/null +++ b/tests/lib/catch2/CMake/llvm-cov-wrapper @@ -0,0 +1,56 @@ +#!/bin/sh + +# This file is part of CMake-codecov. +# +# Copyright (c) +# 2015-2017 RWTH Aachen University, Federal Republic of Germany +# +# See the LICENSE file in the package base directory for details +# +# Written by Alexander Haase, alexander.haase@rwth-aachen.de +# + +if [ -z "$LLVM_COV_BIN" ] +then + echo "LLVM_COV_BIN not set!" >& 2 + exit 1 +fi + + +# Get LLVM version to find out. +LLVM_VERSION=$($LLVM_COV_BIN -version | grep -i "LLVM version" \ + | sed "s/^\([A-Za-z ]*\)\([0-9]\).\([0-9]\).*$/\2.\3/g") + +if [ "$1" = "-v" ] +then + echo "llvm-cov-wrapper $LLVM_VERSION" + exit 0 +fi + + +if [ -n "$LLVM_VERSION" ] +then + MAJOR=$(echo $LLVM_VERSION | cut -d'.' -f1) + MINOR=$(echo $LLVM_VERSION | cut -d'.' -f2) + + if [ $MAJOR -eq 3 ] && [ $MINOR -le 4 ] + then + if [ -f "$1" ] + then + filename=$(basename "$1") + extension="${filename##*.}" + + case "$extension" in + "gcno") exec $LLVM_COV_BIN --gcno="$1" ;; + "gcda") exec $LLVM_COV_BIN --gcda="$1" ;; + esac + fi + fi + + if [ $MAJOR -eq 3 ] && [ $MINOR -le 5 ] + then + exec $LLVM_COV_BIN $@ + fi +fi + +exec $LLVM_COV_BIN gcov $@ diff --git a/tests/lib/catch2/CMakeLists.txt b/tests/lib/catch2/CMakeLists.txt new file mode 100644 index 0000000..ce225c0 --- /dev/null +++ b/tests/lib/catch2/CMakeLists.txt @@ -0,0 +1,203 @@ +cmake_minimum_required(VERSION 3.10) + +# detect if Catch is being bundled, +# disable testsuite in that case +if(NOT DEFINED PROJECT_NAME) + set(NOT_SUBPROJECT ON) +else() + set(NOT_SUBPROJECT OFF) +endif() + +option(CATCH_INSTALL_DOCS "Install documentation alongside library" ON) +option(CATCH_INSTALL_EXTRAS "Install extras (CMake scripts, debugger helpers) alongside library" ON) +option(CATCH_DEVELOPMENT_BUILD "Build tests, enable warnings, enable Werror, etc" OFF) +option(CATCH_ENABLE_REPRODUCIBLE_BUILD "Add compiler flags for improving build reproducibility" ON) + +include(CMakeDependentOption) +cmake_dependent_option(CATCH_BUILD_TESTING "Build the SelfTest project" ON "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_BUILD_EXAMPLES "Build code examples" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_BUILD_EXTRA_TESTS "Build extra tests" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_BUILD_FUZZERS "Build fuzzers" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_ENABLE_COVERAGE "Generate coverage for codecov.io" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_ENABLE_WERROR "Enables Werror during build" ON "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_BUILD_SURROGATES "Enable generating and building surrogate TUs for the main headers" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_ENABLE_CONFIGURE_TESTS "Enable CMake configuration tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF) +cmake_dependent_option(CATCH_ENABLE_CMAKE_HELPER_TESTS "Enable CMake helper tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF) + + +# Catch2's build breaks if done in-tree. You probably should not build +# things in tree anyway, but we can allow projects that include Catch2 +# as a subproject to build in-tree as long as it is not in our tree. +if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt") +endif() + +project(Catch2 + VERSION 3.5.3 # CML version placeholder, don't delete + LANGUAGES CXX + # HOMEPAGE_URL is not supported until CMake version 3.12, which + # we do not target yet. + # HOMEPAGE_URL "https://github.com/catchorg/Catch2" + DESCRIPTION "A modern, C++-native, unit test framework." +) + + +# Provide path for scripts. We first add path to the scripts we don't use, +# but projects including us might, and set the path up to parent scope. +# Then we also add path that we use to configure the project, but is of +# no use to top level projects. +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/extras") +if (NOT NOT_SUBPROJECT) + set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) +endif() +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) +include(CatchConfigOptions) +if(CATCH_DEVELOPMENT_BUILD) + include(CTest) +endif() + +# This variable is used in some subdirectories, so we need it here, rather +# than later in the install block +set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2") + +# We have some Windows builds that test `wmain` entry point, +# and we need this change to be present in all binaries that +# are built during these tests, so this is required here, before +# the subdirectories are added. +if(CATCH_TEST_USE_WMAIN) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup") +endif() + + +# Basic paths +set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(SOURCES_DIR ${CATCH_DIR}/src/catch2) +set(SELF_TEST_DIR ${CATCH_DIR}/tests/SelfTest) +set(BENCHMARK_DIR ${CATCH_DIR}/tests/Benchmark) +set(EXAMPLES_DIR ${CATCH_DIR}/examples) + +# We need to bring-in the variables defined there to this scope +add_subdirectory(src) + +# Build tests only if requested +if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT) + find_package(PythonInterp 3 REQUIRED) + if (NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "Python not found, but required for tests") + endif() + add_subdirectory(tests) +endif() + +if(CATCH_BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + +if(CATCH_BUILD_EXTRA_TESTS) + add_subdirectory(tests/ExtraTests) +endif() + +if(CATCH_BUILD_FUZZERS) + add_subdirectory(fuzzing) +endif() + +if (CATCH_DEVELOPMENT_BUILD) + add_warnings_to_targets("${CATCH_WARNING_TARGETS}") +endif() + +# Only perform the installation steps when Catch is not being used as +# a subproject via `add_subdirectory`, or the destinations will break, +# see https://github.com/catchorg/Catch2/issues/1373 +if (NOT_SUBPROJECT) + configure_package_config_file( + ${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake + INSTALL_DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake" + COMPATIBILITY + SameMajorVersion + ) + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake" + DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + + # Install documentation + if(CATCH_INSTALL_DOCS) + install( + DIRECTORY + docs/ + DESTINATION + "${CMAKE_INSTALL_DOCDIR}" + PATTERN "doxygen" EXCLUDE + ) + endif() + + if(CATCH_INSTALL_EXTRAS) + # Install CMake scripts + install( + FILES + "extras/ParseAndAddCatchTests.cmake" + "extras/Catch.cmake" + "extras/CatchAddTests.cmake" + "extras/CatchShardTests.cmake" + "extras/CatchShardTestsImpl.cmake" + DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + + # Install debugger helpers + install( + FILES + "extras/gdbinit" + "extras/lldbinit" + DESTINATION + ${CMAKE_INSTALL_DATAROOTDIR}/Catch2 + ) + endif() + + ## Provide some pkg-config integration + set(PKGCONFIG_INSTALL_DIR + "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig" + CACHE PATH "Path where catch2.pc is installed" + ) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/catch2.pc + @ONLY + ) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc + @ONLY + ) + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/catch2.pc" + "${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc" + DESTINATION + ${PKGCONFIG_INSTALL_DIR} + ) + + # CPack/CMake started taking the package version from project version 3.12 + # So we need to set the version manually for older CMake versions + if(${CMAKE_VERSION} VERSION_LESS "3.12.0") + set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) + endif() + + set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/") + + + include( CPack ) + +endif() diff --git a/tests/lib/catch2/CMakePresets.json b/tests/lib/catch2/CMakePresets.json new file mode 100644 index 0000000..8854128 --- /dev/null +++ b/tests/lib/catch2/CMakePresets.json @@ -0,0 +1,26 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "basic-tests", + "displayName": "Basic development build", + "description": "Enables development build with basic tests that are cheap to build and run", + "cacheVariables": { + "CATCH_DEVELOPMENT_BUILD": "ON" + } + }, + { + "name": "all-tests", + "inherits": "basic-tests", + "displayName": "Full development build", + "description": "Enables development build with examples and ALL tests", + "cacheVariables": { + "CATCH_BUILD_EXAMPLES": "ON", + "CATCH_BUILD_EXTRA_TESTS": "ON", + "CATCH_BUILD_SURROGATES": "ON", + "CATCH_ENABLE_CONFIGURE_TESTS": "ON", + "CATCH_ENABLE_CMAKE_HELPER_TESTS": "ON" + } + } + ] +} diff --git a/tests/lib/catch2/CODE_OF_CONDUCT.md b/tests/lib/catch2/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..be1a688 --- /dev/null +++ b/tests/lib/catch2/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at github@philnash.me. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/tests/lib/catch2/Doxyfile b/tests/lib/catch2/Doxyfile new file mode 100644 index 0000000..914e598 --- /dev/null +++ b/tests/lib/catch2/Doxyfile @@ -0,0 +1,2650 @@ +# Doxyfile 1.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = Catch2 + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Popular C++ unit testing framework" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs/doxygen + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = "complexity=@par Complexity:" \ + noexcept=**Noexcept** + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = YES + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which efficively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = YES + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = YES + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = YES + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = doxygen.errors + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = src/catch2 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, +# *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = */lib/* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = NO + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to +# YES then doxygen will add the directory of each input to the include path. +# The default value is: YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: +# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = YES + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = TeX/AMSmath \ + TeX/AMSsymbols + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /