diff --git "a/2025/work/00 \345\274\240\344\270\211/placeholder" "b/2025/work/00 \345\274\240\344\270\211/placeholder" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/work/00 \345\274\240\344\270\211/src/placeholder" "b/2025/work/00 \345\274\240\344\270\211/src/placeholder" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/work/00 \345\274\240\344\270\211/\347\255\224\350\276\251.pdf" "b/2025/work/00 \345\274\240\344\270\211/\347\255\224\350\276\251.pdf" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/Makefile" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/Makefile" new file mode 100644 index 0000000000000000000000000000000000000000..afb1b9459b93dfe8e5bc450f6a3070d5b6fa787c --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/Makefile" @@ -0,0 +1,10 @@ +TARGET := checker +SRC := checker.cc + +all: $(TARGET) + +$(TARGET): $(SRC) + g++ -O2 -o $@ $< + +clean: + rm -f $(TARGET) diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/README.md" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..f4ac0a72d17c0a07e69a7dd7da611a7d07ae95e4 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/README.md" @@ -0,0 +1,8 @@ +## Build +Just `make` + +## Run Example + +`./checker example/infile.txt example/outfile.txt example/outfile.txt` + +Where `infile.txt` is the input file, `outfile.txt` is your output file. diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker" new file mode 100755 index 0000000000000000000000000000000000000000..4d985a265611649bbd8e75a6ca98e369e2ed10df Binary files /dev/null and "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker" differ diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker.cc" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker.cc" new file mode 100644 index 0000000000000000000000000000000000000000..8db936c5a52811647b5afad320f2cd383fcbe3ca --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/checker.cc" @@ -0,0 +1,189 @@ +#include "testlib.h" + +struct Input { + int L, M, N; + struct Ops { + int addr, size, start, tim; + }; + std::vector ops; +}input; + +struct Output { + struct Ops { + std::string opName; + uint64_t T; + int A, S; + }; + std::vector ops; +}output; + +void check_input() +{ + input.L = inf.readInt(1, 100000, "L"); + input.M = inf.readInt(1, input.L, "M"); + input.N = inf.readInt(1, 10000, "N"); + int last_start = 0; + int N = input.N, L = input.L; + for (int i = 0; i < N; i++) { + int addr = inf.readInt(0, L - 1, "addr_i"); + int size = inf.readInt(1, L, "size_i"); + int start = inf.readInt(0, 1e9, "start_i"); + int tim = inf.readInt(0, 1e9, "time_i"); + quitif(addr + size > L, _fail, "[Invalid Input] addr + size > L, where addr = %d, size = %d, L = %d", addr, size, L); + quitif(start < last_start, _fail, "[Invalid Input] start[%d] > start[%d] (%d > %d)", i - 1, i, last_start, start); + last_start = start; + input.ops.push_back({addr, size, start, tim}); + } + if (inf.seekEof() == false) { + quitf(_fail, "[Invalid Input] Find task numbers greater than N (which is %d).", N); + } + inf.readEof(); +} + +void check_output() +{ + int last_visit = -1; + uint64_t last_T = 0; + int totalReadLines = 0; + bool finish = false; + std::vector duplicate(input.N, false); + + while (!finish) { + std::string opName = ouf.readWord(); + uint64_t T; + int A, S = 0; + totalReadLines++; + if (totalReadLines > 10 * input.N) { + quitf(_pe, "[Invalid Output] Too many lines. %d > 10n", totalReadLines); + } + if (opName == "Reload") { + T = ouf.readLong(0, (long long)1e18, "T"); + A = ouf.readInt(0, input.L - 1, "A"); + S = ouf.readInt(1, input.L, "S"); + quitif(A + S > input.L, _wa, "[Invalid Output] Reload addr + size > L, where addr = %d, size = %d, L = %d", A, S, input.L); + } else if (opName == "Visit") { + T = ouf.readLong(0, (long long)1e18, "T"); + A = ouf.readInt(0, input.N - 1, "A"); + quitif(duplicate[A], _wa, "[Invalid Output] Output (Visit %d) more than once.", A); + duplicate[A] = true; + if (last_visit != -1 && input.ops[last_visit].start == input.ops[A].start) { + // PASS. We do not care the Visit order in the same task. + } else { + quitif(last_visit >= A, _wa, "[Invalid Output] Tasks are not finished by input sequence. %d >= %d. Op[%d] = (%s %llu %d)", + last_visit, A, totalReadLines - 1, opName.c_str(), T, A); + } + last_visit = A; + } else if (opName == "Offload") { + T = ouf.readLong(0, (long long)1e18, "T"); + A = ouf.readInt(0, input.L - 1, "A"); + S = ouf.readInt(1, input.L, "S"); + quitif(A + S > input.L, _wa, "[Invalid Output] Offload addr + size > L, where addr = %d, size = %d, L = %d.", A, S, input.L); + } else if (opName == "Fin") { + T = ouf.readLong(0, (long long)1e18, "T"); + finish = true; + } else { + quitf(_wa, "[Invalid Output] Unknown operator %s", opName.c_str()); + } + quitif(last_T > T, _wa, "[Invalid Output] Output T is not ascending. %llu > %llu. Op[%d] = (%s %llu ...)", + last_T, T, totalReadLines - 1, opName.c_str(), T); + last_T = T; + output.ops.push_back({opName, T, A, S}); + } + int finish_tasks = 0; + for (int i = 0; i < input.N; i++) { + if (duplicate[i]) { + finish_tasks++; + } + } + quitif(finish_tasks != input.N, _wa, "[Invalid Output] Output did not finish all Visit tasks. %d != N (which is %d)", finish_tasks, input.N); + if (ouf.seekEof() == false) { + quitf(_pe, "[Invalid Output] Find extra lines after output Fin."); + } + ouf.readEof(); +} + +uint64_t get_score() +{ + const int MEM_OFFLOAD = -2; + const int MEM_RELOAD = -1; + const uint64_t multiple_IO = 40; + std::vector in_mem(input.L, MEM_OFFLOAD); + std::vector task_finish_at(input.N, 0); + int use_mem = 0; + int nr_output = output.ops.size(); + int last_visit = -1; + uint64_t score = 0; + uint64_t io_time = 0, npu_time = 0; + for (int i = 0; i < nr_output; i++) { + auto curr = output.ops[i]; + if (curr.opName == "Reload") { + quitif(io_time > curr.T, _wa, "[Invalid Output] IO is busy. Last IO task finish at %llu. Op[%d] = (%s %llu %d %d)", + io_time, i, curr.opName.c_str(), curr.T, curr.A, curr.S); + int cnt_tomem = 0; + for (int j = curr.A; j < curr.A + curr.S; j++) { + if (in_mem[j] == MEM_OFFLOAD) { + cnt_tomem++; + in_mem[j] = MEM_RELOAD; + } + } + use_mem += cnt_tomem; + quitif(use_mem > input.M, _wa, "[Invalid Output] Out of Memory. use_mem = %d, M = %d. Op[%d] = (%s %llu %d %d)", + use_mem, input.M, i, curr.opName.c_str(), curr.T, curr.A, curr.S); + io_time = curr.T + multiple_IO * cnt_tomem; + } else if (curr.opName == "Visit") { + uint64_t this_task_finish_time = curr.T + input.ops[curr.A].tim; + if (last_visit != -1 && input.ops[last_visit].start == input.ops[curr.A].start) { + // PASS. The same task. + npu_time = std::max(npu_time, this_task_finish_time); + } else { + quitif(npu_time > curr.T, _wa, "[Invalid Output] NPU is busy. Last NPU task finish at %llu. Op[%d] = (%s %llu %d)", + npu_time, i, curr.opName.c_str(), curr.T, curr.A); + npu_time = this_task_finish_time; + } + task_finish_at[curr.A] = this_task_finish_time; + last_visit = curr.A; + quitif(curr.T < input.ops[curr.A].start, _wa, "[Invalid Output] Task %d is not ready. Start time = %llu. Op[%d] = (%s %llu %d)", + curr.A, input.ops[curr.A].start, i, curr.opName.c_str(), curr.T, curr.A); + for (int j = input.ops[curr.A].addr; j < input.ops[curr.A].addr + input.ops[curr.A].size; j++) { + quitif(in_mem[j] == MEM_OFFLOAD, _wa, "[Invalid Output] Addr %d is not in memory. Op[%d] = (%s %llu %d)", + j, i, curr.opName.c_str(), curr.T, curr.A); + if (in_mem[j] == MEM_RELOAD || task_finish_at[in_mem[j]] < task_finish_at[curr.A]) { + in_mem[j] = curr.A; + } + } + } else if (curr.opName == "Offload") { + quitif(io_time > curr.T, _wa, "[Invalid Output] IO is busy. Last IO task finish at %llu. Op[%d] = (%s %llu %d %d)", + io_time, i, curr.opName.c_str(), curr.T, curr.A, curr.S); + int cnt_offmem = 0; + for (int j = curr.A; j < curr.A + curr.S; j++) { + if (in_mem[j] == MEM_OFFLOAD) { + continue; + } + if (in_mem[j] != MEM_RELOAD) { + quitif(curr.T < task_finish_at[in_mem[j]], _wa, "[Invalid Output] Addr %d is used by NPU task %d at T=%llu. Op[%d] = (%s %llu %d %d)", + j, in_mem[j], curr.T, i, curr.opName.c_str(), curr.T, curr.A, curr.S); + } + cnt_offmem++; + in_mem[j] = MEM_OFFLOAD; + } + use_mem -= cnt_offmem; + io_time = curr.T + multiple_IO * cnt_offmem; + } else if (curr.opName == "Fin") { + score = std::max(io_time, npu_time); + quitif(score > curr.T, _wa, "[Invalid Output] Output Fin, but not all the resources are freed. Last IO task finish at %llu, Last NPU task finish at %llu", + io_time, npu_time); + score = curr.T; + } + } + return score; +} + +int main(int argc, char *argv[]) +{ + setName("Global_Memory_Planning_for_LLM"); + registerTestlibCmd(argc, argv); + check_input(); + check_output(); + auto score = get_score(); + quitf(_ok, "All tasks finish at %llu", score); +} diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/infile.txt" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/infile.txt" new file mode 100644 index 0000000000000000000000000000000000000000..5a6c519379aab71a2bfe6c03c059b1173fd03072 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/infile.txt" @@ -0,0 +1,3 @@ +200 100 2 +0 100 0 30 +100 100 50 10 \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/outfile.txt" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/outfile.txt" new file mode 100644 index 0000000000000000000000000000000000000000..b036da4119d3692a7bd0210316310c5725d964a7 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/example/outfile.txt" @@ -0,0 +1,6 @@ +Reload 0 0 100 +Visit 4000 0 +Offload 4030 0 100 +Reload 8030 100 100 +Visit 12030 1 +Fin 12040 \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/testlib.h" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/testlib.h" new file mode 100644 index 0000000000000000000000000000000000000000..4e1d3682e1a0e7c2000ed9c2b24587062646fe91 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/checker/testlib.h" @@ -0,0 +1,6299 @@ +/* + * It is strictly recommended to include "testlib.h" before any other include + * in your code. In this case testlib overrides compiler specific "random()". + * + * If you can't compile your code and compiler outputs something about + * ambiguous call of "random_shuffle", "rand" or "srand" it means that + * you shouldn't use them. Use "shuffle", and "rnd.next()" instead of them + * because these calls produce stable result for any C++ compiler. Read + * sample generator sources for clarification. + * + * Please read the documentation for class "random_t" and use "rnd" instance in + * generators. Probably, these sample calls will be useful for you: + * rnd.next(); rnd.next(100); rnd.next(1, 2); + * rnd.next(3.14); rnd.next("[a-z]{1,100}"). + * + * Also read about wnext() to generate off-center random distribution. + * + * See https://github.com/MikeMirzayanov/testlib/ to get latest version or bug tracker. + */ + +#ifndef _TESTLIB_H_ +#define _TESTLIB_H_ + +/* + * Copyright (c) 2005-2024 + */ + +#define VERSION "0.9.44" + +/* + * Mike Mirzayanov + * + * This material is provided "as is", with absolutely no warranty expressed + * or implied. Any use is at your own risk. + * + * Permission to use or copy this software for any purpose is hereby granted + * without fee, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + +/* NOTE: This file contains testlib library for C++. + * + * Check, using testlib running format: + * check.exe [ [-appes]], + * If result file is specified it will contain results. + * + * Validator, using testlib running format: + * validator.exe < input.txt, + * It will return non-zero exit code and writes message to standard output. + * + * Generator, using testlib running format: + * gen.exe [parameter-1] [parameter-2] [... paramerter-n] + * You can write generated test(s) into standard output or into the file(s). + * + * Interactor, using testlib running format: + * interactor.exe [ [ [-appes]]], + * Reads test from inf (mapped to args[1]), writes result to tout (mapped to argv[2], + * can be judged by checker later), reads program output from ouf (mapped to stdin), + * writes output to program via stdout (use cout, printf, etc). + */ + +const char *latestFeatures[] = { + "Added ConstantBoundsLog, VariablesLog to validator testOverviewLogFile", + "Use setAppesModeEncoding to change xml encoding from windows-1251 to other", + "rnd.any/wany use distance/advance instead of -/+: now they support sets/multisets", + "Use syntax `int t = inf.readInt(1, 3, \"~t\");` to skip the lower bound check. Tildes can be used on either side or both: ~t, t~, ~t~", + "Supported EJUDGE support in registerTestlibCmd", + "Supported '--testMarkupFileName fn' and '--testCase tc/--testCaseFileName fn' for validators", + "Added opt defaults via opt(key/index, default_val); check unused opts when using has_opt or default opt (turn off this check with suppressEnsureNoUnusedOpt()).", + "For checker added --group and --testset command line params (like for validator), use checker.group() or checker.testset() to get values", + "Added quitpi(points_info, message) function to return with _points exit code 7 and given points_info", + "rnd.partition(size, sum[, min_part=1]) returns random (unsorted) partition which is a representation of the given `sum` as a sum of `size` positive integers (or >=min_part if specified)", + "rnd.distinct(size, n) and rnd.distinct(size, from, to)", + "opt(\"some_missing_key\") returns false now", + "has_opt(key)", + "Abort validator on validator.testset()/validator.group() if registered without using command line", + "Print integer range violations in a human readable way like `violates the range [1, 10^9]`", + "Opts supported: use them like n = opt(\"n\"), in a command line you can use an exponential notation", + "Reformatted", + "Use setTestCase(i) or unsetTestCase() to support test cases (you can use it in any type of program: generator, interactor, validator or checker)", + "Fixed issue #87: readStrictDouble accepts \"-0.00\"", + "Fixed issue #83: added InStream::quitif(condition, ...)", + "Fixed issue #79: fixed missed guard against repeated header include", + "Fixed issue #80: fixed UB in case of huge quitf message", + "Fixed issue #84: added readXs(size, indexBase = 1)", + "Fixed stringstream repeated usage issue", + "Fixed compilation in g++ (for std=c++03)", + "Batch of println functions (support collections, iterator ranges)", + "Introduced rnd.perm(size, first = 0) to generate a `first`-indexed permutation", + "Allow any whitespace in readInts-like functions for non-validators", + "Ignore 4+ command line arguments ifdef EJUDGE", + "Speed up of vtos", + "Show line number in validators in case of incorrect format", + "Truncate huge checker/validator/interactor message", + "Fixed issue with readTokenTo of very long tokens, now aborts with _pe/_fail depending of a stream type", + "Introduced InStream::ensure/ensuref checking a condition, returns wa/fail depending of a stream type", + "Fixed compilation in VS 2015+", + "Introduced space-separated read functions: readWords/readTokens, multilines read functions: readStrings/readLines", + "Introduced space-separated read functions: readInts/readIntegers/readLongs/readUnsignedLongs/readDoubles/readReals/readStrictDoubles/readStrictReals", + "Introduced split/tokenize functions to separate string by given char", + "Introduced InStream::readUnsignedLong and InStream::readLong with unsigned long long parameters", + "Supported --testOverviewLogFileName for validator: bounds hits + features", + "Fixed UB (sequence points) in random_t", + "POINTS_EXIT_CODE returned back to 7 (instead of 0)", + "Removed disable buffers for interactive problems, because it works unexpectedly in wine", + "InStream over string: constructor of InStream from base InStream to inherit policies and std::string", + "Added expectedButFound quit function, examples: expectedButFound(_wa, 10, 20), expectedButFound(_fail, ja, pa, \"[n=%d,m=%d]\", n, m)", + "Fixed incorrect interval parsing in patterns", + "Use registerGen(argc, argv, 1) to develop new generator, use registerGen(argc, argv, 0) to compile old generators (originally created for testlib under 0.8.7)", + "Introduced disableFinalizeGuard() to switch off finalization checkings", + "Use join() functions to format a range of items as a single string (separated by spaces or other separators)", + "Use -DENABLE_UNEXPECTED_EOF to enable special exit code (by default, 8) in case of unexpected eof. It is good idea to use it in interactors", + "Use -DUSE_RND_AS_BEFORE_087 to compile in compatibility mode with random behavior of versions before 0.8.7", + "Fixed bug with nan in stringToDouble", + "Fixed issue around overloads for size_t on x64", + "Added attribute 'points' to the XML output in case of result=_points", + "Exit codes can be customized via macros, e.g. -DPE_EXIT_CODE=14", + "Introduced InStream function readWordTo/readTokenTo/readStringTo/readLineTo for faster reading", + "Introduced global functions: format(), englishEnding(), upperCase(), lowerCase(), compress()", + "Manual buffer in InStreams, some IO speed improvements", + "Introduced quitif(bool, const char* pattern, ...) which delegates to quitf() in case of first argument is true", + "Introduced guard against missed quitf() in checker or readEof() in validators", + "Supported readStrictReal/readStrictDouble - to use in validators to check strictly float numbers", + "Supported registerInteraction(argc, argv)", + "Print checker message to the stderr instead of stdout", + "Supported TResult _points to output calculated score, use quitp(...) functions", + "Fixed to be compilable on Mac", + "PC_BASE_EXIT_CODE=50 in case of defined TESTSYS", + "Fixed issues 19-21, added __attribute__ format printf", + "Some bug fixes", + "ouf.readInt(1, 100) and similar calls return WA", + "Modified random_t to avoid integer overflow", + "Truncated checker output [patch by Stepan Gatilov]", + "Renamed class random -> class random_t", + "Supported name parameter for read-and-validation methods, like readInt(1, 2, \"n\")", + "Fixed bug in readDouble()", + "Improved ensuref(), fixed nextLine to work in case of EOF, added startTest()", + "Supported \"partially correct\", example: quitf(_pc(13), \"result=%d\", result)", + "Added shuffle(begin, end), use it instead of random_shuffle(begin, end)", + "Added readLine(const string& ptrn), fixed the logic of readLine() in the validation mode", + "Package extended with samples of generators and validators", + "Written the documentation for classes and public methods in testlib.h", + "Implemented random routine to support generators, use registerGen() to switch it on", + "Implemented strict mode to validate tests, use registerValidation() to switch it on", + "Now ncmp.cpp and wcmp.cpp are return WA if answer is suffix or prefix of the output", + "Added InStream::readLong() and removed InStream::readLongint()", + "Now no footer added to each report by default (use directive FOOTER to switch on)", + "Now every checker has a name, use setName(const char* format, ...) to set it", + "Now it is compatible with TTS (by Kittens Computing)", + "Added \'ensure(condition, message = \"\")\' feature, it works like assert()", + "Fixed compatibility with MS C++ 7.1", + "Added footer with exit code information", + "Added compatibility with EJUDGE (compile with EJUDGE directive)", + "Added compatibility with Contester (compile with CONTESTER directive)" +}; + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_WARNINGS +#define _CRT_NO_VA_START_VALIDATION +#endif + +/* Overrides random() for Borland C++. */ +#define random __random_deprecated +#include +#include +#include +#include +#undef random + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef TESTLIB_THROW_EXIT_EXCEPTION_INSTEAD_OF_EXIT +# include +#endif + +#if (_WIN32 || __WIN32__ || __WIN32 || _WIN64 || __WIN64__ || __WIN64 || WINNT || __WINNT || __WINNT__ || __CYGWIN__) +# if !defined(_MSC_VER) || _MSC_VER > 1400 +# define NOMINMAX 1 +# include +# else +# define WORD unsigned short +# include +# endif +# include +# define ON_WINDOWS +# if defined(_MSC_VER) && _MSC_VER > 1400 +# pragma warning( disable : 4127 ) +# pragma warning( disable : 4146 ) +# pragma warning( disable : 4458 ) +# endif +#else +# define WORD unsigned short +# include +#endif + +#if defined(FOR_WINDOWS) && defined(FOR_LINUX) +#error Only one target system is allowed +#endif + +#ifndef LLONG_MIN +#define LLONG_MIN (-9223372036854775807LL - 1) +#endif + +#ifndef ULLONG_MAX +#define ULLONG_MAX (18446744073709551615) +#endif + +#define LF ((char)10) +#define CR ((char)13) +#define TAB ((char)9) +#define SPACE ((char)' ') +#define EOFC (255) + +#ifndef OK_EXIT_CODE +# ifdef CONTESTER +# define OK_EXIT_CODE 0xAC +# else +# define OK_EXIT_CODE 0 +# endif +#endif + +#ifndef WA_EXIT_CODE +# ifdef EJUDGE +# define WA_EXIT_CODE 5 +# elif defined(CONTESTER) +# define WA_EXIT_CODE 0xAB +# else +# define WA_EXIT_CODE 1 +# endif +#endif + +#ifndef PE_EXIT_CODE +# ifdef EJUDGE +# define PE_EXIT_CODE 4 +# elif defined(CONTESTER) +# define PE_EXIT_CODE 0xAA +# else +# define PE_EXIT_CODE 2 +# endif +#endif + +#ifndef FAIL_EXIT_CODE +# ifdef EJUDGE +# define FAIL_EXIT_CODE 6 +# elif defined(CONTESTER) +# define FAIL_EXIT_CODE 0xA3 +# else +# define FAIL_EXIT_CODE 3 +# endif +#endif + +#ifndef DIRT_EXIT_CODE +# ifdef EJUDGE +# define DIRT_EXIT_CODE 6 +# else +# define DIRT_EXIT_CODE 4 +# endif +#endif + +#ifndef POINTS_EXIT_CODE +# define POINTS_EXIT_CODE 7 +#endif + +#ifndef UNEXPECTED_EOF_EXIT_CODE +# define UNEXPECTED_EOF_EXIT_CODE 8 +#endif + +#ifndef PC_BASE_EXIT_CODE +# ifdef TESTSYS +# define PC_BASE_EXIT_CODE 50 +# else +# define PC_BASE_EXIT_CODE 0 +# endif +#endif + +#ifdef __GNUC__ +# define __TESTLIB_STATIC_ASSERT(condition) typedef void* __testlib_static_assert_type[(condition) ? 1 : -1] __attribute__((unused)) +#else +# define __TESTLIB_STATIC_ASSERT(condition) typedef void* __testlib_static_assert_type[(condition) ? 1 : -1] +#endif + +#ifdef ON_WINDOWS +#define I64 "%I64d" +#define U64 "%I64u" +#else +#define I64 "%lld" +#define U64 "%llu" +#endif + +#ifdef _MSC_VER +# define NORETURN __declspec(noreturn) +#elif defined __GNUC__ +# define NORETURN __attribute__ ((noreturn)) +#else +# define NORETURN +#endif + +static char __testlib_format_buffer[16777216]; +static int __testlib_format_buffer_usage_count = 0; + +#define FMT_TO_RESULT(fmt, cstr, result) std::string result; \ + if (__testlib_format_buffer_usage_count != 0) \ + __testlib_fail("FMT_TO_RESULT::__testlib_format_buffer_usage_count != 0"); \ + __testlib_format_buffer_usage_count++; \ + va_list ap; \ + va_start(ap, fmt); \ + vsnprintf(__testlib_format_buffer, sizeof(__testlib_format_buffer), cstr, ap); \ + va_end(ap); \ + __testlib_format_buffer[sizeof(__testlib_format_buffer) - 1] = 0; \ + result = std::string(__testlib_format_buffer); \ + __testlib_format_buffer_usage_count--; \ + +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +std::string testlib_format_(const char *fmt, ...); +std::string testlib_format_(const std::string fmt, ...); + +const long long __TESTLIB_LONGLONG_MAX = 9223372036854775807LL; +const int __TESTLIB_MAX_TEST_CASE = 1073741823; + +int __testlib_exitCode; + +bool __testlib_hasTestCase; +int __testlib_testCase = -1; + +void setTestCase(int testCase); + +void unsetTestCase() { + __testlib_hasTestCase = false; + __testlib_testCase = -1; +} + +NORETURN static void __testlib_fail(const std::string &message); + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +static inline T __testlib_abs(const T &x) { + return x > 0 ? x : -x; +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +static inline T __testlib_min(const T &a, const T &b) { + return a < b ? a : b; +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +static inline T __testlib_max(const T &a, const T &b) { + return a > b ? a : b; +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +static inline T __testlib_crop(T value, T a, T b) { + return __testlib_min(__testlib_max(value, a), --b); +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +static inline double __testlib_crop(double value, double a, double b) { + value = __testlib_min(__testlib_max(value, a), b); + if (value >= b) + value = std::nexttoward(b, a); + return value; +} + +static bool __testlib_prelimIsNaN(double r) { + volatile double ra = r; +#ifndef __BORLANDC__ + return ((ra != ra) == true) && ((ra == ra) == false) && ((1.0 > ra) == false) && ((1.0 < ra) == false); +#else + return std::_isnan(ra); +#endif +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +static std::string removeDoubleTrailingZeroes(std::string value) { + while (!value.empty() && value[value.length() - 1] == '0' && value.find('.') != std::string::npos) + value = value.substr(0, value.length() - 1); + if (!value.empty() && value[value.length() - 1] == '.') + return value + '0'; + else + return value; +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline std::string upperCase(std::string s) { + for (size_t i = 0; i < s.length(); i++) + if ('a' <= s[i] && s[i] <= 'z') + s[i] = char(s[i] - 'a' + 'A'); + return s; +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline std::string lowerCase(std::string s) { + for (size_t i = 0; i < s.length(); i++) + if ('A' <= s[i] && s[i] <= 'Z') + s[i] = char(s[i] - 'A' + 'a'); + return s; +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +static std::string __testlib_part(const std::string &s); + +static bool __testlib_isNaN(double r) { + __TESTLIB_STATIC_ASSERT(sizeof(double) == sizeof(long long)); + volatile double ra = r; + long long llr1, llr2; + std::memcpy((void *) &llr1, (void *) &ra, sizeof(double)); + ra = -ra; + std::memcpy((void *) &llr2, (void *) &ra, sizeof(double)); + long long llnan = 0xFFF8000000000000LL; + return __testlib_prelimIsNaN(r) || llnan == llr1 || llnan == llr2; +} + +static double __testlib_nan() { + __TESTLIB_STATIC_ASSERT(sizeof(double) == sizeof(long long)); +#ifndef NAN + long long llnan = 0xFFF8000000000000LL; + double nan; + std::memcpy(&nan, &llnan, sizeof(double)); + return nan; +#else + return NAN; +#endif +} + +static bool __testlib_isInfinite(double r) { + volatile double ra = r; + return (ra > 1E300 || ra < -1E300); +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline bool doubleCompare(double expected, double result, double MAX_DOUBLE_ERROR) { + MAX_DOUBLE_ERROR += 1E-15; + if (__testlib_isNaN(expected)) { + return __testlib_isNaN(result); + } else if (__testlib_isInfinite(expected)) { + if (expected > 0) { + return result > 0 && __testlib_isInfinite(result); + } else { + return result < 0 && __testlib_isInfinite(result); + } + } else if (__testlib_isNaN(result) || __testlib_isInfinite(result)) { + return false; + } else if (__testlib_abs(result - expected) <= MAX_DOUBLE_ERROR) { + return true; + } else { + double minv = __testlib_min(expected * (1.0 - MAX_DOUBLE_ERROR), + expected * (1.0 + MAX_DOUBLE_ERROR)); + double maxv = __testlib_max(expected * (1.0 - MAX_DOUBLE_ERROR), + expected * (1.0 + MAX_DOUBLE_ERROR)); + return result >= minv && result <= maxv; + } +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline double doubleDelta(double expected, double result) { + double absolute = __testlib_abs(result - expected); + + if (__testlib_abs(expected) > 1E-9) { + double relative = __testlib_abs(absolute / expected); + return __testlib_min(absolute, relative); + } else + return absolute; +} + +/** It does nothing on non-windows and files differ from stdin/stdout/stderr. */ +static void __testlib_set_binary(std::FILE *file) { + if (NULL != file) { +#ifdef ON_WINDOWS +# ifdef _O_BINARY + if (stdin == file) +# ifdef STDIN_FILENO + return void(_setmode(STDIN_FILENO, _O_BINARY)); +# else + return void(_setmode(_fileno(stdin), _O_BINARY)); +# endif + if (stdout == file) +# ifdef STDOUT_FILENO + return void(_setmode(STDOUT_FILENO, _O_BINARY)); +# else + return void(_setmode(_fileno(stdout), _O_BINARY)); +# endif + if (stderr == file) +# ifdef STDERR_FILENO + return void(_setmode(STDERR_FILENO, _O_BINARY)); +# else + return void(_setmode(_fileno(stderr), _O_BINARY)); +# endif +# elif O_BINARY + if (stdin == file) +# ifdef STDIN_FILENO + return void(setmode(STDIN_FILENO, O_BINARY)); +# else + return void(setmode(fileno(stdin), O_BINARY)); +# endif + if (stdout == file) +# ifdef STDOUT_FILENO + return void(setmode(STDOUT_FILENO, O_BINARY)); +# else + return void(setmode(fileno(stdout), O_BINARY)); +# endif + if (stderr == file) +# ifdef STDERR_FILENO + return void(setmode(STDERR_FILENO, O_BINARY)); +# else + return void(setmode(fileno(stderr), O_BINARY)); +# endif +# endif +#endif + } +} + +#if __cplusplus > 199711L || defined(_MSC_VER) +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +static std::string vtos(const T &t, std::true_type) { + if (t == 0) + return "0"; + else { + T n(t); + bool negative = n < 0; + std::string s; + while (n != 0) { + T digit = n % 10; + if (digit < 0) + digit = -digit; + s += char('0' + digit); + n /= 10; + } + std::reverse(s.begin(), s.end()); + return negative ? "-" + s : s; + } +} + +template +static std::string vtos(const T &t, std::false_type) { + std::string s; + static std::stringstream ss; + ss.str(std::string()); + ss.clear(); + ss << t; + ss >> s; + return s; +} + +template +static std::string vtos(const T &t) { + return vtos(t, std::is_integral()); +} + +/* signed case. */ +template +static std::string toHumanReadableString(const T &n, std::false_type) { + if (n == 0) + return vtos(n); + int trailingZeroCount = 0; + T n_ = n; + while (n_ % 10 == 0) + n_ /= 10, trailingZeroCount++; + if (trailingZeroCount >= 7) { + if (n_ == 1) + return "10^" + vtos(trailingZeroCount); + else if (n_ == -1) + return "-10^" + vtos(trailingZeroCount); + else + return vtos(n_) + "*10^" + vtos(trailingZeroCount); + } else + return vtos(n); +} + +/* unsigned case. */ +template +static std::string toHumanReadableString(const T &n, std::true_type) { + if (n == 0) + return vtos(n); + int trailingZeroCount = 0; + T n_ = n; + while (n_ % 10 == 0) + n_ /= 10, trailingZeroCount++; + if (trailingZeroCount >= 7) { + if (n_ == 1) + return "10^" + vtos(trailingZeroCount); + else + return vtos(n_) + "*10^" + vtos(trailingZeroCount); + } else + return vtos(n); +} + +template +static std::string toHumanReadableString(const T &n) { + return toHumanReadableString(n, std::is_unsigned()); +} +#else +template +static std::string vtos(const T& t) +{ + std::string s; + static std::stringstream ss; + ss.str(std::string()); + ss.clear(); + ss << t; + ss >> s; + return s; +} + +template +static std::string toHumanReadableString(const T &n) { + return vtos(n); +} +#endif + +template +static std::string toString(const T &t) { + return vtos(t); +} + +#if __cplusplus > 199711L || defined(_MSC_VER) +/* opts */ +void prepareOpts(int argc, char* argv[]); +#endif + +FILE* testlib_fopen_(const char* path, const char* mode) { +#ifdef _MSC_VER + FILE* result = NULL; + if (fopen_s(&result, path, mode) != 0) + return NULL; + else + return result; +#else + return std::fopen(path, mode); +#endif +} + +FILE* testlib_freopen_(const char* path, const char* mode, FILE* file) { +#ifdef _MSC_VER + FILE* result = NULL; + if (freopen_s(&result, path, mode, file) != 0) + return NULL; + else + return result; +#else + return std::freopen(path, mode, file); +#endif +} + +/* + * Very simple regex-like pattern. + * It used for two purposes: validation and generation. + * + * For example, pattern("[a-z]{1,5}").next(rnd) will return + * random string from lowercase latin letters with length + * from 1 to 5. It is easier to call rnd.next("[a-z]{1,5}") + * for the same effect. + * + * Another samples: + * "mike|john" will generate (match) "mike" or "john"; + * "-?[1-9][0-9]{0,3}" will generate (match) non-zero integers from -9999 to 9999; + * "id-([ac]|b{2})" will generate (match) "id-a", "id-bb", "id-c"; + * "[^0-9]*" will match sequences (empty or non-empty) without digits, you can't + * use it for generations. + * + * You can't use pattern for generation if it contains meta-symbol '*'. Also it + * is not recommended to use it for char-sets with meta-symbol '^' like [^a-z]. + * + * For matching very simple greedy algorithm is used. For example, pattern + * "[0-9]?1" will not match "1", because of greedy nature of matching. + * Alternations (meta-symbols "|") are processed with brute-force algorithm, so + * do not use many alternations in one expression. + * + * If you want to use one expression many times it is better to compile it into + * a single pattern like "pattern p("[a-z]+")". Later you can use + * "p.matches(std::string s)" or "p.next(random_t& rd)" to check matching or generate + * new string by pattern. + * + * Simpler way to read token and check it for pattern matching is "inf.readToken("[a-z]+")". + * + * All spaces are ignored in regex, unless escaped with \. For example, ouf.readLine("NO SOLUTION") + * will expect "NOSOLUTION", the correct call should be ouf.readLine("NO\\ SOLUTION") or + * ouf.readLine(R"(NO\ SOLUTION)") if you prefer raw string literals from C++11. + */ +class random_t; + +class pattern { +public: + /* Create pattern instance by string. */ + pattern(std::string s); + + /* Generate new string by pattern and given random_t. */ + std::string next(random_t &rnd) const; + + /* Checks if given string match the pattern. */ + bool matches(const std::string &s) const; + + /* Returns source string of the pattern. */ + std::string src() const; + +private: + bool matches(const std::string &s, size_t pos) const; + + std::string s; + std::vector children; + std::vector chars; + int from; + int to; +}; + +/* + * Use random_t instances to generate random values. It is preferred + * way to use randoms instead of rand() function or self-written + * randoms. + * + * Testlib defines global variable "rnd" of random_t class. + * Use registerGen(argc, argv, 1) to setup random_t seed be command + * line (to use latest random generator version). + * + * Random generates uniformly distributed values if another strategy is + * not specified explicitly. + */ +class random_t { +private: + unsigned long long seed; + static const unsigned long long multiplier; + static const unsigned long long addend; + static const unsigned long long mask; + static const int lim; + + long long nextBits(int bits) { + if (bits <= 48) { + seed = (seed * multiplier + addend) & mask; + return (long long) (seed >> (48 - bits)); + } else { + if (bits > 63) + __testlib_fail("random_t::nextBits(int bits): n must be less than 64"); + + int lowerBitCount = (random_t::version == 0 ? 31 : 32); + + long long left = (nextBits(31) << 32); + long long right = nextBits(lowerBitCount); + + return left ^ right; + } + } + +public: + static int version; + + /* New random_t with fixed seed. */ + random_t() + : seed(3905348978240129619LL) { + } + + /* Sets seed by command line. */ + void setSeed(int argc, char *argv[]) { + random_t p; + + seed = 3905348978240129619LL; + for (int i = 1; i < argc; i++) { + std::size_t le = std::strlen(argv[i]); + for (std::size_t j = 0; j < le; j++) + seed = seed * multiplier + (unsigned int) (argv[i][j]) + addend; + seed += multiplier / addend; + } + + seed = seed & mask; + } + + /* Sets seed by given value. */ + void setSeed(long long _seed) { + seed = (unsigned long long) _seed; + seed = (seed ^ multiplier) & mask; + } + +#ifndef __BORLANDC__ + + /* Random string value by given pattern (see pattern documentation). */ + std::string next(const std::string &ptrn) { + pattern p(ptrn); + return p.next(*this); + } + +#else + /* Random string value by given pattern (see pattern documentation). */ + std::string next(std::string ptrn) + { + pattern p(ptrn); + return p.next(*this); + } +#endif + + /* Random value in range [0, n-1]. */ + int next(int n) { + if (n <= 0) + __testlib_fail("random_t::next(int n): n must be positive"); + + if ((n & -n) == n) // n is a power of 2 + return (int) ((n * (long long) nextBits(31)) >> 31); + + const long long limit = INT_MAX / n * n; + + long long bits; + do { + bits = nextBits(31); + } while (bits >= limit); + + return int(bits % n); + } + + /* Random value in range [0, n-1]. */ + unsigned int next(unsigned int n) { + if (n >= INT_MAX) + __testlib_fail("random_t::next(unsigned int n): n must be less INT_MAX"); + return (unsigned int) next(int(n)); + } + + /* Random value in range [0, n-1]. */ + long long next(long long n) { + if (n <= 0) + __testlib_fail("random_t::next(long long n): n must be positive"); + + const long long limit = __TESTLIB_LONGLONG_MAX / n * n; + + long long bits; + do { + bits = nextBits(63); + } while (bits >= limit); + + return bits % n; + } + + /* Random value in range [0, n-1]. */ + unsigned long long next(unsigned long long n) { + if (n >= (unsigned long long) (__TESTLIB_LONGLONG_MAX)) + __testlib_fail("random_t::next(unsigned long long n): n must be less LONGLONG_MAX"); + return (unsigned long long) next((long long) (n)); + } + + /* Random value in range [0, n-1]. */ + long next(long n) { + return (long) next((long long) (n)); + } + + /* Random value in range [0, n-1]. */ + unsigned long next(unsigned long n) { + if (n >= (unsigned long) (LONG_MAX)) + __testlib_fail("random_t::next(unsigned long n): n must be less LONG_MAX"); + return (unsigned long) next((unsigned long long) (n)); + } + + /* Returns random value in range [from,to]. */ + int next(int from, int to) { + return int(next((long long) to - from + 1) + from); + } + + /* Returns random value in range [from,to]. */ + unsigned int next(unsigned int from, unsigned int to) { + return (unsigned int) (next((long long) to - from + 1) + from); + } + + /* Returns random value in range [from,to]. */ + long long next(long long from, long long to) { + return next(to - from + 1) + from; + } + + /* Returns random value in range [from,to]. */ + unsigned long long next(unsigned long long from, unsigned long long to) { + if (from > to) + __testlib_fail("random_t::next(unsigned long long from, unsigned long long to): from can't not exceed to"); + return next(to - from + 1) + from; + } + + /* Returns random value in range [from,to]. */ + long next(long from, long to) { + return next(to - from + 1) + from; + } + + /* Returns random value in range [from,to]. */ + unsigned long next(unsigned long from, unsigned long to) { + if (from > to) + __testlib_fail("random_t::next(unsigned long from, unsigned long to): from can't not exceed to"); + return next(to - from + 1) + from; + } + + /* Random double value in range [0, 1). */ + double next() { + long long left = ((long long) (nextBits(26)) << 27); + long long right = nextBits(27); + return __testlib_crop((double) (left + right) / (double) (1LL << 53), 0.0, 1.0); + } + + /* Random double value in range [0, n). */ + double next(double n) { + if (n <= 0.0) + __testlib_fail("random_t::next(double): n should be positive"); + return __testlib_crop(n * next(), 0.0, n); + } + + /* Random double value in range [from, to). */ + double next(double from, double to) { + if (from >= to) + __testlib_fail("random_t::next(double from, double to): from should be strictly less than to"); + return next(to - from) + from; + } + + /* Returns random element from container. */ + template + typename Container::value_type any(const Container &c) { + int size = int(c.size()); + if (size <= 0) + __testlib_fail("random_t::any(const Container& c): c.size() must be positive"); + typename Container::const_iterator it = c.begin(); + std::advance(it, next(size)); + return *it; + } + + /* Returns random element from iterator range. */ + template + typename Iter::value_type any(const Iter &begin, const Iter &end) { + int size = static_cast(std::distance(begin, end)); + if (size <= 0) + __testlib_fail("random_t::any(const Iter& begin, const Iter& end): range must have positive length"); + Iter it = begin; + std::advance(it, next(size)); + return *it; + } + + /* Random string value by given pattern (see pattern documentation). */ +#ifdef __GNUC__ + __attribute__ ((format (printf, 2, 3))) +#endif + std::string next(const char *format, ...) { + FMT_TO_RESULT(format, format, ptrn); + return next(ptrn); + } + + /* + * Weighted next. If type == 0 than it is usual "next()". + * + * If type = 1, than it returns "max(next(), next())" + * (the number of "max" functions equals to "type"). + * + * If type < 0, than "max" function replaces with "min". + */ + int wnext(int n, int type) { + if (n <= 0) + __testlib_fail("random_t::wnext(int n, int type): n must be positive"); + + if (abs(type) < random_t::lim) { + int result = next(n); + + for (int i = 0; i < +type; i++) + result = __testlib_max(result, next(n)); + + for (int i = 0; i < -type; i++) + result = __testlib_min(result, next(n)); + + return result; + } else { + double p; + + if (type > 0) + p = std::pow(next() + 0.0, 1.0 / (type + 1)); + else + p = 1 - std::pow(next() + 0.0, 1.0 / (-type + 1)); + + return __testlib_crop((int) (double(n) * p), 0, n); + } + } + + /* See wnext(int, int). It uses the same algorithms. */ + long long wnext(long long n, int type) { + if (n <= 0) + __testlib_fail("random_t::wnext(long long n, int type): n must be positive"); + + if (abs(type) < random_t::lim) { + long long result = next(n); + + for (int i = 0; i < +type; i++) + result = __testlib_max(result, next(n)); + + for (int i = 0; i < -type; i++) + result = __testlib_min(result, next(n)); + + return result; + } else { + double p; + + if (type > 0) + p = std::pow(next() + 0.0, 1.0 / (type + 1)); + else + p = 1 - std::pow(next() + 0.0, 1.0 / (-type + 1)); + + return __testlib_crop((long long) (double(n) * p), 0LL, n); + } + } + + /* Returns value in [0, n). See wnext(int, int). It uses the same algorithms. */ + double wnext(double n, int type) { + if (n <= 0) + __testlib_fail("random_t::wnext(double n, int type): n must be positive"); + + if (abs(type) < random_t::lim) { + double result = next(); + + for (int i = 0; i < +type; i++) + result = __testlib_max(result, next()); + + for (int i = 0; i < -type; i++) + result = __testlib_min(result, next()); + + return n * result; + } else { + double p; + + if (type > 0) + p = std::pow(next() + 0.0, 1.0 / (type + 1)); + else + p = 1 - std::pow(next() + 0.0, 1.0 / (-type + 1)); + + return __testlib_crop(n * p, 0.0, n); + } + } + + /* Returns value in [0, 1). See wnext(int, int). It uses the same algorithms. */ + double wnext(int type) { + return wnext(1.0, type); + } + + /* See wnext(int, int). It uses the same algorithms. */ + unsigned int wnext(unsigned int n, int type) { + if (n >= INT_MAX) + __testlib_fail("random_t::wnext(unsigned int n, int type): n must be less INT_MAX"); + return (unsigned int) wnext(int(n), type); + } + + /* See wnext(int, int). It uses the same algorithms. */ + unsigned long long wnext(unsigned long long n, int type) { + if (n >= (unsigned long long) (__TESTLIB_LONGLONG_MAX)) + __testlib_fail("random_t::wnext(unsigned long long n, int type): n must be less LONGLONG_MAX"); + + return (unsigned long long) wnext((long long) (n), type); + } + + /* See wnext(int, int). It uses the same algorithms. */ + long wnext(long n, int type) { + return (long) wnext((long long) (n), type); + } + + /* See wnext(int, int). It uses the same algorithms. */ + unsigned long wnext(unsigned long n, int type) { + if (n >= (unsigned long) (LONG_MAX)) + __testlib_fail("random_t::wnext(unsigned long n, int type): n must be less LONG_MAX"); + + return (unsigned long) wnext((unsigned long long) (n), type); + } + + /* Returns weighted random value in range [from, to]. */ + int wnext(int from, int to, int type) { + if (from > to) + __testlib_fail("random_t::wnext(int from, int to, int type): from can't not exceed to"); + return wnext(to - from + 1, type) + from; + } + + /* Returns weighted random value in range [from, to]. */ + int wnext(unsigned int from, unsigned int to, int type) { + if (from > to) + __testlib_fail("random_t::wnext(unsigned int from, unsigned int to, int type): from can't not exceed to"); + return int(wnext(to - from + 1, type) + from); + } + + /* Returns weighted random value in range [from, to]. */ + long long wnext(long long from, long long to, int type) { + if (from > to) + __testlib_fail("random_t::wnext(long long from, long long to, int type): from can't not exceed to"); + return wnext(to - from + 1, type) + from; + } + + /* Returns weighted random value in range [from, to]. */ + unsigned long long wnext(unsigned long long from, unsigned long long to, int type) { + if (from > to) + __testlib_fail( + "random_t::wnext(unsigned long long from, unsigned long long to, int type): from can't not exceed to"); + return wnext(to - from + 1, type) + from; + } + + /* Returns weighted random value in range [from, to]. */ + long wnext(long from, long to, int type) { + if (from > to) + __testlib_fail("random_t::wnext(long from, long to, int type): from can't not exceed to"); + return wnext(to - from + 1, type) + from; + } + + /* Returns weighted random value in range [from, to]. */ + unsigned long wnext(unsigned long from, unsigned long to, int type) { + if (from > to) + __testlib_fail("random_t::wnext(unsigned long from, unsigned long to, int type): from can't not exceed to"); + return wnext(to - from + 1, type) + from; + } + + /* Returns weighted random double value in range [from, to). */ + double wnext(double from, double to, int type) { + if (from >= to) + __testlib_fail("random_t::wnext(double from, double to, int type): from should be strictly less than to"); + return wnext(to - from, type) + from; + } + + /* Returns weighted random element from container. */ + template + typename Container::value_type wany(const Container &c, int type) { + int size = int(c.size()); + if (size <= 0) + __testlib_fail("random_t::wany(const Container& c, int type): c.size() must be positive"); + typename Container::const_iterator it = c.begin(); + std::advance(it, wnext(size, type)); + return *it; + } + + /* Returns weighted random element from iterator range. */ + template + typename Iter::value_type wany(const Iter &begin, const Iter &end, int type) { + int size = static_cast(std::distance(begin, end)); + if (size <= 0) + __testlib_fail( + "random_t::any(const Iter& begin, const Iter& end, int type): range must have positive length"); + Iter it = begin; + std::advance(it, wnext(size, type)); + return *it; + } + + /* Returns random permutation of the given size (values are between `first` and `first`+size-1)*/ + template + std::vector perm(T size, E first) { + if (size < 0) + __testlib_fail("random_t::perm(T size, E first = 0): size must non-negative"); + else if (size == 0) + return std::vector(); + std::vector p(size); + E current = first; + for (T i = 0; i < size; i++) + p[i] = current++; + if (size > 1) + for (T i = 1; i < size; i++) + std::swap(p[i], p[next(i + 1)]); + return p; + } + + /* Returns random permutation of the given size (values are between 0 and size-1)*/ + template + std::vector perm(T size) { + return perm(size, T(0)); + } + + /* Returns `size` unordered (unsorted) distinct numbers between `from` and `to`. */ + template + std::vector distinct(int size, T from, T to) { + std::vector result; + if (size == 0) + return result; + + if (from > to) + __testlib_fail("random_t::distinct expected from <= to"); + + if (size < 0) + __testlib_fail("random_t::distinct expected size >= 0"); + + uint64_t n = to - from + 1; + if (uint64_t(size) > n) + __testlib_fail("random_t::distinct expected size <= to - from + 1"); + + double expected = 0.0; + for (int i = 1; i <= size; i++) + expected += double(n) / double(n - i + 1); + + if (expected < double(n)) { + std::set vals; + while (int(vals.size()) < size) { + T x = T(next(from, to)); + if (vals.insert(x).second) + result.push_back(x); + } + } else { + if (n > 1000000000) + __testlib_fail("random_t::distinct here expected to - from + 1 <= 1000000000"); + std::vector p(perm(int(n), from)); + result.insert(result.end(), p.begin(), p.begin() + size); + } + + return result; + } + + /* Returns `size` unordered (unsorted) distinct numbers between `0` and `upper`-1. */ + template + std::vector distinct(int size, T upper) { + if (size < 0) + __testlib_fail("random_t::distinct expected size >= 0"); + if (size == 0) + return std::vector(); + + if (upper <= 0) + __testlib_fail("random_t::distinct expected upper > 0"); + if (size > upper) + __testlib_fail("random_t::distinct expected size <= upper"); + + return distinct(size, T(0), upper - 1); + } + + /* Returns random (unsorted) partition which is a representation of sum as a sum of integers not less than min_part. */ + template + std::vector partition(int size, T sum, T min_part) { + if (size < 0) + __testlib_fail("random_t::partition: size < 0"); + if (size == 0 && sum != 0) + __testlib_fail("random_t::partition: size == 0 && sum != 0"); + if (min_part * size > sum) + __testlib_fail("random_t::partition: min_part * size > sum"); + if (size == 0 && sum == 0) + return std::vector(); + + T sum_ = sum; + sum -= min_part * size; + + std::vector septums(size); + std::vector d = distinct(size - 1, T(1), T(sum + size - 1)); + for (int i = 0; i + 1 < size; i++) + septums[i + 1] = d[i]; + sort(septums.begin(), septums.end()); + + std::vector result(size); + for (int i = 0; i + 1 < size; i++) + result[i] = septums[i + 1] - septums[i] - 1; + result[size - 1] = sum + size - 1 - septums.back(); + + for (std::size_t i = 0; i < result.size(); i++) + result[i] += min_part; + + T result_sum = 0; + for (std::size_t i = 0; i < result.size(); i++) + result_sum += result[i]; + if (result_sum != sum_) + __testlib_fail("random_t::partition: partition sum is expected to be the given sum"); + + if (*std::min_element(result.begin(), result.end()) < min_part) + __testlib_fail("random_t::partition: partition min is expected to be no less than the given min_part"); + + if (int(result.size()) != size || result.size() != (size_t) size) + __testlib_fail("random_t::partition: partition size is expected to be equal to the given size"); + + return result; + } + + /* Returns random (unsorted) partition which is a representation of sum as a sum of positive integers. */ + template + std::vector partition(int size, T sum) { + return partition(size, sum, T(1)); + } +}; + +const int random_t::lim = 25; +const unsigned long long random_t::multiplier = 0x5DEECE66DLL; +const unsigned long long random_t::addend = 0xBLL; +const unsigned long long random_t::mask = (1LL << 48) - 1; +int random_t::version = -1; + +/* Pattern implementation */ +bool pattern::matches(const std::string &s) const { + return matches(s, 0); +} + +static bool __pattern_isSlash(const std::string &s, size_t pos) { + return s[pos] == '\\'; +} + +#ifdef __GNUC__ +__attribute__((pure)) +#endif +static bool __pattern_isCommandChar(const std::string &s, size_t pos, char value) { + if (pos >= s.length()) + return false; + + int slashes = 0; + + int before = int(pos) - 1; + while (before >= 0 && s[before] == '\\') + before--, slashes++; + + return slashes % 2 == 0 && s[pos] == value; +} + +static char __pattern_getChar(const std::string &s, size_t &pos) { + if (__pattern_isSlash(s, pos)) + pos += 2; + else + pos++; + + return s[pos - 1]; +} + +#ifdef __GNUC__ +__attribute__((pure)) +#endif +static int __pattern_greedyMatch(const std::string &s, size_t pos, const std::vector chars) { + int result = 0; + + while (pos < s.length()) { + char c = s[pos++]; + if (!std::binary_search(chars.begin(), chars.end(), c)) + break; + else + result++; + } + + return result; +} + +std::string pattern::src() const { + return s; +} + +bool pattern::matches(const std::string &s, size_t pos) const { + std::string result; + + if (to > 0) { + int size = __pattern_greedyMatch(s, pos, chars); + if (size < from) + return false; + if (size > to) + size = to; + pos += size; + } + + if (children.size() > 0) { + for (size_t child = 0; child < children.size(); child++) + if (children[child].matches(s, pos)) + return true; + return false; + } else + return pos == s.length(); +} + +std::string pattern::next(random_t &rnd) const { + std::string result; + result.reserve(20); + + if (to == INT_MAX) + __testlib_fail("pattern::next(random_t& rnd): can't process character '*' for generation"); + + if (to > 0) { + int count = rnd.next(to - from + 1) + from; + for (int i = 0; i < count; i++) + result += chars[rnd.next(int(chars.size()))]; + } + + if (children.size() > 0) { + int child = rnd.next(int(children.size())); + result += children[child].next(rnd); + } + + return result; +} + +static void __pattern_scanCounts(const std::string &s, size_t &pos, int &from, int &to) { + if (pos >= s.length()) { + from = to = 1; + return; + } + + if (__pattern_isCommandChar(s, pos, '{')) { + std::vector parts; + std::string part; + + pos++; + + while (pos < s.length() && !__pattern_isCommandChar(s, pos, '}')) { + if (__pattern_isCommandChar(s, pos, ',')) + parts.push_back(part), part = "", pos++; + else + part += __pattern_getChar(s, pos); + } + + if (part != "") + parts.push_back(part); + + if (!__pattern_isCommandChar(s, pos, '}')) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + pos++; + + if (parts.size() < 1 || parts.size() > 2) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + std::vector numbers; + + for (size_t i = 0; i < parts.size(); i++) { + if (parts[i].length() == 0) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + int number; +#ifdef _MSC_VER + if (sscanf_s(parts[i].c_str(), "%d", &number) != 1) +#else + if (std::sscanf(parts[i].c_str(), "%d", &number) != 1) +#endif + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + numbers.push_back(number); + } + + if (numbers.size() == 1) + from = to = numbers[0]; + else + from = numbers[0], to = numbers[1]; + + if (from > to) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + } else { + if (__pattern_isCommandChar(s, pos, '?')) { + from = 0, to = 1, pos++; + return; + } + + if (__pattern_isCommandChar(s, pos, '*')) { + from = 0, to = INT_MAX, pos++; + return; + } + + if (__pattern_isCommandChar(s, pos, '+')) { + from = 1, to = INT_MAX, pos++; + return; + } + + from = to = 1; + } +} + +static std::vector __pattern_scanCharSet(const std::string &s, size_t &pos) { + if (pos >= s.length()) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + std::vector result; + + if (__pattern_isCommandChar(s, pos, '[')) { + pos++; + bool negative = __pattern_isCommandChar(s, pos, '^'); + if (negative) + pos++; + + char prev = 0; + + while (pos < s.length() && !__pattern_isCommandChar(s, pos, ']')) { + if (__pattern_isCommandChar(s, pos, '-') && prev != 0) { + pos++; + + if (pos + 1 == s.length() || __pattern_isCommandChar(s, pos, ']')) { + result.push_back(prev); + prev = '-'; + continue; + } + + char next = __pattern_getChar(s, pos); + if (prev > next) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + for (char c = prev; c != next; c++) + result.push_back(c); + result.push_back(next); + + prev = 0; + } else { + if (prev != 0) + result.push_back(prev); + prev = __pattern_getChar(s, pos); + } + } + + if (prev != 0) + result.push_back(prev); + + if (!__pattern_isCommandChar(s, pos, ']')) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + pos++; + + if (negative) { + std::sort(result.begin(), result.end()); + std::vector actuals; + for (int code = 0; code < 255; code++) { + char c = char(code); + if (!std::binary_search(result.begin(), result.end(), c)) + actuals.push_back(c); + } + result = actuals; + } + + std::sort(result.begin(), result.end()); + } else + result.push_back(__pattern_getChar(s, pos)); + + return result; +} + +pattern::pattern(std::string s) : s(s), from(0), to(0) { + std::string t; + for (size_t i = 0; i < s.length(); i++) + if (!__pattern_isCommandChar(s, i, ' ')) + t += s[i]; + s = t; + + int opened = 0; + int firstClose = -1; + std::vector seps; + + for (size_t i = 0; i < s.length(); i++) { + if (__pattern_isCommandChar(s, i, '(')) { + opened++; + continue; + } + + if (__pattern_isCommandChar(s, i, ')')) { + opened--; + if (opened == 0 && firstClose == -1) + firstClose = int(i); + continue; + } + + if (opened < 0) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + if (__pattern_isCommandChar(s, i, '|') && opened == 0) + seps.push_back(int(i)); + } + + if (opened != 0) + __testlib_fail("pattern: Illegal pattern (or part) \"" + s + "\""); + + if (seps.size() == 0 && firstClose + 1 == (int) s.length() + && __pattern_isCommandChar(s, 0, '(') && __pattern_isCommandChar(s, s.length() - 1, ')')) { + children.push_back(pattern(s.substr(1, s.length() - 2))); + } else { + if (seps.size() > 0) { + seps.push_back(int(s.length())); + int last = 0; + + for (size_t i = 0; i < seps.size(); i++) { + children.push_back(pattern(s.substr(last, seps[i] - last))); + last = seps[i] + 1; + } + } else { + size_t pos = 0; + chars = __pattern_scanCharSet(s, pos); + __pattern_scanCounts(s, pos, from, to); + if (pos < s.length()) + children.push_back(pattern(s.substr(pos))); + } + } +} + +/* End of pattern implementation */ + +template +inline bool isEof(C c) { + return c == EOFC; +} + +template +inline bool isEoln(C c) { + return (c == LF || c == CR); +} + +template +inline bool isBlanks(C c) { + return (c == LF || c == CR || c == SPACE || c == TAB); +} + +inline std::string trim(const std::string &s) { + if (s.empty()) + return s; + + int left = 0; + while (left < int(s.length()) && isBlanks(s[left])) + left++; + if (left >= int(s.length())) + return ""; + + int right = int(s.length()) - 1; + while (right >= 0 && isBlanks(s[right])) + right--; + if (right < 0) + return ""; + + return s.substr(left, right - left + 1); +} + +enum TMode { + _input, _output, _answer +}; + +/* Outcomes 6-15 are reserved for future use. */ +enum TResult { + _ok = 0, + _wa = 1, + _pe = 2, + _fail = 3, + _dirt = 4, + _points = 5, + _unexpected_eof = 8, + _partially = 16 +}; + +enum TTestlibMode { + _unknown, _checker, _validator, _generator, _interactor, _scorer +}; + +#define _pc(exitCode) (TResult(_partially + (exitCode))) + +/* Outcomes 6-15 are reserved for future use. */ +const std::string outcomes[] = { + "accepted", + "wrong-answer", + "presentation-error", + "fail", + "fail", +#ifndef PCMS2 + "points", +#else + "relative-scoring", +#endif + "reserved", + "reserved", + "unexpected-eof", + "reserved", + "reserved", + "reserved", + "reserved", + "reserved", + "reserved", + "reserved", + "partially-correct" +}; + +class InputStreamReader { +public: + virtual void setTestCase(int testCase) = 0; + + virtual std::vector getReadChars() = 0; + + virtual int curChar() = 0; + + virtual int nextChar() = 0; + + virtual void skipChar() = 0; + + virtual void unreadChar(int c) = 0; + + virtual std::string getName() = 0; + + virtual bool eof() = 0; + + virtual void close() = 0; + + virtual int getLine() = 0; + + virtual ~InputStreamReader() = 0; +}; + +InputStreamReader::~InputStreamReader() { + // No operations. +} + +class StringInputStreamReader : public InputStreamReader { +private: + std::string s; + size_t pos; + +public: + StringInputStreamReader(const std::string &content) : s(content), pos(0) { + // No operations. + } + + void setTestCase(int) { + __testlib_fail("setTestCase not implemented in StringInputStreamReader"); + } + + std::vector getReadChars() { + __testlib_fail("getReadChars not implemented in StringInputStreamReader"); + } + + int curChar() { + if (pos >= s.length()) + return EOFC; + else + return s[pos]; + } + + int nextChar() { + if (pos >= s.length()) { + pos++; + return EOFC; + } else + return s[pos++]; + } + + void skipChar() { + pos++; + } + + void unreadChar(int c) { + if (pos == 0) + __testlib_fail("StringInputStreamReader::unreadChar(int): pos == 0."); + pos--; + if (pos < s.length()) + s[pos] = char(c); + } + + std::string getName() { + return __testlib_part(s); + } + + int getLine() { + return -1; + } + + bool eof() { + return pos >= s.length(); + } + + void close() { + // No operations. + } +}; + +class FileInputStreamReader : public InputStreamReader { +private: + std::FILE *file; + std::string name; + int line; + std::vector undoChars; + std::vector readChars; + std::vector undoReadChars; + + inline int postprocessGetc(int getcResult) { + if (getcResult != EOF) + return getcResult; + else + return EOFC; + } + + int getc(FILE *file) { + int c; + int rc; + + if (undoChars.empty()) { + c = rc = ::getc(file); + } else { + c = undoChars.back(); + undoChars.pop_back(); + rc = undoReadChars.back(); + undoReadChars.pop_back(); + } + + if (c == LF) + line++; + + readChars.push_back(rc); + return c; + } + + int ungetc(int c/*, FILE* file*/) { + if (!readChars.empty()) { + undoReadChars.push_back(readChars.back()); + readChars.pop_back(); + } + if (c == LF) + line--; + undoChars.push_back(c); + return c; + } + +public: + FileInputStreamReader(std::FILE *file, const std::string &name) : file(file), name(name), line(1) { + // No operations. + } + + void setTestCase(int testCase) { + if (testCase < 0 || testCase > __TESTLIB_MAX_TEST_CASE) + __testlib_fail(testlib_format_("testCase expected fit in [1,%d], but %d doesn't", __TESTLIB_MAX_TEST_CASE, testCase)); + readChars.push_back(testCase + 256); + } + + std::vector getReadChars() { + return readChars; + } + + int curChar() { + if (feof(file)) + return EOFC; + else { + int c = getc(file); + ungetc(c/*, file*/); + return postprocessGetc(c); + } + } + + int nextChar() { + if (feof(file)) + return EOFC; + else + return postprocessGetc(getc(file)); + } + + void skipChar() { + getc(file); + } + + void unreadChar(int c) { + ungetc(c/*, file*/); + } + + std::string getName() { + return name; + } + + int getLine() { + return line; + } + + bool eof() { + if (NULL == file || feof(file)) + return true; + else { + int c = nextChar(); + if (c == EOFC || (c == EOF && feof(file))) + return true; + unreadChar(c); + return false; + } + } + + void close() { + if (NULL != file) { + fclose(file); + file = NULL; + } + } +}; + +class BufferedFileInputStreamReader : public InputStreamReader { +private: + static const size_t BUFFER_SIZE; + static const size_t MAX_UNREAD_COUNT; + + std::FILE *file; + std::string name; + int line; + + char *buffer; + bool *isEof; + int bufferPos; + size_t bufferSize; + + bool refill() { + if (NULL == file) + __testlib_fail("BufferedFileInputStreamReader: file == NULL (" + getName() + ")"); + + if (bufferPos >= int(bufferSize)) { + size_t readSize = fread( + buffer + MAX_UNREAD_COUNT, + 1, + BUFFER_SIZE - MAX_UNREAD_COUNT, + file + ); + + if (readSize < BUFFER_SIZE - MAX_UNREAD_COUNT + && ferror(file)) + __testlib_fail("BufferedFileInputStreamReader: unable to read (" + getName() + ")"); + + bufferSize = MAX_UNREAD_COUNT + readSize; + bufferPos = int(MAX_UNREAD_COUNT); + std::memset(isEof + MAX_UNREAD_COUNT, 0, sizeof(isEof[0]) * readSize); + + return readSize > 0; + } else + return true; + } + + char increment() { + char c; + if ((c = buffer[bufferPos++]) == LF) + line++; + return c; + } + +public: + BufferedFileInputStreamReader(std::FILE *file, const std::string &name) : file(file), name(name), line(1) { + buffer = new char[BUFFER_SIZE]; + isEof = new bool[BUFFER_SIZE]; + bufferSize = MAX_UNREAD_COUNT; + bufferPos = int(MAX_UNREAD_COUNT); + } + + ~BufferedFileInputStreamReader() { + if (NULL != buffer) { + delete[] buffer; + buffer = NULL; + } + if (NULL != isEof) { + delete[] isEof; + isEof = NULL; + } + } + + void setTestCase(int) { + __testlib_fail("setTestCase not implemented in BufferedFileInputStreamReader"); + } + + std::vector getReadChars() { + __testlib_fail("getReadChars not implemented in BufferedFileInputStreamReader"); + } + + int curChar() { + if (!refill()) + return EOFC; + + return isEof[bufferPos] ? EOFC : buffer[bufferPos]; + } + + int nextChar() { + if (!refill()) + return EOFC; + + return isEof[bufferPos] ? EOFC : increment(); + } + + void skipChar() { + increment(); + } + + void unreadChar(int c) { + bufferPos--; + if (bufferPos < 0) + __testlib_fail("BufferedFileInputStreamReader::unreadChar(int): bufferPos < 0"); + isEof[bufferPos] = (c == EOFC); + buffer[bufferPos] = char(c); + if (c == LF) + line--; + } + + std::string getName() { + return name; + } + + int getLine() { + return line; + } + + bool eof() { + return !refill() || EOFC == curChar(); + } + + void close() { + if (NULL != file) { + fclose(file); + file = NULL; + } + } +}; + +const size_t BufferedFileInputStreamReader::BUFFER_SIZE = 2000000; +const size_t BufferedFileInputStreamReader::MAX_UNREAD_COUNT = BufferedFileInputStreamReader::BUFFER_SIZE / 2; + +/* + * Streams to be used for reading data in checkers or validators. + * Each read*() method moves pointer to the next character after the + * read value. + */ +struct InStream { + /* Do not use them. */ + InStream(); + + ~InStream(); + + /* Wrap std::string with InStream. */ + InStream(const InStream &baseStream, std::string content); + + InputStreamReader *reader; + int lastLine; + + std::string name; + TMode mode; + bool opened; + bool stdfile; + bool strict; + + int wordReserveSize; + std::string _tmpReadToken; + + int readManyIteration; + size_t maxFileSize; + size_t maxTokenLength; + size_t maxMessageLength; + + void init(std::string fileName, TMode mode); + + void init(std::FILE *f, TMode mode); + + void setTestCase(int testCase); + std::vector getReadChars(); + + /* Moves stream pointer to the first non-white-space character or EOF. */ + void skipBlanks(); + + /* Returns current character in the stream. Doesn't remove it from stream. */ + char curChar(); + + /* Moves stream pointer one character forward. */ + void skipChar(); + + /* Returns current character and moves pointer one character forward. */ + char nextChar(); + + /* Returns current character and moves pointer one character forward. */ + char readChar(); + + /* As "readChar()" but ensures that the result is equal to given parameter. */ + char readChar(char c); + + /* As "readChar()" but ensures that the result is equal to the space (code=32). */ + char readSpace(); + + /* Puts back the character into the stream. */ + void unreadChar(char c); + + /* Reopens stream, you should not use it. */ + void reset(std::FILE *file = NULL); + + /* Checks that current position is EOF. If not it doesn't move stream pointer. */ + bool eof(); + + /* Moves pointer to the first non-white-space character and calls "eof()". */ + bool seekEof(); + + /* + * Checks that current position contains EOLN. + * If not it doesn't move stream pointer. + * In strict mode expects "#13#10" for windows or "#10" for other platforms. + */ + bool eoln(); + + /* Moves pointer to the first non-space and non-tab character and calls "eoln()". */ + bool seekEoln(); + + /* Moves stream pointer to the first character of the next line (if exists). */ + void nextLine(); + + /* + * Reads new token. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + std::string readWord(); + + /* The same as "readWord()", it is preferred to use "readToken()". */ + std::string readToken(); + + /* The same as "readWord()", but ensures that token matches to given pattern. */ + std::string readWord(const std::string &ptrn, const std::string &variableName = ""); + + std::string readWord(const pattern &p, const std::string &variableName = ""); + + std::vector + readWords(int size, const std::string &ptrn, const std::string &variablesName = "", int indexBase = 1); + + std::vector + readWords(int size, const pattern &p, const std::string &variablesName = "", int indexBase = 1); + + std::vector readWords(int size, int indexBase = 1); + + /* The same as "readToken()", but ensures that token matches to given pattern. */ + std::string readToken(const std::string &ptrn, const std::string &variableName = ""); + + std::string readToken(const pattern &p, const std::string &variableName = ""); + + std::vector + readTokens(int size, const std::string &ptrn, const std::string &variablesName = "", int indexBase = 1); + + std::vector + readTokens(int size, const pattern &p, const std::string &variablesName = "", int indexBase = 1); + + std::vector readTokens(int size, int indexBase = 1); + + void readWordTo(std::string &result); + + void readWordTo(std::string &result, const pattern &p, const std::string &variableName = ""); + + void readWordTo(std::string &result, const std::string &ptrn, const std::string &variableName = ""); + + void readTokenTo(std::string &result); + + void readTokenTo(std::string &result, const pattern &p, const std::string &variableName = ""); + + void readTokenTo(std::string &result, const std::string &ptrn, const std::string &variableName = ""); + + /* + * Reads new long long value. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + long long readLong(); + + unsigned long long readUnsignedLong(); + + /* + * Reads new int. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + int readInteger(); + + /* + * Reads new int. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + int readInt(); + + /* As "readLong()" but ensures that value in the range [minv,maxv]. */ + long long readLong(long long minv, long long maxv, const std::string &variableName = ""); + + /* Reads space-separated sequence of long longs. */ + std::vector + readLongs(int size, long long minv, long long maxv, const std::string &variablesName = "", int indexBase = 1); + + /* Reads space-separated sequence of long longs. */ + std::vector readLongs(int size, int indexBase = 1); + + unsigned long long + readUnsignedLong(unsigned long long minv, unsigned long long maxv, const std::string &variableName = ""); + + std::vector + readUnsignedLongs(int size, unsigned long long minv, unsigned long long maxv, const std::string &variablesName = "", + int indexBase = 1); + + std::vector readUnsignedLongs(int size, int indexBase = 1); + + unsigned long long readLong(unsigned long long minv, unsigned long long maxv, const std::string &variableName = ""); + + std::vector + readLongs(int size, unsigned long long minv, unsigned long long maxv, const std::string &variablesName = "", + int indexBase = 1); + + /* As "readInteger()" but ensures that value in the range [minv,maxv]. */ + int readInteger(int minv, int maxv, const std::string &variableName = ""); + + /* As "readInt()" but ensures that value in the range [minv,maxv]. */ + int readInt(int minv, int maxv, const std::string &variableName = ""); + + /* Reads space-separated sequence of integers. */ + std::vector + readIntegers(int size, int minv, int maxv, const std::string &variablesName = "", int indexBase = 1); + + /* Reads space-separated sequence of integers. */ + std::vector readIntegers(int size, int indexBase = 1); + + /* Reads space-separated sequence of integers. */ + std::vector readInts(int size, int minv, int maxv, const std::string &variablesName = "", int indexBase = 1); + + /* Reads space-separated sequence of integers. */ + std::vector readInts(int size, int indexBase = 1); + + /* + * Reads new double. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + double readReal(); + + /* + * Reads new double. Ignores white-spaces into the non-strict mode + * (strict mode is used in validators usually). + */ + double readDouble(); + + /* As "readReal()" but ensures that value in the range [minv,maxv]. */ + double readReal(double minv, double maxv, const std::string &variableName = ""); + + std::vector + readReals(int size, double minv, double maxv, const std::string &variablesName = "", int indexBase = 1); + + std::vector readReals(int size, int indexBase = 1); + + /* As "readDouble()" but ensures that value in the range [minv,maxv]. */ + double readDouble(double minv, double maxv, const std::string &variableName = ""); + + std::vector + readDoubles(int size, double minv, double maxv, const std::string &variablesName = "", int indexBase = 1); + + std::vector readDoubles(int size, int indexBase = 1); + + /* + * As "readReal()" but ensures that value in the range [minv,maxv] and + * number of digit after the decimal point is in range [minAfterPointDigitCount,maxAfterPointDigitCount] + * and number is in the form "[-]digit(s)[.digit(s)]". + */ + double readStrictReal(double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variableName = ""); + + std::vector readStrictReals(int size, double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variablesName = "", int indexBase = 1); + + /* + * As "readDouble()" but ensures that value in the range [minv,maxv] and + * number of digit after the decimal point is in range [minAfterPointDigitCount,maxAfterPointDigitCount] + * and number is in the form "[-]digit(s)[.digit(s)]". + */ + double readStrictDouble(double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variableName = ""); + + std::vector readStrictDoubles(int size, double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variablesName = "", int indexBase = 1); + + /* As readLine(). */ + std::string readString(); + + /* Read many lines. */ + std::vector readStrings(int size, int indexBase = 1); + + /* See readLine(). */ + void readStringTo(std::string &result); + + /* The same as "readLine()/readString()", but ensures that line matches to the given pattern. */ + std::string readString(const pattern &p, const std::string &variableName = ""); + + /* The same as "readLine()/readString()", but ensures that line matches to the given pattern. */ + std::string readString(const std::string &ptrn, const std::string &variableName = ""); + + /* Read many lines. */ + std::vector + readStrings(int size, const pattern &p, const std::string &variableName = "", int indexBase = 1); + + /* Read many lines. */ + std::vector + readStrings(int size, const std::string &ptrn, const std::string &variableName = "", int indexBase = 1); + + /* The same as "readLine()/readString()", but ensures that line matches to the given pattern. */ + void readStringTo(std::string &result, const pattern &p, const std::string &variableName = ""); + + /* The same as "readLine()/readString()", but ensures that line matches to the given pattern. */ + void readStringTo(std::string &result, const std::string &ptrn, const std::string &variableName = ""); + + /* + * Reads line from the current position to EOLN or EOF. Moves stream pointer to + * the first character of the new line (if possible). + */ + std::string readLine(); + + /* Read many lines. */ + std::vector readLines(int size, int indexBase = 1); + + /* See readLine(). */ + void readLineTo(std::string &result); + + /* The same as "readLine()", but ensures that line matches to the given pattern. */ + std::string readLine(const pattern &p, const std::string &variableName = ""); + + /* The same as "readLine()", but ensures that line matches to the given pattern. */ + std::string readLine(const std::string &ptrn, const std::string &variableName = ""); + + /* Read many lines. */ + std::vector + readLines(int size, const pattern &p, const std::string &variableName = "", int indexBase = 1); + + /* Read many lines. */ + std::vector + readLines(int size, const std::string &ptrn, const std::string &variableName = "", int indexBase = 1); + + /* The same as "readLine()", but ensures that line matches to the given pattern. */ + void readLineTo(std::string &result, const pattern &p, const std::string &variableName = ""); + + /* The same as "readLine()", but ensures that line matches to the given pattern. */ + void readLineTo(std::string &result, const std::string &ptrn, const std::string &variableName = ""); + + /* Reads EOLN or fails. Use it in validators. Calls "eoln()" method internally. */ + void readEoln(); + + /* Reads EOF or fails. Use it in validators. Calls "eof()" method internally. */ + void readEof(); + + /* + * Quit-functions aborts program with and : + * input/answer streams replace any result to FAIL. + */ + NORETURN void quit(TResult result, const char *msg); + /* + * Quit-functions aborts program with and : + * input/answer streams replace any result to FAIL. + */ + NORETURN void quitf(TResult result, const char *msg, ...); + + /* + * Quit-functions aborts program with and : + * input/answer streams replace any result to FAIL. + */ + void quitif(bool condition, TResult result, const char *msg, ...); + /* + * Quit-functions aborts program with and : + * input/answer streams replace any result to FAIL. + */ + NORETURN void quits(TResult result, std::string msg); + + /* + * Checks condition and aborts a program if condition is false. + * Returns _wa for ouf and _fail on any other streams. + */ +#ifdef __GNUC__ + __attribute__ ((format (printf, 3, 4))) +#endif + void ensuref(bool cond, const char *format, ...); + + void __testlib_ensure(bool cond, std::string message); + + void close(); + + const static int NO_INDEX = INT_MAX; + const static char OPEN_BRACKET = char(11); + const static char CLOSE_BRACKET = char(17); + + const static WORD LightGray = 0x07; + const static WORD LightRed = 0x0c; + const static WORD LightCyan = 0x0b; + const static WORD LightGreen = 0x0a; + const static WORD LightYellow = 0x0e; + + static void textColor(WORD color); + + static void quitscr(WORD color, const char *msg); + + static void quitscrS(WORD color, std::string msg); + + void xmlSafeWrite(std::FILE *file, const char *msg); + + /* Skips UTF-8 Byte Order Mark. */ + void skipBom(); + +private: + InStream(const InStream &); + + InStream &operator=(const InStream &); +}; + +InStream inf; +InStream ouf; +InStream ans; +bool appesMode; +std::string appesModeEncoding = "windows-1251"; +std::string resultName; +std::string checkerName = "untitled checker"; +random_t rnd; +TTestlibMode testlibMode = _unknown; +double __testlib_points = std::numeric_limits::infinity(); + +const size_t VALIDATOR_MAX_VARIABLE_COUNT = 255; + +struct ValidatorBoundsHit { + static const double EPS; + bool minHit; + bool maxHit; + + ValidatorBoundsHit(bool minHit = false, bool maxHit = false) : minHit(minHit), maxHit(maxHit) { + }; + + ValidatorBoundsHit merge(const ValidatorBoundsHit &validatorBoundsHit, bool ignoreMinBound, bool ignoreMaxBound) { + return ValidatorBoundsHit( + __testlib_max(minHit, validatorBoundsHit.minHit) || ignoreMinBound, + __testlib_max(maxHit, validatorBoundsHit.maxHit) || ignoreMaxBound + ); + } +}; + +struct ConstantBound { + std::string value; + bool broken; + + template + void adjust(T t) { + std::string t_string = std::to_string(t); + if (t_string.length() >= 32) { + broken = true; + value = ""; + } else { + if (!broken && value.empty()) + value = t_string; + if (!broken && value != t_string) { + broken = true; + value = ""; + } + } + } + + bool has_value() { + return !value.empty() && !broken && value.length() < 32; + } +}; + +struct ConstantBounds { + ConstantBound lowerBound; + ConstantBound upperBound; +}; + +const double ValidatorBoundsHit::EPS = 1E-12; + +class Validator { +private: + const static std::string TEST_MARKUP_HEADER; + const static std::string TEST_CASE_OPEN_TAG; + const static std::string TEST_CASE_CLOSE_TAG; + + bool _initialized; + std::string _testset; + std::string _group; + + std::string _testOverviewLogFileName; + std::string _testMarkupFileName; + int _testCase = -1; + std::string _testCaseFileName; + + std::map _boundsHitByVariableName; + std::map _constantBoundsByVariableName; + std::set _features; + std::set _hitFeatures; + std::set _variables; + + bool isVariableNameBoundsAnalyzable(const std::string &variableName) { + for (size_t i = 0; i < variableName.length(); i++) + if ((variableName[i] >= '0' && variableName[i] <= '9') || variableName[i] < ' ') + return false; + return true; + } + + bool isFeatureNameAnalyzable(const std::string &featureName) { + for (size_t i = 0; i < featureName.length(); i++) + if (featureName[i] < ' ') + return false; + return true; + } + +public: + Validator() : _initialized(false), _testset("tests"), _group() { + } + + void initialize() { + _initialized = true; + } + + std::string testset() const { + if (!_initialized) + __testlib_fail("Validator should be initialized with registerValidation(argc, argv) instead of registerValidation() to support validator.testset()"); + return _testset; + } + + std::string group() const { + if (!_initialized) + __testlib_fail("Validator should be initialized with registerValidation(argc, argv) instead of registerValidation() to support validator.group()"); + return _group; + } + + std::string testOverviewLogFileName() const { + return _testOverviewLogFileName; + } + + std::string testMarkupFileName() const { + return _testMarkupFileName; + } + + int testCase() const { + return _testCase; + } + + std::string testCaseFileName() const { + return _testCaseFileName; + } + + void setTestset(const char *const testset) { + _testset = testset; + } + + void setGroup(const char *const group) { + _group = group; + } + + void setTestOverviewLogFileName(const char *const testOverviewLogFileName) { + _testOverviewLogFileName = testOverviewLogFileName; + } + + void setTestMarkupFileName(const char *const testMarkupFileName) { + _testMarkupFileName = testMarkupFileName; + } + + void setTestCase(int testCase) { + _testCase = testCase; + } + + void setTestCaseFileName(const char *const testCaseFileName) { + _testCaseFileName = testCaseFileName; + } + + std::string prepVariableName(const std::string &variableName) { + if (variableName.length() >= 2 && variableName != "~~") { + if (variableName[0] == '~' && variableName.back() != '~') + return variableName.substr(1); + if (variableName[0] != '~' && variableName.back() == '~') + return variableName.substr(0, variableName.length() - 1); + if (variableName[0] == '~' && variableName.back() == '~') + return variableName.substr(1, variableName.length() - 2); + } + return variableName; + } + + bool ignoreMinBound(const std::string &variableName) { + return variableName.length() >= 2 && variableName != "~~" && variableName[0] == '~'; + } + + bool ignoreMaxBound(const std::string &variableName) { + return variableName.length() >= 2 && variableName != "~~" && variableName.back() == '~'; + } + + void addBoundsHit(const std::string &variableName, ValidatorBoundsHit boundsHit) { + if (isVariableNameBoundsAnalyzable(variableName) + && _boundsHitByVariableName.size() < VALIDATOR_MAX_VARIABLE_COUNT) { + std::string preparedVariableName = prepVariableName(variableName); + _boundsHitByVariableName[preparedVariableName] = boundsHit.merge(_boundsHitByVariableName[preparedVariableName], + ignoreMinBound(variableName), ignoreMaxBound(variableName)); + } + } + + void addVariable(const std::string &variableName) { + if (isVariableNameBoundsAnalyzable(variableName) + && _variables.size() < VALIDATOR_MAX_VARIABLE_COUNT) { + std::string preparedVariableName = prepVariableName(variableName); + _variables.insert(preparedVariableName); + } + } + + std::string getVariablesLog() { + std::string result; + for (const std::string &variableName: _variables) + result += "variable \"" + variableName + "\"\n"; + return result; + } + + template + void adjustConstantBounds(const std::string &variableName, T lower, T upper) { + if (isVariableNameBoundsAnalyzable(variableName) + && _constantBoundsByVariableName.size() < VALIDATOR_MAX_VARIABLE_COUNT) { + std::string preparedVariableName = prepVariableName(variableName); + _constantBoundsByVariableName[preparedVariableName].lowerBound.adjust(lower); + _constantBoundsByVariableName[preparedVariableName].upperBound.adjust(upper); + } + } + + std::string getBoundsHitLog() { + std::string result; + for (std::map::iterator i = _boundsHitByVariableName.begin(); + i != _boundsHitByVariableName.end(); + i++) { + result += "\"" + i->first + "\":"; + if (i->second.minHit) + result += " min-value-hit"; + if (i->second.maxHit) + result += " max-value-hit"; + result += "\n"; + } + return result; + } + + std::string getConstantBoundsLog() { + std::string result; + for (std::map::iterator i = _constantBoundsByVariableName.begin(); + i != _constantBoundsByVariableName.end(); + i++) { + if (i->second.lowerBound.has_value() || i->second.upperBound.has_value()) { + result += "constant-bounds \"" + i->first + "\":"; + if (i->second.lowerBound.has_value()) + result += " " + i->second.lowerBound.value; + else + result += " ?"; + if (i->second.upperBound.has_value()) + result += " " + i->second.upperBound.value; + else + result += " ?"; + result += "\n"; + } + } + return result; + } + + std::string getFeaturesLog() { + std::string result; + for (std::set::iterator i = _features.begin(); + i != _features.end(); + i++) { + result += "feature \"" + *i + "\":"; + if (_hitFeatures.count(*i)) + result += " hit"; + result += "\n"; + } + return result; + } + + void writeTestOverviewLog() { + if (!_testOverviewLogFileName.empty()) { + std::string fileName(_testOverviewLogFileName); + _testOverviewLogFileName = ""; + + FILE* f; + bool standard_file = false; + if (fileName == "stdout") + f = stdout, standard_file = true; + else if (fileName == "stderr") + f = stderr, standard_file = true; + else { + f = testlib_fopen_(fileName.c_str(), "wb"); + if (NULL == f) + __testlib_fail("Validator::writeTestOverviewLog: can't write test overview log to (" + fileName + ")"); + } + fprintf(f, "%s%s%s%s", + getBoundsHitLog().c_str(), + getFeaturesLog().c_str(), + getConstantBoundsLog().c_str(), + getVariablesLog().c_str()); + std::fflush(f); + if (!standard_file) + if (std::fclose(f)) + __testlib_fail("Validator::writeTestOverviewLog: can't close test overview log file (" + fileName + ")"); + } + } + + void writeTestMarkup() { + if (!_testMarkupFileName.empty()) { + std::vector readChars = inf.getReadChars(); + if (!readChars.empty()) { + std::string markup(TEST_MARKUP_HEADER); + for (size_t i = 0; i < readChars.size(); i++) { + int c = readChars[i]; + if (i + 1 == readChars.size() && c == -1) + continue; + if (c <= 256) { + char cc = char(c); + if (cc == '\\' || cc == '!') + markup += '\\'; + markup += cc; + } else { + markup += TEST_CASE_OPEN_TAG; + markup += toString(c - 256); + markup += TEST_CASE_CLOSE_TAG; + } + } + FILE* f; + bool standard_file = false; + if (_testMarkupFileName == "stdout") + f = stdout, standard_file = true; + else if (_testMarkupFileName == "stderr") + f = stderr, standard_file = true; + else { + f = testlib_fopen_(_testMarkupFileName.c_str(), "wb"); + if (NULL == f) + __testlib_fail("Validator::writeTestMarkup: can't write test markup to (" + _testMarkupFileName + ")"); + } + std::fprintf(f, "%s", markup.c_str()); + std::fflush(f); + if (!standard_file) + if (std::fclose(f)) + __testlib_fail("Validator::writeTestMarkup: can't close test markup file (" + _testCaseFileName + ")"); + } + } + } + + void writeTestCase() { + if (_testCase > 0) { + std::vector readChars = inf.getReadChars(); + if (!readChars.empty()) { + std::string content, testCaseContent; + bool matchedTestCase = false; + for (size_t i = 0; i < readChars.size(); i++) { + int c = readChars[i]; + if (i + 1 == readChars.size() && c == -1) + continue; + if (c <= 256) + content += char(c); + else { + if (matchedTestCase) { + testCaseContent = content; + matchedTestCase = false; + } + content = ""; + int testCase = c - 256; + if (testCase == _testCase) + matchedTestCase = true; + } + } + if (matchedTestCase) + testCaseContent = content; + + if (!testCaseContent.empty()) { + FILE* f; + bool standard_file = false; + if (_testCaseFileName.empty() || _testCaseFileName == "stdout") + f = stdout, standard_file = true; + else if (_testCaseFileName == "stderr") + f = stderr, standard_file = true; + else { + f = testlib_fopen_(_testCaseFileName.c_str(), "wb"); + if (NULL == f) + __testlib_fail("Validator::writeTestCase: can't write test case to (" + _testCaseFileName + ")"); + } + std::fprintf(f, "%s", testCaseContent.c_str()); + std::fflush(f); + if (!standard_file) + if (std::fclose(f)) + __testlib_fail("Validator::writeTestCase: can't close test case file (" + _testCaseFileName + ")"); + } + } + } + } + + void addFeature(const std::string &feature) { + if (_features.count(feature)) + __testlib_fail("Feature " + feature + " registered twice."); + if (!isFeatureNameAnalyzable(feature)) + __testlib_fail("Feature name '" + feature + "' contains restricted characters."); + + _features.insert(feature); + } + + void feature(const std::string &feature) { + if (!isFeatureNameAnalyzable(feature)) + __testlib_fail("Feature name '" + feature + "' contains restricted characters."); + + if (!_features.count(feature)) + __testlib_fail("Feature " + feature + " didn't registered via addFeature(feature)."); + + _hitFeatures.insert(feature); + } +} validator; + +const std::string Validator::TEST_MARKUP_HEADER = "MU\xF3\x01"; +const std::string Validator::TEST_CASE_OPEN_TAG = "!c"; +const std::string Validator::TEST_CASE_CLOSE_TAG = ";"; + +struct TestlibFinalizeGuard { + static bool alive; + static bool registered; + + int quitCount, readEofCount; + + TestlibFinalizeGuard() : quitCount(0), readEofCount(0) { + // No operations. + } + + ~TestlibFinalizeGuard() { + bool _alive = alive; + alive = false; + + if (_alive) { + if (testlibMode == _checker && quitCount == 0) + __testlib_fail("Checker must end with quit or quitf call."); + + if (testlibMode == _validator && readEofCount == 0 && quitCount == 0) + __testlib_fail("Validator must end with readEof call."); + + /* opts */ + autoEnsureNoUnusedOpts(); + + if (!registered) + __testlib_fail("Call register-function in the first line of the main (registerTestlibCmd or other similar)"); + } + + if (__testlib_exitCode == 0) { + validator.writeTestOverviewLog(); + validator.writeTestMarkup(); + validator.writeTestCase(); + } + } + +private: + /* opts */ + void autoEnsureNoUnusedOpts(); +}; + +bool TestlibFinalizeGuard::alive = true; +bool TestlibFinalizeGuard::registered = false; +extern TestlibFinalizeGuard testlibFinalizeGuard; + +/* + * Call it to disable checks on finalization. + */ +void disableFinalizeGuard() { + TestlibFinalizeGuard::alive = false; +} + +/* Interactor streams. + */ +std::fstream tout; + +/* implementation + */ + +InStream::InStream() { + reader = NULL; + lastLine = -1; + opened = false; + name = ""; + mode = _input; + strict = false; + stdfile = false; + wordReserveSize = 4; + readManyIteration = NO_INDEX; + maxFileSize = 128 * 1024 * 1024; // 128MB. + maxTokenLength = 32 * 1024 * 1024; // 32MB. + maxMessageLength = 32000; +} + +InStream::InStream(const InStream &baseStream, std::string content) { + reader = new StringInputStreamReader(content); + lastLine = -1; + opened = true; + strict = baseStream.strict; + stdfile = false; + mode = baseStream.mode; + name = "based on " + baseStream.name; + readManyIteration = NO_INDEX; + maxFileSize = 128 * 1024 * 1024; // 128MB. + maxTokenLength = 32 * 1024 * 1024; // 32MB. + maxMessageLength = 32000; +} + +InStream::~InStream() { + if (NULL != reader) { + reader->close(); + delete reader; + reader = NULL; + } +} + +void InStream::setTestCase(int testCase) { + if (testlibMode != _validator || mode != _input || !stdfile || this != &inf) + __testlib_fail("InStream::setTestCase can be used only for inf in validator-mode." + " Actually, prefer setTestCase function instead of InStream member"); + reader->setTestCase(testCase); +} + +std::vector InStream::getReadChars() { + if (testlibMode != _validator || mode != _input || !stdfile || this != &inf) + __testlib_fail("InStream::getReadChars can be used only for inf in validator-mode."); + return reader == NULL ? std::vector() : reader->getReadChars(); +} + +void setTestCase(int testCase) { + static bool first_run = true; + static bool zero_based = false; + + if (first_run && testCase == 0) + zero_based = true; + + if (zero_based) + testCase++; + + __testlib_hasTestCase = true; + __testlib_testCase = testCase; + + if (testlibMode == _validator) + inf.setTestCase(testCase); + + first_run = false; +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +int resultExitCode(TResult r) { + if (r == _ok) + return OK_EXIT_CODE; + if (r == _wa) + return WA_EXIT_CODE; + if (r == _pe) + return PE_EXIT_CODE; + if (r == _fail) + return FAIL_EXIT_CODE; + if (r == _dirt) + return DIRT_EXIT_CODE; + if (r == _points) + return POINTS_EXIT_CODE; + if (r == _unexpected_eof) +#ifdef ENABLE_UNEXPECTED_EOF + return UNEXPECTED_EOF_EXIT_CODE; +#else + return PE_EXIT_CODE; +#endif + if (r >= _partially) + return PC_BASE_EXIT_CODE + (r - _partially); + return FAIL_EXIT_CODE; +} + +void InStream::textColor( +#if !(defined(ON_WINDOWS) && (!defined(_MSC_VER) || _MSC_VER > 1400)) && defined(__GNUC__) + __attribute__((unused)) +#endif + WORD color +) { +#if defined(ON_WINDOWS) && (!defined(_MSC_VER) || _MSC_VER > 1400) + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(handle, color); +#endif +#if !defined(ON_WINDOWS) && defined(__GNUC__) + if (isatty(2)) + { + switch (color) + { + case LightRed: + fprintf(stderr, "\033[1;31m"); + break; + case LightCyan: + fprintf(stderr, "\033[1;36m"); + break; + case LightGreen: + fprintf(stderr, "\033[1;32m"); + break; + case LightYellow: + fprintf(stderr, "\033[1;33m"); + break; + case LightGray: + default: + fprintf(stderr, "\033[0m"); + } + } +#endif +} + +#ifdef TESTLIB_THROW_EXIT_EXCEPTION_INSTEAD_OF_EXIT +class exit_exception: public std::exception { +private: + int exitCode; +public: + exit_exception(int exitCode): exitCode(exitCode) {} + int getExitCode() { return exitCode; } +}; +#endif + +NORETURN void halt(int exitCode) { +#ifdef FOOTER + InStream::textColor(InStream::LightGray); + std::fprintf(stderr, "Checker: \"%s\"\n", checkerName.c_str()); + std::fprintf(stderr, "Exit code: %d\n", exitCode); + InStream::textColor(InStream::LightGray); +#endif + __testlib_exitCode = exitCode; +#ifdef TESTLIB_THROW_EXIT_EXCEPTION_INSTEAD_OF_EXIT + throw exit_exception(exitCode); +#endif + std::exit(exitCode); +} + +static bool __testlib_shouldCheckDirt(TResult result) { + return result == _ok || result == _points || result >= _partially; +} + +static std::string __testlib_appendMessage(const std::string &message, const std::string &extra) { + int openPos = -1, closePos = -1; + for (size_t i = 0; i < message.length(); i++) { + if (message[i] == InStream::OPEN_BRACKET) { + if (openPos == -1) + openPos = int(i); + else + openPos = INT_MAX; + } + if (message[i] == InStream::CLOSE_BRACKET) { + if (closePos == -1) + closePos = int(i); + else + closePos = INT_MAX; + } + } + if (openPos != -1 && openPos != INT_MAX + && closePos != -1 && closePos != INT_MAX + && openPos < closePos) { + size_t index = message.find(extra, openPos); + if (index == std::string::npos || int(index) >= closePos) { + std::string result(message); + result.insert(closePos, ", " + extra); + return result; + } + return message; + } + + return message + " " + InStream::OPEN_BRACKET + extra + InStream::CLOSE_BRACKET; +} + +static std::string __testlib_toPrintableMessage(const std::string &message) { + int openPos = -1, closePos = -1; + for (size_t i = 0; i < message.length(); i++) { + if (message[i] == InStream::OPEN_BRACKET) { + if (openPos == -1) + openPos = int(i); + else + openPos = INT_MAX; + } + if (message[i] == InStream::CLOSE_BRACKET) { + if (closePos == -1) + closePos = int(i); + else + closePos = INT_MAX; + } + } + if (openPos != -1 && openPos != INT_MAX + && closePos != -1 && closePos != INT_MAX + && openPos < closePos) { + std::string result(message); + result[openPos] = '('; + result[closePos] = ')'; + return result; + } + + return message; +} + +NORETURN void InStream::quit(TResult result, const char *msg) { + if (TestlibFinalizeGuard::alive) + testlibFinalizeGuard.quitCount++; + + std::string message(msg); + message = trim(message); + + if (__testlib_hasTestCase) { + if (result != _ok) + message = __testlib_appendMessage(message, "test case " + vtos(__testlib_testCase)); + else { + if (__testlib_testCase == 1) + message = __testlib_appendMessage(message, vtos(__testlib_testCase) + " test case"); + else + message = __testlib_appendMessage(message, vtos(__testlib_testCase) + " test cases"); + } + } + + // You can change maxMessageLength. + // Example: 'inf.maxMessageLength = 1024 * 1024;'. + if (message.length() > maxMessageLength) { + std::string warn = "message length exceeds " + vtos(maxMessageLength) + + ", the message is truncated: "; + message = warn + message.substr(0, maxMessageLength - warn.length()); + } + +#ifndef ENABLE_UNEXPECTED_EOF + if (result == _unexpected_eof) + result = _pe; +#endif + + if (testlibMode == _scorer && result != _fail) + quits(_fail, "Scorer should return points only. Don't use a quit function."); + + if (mode != _output && result != _fail) { + if (mode == _input && testlibMode == _validator && lastLine != -1) + quits(_fail, __testlib_appendMessage(__testlib_appendMessage(message, name), "line " + vtos(lastLine))); + else + quits(_fail, __testlib_appendMessage(message, name)); + } + + std::FILE *resultFile; + std::string errorName; + + if (__testlib_shouldCheckDirt(result)) { + if (testlibMode != _interactor && !ouf.seekEof()) + quit(_dirt, "Extra information in the output file"); + } + + int pctype = result - _partially; + bool isPartial = false; + + switch (result) { + case _ok: + errorName = "ok "; + quitscrS(LightGreen, errorName); + break; + case _wa: + errorName = "wrong answer "; + quitscrS(LightRed, errorName); + break; + case _pe: + errorName = "wrong output format "; + quitscrS(LightRed, errorName); + break; + case _fail: + errorName = "FAIL "; + quitscrS(LightRed, errorName); + break; + case _dirt: + errorName = "wrong output format "; + quitscrS(LightCyan, errorName); + result = _pe; + break; + case _points: + errorName = "points "; + quitscrS(LightYellow, errorName); + break; + case _unexpected_eof: + errorName = "unexpected eof "; + quitscrS(LightCyan, errorName); + break; + default: + if (result >= _partially) { + errorName = testlib_format_("partially correct (%d) ", pctype); + isPartial = true; + quitscrS(LightYellow, errorName); + } else + quit(_fail, "What is the code ??? "); + } + + if (resultName != "") { + resultFile = testlib_fopen_(resultName.c_str(), "w"); + if (resultFile == NULL) { + resultName = ""; + quit(_fail, "Can not write to the result file"); + } + if (appesMode) { + std::fprintf(resultFile, "", appesModeEncoding.c_str()); + if (isPartial) + std::fprintf(resultFile, "", + outcomes[(int) _partially].c_str(), pctype); + else { + if (result != _points) + std::fprintf(resultFile, "", outcomes[(int) result].c_str()); + else { + if (__testlib_points == std::numeric_limits::infinity()) + quit(_fail, "Expected points, but infinity found"); + std::string stringPoints = removeDoubleTrailingZeroes(testlib_format_("%.10f", __testlib_points)); + std::fprintf(resultFile, "", + outcomes[(int) result].c_str(), stringPoints.c_str()); + } + } + xmlSafeWrite(resultFile, __testlib_toPrintableMessage(message).c_str()); + std::fprintf(resultFile, "\n"); + } else + std::fprintf(resultFile, "%s", __testlib_toPrintableMessage(message).c_str()); + if (NULL == resultFile || fclose(resultFile) != 0) { + resultName = ""; + quit(_fail, "Can not write to the result file"); + } + } + + quitscr(LightGray, __testlib_toPrintableMessage(message).c_str()); + std::fprintf(stderr, "\n"); + + inf.close(); + ouf.close(); + ans.close(); + if (tout.is_open()) + tout.close(); + + textColor(LightGray); + + if (resultName != "") + std::fprintf(stderr, "See file to check exit message\n"); + + halt(resultExitCode(result)); +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 3, 4))) +#endif +NORETURN void InStream::quitf(TResult result, const char *msg, ...) { + FMT_TO_RESULT(msg, msg, message); + InStream::quit(result, message.c_str()); +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +void InStream::quitif(bool condition, TResult result, const char *msg, ...) { + if (condition) { + FMT_TO_RESULT(msg, msg, message); + InStream::quit(result, message.c_str()); + } +} + +NORETURN void InStream::quits(TResult result, std::string msg) { + InStream::quit(result, msg.c_str()); +} + +void InStream::xmlSafeWrite(std::FILE *file, const char *msg) { + size_t lmsg = strlen(msg); + for (size_t i = 0; i < lmsg; i++) { + if (msg[i] == '&') { + std::fprintf(file, "%s", "&"); + continue; + } + if (msg[i] == '<') { + std::fprintf(file, "%s", "<"); + continue; + } + if (msg[i] == '>') { + std::fprintf(file, "%s", ">"); + continue; + } + if (msg[i] == '"') { + std::fprintf(file, "%s", """); + continue; + } + if (0 <= msg[i] && msg[i] <= 31) { + std::fprintf(file, "%c", '.'); + continue; + } + std::fprintf(file, "%c", msg[i]); + } +} + +void InStream::quitscrS(WORD color, std::string msg) { + quitscr(color, msg.c_str()); +} + +void InStream::quitscr(WORD color, const char *msg) { + if (resultName == "") { + textColor(color); + std::fprintf(stderr, "%s", msg); + textColor(LightGray); + } +} + +void InStream::reset(std::FILE *file) { + if (opened && stdfile) + quit(_fail, "Can't reset standard handle"); + + if (opened) + close(); + + if (!stdfile && NULL == file) + if (NULL == (file = testlib_fopen_(name.c_str(), "rb"))) { + if (mode == _output) + quits(_pe, std::string("Output file not found: \"") + name + "\""); + + if (mode == _answer) + quits(_fail, std::string("Answer file not found: \"") + name + "\""); + } + + if (NULL != file) { + opened = true; + __testlib_set_binary(file); + + if (stdfile) + reader = new FileInputStreamReader(file, name); + else + reader = new BufferedFileInputStreamReader(file, name); + } else { + opened = false; + reader = NULL; + } +} + +void InStream::init(std::string fileName, TMode mode) { + opened = false; + name = fileName; + stdfile = false; + this->mode = mode; + + std::ifstream stream; + stream.open(fileName.c_str(), std::ios::in); + if (stream.is_open()) { + std::streampos start = stream.tellg(); + stream.seekg(0, std::ios::end); + std::streampos end = stream.tellg(); + size_t fileSize = size_t(end - start); + stream.close(); + + // You can change maxFileSize. + // Example: 'inf.maxFileSize = 256 * 1024 * 1024;'. + if (fileSize > maxFileSize) + quitf(_pe, "File size exceeds %d bytes, size is %d", int(maxFileSize), int(fileSize)); + } + + reset(); +} + +void InStream::init(std::FILE *f, TMode mode) { + opened = false; + name = "untitled"; + this->mode = mode; + + if (f == stdin) + name = "stdin", stdfile = true; + if (f == stdout) + name = "stdout", stdfile = true; + if (f == stderr) + name = "stderr", stdfile = true; + + reset(f); +} + +void InStream::skipBom() { + const std::string utf8Bom = "\xEF\xBB\xBF"; + size_t index = 0; + while (index < utf8Bom.size() && curChar() == utf8Bom[index]) { + index++; + skipChar(); + } + if (index < utf8Bom.size()) { + while (index != 0) { + unreadChar(utf8Bom[index - 1]); + index--; + } + } +} + +char InStream::curChar() { + return char(reader->curChar()); +} + +char InStream::nextChar() { + return char(reader->nextChar()); +} + +char InStream::readChar() { + return nextChar(); +} + +char InStream::readChar(char c) { + lastLine = reader->getLine(); + char found = readChar(); + if (c != found) { + if (!isEoln(found)) + quit(_pe, ("Unexpected character '" + std::string(1, found) + "', but '" + std::string(1, c) + + "' expected").c_str()); + else + quit(_pe, ("Unexpected character " + ("#" + vtos(int(found))) + ", but '" + std::string(1, c) + + "' expected").c_str()); + } + return found; +} + +char InStream::readSpace() { + return readChar(' '); +} + +void InStream::unreadChar(char c) { + reader->unreadChar(c); +} + +void InStream::skipChar() { + reader->skipChar(); +} + +void InStream::skipBlanks() { + while (isBlanks(reader->curChar())) + reader->skipChar(); +} + +std::string InStream::readWord() { + readWordTo(_tmpReadToken); + return _tmpReadToken; +} + +void InStream::readWordTo(std::string &result) { + if (!strict) + skipBlanks(); + + lastLine = reader->getLine(); + int cur = reader->nextChar(); + + if (cur == EOFC) + quit(_unexpected_eof, "Unexpected end of file - token expected"); + + if (isBlanks(cur)) + quit(_pe, "Unexpected white-space - token expected"); + + result.clear(); + + while (!(isBlanks(cur) || cur == EOFC)) { + result += char(cur); + + // You can change maxTokenLength. + // Example: 'inf.maxTokenLength = 128 * 1024 * 1024;'. + if (result.length() > maxTokenLength) + quitf(_pe, "Length of token exceeds %d, token is '%s...'", int(maxTokenLength), + __testlib_part(result).c_str()); + + cur = reader->nextChar(); + } + + reader->unreadChar(cur); + + if (result.length() == 0) + quit(_unexpected_eof, "Unexpected end of file or white-space - token expected"); +} + +std::string InStream::readToken() { + return readWord(); +} + +void InStream::readTokenTo(std::string &result) { + readWordTo(result); +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +static std::string __testlib_part(const std::string &s) { + std::string t; + for (size_t i = 0; i < s.length(); i++) + if (s[i] != '\0') + t += s[i]; + else + t += '~'; + if (t.length() <= 64) + return t; + else + return t.substr(0, 30) + "..." + t.substr(s.length() - 31, 31); +} + +#define __testlib_readMany(readMany, readOne, typeName, space) \ + if (size < 0) \ + quit(_fail, #readMany ": size should be non-negative."); \ + if (size > 100000000) \ + quit(_fail, #readMany ": size should be at most 100000000."); \ + \ + std::vector result(size); \ + readManyIteration = indexBase; \ + \ + for (int i = 0; i < size; i++) \ + { \ + result[i] = readOne; \ + readManyIteration++; \ + if (strict && space && i + 1 < size) \ + readSpace(); \ + } \ + \ + readManyIteration = NO_INDEX; \ + return result; \ + + +std::string InStream::readWord(const pattern &p, const std::string &variableName) { + readWordTo(_tmpReadToken); + if (!p.matches(_tmpReadToken)) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, + ("Token \"" + __testlib_part(_tmpReadToken) + "\" doesn't correspond to pattern \"" + p.src() + + "\"").c_str()); + else + quit(_wa, ("Token parameter [name=" + variableName + "] equals to \"" + __testlib_part(_tmpReadToken) + + "\", doesn't correspond to pattern \"" + p.src() + "\"").c_str()); + } else { + if (variableName.empty()) + quit(_wa, ("Token element [index=" + vtos(readManyIteration) + "] equals to \"" + + __testlib_part(_tmpReadToken) + "\" doesn't correspond to pattern \"" + p.src() + + "\"").c_str()); + else + quit(_wa, ("Token element " + variableName + "[" + vtos(readManyIteration) + "] equals to \"" + + __testlib_part(_tmpReadToken) + "\", doesn't correspond to pattern \"" + p.src() + + "\"").c_str()); + } + } + if (strict && !variableName.empty()) + validator.addVariable(variableName); + return _tmpReadToken; +} + +std::vector +InStream::readWords(int size, const pattern &p, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readWords, readWord(p, variablesName), std::string, true); +} + +std::vector InStream::readWords(int size, int indexBase) { + __testlib_readMany(readWords, readWord(), std::string, true); +} + +std::string InStream::readWord(const std::string &ptrn, const std::string &variableName) { + return readWord(pattern(ptrn), variableName); +} + +std::vector +InStream::readWords(int size, const std::string &ptrn, const std::string &variablesName, int indexBase) { + pattern p(ptrn); + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readWords, readWord(p, variablesName), std::string, true); +} + +std::string InStream::readToken(const pattern &p, const std::string &variableName) { + return readWord(p, variableName); +} + +std::vector +InStream::readTokens(int size, const pattern &p, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readTokens, readToken(p, variablesName), std::string, true); +} + +std::vector InStream::readTokens(int size, int indexBase) { + __testlib_readMany(readTokens, readToken(), std::string, true); +} + +std::string InStream::readToken(const std::string &ptrn, const std::string &variableName) { + return readWord(ptrn, variableName); +} + +std::vector +InStream::readTokens(int size, const std::string &ptrn, const std::string &variablesName, int indexBase) { + pattern p(ptrn); + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readTokens, readWord(p, variablesName), std::string, true); +} + +void InStream::readWordTo(std::string &result, const pattern &p, const std::string &variableName) { + readWordTo(result); + if (!p.matches(result)) { + if (variableName.empty()) + quit(_wa, ("Token \"" + __testlib_part(result) + "\" doesn't correspond to pattern \"" + p.src() + + "\"").c_str()); + else + quit(_wa, ("Token parameter [name=" + variableName + "] equals to \"" + __testlib_part(result) + + "\", doesn't correspond to pattern \"" + p.src() + "\"").c_str()); + } + if (strict && !variableName.empty()) + validator.addVariable(variableName); +} + +void InStream::readWordTo(std::string &result, const std::string &ptrn, const std::string &variableName) { + return readWordTo(result, pattern(ptrn), variableName); +} + +void InStream::readTokenTo(std::string &result, const pattern &p, const std::string &variableName) { + return readWordTo(result, p, variableName); +} + +void InStream::readTokenTo(std::string &result, const std::string &ptrn, const std::string &variableName) { + return readWordTo(result, ptrn, variableName); +} + +#ifdef __GNUC__ +__attribute__((pure)) +#endif +static inline bool equals(long long integer, const char *s) { + if (integer == LLONG_MIN) + return strcmp(s, "-9223372036854775808") == 0; + + if (integer == 0LL) + return strcmp(s, "0") == 0; + + size_t length = strlen(s); + + if (length == 0) + return false; + + if (integer < 0 && s[0] != '-') + return false; + + if (integer < 0) + s++, length--, integer = -integer; + + if (length == 0) + return false; + + while (integer > 0) { + int digit = int(integer % 10); + + if (s[length - 1] != '0' + digit) + return false; + + length--; + integer /= 10; + } + + return length == 0; +} + +#ifdef __GNUC__ +__attribute__((pure)) +#endif +static inline bool equals(unsigned long long integer, const char *s) { + if (integer == ULLONG_MAX) + return strcmp(s, "18446744073709551615") == 0; + + if (integer == 0ULL) + return strcmp(s, "0") == 0; + + size_t length = strlen(s); + + if (length == 0) + return false; + + while (integer > 0) { + int digit = int(integer % 10); + + if (s[length - 1] != '0' + digit) + return false; + + length--; + integer /= 10; + } + + return length == 0; +} + +static inline double stringToDouble(InStream &in, const char *buffer) { + double result; + + size_t length = strlen(buffer); + + int minusCount = 0; + int plusCount = 0; + int decimalPointCount = 0; + int digitCount = 0; + int eCount = 0; + + for (size_t i = 0; i < length; i++) { + if (('0' <= buffer[i] && buffer[i] <= '9') || buffer[i] == '.' + || buffer[i] == 'e' || buffer[i] == 'E' + || buffer[i] == '-' || buffer[i] == '+') { + if ('0' <= buffer[i] && buffer[i] <= '9') + digitCount++; + if (buffer[i] == 'e' || buffer[i] == 'E') + eCount++; + if (buffer[i] == '-') + minusCount++; + if (buffer[i] == '+') + plusCount++; + if (buffer[i] == '.') + decimalPointCount++; + } else + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + // If for sure is not a number in standard notation or in e-notation. + if (digitCount == 0 || minusCount > 2 || plusCount > 2 || decimalPointCount > 1 || eCount > 1) + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + char *suffix = new char[length + 1]; + std::memset(suffix, 0, length + 1); + int scanned; +#ifdef _MSC_VER + scanned = sscanf_s(buffer, "%lf%s", &result, suffix, (unsigned int)(length + 1)); +#else + scanned = std::sscanf(buffer, "%lf%s", &result, suffix); +#endif + bool empty = strlen(suffix) == 0; + delete[] suffix; + + if (scanned == 1 || (scanned == 2 && empty)) { + if (__testlib_isNaN(result)) + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + return result; + } else + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); +} + +static inline double stringToDouble(InStream &in, const std::string& buffer) { + for (size_t i = 0; i < buffer.length(); i++) + if (buffer[i] == '\0') + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found (it contains \\0)").c_str()); + return stringToDouble(in, buffer.c_str()); +} + +static inline double stringToStrictDouble(InStream &in, const char *buffer, + int minAfterPointDigitCount, int maxAfterPointDigitCount) { + if (minAfterPointDigitCount < 0) + in.quit(_fail, "stringToStrictDouble: minAfterPointDigitCount should be non-negative."); + + if (minAfterPointDigitCount > maxAfterPointDigitCount) + in.quit(_fail, + "stringToStrictDouble: minAfterPointDigitCount should be less or equal to maxAfterPointDigitCount."); + + double result; + + size_t length = strlen(buffer); + + if (length == 0 || length > 1000) + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + if (buffer[0] != '-' && (buffer[0] < '0' || buffer[0] > '9')) + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + int pointPos = -1; + for (size_t i = 1; i + 1 < length; i++) { + if (buffer[i] == '.') { + if (pointPos > -1) + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + pointPos = int(i); + } + if (buffer[i] != '.' && (buffer[i] < '0' || buffer[i] > '9')) + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + if (buffer[length - 1] < '0' || buffer[length - 1] > '9') + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + int afterDigitsCount = (pointPos == -1 ? 0 : int(length) - pointPos - 1); + if (afterDigitsCount < minAfterPointDigitCount || afterDigitsCount > maxAfterPointDigitCount) + in.quit(_pe, ("Expected strict double with number of digits after point in range [" + + vtos(minAfterPointDigitCount) + + "," + + vtos(maxAfterPointDigitCount) + + "], but \"" + __testlib_part(buffer) + "\" found").c_str() + ); + + int firstDigitPos = -1; + for (size_t i = 0; i < length; i++) + if (buffer[i] >= '0' && buffer[i] <= '9') { + firstDigitPos = int(i); + break; + } + + if (firstDigitPos > 1 || firstDigitPos == -1) + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + if (buffer[firstDigitPos] == '0' && firstDigitPos + 1 < int(length) + && buffer[firstDigitPos + 1] >= '0' && buffer[firstDigitPos + 1] <= '9') + in.quit(_pe, ("Expected strict double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + char *suffix = new char[length + 1]; + std::memset(suffix, 0, length + 1); + int scanned; +#ifdef _MSC_VER + scanned = sscanf_s(buffer, "%lf%s", &result, suffix, (unsigned int)(length + 1)); +#else + scanned = std::sscanf(buffer, "%lf%s", &result, suffix); +#endif + bool empty = strlen(suffix) == 0; + delete[] suffix; + + if (scanned == 1 || (scanned == 2 && empty)) { + if (__testlib_isNaN(result) || __testlib_isInfinite(result)) + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); + if (buffer[0] == '-' && result >= 0) + in.quit(_pe, ("Redundant minus in \"" + __testlib_part(buffer) + "\" found").c_str()); + return result; + } else + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found").c_str()); +} + +static inline double stringToStrictDouble(InStream &in, const std::string& buffer, + int minAfterPointDigitCount, int maxAfterPointDigitCount) { + for (size_t i = 0; i < buffer.length(); i++) + if (buffer[i] == '\0') + in.quit(_pe, ("Expected double, but \"" + __testlib_part(buffer) + "\" found (it contains \\0)").c_str()); + return stringToStrictDouble(in, buffer.c_str(), minAfterPointDigitCount, maxAfterPointDigitCount); +} + +static inline long long stringToLongLong(InStream &in, const char *buffer) { + size_t length = strlen(buffer); + if (length == 0 || length > 20) + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + bool has_minus = (length > 1 && buffer[0] == '-'); + int zeroes = 0; + bool processingZeroes = true; + + for (int i = (has_minus ? 1 : 0); i < int(length); i++) { + if (buffer[i] == '0' && processingZeroes) + zeroes++; + else + processingZeroes = false; + + if (buffer[i] < '0' || buffer[i] > '9') + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + long long int result; + try { + result = std::stoll(buffer); + } catch (const std::exception&) { + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } catch (...) { + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + if ((zeroes > 0 && (result != 0 || has_minus)) || zeroes > 1) + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + return result; +} + +static inline long long stringToLongLong(InStream &in, const std::string& buffer) { + for (size_t i = 0; i < buffer.length(); i++) + if (buffer[i] == '\0') + in.quit(_pe, ("Expected integer, but \"" + __testlib_part(buffer) + "\" found (it contains \\0)").c_str()); + return stringToLongLong(in, buffer.c_str()); +} + +static inline unsigned long long stringToUnsignedLongLong(InStream &in, const char *buffer) { + size_t length = strlen(buffer); + + if (length == 0 || length > 20) + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + if (length > 1 && buffer[0] == '0') + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + + for (int i = 0; i < int(length); i++) { + if (buffer[i] < '0' || buffer[i] > '9') + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + unsigned long long result; + try { + result = std::stoull(buffer); + } catch (const std::exception&) { + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } catch (...) { + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found").c_str()); + } + + return result; +} + +static inline long long stringToUnsignedLongLong(InStream &in, const std::string& buffer) { + for (size_t i = 0; i < buffer.length(); i++) + if (buffer[i] == '\0') + in.quit(_pe, ("Expected unsigned integer, but \"" + __testlib_part(buffer) + "\" found (it contains \\0)").c_str()); + return stringToUnsignedLongLong(in, buffer.c_str()); +} + +int InStream::readInteger() { + if (!strict && seekEof()) + quit(_unexpected_eof, "Unexpected end of file - int32 expected"); + + readWordTo(_tmpReadToken); + + long long value = stringToLongLong(*this, _tmpReadToken); + if (value < INT_MIN || value > INT_MAX) + quit(_pe, ("Expected int32, but \"" + __testlib_part(_tmpReadToken) + "\" found").c_str()); + + return int(value); +} + +long long InStream::readLong() { + if (!strict && seekEof()) + quit(_unexpected_eof, "Unexpected end of file - int64 expected"); + + readWordTo(_tmpReadToken); + + return stringToLongLong(*this, _tmpReadToken); +} + +unsigned long long InStream::readUnsignedLong() { + if (!strict && seekEof()) + quit(_unexpected_eof, "Unexpected end of file - int64 expected"); + + readWordTo(_tmpReadToken); + + return stringToUnsignedLongLong(*this, _tmpReadToken); +} + +long long InStream::readLong(long long minv, long long maxv, const std::string &variableName) { + long long result = readLong(); + + if (result < minv || result > maxv) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, ("Integer " + vtos(result) + " violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + + "]").c_str()); + else + quit(_wa, ("Integer parameter [name=" + std::string(variableName) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + } else { + if (variableName.empty()) + quit(_wa, ("Integer element [index=" + vtos(readManyIteration) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + else + quit(_wa, + ("Integer element " + std::string(variableName) + "[" + vtos(readManyIteration) + "] equals to " + + vtos(result) + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + } + } + + if (strict && !variableName.empty()) { + validator.addBoundsHit(variableName, ValidatorBoundsHit(minv == result, maxv == result)); + validator.adjustConstantBounds(variableName, minv, maxv); + validator.addVariable(variableName); + } + + return result; +} + +std::vector +InStream::readLongs(int size, long long minv, long long maxv, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readLongs, readLong(minv, maxv, variablesName), long long, true) +} + +std::vector InStream::readLongs(int size, int indexBase) { + __testlib_readMany(readLongs, readLong(), long long, true) +} + +unsigned long long +InStream::readUnsignedLong(unsigned long long minv, unsigned long long maxv, const std::string &variableName) { + unsigned long long result = readUnsignedLong(); + + if (result < minv || result > maxv) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, + ("Unsigned integer " + vtos(result) + " violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + + "]").c_str()); + else + quit(_wa, + ("Unsigned integer parameter [name=" + std::string(variableName) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + } else { + if (variableName.empty()) + quit(_wa, + ("Unsigned integer element [index=" + vtos(readManyIteration) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + else + quit(_wa, ("Unsigned integer element " + std::string(variableName) + "[" + vtos(readManyIteration) + + "] equals to " + vtos(result) + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + + "]").c_str()); + } + } + + if (strict && !variableName.empty()) { + validator.addBoundsHit(variableName, ValidatorBoundsHit(minv == result, maxv == result)); + validator.adjustConstantBounds(variableName, minv, maxv); + validator.addVariable(variableName); + } + + return result; +} + +std::vector InStream::readUnsignedLongs(int size, unsigned long long minv, unsigned long long maxv, + const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readUnsignedLongs, readUnsignedLong(minv, maxv, variablesName), unsigned long long, true) +} + +std::vector InStream::readUnsignedLongs(int size, int indexBase) { + __testlib_readMany(readUnsignedLongs, readUnsignedLong(), unsigned long long, true) +} + +unsigned long long +InStream::readLong(unsigned long long minv, unsigned long long maxv, const std::string &variableName) { + return readUnsignedLong(minv, maxv, variableName); +} + +int InStream::readInt() { + return readInteger(); +} + +int InStream::readInt(int minv, int maxv, const std::string &variableName) { + int result = readInt(); + + if (result < minv || result > maxv) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, ("Integer " + vtos(result) + " violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + + "]").c_str()); + else + quit(_wa, ("Integer parameter [name=" + std::string(variableName) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + } else { + if (variableName.empty()) + quit(_wa, ("Integer element [index=" + vtos(readManyIteration) + "] equals to " + vtos(result) + + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + else + quit(_wa, + ("Integer element " + std::string(variableName) + "[" + vtos(readManyIteration) + "] equals to " + + vtos(result) + ", violates the range [" + toHumanReadableString(minv) + ", " + toHumanReadableString(maxv) + "]").c_str()); + } + } + + if (strict && !variableName.empty()) { + validator.addBoundsHit(variableName, ValidatorBoundsHit(minv == result, maxv == result)); + validator.adjustConstantBounds(variableName, minv, maxv); + validator.addVariable(variableName); + } + + return result; +} + +int InStream::readInteger(int minv, int maxv, const std::string &variableName) { + return readInt(minv, maxv, variableName); +} + +std::vector InStream::readInts(int size, int minv, int maxv, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readInts, readInt(minv, maxv, variablesName), int, true) +} + +std::vector InStream::readInts(int size, int indexBase) { + __testlib_readMany(readInts, readInt(), int, true) +} + +std::vector InStream::readIntegers(int size, int minv, int maxv, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readIntegers, readInt(minv, maxv, variablesName), int, true) +} + +std::vector InStream::readIntegers(int size, int indexBase) { + __testlib_readMany(readIntegers, readInt(), int, true) +} + +double InStream::readReal() { + if (!strict && seekEof()) + quit(_unexpected_eof, "Unexpected end of file - double expected"); + + return stringToDouble(*this, readWord()); +} + +double InStream::readDouble() { + return readReal(); +} + +double InStream::readReal(double minv, double maxv, const std::string &variableName) { + double result = readReal(); + + if (result < minv || result > maxv) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, ("Double " + vtos(result) + " violates the range [" + vtos(minv) + ", " + vtos(maxv) + + "]").c_str()); + else + quit(_wa, ("Double parameter [name=" + std::string(variableName) + "] equals to " + vtos(result) + + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + "]").c_str()); + } else { + if (variableName.empty()) + quit(_wa, ("Double element [index=" + vtos(readManyIteration) + "] equals to " + vtos(result) + + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + "]").c_str()); + else + quit(_wa, + ("Double element " + std::string(variableName) + "[" + vtos(readManyIteration) + "] equals to " + + vtos(result) + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + "]").c_str()); + } + } + + if (strict && !variableName.empty()) { + validator.addBoundsHit(variableName, ValidatorBoundsHit( + doubleDelta(minv, result) < ValidatorBoundsHit::EPS, + doubleDelta(maxv, result) < ValidatorBoundsHit::EPS + )); + validator.adjustConstantBounds(variableName, minv, maxv); + validator.addVariable(variableName); + } + + return result; +} + +std::vector +InStream::readReals(int size, double minv, double maxv, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readReals, readReal(minv, maxv, variablesName), double, true) +} + +std::vector InStream::readReals(int size, int indexBase) { + __testlib_readMany(readReals, readReal(), double, true) +} + +double InStream::readDouble(double minv, double maxv, const std::string &variableName) { + return readReal(minv, maxv, variableName); +} + +std::vector +InStream::readDoubles(int size, double minv, double maxv, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readDoubles, readDouble(minv, maxv, variablesName), double, true) +} + +std::vector InStream::readDoubles(int size, int indexBase) { + __testlib_readMany(readDoubles, readDouble(), double, true) +} + +double InStream::readStrictReal(double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variableName) { + if (!strict && seekEof()) + quit(_unexpected_eof, "Unexpected end of file - strict double expected"); + + double result = stringToStrictDouble(*this, readWord(), minAfterPointDigitCount, maxAfterPointDigitCount); + + if (result < minv || result > maxv) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, ("Strict double " + vtos(result) + " violates the range [" + vtos(minv) + ", " + vtos(maxv) + + "]").c_str()); + else + quit(_wa, + ("Strict double parameter [name=" + std::string(variableName) + "] equals to " + vtos(result) + + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + "]").c_str()); + } else { + if (variableName.empty()) + quit(_wa, ("Strict double element [index=" + vtos(readManyIteration) + "] equals to " + vtos(result) + + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + "]").c_str()); + else + quit(_wa, ("Strict double element " + std::string(variableName) + "[" + vtos(readManyIteration) + + "] equals to " + vtos(result) + ", violates the range [" + vtos(minv) + ", " + vtos(maxv) + + "]").c_str()); + } + } + + if (strict && !variableName.empty()) { + validator.addBoundsHit(variableName, ValidatorBoundsHit( + doubleDelta(minv, result) < ValidatorBoundsHit::EPS, + doubleDelta(maxv, result) < ValidatorBoundsHit::EPS + )); + validator.adjustConstantBounds(variableName, minv, maxv); + validator.addVariable(variableName); + } + + return result; +} + +std::vector InStream::readStrictReals(int size, double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readStrictReals, + readStrictReal(minv, maxv, minAfterPointDigitCount, maxAfterPointDigitCount, variablesName), + double, true) +} + +double InStream::readStrictDouble(double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variableName) { + return readStrictReal(minv, maxv, + minAfterPointDigitCount, maxAfterPointDigitCount, + variableName); +} + +std::vector InStream::readStrictDoubles(int size, double minv, double maxv, + int minAfterPointDigitCount, int maxAfterPointDigitCount, + const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readStrictDoubles, + readStrictDouble(minv, maxv, minAfterPointDigitCount, maxAfterPointDigitCount, variablesName), + double, true) +} + +bool InStream::eof() { + if (!strict && NULL == reader) + return true; + + return reader->eof(); +} + +bool InStream::seekEof() { + if (!strict && NULL == reader) + return true; + skipBlanks(); + return eof(); +} + +bool InStream::eoln() { + if (!strict && NULL == reader) + return true; + + int c = reader->nextChar(); + + if (!strict) { + if (c == EOFC) + return true; + + if (c == CR) { + c = reader->nextChar(); + + if (c != LF) { + reader->unreadChar(c); + reader->unreadChar(CR); + return false; + } else + return true; + } + + if (c == LF) + return true; + + reader->unreadChar(c); + return false; + } else { + bool returnCr = false; + +#if (defined(ON_WINDOWS) && !defined(FOR_LINUX)) || defined(FOR_WINDOWS) + if (c != CR) { + reader->unreadChar(c); + return false; + } else { + if (!returnCr) + returnCr = true; + c = reader->nextChar(); + } +#endif + if (c != LF) { + reader->unreadChar(c); + if (returnCr) + reader->unreadChar(CR); + return false; + } + + return true; + } +} + +void InStream::readEoln() { + lastLine = reader->getLine(); + if (!eoln()) + quit(_pe, "Expected EOLN"); +} + +void InStream::readEof() { + lastLine = reader->getLine(); + if (!eof()) + quit(_pe, "Expected EOF"); + + if (TestlibFinalizeGuard::alive && this == &inf) + testlibFinalizeGuard.readEofCount++; +} + +bool InStream::seekEoln() { + if (!strict && NULL == reader) + return true; + + int cur; + do { + cur = reader->nextChar(); + } while (cur == SPACE || cur == TAB); + + reader->unreadChar(cur); + return eoln(); +} + +void InStream::nextLine() { + readLine(); +} + +void InStream::readStringTo(std::string &result) { + if (NULL == reader) + quit(_pe, "Expected line"); + + result.clear(); + + for (;;) { + int cur = reader->curChar(); + + if (cur == LF || cur == EOFC) + break; + + if (cur == CR) { + cur = reader->nextChar(); + if (reader->curChar() == LF) { + reader->unreadChar(cur); + break; + } + } + + lastLine = reader->getLine(); + result += char(reader->nextChar()); + } + + if (strict) + readEoln(); + else + eoln(); +} + +std::string InStream::readString() { + readStringTo(_tmpReadToken); + return _tmpReadToken; +} + +std::vector InStream::readStrings(int size, int indexBase) { + __testlib_readMany(readStrings, readString(), std::string, false) +} + +void InStream::readStringTo(std::string &result, const pattern &p, const std::string &variableName) { + readStringTo(result); + if (!p.matches(result)) { + if (readManyIteration == NO_INDEX) { + if (variableName.empty()) + quit(_wa, ("Line \"" + __testlib_part(result) + "\" doesn't correspond to pattern \"" + p.src() + + "\"").c_str()); + else + quit(_wa, ("Line [name=" + variableName + "] equals to \"" + __testlib_part(result) + + "\", doesn't correspond to pattern \"" + p.src() + "\"").c_str()); + } else { + if (variableName.empty()) + quit(_wa, + ("Line element [index=" + vtos(readManyIteration) + "] equals to \"" + __testlib_part(result) + + "\" doesn't correspond to pattern \"" + p.src() + "\"").c_str()); + else + quit(_wa, + ("Line element " + std::string(variableName) + "[" + vtos(readManyIteration) + "] equals to \"" + + __testlib_part(result) + "\", doesn't correspond to pattern \"" + p.src() + "\"").c_str()); + } + } + if (strict && !variableName.empty()) + validator.addVariable(variableName); +} + +void InStream::readStringTo(std::string &result, const std::string &ptrn, const std::string &variableName) { + readStringTo(result, pattern(ptrn), variableName); +} + +std::string InStream::readString(const pattern &p, const std::string &variableName) { + readStringTo(_tmpReadToken, p, variableName); + return _tmpReadToken; +} + +std::vector +InStream::readStrings(int size, const pattern &p, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readStrings, readString(p, variablesName), std::string, false) +} + +std::string InStream::readString(const std::string &ptrn, const std::string &variableName) { + readStringTo(_tmpReadToken, ptrn, variableName); + return _tmpReadToken; +} + +std::vector +InStream::readStrings(int size, const std::string &ptrn, const std::string &variablesName, int indexBase) { + pattern p(ptrn); + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readStrings, readString(p, variablesName), std::string, false) +} + +void InStream::readLineTo(std::string &result) { + readStringTo(result); +} + +std::string InStream::readLine() { + return readString(); +} + +std::vector InStream::readLines(int size, int indexBase) { + __testlib_readMany(readLines, readString(), std::string, false) +} + +void InStream::readLineTo(std::string &result, const pattern &p, const std::string &variableName) { + readStringTo(result, p, variableName); +} + +void InStream::readLineTo(std::string &result, const std::string &ptrn, const std::string &variableName) { + readStringTo(result, ptrn, variableName); +} + +std::string InStream::readLine(const pattern &p, const std::string &variableName) { + return readString(p, variableName); +} + +std::vector +InStream::readLines(int size, const pattern &p, const std::string &variablesName, int indexBase) { + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readLines, readString(p, variablesName), std::string, false) +} + +std::string InStream::readLine(const std::string &ptrn, const std::string &variableName) { + return readString(ptrn, variableName); +} + +std::vector +InStream::readLines(int size, const std::string &ptrn, const std::string &variablesName, int indexBase) { + pattern p(ptrn); + if (strict && !variablesName.empty()) + validator.addVariable(variablesName); + __testlib_readMany(readLines, readString(p, variablesName), std::string, false) +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 3, 4))) +#endif +void InStream::ensuref(bool cond, const char *format, ...) { + if (!cond) { + FMT_TO_RESULT(format, format, message); + this->__testlib_ensure(cond, message); + } +} + +void InStream::__testlib_ensure(bool cond, std::string message) { + if (!cond) + this->quit(_wa, message.c_str()); +} + +void InStream::close() { + if (NULL != reader) { + reader->close(); + delete reader; + reader = NULL; + } + + opened = false; +} + +NORETURN void quit(TResult result, const std::string &msg) { + ouf.quit(result, msg.c_str()); +} + +NORETURN void quit(TResult result, const char *msg) { + ouf.quit(result, msg); +} + +double __testlib_preparePoints(double points_) { + volatile double points = points_; + if (__testlib_isNaN(points)) + quit(_fail, "Parameter 'points' can't be nan"); + if (__testlib_isInfinite(points)) + quit(_fail, "Parameter 'points' can't be infinite"); + if (points < -1E-8) + quit(_fail, "Parameter 'points' can't be negative"); + if (points <= 0.0) + points = +0.0; + if (points > 1E6 + 1E-8) + quit(_fail, "Parameter 'points' can't be greater than 1E6"); + if (points >= 1E6) + points = 1E6; + return points; +} + +NORETURN void __testlib_quitp(double points, const char *message) { + __testlib_points = __testlib_preparePoints(points); + std::string stringPoints = removeDoubleTrailingZeroes(testlib_format_("%.10f", __testlib_points)); + + std::string quitMessage; + if (NULL == message || 0 == strlen(message)) + quitMessage = stringPoints; + else + quitMessage = stringPoints + " " + message; + + quit(_points, quitMessage.c_str()); +} + +NORETURN void __testlib_quitp(int points, const char *message) { + __testlib_points = __testlib_preparePoints(points); + std::string stringPoints = testlib_format_("%d", points); + + std::string quitMessage; + if (NULL == message || 0 == strlen(message)) + quitMessage = stringPoints; + else + quitMessage = stringPoints + " " + message; + + quit(_points, quitMessage.c_str()); +} + +NORETURN void quitp(float points, const std::string &message = "") { + __testlib_quitp(double(points), message.c_str()); +} + +NORETURN void quitp(double points, const std::string &message = "") { + __testlib_quitp(points, message.c_str()); +} + +NORETURN void quitp(long double points, const std::string &message = "") { + __testlib_quitp(double(points), message.c_str()); +} + +NORETURN void quitp(int points, const std::string &message = "") { + __testlib_quitp(points, message.c_str()); +} + +NORETURN void quitpi(const std::string &points_info, const std::string &message = "") { + if (points_info.find(' ') != std::string::npos) + quit(_fail, "Parameter 'points_info' can't contain spaces"); + if (message.empty()) + quit(_points, ("points_info=" + points_info).c_str()); + else + quit(_points, ("points_info=" + points_info + " " + message).c_str()); +} + +template +#ifdef __GNUC__ +__attribute__ ((format (printf, 2, 3))) +#endif +NORETURN void quitp(F points, const char *format, ...) { + FMT_TO_RESULT(format, format, message); + quitp(points, message); +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 2, 3))) +#endif +NORETURN void quitf(TResult result, const char *format, ...) { + FMT_TO_RESULT(format, format, message); + quit(result, message); +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 3, 4))) +#endif +void quitif(bool condition, TResult result, const char *format, ...) { + if (condition) { + FMT_TO_RESULT(format, format, message); + quit(result, message); + } +} + +NORETURN void __testlib_help() { + InStream::textColor(InStream::LightCyan); + std::fprintf(stderr, "TESTLIB %s, https://github.com/MikeMirzayanov/testlib/ ", VERSION); + std::fprintf(stderr, "by Mike Mirzayanov, copyright(c) 2005-2020\n"); + std::fprintf(stderr, "Checker name: \"%s\"\n", checkerName.c_str()); + InStream::textColor(InStream::LightGray); + + std::fprintf(stderr, "\n"); + std::fprintf(stderr, "Latest features: \n"); + for (size_t i = 0; i < sizeof(latestFeatures) / sizeof(char *); i++) { + std::fprintf(stderr, "*) %s\n", latestFeatures[i]); + } + std::fprintf(stderr, "\n"); + + std::fprintf(stderr, "Program must be run with the following arguments: \n"); + std::fprintf(stderr, " [--testset testset] [--group group] [ [<-appes>]]\n\n"); + + __testlib_exitCode = FAIL_EXIT_CODE; + std::exit(FAIL_EXIT_CODE); +} + +static void __testlib_ensuresPreconditions() { + // testlib assumes: sizeof(int) = 4. + __TESTLIB_STATIC_ASSERT(sizeof(int) == 4); + + // testlib assumes: INT_MAX == 2147483647. + __TESTLIB_STATIC_ASSERT(INT_MAX == 2147483647); + + // testlib assumes: sizeof(long long) = 8. + __TESTLIB_STATIC_ASSERT(sizeof(long long) == 8); + + // testlib assumes: sizeof(double) = 8. + __TESTLIB_STATIC_ASSERT(sizeof(double) == 8); + + // testlib assumes: no -ffast-math. + if (!__testlib_isNaN(+__testlib_nan())) + quit(_fail, "Function __testlib_isNaN is not working correctly: possible reason is '-ffast-math'"); + if (!__testlib_isNaN(-__testlib_nan())) + quit(_fail, "Function __testlib_isNaN is not working correctly: possible reason is '-ffast-math'"); +} + +std::string __testlib_testset; + +std::string getTestset() { + return __testlib_testset; +} + +std::string __testlib_group; + +std::string getGroup() { + return __testlib_group; +} + +static void __testlib_set_testset_and_group(int argc, char* argv[]) { + for (int i = 1; i < argc; i++) { + if (!strcmp("--testset", argv[i])) { + if (i + 1 < argc && strlen(argv[i + 1]) > 0) + __testlib_testset = argv[++i]; + else + quit(_fail, std::string("Expected non-empty testset after --testset command line parameter")); + } else if (!strcmp("--group", argv[i])) { + if (i + 1 < argc) + __testlib_group = argv[++i]; + else + quit(_fail, std::string("Expected group after --group command line parameter")); + } + } +} + +void registerGen(int argc, char *argv[], int randomGeneratorVersion) { + if (randomGeneratorVersion < 0 || randomGeneratorVersion > 1) + quitf(_fail, "Random generator version is expected to be 0 or 1."); + random_t::version = randomGeneratorVersion; + + __testlib_ensuresPreconditions(); + TestlibFinalizeGuard::registered = true; + + testlibMode = _generator; + __testlib_set_binary(stdin); + rnd.setSeed(argc, argv); + +#if __cplusplus > 199711L || defined(_MSC_VER) + prepareOpts(argc, argv); +#endif +} + +#ifdef USE_RND_AS_BEFORE_087 +void registerGen(int argc, char* argv[]) +{ + registerGen(argc, argv, 0); +} +#else +#ifdef __GNUC__ +#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 4)) +__attribute__ ((deprecated("Use registerGen(argc, argv, 0) or registerGen(argc, argv, 1)." +" The third parameter stands for the random generator version." +" If you are trying to compile old generator use macro -DUSE_RND_AS_BEFORE_087 or registerGen(argc, argv, 0)." +" Version 1 has been released on Spring, 2013. Use it to write new generators."))) +#else +__attribute__ ((deprecated)) +#endif +#endif +#ifdef _MSC_VER +__declspec(deprecated("Use registerGen(argc, argv, 0) or registerGen(argc, argv, 1)." + " The third parameter stands for the random generator version." + " If you are trying to compile old generator use macro -DUSE_RND_AS_BEFORE_087 or registerGen(argc, argv, 0)." + " Version 1 has been released on Spring, 2013. Use it to write new generators.")) +#endif +void registerGen(int argc, char *argv[]) { + std::fprintf(stderr, "Use registerGen(argc, argv, 0) or registerGen(argc, argv, 1)." + " The third parameter stands for the random generator version." + " If you are trying to compile old generator use macro -DUSE_RND_AS_BEFORE_087 or registerGen(argc, argv, 0)." + " Version 1 has been released on Spring, 2013. Use it to write new generators.\n\n"); + registerGen(argc, argv, 0); +} +#endif + +void setAppesModeEncoding(std::string appesModeEncoding) { + static const char* const ENCODINGS[] = {"ascii", "utf-7", "utf-8", "utf-16", "utf-16le", "utf-16be", "utf-32", "utf-32le", "utf-32be", "iso-8859-1", +"iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-9", "iso-8859-10", "iso-8859-11", +"iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", +"windows-1256", "windows-1257", "windows-1258", "gb2312", "gbk", "gb18030", "big5", "shift-jis", "euc-jp", "euc-kr", +"euc-cn", "euc-tw", "koi8-r", "koi8-u", "tis-620", "ibm437", "ibm850", "ibm852", "ibm855", "ibm857", +"ibm860", "ibm861", "ibm862", "ibm863", "ibm865", "ibm866", "ibm869", "macroman", "maccentraleurope", "maciceland", +"maccroatian", "macromania", "maccyrillic", "macukraine", "macgreek", "macturkish", "machebrew", "macarabic", "macthai", "hz-gb-2312", +"iso-2022-jp", "iso-2022-kr", "iso-2022-cn", "armscii-8", "tscii", "iscii", "viscii", "geostd8", "cp949", "cp874", +"cp1006", "cp775", "cp858", "cp737", "cp853", "cp856", "cp922", "cp1046", "cp1125", "cp1131", +"ptcp154", "koi8-t", "koi8-ru", "mulelao-1", "cp1133", "iso-ir-166", "tcvn", "iso-ir-14", "iso-ir-87", "iso-ir-159"}; + + appesModeEncoding = lowerCase(appesModeEncoding); + bool valid = false; + for (size_t i = 0; i < sizeof(ENCODINGS) / sizeof(ENCODINGS[0]); i++) + if (appesModeEncoding == ENCODINGS[i]) { + valid = true; + break; + } + if (!valid) + quit(_fail, "Unexpected encoding for setAppesModeEncoding(encoding)"); + ::appesModeEncoding = appesModeEncoding; +} + +void registerInteraction(int argc, char *argv[]) { + __testlib_ensuresPreconditions(); + __testlib_set_testset_and_group(argc, argv); + TestlibFinalizeGuard::registered = true; + + testlibMode = _interactor; + __testlib_set_binary(stdin); + + if (argc > 1 && !strcmp("--help", argv[1])) + __testlib_help(); + + if (argc < 3 || argc > 6) { + quit(_fail, std::string("Program must be run with the following arguments: ") + + std::string(" [ [ [<-appes>]]]") + + "\nUse \"--help\" to get help information"); + } + + if (argc <= 4) { + resultName = ""; + appesMode = false; + } + +#ifndef EJUDGE + if (argc == 5) { + resultName = argv[4]; + appesMode = false; + } + + if (argc == 6) { + if (strcmp("-APPES", argv[5]) && strcmp("-appes", argv[5])) { + quit(_fail, std::string("Program must be run with the following arguments: ") + + " [ [<-appes>]]"); + } else { + resultName = argv[4]; + appesMode = true; + } + } +#endif + + inf.init(argv[1], _input); + + tout.open(argv[2], std::ios_base::out); + if (tout.fail() || !tout.is_open()) + quit(_fail, std::string("Can not write to the test-output-file '") + argv[2] + std::string("'")); + + ouf.init(stdin, _output); + + if (argc >= 4) + ans.init(argv[3], _answer); + else + ans.name = "unopened answer stream"; +} + +void registerValidation() { + __testlib_ensuresPreconditions(); + TestlibFinalizeGuard::registered = true; + + testlibMode = _validator; + + __testlib_set_binary(stdin); + __testlib_set_binary(stdout); + __testlib_set_binary(stderr); + + inf.init(stdin, _input); + inf.strict = true; +} + +void registerValidation(int argc, char *argv[]) { + registerValidation(); + __testlib_set_testset_and_group(argc, argv); + + validator.initialize(); + TestlibFinalizeGuard::registered = true; + + std::string comment = "Validator must be run with the following arguments:" + " [--testset testset]" + " [--group group]" + " [--testOverviewLogFileName fileName]" + " [--testMarkupFileName fileName]" + " [--testCase testCase]" + " [--testCaseFileName fileName]" + ; + + for (int i = 1; i < argc; i++) { + if (!strcmp("--testset", argv[i])) { + if (i + 1 < argc && strlen(argv[i + 1]) > 0) + validator.setTestset(argv[++i]); + else + quit(_fail, comment); + } + if (!strcmp("--group", argv[i])) { + if (i + 1 < argc) + validator.setGroup(argv[++i]); + else + quit(_fail, comment); + } + if (!strcmp("--testOverviewLogFileName", argv[i])) { + if (i + 1 < argc) + validator.setTestOverviewLogFileName(argv[++i]); + else + quit(_fail, comment); + } + if (!strcmp("--testMarkupFileName", argv[i])) { + if (i + 1 < argc) + validator.setTestMarkupFileName(argv[++i]); + else + quit(_fail, comment); + } + if (!strcmp("--testCase", argv[i])) { + if (i + 1 < argc) { + long long testCase = stringToLongLong(inf, argv[++i]); + if (testCase < 1 || testCase >= __TESTLIB_MAX_TEST_CASE) + quit(_fail, testlib_format_("Argument testCase should be between 1 and %d, but ", __TESTLIB_MAX_TEST_CASE) + + toString(testCase) + " found"); + validator.setTestCase(int(testCase)); + } else + quit(_fail, comment); + } + if (!strcmp("--testCaseFileName", argv[i])) { + if (i + 1 < argc) { + validator.setTestCaseFileName(argv[++i]); + } else + quit(_fail, comment); + } + } +} + +void addFeature(const std::string &feature) { + if (testlibMode != _validator) + quit(_fail, "Features are supported in validators only."); + validator.addFeature(feature); +} + +void feature(const std::string &feature) { + if (testlibMode != _validator) + quit(_fail, "Features are supported in validators only."); + validator.feature(feature); +} + +class Checker { +private: + bool _initialized; + std::string _testset; + std::string _group; + +public: + Checker() : _initialized(false), _testset("tests"), _group() { + } + + void initialize() { + _initialized = true; + } + + std::string testset() const { + if (!_initialized) + __testlib_fail("Checker should be initialized with registerTestlibCmd(argc, argv) instead of registerTestlibCmd() to support checker.testset()"); + return _testset; + } + + std::string group() const { + if (!_initialized) + __testlib_fail("Checker should be initialized with registerTestlibCmd(argc, argv) instead of registerTestlibCmd() to support checker.group()"); + return _group; + } + + void setTestset(const char *const testset) { + _testset = testset; + } + + void setGroup(const char *const group) { + _group = group; + } +} checker; + +void registerTestlibCmd(int argc, char *argv[]) { + __testlib_ensuresPreconditions(); + __testlib_set_testset_and_group(argc, argv); + TestlibFinalizeGuard::registered = true; + + testlibMode = _checker; + __testlib_set_binary(stdin); + + std::vector args(1, argv[0]); + checker.initialize(); + + for (int i = 1; i < argc; i++) { + if (!strcmp("--testset", argv[i])) { + if (i + 1 < argc && strlen(argv[i + 1]) > 0) + checker.setTestset(argv[++i]); + else + quit(_fail, std::string("Expected testset after --testset command line parameter")); + } else if (!strcmp("--group", argv[i])) { + if (i + 1 < argc) + checker.setGroup(argv[++i]); + else + quit(_fail, std::string("Expected group after --group command line parameter")); + } else + args.push_back(argv[i]); + } + + argc = int(args.size()); + if (argc > 1 && "--help" == args[1]) + __testlib_help(); + + if (argc < 4 || argc > 6) { + quit(_fail, std::string("Program must be run with the following arguments: ") + + std::string("[--testset testset] [--group group] [ [<-appes>]]") + + "\nUse \"--help\" to get help information"); + } + + if (argc == 4) { + resultName = ""; + appesMode = false; + } + +#ifndef EJUDGE + if (argc == 5) { + resultName = args[4]; + appesMode = false; + } + + if (argc == 6) { + if ("-APPES" != args[5] && "-appes" != args[5]) { + quit(_fail, std::string("Program must be run with the following arguments: ") + + " [ [<-appes>]]"); + } else { + resultName = args[4]; + appesMode = true; + } + } +#endif + + inf.init(args[1], _input); + ouf.init(args[2], _output); + ouf.skipBom(); + ans.init(args[3], _answer); +} + +void registerTestlib(int argc, ...) { + if (argc < 3 || argc > 5) + quit(_fail, std::string("Program must be run with the following arguments: ") + + " [ [<-appes>]]"); + + char **argv = new char *[argc + 1]; + + va_list ap; + va_start(ap, argc); + argv[0] = NULL; + for (int i = 0; i < argc; i++) { + argv[i + 1] = va_arg(ap, char*); + } + va_end(ap); + + registerTestlibCmd(argc + 1, argv); + delete[] argv; +} + +static inline void __testlib_ensure(bool cond, const std::string &msg) { + if (!cond) + quit(_fail, msg.c_str()); +} + +#ifdef __GNUC__ +__attribute__((unused)) +#endif +static inline void __testlib_ensure(bool cond, const char *msg) { + if (!cond) + quit(_fail, msg); +} + +#define ensure(cond) __testlib_ensure((cond), "Condition failed: \"" #cond "\"") +#define STRINGIZE_DETAIL(x) (#x) +#define STRINGIZE(x) STRINGIZE_DETAIL((x)) +#define ensure_ext(cond) __testlib_ensure((cond), "Line " STRINGIZE(__LINE__) ": Condition failed: \"" #cond "\"") + +#ifdef __GNUC__ +__attribute__ ((format (printf, 2, 3))) +#endif +inline void ensuref(bool cond, const char *format, ...) { + if (!cond) { + FMT_TO_RESULT(format, format, message); + __testlib_ensure(cond, message); + } +} + +NORETURN static void __testlib_fail(const std::string &message) { + quitf(_fail, "%s", message.c_str()); +} + +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +void setName(const char *format, ...) { + FMT_TO_RESULT(format, format, name); + checkerName = name; +} + +/* + * Do not use random_shuffle, because it will produce different result + * for different C++ compilers. + * + * This implementation uses testlib random_t to produce random numbers, so + * it is stable. + */ +template +void shuffle(_RandomAccessIter __first, _RandomAccessIter __last) { + if (__first == __last) return; + for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i) + std::iter_swap(__i, __first + rnd.next(int(__i - __first) + 1)); +} + + +template +#if defined(__GNUC__) && !defined(__clang__) +__attribute__ ((error("Don't use random_shuffle(), use shuffle() instead"))) +#endif +void random_shuffle(_RandomAccessIter, _RandomAccessIter) { + quitf(_fail, "Don't use random_shuffle(), use shuffle() instead"); +} + +#ifdef __GLIBC__ +# define RAND_THROW_STATEMENT throw() +#else +# define RAND_THROW_STATEMENT +#endif + +#if defined(__GNUC__) && !defined(__clang__) + +__attribute__ ((error("Don't use rand(), use rnd.next() instead"))) +#endif +#ifdef _MSC_VER +# pragma warning( disable : 4273 ) +#endif +int rand() RAND_THROW_STATEMENT +{ + quitf(_fail, "Don't use rand(), use rnd.next() instead"); + + /* This line never runs. */ + //throw "Don't use rand(), use rnd.next() instead"; +} + +#if defined(__GNUC__) && !defined(__clang__) + +__attribute__ ((error("Don't use srand(), you should use " +"'registerGen(argc, argv, 1);' to initialize generator seed " +"by hash code of the command line params. The third parameter " +"is randomGeneratorVersion (currently the latest is 1)."))) +#endif +#ifdef _MSC_VER +# pragma warning( disable : 4273 ) +#endif +void srand(unsigned int seed) RAND_THROW_STATEMENT +{ + quitf(_fail, "Don't use srand(), you should use " + "'registerGen(argc, argv, 1);' to initialize generator seed " + "by hash code of the command line params. The third parameter " + "is randomGeneratorVersion (currently the latest is 1) [ignored seed=%u].", seed); +} + +void startTest(int test) { + const std::string testFileName = vtos(test); + if (NULL == testlib_freopen_(testFileName.c_str(), "wt", stdout)) + __testlib_fail("Unable to write file '" + testFileName + "'"); +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline std::string compress(const std::string &s) { + return __testlib_part(s); +} + +#ifdef __GNUC__ +__attribute__((const)) +#endif +inline std::string englishEnding(int x) { + x %= 100; + if (x / 10 == 1) + return "th"; + if (x % 10 == 1) + return "st"; + if (x % 10 == 2) + return "nd"; + if (x % 10 == 3) + return "rd"; + return "th"; +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::string join(_ForwardIterator first, _ForwardIterator last, _Separator separator) { + std::stringstream ss; + bool repeated = false; + for (_ForwardIterator i = first; i != last; i++) { + if (repeated) + ss << separator; + else + repeated = true; + ss << *i; + } + return ss.str(); +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::string join(_ForwardIterator first, _ForwardIterator last) { + return join(first, last, ' '); +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::string join(const _Collection &collection, _Separator separator) { + return join(collection.begin(), collection.end(), separator); +} + +template +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::string join(const _Collection &collection) { + return join(collection, ' '); +} + +/** + * Splits string s by character separator returning exactly k+1 items, + * where k is the number of separator occurrences. + */ +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::vector split(const std::string &s, char separator) { + std::vector result; + std::string item; + for (size_t i = 0; i < s.length(); i++) + if (s[i] == separator) { + result.push_back(item); + item = ""; + } else + item += s[i]; + result.push_back(item); + return result; +} + +/** + * Splits string s by character separators returning exactly k+1 items, + * where k is the number of separator occurrences. + */ +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::vector split(const std::string &s, const std::string &separators) { + if (separators.empty()) + return std::vector(1, s); + + std::vector isSeparator(256); + for (size_t i = 0; i < separators.size(); i++) + isSeparator[(unsigned char) (separators[i])] = true; + + std::vector result; + std::string item; + for (size_t i = 0; i < s.length(); i++) + if (isSeparator[(unsigned char) (s[i])]) { + result.push_back(item); + item = ""; + } else + item += s[i]; + result.push_back(item); + return result; +} + +/** + * Splits string s by character separator returning non-empty items. + */ +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::vector tokenize(const std::string &s, char separator) { + std::vector result; + std::string item; + for (size_t i = 0; i < s.length(); i++) + if (s[i] == separator) { + if (!item.empty()) + result.push_back(item); + item = ""; + } else + item += s[i]; + if (!item.empty()) + result.push_back(item); + return result; +} + +/** + * Splits string s by character separators returning non-empty items. + */ +#ifdef __GNUC__ +__attribute__((const)) +#endif +std::vector tokenize(const std::string &s, const std::string &separators) { + if (separators.empty()) + return std::vector(1, s); + + std::vector isSeparator(256); + for (size_t i = 0; i < separators.size(); i++) + isSeparator[(unsigned char) (separators[i])] = true; + + std::vector result; + std::string item; + for (size_t i = 0; i < s.length(); i++) + if (isSeparator[(unsigned char) (s[i])]) { + if (!item.empty()) + result.push_back(item); + item = ""; + } else + item += s[i]; + + if (!item.empty()) + result.push_back(item); + + return result; +} + +NORETURN void __testlib_expectedButFound(TResult result, std::string expected, std::string found, const char *prepend) { + std::string message; + if (strlen(prepend) != 0) + message = testlib_format_("%s: expected '%s', but found '%s'", + compress(prepend).c_str(), compress(expected).c_str(), compress(found).c_str()); + else + message = testlib_format_("expected '%s', but found '%s'", + compress(expected).c_str(), compress(found).c_str()); + quit(result, message); +} + +NORETURN void __testlib_expectedButFound(TResult result, double expected, double found, const char *prepend) { + std::string expectedString = removeDoubleTrailingZeroes(testlib_format_("%.12f", expected)); + std::string foundString = removeDoubleTrailingZeroes(testlib_format_("%.12f", found)); + __testlib_expectedButFound(result, expectedString, foundString, prepend); +} + +template +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void expectedButFound(TResult result, T expected, T found, const char *prependFormat = "", ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + std::string expectedString = vtos(expected); + std::string foundString = vtos(found); + __testlib_expectedButFound(result, expectedString, foundString, prepend.c_str()); +} + +template<> +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void +expectedButFound(TResult result, std::string expected, std::string found, const char *prependFormat, ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + __testlib_expectedButFound(result, expected, found, prepend.c_str()); +} + +template<> +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void expectedButFound(TResult result, double expected, double found, const char *prependFormat, ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + std::string expectedString = removeDoubleTrailingZeroes(testlib_format_("%.12f", expected)); + std::string foundString = removeDoubleTrailingZeroes(testlib_format_("%.12f", found)); + __testlib_expectedButFound(result, expectedString, foundString, prepend.c_str()); +} + +template<> +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void +expectedButFound(TResult result, const char *expected, const char *found, const char *prependFormat, + ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + __testlib_expectedButFound(result, std::string(expected), std::string(found), prepend.c_str()); +} + +template<> +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void expectedButFound(TResult result, float expected, float found, const char *prependFormat, ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + __testlib_expectedButFound(result, double(expected), double(found), prepend.c_str()); +} + +template<> +#ifdef __GNUC__ +__attribute__ ((format (printf, 4, 5))) +#endif +NORETURN void +expectedButFound(TResult result, long double expected, long double found, const char *prependFormat, ...) { + FMT_TO_RESULT(prependFormat, prependFormat, prepend); + __testlib_expectedButFound(result, double(expected), double(found), prepend.c_str()); +} + +#if __cplusplus > 199711L || defined(_MSC_VER) +template +struct is_iterable { + template + static char test(typename U::iterator *x); + + template + static long test(U *x); + + static const bool value = sizeof(test(0)) == 1; +}; + +template +struct __testlib_enable_if { +}; + +template +struct __testlib_enable_if { + typedef T type; +}; + +template +typename __testlib_enable_if::value, void>::type __testlib_print_one(const T &t) { + std::cout << t; +} + +template +typename __testlib_enable_if::value, void>::type __testlib_print_one(const T &t) { + bool first = true; + for (typename T::const_iterator i = t.begin(); i != t.end(); i++) { + if (first) + first = false; + else + std::cout << " "; + std::cout << *i; + } +} + +template<> +typename __testlib_enable_if::value, void>::type +__testlib_print_one(const std::string &t) { + std::cout << t; +} + +template +void __println_range(A begin, B end) { + bool first = true; + for (B i = B(begin); i != end; i++) { + if (first) + first = false; + else + std::cout << " "; + __testlib_print_one(*i); + } + std::cout << std::endl; +} + +template +struct is_iterator { + static T makeT(); + + typedef void *twoptrs[2]; + + static twoptrs &test(...); + + template + static typename R::iterator_category *test(R); + + template + static void *test(R *); + + static const bool value = sizeof(test(makeT())) == sizeof(void *); +}; + +template +struct is_iterator::value>::type> { + static const bool value = false; +}; + +template +typename __testlib_enable_if::value, void>::type println(const A &a, const B &b) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << std::endl; +} + +template +typename __testlib_enable_if::value, void>::type println(const A &a, const B &b) { + __println_range(a, b); +} + +template +void println(const A *a, const A *b) { + __println_range(a, b); +} + +template<> +void println(const char *a, const char *b) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << std::endl; +} + +template +void println(const T &x) { + __testlib_print_one(x); + std::cout << std::endl; +} + +template +void println(const A &a, const B &b, const C &c) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << " "; + __testlib_print_one(c); + std::cout << std::endl; +} + +template +void println(const A &a, const B &b, const C &c, const D &d) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << " "; + __testlib_print_one(c); + std::cout << " "; + __testlib_print_one(d); + std::cout << std::endl; +} + +template +void println(const A &a, const B &b, const C &c, const D &d, const E &e) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << " "; + __testlib_print_one(c); + std::cout << " "; + __testlib_print_one(d); + std::cout << " "; + __testlib_print_one(e); + std::cout << std::endl; +} + +template +void println(const A &a, const B &b, const C &c, const D &d, const E &e, const F &f) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << " "; + __testlib_print_one(c); + std::cout << " "; + __testlib_print_one(d); + std::cout << " "; + __testlib_print_one(e); + std::cout << " "; + __testlib_print_one(f); + std::cout << std::endl; +} + +template +void println(const A &a, const B &b, const C &c, const D &d, const E &e, const F &f, const G &g) { + __testlib_print_one(a); + std::cout << " "; + __testlib_print_one(b); + std::cout << " "; + __testlib_print_one(c); + std::cout << " "; + __testlib_print_one(d); + std::cout << " "; + __testlib_print_one(e); + std::cout << " "; + __testlib_print_one(f); + std::cout << " "; + __testlib_print_one(g); + std::cout << std::endl; +} + +/* opts */ + +/** + * A struct for a singular testlib opt, containing the raw string value, + * and a boolean value for marking whether the opt is used. + */ +struct TestlibOpt { + std::string value; + bool used; + + TestlibOpt() : value(), used(false) {} +}; + +/** + * Get the type of opt based on the number of `-` at the beginning and the + * _validity_ of the key name. + * + * A valid key name must start with an alphabetical character. + * + * Returns: 1 if s has one `-` at the beginning, that is, "-keyName". + * 2 if s has two `-` at the beginning, that is, "--keyName". + * 0 otherwise. That is, if s has no `-` at the beginning, or has more + * than 2 at the beginning ("---keyName", "----keyName", ...), or the + * keyName is invalid (the first character is not an alphabetical + * character). + */ +size_t getOptType(char *s) { + if (!s || strlen(s) <= 1) + return 0; + + if (s[0] == '-') { + if (isalpha(s[1])) + return 1; + else if (s[1] == '-') + return isalpha(s[2]) ? 2 : 0; + } + + return 0; +} + +/** + * Parse the opt at a given index, and put it into the opts maps. + * + * An opt can has the following form: + * 1) -keyName=value or --keyName=value (ex. -n=10 --test-count=20) + * 2) -keyName value or --keyName value (ex. -n 10 --test-count 20) + * 3) -kNumval or --kNumval (ex. -n10 --t20) + * 4) -boolProperty or --boolProperty (ex. -sorted --tree-only) + * + * Only the second form consumes 2 arguments. The other consumes only 1 + * argument. + * + * In the third form, the key is a single character, and after the key is the + * value. The value _should_ be a number. + * + * In the forth form, the value is true. + * + * Params: + * - argc and argv: the number of command line arguments and the command line + * arguments themselves. + * - index: the starting index of the opts. + * - opts: the map containing the resulting opt. + * + * Returns: the number of consumed arguments to parse the opt. + * 0 if there is no arguments to parse. + * + * Algorithm details: + * TODO. Please refer to the implementation to see how the code handles the 3rd and 4th forms separately. + */ +size_t parseOpt(size_t argc, char *argv[], size_t index, std::map &opts) { + if (index >= argc) + return 0; + + size_t type = getOptType(argv[index]), inc = 1; + if (type > 0) { + std::string key(argv[index] + type), val; + size_t sep = key.find('='); + if (sep != std::string::npos) { + val = key.substr(sep + 1); + key = key.substr(0, sep); + } else { + if (index + 1 < argc && getOptType(argv[index + 1]) == 0) { + val = argv[index + 1]; + inc = 2; + } else { + if (key.length() > 1 && isdigit(key[1])) { + val = key.substr(1); + key = key.substr(0, 1); + } else { + val = "true"; + } + } + } + opts[key].value = val; + } else { + return inc; + } + + return inc; +} + +/** + * Global list containing all the arguments in the order given in the command line. + */ +std::vector __testlib_argv; + +/** + * Global dictionary containing all the parsed opts. + */ +std::map __testlib_opts; + +/** + * Whether automatic no unused opts ensurement should be done. This flag will + * be turned on when `has_opt` or `opt(key, default_value)` is called. + * + * The automatic ensurement can be suppressed when + * __testlib_ensureNoUnusedOptsSuppressed is true. + */ +bool __testlib_ensureNoUnusedOptsFlag = false; + +/** + * Suppress no unused opts automatic ensurement. Can be set to true with + * `suppressEnsureNoUnusedOpts()`. + */ +bool __testlib_ensureNoUnusedOptsSuppressed = false; + +/** + * Parse command line arguments into opts. + * The results are stored into __testlib_argv and __testlib_opts. + */ +void prepareOpts(int argc, char *argv[]) { + if (argc <= 0) + __testlib_fail("Opts: expected argc>=0 but found " + toString(argc)); + size_t n = static_cast(argc); // NOLINT(hicpp-use-auto,modernize-use-auto) + __testlib_opts = std::map(); + for (size_t index = 1; index < n; index += parseOpt(n, argv, index, __testlib_opts)); + __testlib_argv = std::vector(n); + for (size_t index = 0; index < n; index++) + __testlib_argv[index] = argv[index]; +} + +/** + * An utility function to get the argument with a given index. This function + * also print a readable message when no arguments are found. + */ +std::string __testlib_indexToArgv(int index) { + if (index < 0 || index >= int(__testlib_argv.size())) + __testlib_fail("Opts: index '" + toString(index) + "' is out of range [0," + + toString(__testlib_argv.size()) + ")"); + return __testlib_argv[size_t(index)]; +} + +/** + * An utility function to get the opt with a given key . This function + * also print a readable message when no opts are found. + */ +std::string __testlib_keyToOpts(const std::string &key) { + auto it = __testlib_opts.find(key); + if (it == __testlib_opts.end()) + __testlib_fail("Opts: unknown key '" + compress(key) + "'"); + it->second.used = true; + return it->second.value; +} + +template +T optValueToIntegral(const std::string &s, bool nonnegative); + +long double optValueToLongDouble(const std::string &s); + +std::string parseExponentialOptValue(const std::string &s) { + size_t pos = std::string::npos; + for (size_t i = 0; i < s.length(); i++) + if (s[i] == 'e' || s[i] == 'E') { + if (pos != std::string::npos) + __testlib_fail("Opts: expected typical exponential notation but '" + compress(s) + "' found"); + pos = i; + } + if (pos == std::string::npos) + return s; + std::string e = s.substr(pos + 1); + if (!e.empty() && e[0] == '+') + e = e.substr(1); + if (e.empty()) + __testlib_fail("Opts: expected typical exponential notation but '" + compress(s) + "' found"); + if (e.length() > 20) + __testlib_fail("Opts: expected typical exponential notation but '" + compress(s) + "' found"); + int ne = optValueToIntegral(e, false); + std::string num = s.substr(0, pos); + if (num.length() > 20) + __testlib_fail("Opts: expected typical exponential notation but '" + compress(s) + "' found"); + if (!num.empty() && num[0] == '+') + num = num.substr(1); + optValueToLongDouble(num); + bool minus = false; + if (num[0] == '-') { + minus = true; + num = num.substr(1); + } + for (int i = 0; i < +ne; i++) { + size_t sep = num.find('.'); + if (sep == std::string::npos) + num += '0'; + else { + if (sep + 1 == num.length()) + num[sep] = '0'; + else + std::swap(num[sep], num[sep + 1]); + } + } + for (int i = 0; i < -ne; i++) { + size_t sep = num.find('.'); + if (sep == std::string::npos) + num.insert(num.begin() + int(num.length()) - 1, '.'); + else { + if (sep == 0) + num.insert(num.begin() + 1, '0'); + else + std::swap(num[sep - 1], num[sep]); + } + } + while (!num.empty() && num[0] == '0') + num = num.substr(1); + while (num.find('.') != std::string::npos && num.back() == '0') + num = num.substr(0, num.length() - 1); + if (!num.empty() && num.back() == '.') + num = num.substr(0, num.length() - 1); + if ((!num.empty() && num[0] == '.') || num.empty()) + num.insert(num.begin(), '0'); + return (minus ? "-" : "") + num; +} + +template +T optValueToIntegral(const std::string &s_, bool nonnegative) { + std::string s(parseExponentialOptValue(s_)); + if (s.empty()) + __testlib_fail("Opts: expected integer but '" + compress(s_) + "' found"); + T value = 0; + long double about = 0.0; + signed char sign = +1; + size_t pos = 0; + if (s[pos] == '-') { + if (nonnegative) + __testlib_fail("Opts: expected non-negative integer but '" + compress(s_) + "' found"); + sign = -1; + pos++; + } + for (size_t i = pos; i < s.length(); i++) { + if (s[i] < '0' || s[i] > '9') + __testlib_fail("Opts: expected integer but '" + compress(s_) + "' found"); + value = T(value * 10 + s[i] - '0'); + about = about * 10 + s[i] - '0'; + } + value *= sign; + about *= sign; + if (fabsl(value - about) > 0.1) + __testlib_fail("Opts: integer overflow: expected integer but '" + compress(s_) + "' found"); + return value; +} + +long double optValueToLongDouble(const std::string &s_) { + std::string s(parseExponentialOptValue(s_)); + if (s.empty()) + __testlib_fail("Opts: expected float number but '" + compress(s_) + "' found"); + long double value = 0.0; + signed char sign = +1; + size_t pos = 0; + if (s[pos] == '-') { + sign = -1; + pos++; + } + bool period = false; + long double mul = 1.0; + for (size_t i = pos; i < s.length(); i++) { + if (s[i] == '.') { + if (period) + __testlib_fail("Opts: expected float number but '" + compress(s_) + "' found"); + else { + period = true; + continue; + } + } + if (period) + mul *= 10.0; + if (s[i] < '0' || s[i] > '9') + __testlib_fail("Opts: expected float number but '" + compress(s_) + "' found"); + if (period) + value += (s[i] - '0') / mul; + else + value = value * 10 + s[i] - '0'; + } + value *= sign; + return value; +} + +/** + * Return true if there is an opt with a given key. + * + * By calling this function, automatic ensurement for no unused opts will be + * done when the program is finalized. Call suppressEnsureNoUnusedOpts() to + * turn it off. + */ +bool has_opt(const std::string &key) { + __testlib_ensureNoUnusedOptsFlag = true; + return __testlib_opts.count(key) != 0; +} + +/* About the following part for opt with 2 and 3 arguments. + * + * To parse the argv/opts correctly for a give type (integer, floating point or + * string), some meta programming must be done to determine the type of + * the type, and use the correct parsing function accordingly. + * + * The pseudo algorithm for determining the type of T and parse it accordingly + * is as follows: + * + * if (T is integral type) { + * if (T is unsigned) { + * parse the argv/opt as an **unsigned integer** of type T. + * } else { + * parse the argv/opt as an **signed integer** of type T. + * } else { + * if (T is floating point type) { + * parse the argv/opt as an **floating point** of type T. + * } else { + * // T should be std::string + * just the raw content of the argv/opts. + * } + * } + * + * To help with meta programming, some `opt` function with 2 or 3 arguments are + * defined. + * + * Opt with 3 arguments: T opt(true/false is_integral, true/false is_unsigned, index/key) + * + * + The first argument is for determining whether the type T is an integral + * type. That is, the result of std::is_integral() should be passed to + * this argument. When false, the type _should_ be either floating point or a + * std::string. + * + * + The second argument is for determining whether the signedness of the type + * T (if it is unsigned or signed). That is, the result of + * std::is_unsigned() should be passed to this argument. This argument can + * be ignored if the first one is false, because it only applies to integer. + * + * Opt with 2 arguments: T opt(true/false is_floating_point, index/key) + * + The first argument is for determining whether the type T is a floating + * point type. That is, the result of std::is_floating_point() should be + * passed to this argument. When false, the type _should_ be a std::string. + */ + +template +T opt(std::false_type is_floating_point, int index); + +template<> +std::string opt(std::false_type /*is_floating_point*/, int index) { + return __testlib_indexToArgv(index); +} + +template +T opt(std::true_type /*is_floating_point*/, int index) { + return T(optValueToLongDouble(__testlib_indexToArgv(index))); +} + +template +T opt(std::false_type /*is_integral*/, U /*is_unsigned*/, int index) { + return opt(std::is_floating_point(), index); +} + +template +T opt(std::true_type /*is_integral*/, std::false_type /*is_unsigned*/, int index) { + return optValueToIntegral(__testlib_indexToArgv(index), false); +} + +template +T opt(std::true_type /*is_integral*/, std::true_type /*is_unsigned*/, int index) { + return optValueToIntegral(__testlib_indexToArgv(index), true); +} + +template<> +bool opt(std::true_type /*is_integral*/, std::true_type /*is_unsigned*/, int index) { + std::string value = __testlib_indexToArgv(index); + if (value == "true" || value == "1") + return true; + if (value == "false" || value == "0") + return false; + __testlib_fail("Opts: opt by index '" + toString(index) + "': expected bool true/false or 0/1 but '" + + compress(value) + "' found"); +} + +/** + * Return the parsed argv by a given index. + */ +template +T opt(int index) { + return opt(std::is_integral(), std::is_unsigned(), index); +} + +/** + * Return the raw string value of an argv by a given index. + */ +std::string opt(int index) { + return opt(index); +} + +/** + * Return the parsed argv by a given index. If the index is bigger than + * the number of argv, return the given default_value. + */ +template +T opt(int index, const T &default_value) { + if (index >= int(__testlib_argv.size())) { + return default_value; + } + return opt(index); +} + +/** + * Return the raw string value of an argv by a given index. If the index is + * bigger than the number of argv, return the given default_value. + */ +std::string opt(int index, const std::string &default_value) { + return opt(index, default_value); +} + +template +T opt(std::false_type is_floating_point, const std::string &key); + +template<> +std::string opt(std::false_type /*is_floating_point*/, const std::string &key) { + return __testlib_keyToOpts(key); +} + +template +T opt(std::true_type /*is_integral*/, const std::string &key) { + return T(optValueToLongDouble(__testlib_keyToOpts(key))); +} + +template +T opt(std::false_type /*is_integral*/, U, const std::string &key) { + return opt(std::is_floating_point(), key); +} + +template +T opt(std::true_type /*is_integral*/, std::false_type /*is_unsigned*/, const std::string &key) { + return optValueToIntegral(__testlib_keyToOpts(key), false); +} + +template +T opt(std::true_type /*is_integral*/, std::true_type /*is_unsigned*/, const std::string &key) { + return optValueToIntegral(__testlib_keyToOpts(key), true); +} + +template<> +bool opt(std::true_type /*is_integral*/, std::true_type /*is_unsigned*/, const std::string &key) { + if (!has_opt(key)) + return false; + std::string value = __testlib_keyToOpts(key); + if (value == "true" || value == "1") + return true; + if (value == "false" || value == "0") + return false; + __testlib_fail("Opts: key '" + compress(key) + "': expected bool true/false or 0/1 but '" + + compress(value) + "' found"); +} + +/** + * Return the parsed opt by a given key. + */ +template +T opt(const std::string &key) { + return opt(std::is_integral(), std::is_unsigned(), key); +} + +/** + * Return the raw string value of an opt by a given key + */ +std::string opt(const std::string &key) { + return opt(key); +} + +/* Scorer started. */ + +enum TestResultVerdict { + SKIPPED, + OK, + WRONG_ANSWER, + RUNTIME_ERROR, + TIME_LIMIT_EXCEEDED, + IDLENESS_LIMIT_EXCEEDED, + MEMORY_LIMIT_EXCEEDED, + COMPILATION_ERROR, + CRASHED, + FAILED +}; + +std::string serializeVerdict(TestResultVerdict verdict) { + switch (verdict) { + case SKIPPED: return "SKIPPED"; + case OK: return "OK"; + case WRONG_ANSWER: return "WRONG_ANSWER"; + case RUNTIME_ERROR: return "RUNTIME_ERROR"; + case TIME_LIMIT_EXCEEDED: return "TIME_LIMIT_EXCEEDED"; + case IDLENESS_LIMIT_EXCEEDED: return "IDLENESS_LIMIT_EXCEEDED"; + case MEMORY_LIMIT_EXCEEDED: return "MEMORY_LIMIT_EXCEEDED"; + case COMPILATION_ERROR: return "COMPILATION_ERROR"; + case CRASHED: return "CRASHED"; + case FAILED: return "FAILED"; + } + throw "Unexpected verdict"; +} + +TestResultVerdict deserializeTestResultVerdict(std::string s) { + if (s == "SKIPPED") + return SKIPPED; + else if (s == "OK") + return OK; + else if (s == "WRONG_ANSWER") + return WRONG_ANSWER; + else if (s == "RUNTIME_ERROR") + return RUNTIME_ERROR; + else if (s == "TIME_LIMIT_EXCEEDED") + return TIME_LIMIT_EXCEEDED; + else if (s == "IDLENESS_LIMIT_EXCEEDED") + return IDLENESS_LIMIT_EXCEEDED; + else if (s == "MEMORY_LIMIT_EXCEEDED") + return MEMORY_LIMIT_EXCEEDED; + else if (s == "COMPILATION_ERROR") + return COMPILATION_ERROR; + else if (s == "CRASHED") + return CRASHED; + else if (s == "FAILED") + return FAILED; + ensuref(false, "Unexpected serialized TestResultVerdict"); + // No return actually. + return FAILED; +} + +struct TestResult { + int testIndex; + std::string testset; + std::string group; + TestResultVerdict verdict; + double points; + long long timeConsumed; + long long memoryConsumed; + std::string input; + std::string output; + std::string answer; + int exitCode; + std::string checkerComment; +}; + +std::string serializePoints(double points) { + if (std::isnan(points)) + return ""; + else { + char c[64]; + snprintf(c, 64, "%.03lf", points); + return c; + } +} + +double deserializePoints(std::string s) { + if (s.empty()) + return std::numeric_limits::quiet_NaN(); + else { + double result; +#ifdef _MSC_VER + ensuref(sscanf_s(s.c_str(), "%lf", &result) == 1, "Invalid serialized points"); +#else + ensuref(std::sscanf(s.c_str(), "%lf", &result) == 1, "Invalid serialized points"); +#endif + return result; + } +} + +std::string escapeTestResultString(std::string s) { + std::string result; + for (size_t i = 0; i < s.length(); i++) { + if (s[i] == '\r') + continue; + if (s[i] == '\n') { + result += "\\n"; + continue; + } + if (s[i] == '\\' || s[i] == ';') + result += '\\'; + result += s[i]; + } + return result; +} + +std::string unescapeTestResultString(std::string s) { + std::string result; + for (size_t i = 0; i < s.length(); i++) { + if (s[i] == '\\' && i + 1 < s.length()) { + if (s[i + 1] == 'n') { + result += '\n'; + i++; + continue; + } else if (s[i + 1] == ';' || s[i + 1] == '\\') { + result += s[i + 1]; + i++; + continue; + } + } + result += s[i]; + } + return result; +} + +std::string serializeTestResult(TestResult tr) { + std::string result; + result += std::to_string(tr.testIndex); + result += ";"; + result += escapeTestResultString(tr.testset); + result += ";"; + result += escapeTestResultString(tr.group); + result += ";"; + result += serializeVerdict(tr.verdict); + result += ";"; + result += serializePoints(tr.points); + result += ";"; + result += std::to_string(tr.timeConsumed); + result += ";"; + result += std::to_string(tr.memoryConsumed); + result += ";"; + result += escapeTestResultString(tr.input); + result += ";"; + result += escapeTestResultString(tr.output); + result += ";"; + result += escapeTestResultString(tr.answer); + result += ";"; + result += std::to_string(tr.exitCode); + result += ";"; + result += escapeTestResultString(tr.checkerComment); + return result; +} + +TestResult deserializeTestResult(std::string s) { + std::vector items; + std::string t; + for (size_t i = 0; i < s.length(); i++) { + if (s[i] == '\\') { + t += s[i]; + if (i + 1 < s.length()) + t += s[i + 1]; + i++; + continue; + } else { + if (s[i] == ';') { + items.push_back(t); + t = ""; + } else + t += s[i]; + } + } + items.push_back(t); + + ensuref(items.size() == 12, "Invalid TestResult serialization: expected exactly 12 items"); + + TestResult tr; + size_t pos = 0; + tr.testIndex = stoi(items[pos++]); + tr.testset = unescapeTestResultString(items[pos++]); + tr.group = unescapeTestResultString(items[pos++]); + tr.verdict = deserializeTestResultVerdict(items[pos++]); + tr.points = deserializePoints(items[pos++]); + tr.timeConsumed = stoll(items[pos++]); + tr.memoryConsumed = stoll(items[pos++]); + tr.input = unescapeTestResultString(items[pos++]); + tr.output = unescapeTestResultString(items[pos++]); + tr.answer = unescapeTestResultString(items[pos++]); + tr.exitCode = stoi(items[pos++]); + tr.checkerComment = unescapeTestResultString(items[pos++]); + + return tr; +} + +std::vector readTestResults(std::string fileName) { + std::ifstream stream; + stream.open(fileName.c_str(), std::ios::in); + ensuref(stream.is_open(), "Can't read test results file '%s'", fileName.c_str()); + std::vector result; + std::string line; + while (getline(stream, line)) + if (!line.empty()) + result.push_back(deserializeTestResult(line)); + stream.close(); + return result; +} + +std::function)> __testlib_scorer; + +struct TestlibScorerGuard { + ~TestlibScorerGuard() { + if (testlibMode == _scorer) { + std::vector testResults; + while (!inf.eof()) { + std::string line = inf.readLine(); + if (!line.empty()) + testResults.push_back(deserializeTestResult(line)); + } + inf.readEof(); + printf("%.3f\n", __testlib_scorer(testResults)); + } + } +} __testlib_scorer_guard; + +void registerScorer(int argc, char *argv[], std::function)> scorer) { + /* Suppress unused. */ + (void)(argc), (void)(argv); + + __testlib_ensuresPreconditions(); + + testlibMode = _scorer; + __testlib_set_binary(stdin); + + inf.init(stdin, _input); + inf.strict = false; + + __testlib_scorer = scorer; +} + +/* Scorer ended. */ + +/** + * Return the parsed opt by a given key. If no opts with the given key are + * found, return the given default_value. + * + * By calling this function, automatic ensurement for no unused opts will be + * done when the program is finalized. Call suppressEnsureNoUnusedOpts() to + * turn it off. + */ +template +T opt(const std::string &key, const T &default_value) { + if (!has_opt(key)) { + return default_value; + } + return opt(key); +} + +/** + * Return the raw string value of an opt by a given key. If no opts with the + * given key are found, return the given default_value. + * + * By calling this function, automatic ensurement for no unused opts will be + * done when the program is finalized. Call suppressEnsureNoUnusedOpts() to + * turn it off. + */ +std::string opt(const std::string &key, const std::string &default_value) { + return opt(key, default_value); +} + +/** + * Check if all opts are used. If not, __testlib_fail is called. + * Should be used after calling all opt() function calls. + * + * This function is useful when opt() with default_value for checking typos + * in the opt's key. + */ +void ensureNoUnusedOpts() { + for (const auto &opt: __testlib_opts) { + if (!opt.second.used) { + __testlib_fail(testlib_format_("Opts: unused key '%s'", compress(opt.first).c_str())); + } + } +} + +void suppressEnsureNoUnusedOpts() { + __testlib_ensureNoUnusedOptsSuppressed = true; +} + +void TestlibFinalizeGuard::autoEnsureNoUnusedOpts() { + if (__testlib_ensureNoUnusedOptsFlag && !__testlib_ensureNoUnusedOptsSuppressed) { + ensureNoUnusedOpts(); + } +} + +TestlibFinalizeGuard testlibFinalizeGuard; +#endif + +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +std::string testlib_format_(const char *fmt, ...) { + FMT_TO_RESULT(fmt, fmt, result); + return result; +} + +std::string testlib_format_(const std::string fmt, ...) { + FMT_TO_RESULT(fmt, fmt.c_str(), result); + return result; +} + +#if (__cplusplus >= 202002L && __has_include()) || __cpp_lib_format +template +std::string format(const char* fmt, Args&&... args) { + size_t size = size_t(std::snprintf(nullptr, 0, fmt, args...) + 1); + std::vector buffer(size); + std::snprintf(buffer.data(), size, fmt, args...); + return std::string(buffer.data()); +} + +template +std::string format(const std::string fmt, Args&&... args) { + size_t size = size_t(std::snprintf(nullptr, 0, fmt.c_str(), args...) + 1); + std::vector buffer(size); + std::snprintf(buffer.data(), size, fmt.c_str(), args...); + return std::string(buffer.data()); +} +#else +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +std::string format(const char *fmt, ...) { + FMT_TO_RESULT(fmt, fmt, result); + return result; +} + +std::string format(const std::string fmt, ...) { + FMT_TO_RESULT(fmt, fmt.c_str(), result); + return result; +} +#endif + +#endif diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/DESIGN.md" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/DESIGN.md" new file mode 100644 index 0000000000000000000000000000000000000000..4ef862d695575d1a78837ad358bbbda523541bcd --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/DESIGN.md" @@ -0,0 +1,98 @@ +# 设计文档:大模型训推全局内存规划求解器 + +## 基于人工启发的规划(main.cpp) + +### 1. 数据建模 +- 将每个访问建模为 `Access = {addr, size, start, duration}`。 +- 由于输入满足 `start` 非降序,可将相同 `start` 的访问视为同一计算任务(可并行执行),不同任务必须串行。 +- 使用 `IntervalSet` 维护当前驻留 HBM 的地址段集合,支持: + - `add_interval([l, r))`:写合并、维护总用量; + - `remove_interval([l, r))`:裁剪区段并返回实际移除片段(生成 Offload)。 +- 编写 `merge_intervals` / `subtract_intervals` 工具函数,用于需求集合与当前驻留集合之间的差集计算。 + +### 3. 调度算法 - 任务分组 +- 输入已按 `start` 非降序;我们首先把相同 `start` 的访问划入一个 group,把 group 看成“单个计算任务的多段访存”。 +- 每个 group 需要被视为**同一操作**:所有 `Visit` 必须同时开始,并且在该 group 完成前禁止下一组 `Visit` 启动,因此维护一个 `barrier` 表示前序组完成时间。 +- `IntervalSet loaded`:HBM 当前驻留区间; +- `vector`:记录仍在运行的访问(结束时间、所需区间)。只有当 `io_time` 追上 `finish` 时才会从集合中清理,用于阻止过早 Offload; +- `reserved_group`:处理当前 group 时,提前把所有需求区间并入该集合,确保在整组 `Visit` 发射前这些地址不被驱逐; +- `future_required`:自当前 group 向后的需求并集,帮助在需要释放容量时优先淘汰“未来不再访问”的区间; +- `io_time` / `barrier`:分别代表读写串行时间轴与跨 group 的 NPU 阻塞时间轴。 + +### 4. 处理单个 group +对每个 group 执行以下步骤: +1. **排序加载顺序**:为了减少碎片,按地址从高到低排序处理 group 内的访问。 +2. **容量检查**:若单个访问所需字节超过 `M`,立即报错;否则计算缺口 `to_load = required - loaded`。 +3. **必要驱逐**:若 `loaded.usage() + load_bytes > M`,可驱逐集=当前驻留集减去 `reserved_group ∪ required ∪ active_intervals()`;当没有可驱逐区间时,等待最早完成的 `RunningVisit` 释放内存,再继续尝试。 +4. **串行 Reload**:对 `to_load` 中的每个分段依次 `Reload` 并更新 `io_time`,同时把新区间插入 `loaded`,然后把 `required` 并入 `reserved_group`,并记录访问编号以便稍后统一发射。 +5. **同步 Visit**:当 group 中所有访问都 ready 后,计算统一启动时间 `visit_start = max(barrier, group_start, io_time)`,对 `visit_order` 中的所有访问在同一时刻 emit `Visit`,并把它们的 `(finish_time, intervals)` 推入 `running` 列表。`group_finish` 记录该组的最大完成时间,随后刷新 `barrier = max(barrier, group_finish)`。 + +### 5. 收尾 +- 全部 group 结束后输出 `Fin max(barrier, io_time)`,保证 IO 和 NPU 均已闲置。 + +### 6. 特性 +- **严格同步**:同一 `start` 的访问共用同一 `Visit` 时间戳,完全满足最新 checker “视为单一操作”的约束。 +- **多重保护**:`reserved_group` 确保尚未发射的访问不会被驱逐;`running` 则保护正在执行的访问,直到其 `finish` 被 `io_time` 跨越。 +- **按需驱逐**:驱逐集按 “(当前驻留) − (当前 group / 运行中 / 未来仍需)” 计算,只移除三者都不包含的区间,可细化到任意字节。 +- **阶段重叠**:IO 仍可在前序 group 的访问执行期间进行,只要不触碰 `running` 中受保护的地址;因此能在满足同步约束的前提下最大化带宽利用率。 + +### 7. 设计说明 +- **容量敏感**:Reload 前先计算缺口,仅在溢出风险出现时才驱逐;驱逐集合排除了“当前 group 需求、正在运行的访问、未来仍需访问”的所有区间,并支持按字节拆分。 +- **跨任务同步**:`barrier` 保证不同 group 绝不重叠,而 group 内所有访问共享同一 `Visit` 时间戳,完全符合“同一计算任务的访存必须同刻开始”的新增规则。 +- **未来信息的使用**:`future_required` 提供了后缀需求的并集,帮助我们把驱逐操作限制在“未来不会再需要”的地址段上。 +- **IO/NPU 重叠**:只要受保护集合允许,IO 可以在前序 group 的 Visit 持续期间运行,减少等待。 + +### 8. 新增样例 +除了主办方给出的example1-3三个样例,我自己设计了一下三条样例。 +- tests/long_trace.in/.out:120 条任务、>100 行的长 trace(4 条为一组共享 start time),验证大规模序列上的稳定性,同时也能更好的看出规划算法性能。 +- tests/memory_churn.in/.out:HBM=128,总访问集合远超容量,同一地址段多次回访,迫使调度器在多阶段中重复装载/卸载,模拟可能发生的抖动。 +- tests/fragmented_segments.in/.out:利用多条共享 start 的任务来表示同一操作访问 3 段以上的间断内存,检查求解器处理碎片化访问的能力。 +- tests/proactive_offload.in/.out:第一批任务长时间占用部分地址,第二批只需要残余子区间。可观察 IO 总线空闲期内是否触发“只驱逐无用部分”的预卸载。 + +## 使用SMT搜索 + +### 1. 预处理与离散化 +- 将所有访问的左右端点(addr, addr+size)收集并排序,划分成互不相交的基本块 `blocks = [(l,r), ...]`。 +- 每个访问 i 被映射为一组块索引 `visit_blocks[i]`,便于按块建模装载/卸载与容量。 +- 只保留至少被某访问引用的块(剔除未使用的地址段)。 + +### 2. 变量与时长模型 +- 变量: + - 对每个块 j:`t_load_j`, `t_offload_j`(Int,表示操作开始时间) + - 对每个访问 i:`t_visit_i`(Int,访问开始时间) + - 每个按 start 分组的 group k:`t_group_k`(Int,组内访问同步变量) + - `makespan`(Int,目标) +- 装载与卸载持续时间采用 `block_size * 40` 作为近似。 + +### 3. 主要约束(Z3 表达) +- 时间非负:所有时间变量 >= 0。 +- 访问早于 start 不允许:`t_visit[i] >= start[i]`。 +- 装载必须先完成:对于访问 i 使用的每个块 blk,`t_visit[i] >= t_load[blk] + block_size[blk]*40`。 +- 卸载必须晚于访问结束:对于使用块 blk 的每个访问 i,`t_offload[blk] >= t_visit[i] + time[i]`。 +- 强制组内同时开始:将具有相同 `start` 的访问分为同一组,引入 `t_group_k` 并约束 `t_visit[i] == t_group_k`(保证同组访问同步开始),且 `t_group_k >= start[group]`。 +- 组资源就绪约束:每组 k 所需的所有 block 必须在 `t_group_k` 之前完成加载:`t_group_k >= t_load[blk] + block_size[blk]*40`(对组中所有 blk)。 +- 组间串行:按输入顺序把访问按 start 分组,对相邻组 k 和 k+1,要求组 k 的所有访问完成后才可开始组 k+1(通过 `t_visit[i] + time[i] <= t_visit[j]` 约束实现)。 +- 操作互斥(读/写串行):对所有块对 (i,j) 加入两两不重叠的 Or 约束,覆盖 load-load、offload-offload、load-offload 等组合(实现读写操作串行化的保守策略)。 +- 容量(采样近似):在时间轴上以步长 40 从 0 到 100000 的采样点 t 检查,约束处于内存中的所有块大小之和 <= M(如果 t 在 `[t_load, t_offload + size*40)` 内则块被视为在内存中)。 +- makespan 约束:`makespan >= t_visit[i] + time[i]` 对所有访问,并 `makespan >= t_offload[j] + block_size[j]*40` 对所有块,确保 `Fin` 时 I/O 与访问都已结束。 + +### 4. 建模过程中进行的抽象与精度损失 +- 在分块过程中,所有端点均是某次visit的开始点或者结束点,这导致如果最优策略需要将某块内存分两次加载的时候无法搜索达到最优策略。 +- 对于任意时刻磁盘容量的建模采取抽样的方式,每个40s进行一个抽样,但是由于一旦发生一个溢出状态,必然在一个BLOCK被OFFLOAD之前这个状态一直存在,所以在抽样问题上是sound的。 +- 为了防止产生或多的约束,只对于时间(0,100000)内进行抽样,这造成当trace比较长的时候后续的容量溢出无法被检测,因而可能输出unsound的结果。 + +### 5. 改进效果 +对于某些较小的样例,Z3-solver可以搜素到最优的预取策略,例如对于 +```text +0 50 0 2000 +70 30 0 2000 +120 20 0 2000 +120 20 4000 200 +200 20 4000 200 +260 20 4000 200 +``` +Z3solver可以给出7000的总时长,明显低于7800的结果。 +针对Z3-slover + +## 综合结果 +鉴于SMT solver可能超时,且由于建模过程导致其结果不一定是sound的,也并不一定最优,所以选择调用checker检查,若通过且确实更好,则考虑选择Z3-solver给出的结果。这个过程由一段shell代码完成。 \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/__pycache__/main.cpython-312.pyc" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/__pycache__/main.cpython-312.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..6f4c2a8e99c0056a51df6146c8d964a9d2af2e1f Binary files /dev/null and "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/__pycache__/main.cpython-312.pyc" differ diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/compare_planner_main.sh" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/compare_planner_main.sh" new file mode 100755 index 0000000000000000000000000000000000000000..8e8cb0d5fd348eb53fd9a7e069f60a09688cf145 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/compare_planner_main.sh" @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# Usage: compare_planner_main.sh +# Run planner and main.py in parallel on the same input. If main.py finishes (no TIMEOUT) +# and its reported Fin time is strictly smaller than planner's Fin, overwrite planner_out with main's output. + +set -eu + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 2 +fi + +INPUT="$1" +PLANNER_OUT="$2" + + +PLANNER_BIN=$"./planner" || { + echo "planner binary not found in PATH or common locations" >&2 + exit 3 +} + +# Temporary files +PLANNER_TMP="${PLANNER_OUT}.planner_tmp" +SMT_TMP="${PLANNER_OUT}.smt_tmp" + +MAIN_FORMAL_OUT="${PLANNER_OUT}" +MAIN_ALT_OUT="${INPUT}.out" # fallback: some mains write input.out + +# remove old tmp files if any +rm -f "$PLANNER_TMP" "$MAIN_FORMAL_OUT" "$MAIN_ALT_OUT" + + +# Run planner and main.py in parallel +echo "Starting planner ($PLANNER_BIN) and main.py on input $INPUT..." +("$PLANNER_BIN" < "$INPUT" > "$PLANNER_TMP") & +PID_PLANNER=$! + +# Start main.py (assumes Python 3 and main.py available at /home/heziy/heterogeneous_systems_programming/2025/solver/main.py) +# main.py supports taking input file path or content as first arg in our environment +python3 /home/heziy/heterogeneous_systems_programming/2025/solver/main.py "$INPUT" "$SMT_TMP" & +PID_MAIN=$! + +# wait for both with a timeout of 10 seconds +( sleep 10 && kill $PID_PLANNER $PID_MAIN 2>/dev/null & ) & +wait $PID_PLANNER || echo "planner exited with non-zero status" +wait $PID_MAIN || echo "main.py exited with non-zero status or timed out" + +PLANNER_SUMMARY="./tests/planner_summary.txt" +SMT_SUMMARY="./tests/smt_summary.txt" +CHECKER_BIN="./../checker/checker" +# Redirect both stdout and stderr from checker into the summary files. Some checker messages +# (warnings/errors) are printed to stderr, so a plain >file only captured stdout. +"$CHECKER_BIN" "$INPUT" "$PLANNER_TMP" "$PLANNER_TMP" > "$PLANNER_SUMMARY" 2>&1 || echo "checker failed for planner output" >&2 +"$CHECKER_BIN" "$INPUT" "$SMT_TMP" "$SMT_TMP" > "$SMT_SUMMARY" 2>&1 || echo "checker failed for smt output" >&2 + + + +# Read Fin values from checker summaries (format: "ok All tasks finish at 7000"). +# Only accept the number if the line starts with "ok". +SMT_LAST_FIN="none" +PLANNER_LAST_FIN="none" +if [ -f "$SMT_SUMMARY" ]; then + # find the last matching line that starts with 'ok All tasks finish at ' + matched_line=$(grep -E '^ok[[:space:]]+All[[:space:]]+tasks[[:space:]]+finish[[:space:]]+at[[:space:]]+[0-9]+' "$SMT_SUMMARY" | tail -n 1 || true) + if [[ "$matched_line" =~ ^ok[[:space:]]+All[[:space:]]+tasks[[:space:]]+finish[[:space:]]+at[[:space:]]+([0-9]+)$ ]]; then + SMT_LAST_FIN="${BASH_REMATCH[1]}" + else + SMT_LAST_FIN="none" + fi +fi + +if [ -f "$PLANNER_SUMMARY" ]; then + matched_line=$(grep -E '^ok[[:space:]]+All[[:space:]]+tasks[[:space:]]+finish[[:space:]]+at[[:space:]]+[0-9]+' "$PLANNER_SUMMARY" | tail -n 1 || true) + if [[ "$matched_line" =~ ^ok[[:space:]]+All[[:space:]]+tasks[[:space:]]+finish[[:space:]]+at[[:space:]]+([0-9]+)$ ]]; then + PLANNER_LAST_FIN="${BASH_REMATCH[1]}" + else + PLANNER_LAST_FIN="none" + fi +fi + +echo "SMT last Fin: ${SMT_LAST_FIN:-}" +echo "Planner last Fin: ${PLANNER_LAST_FIN:-}" + +## Decide which temp file is better (smaller Fin). Set MAIN_FORMAL_OUT to the better one. +MAIN_FORMAL_OUT="" +if [[ "$SMT_LAST_FIN" == "none" && "$PLANNER_LAST_FIN" == "none" ]]; then + echo "Neither solver produced a numeric Fin; no output will be copied." +elif [[ "$SMT_LAST_FIN" != "none" && "$PLANNER_LAST_FIN" == "none" ]]; then + MAIN_FORMAL_OUT="$SMT_TMP" +elif [[ "$SMT_LAST_FIN" == "none" && "$PLANNER_LAST_FIN" != "none" ]]; then + MAIN_FORMAL_OUT="$PLANNER_TMP" +else + # both numeric -> choose smaller + if [ "$SMT_LAST_FIN" -lt "$PLANNER_LAST_FIN" ]; then + MAIN_FORMAL_OUT="$SMT_TMP" + else + MAIN_FORMAL_OUT="$PLANNER_TMP" + fi +fi + +if [ -n "$MAIN_FORMAL_OUT" ] && [ -f "$MAIN_FORMAL_OUT" ]; then + echo "Chosen best output: $MAIN_FORMAL_OUT -> will copy to $PLANNER_OUT" + cp "$MAIN_FORMAL_OUT" "$PLANNER_OUT" +else + echo "No valid output produced by either solver; leaving $PLANNER_OUT untouched if it exists" +fi + +# delete temporary files +# rm -f "$PLANNER_TMP" "$SMT_TMP" "$PLANNER_SUMMARY" "$SMT_SUMMARY" + +exit 0 \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.cpp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..08cdd89b02877c3f1a63d4241ef685563d7fd47b --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.cpp" @@ -0,0 +1,345 @@ +#include + +using namespace std; + +struct Access { + long long addr; + long long size; + long long start; + long long duration; +}; + +struct IntervalSet { + map segs; // start -> end (exclusive) + long long total = 0; + + vector> to_vector() const { + vector> res; + for (auto &kv : segs) { + res.push_back(kv); + } + return res; + } + + void add_interval(long long l, long long r) { + if (l >= r) return; + auto it = segs.lower_bound(l); + if (it != segs.begin()) { + auto pit = prev(it); + if (pit->second < l) { + // ok + } else { + it = pit; + } + } + long long start = l; + long long end = r; + while (it != segs.end() && it->first <= end) { + if (it->second < start) { + ++it; + continue; + } + start = min(start, it->first); + end = max(end, it->second); + total -= (it->second - it->first); + it = segs.erase(it); + } + segs[start] = end; + total += (end - start); + } + + vector> remove_interval(long long l, long long r) { + vector> removed; + if (l >= r) return removed; + auto it = segs.lower_bound(l); + if (it != segs.begin()) { + auto pit = prev(it); + if (pit->second > l) it = pit; + } + while (it != segs.end() && it->first < r) { + long long s = it->first; + long long e = it->second; + if (e <= l) { + ++it; + continue; + } + // Remove overlap [max(s,l), min(e,r)) + long long cutL = max(s, l); + long long cutR = min(e, r); + if (cutL >= cutR) { + ++it; + continue; + } + removed.emplace_back(cutL, cutR); + long long original_len = e - s; + total -= original_len; + it = segs.erase(it); + if (s < cutL) { + segs[s] = cutL; + total += (cutL - s); + } + if (cutR < e) { + segs[cutR] = e; + total += (e - cutR); + } + it = segs.lower_bound(cutR); + } + return removed; + } + + long long usage() const { + return total; + } +}; + +vector> merge_intervals(vector> v) { + vector> res; + sort(v.begin(), v.end()); + long long curL = -1, curR = -1; + for (auto &seg : v) { + if (seg.first >= seg.second) continue; + if (curL == -1) { + curL = seg.first; + curR = seg.second; + } else if (seg.first <= curR) { + curR = max(curR, seg.second); + } else { + res.emplace_back(curL, curR); + curL = seg.first; + curR = seg.second; + } + } + if (curL != -1) res.emplace_back(curL, curR); + return res; +} + +vector> union_intervals(const vector> &a, + const vector> &b) { + vector> combined = a; + combined.insert(combined.end(), b.begin(), b.end()); + return merge_intervals(combined); +} + +vector> subtract_intervals(const vector> &a, + const vector> &b) { + vector> res; + size_t j = 0; + for (auto [l, r] : a) { + long long cur = l; + while (cur < r) { + while (j < b.size() && b[j].second <= cur) ++j; + long long next_cut = r; + if (j < b.size()) next_cut = min(next_cut, b[j].first); + if (next_cut > cur) res.emplace_back(cur, next_cut); + if (j >= b.size() || b[j].first >= r) break; + cur = max(cur, b[j].second); + } + } + return res; +} + +struct OperationLogger { + struct Entry { + long long t; + long long seq; + string text; + }; + vector logs; + long long seq = 0; + + void emit_reload(long long t, long long addr, long long size) { + logs.push_back({t, seq++, "Reload " + to_string(t) + " " + to_string(addr) + " " + to_string(size)}); + } + void emit_offload(long long t, long long addr, long long size) { + logs.push_back({t, seq++, "Offload " + to_string(t) + " " + to_string(addr) + " " + to_string(size)}); + } + void emit_visit(long long t, int idx) { + logs.push_back({t, seq++, "Visit " + to_string(t) + " " + to_string(idx)}); + } + void emit_fin(long long t) { + logs.push_back({t, seq++, "Fin " + to_string(t)}); + } + + void flush() { + sort(logs.begin(), logs.end(), [](const Entry &a, const Entry &b) { + if (a.t != b.t) return a.t < b.t; + return a.seq < b.seq; + }); + for (auto &e : logs) cout << e.text << '\n'; + } +}; + +long long total_length(const vector> &segs) { + long long total = 0; + for (auto &seg : segs) { + total += max(0LL, seg.second - seg.first); + } + return total; +} + +struct RunningVisit { + long long finish; + vector> intervals; +}; + +int main() { + ios::sync_with_stdio(false); + cin.tie(nullptr); + + long long L, M; + int N; + if (!(cin >> L >> M >> N)) return 0; + vector req(N); + for (int i = 0; i < N; ++i) { + cin >> req[i].addr >> req[i].size >> req[i].start >> req[i].duration; + } + + vector>> req_required(N); + for (int i = 0; i < N; ++i) { + req_required[i] = {{req[i].addr, req[i].addr + req[i].size}}; + } + + vector> groups; + vector>> group_required; + for (int i = 0; i < N; ) { + vector g; + vector> needed; + long long start_time = req[i].start; + int j = i; + while (j < N && req[j].start == start_time) { + g.push_back(j); + needed.emplace_back(req[j].addr, req[j].addr + req[j].size); + ++j; + } + groups.push_back(g); + group_required.push_back(merge_intervals(needed)); + i = j; + } + + int G = groups.size(); + vector>> future_required(G); + vector> future_union; + for (int gi = G - 1; gi >= 0; --gi) { + future_required[gi] = future_union; + future_union = union_intervals(future_union, group_required[gi]); + } + + IntervalSet loaded; + OperationLogger logger; + long long io_time = 0; + long long barrier = 0; + vector running; + + auto cleanup_running = [&](long long now) { + running.erase(remove_if(running.begin(), running.end(), [&](const RunningVisit &rv) { + return rv.finish <= now; + }), running.end()); + }; + + auto active_intervals = [&]() { + vector> acc; + for (auto &rv : running) { + acc.insert(acc.end(), rv.intervals.begin(), rv.intervals.end()); + } + return merge_intervals(acc); + }; + + for (int gi = 0; gi < G; ++gi) { + const auto &group = groups[gi]; + auto order = group; + sort(order.begin(), order.end(), [&](int a, int b) { + if (req[a].addr != req[b].addr) return req[a].addr > req[b].addr; + return a > b; + }); + + long long group_finish = barrier; + vector> reserved_group; + vector visit_order; + + for (int idx : order) { + const auto &required = req_required[idx]; + long long need_size = total_length(required); + if (need_size > M) { + cerr << "Task requires " << need_size << " bytes > capacity " << M << "\n"; + return 1; + } + + cleanup_running(io_time); + + auto current = loaded.to_vector(); + auto to_load = subtract_intervals(required, current); + long long load_bytes = total_length(to_load); + long long extra_needed = max(0LL, loaded.usage() + load_bytes - M); + + while (extra_needed > 0) { + cleanup_running(io_time); + auto protected_now = union_intervals(required, reserved_group); + protected_now = union_intervals(protected_now, active_intervals()); + current = loaded.to_vector(); + auto removable = subtract_intervals(current, protected_now); + if (removable.empty()) { + if (running.empty()) { + cerr << "Unable to free enough memory despite required size within capacity" << '\n'; + return 1; + } + long long next_release = running.front().finish; + for (auto &rv : running) { + next_release = min(next_release, rv.finish); + } + if (next_release <= io_time) next_release = io_time + 1; + io_time = next_release; + cleanup_running(io_time); + continue; + } + for (auto &seg : removable) { + long long l = seg.first; + long long r = seg.second; + while (extra_needed > 0 && l < r) { + long long take = min(extra_needed, r - l); + auto removed = loaded.remove_interval(l, l + take); + long long freed = 0; + for (auto &part : removed) { + long long len = part.second - part.first; + if (len <= 0) continue; + logger.emit_offload(io_time, part.first, len); + io_time += 40LL * len; + freed += len; + } + if (freed == 0) break; + extra_needed -= freed; + l += freed; + } + if (extra_needed <= 0) break; + } + } + + current = loaded.to_vector(); + to_load = subtract_intervals(required, current); + for (auto &seg : to_load) { + long long len = seg.second - seg.first; + if (len <= 0) continue; + logger.emit_reload(io_time, seg.first, len); + io_time += 40LL * len; + loaded.add_interval(seg.first, seg.second); + } + + reserved_group = union_intervals(reserved_group, required); + visit_order.push_back(idx); + } + + long long visit_start = max({barrier, req[group.front()].start, io_time}); + for (int idx : visit_order) { + logger.emit_visit(visit_start, idx); + long long visit_end = visit_start + req[idx].duration; + group_finish = max(group_finish, visit_end); + running.push_back({visit_end, req_required[idx]}); + } + + barrier = max(barrier, group_finish); + } + + long long finish_time = max(barrier, io_time); + logger.emit_fin(finish_time); + logger.flush(); + return 0; +} diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.py" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.py" new file mode 100644 index 0000000000000000000000000000000000000000..2134142b0f0f196474b868b242a618f6650831a4 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/main.py" @@ -0,0 +1,222 @@ +from z3 import Optimize, Int, If, And, Or, Sum, IntNumRef, sat +import signal +import sys +import os +def _timeout_handler(signum, frame): + raise TimeoutError("solver timeout") + + +# Parse input: accept input and optional output from command line +# Usage: python main.py [output_file] +# If the first argument is an existing file path, open it; otherwise try appending ".in". +# If no input argument is provided, print usage and exit. +input_arg = sys.argv[1] if len(sys.argv) > 1 else exit("Usage: python main.py [output_file]") +if os.path.exists(input_arg): + infile = input_arg +elif os.path.exists(input_arg + '.in'): + infile = input_arg + '.in' +else: + raise FileNotFoundError(f"Input file not found: {input_arg} or {input_arg}.in") + +output = sys.argv[2] if len(sys.argv) > 2 else (os.path.splitext(infile)[0] + '.out') + + +# Read input file +with open(infile) as f: + L, M, N = map(int, f.readline().split()) + addr, size, start, time = [], [], [], [] + for _ in range(N): + a, s, st, t = map(int, f.readline().split()) + addr.append(a) + size.append(s) + start.append(st) + time.append(t) + +# Assume addr, size, N have been read +block_points = set() +for i in range(N): + block_points.add(addr[i]) + block_points.add(addr[i] + size[i]) +block_points = sorted(block_points) + +blocks = [] +block_size = [] +for i in range(len(block_points) - 1): + l, r = block_points[i], block_points[i+1] + blocks.append((l, r)) # 每个block是[l, r) + block_size.append(r - l) + +# Build visit-to-block mapping +visit_blocks = [[] for _ in range(N)] # visit_blocks[i] = [block_idx, ...] +block_visits_tmp = [[] for _ in range(len(blocks))] # block_visits[j] = [visit_idx, ...] + +for i in range(N): + a, b = addr[i], addr[i] + size[i] + for j, (l, r) in enumerate(blocks): + if not (r <= a or l >= b): # 有交集 + visit_blocks[i].append(j) + block_visits_tmp[j].append(i) + +# Keep only blocks that are actually used +used_block_indices = [j for j, vlist in enumerate(block_visits_tmp) if vlist] +blocks = [blocks[j] for j in used_block_indices] +block_size = [block_size[j] for j in used_block_indices] +block_visits = [block_visits_tmp[j] for j in used_block_indices] + +# Update visit_blocks to new block indices +old_to_new = {old: new for new, old in enumerate(used_block_indices)} +for i in range(N): + visit_blocks[i] = [old_to_new[j] for j in visit_blocks[i]] + +# blocks: [(l, r), ...] +# visit_blocks[i]: list of block indices required by visit i +# block_visits[j]: list of visits that use block j + +#print("Blocks:", visit_blocks) + +# Variable definitions +t_load = [Int(f"t_load_{i}") for i in range(len(blocks))] +t_visit = [Int(f"t_visit_{i}") for i in range(N)] +t_offload = [Int(f"t_offload_{i}") for i in range(len(blocks))] + +# Create optimizer +opt = Optimize() + +# 1. Time non-negativity +for i in range(len(blocks)): + opt.add(t_load[i] >= 0) + opt.add(t_offload[i] >= 0) +for i in range(N): + opt.add(t_visit[i] >= 0) + +# 2. Constraints: blocks must be loaded before visits, visit cannot be earlier than its start, +# and a block's offload must be after all visits that use it finish. +for i in range(N): + opt.add(t_visit[i] >= start[i]) + for blk in visit_blocks[i]: + opt.add(t_visit[i] >= t_load[blk] + block_size[blk]*40) + +for i in range(N): + for blk in visit_blocks[i]: + opt.add(t_offload[blk] >= t_visit[i] + time[i]) + # opt.add(t_offload[j] >= t_load[j] + block_size[j]*40) + + +# 3. Load/offload mutual exclusion: operations of the same class cannot overlap, and load/offload cannot overlap +for i in range(len(blocks)): + for j in range(i+1, len(blocks)): + opt.add(Or(t_load[i] + block_size[i]*40 <= t_load[j], t_load[j] + block_size[j]*40 <= t_load[i])) + opt.add(Or(t_offload[i] + block_size[i]*40 <= t_offload[j], t_offload[j] + block_size[j]*40 <= t_offload[i])) + opt.add(Or(t_load[i] + block_size[i]*40 <= t_offload[j], t_offload[j] + block_size[j]*40 <= t_load[i])) + opt.add(Or(t_load[j] + block_size[j]*40 <= t_offload[i], t_offload[i] + block_size[i]*40 <= t_load[j])) + +# According to example 3: visits with the same start time belong to the same computational task and can run in parallel; +# different tasks must be serialized. Group visits by start time to enforce inter-group serialization. +tasks = [] # 每个任务是访问索引列表 +current_start = None +for i in range(N): + if current_start is None or start[i] != current_start: + tasks.append([]) + current_start = start[i] + tasks[-1].append(i) + +group_end_vars = [Int(f"t_group_end_{k}") for k in range(len(tasks))] +for k, group in enumerate(tasks): + # 组内所有visit必须完全同时开始 + for i in group: + opt.add(t_visit[i] >= start[i]) + if group: + for i in group: + opt.add(t_visit[i] == t_visit[group[0]]) + # 组完成时间定义为所有visit完成时间的最大值 + for i in group: + opt.add(group_end_vars[k] >= t_visit[i] + time[i]) + # 组所需所有块必须在组内任一visit开始前已加载 + group_blocks = set() + for i in group: + for blk in visit_blocks[i]: + group_blocks.add(blk) + for blk in group_blocks: + for i in group: + opt.add(t_visit[i] >= t_load[blk] + block_size[blk]*40) + + +# 组间串行:组k完成后,组k+1的所有visit才能开始 +for k in range(len(tasks) - 1): + for j in tasks[k+1]: + opt.add(group_end_vars[k] <= t_visit[j]) + + +# 4. Memory capacity constraint: sampled approximation +# Ensure total memory occupied by loaded blocks at each sampled time point does not exceed M +for t in range(0, 100000, 40): + opt.add(Sum([If(And(t >= t_load[j], t < t_offload[j] + block_size[j]*40), block_size[j], 0) for j in range(len(blocks))]) <= M) + +# (不再需要逐项强制单调性,任务级串行约束已覆盖更早请求必须更早被满足的要求) + + +fin_time = Int('fin_time') +# 总完成时间为最后一组的完成时间 +opt.add(fin_time == group_end_vars[-1]) +for j in range(len(blocks)): + opt.add(t_offload[j] >= t_load[j] + block_size[j]*40) +opt.minimize(fin_time) + + +signal.signal(signal.SIGALRM, _timeout_handler) +signal.alarm(9) +try: + res = opt.check() + signal.alarm(0) + if res == sat: + m = opt.model() + #for i in range(len(blocks)): + #print(f"t_load[{i}] = {m[t_load[i]]}, t_offload[{i}] = {m[t_offload[i]]}") + #for i in range(N): + #print(f"t_visit[{i}] = {m[t_visit[i]]}") + fin_time_val = m.evaluate(fin_time).as_long() # type: ignore[attr-defined] + actions = [] + for i in range(len(blocks)): + l, r = blocks[i] + t_load_val = m.evaluate(t_load[i]).as_long() # type: ignore[attr-defined] + t_offload_val = m.evaluate(t_offload[i]).as_long() # type: ignore[attr-defined] + actions.append(('Reload', t_load_val, l, r - l)) + # Offload可选输出(可保留,或按需去除) + if t_offload_val + 40 * block_size[i] <= fin_time_val: + actions.append(('Offload', t_offload_val, l, r - l)) + for i in range(N): + t_visit_val = m.evaluate(t_visit[i]).as_long() # type: ignore[attr-defined] + actions.append(('Visit', t_visit_val, i)) + actions.append(('Fin', fin_time_val)) + + def action_key(act): + type_order = {'Reload': 0, 'Visit': 1, 'Offload': 2, 'Fin': 3} + return (act[1], type_order[act[0]]) + + actions.sort(key=action_key) + + # Write formal output to file + with open(output, 'w') as outf: + for act in actions: + if act[0] == 'Reload': + line = f"Reload {act[1]} {act[2]} {act[3]}" + elif act[0] == 'Visit': + line = f"Visit {act[1]} {act[2]}" + elif act[0] == 'Offload': + line = f"Offload {act[1]} {act[2]} {act[3]}" + else: + line = f"Fin {act[1]}" + print(line) + outf.write(line + '\n') + # STOP WHEN FIN + if act[0] == 'Fin': + break + else: + print("unsat") + with open(output, 'w') as outf: + outf.write("UNSAT_OR_UNKNOWN\n") +except TimeoutError: + with open(output, 'w') as outf: + outf.write("TIMEOUT\n") + print("Solver timed out after 10 seconds. Wrote TIMEOUT to", output) + sys.exit(2) \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/planner" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/planner" new file mode 100755 index 0000000000000000000000000000000000000000..5ce5037b15a068c2eee23e2c6ac2d6bc00565b43 Binary files /dev/null and "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/planner" differ diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/README.md" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..978f34bb3ff642f7fd6bd579cff52dfc9f5ca032 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/README.md" @@ -0,0 +1,14 @@ +# 测试用例说明 + +| 文件名 | 说明 | +| --- | --- | +| `example1` | 与题面示例1一致,基础能力校验。 | +| `example2` | 题面示例2,测试访存与IO并行。 | +| `example3` | 题面示例3,检验同一 start 的多访存同步启动逻辑。 | +| `fragmented_segments` | 多段碎片化访问,共享 start 的5段以上区间,验证运行中/预保留的保护机制。 | +| `long_trace` | 120 组共 480 条访问的大规模序列,主要考察稳定性与累积误差。 | +| `memory_churn` | 反复卸载/装载同一地址范围,测试容量受限情况下的淘汰策略。 | +| `proactive_offload` | 需要在空闲 IO 窗口内主动卸载无用片段,否则会触发 NPU/IO 冲突。 | +| `mega_multiseg` | **新增**:L=20000、M=320,共 1260 条记录(420 组,每组 3 段),大量同时发生的多段访存迫使求解器频繁换入换出,专门用于验证串行 IO、`reserved_group`/`running` 保护以及总体性能。 | + +> 运行 `../run_suite.sh` 可一次性重建二进制、重新规划所有 `.in`、并将检查结果写入 `summary.txt`。 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.in" new file mode 100644 index 0000000000000000000000000000000000000000..10939ddbe21cfe7db89d4590f1a0a980e30dd3d2 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.in" @@ -0,0 +1,4 @@ +200 100 2 +0 100 0 30 +100 100 50 10 + diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out" new file mode 100644 index 0000000000000000000000000000000000000000..0cd474bc8ee4b983c65ba0dd3108883aaace9b5e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out" @@ -0,0 +1,6 @@ +Reload 0 0 100 +Visit 4000 0 +Offload 4030 0 100 +Reload 8030 100 100 +Visit 12030 1 +Fin 12040 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.planner_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.planner_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..0cd474bc8ee4b983c65ba0dd3108883aaace9b5e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.planner_tmp" @@ -0,0 +1,6 @@ +Reload 0 0 100 +Visit 4000 0 +Offload 4030 0 100 +Reload 8030 100 100 +Visit 12030 1 +Fin 12040 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.smt_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.smt_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..0cd474bc8ee4b983c65ba0dd3108883aaace9b5e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example1.out.smt_tmp" @@ -0,0 +1,6 @@ +Reload 0 0 100 +Visit 4000 0 +Offload 4030 0 100 +Reload 8030 100 100 +Visit 12030 1 +Fin 12040 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.in" new file mode 100644 index 0000000000000000000000000000000000000000..92aee8b1325daabe9e51cf57aa068317baf4b521 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.in" @@ -0,0 +1,4 @@ +300 200 3 +0 100 0 50 +100 100 4000 30 +150 100 4001 20 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out" new file mode 100644 index 0000000000000000000000000000000000000000..d481c5e06aa486d7e2aac180f678b8bac483daa9 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out" @@ -0,0 +1,8 @@ +Reload 0 0 100 +Visit 4000 0 +Reload 4000 100 100 +Visit 8000 1 +Offload 8000 0 50 +Reload 10000 200 50 +Visit 12000 2 +Fin 12020 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.planner_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.planner_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..d481c5e06aa486d7e2aac180f678b8bac483daa9 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.planner_tmp" @@ -0,0 +1,8 @@ +Reload 0 0 100 +Visit 4000 0 +Reload 4000 100 100 +Visit 8000 1 +Offload 8000 0 50 +Reload 10000 200 50 +Visit 12000 2 +Fin 12020 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.smt_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.smt_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..47719c7844a8e0ed3d7513ea243249040c731569 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example2.out.smt_tmp" @@ -0,0 +1,9 @@ +Reload 0 100 50 +Reload 2000 0 100 +Reload 6000 150 50 +Visit 6000 0 +Visit 8000 1 +Offload 8030 100 50 +Reload 10030 200 50 +Visit 12030 2 +Fin 12050 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.in" new file mode 100644 index 0000000000000000000000000000000000000000..3a7df150362195a17b17e85ddb01c4e78959c3c2 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.in" @@ -0,0 +1,4 @@ +300 200 3 +0 100 0 5000 +100 100 0 5000 +50 100 4001 20 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out" new file mode 100644 index 0000000000000000000000000000000000000000..d8f4b5ded44f625d5cbf71a449989236f467a8c7 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out" @@ -0,0 +1,6 @@ +Reload 0 100 100 +Reload 4000 0 100 +Visit 8000 1 +Visit 8000 0 +Visit 13000 2 +Fin 13020 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.planner_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.planner_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..d8f4b5ded44f625d5cbf71a449989236f467a8c7 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.planner_tmp" @@ -0,0 +1,6 @@ +Reload 0 100 100 +Reload 4000 0 100 +Visit 8000 1 +Visit 8000 0 +Visit 13000 2 +Fin 13020 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.smt_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.smt_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..78a8446a9531a95c1cdae2cc8e805275ec41dc77 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/example3.out.smt_tmp" @@ -0,0 +1,8 @@ +Reload 0 0 50 +Reload 2000 100 50 +Reload 4000 150 50 +Reload 6000 50 50 +Visit 8000 0 +Visit 8000 1 +Visit 13000 2 +Fin 13020 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.in" new file mode 100644 index 0000000000000000000000000000000000000000..b41c6abf8c50e0e79c636e32461afa00912cb9ae --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.in" @@ -0,0 +1,13 @@ +600 200 12 +0 30 0 40 +60 28 0 45 +120 32 0 35 +180 26 0 30 +240 34 0 50 +20 36 120 30 +100 30 120 35 +180 28 120 40 +260 32 120 45 +340 48 200 25 +420 48 200 25 +500 48 200 25 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.out" new file mode 100644 index 0000000000000000000000000000000000000000..7b9de70d78cfedc376c25192690277ff06a8eb95 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/fragmented_segments.out" @@ -0,0 +1,34 @@ +Reload 0 240 34 +Reload 1360 180 26 +Reload 2400 120 32 +Reload 3680 60 28 +Reload 4800 0 30 +Visit 6000 4 +Visit 6000 3 +Visit 6000 2 +Visit 6000 1 +Visit 6000 0 +Reload 6000 274 18 +Reload 6720 206 2 +Reload 6800 100 20 +Offload 7600 0 16 +Reload 8240 30 26 +Visit 9280 8 +Visit 9280 7 +Visit 9280 6 +Visit 9280 5 +Offload 9280 16 4 +Offload 9440 60 28 +Offload 10560 130 16 +Reload 11200 500 48 +Offload 13120 20 36 +Offload 14560 100 12 +Reload 15040 420 48 +Offload 16960 112 18 +Offload 17680 146 6 +Offload 17920 180 24 +Reload 18880 340 48 +Visit 20800 11 +Visit 20800 10 +Visit 20800 9 +Fin 20825 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.in" new file mode 100644 index 0000000000000000000000000000000000000000..09c6851742981b338d634c414a311025e7d8cb5f --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.in" @@ -0,0 +1,121 @@ +2000 180 120 +0 24 0 20 +37 40 0 30 +74 56 0 40 +111 24 0 50 +148 40 150 60 +185 56 150 20 +222 24 150 30 +259 40 150 40 +296 56 300 50 +333 24 300 60 +370 40 300 20 +407 56 300 30 +444 24 450 40 +481 40 450 50 +518 56 450 60 +555 24 450 20 +592 40 600 30 +629 56 600 40 +666 24 600 50 +703 40 600 60 +740 56 750 20 +777 24 750 30 +814 40 750 40 +851 56 750 50 +888 24 900 60 +925 40 900 20 +962 56 900 30 +999 24 900 40 +1036 40 1050 50 +1073 56 1050 60 +1110 24 1050 20 +1147 40 1050 30 +1184 56 1200 40 +1221 24 1200 50 +1258 40 1200 60 +1295 56 1200 20 +1332 24 1350 30 +1369 40 1350 40 +1406 56 1350 50 +1443 24 1350 60 +1480 40 1500 20 +1517 56 1500 30 +1554 24 1500 40 +1591 40 1500 50 +1628 56 1650 60 +1665 24 1650 20 +1702 40 1650 30 +1739 56 1650 40 +1776 24 1800 50 +1813 40 1800 60 +1850 56 1800 20 +7 24 1800 30 +44 40 1950 40 +81 56 1950 50 +118 24 1950 60 +155 40 1950 20 +192 56 2100 30 +229 24 2100 40 +266 40 2100 50 +303 56 2100 60 +340 24 2250 20 +377 40 2250 30 +414 56 2250 40 +451 24 2250 50 +488 40 2400 60 +525 56 2400 20 +562 24 2400 30 +599 40 2400 40 +636 56 2550 50 +673 24 2550 60 +710 40 2550 20 +747 56 2550 30 +784 24 2700 40 +821 40 2700 50 +858 56 2700 60 +895 24 2700 20 +932 40 2850 30 +969 56 2850 40 +1006 24 2850 50 +1043 40 2850 60 +1080 56 3000 20 +1117 24 3000 30 +1154 40 3000 40 +1191 56 3000 50 +1228 24 3150 60 +1265 40 3150 20 +1302 56 3150 30 +1339 24 3150 40 +1376 40 3300 50 +1413 56 3300 60 +1450 24 3300 20 +1487 40 3300 30 +1524 56 3450 40 +1561 24 3450 50 +1598 40 3450 60 +1635 56 3450 20 +1672 24 3600 30 +1709 40 3600 40 +1746 56 3600 50 +1783 24 3600 60 +1820 40 3750 20 +1857 56 3750 30 +14 24 3750 40 +51 40 3750 50 +88 56 3900 60 +125 24 3900 20 +162 40 3900 30 +199 56 3900 40 +236 24 4050 50 +273 40 4050 60 +310 56 4050 20 +347 24 4050 30 +384 40 4200 40 +421 56 4200 50 +458 24 4200 60 +495 40 4200 20 +532 56 4350 30 +569 24 4350 40 +606 40 4350 50 +643 56 4350 60 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.out" new file mode 100644 index 0000000000000000000000000000000000000000..806b7cf76952155704d32247abf1fcbc0b3554ce --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/long_trace.out" @@ -0,0 +1,400 @@ +Reload 0 111 24 +Reload 960 74 37 +Reload 2440 37 37 +Reload 3920 0 24 +Visit 4880 3 +Visit 4880 2 +Visit 4880 1 +Visit 4880 0 +Reload 4880 259 40 +Offload 6480 0 6 +Reload 6720 222 24 +Offload 7680 6 18 +Offload 8400 37 19 +Reload 9160 185 37 +Offload 10640 56 37 +Reload 12120 148 37 +Visit 13600 7 +Visit 13600 6 +Visit 13600 5 +Visit 13600 4 +Offload 13600 93 42 +Offload 15280 148 14 +Reload 15840 407 56 +Offload 18080 162 37 +Reload 19560 370 37 +Offload 21040 199 24 +Reload 22000 333 24 +Offload 22960 223 23 +Offload 23880 259 11 +Reload 24320 299 34 +Visit 25680 11 +Visit 25680 10 +Visit 25680 9 +Visit 25680 8 +Offload 25680 270 24 +Reload 26640 555 24 +Offload 27600 294 37 +Reload 29080 518 37 +Offload 30560 331 26 +Offload 31600 370 11 +Reload 32040 481 37 +Offload 33520 381 5 +Reload 33720 463 5 +Visit 33920 15 +Visit 33920 14 +Visit 33920 13 +Visit 33920 12 +Offload 33920 386 40 +Reload 35520 703 40 +Offload 37120 426 24 +Reload 38080 666 24 +Offload 39040 450 18 +Offload 39760 481 19 +Reload 40520 629 37 +Offload 42000 500 37 +Reload 43480 592 37 +Visit 44960 19 +Visit 44960 18 +Visit 44960 17 +Visit 44960 16 +Offload 44960 537 42 +Offload 46640 592 14 +Reload 47200 851 56 +Offload 49440 606 37 +Reload 50920 814 37 +Offload 52400 643 24 +Reload 53360 777 24 +Offload 54320 667 23 +Offload 55240 703 11 +Reload 55680 743 34 +Visit 57040 23 +Visit 57040 22 +Visit 57040 21 +Visit 57040 20 +Offload 57040 714 24 +Reload 58000 999 24 +Offload 58960 738 37 +Reload 60440 962 37 +Offload 61920 775 26 +Offload 62960 814 11 +Reload 63400 925 37 +Offload 64880 825 5 +Reload 65080 907 5 +Visit 65280 27 +Visit 65280 26 +Visit 65280 25 +Visit 65280 24 +Offload 65280 830 40 +Reload 66880 1147 40 +Offload 68480 870 24 +Reload 69440 1110 24 +Offload 70400 894 18 +Offload 71120 925 19 +Reload 71880 1073 37 +Offload 73360 944 37 +Reload 74840 1036 37 +Visit 76320 31 +Visit 76320 30 +Visit 76320 29 +Visit 76320 28 +Offload 76320 981 42 +Offload 78000 1036 14 +Reload 78560 1295 56 +Offload 80800 1050 37 +Reload 82280 1258 37 +Offload 83760 1087 24 +Reload 84720 1221 24 +Offload 85680 1111 23 +Offload 86600 1147 11 +Reload 87040 1187 34 +Visit 88400 35 +Visit 88400 34 +Visit 88400 33 +Visit 88400 32 +Offload 88400 1158 24 +Reload 89360 1443 24 +Offload 90320 1182 37 +Reload 91800 1406 37 +Offload 93280 1219 26 +Offload 94320 1258 11 +Reload 94760 1369 37 +Offload 96240 1269 5 +Reload 96440 1351 5 +Visit 96640 39 +Visit 96640 38 +Visit 96640 37 +Visit 96640 36 +Offload 96640 1274 40 +Reload 98240 1591 40 +Offload 99840 1314 24 +Reload 100800 1554 24 +Offload 101760 1338 18 +Offload 102480 1369 19 +Reload 103240 1517 37 +Offload 104720 1388 37 +Reload 106200 1480 37 +Visit 107680 43 +Visit 107680 42 +Visit 107680 41 +Visit 107680 40 +Offload 107680 1425 42 +Offload 109360 1480 14 +Reload 109920 1739 56 +Offload 112160 1494 37 +Reload 113640 1702 37 +Offload 115120 1531 24 +Reload 116080 1665 24 +Offload 117040 1555 23 +Offload 117960 1591 11 +Reload 118400 1631 34 +Visit 119760 47 +Visit 119760 46 +Visit 119760 45 +Visit 119760 44 +Offload 119760 1602 26 +Offload 120800 1628 30 +Reload 122000 1850 56 +Offload 124240 1658 31 +Offload 125480 1702 6 +Reload 125720 1813 37 +Offload 127200 1708 5 +Reload 127400 1795 5 +Offload 127600 1713 24 +Reload 128560 7 24 +Visit 129520 50 +Visit 129520 49 +Visit 129520 48 +Visit 129520 51 +Offload 129520 1737 39 +Offload 131080 7 1 +Reload 131120 155 40 +Offload 132720 8 23 +Offload 133640 1776 1 +Reload 133680 118 24 +Offload 134640 1777 23 +Offload 135560 1813 14 +Reload 136120 81 37 +Offload 137600 1827 37 +Reload 139080 44 37 +Visit 140560 55 +Visit 140560 54 +Visit 140560 53 +Visit 140560 52 +Offload 140560 1864 42 +Offload 142240 44 14 +Reload 142800 303 56 +Offload 145040 58 37 +Reload 146520 266 37 +Offload 148000 95 24 +Reload 148960 229 24 +Offload 149920 119 23 +Offload 150840 155 11 +Reload 151280 195 34 +Visit 152640 59 +Visit 152640 58 +Visit 152640 57 +Visit 152640 56 +Offload 152640 166 24 +Reload 153600 451 24 +Offload 154560 190 37 +Reload 156040 414 37 +Offload 157520 227 26 +Offload 158560 266 11 +Reload 159000 377 37 +Offload 160480 277 5 +Reload 160680 359 5 +Visit 160880 63 +Visit 160880 62 +Visit 160880 61 +Visit 160880 60 +Offload 160880 282 40 +Reload 162480 599 40 +Offload 164080 322 24 +Reload 165040 562 24 +Offload 166000 346 18 +Offload 166720 377 19 +Reload 167480 525 37 +Offload 168960 396 37 +Reload 170440 488 37 +Visit 171920 67 +Visit 171920 66 +Visit 171920 65 +Visit 171920 64 +Offload 171920 433 42 +Offload 173600 488 14 +Reload 174160 747 56 +Offload 176400 502 37 +Reload 177880 710 37 +Offload 179360 539 24 +Reload 180320 673 24 +Offload 181280 563 23 +Offload 182200 599 11 +Reload 182640 639 34 +Visit 184000 71 +Visit 184000 70 +Visit 184000 69 +Visit 184000 68 +Offload 184000 610 24 +Reload 184960 895 24 +Offload 185920 634 37 +Reload 187400 858 37 +Offload 188880 671 26 +Offload 189920 710 11 +Reload 190360 821 37 +Offload 191840 721 5 +Reload 192040 803 5 +Visit 192240 75 +Visit 192240 74 +Visit 192240 73 +Visit 192240 72 +Offload 192240 726 40 +Reload 193840 1043 40 +Offload 195440 766 24 +Reload 196400 1006 24 +Offload 197360 790 18 +Offload 198080 821 19 +Reload 198840 969 37 +Offload 200320 840 37 +Reload 201800 932 37 +Visit 203280 79 +Visit 203280 78 +Visit 203280 77 +Visit 203280 76 +Offload 203280 877 42 +Offload 204960 932 14 +Reload 205520 1191 56 +Offload 207760 946 37 +Reload 209240 1154 37 +Offload 210720 983 24 +Reload 211680 1117 24 +Offload 212640 1007 23 +Offload 213560 1043 11 +Reload 214000 1083 34 +Visit 215360 83 +Visit 215360 82 +Visit 215360 81 +Visit 215360 80 +Offload 215360 1054 24 +Reload 216320 1339 24 +Offload 217280 1078 37 +Reload 218760 1302 37 +Offload 220240 1115 26 +Offload 221280 1154 11 +Reload 221720 1265 37 +Offload 223200 1165 5 +Reload 223400 1247 5 +Visit 223600 87 +Visit 223600 86 +Visit 223600 85 +Visit 223600 84 +Offload 223600 1170 40 +Reload 225200 1487 40 +Offload 226800 1210 24 +Reload 227760 1450 24 +Offload 228720 1234 18 +Offload 229440 1265 19 +Reload 230200 1413 37 +Offload 231680 1284 37 +Reload 233160 1376 37 +Visit 234640 91 +Visit 234640 90 +Visit 234640 89 +Visit 234640 88 +Offload 234640 1321 42 +Offload 236320 1376 14 +Reload 236880 1635 56 +Offload 239120 1390 37 +Reload 240600 1598 37 +Offload 242080 1427 24 +Reload 243040 1561 24 +Offload 244000 1451 23 +Offload 244920 1487 11 +Reload 245360 1527 34 +Visit 246720 95 +Visit 246720 94 +Visit 246720 93 +Visit 246720 92 +Offload 246720 1498 24 +Reload 247680 1783 24 +Offload 248640 1522 37 +Reload 250120 1746 37 +Offload 251600 1559 26 +Offload 252640 1598 11 +Reload 253080 1709 37 +Offload 254560 1609 5 +Reload 254760 1691 5 +Visit 254960 99 +Visit 254960 98 +Visit 254960 97 +Visit 254960 96 +Offload 254960 1614 56 +Reload 257200 1857 56 +Offload 259440 1670 26 +Offload 260480 1709 11 +Reload 260920 1820 37 +Offload 262400 1720 40 +Reload 264000 51 40 +Offload 265600 1760 24 +Reload 266560 14 24 +Visit 267520 101 +Visit 267520 100 +Visit 267520 103 +Visit 267520 102 +Offload 267520 1784 23 +Offload 268440 14 24 +Offload 269400 51 9 +Reload 269760 199 56 +Offload 272000 60 31 +Offload 273240 1820 6 +Reload 273480 162 37 +Offload 274960 1826 24 +Reload 275920 125 24 +Offload 276880 1850 37 +Reload 278360 88 37 +Visit 279840 107 +Visit 279840 106 +Visit 279840 105 +Visit 279840 104 +Offload 279840 1887 24 +Reload 280800 347 24 +Offload 281760 88 37 +Reload 283240 310 37 +Offload 284720 125 24 +Offload 285680 162 13 +Reload 286200 273 37 +Offload 287680 175 5 +Reload 287880 255 5 +Visit 288080 111 +Visit 288080 110 +Visit 288080 109 +Visit 288080 108 +Offload 288080 180 40 +Reload 289680 495 40 +Offload 291280 220 24 +Reload 292240 458 24 +Offload 293200 244 16 +Offload 293840 273 21 +Reload 294680 421 37 +Offload 296160 294 37 +Reload 297640 384 37 +Visit 299120 115 +Visit 299120 114 +Visit 299120 113 +Visit 299120 112 +Offload 299120 331 40 +Offload 300720 1911 2 +Offload 300800 384 14 +Reload 301360 643 56 +Offload 303600 398 37 +Reload 305080 606 37 +Offload 306560 435 24 +Reload 307520 569 24 +Offload 308480 459 23 +Offload 309400 495 11 +Reload 309840 535 34 +Visit 311200 119 +Visit 311200 118 +Visit 311200 117 +Visit 311200 116 +Fin 311260 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.in" new file mode 100644 index 0000000000000000000000000000000000000000..5a81be9af7f012c1fc71d278c8cf062ab44de6a9 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.in" @@ -0,0 +1,1261 @@ +20000 320 1260 +0 40 0 150 +317 63 0 190 +634 86 0 230 +137 47 200 155 +454 70 200 195 +771 93 200 235 +274 54 400 160 +591 77 400 200 +908 100 400 240 +411 61 600 165 +728 84 600 205 +1045 107 600 245 +548 68 800 170 +865 91 800 210 +1182 44 800 250 +685 75 1000 175 +1002 98 1000 215 +1319 51 1000 255 +822 82 1200 180 +1139 105 1200 220 +1456 58 1200 260 +959 89 1400 185 +1276 42 1400 225 +1593 65 1400 265 +1096 96 1600 190 +1413 49 1600 230 +1730 72 1600 270 +1233 103 1800 195 +1550 56 1800 235 +1867 79 1800 275 +1370 40 2000 200 +1687 63 2000 240 +2004 86 2000 280 +1507 47 2200 205 +1824 70 2200 245 +2141 93 2200 285 +1644 54 2400 210 +1961 77 2400 250 +2278 100 2400 290 +1781 61 2600 215 +2098 84 2600 255 +2415 107 2600 295 +1918 68 2800 220 +2235 91 2800 260 +2552 44 2800 300 +2055 75 3000 225 +2372 98 3000 265 +2689 51 3000 305 +2192 82 3200 230 +2509 105 3200 270 +2826 58 3200 310 +2329 89 3400 235 +2646 42 3400 275 +2963 65 3400 315 +2466 96 3600 240 +2783 49 3600 280 +3100 72 3600 320 +2603 103 3800 245 +2920 56 3800 285 +3237 79 3800 325 +2740 40 4000 250 +3057 63 4000 290 +3374 86 4000 330 +2877 47 4200 255 +3194 70 4200 295 +3511 93 4200 335 +3014 54 4400 260 +3331 77 4400 300 +3648 100 4400 340 +3151 61 4600 265 +3468 84 4600 305 +3785 107 4600 345 +3288 68 4800 270 +3605 91 4800 310 +3922 44 4800 350 +3425 75 5000 275 +3742 98 5000 315 +4059 51 5000 355 +3562 82 5200 280 +3879 105 5200 320 +4196 58 5200 360 +3699 89 5400 285 +4016 42 5400 325 +4333 65 5400 365 +3836 96 5600 290 +4153 49 5600 330 +4470 72 5600 370 +3973 103 5800 295 +4290 56 5800 335 +4607 79 5800 375 +4110 40 6000 300 +4427 63 6000 340 +4744 86 6000 380 +4247 47 6200 305 +4564 70 6200 345 +4881 93 6200 385 +4384 54 6400 310 +4701 77 6400 350 +5018 100 6400 390 +4521 61 6600 315 +4838 84 6600 355 +5155 107 6600 395 +4658 68 6800 320 +4975 91 6800 360 +5292 44 6800 400 +4795 75 7000 325 +5112 98 7000 365 +5429 51 7000 405 +4932 82 7200 330 +5249 105 7200 370 +5566 58 7200 410 +5069 89 7400 335 +5386 42 7400 375 +5703 65 7400 415 +5206 96 7600 340 +5523 49 7600 380 +5840 72 7600 420 +5343 103 7800 345 +5660 56 7800 385 +5977 79 7800 425 +5480 40 8000 350 +5797 63 8000 390 +6114 86 8000 430 +5617 47 8200 355 +5934 70 8200 395 +6251 93 8200 435 +5754 54 8400 360 +6071 77 8400 400 +6388 100 8400 440 +5891 61 8600 365 +6208 84 8600 405 +6525 107 8600 445 +6028 68 8800 370 +6345 91 8800 410 +6662 44 8800 450 +6165 75 9000 375 +6482 98 9000 415 +6799 51 9000 455 +6302 82 9200 380 +6619 105 9200 420 +6936 58 9200 460 +6439 89 9400 385 +6756 42 9400 425 +7073 65 9400 465 +6576 96 9600 390 +6893 49 9600 430 +7210 72 9600 470 +6713 103 9800 395 +7030 56 9800 435 +7347 79 9800 475 +6850 40 10000 400 +7167 63 10000 440 +7484 86 10000 480 +6987 47 10200 405 +7304 70 10200 445 +7621 93 10200 485 +7124 54 10400 410 +7441 77 10400 450 +7758 100 10400 490 +7261 61 10600 415 +7578 84 10600 455 +7895 107 10600 495 +7398 68 10800 420 +7715 91 10800 460 +8032 44 10800 500 +7535 75 11000 425 +7852 98 11000 465 +8169 51 11000 505 +7672 82 11200 430 +7989 105 11200 470 +8306 58 11200 510 +7809 89 11400 435 +8126 42 11400 475 +8443 65 11400 515 +7946 96 11600 440 +8263 49 11600 480 +8580 72 11600 520 +8083 103 11800 445 +8400 56 11800 485 +8717 79 11800 525 +8220 40 12000 150 +8537 63 12000 190 +8854 86 12000 230 +8357 47 12200 155 +8674 70 12200 195 +8991 93 12200 235 +8494 54 12400 160 +8811 77 12400 200 +9128 100 12400 240 +8631 61 12600 165 +8948 84 12600 205 +9265 107 12600 245 +8768 68 12800 170 +9085 91 12800 210 +9402 44 12800 250 +8905 75 13000 175 +9222 98 13000 215 +9539 51 13000 255 +9042 82 13200 180 +9359 105 13200 220 +9676 58 13200 260 +9179 89 13400 185 +9496 42 13400 225 +9813 65 13400 265 +9316 96 13600 190 +9633 49 13600 230 +9950 72 13600 270 +9453 103 13800 195 +9770 56 13800 235 +10087 79 13800 275 +9590 40 14000 200 +9907 63 14000 240 +10224 86 14000 280 +9727 47 14200 205 +10044 70 14200 245 +10361 93 14200 285 +9864 54 14400 210 +10181 77 14400 250 +10498 100 14400 290 +10001 61 14600 215 +10318 84 14600 255 +10635 107 14600 295 +10138 68 14800 220 +10455 91 14800 260 +10772 44 14800 300 +10275 75 15000 225 +10592 98 15000 265 +10909 51 15000 305 +10412 82 15200 230 +10729 105 15200 270 +11046 58 15200 310 +10549 89 15400 235 +10866 42 15400 275 +11183 65 15400 315 +10686 96 15600 240 +11003 49 15600 280 +11320 72 15600 320 +10823 103 15800 245 +11140 56 15800 285 +11457 79 15800 325 +10960 40 16000 250 +11277 63 16000 290 +11594 86 16000 330 +11097 47 16200 255 +11414 70 16200 295 +11731 93 16200 335 +11234 54 16400 260 +11551 77 16400 300 +11868 100 16400 340 +11371 61 16600 265 +11688 84 16600 305 +12005 107 16600 345 +11508 68 16800 270 +11825 91 16800 310 +12142 44 16800 350 +11645 75 17000 275 +11962 98 17000 315 +12279 51 17000 355 +11782 82 17200 280 +12099 105 17200 320 +12416 58 17200 360 +11919 89 17400 285 +12236 42 17400 325 +12553 65 17400 365 +12056 96 17600 290 +12373 49 17600 330 +12690 72 17600 370 +12193 103 17800 295 +12510 56 17800 335 +12827 79 17800 375 +12330 40 18000 300 +12647 63 18000 340 +12964 86 18000 380 +12467 47 18200 305 +12784 70 18200 345 +13101 93 18200 385 +12604 54 18400 310 +12921 77 18400 350 +13238 100 18400 390 +12741 61 18600 315 +13058 84 18600 355 +13375 107 18600 395 +12878 68 18800 320 +13195 91 18800 360 +13512 44 18800 400 +13015 75 19000 325 +13332 98 19000 365 +13649 51 19000 405 +13152 82 19200 330 +13469 105 19200 370 +13786 58 19200 410 +13289 89 19400 335 +13606 42 19400 375 +13923 65 19400 415 +13426 96 19600 340 +13743 49 19600 380 +14060 72 19600 420 +13563 103 19800 345 +13880 56 19800 385 +14197 79 19800 425 +13700 40 20000 350 +14017 63 20000 390 +14334 86 20000 430 +13837 47 20200 355 +14154 70 20200 395 +14471 93 20200 435 +13974 54 20400 360 +14291 77 20400 400 +14608 100 20400 440 +14111 61 20600 365 +14428 84 20600 405 +14745 107 20600 445 +14248 68 20800 370 +14565 91 20800 410 +14882 44 20800 450 +14385 75 21000 375 +14702 98 21000 415 +15019 51 21000 455 +14522 82 21200 380 +14839 105 21200 420 +15156 58 21200 460 +14659 89 21400 385 +14976 42 21400 425 +15293 65 21400 465 +14796 96 21600 390 +15113 49 21600 430 +15430 72 21600 470 +14933 103 21800 395 +15250 56 21800 435 +15567 79 21800 475 +15070 40 22000 400 +15387 63 22000 440 +15704 86 22000 480 +15207 47 22200 405 +15524 70 22200 445 +15841 93 22200 485 +15344 54 22400 410 +15661 77 22400 450 +15978 100 22400 490 +15481 61 22600 415 +15798 84 22600 455 +16115 107 22600 495 +15618 68 22800 420 +15935 91 22800 460 +16252 44 22800 500 +15755 75 23000 425 +16072 98 23000 465 +16389 51 23000 505 +15892 82 23200 430 +16209 105 23200 470 +16526 58 23200 510 +16029 89 23400 435 +16346 42 23400 475 +16663 65 23400 515 +16166 96 23600 440 +16483 49 23600 480 +16800 72 23600 520 +16303 103 23800 445 +16620 56 23800 485 +16937 79 23800 525 +16440 40 24000 150 +16757 63 24000 190 +17074 86 24000 230 +16577 47 24200 155 +16894 70 24200 195 +17211 93 24200 235 +16714 54 24400 160 +17031 77 24400 200 +17348 100 24400 240 +16851 61 24600 165 +17168 84 24600 205 +17485 107 24600 245 +16988 68 24800 170 +17305 91 24800 210 +17622 44 24800 250 +17125 75 25000 175 +17442 98 25000 215 +17759 51 25000 255 +17262 82 25200 180 +17579 105 25200 220 +17896 58 25200 260 +17399 89 25400 185 +17716 42 25400 225 +18033 65 25400 265 +17536 96 25600 190 +17853 49 25600 230 +18170 72 25600 270 +17673 103 25800 195 +17990 56 25800 235 +18307 79 25800 275 +17810 40 26000 200 +18127 63 26000 240 +18444 86 26000 280 +17947 47 26200 205 +18264 70 26200 245 +18581 93 26200 285 +18084 54 26400 210 +18401 77 26400 250 +18718 100 26400 290 +18221 61 26600 215 +18538 84 26600 255 +18855 107 26600 295 +18358 68 26800 220 +18675 91 26800 260 +18992 44 26800 300 +18495 75 27000 225 +18812 98 27000 265 +19129 51 27000 305 +18632 82 27200 230 +18949 105 27200 270 +19266 58 27200 310 +18769 89 27400 235 +19086 42 27400 275 +19403 65 27400 315 +18906 96 27600 240 +19223 49 27600 280 +19540 72 27600 320 +19043 103 27800 245 +19360 56 27800 285 +19677 79 27800 325 +19180 40 28000 250 +19497 63 28000 290 +14 86 28000 330 +19317 47 28200 255 +19634 70 28200 295 +151 93 28200 335 +19454 54 28400 260 +19771 77 28400 300 +288 100 28400 340 +19591 61 28600 265 +108 84 28600 305 +425 107 28600 345 +19728 68 28800 270 +245 91 28800 310 +562 44 28800 350 +65 75 29000 275 +382 98 29000 315 +699 51 29000 355 +202 82 29200 280 +519 105 29200 320 +836 58 29200 360 +339 89 29400 285 +656 42 29400 325 +973 65 29400 365 +476 96 29600 290 +793 49 29600 330 +1110 72 29600 370 +613 103 29800 295 +930 56 29800 335 +1247 79 29800 375 +750 40 30000 300 +1067 63 30000 340 +1384 86 30000 380 +887 47 30200 305 +1204 70 30200 345 +1521 93 30200 385 +1024 54 30400 310 +1341 77 30400 350 +1658 100 30400 390 +1161 61 30600 315 +1478 84 30600 355 +1795 107 30600 395 +1298 68 30800 320 +1615 91 30800 360 +1932 44 30800 400 +1435 75 31000 325 +1752 98 31000 365 +2069 51 31000 405 +1572 82 31200 330 +1889 105 31200 370 +2206 58 31200 410 +1709 89 31400 335 +2026 42 31400 375 +2343 65 31400 415 +1846 96 31600 340 +2163 49 31600 380 +2480 72 31600 420 +1983 103 31800 345 +2300 56 31800 385 +2617 79 31800 425 +2120 40 32000 350 +2437 63 32000 390 +2754 86 32000 430 +2257 47 32200 355 +2574 70 32200 395 +2891 93 32200 435 +2394 54 32400 360 +2711 77 32400 400 +3028 100 32400 440 +2531 61 32600 365 +2848 84 32600 405 +3165 107 32600 445 +2668 68 32800 370 +2985 91 32800 410 +3302 44 32800 450 +2805 75 33000 375 +3122 98 33000 415 +3439 51 33000 455 +2942 82 33200 380 +3259 105 33200 420 +3576 58 33200 460 +3079 89 33400 385 +3396 42 33400 425 +3713 65 33400 465 +3216 96 33600 390 +3533 49 33600 430 +3850 72 33600 470 +3353 103 33800 395 +3670 56 33800 435 +3987 79 33800 475 +3490 40 34000 400 +3807 63 34000 440 +4124 86 34000 480 +3627 47 34200 405 +3944 70 34200 445 +4261 93 34200 485 +3764 54 34400 410 +4081 77 34400 450 +4398 100 34400 490 +3901 61 34600 415 +4218 84 34600 455 +4535 107 34600 495 +4038 68 34800 420 +4355 91 34800 460 +4672 44 34800 500 +4175 75 35000 425 +4492 98 35000 465 +4809 51 35000 505 +4312 82 35200 430 +4629 105 35200 470 +4946 58 35200 510 +4449 89 35400 435 +4766 42 35400 475 +5083 65 35400 515 +4586 96 35600 440 +4903 49 35600 480 +5220 72 35600 520 +4723 103 35800 445 +5040 56 35800 485 +5357 79 35800 525 +4860 40 36000 150 +5177 63 36000 190 +5494 86 36000 230 +4997 47 36200 155 +5314 70 36200 195 +5631 93 36200 235 +5134 54 36400 160 +5451 77 36400 200 +5768 100 36400 240 +5271 61 36600 165 +5588 84 36600 205 +5905 107 36600 245 +5408 68 36800 170 +5725 91 36800 210 +6042 44 36800 250 +5545 75 37000 175 +5862 98 37000 215 +6179 51 37000 255 +5682 82 37200 180 +5999 105 37200 220 +6316 58 37200 260 +5819 89 37400 185 +6136 42 37400 225 +6453 65 37400 265 +5956 96 37600 190 +6273 49 37600 230 +6590 72 37600 270 +6093 103 37800 195 +6410 56 37800 235 +6727 79 37800 275 +6230 40 38000 200 +6547 63 38000 240 +6864 86 38000 280 +6367 47 38200 205 +6684 70 38200 245 +7001 93 38200 285 +6504 54 38400 210 +6821 77 38400 250 +7138 100 38400 290 +6641 61 38600 215 +6958 84 38600 255 +7275 107 38600 295 +6778 68 38800 220 +7095 91 38800 260 +7412 44 38800 300 +6915 75 39000 225 +7232 98 39000 265 +7549 51 39000 305 +7052 82 39200 230 +7369 105 39200 270 +7686 58 39200 310 +7189 89 39400 235 +7506 42 39400 275 +7823 65 39400 315 +7326 96 39600 240 +7643 49 39600 280 +7960 72 39600 320 +7463 103 39800 245 +7780 56 39800 285 +8097 79 39800 325 +7600 40 40000 250 +7917 63 40000 290 +8234 86 40000 330 +7737 47 40200 255 +8054 70 40200 295 +8371 93 40200 335 +7874 54 40400 260 +8191 77 40400 300 +8508 100 40400 340 +8011 61 40600 265 +8328 84 40600 305 +8645 107 40600 345 +8148 68 40800 270 +8465 91 40800 310 +8782 44 40800 350 +8285 75 41000 275 +8602 98 41000 315 +8919 51 41000 355 +8422 82 41200 280 +8739 105 41200 320 +9056 58 41200 360 +8559 89 41400 285 +8876 42 41400 325 +9193 65 41400 365 +8696 96 41600 290 +9013 49 41600 330 +9330 72 41600 370 +8833 103 41800 295 +9150 56 41800 335 +9467 79 41800 375 +8970 40 42000 300 +9287 63 42000 340 +9604 86 42000 380 +9107 47 42200 305 +9424 70 42200 345 +9741 93 42200 385 +9244 54 42400 310 +9561 77 42400 350 +9878 100 42400 390 +9381 61 42600 315 +9698 84 42600 355 +10015 107 42600 395 +9518 68 42800 320 +9835 91 42800 360 +10152 44 42800 400 +9655 75 43000 325 +9972 98 43000 365 +10289 51 43000 405 +9792 82 43200 330 +10109 105 43200 370 +10426 58 43200 410 +9929 89 43400 335 +10246 42 43400 375 +10563 65 43400 415 +10066 96 43600 340 +10383 49 43600 380 +10700 72 43600 420 +10203 103 43800 345 +10520 56 43800 385 +10837 79 43800 425 +10340 40 44000 350 +10657 63 44000 390 +10974 86 44000 430 +10477 47 44200 355 +10794 70 44200 395 +11111 93 44200 435 +10614 54 44400 360 +10931 77 44400 400 +11248 100 44400 440 +10751 61 44600 365 +11068 84 44600 405 +11385 107 44600 445 +10888 68 44800 370 +11205 91 44800 410 +11522 44 44800 450 +11025 75 45000 375 +11342 98 45000 415 +11659 51 45000 455 +11162 82 45200 380 +11479 105 45200 420 +11796 58 45200 460 +11299 89 45400 385 +11616 42 45400 425 +11933 65 45400 465 +11436 96 45600 390 +11753 49 45600 430 +12070 72 45600 470 +11573 103 45800 395 +11890 56 45800 435 +12207 79 45800 475 +11710 40 46000 400 +12027 63 46000 440 +12344 86 46000 480 +11847 47 46200 405 +12164 70 46200 445 +12481 93 46200 485 +11984 54 46400 410 +12301 77 46400 450 +12618 100 46400 490 +12121 61 46600 415 +12438 84 46600 455 +12755 107 46600 495 +12258 68 46800 420 +12575 91 46800 460 +12892 44 46800 500 +12395 75 47000 425 +12712 98 47000 465 +13029 51 47000 505 +12532 82 47200 430 +12849 105 47200 470 +13166 58 47200 510 +12669 89 47400 435 +12986 42 47400 475 +13303 65 47400 515 +12806 96 47600 440 +13123 49 47600 480 +13440 72 47600 520 +12943 103 47800 445 +13260 56 47800 485 +13577 79 47800 525 +13080 40 48000 150 +13397 63 48000 190 +13714 86 48000 230 +13217 47 48200 155 +13534 70 48200 195 +13851 93 48200 235 +13354 54 48400 160 +13671 77 48400 200 +13988 100 48400 240 +13491 61 48600 165 +13808 84 48600 205 +14125 107 48600 245 +13628 68 48800 170 +13945 91 48800 210 +14262 44 48800 250 +13765 75 49000 175 +14082 98 49000 215 +14399 51 49000 255 +13902 82 49200 180 +14219 105 49200 220 +14536 58 49200 260 +14039 89 49400 185 +14356 42 49400 225 +14673 65 49400 265 +14176 96 49600 190 +14493 49 49600 230 +14810 72 49600 270 +14313 103 49800 195 +14630 56 49800 235 +14947 79 49800 275 +14450 40 50000 200 +14767 63 50000 240 +15084 86 50000 280 +14587 47 50200 205 +14904 70 50200 245 +15221 93 50200 285 +14724 54 50400 210 +15041 77 50400 250 +15358 100 50400 290 +14861 61 50600 215 +15178 84 50600 255 +15495 107 50600 295 +14998 68 50800 220 +15315 91 50800 260 +15632 44 50800 300 +15135 75 51000 225 +15452 98 51000 265 +15769 51 51000 305 +15272 82 51200 230 +15589 105 51200 270 +15906 58 51200 310 +15409 89 51400 235 +15726 42 51400 275 +16043 65 51400 315 +15546 96 51600 240 +15863 49 51600 280 +16180 72 51600 320 +15683 103 51800 245 +16000 56 51800 285 +16317 79 51800 325 +15820 40 52000 250 +16137 63 52000 290 +16454 86 52000 330 +15957 47 52200 255 +16274 70 52200 295 +16591 93 52200 335 +16094 54 52400 260 +16411 77 52400 300 +16728 100 52400 340 +16231 61 52600 265 +16548 84 52600 305 +16865 107 52600 345 +16368 68 52800 270 +16685 91 52800 310 +17002 44 52800 350 +16505 75 53000 275 +16822 98 53000 315 +17139 51 53000 355 +16642 82 53200 280 +16959 105 53200 320 +17276 58 53200 360 +16779 89 53400 285 +17096 42 53400 325 +17413 65 53400 365 +16916 96 53600 290 +17233 49 53600 330 +17550 72 53600 370 +17053 103 53800 295 +17370 56 53800 335 +17687 79 53800 375 +17190 40 54000 300 +17507 63 54000 340 +17824 86 54000 380 +17327 47 54200 305 +17644 70 54200 345 +17961 93 54200 385 +17464 54 54400 310 +17781 77 54400 350 +18098 100 54400 390 +17601 61 54600 315 +17918 84 54600 355 +18235 107 54600 395 +17738 68 54800 320 +18055 91 54800 360 +18372 44 54800 400 +17875 75 55000 325 +18192 98 55000 365 +18509 51 55000 405 +18012 82 55200 330 +18329 105 55200 370 +18646 58 55200 410 +18149 89 55400 335 +18466 42 55400 375 +18783 65 55400 415 +18286 96 55600 340 +18603 49 55600 380 +18920 72 55600 420 +18423 103 55800 345 +18740 56 55800 385 +19057 79 55800 425 +18560 40 56000 350 +18877 63 56000 390 +19194 86 56000 430 +18697 47 56200 355 +19014 70 56200 395 +19331 93 56200 435 +18834 54 56400 360 +19151 77 56400 400 +19468 100 56400 440 +18971 61 56600 365 +19288 84 56600 405 +19605 107 56600 445 +19108 68 56800 370 +19425 91 56800 410 +19742 44 56800 450 +19245 75 57000 375 +19562 98 57000 415 +79 51 57000 455 +19382 82 57200 380 +19699 105 57200 420 +216 58 57200 460 +19519 89 57400 385 +36 42 57400 425 +353 65 57400 465 +19656 96 57600 390 +173 49 57600 430 +490 72 57600 470 +19793 103 57800 395 +310 56 57800 435 +627 79 57800 475 +130 40 58000 400 +447 63 58000 440 +764 86 58000 480 +267 47 58200 405 +584 70 58200 445 +901 93 58200 485 +404 54 58400 410 +721 77 58400 450 +1038 100 58400 490 +541 61 58600 415 +858 84 58600 455 +1175 107 58600 495 +678 68 58800 420 +995 91 58800 460 +1312 44 58800 500 +815 75 59000 425 +1132 98 59000 465 +1449 51 59000 505 +952 82 59200 430 +1269 105 59200 470 +1586 58 59200 510 +1089 89 59400 435 +1406 42 59400 475 +1723 65 59400 515 +1226 96 59600 440 +1543 49 59600 480 +1860 72 59600 520 +1363 103 59800 445 +1680 56 59800 485 +1997 79 59800 525 +1500 40 60000 150 +1817 63 60000 190 +2134 86 60000 230 +1637 47 60200 155 +1954 70 60200 195 +2271 93 60200 235 +1774 54 60400 160 +2091 77 60400 200 +2408 100 60400 240 +1911 61 60600 165 +2228 84 60600 205 +2545 107 60600 245 +2048 68 60800 170 +2365 91 60800 210 +2682 44 60800 250 +2185 75 61000 175 +2502 98 61000 215 +2819 51 61000 255 +2322 82 61200 180 +2639 105 61200 220 +2956 58 61200 260 +2459 89 61400 185 +2776 42 61400 225 +3093 65 61400 265 +2596 96 61600 190 +2913 49 61600 230 +3230 72 61600 270 +2733 103 61800 195 +3050 56 61800 235 +3367 79 61800 275 +2870 40 62000 200 +3187 63 62000 240 +3504 86 62000 280 +3007 47 62200 205 +3324 70 62200 245 +3641 93 62200 285 +3144 54 62400 210 +3461 77 62400 250 +3778 100 62400 290 +3281 61 62600 215 +3598 84 62600 255 +3915 107 62600 295 +3418 68 62800 220 +3735 91 62800 260 +4052 44 62800 300 +3555 75 63000 225 +3872 98 63000 265 +4189 51 63000 305 +3692 82 63200 230 +4009 105 63200 270 +4326 58 63200 310 +3829 89 63400 235 +4146 42 63400 275 +4463 65 63400 315 +3966 96 63600 240 +4283 49 63600 280 +4600 72 63600 320 +4103 103 63800 245 +4420 56 63800 285 +4737 79 63800 325 +4240 40 64000 250 +4557 63 64000 290 +4874 86 64000 330 +4377 47 64200 255 +4694 70 64200 295 +5011 93 64200 335 +4514 54 64400 260 +4831 77 64400 300 +5148 100 64400 340 +4651 61 64600 265 +4968 84 64600 305 +5285 107 64600 345 +4788 68 64800 270 +5105 91 64800 310 +5422 44 64800 350 +4925 75 65000 275 +5242 98 65000 315 +5559 51 65000 355 +5062 82 65200 280 +5379 105 65200 320 +5696 58 65200 360 +5199 89 65400 285 +5516 42 65400 325 +5833 65 65400 365 +5336 96 65600 290 +5653 49 65600 330 +5970 72 65600 370 +5473 103 65800 295 +5790 56 65800 335 +6107 79 65800 375 +5610 40 66000 300 +5927 63 66000 340 +6244 86 66000 380 +5747 47 66200 305 +6064 70 66200 345 +6381 93 66200 385 +5884 54 66400 310 +6201 77 66400 350 +6518 100 66400 390 +6021 61 66600 315 +6338 84 66600 355 +6655 107 66600 395 +6158 68 66800 320 +6475 91 66800 360 +6792 44 66800 400 +6295 75 67000 325 +6612 98 67000 365 +6929 51 67000 405 +6432 82 67200 330 +6749 105 67200 370 +7066 58 67200 410 +6569 89 67400 335 +6886 42 67400 375 +7203 65 67400 415 +6706 96 67600 340 +7023 49 67600 380 +7340 72 67600 420 +6843 103 67800 345 +7160 56 67800 385 +7477 79 67800 425 +6980 40 68000 350 +7297 63 68000 390 +7614 86 68000 430 +7117 47 68200 355 +7434 70 68200 395 +7751 93 68200 435 +7254 54 68400 360 +7571 77 68400 400 +7888 100 68400 440 +7391 61 68600 365 +7708 84 68600 405 +8025 107 68600 445 +7528 68 68800 370 +7845 91 68800 410 +8162 44 68800 450 +7665 75 69000 375 +7982 98 69000 415 +8299 51 69000 455 +7802 82 69200 380 +8119 105 69200 420 +8436 58 69200 460 +7939 89 69400 385 +8256 42 69400 425 +8573 65 69400 465 +8076 96 69600 390 +8393 49 69600 430 +8710 72 69600 470 +8213 103 69800 395 +8530 56 69800 435 +8847 79 69800 475 +8350 40 70000 400 +8667 63 70000 440 +8984 86 70000 480 +8487 47 70200 405 +8804 70 70200 445 +9121 93 70200 485 +8624 54 70400 410 +8941 77 70400 450 +9258 100 70400 490 +8761 61 70600 415 +9078 84 70600 455 +9395 107 70600 495 +8898 68 70800 420 +9215 91 70800 460 +9532 44 70800 500 +9035 75 71000 425 +9352 98 71000 465 +9669 51 71000 505 +9172 82 71200 430 +9489 105 71200 470 +9806 58 71200 510 +9309 89 71400 435 +9626 42 71400 475 +9943 65 71400 515 +9446 96 71600 440 +9763 49 71600 480 +10080 72 71600 520 +9583 103 71800 445 +9900 56 71800 485 +10217 79 71800 525 +9720 40 72000 150 +10037 63 72000 190 +10354 86 72000 230 +9857 47 72200 155 +10174 70 72200 195 +10491 93 72200 235 +9994 54 72400 160 +10311 77 72400 200 +10628 100 72400 240 +10131 61 72600 165 +10448 84 72600 205 +10765 107 72600 245 +10268 68 72800 170 +10585 91 72800 210 +10902 44 72800 250 +10405 75 73000 175 +10722 98 73000 215 +11039 51 73000 255 +10542 82 73200 180 +10859 105 73200 220 +11176 58 73200 260 +10679 89 73400 185 +10996 42 73400 225 +11313 65 73400 265 +10816 96 73600 190 +11133 49 73600 230 +11450 72 73600 270 +10953 103 73800 195 +11270 56 73800 235 +11587 79 73800 275 +11090 40 74000 200 +11407 63 74000 240 +11724 86 74000 280 +11227 47 74200 205 +11544 70 74200 245 +11861 93 74200 285 +11364 54 74400 210 +11681 77 74400 250 +11998 100 74400 290 +11501 61 74600 215 +11818 84 74600 255 +12135 107 74600 295 +11638 68 74800 220 +11955 91 74800 260 +12272 44 74800 300 +11775 75 75000 225 +12092 98 75000 265 +12409 51 75000 305 +11912 82 75200 230 +12229 105 75200 270 +12546 58 75200 310 +12049 89 75400 235 +12366 42 75400 275 +12683 65 75400 315 +12186 96 75600 240 +12503 49 75600 280 +12820 72 75600 320 +12323 103 75800 245 +12640 56 75800 285 +12957 79 75800 325 +12460 40 76000 250 +12777 63 76000 290 +13094 86 76000 330 +12597 47 76200 255 +12914 70 76200 295 +13231 93 76200 335 +12734 54 76400 260 +13051 77 76400 300 +13368 100 76400 340 +12871 61 76600 265 +13188 84 76600 305 +13505 107 76600 345 +13008 68 76800 270 +13325 91 76800 310 +13642 44 76800 350 +13145 75 77000 275 +13462 98 77000 315 +13779 51 77000 355 +13282 82 77200 280 +13599 105 77200 320 +13916 58 77200 360 +13419 89 77400 285 +13736 42 77400 325 +14053 65 77400 365 +13556 96 77600 290 +13873 49 77600 330 +14190 72 77600 370 +13693 103 77800 295 +14010 56 77800 335 +14327 79 77800 375 +13830 40 78000 300 +14147 63 78000 340 +14464 86 78000 380 +13967 47 78200 305 +14284 70 78200 345 +14601 93 78200 385 +14104 54 78400 310 +14421 77 78400 350 +14738 100 78400 390 +14241 61 78600 315 +14558 84 78600 355 +14875 107 78600 395 +14378 68 78800 320 +14695 91 78800 360 +15012 44 78800 400 +14515 75 79000 325 +14832 98 79000 365 +15149 51 79000 405 +14652 82 79200 330 +14969 105 79200 370 +15286 58 79200 410 +14789 89 79400 335 +15106 42 79400 375 +15423 65 79400 415 +14926 96 79600 340 +15243 49 79600 380 +15560 72 79600 420 +15063 103 79800 345 +15380 56 79800 385 +15697 79 79800 425 +15200 40 80000 350 +15517 63 80000 390 +15834 86 80000 430 +15337 47 80200 355 +15654 70 80200 395 +15971 93 80200 435 +15474 54 80400 360 +15791 77 80400 400 +16108 100 80400 440 +15611 61 80600 365 +15928 84 80600 405 +16245 107 80600 445 +15748 68 80800 370 +16065 91 80800 410 +16382 44 80800 450 +15885 75 81000 375 +16202 98 81000 415 +16519 51 81000 455 +16022 82 81200 380 +16339 105 81200 420 +16656 58 81200 460 +16159 89 81400 385 +16476 42 81400 425 +16793 65 81400 465 +16296 96 81600 390 +16613 49 81600 430 +16930 72 81600 470 +16433 103 81800 395 +16750 56 81800 435 +17067 79 81800 475 +16570 40 82000 400 +16887 63 82000 440 +17204 86 82000 480 +16707 47 82200 405 +17024 70 82200 445 +17341 93 82200 485 +16844 54 82400 410 +17161 77 82400 450 +17478 100 82400 490 +16981 61 82600 415 +17298 84 82600 455 +17615 107 82600 495 +17118 68 82800 420 +17435 91 82800 460 +17752 44 82800 500 +17255 75 83000 425 +17572 98 83000 465 +17889 51 83000 505 +17392 82 83200 430 +17709 105 83200 470 +18026 58 83200 510 +17529 89 83400 435 +17846 42 83400 475 +18163 65 83400 515 +17666 96 83600 440 +17983 49 83600 480 +18300 72 83600 520 +17803 103 83800 445 +18120 56 83800 485 +18437 79 83800 525 \ No newline at end of file diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out" new file mode 100644 index 0000000000000000000000000000000000000000..4394fbc51ab3ffd423c1c7006ddb32c8accdec80 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out" @@ -0,0 +1,4989 @@ +Reload 0 634 86 +Reload 3440 317 63 +Reload 5960 0 40 +Visit 7560 2 +Visit 7560 1 +Visit 7560 0 +Reload 7560 771 93 +Offload 11280 0 32 +Reload 12560 454 70 +Offload 15360 32 8 +Offload 15680 317 39 +Reload 17240 137 47 +Visit 19120 5 +Visit 19120 4 +Visit 19120 3 +Offload 19120 356 24 +Offload 20080 634 76 +Reload 23120 908 100 +Offload 27120 137 47 +Offload 29000 454 30 +Reload 30200 591 77 +Offload 33280 484 40 +Offload 34880 710 10 +Offload 35280 771 4 +Reload 35440 274 54 +Visit 37600 8 +Visit 37600 7 +Visit 37600 6 +Offload 37600 775 89 +Offload 41160 274 18 +Reload 41880 1045 107 +Offload 46160 292 36 +Offload 47600 591 48 +Reload 49520 728 84 +Offload 52880 639 29 +Offload 54040 908 32 +Reload 55320 411 61 +Visit 57760 11 +Visit 57760 10 +Visit 57760 9 +Offload 57760 940 44 +Reload 59520 1182 44 +Offload 61280 411 61 +Offload 63720 728 30 +Reload 64920 865 91 +Offload 68560 758 54 +Offload 70720 984 14 +Reload 71280 548 68 +Visit 74000 14 +Visit 74000 13 +Visit 74000 12 +Offload 74000 998 10 +Offload 74400 1045 41 +Reload 76040 1319 51 +Offload 78080 548 68 +Offload 80800 865 16 +Reload 81440 1002 84 +Offload 84800 881 75 +Reload 87800 685 75 +Visit 90800 17 +Visit 90800 16 +Visit 90800 15 +Offload 90800 1100 52 +Offload 92880 1182 6 +Reload 93120 1456 58 +Offload 95440 685 67 +Reload 98120 1139 49 +Reload 100080 1226 18 +Offload 100800 752 8 +Offload 101120 1002 74 +Reload 104080 822 82 +Visit 107360 20 +Visit 107360 19 +Visit 107360 18 +Offload 107360 1076 24 +Offload 108320 1319 41 +Reload 109960 1593 65 +Offload 112560 822 42 +Reload 114240 1276 42 +Offload 115920 864 40 +Offload 117520 1139 49 +Reload 119480 959 89 +Visit 123040 23 +Visit 123040 22 +Visit 123040 21 +Offload 123040 1188 56 +Offload 125280 1360 10 +Offload 125680 1456 6 +Reload 125920 1730 72 +Offload 128800 959 49 +Reload 130760 1413 49 +Offload 132720 1008 40 +Offload 134320 1276 42 +Offload 136000 1462 14 +Reload 136560 1096 96 +Visit 140400 26 +Visit 140400 25 +Visit 140400 24 +Offload 140400 1476 38 +Offload 141920 1593 41 +Reload 143560 1867 79 +Offload 146720 1096 56 +Reload 148960 1550 56 +Offload 151200 1152 40 +Offload 152800 1413 49 +Offload 154760 1634 14 +Reload 155320 1233 103 +Visit 159440 29 +Visit 159440 28 +Visit 159440 27 +Offload 159440 1648 10 +Offload 159840 1730 72 +Offload 162720 1233 4 +Reload 162880 2004 86 +Offload 166320 1237 63 +Reload 168840 1687 63 +Offload 171360 1300 36 +Offload 172800 1550 4 +Reload 172960 1370 40 +Visit 174560 32 +Visit 174560 31 +Visit 174560 30 +Offload 174560 1554 52 +Offload 176640 1867 41 +Reload 178280 2141 93 +Offload 182000 1370 40 +Offload 183600 1687 30 +Reload 184800 1824 70 +Offload 187600 1717 33 +Offload 188920 1908 14 +Reload 189480 1507 47 +Visit 191360 35 +Visit 191360 34 +Visit 191360 33 +Offload 191360 1922 24 +Offload 192320 2004 76 +Reload 195360 2278 100 +Offload 199360 1507 47 +Offload 201240 1824 30 +Reload 202440 1961 77 +Offload 205520 1854 40 +Offload 207120 2080 10 +Offload 207520 2141 4 +Reload 207680 1644 54 +Visit 209840 38 +Visit 209840 37 +Visit 209840 36 +Offload 209840 2145 89 +Offload 213400 1644 18 +Reload 214120 2415 107 +Offload 218400 1662 36 +Offload 219840 1961 48 +Reload 221760 2098 84 +Offload 225120 2009 29 +Offload 226280 2278 32 +Reload 227560 1781 61 +Visit 230000 41 +Visit 230000 40 +Visit 230000 39 +Offload 230000 2310 44 +Reload 231760 2552 44 +Offload 233520 1781 61 +Offload 235960 2098 30 +Reload 237160 2235 91 +Offload 240800 2128 54 +Offload 242960 2354 14 +Reload 243520 1918 68 +Visit 246240 44 +Visit 246240 43 +Visit 246240 42 +Offload 246240 2368 10 +Offload 246640 2415 41 +Reload 248280 2689 51 +Offload 250320 1918 68 +Offload 253040 2235 16 +Reload 253680 2372 84 +Offload 257040 2251 75 +Reload 260040 2055 75 +Visit 263040 47 +Visit 263040 46 +Visit 263040 45 +Offload 263040 2470 52 +Offload 265120 2552 6 +Reload 265360 2826 58 +Offload 267680 2055 67 +Reload 270360 2509 49 +Reload 272320 2596 18 +Offload 273040 2122 8 +Offload 273360 2372 74 +Reload 276320 2192 82 +Visit 279600 50 +Visit 279600 49 +Visit 279600 48 +Offload 279600 2446 24 +Offload 280560 2689 41 +Reload 282200 2963 65 +Offload 284800 2192 42 +Reload 286480 2646 42 +Offload 288160 2234 40 +Offload 289760 2509 49 +Reload 291720 2329 89 +Visit 295280 53 +Visit 295280 52 +Visit 295280 51 +Offload 295280 2558 56 +Offload 297520 2730 10 +Offload 297920 2826 6 +Reload 298160 3100 72 +Offload 301040 2329 49 +Reload 303000 2783 49 +Offload 304960 2378 40 +Offload 306560 2646 42 +Offload 308240 2832 14 +Reload 308800 2466 96 +Visit 312640 56 +Visit 312640 55 +Visit 312640 54 +Offload 312640 2846 38 +Offload 314160 2963 41 +Reload 315800 3237 79 +Offload 318960 2466 56 +Reload 321200 2920 56 +Offload 323440 2522 40 +Offload 325040 2783 49 +Offload 327000 3004 14 +Reload 327560 2603 103 +Visit 331680 59 +Visit 331680 58 +Visit 331680 57 +Offload 331680 3018 10 +Offload 332080 3100 72 +Offload 334960 2603 4 +Reload 335120 3374 86 +Offload 338560 2607 63 +Reload 341080 3057 63 +Offload 343600 2670 36 +Offload 345040 2920 4 +Reload 345200 2740 40 +Visit 346800 62 +Visit 346800 61 +Visit 346800 60 +Offload 346800 2924 52 +Offload 348880 3237 41 +Reload 350520 3511 93 +Offload 354240 2740 40 +Offload 355840 3057 30 +Reload 357040 3194 70 +Offload 359840 3087 33 +Offload 361160 3278 14 +Reload 361720 2877 47 +Visit 363600 65 +Visit 363600 64 +Visit 363600 63 +Offload 363600 3292 24 +Offload 364560 3374 76 +Reload 367600 3648 100 +Offload 371600 2877 47 +Offload 373480 3194 30 +Reload 374680 3331 77 +Offload 377760 3224 40 +Offload 379360 3450 10 +Offload 379760 3511 4 +Reload 379920 3014 54 +Visit 382080 68 +Visit 382080 67 +Visit 382080 66 +Offload 382080 3515 89 +Offload 385640 3014 18 +Reload 386360 3785 107 +Offload 390640 3032 36 +Offload 392080 3331 48 +Reload 394000 3468 84 +Offload 397360 3379 29 +Offload 398520 3648 32 +Reload 399800 3151 61 +Visit 402240 71 +Visit 402240 70 +Visit 402240 69 +Offload 402240 3680 44 +Reload 404000 3922 44 +Offload 405760 3151 61 +Offload 408200 3468 30 +Reload 409400 3605 91 +Offload 413040 3498 54 +Offload 415200 3724 14 +Reload 415760 3288 68 +Visit 418480 74 +Visit 418480 73 +Visit 418480 72 +Offload 418480 3738 10 +Offload 418880 3785 41 +Reload 420520 4059 51 +Offload 422560 3288 68 +Offload 425280 3605 16 +Reload 425920 3742 84 +Offload 429280 3621 75 +Reload 432280 3425 75 +Visit 435280 77 +Visit 435280 76 +Visit 435280 75 +Offload 435280 3840 52 +Offload 437360 3922 6 +Reload 437600 4196 58 +Offload 439920 3425 67 +Reload 442600 3879 49 +Reload 444560 3966 18 +Offload 445280 3492 8 +Offload 445600 3742 74 +Reload 448560 3562 82 +Visit 451840 80 +Visit 451840 79 +Visit 451840 78 +Offload 451840 3816 24 +Offload 452800 4059 41 +Reload 454440 4333 65 +Offload 457040 3562 42 +Reload 458720 4016 42 +Offload 460400 3604 40 +Offload 462000 3879 49 +Reload 463960 3699 89 +Visit 467520 83 +Visit 467520 82 +Visit 467520 81 +Offload 467520 3928 56 +Offload 469760 4100 10 +Offload 470160 4196 6 +Reload 470400 4470 72 +Offload 473280 3699 49 +Reload 475240 4153 49 +Offload 477200 3748 40 +Offload 478800 4016 42 +Offload 480480 4202 14 +Reload 481040 3836 96 +Visit 484880 86 +Visit 484880 85 +Visit 484880 84 +Offload 484880 4216 38 +Offload 486400 4333 41 +Reload 488040 4607 79 +Offload 491200 3836 56 +Reload 493440 4290 56 +Offload 495680 3892 40 +Offload 497280 4153 49 +Offload 499240 4374 14 +Reload 499800 3973 103 +Visit 503920 89 +Visit 503920 88 +Visit 503920 87 +Offload 503920 4388 10 +Offload 504320 4470 72 +Offload 507200 3973 4 +Reload 507360 4744 86 +Offload 510800 3977 63 +Reload 513320 4427 63 +Offload 515840 4040 36 +Offload 517280 4290 4 +Reload 517440 4110 40 +Visit 519040 92 +Visit 519040 91 +Visit 519040 90 +Offload 519040 4294 52 +Offload 521120 4607 41 +Reload 522760 4881 93 +Offload 526480 4110 40 +Offload 528080 4427 30 +Reload 529280 4564 70 +Offload 532080 4457 33 +Offload 533400 4648 14 +Reload 533960 4247 47 +Visit 535840 95 +Visit 535840 94 +Visit 535840 93 +Offload 535840 4662 24 +Offload 536800 4744 76 +Reload 539840 5018 100 +Offload 543840 4247 47 +Offload 545720 4564 30 +Reload 546920 4701 77 +Offload 550000 4594 40 +Offload 551600 4820 10 +Offload 552000 4881 4 +Reload 552160 4384 54 +Visit 554320 98 +Visit 554320 97 +Visit 554320 96 +Offload 554320 4885 89 +Offload 557880 4384 18 +Reload 558600 5155 107 +Offload 562880 4402 36 +Offload 564320 4701 48 +Reload 566240 4838 84 +Offload 569600 4749 29 +Offload 570760 5018 32 +Reload 572040 4521 61 +Visit 574480 101 +Visit 574480 100 +Visit 574480 99 +Offload 574480 5050 44 +Reload 576240 5292 44 +Offload 578000 4521 61 +Offload 580440 4838 30 +Reload 581640 4975 91 +Offload 585280 4868 54 +Offload 587440 5094 14 +Reload 588000 4658 68 +Visit 590720 104 +Visit 590720 103 +Visit 590720 102 +Offload 590720 5108 10 +Offload 591120 5155 41 +Reload 592760 5429 51 +Offload 594800 4658 68 +Offload 597520 4975 16 +Reload 598160 5112 84 +Offload 601520 4991 75 +Reload 604520 4795 75 +Visit 607520 107 +Visit 607520 106 +Visit 607520 105 +Offload 607520 5210 52 +Offload 609600 5292 6 +Reload 609840 5566 58 +Offload 612160 4795 67 +Reload 614840 5249 49 +Reload 616800 5336 18 +Offload 617520 4862 8 +Offload 617840 5112 74 +Reload 620800 4932 82 +Visit 624080 110 +Visit 624080 109 +Visit 624080 108 +Offload 624080 5186 24 +Offload 625040 5429 41 +Reload 626680 5703 65 +Offload 629280 4932 42 +Reload 630960 5386 42 +Offload 632640 4974 40 +Offload 634240 5249 49 +Reload 636200 5069 89 +Visit 639760 113 +Visit 639760 112 +Visit 639760 111 +Offload 639760 5298 56 +Offload 642000 5470 10 +Offload 642400 5566 6 +Reload 642640 5840 72 +Offload 645520 5069 49 +Reload 647480 5523 49 +Offload 649440 5118 40 +Offload 651040 5386 42 +Offload 652720 5572 14 +Reload 653280 5206 96 +Visit 657120 116 +Visit 657120 115 +Visit 657120 114 +Offload 657120 5586 38 +Offload 658640 5703 41 +Reload 660280 5977 79 +Offload 663440 5206 56 +Reload 665680 5660 56 +Offload 667920 5262 40 +Offload 669520 5523 49 +Offload 671480 5744 14 +Reload 672040 5343 103 +Visit 676160 119 +Visit 676160 118 +Visit 676160 117 +Offload 676160 5758 10 +Offload 676560 5840 72 +Offload 679440 5343 4 +Reload 679600 6114 86 +Offload 683040 5347 63 +Reload 685560 5797 63 +Offload 688080 5410 36 +Offload 689520 5660 4 +Reload 689680 5480 40 +Visit 691280 122 +Visit 691280 121 +Visit 691280 120 +Offload 691280 5664 52 +Offload 693360 5977 41 +Reload 695000 6251 93 +Offload 698720 5480 40 +Offload 700320 5797 30 +Reload 701520 5934 70 +Offload 704320 5827 33 +Offload 705640 6018 14 +Reload 706200 5617 47 +Visit 708080 125 +Visit 708080 124 +Visit 708080 123 +Offload 708080 6032 24 +Offload 709040 6114 76 +Reload 712080 6388 100 +Offload 716080 5617 47 +Offload 717960 5934 30 +Reload 719160 6071 77 +Offload 722240 5964 40 +Offload 723840 6190 10 +Offload 724240 6251 4 +Reload 724400 5754 54 +Visit 726560 128 +Visit 726560 127 +Visit 726560 126 +Offload 726560 6255 89 +Offload 730120 5754 18 +Reload 730840 6525 107 +Offload 735120 5772 36 +Offload 736560 6071 48 +Reload 738480 6208 84 +Offload 741840 6119 29 +Offload 743000 6388 32 +Reload 744280 5891 61 +Visit 746720 131 +Visit 746720 130 +Visit 746720 129 +Offload 746720 6420 44 +Reload 748480 6662 44 +Offload 750240 5891 61 +Offload 752680 6208 30 +Reload 753880 6345 91 +Offload 757520 6238 54 +Offload 759680 6464 14 +Reload 760240 6028 68 +Visit 762960 134 +Visit 762960 133 +Visit 762960 132 +Offload 762960 6478 10 +Offload 763360 6525 41 +Reload 765000 6799 51 +Offload 767040 6028 68 +Offload 769760 6345 16 +Reload 770400 6482 84 +Offload 773760 6361 75 +Reload 776760 6165 75 +Visit 779760 137 +Visit 779760 136 +Visit 779760 135 +Offload 779760 6580 52 +Offload 781840 6662 6 +Reload 782080 6936 58 +Offload 784400 6165 67 +Reload 787080 6619 49 +Reload 789040 6706 18 +Offload 789760 6232 8 +Offload 790080 6482 74 +Reload 793040 6302 82 +Visit 796320 140 +Visit 796320 139 +Visit 796320 138 +Offload 796320 6556 24 +Offload 797280 6799 41 +Reload 798920 7073 65 +Offload 801520 6302 42 +Reload 803200 6756 42 +Offload 804880 6344 40 +Offload 806480 6619 49 +Reload 808440 6439 89 +Visit 812000 143 +Visit 812000 142 +Visit 812000 141 +Offload 812000 6668 56 +Offload 814240 6840 10 +Offload 814640 6936 6 +Reload 814880 7210 72 +Offload 817760 6439 49 +Reload 819720 6893 49 +Offload 821680 6488 40 +Offload 823280 6756 42 +Offload 824960 6942 14 +Reload 825520 6576 96 +Visit 829360 146 +Visit 829360 145 +Visit 829360 144 +Offload 829360 6956 38 +Offload 830880 7073 41 +Reload 832520 7347 79 +Offload 835680 6576 56 +Reload 837920 7030 56 +Offload 840160 6632 40 +Offload 841760 6893 49 +Offload 843720 7114 14 +Reload 844280 6713 103 +Visit 848400 149 +Visit 848400 148 +Visit 848400 147 +Offload 848400 7128 10 +Offload 848800 7210 72 +Offload 851680 6713 4 +Reload 851840 7484 86 +Offload 855280 6717 63 +Reload 857800 7167 63 +Offload 860320 6780 36 +Offload 861760 7030 4 +Reload 861920 6850 40 +Visit 863520 152 +Visit 863520 151 +Visit 863520 150 +Offload 863520 7034 52 +Offload 865600 7347 41 +Reload 867240 7621 93 +Offload 870960 6850 40 +Offload 872560 7167 30 +Reload 873760 7304 70 +Offload 876560 7197 33 +Offload 877880 7388 14 +Reload 878440 6987 47 +Visit 880320 155 +Visit 880320 154 +Visit 880320 153 +Offload 880320 7402 24 +Offload 881280 7484 76 +Reload 884320 7758 100 +Offload 888320 6987 47 +Offload 890200 7304 30 +Reload 891400 7441 77 +Offload 894480 7334 40 +Offload 896080 7560 10 +Offload 896480 7621 4 +Reload 896640 7124 54 +Visit 898800 158 +Visit 898800 157 +Visit 898800 156 +Offload 898800 7625 89 +Offload 902360 7124 18 +Reload 903080 7895 107 +Offload 907360 7142 36 +Offload 908800 7441 48 +Reload 910720 7578 84 +Offload 914080 7489 29 +Offload 915240 7758 32 +Reload 916520 7261 61 +Visit 918960 161 +Visit 918960 160 +Visit 918960 159 +Offload 918960 7790 44 +Reload 920720 8032 44 +Offload 922480 7261 61 +Offload 924920 7578 30 +Reload 926120 7715 91 +Offload 929760 7608 54 +Offload 931920 7834 14 +Reload 932480 7398 68 +Visit 935200 164 +Visit 935200 163 +Visit 935200 162 +Offload 935200 7848 10 +Offload 935600 7895 41 +Reload 937240 8169 51 +Offload 939280 7398 68 +Offload 942000 7715 16 +Reload 942640 7852 84 +Offload 946000 7731 75 +Reload 949000 7535 75 +Visit 952000 167 +Visit 952000 166 +Visit 952000 165 +Offload 952000 7950 52 +Offload 954080 8032 6 +Reload 954320 8306 58 +Offload 956640 7535 67 +Reload 959320 7989 49 +Reload 961280 8076 18 +Offload 962000 7602 8 +Offload 962320 7852 74 +Reload 965280 7672 82 +Visit 968560 170 +Visit 968560 169 +Visit 968560 168 +Offload 968560 7926 24 +Offload 969520 8169 41 +Reload 971160 8443 65 +Offload 973760 7672 42 +Reload 975440 8126 42 +Offload 977120 7714 40 +Offload 978720 7989 49 +Reload 980680 7809 89 +Visit 984240 173 +Visit 984240 172 +Visit 984240 171 +Offload 984240 8038 56 +Offload 986480 8210 10 +Offload 986880 8306 6 +Reload 987120 8580 72 +Offload 990000 7809 49 +Reload 991960 8263 49 +Offload 993920 7858 40 +Offload 995520 8126 42 +Offload 997200 8312 14 +Reload 997760 7946 96 +Visit 1001600 176 +Visit 1001600 175 +Visit 1001600 174 +Offload 1001600 8326 38 +Offload 1003120 8443 41 +Reload 1004760 8717 79 +Offload 1007920 7946 56 +Reload 1010160 8400 56 +Offload 1012400 8002 40 +Offload 1014000 8263 49 +Offload 1015960 8484 14 +Reload 1016520 8083 103 +Visit 1020640 179 +Visit 1020640 178 +Visit 1020640 177 +Offload 1020640 8498 10 +Offload 1021040 8580 72 +Offload 1023920 8083 4 +Reload 1024080 8854 86 +Offload 1027520 8087 63 +Reload 1030040 8537 63 +Offload 1032560 8150 36 +Offload 1034000 8400 4 +Reload 1034160 8220 40 +Visit 1035760 182 +Visit 1035760 181 +Visit 1035760 180 +Offload 1035760 8404 52 +Offload 1037840 8717 41 +Reload 1039480 8991 93 +Offload 1043200 8220 40 +Offload 1044800 8537 30 +Reload 1046000 8674 70 +Offload 1048800 8567 33 +Offload 1050120 8758 14 +Reload 1050680 8357 47 +Visit 1052560 185 +Visit 1052560 184 +Visit 1052560 183 +Offload 1052560 8772 24 +Offload 1053520 8854 76 +Reload 1056560 9128 100 +Offload 1060560 8357 47 +Offload 1062440 8674 30 +Reload 1063640 8811 77 +Offload 1066720 8704 40 +Offload 1068320 8930 10 +Offload 1068720 8991 4 +Reload 1068880 8494 54 +Visit 1071040 188 +Visit 1071040 187 +Visit 1071040 186 +Offload 1071040 8995 89 +Offload 1074600 8494 18 +Reload 1075320 9265 107 +Offload 1079600 8512 36 +Offload 1081040 8811 48 +Reload 1082960 8948 84 +Offload 1086320 8859 29 +Offload 1087480 9128 32 +Reload 1088760 8631 61 +Visit 1091200 191 +Visit 1091200 190 +Visit 1091200 189 +Offload 1091200 9160 44 +Reload 1092960 9402 44 +Offload 1094720 8631 61 +Offload 1097160 8948 30 +Reload 1098360 9085 91 +Offload 1102000 8978 54 +Offload 1104160 9204 14 +Reload 1104720 8768 68 +Visit 1107440 194 +Visit 1107440 193 +Visit 1107440 192 +Offload 1107440 9218 10 +Offload 1107840 9265 41 +Reload 1109480 9539 51 +Offload 1111520 8768 68 +Offload 1114240 9085 16 +Reload 1114880 9222 84 +Offload 1118240 9101 75 +Reload 1121240 8905 75 +Visit 1124240 197 +Visit 1124240 196 +Visit 1124240 195 +Offload 1124240 9320 52 +Offload 1126320 9402 6 +Reload 1126560 9676 58 +Offload 1128880 8905 67 +Reload 1131560 9359 49 +Reload 1133520 9446 18 +Offload 1134240 8972 8 +Offload 1134560 9222 74 +Reload 1137520 9042 82 +Visit 1140800 200 +Visit 1140800 199 +Visit 1140800 198 +Offload 1140800 9296 24 +Offload 1141760 9539 41 +Reload 1143400 9813 65 +Offload 1146000 9042 42 +Reload 1147680 9496 42 +Offload 1149360 9084 40 +Offload 1150960 9359 49 +Reload 1152920 9179 89 +Visit 1156480 203 +Visit 1156480 202 +Visit 1156480 201 +Offload 1156480 9408 56 +Offload 1158720 9580 10 +Offload 1159120 9676 6 +Reload 1159360 9950 72 +Offload 1162240 9179 49 +Reload 1164200 9633 49 +Offload 1166160 9228 40 +Offload 1167760 9496 42 +Offload 1169440 9682 14 +Reload 1170000 9316 96 +Visit 1173840 206 +Visit 1173840 205 +Visit 1173840 204 +Offload 1173840 9696 38 +Offload 1175360 9813 41 +Reload 1177000 10087 79 +Offload 1180160 9316 56 +Reload 1182400 9770 56 +Offload 1184640 9372 40 +Offload 1186240 9633 49 +Offload 1188200 9854 14 +Reload 1188760 9453 103 +Visit 1192880 209 +Visit 1192880 208 +Visit 1192880 207 +Offload 1192880 9868 10 +Offload 1193280 9950 72 +Offload 1196160 9453 4 +Reload 1196320 10224 86 +Offload 1199760 9457 63 +Reload 1202280 9907 63 +Offload 1204800 9520 36 +Offload 1206240 9770 4 +Reload 1206400 9590 40 +Visit 1208000 212 +Visit 1208000 211 +Visit 1208000 210 +Offload 1208000 9774 52 +Offload 1210080 10087 41 +Reload 1211720 10361 93 +Offload 1215440 9590 40 +Offload 1217040 9907 30 +Reload 1218240 10044 70 +Offload 1221040 9937 33 +Offload 1222360 10128 14 +Reload 1222920 9727 47 +Visit 1224800 215 +Visit 1224800 214 +Visit 1224800 213 +Offload 1224800 10142 24 +Offload 1225760 10224 76 +Reload 1228800 10498 100 +Offload 1232800 9727 47 +Offload 1234680 10044 30 +Reload 1235880 10181 77 +Offload 1238960 10074 40 +Offload 1240560 10300 10 +Offload 1240960 10361 4 +Reload 1241120 9864 54 +Visit 1243280 218 +Visit 1243280 217 +Visit 1243280 216 +Offload 1243280 10365 89 +Offload 1246840 9864 18 +Reload 1247560 10635 107 +Offload 1251840 9882 36 +Offload 1253280 10181 48 +Reload 1255200 10318 84 +Offload 1258560 10229 29 +Offload 1259720 10498 32 +Reload 1261000 10001 61 +Visit 1263440 221 +Visit 1263440 220 +Visit 1263440 219 +Offload 1263440 10530 44 +Reload 1265200 10772 44 +Offload 1266960 10001 61 +Offload 1269400 10318 30 +Reload 1270600 10455 91 +Offload 1274240 10348 54 +Offload 1276400 10574 14 +Reload 1276960 10138 68 +Visit 1279680 224 +Visit 1279680 223 +Visit 1279680 222 +Offload 1279680 10588 10 +Offload 1280080 10635 41 +Reload 1281720 10909 51 +Offload 1283760 10138 68 +Offload 1286480 10455 16 +Reload 1287120 10592 84 +Offload 1290480 10471 75 +Reload 1293480 10275 75 +Visit 1296480 227 +Visit 1296480 226 +Visit 1296480 225 +Offload 1296480 10690 52 +Offload 1298560 10772 6 +Reload 1298800 11046 58 +Offload 1301120 10275 67 +Reload 1303800 10729 49 +Reload 1305760 10816 18 +Offload 1306480 10342 8 +Offload 1306800 10592 74 +Reload 1309760 10412 82 +Visit 1313040 230 +Visit 1313040 229 +Visit 1313040 228 +Offload 1313040 10666 24 +Offload 1314000 10909 41 +Reload 1315640 11183 65 +Offload 1318240 10412 42 +Reload 1319920 10866 42 +Offload 1321600 10454 40 +Offload 1323200 10729 49 +Reload 1325160 10549 89 +Visit 1328720 233 +Visit 1328720 232 +Visit 1328720 231 +Offload 1328720 10778 56 +Offload 1330960 10950 10 +Offload 1331360 11046 6 +Reload 1331600 11320 72 +Offload 1334480 10549 49 +Reload 1336440 11003 49 +Offload 1338400 10598 40 +Offload 1340000 10866 42 +Offload 1341680 11052 14 +Reload 1342240 10686 96 +Visit 1346080 236 +Visit 1346080 235 +Visit 1346080 234 +Offload 1346080 11066 38 +Offload 1347600 11183 41 +Reload 1349240 11457 79 +Offload 1352400 10686 56 +Reload 1354640 11140 56 +Offload 1356880 10742 40 +Offload 1358480 11003 49 +Offload 1360440 11224 14 +Reload 1361000 10823 103 +Visit 1365120 239 +Visit 1365120 238 +Visit 1365120 237 +Offload 1365120 11238 10 +Offload 1365520 11320 72 +Offload 1368400 10823 4 +Reload 1368560 11594 86 +Offload 1372000 10827 63 +Reload 1374520 11277 63 +Offload 1377040 10890 36 +Offload 1378480 11140 4 +Reload 1378640 10960 40 +Visit 1380240 242 +Visit 1380240 241 +Visit 1380240 240 +Offload 1380240 11144 52 +Offload 1382320 11457 41 +Reload 1383960 11731 93 +Offload 1387680 10960 40 +Offload 1389280 11277 30 +Reload 1390480 11414 70 +Offload 1393280 11307 33 +Offload 1394600 11498 14 +Reload 1395160 11097 47 +Visit 1397040 245 +Visit 1397040 244 +Visit 1397040 243 +Offload 1397040 11512 24 +Offload 1398000 11594 76 +Reload 1401040 11868 100 +Offload 1405040 11097 47 +Offload 1406920 11414 30 +Reload 1408120 11551 77 +Offload 1411200 11444 40 +Offload 1412800 11670 10 +Offload 1413200 11731 4 +Reload 1413360 11234 54 +Visit 1415520 248 +Visit 1415520 247 +Visit 1415520 246 +Offload 1415520 11735 89 +Offload 1419080 11234 18 +Reload 1419800 12005 107 +Offload 1424080 11252 36 +Offload 1425520 11551 48 +Reload 1427440 11688 84 +Offload 1430800 11599 29 +Offload 1431960 11868 32 +Reload 1433240 11371 61 +Visit 1435680 251 +Visit 1435680 250 +Visit 1435680 249 +Offload 1435680 11900 44 +Reload 1437440 12142 44 +Offload 1439200 11371 61 +Offload 1441640 11688 30 +Reload 1442840 11825 91 +Offload 1446480 11718 54 +Offload 1448640 11944 14 +Reload 1449200 11508 68 +Visit 1451920 254 +Visit 1451920 253 +Visit 1451920 252 +Offload 1451920 11958 10 +Offload 1452320 12005 41 +Reload 1453960 12279 51 +Offload 1456000 11508 68 +Offload 1458720 11825 16 +Reload 1459360 11962 84 +Offload 1462720 11841 75 +Reload 1465720 11645 75 +Visit 1468720 257 +Visit 1468720 256 +Visit 1468720 255 +Offload 1468720 12060 52 +Offload 1470800 12142 6 +Reload 1471040 12416 58 +Offload 1473360 11645 67 +Reload 1476040 12099 49 +Reload 1478000 12186 18 +Offload 1478720 11712 8 +Offload 1479040 11962 74 +Reload 1482000 11782 82 +Visit 1485280 260 +Visit 1485280 259 +Visit 1485280 258 +Offload 1485280 12036 24 +Offload 1486240 12279 41 +Reload 1487880 12553 65 +Offload 1490480 11782 42 +Reload 1492160 12236 42 +Offload 1493840 11824 40 +Offload 1495440 12099 49 +Reload 1497400 11919 89 +Visit 1500960 263 +Visit 1500960 262 +Visit 1500960 261 +Offload 1500960 12148 56 +Offload 1503200 12320 10 +Offload 1503600 12416 6 +Reload 1503840 12690 72 +Offload 1506720 11919 49 +Reload 1508680 12373 49 +Offload 1510640 11968 40 +Offload 1512240 12236 42 +Offload 1513920 12422 14 +Reload 1514480 12056 96 +Visit 1518320 266 +Visit 1518320 265 +Visit 1518320 264 +Offload 1518320 12436 38 +Offload 1519840 12553 41 +Reload 1521480 12827 79 +Offload 1524640 12056 56 +Reload 1526880 12510 56 +Offload 1529120 12112 40 +Offload 1530720 12373 49 +Offload 1532680 12594 14 +Reload 1533240 12193 103 +Visit 1537360 269 +Visit 1537360 268 +Visit 1537360 267 +Offload 1537360 12608 10 +Offload 1537760 12690 72 +Offload 1540640 12193 4 +Reload 1540800 12964 86 +Offload 1544240 12197 63 +Reload 1546760 12647 63 +Offload 1549280 12260 36 +Offload 1550720 12510 4 +Reload 1550880 12330 40 +Visit 1552480 272 +Visit 1552480 271 +Visit 1552480 270 +Offload 1552480 12514 52 +Offload 1554560 12827 41 +Reload 1556200 13101 93 +Offload 1559920 12330 40 +Offload 1561520 12647 30 +Reload 1562720 12784 70 +Offload 1565520 12677 33 +Offload 1566840 12868 14 +Reload 1567400 12467 47 +Visit 1569280 275 +Visit 1569280 274 +Visit 1569280 273 +Offload 1569280 12882 24 +Offload 1570240 12964 76 +Reload 1573280 13238 100 +Offload 1577280 12467 47 +Offload 1579160 12784 30 +Reload 1580360 12921 77 +Offload 1583440 12814 40 +Offload 1585040 13040 10 +Offload 1585440 13101 4 +Reload 1585600 12604 54 +Visit 1587760 278 +Visit 1587760 277 +Visit 1587760 276 +Offload 1587760 13105 89 +Offload 1591320 12604 18 +Reload 1592040 13375 107 +Offload 1596320 12622 36 +Offload 1597760 12921 48 +Reload 1599680 13058 84 +Offload 1603040 12969 29 +Offload 1604200 13238 32 +Reload 1605480 12741 61 +Visit 1607920 281 +Visit 1607920 280 +Visit 1607920 279 +Offload 1607920 13270 44 +Reload 1609680 13512 44 +Offload 1611440 12741 61 +Offload 1613880 13058 30 +Reload 1615080 13195 91 +Offload 1618720 13088 54 +Offload 1620880 13314 14 +Reload 1621440 12878 68 +Visit 1624160 284 +Visit 1624160 283 +Visit 1624160 282 +Offload 1624160 13328 10 +Offload 1624560 13375 41 +Reload 1626200 13649 51 +Offload 1628240 12878 68 +Offload 1630960 13195 16 +Reload 1631600 13332 84 +Offload 1634960 13211 75 +Reload 1637960 13015 75 +Visit 1640960 287 +Visit 1640960 286 +Visit 1640960 285 +Offload 1640960 13430 52 +Offload 1643040 13512 6 +Reload 1643280 13786 58 +Offload 1645600 13015 67 +Reload 1648280 13469 49 +Reload 1650240 13556 18 +Offload 1650960 13082 8 +Offload 1651280 13332 74 +Reload 1654240 13152 82 +Visit 1657520 290 +Visit 1657520 289 +Visit 1657520 288 +Offload 1657520 13406 24 +Offload 1658480 13649 41 +Reload 1660120 13923 65 +Offload 1662720 13152 42 +Reload 1664400 13606 42 +Offload 1666080 13194 40 +Offload 1667680 13469 49 +Reload 1669640 13289 89 +Visit 1673200 293 +Visit 1673200 292 +Visit 1673200 291 +Offload 1673200 13518 56 +Offload 1675440 13690 10 +Offload 1675840 13786 6 +Reload 1676080 14060 72 +Offload 1678960 13289 49 +Reload 1680920 13743 49 +Offload 1682880 13338 40 +Offload 1684480 13606 42 +Offload 1686160 13792 14 +Reload 1686720 13426 96 +Visit 1690560 296 +Visit 1690560 295 +Visit 1690560 294 +Offload 1690560 13806 38 +Offload 1692080 13923 41 +Reload 1693720 14197 79 +Offload 1696880 13426 56 +Reload 1699120 13880 56 +Offload 1701360 13482 40 +Offload 1702960 13743 49 +Offload 1704920 13964 14 +Reload 1705480 13563 103 +Visit 1709600 299 +Visit 1709600 298 +Visit 1709600 297 +Offload 1709600 13978 10 +Offload 1710000 14060 72 +Offload 1712880 13563 4 +Reload 1713040 14334 86 +Offload 1716480 13567 63 +Reload 1719000 14017 63 +Offload 1721520 13630 36 +Offload 1722960 13880 4 +Reload 1723120 13700 40 +Visit 1724720 302 +Visit 1724720 301 +Visit 1724720 300 +Offload 1724720 13884 52 +Offload 1726800 14197 41 +Reload 1728440 14471 93 +Offload 1732160 13700 40 +Offload 1733760 14017 30 +Reload 1734960 14154 70 +Offload 1737760 14047 33 +Offload 1739080 14238 14 +Reload 1739640 13837 47 +Visit 1741520 305 +Visit 1741520 304 +Visit 1741520 303 +Offload 1741520 14252 24 +Offload 1742480 14334 76 +Reload 1745520 14608 100 +Offload 1749520 13837 47 +Offload 1751400 14154 30 +Reload 1752600 14291 77 +Offload 1755680 14184 40 +Offload 1757280 14410 10 +Offload 1757680 14471 4 +Reload 1757840 13974 54 +Visit 1760000 308 +Visit 1760000 307 +Visit 1760000 306 +Offload 1760000 14475 89 +Offload 1763560 13974 18 +Reload 1764280 14745 107 +Offload 1768560 13992 36 +Offload 1770000 14291 48 +Reload 1771920 14428 84 +Offload 1775280 14339 29 +Offload 1776440 14608 32 +Reload 1777720 14111 61 +Visit 1780160 311 +Visit 1780160 310 +Visit 1780160 309 +Offload 1780160 14640 44 +Reload 1781920 14882 44 +Offload 1783680 14111 61 +Offload 1786120 14428 30 +Reload 1787320 14565 91 +Offload 1790960 14458 54 +Offload 1793120 14684 14 +Reload 1793680 14248 68 +Visit 1796400 314 +Visit 1796400 313 +Visit 1796400 312 +Offload 1796400 14698 10 +Offload 1796800 14745 41 +Reload 1798440 15019 51 +Offload 1800480 14248 68 +Offload 1803200 14565 16 +Reload 1803840 14702 84 +Offload 1807200 14581 75 +Reload 1810200 14385 75 +Visit 1813200 317 +Visit 1813200 316 +Visit 1813200 315 +Offload 1813200 14800 52 +Offload 1815280 14882 6 +Reload 1815520 15156 58 +Offload 1817840 14385 67 +Reload 1820520 14839 49 +Reload 1822480 14926 18 +Offload 1823200 14452 8 +Offload 1823520 14702 74 +Reload 1826480 14522 82 +Visit 1829760 320 +Visit 1829760 319 +Visit 1829760 318 +Offload 1829760 14776 24 +Offload 1830720 15019 41 +Reload 1832360 15293 65 +Offload 1834960 14522 42 +Reload 1836640 14976 42 +Offload 1838320 14564 40 +Offload 1839920 14839 49 +Reload 1841880 14659 89 +Visit 1845440 323 +Visit 1845440 322 +Visit 1845440 321 +Offload 1845440 14888 56 +Offload 1847680 15060 10 +Offload 1848080 15156 6 +Reload 1848320 15430 72 +Offload 1851200 14659 49 +Reload 1853160 15113 49 +Offload 1855120 14708 40 +Offload 1856720 14976 42 +Offload 1858400 15162 14 +Reload 1858960 14796 96 +Visit 1862800 326 +Visit 1862800 325 +Visit 1862800 324 +Offload 1862800 15176 38 +Offload 1864320 15293 41 +Reload 1865960 15567 79 +Offload 1869120 14796 56 +Reload 1871360 15250 56 +Offload 1873600 14852 40 +Offload 1875200 15113 49 +Offload 1877160 15334 14 +Reload 1877720 14933 103 +Visit 1881840 329 +Visit 1881840 328 +Visit 1881840 327 +Offload 1881840 15348 10 +Offload 1882240 15430 72 +Offload 1885120 14933 4 +Reload 1885280 15704 86 +Offload 1888720 14937 63 +Reload 1891240 15387 63 +Offload 1893760 15000 36 +Offload 1895200 15250 4 +Reload 1895360 15070 40 +Visit 1896960 332 +Visit 1896960 331 +Visit 1896960 330 +Offload 1896960 15254 52 +Offload 1899040 15567 41 +Reload 1900680 15841 93 +Offload 1904400 15070 40 +Offload 1906000 15387 30 +Reload 1907200 15524 70 +Offload 1910000 15417 33 +Offload 1911320 15608 14 +Reload 1911880 15207 47 +Visit 1913760 335 +Visit 1913760 334 +Visit 1913760 333 +Offload 1913760 15622 24 +Offload 1914720 15704 76 +Reload 1917760 15978 100 +Offload 1921760 15207 47 +Offload 1923640 15524 30 +Reload 1924840 15661 77 +Offload 1927920 15554 40 +Offload 1929520 15780 10 +Offload 1929920 15841 4 +Reload 1930080 15344 54 +Visit 1932240 338 +Visit 1932240 337 +Visit 1932240 336 +Offload 1932240 15845 89 +Offload 1935800 15344 18 +Reload 1936520 16115 107 +Offload 1940800 15362 36 +Offload 1942240 15661 48 +Reload 1944160 15798 84 +Offload 1947520 15709 29 +Offload 1948680 15978 32 +Reload 1949960 15481 61 +Visit 1952400 341 +Visit 1952400 340 +Visit 1952400 339 +Offload 1952400 16010 44 +Reload 1954160 16252 44 +Offload 1955920 15481 61 +Offload 1958360 15798 30 +Reload 1959560 15935 91 +Offload 1963200 15828 54 +Offload 1965360 16054 14 +Reload 1965920 15618 68 +Visit 1968640 344 +Visit 1968640 343 +Visit 1968640 342 +Offload 1968640 16068 10 +Offload 1969040 16115 41 +Reload 1970680 16389 51 +Offload 1972720 15618 68 +Offload 1975440 15935 16 +Reload 1976080 16072 84 +Offload 1979440 15951 75 +Reload 1982440 15755 75 +Visit 1985440 347 +Visit 1985440 346 +Visit 1985440 345 +Offload 1985440 16170 52 +Offload 1987520 16252 6 +Reload 1987760 16526 58 +Offload 1990080 15755 67 +Reload 1992760 16209 49 +Reload 1994720 16296 18 +Offload 1995440 15822 8 +Offload 1995760 16072 74 +Reload 1998720 15892 82 +Visit 2002000 350 +Visit 2002000 349 +Visit 2002000 348 +Offload 2002000 16146 24 +Offload 2002960 16389 41 +Reload 2004600 16663 65 +Offload 2007200 15892 42 +Reload 2008880 16346 42 +Offload 2010560 15934 40 +Offload 2012160 16209 49 +Reload 2014120 16029 89 +Visit 2017680 353 +Visit 2017680 352 +Visit 2017680 351 +Offload 2017680 16258 56 +Offload 2019920 16430 10 +Offload 2020320 16526 6 +Reload 2020560 16800 72 +Offload 2023440 16029 49 +Reload 2025400 16483 49 +Offload 2027360 16078 40 +Offload 2028960 16346 42 +Offload 2030640 16532 14 +Reload 2031200 16166 96 +Visit 2035040 356 +Visit 2035040 355 +Visit 2035040 354 +Offload 2035040 16546 38 +Offload 2036560 16663 41 +Reload 2038200 16937 79 +Offload 2041360 16166 56 +Reload 2043600 16620 56 +Offload 2045840 16222 40 +Offload 2047440 16483 49 +Offload 2049400 16704 14 +Reload 2049960 16303 103 +Visit 2054080 359 +Visit 2054080 358 +Visit 2054080 357 +Offload 2054080 16718 10 +Offload 2054480 16800 72 +Offload 2057360 16303 4 +Reload 2057520 17074 86 +Offload 2060960 16307 63 +Reload 2063480 16757 63 +Offload 2066000 16370 36 +Offload 2067440 16620 4 +Reload 2067600 16440 40 +Visit 2069200 362 +Visit 2069200 361 +Visit 2069200 360 +Offload 2069200 16624 52 +Offload 2071280 16937 41 +Reload 2072920 17211 93 +Offload 2076640 16440 40 +Offload 2078240 16757 30 +Reload 2079440 16894 70 +Offload 2082240 16787 33 +Offload 2083560 16978 14 +Reload 2084120 16577 47 +Visit 2086000 365 +Visit 2086000 364 +Visit 2086000 363 +Offload 2086000 16992 24 +Offload 2086960 17074 76 +Reload 2090000 17348 100 +Offload 2094000 16577 47 +Offload 2095880 16894 30 +Reload 2097080 17031 77 +Offload 2100160 16924 40 +Offload 2101760 17150 10 +Offload 2102160 17211 4 +Reload 2102320 16714 54 +Visit 2104480 368 +Visit 2104480 367 +Visit 2104480 366 +Offload 2104480 17215 89 +Offload 2108040 16714 18 +Reload 2108760 17485 107 +Offload 2113040 16732 36 +Offload 2114480 17031 48 +Reload 2116400 17168 84 +Offload 2119760 17079 29 +Offload 2120920 17348 32 +Reload 2122200 16851 61 +Visit 2124640 371 +Visit 2124640 370 +Visit 2124640 369 +Offload 2124640 17380 44 +Reload 2126400 17622 44 +Offload 2128160 16851 61 +Offload 2130600 17168 30 +Reload 2131800 17305 91 +Offload 2135440 17198 54 +Offload 2137600 17424 14 +Reload 2138160 16988 68 +Visit 2140880 374 +Visit 2140880 373 +Visit 2140880 372 +Offload 2140880 17438 10 +Offload 2141280 17485 41 +Reload 2142920 17759 51 +Offload 2144960 16988 68 +Offload 2147680 17305 16 +Reload 2148320 17442 84 +Offload 2151680 17321 75 +Reload 2154680 17125 75 +Visit 2157680 377 +Visit 2157680 376 +Visit 2157680 375 +Offload 2157680 17540 52 +Offload 2159760 17622 6 +Reload 2160000 17896 58 +Offload 2162320 17125 67 +Reload 2165000 17579 49 +Reload 2166960 17666 18 +Offload 2167680 17192 8 +Offload 2168000 17442 74 +Reload 2170960 17262 82 +Visit 2174240 380 +Visit 2174240 379 +Visit 2174240 378 +Offload 2174240 17516 24 +Offload 2175200 17759 41 +Reload 2176840 18033 65 +Offload 2179440 17262 42 +Reload 2181120 17716 42 +Offload 2182800 17304 40 +Offload 2184400 17579 49 +Reload 2186360 17399 89 +Visit 2189920 383 +Visit 2189920 382 +Visit 2189920 381 +Offload 2189920 17628 56 +Offload 2192160 17800 10 +Offload 2192560 17896 6 +Reload 2192800 18170 72 +Offload 2195680 17399 49 +Reload 2197640 17853 49 +Offload 2199600 17448 40 +Offload 2201200 17716 42 +Offload 2202880 17902 14 +Reload 2203440 17536 96 +Visit 2207280 386 +Visit 2207280 385 +Visit 2207280 384 +Offload 2207280 17916 38 +Offload 2208800 18033 41 +Reload 2210440 18307 79 +Offload 2213600 17536 56 +Reload 2215840 17990 56 +Offload 2218080 17592 40 +Offload 2219680 17853 49 +Offload 2221640 18074 14 +Reload 2222200 17673 103 +Visit 2226320 389 +Visit 2226320 388 +Visit 2226320 387 +Offload 2226320 18088 10 +Offload 2226720 18170 72 +Offload 2229600 17673 4 +Reload 2229760 18444 86 +Offload 2233200 17677 63 +Reload 2235720 18127 63 +Offload 2238240 17740 36 +Offload 2239680 17990 4 +Reload 2239840 17810 40 +Visit 2241440 392 +Visit 2241440 391 +Visit 2241440 390 +Offload 2241440 17994 52 +Offload 2243520 18307 41 +Reload 2245160 18581 93 +Offload 2248880 17810 40 +Offload 2250480 18127 30 +Reload 2251680 18264 70 +Offload 2254480 18157 33 +Offload 2255800 18348 14 +Reload 2256360 17947 47 +Visit 2258240 395 +Visit 2258240 394 +Visit 2258240 393 +Offload 2258240 18362 24 +Offload 2259200 18444 76 +Reload 2262240 18718 100 +Offload 2266240 17947 47 +Offload 2268120 18264 30 +Reload 2269320 18401 77 +Offload 2272400 18294 40 +Offload 2274000 18520 10 +Offload 2274400 18581 4 +Reload 2274560 18084 54 +Visit 2276720 398 +Visit 2276720 397 +Visit 2276720 396 +Offload 2276720 18585 89 +Offload 2280280 18084 18 +Reload 2281000 18855 107 +Offload 2285280 18102 36 +Offload 2286720 18401 48 +Reload 2288640 18538 84 +Offload 2292000 18449 29 +Offload 2293160 18718 32 +Reload 2294440 18221 61 +Visit 2296880 401 +Visit 2296880 400 +Visit 2296880 399 +Offload 2296880 18750 44 +Reload 2298640 18992 44 +Offload 2300400 18221 61 +Offload 2302840 18538 30 +Reload 2304040 18675 91 +Offload 2307680 18568 54 +Offload 2309840 18794 14 +Reload 2310400 18358 68 +Visit 2313120 404 +Visit 2313120 403 +Visit 2313120 402 +Offload 2313120 18808 10 +Offload 2313520 18855 41 +Reload 2315160 19129 51 +Offload 2317200 18358 68 +Offload 2319920 18675 16 +Reload 2320560 18812 84 +Offload 2323920 18691 75 +Reload 2326920 18495 75 +Visit 2329920 407 +Visit 2329920 406 +Visit 2329920 405 +Offload 2329920 18910 52 +Offload 2332000 18992 6 +Reload 2332240 19266 58 +Offload 2334560 18495 67 +Reload 2337240 18949 49 +Reload 2339200 19036 18 +Offload 2339920 18562 8 +Offload 2340240 18812 74 +Reload 2343200 18632 82 +Visit 2346480 410 +Visit 2346480 409 +Visit 2346480 408 +Offload 2346480 18886 24 +Offload 2347440 19129 41 +Reload 2349080 19403 65 +Offload 2351680 18632 42 +Reload 2353360 19086 42 +Offload 2355040 18674 40 +Offload 2356640 18949 49 +Reload 2358600 18769 89 +Visit 2362160 413 +Visit 2362160 412 +Visit 2362160 411 +Offload 2362160 18998 56 +Offload 2364400 19170 10 +Offload 2364800 19266 6 +Reload 2365040 19540 72 +Offload 2367920 18769 49 +Reload 2369880 19223 49 +Offload 2371840 18818 40 +Offload 2373440 19086 42 +Offload 2375120 19272 14 +Reload 2375680 18906 96 +Visit 2379520 416 +Visit 2379520 415 +Visit 2379520 414 +Offload 2379520 19286 38 +Offload 2381040 19403 41 +Reload 2382680 19677 79 +Offload 2385840 18906 56 +Reload 2388080 19360 56 +Offload 2390320 18962 40 +Offload 2391920 19223 49 +Offload 2393880 19444 14 +Reload 2394440 19043 103 +Visit 2398560 419 +Visit 2398560 418 +Visit 2398560 417 +Offload 2398560 19458 10 +Offload 2398960 19560 33 +Reload 2400280 19497 43 +Offload 2402000 19043 40 +Reload 2403600 19180 40 +Offload 2405200 19083 63 +Offload 2407720 19360 23 +Reload 2408640 14 86 +Visit 2412080 421 +Visit 2412080 420 +Visit 2412080 422 +Offload 2412080 19383 33 +Offload 2413400 19593 10 +Reload 2413800 19634 43 +Offload 2415520 14 47 +Reload 2417400 19317 47 +Offload 2419280 61 39 +Offload 2420840 19180 40 +Offload 2422440 19497 14 +Reload 2423000 151 93 +Visit 2426720 424 +Visit 2426720 423 +Visit 2426720 425 +Offload 2426720 19511 49 +Offload 2428680 19603 9 +Offload 2429040 19704 19 +Reload 2429800 19771 77 +Offload 2432880 151 54 +Reload 2435040 19454 54 +Offload 2437200 205 39 +Offload 2438760 19317 47 +Offload 2440640 19634 14 +Reload 2441200 288 100 +Visit 2445200 427 +Visit 2445200 426 +Visit 2445200 428 +Offload 2445200 19652 52 +Offload 2447280 19723 5 +Reload 2447480 19591 57 +Offload 2449760 288 100 +Offload 2453760 19454 7 +Reload 2454040 425 107 +Offload 2458320 19461 47 +Offload 2460200 19728 28 +Offload 2461320 19771 9 +Reload 2461680 108 84 +Visit 2465040 429 +Visit 2465040 431 +Visit 2465040 430 +Offload 2465040 19796 52 +Reload 2467120 19728 52 +Offload 2469200 108 44 +Reload 2470960 562 44 +Offload 2472720 152 40 +Offload 2474320 425 51 +Reload 2476360 245 91 +Visit 2480000 432 +Visit 2480000 434 +Visit 2480000 433 +Offload 2480000 476 51 +Reload 2482040 699 51 +Offload 2484080 245 91 +Offload 2487720 527 5 +Offload 2487920 562 2 +Reload 2488000 382 98 +Offload 2491920 564 42 +Offload 2493600 19591 33 +Reload 2494920 65 75 +Visit 2497920 437 +Visit 2497920 436 +Visit 2497920 435 +Offload 2497920 19624 28 +Offload 2499040 19728 30 +Reload 2500240 836 58 +Offload 2502560 65 75 +Offload 2505560 382 30 +Reload 2506760 519 105 +Offload 2510960 412 68 +Offload 2513680 699 14 +Reload 2514240 202 82 +Visit 2517520 440 +Visit 2517520 439 +Visit 2517520 438 +Offload 2517520 713 37 +Offload 2519000 19758 28 +Reload 2520120 973 65 +Offload 2522720 202 42 +Reload 2524400 656 42 +Offload 2526080 244 40 +Offload 2527680 519 49 +Reload 2529640 339 89 +Visit 2533200 443 +Visit 2533200 442 +Visit 2533200 441 +Offload 2533200 568 56 +Offload 2535440 836 16 +Reload 2536080 1110 72 +Offload 2538960 339 49 +Reload 2540920 793 49 +Offload 2542880 388 40 +Offload 2544480 656 42 +Offload 2546160 852 14 +Reload 2546720 476 96 +Visit 2550560 446 +Visit 2550560 445 +Visit 2550560 444 +Offload 2550560 866 28 +Offload 2551680 973 51 +Reload 2553720 1247 79 +Offload 2556880 476 56 +Reload 2559120 930 56 +Offload 2561360 532 40 +Offload 2562960 793 49 +Offload 2564920 1024 14 +Reload 2565480 613 103 +Visit 2569600 449 +Visit 2569600 448 +Visit 2569600 447 +Offload 2569600 1110 72 +Offload 2572480 19786 10 +Offload 2572880 613 4 +Reload 2573040 1384 86 +Offload 2576480 617 63 +Reload 2579000 1067 63 +Offload 2581520 680 36 +Offload 2582960 930 4 +Reload 2583120 750 40 +Visit 2584720 452 +Visit 2584720 451 +Visit 2584720 450 +Offload 2584720 934 52 +Offload 2586800 1247 41 +Reload 2588440 1521 93 +Offload 2592160 750 40 +Offload 2593760 1067 30 +Reload 2594960 1204 70 +Offload 2597760 1097 33 +Offload 2599080 1288 14 +Reload 2599640 887 47 +Visit 2601520 455 +Visit 2601520 454 +Visit 2601520 453 +Offload 2601520 1302 24 +Offload 2602480 1384 76 +Reload 2605520 1658 100 +Offload 2609520 887 47 +Offload 2611400 1204 30 +Reload 2612600 1341 77 +Offload 2615680 1234 40 +Offload 2617280 1460 10 +Offload 2617680 1521 4 +Reload 2617840 1024 54 +Visit 2620000 458 +Visit 2620000 457 +Visit 2620000 456 +Offload 2620000 1525 89 +Offload 2623560 1024 18 +Reload 2624280 1795 107 +Offload 2628560 1042 36 +Offload 2630000 1341 48 +Reload 2631920 1478 84 +Offload 2635280 1389 29 +Offload 2636440 1658 32 +Reload 2637720 1161 61 +Visit 2640160 461 +Visit 2640160 460 +Visit 2640160 459 +Offload 2640160 1690 44 +Reload 2641920 1932 44 +Offload 2643680 1161 61 +Offload 2646120 1478 30 +Reload 2647320 1615 91 +Offload 2650960 1508 54 +Offload 2653120 1734 14 +Reload 2653680 1298 68 +Visit 2656400 464 +Visit 2656400 463 +Visit 2656400 462 +Offload 2656400 1748 10 +Offload 2656800 1795 41 +Reload 2658440 2069 51 +Offload 2660480 1298 68 +Offload 2663200 1615 16 +Reload 2663840 1752 84 +Offload 2667200 1631 75 +Reload 2670200 1435 75 +Visit 2673200 467 +Visit 2673200 466 +Visit 2673200 465 +Offload 2673200 1850 52 +Offload 2675280 1932 6 +Reload 2675520 2206 58 +Offload 2677840 1435 67 +Reload 2680520 1889 49 +Reload 2682480 1976 18 +Offload 2683200 1502 8 +Offload 2683520 1752 74 +Reload 2686480 1572 82 +Visit 2689760 470 +Visit 2689760 469 +Visit 2689760 468 +Offload 2689760 1826 24 +Offload 2690720 2069 41 +Reload 2692360 2343 65 +Offload 2694960 1572 42 +Reload 2696640 2026 42 +Offload 2698320 1614 40 +Offload 2699920 1889 49 +Reload 2701880 1709 89 +Visit 2705440 473 +Visit 2705440 472 +Visit 2705440 471 +Offload 2705440 1938 56 +Offload 2707680 2110 10 +Offload 2708080 2206 6 +Reload 2708320 2480 72 +Offload 2711200 1709 49 +Reload 2713160 2163 49 +Offload 2715120 1758 40 +Offload 2716720 2026 42 +Offload 2718400 2212 14 +Reload 2718960 1846 96 +Visit 2722800 476 +Visit 2722800 475 +Visit 2722800 474 +Offload 2722800 2226 38 +Offload 2724320 2343 41 +Reload 2725960 2617 79 +Offload 2729120 1846 56 +Reload 2731360 2300 56 +Offload 2733600 1902 40 +Offload 2735200 2163 49 +Offload 2737160 2384 14 +Reload 2737720 1983 103 +Visit 2741840 479 +Visit 2741840 478 +Visit 2741840 477 +Offload 2741840 2398 10 +Offload 2742240 2480 72 +Offload 2745120 1983 4 +Reload 2745280 2754 86 +Offload 2748720 1987 63 +Reload 2751240 2437 63 +Offload 2753760 2050 36 +Offload 2755200 2300 4 +Reload 2755360 2120 40 +Visit 2756960 482 +Visit 2756960 481 +Visit 2756960 480 +Offload 2756960 2304 52 +Offload 2759040 2617 41 +Reload 2760680 2891 93 +Offload 2764400 2120 40 +Offload 2766000 2437 30 +Reload 2767200 2574 70 +Offload 2770000 2467 33 +Offload 2771320 2658 14 +Reload 2771880 2257 47 +Visit 2773760 485 +Visit 2773760 484 +Visit 2773760 483 +Offload 2773760 2672 24 +Offload 2774720 2754 76 +Reload 2777760 3028 100 +Offload 2781760 2257 47 +Offload 2783640 2574 30 +Reload 2784840 2711 77 +Offload 2787920 2604 40 +Offload 2789520 2830 10 +Offload 2789920 2891 4 +Reload 2790080 2394 54 +Visit 2792240 488 +Visit 2792240 487 +Visit 2792240 486 +Offload 2792240 2895 89 +Offload 2795800 2394 18 +Reload 2796520 3165 107 +Offload 2800800 2412 36 +Offload 2802240 2711 48 +Reload 2804160 2848 84 +Offload 2807520 2759 29 +Offload 2808680 3028 32 +Reload 2809960 2531 61 +Visit 2812400 491 +Visit 2812400 490 +Visit 2812400 489 +Offload 2812400 3060 44 +Reload 2814160 3302 44 +Offload 2815920 2531 61 +Offload 2818360 2848 30 +Reload 2819560 2985 91 +Offload 2823200 2878 54 +Offload 2825360 3104 14 +Reload 2825920 2668 68 +Visit 2828640 494 +Visit 2828640 493 +Visit 2828640 492 +Offload 2828640 3118 10 +Offload 2829040 3165 41 +Reload 2830680 3439 51 +Offload 2832720 2668 68 +Offload 2835440 2985 16 +Reload 2836080 3122 84 +Offload 2839440 3001 75 +Reload 2842440 2805 75 +Visit 2845440 497 +Visit 2845440 496 +Visit 2845440 495 +Offload 2845440 3220 52 +Offload 2847520 3302 6 +Reload 2847760 3576 58 +Offload 2850080 2805 67 +Reload 2852760 3259 49 +Reload 2854720 3346 18 +Offload 2855440 2872 8 +Offload 2855760 3122 74 +Reload 2858720 2942 82 +Visit 2862000 500 +Visit 2862000 499 +Visit 2862000 498 +Offload 2862000 3196 24 +Offload 2862960 3439 41 +Reload 2864600 3713 65 +Offload 2867200 2942 42 +Reload 2868880 3396 42 +Offload 2870560 2984 40 +Offload 2872160 3259 49 +Reload 2874120 3079 89 +Visit 2877680 503 +Visit 2877680 502 +Visit 2877680 501 +Offload 2877680 3308 56 +Offload 2879920 3480 10 +Offload 2880320 3576 6 +Reload 2880560 3850 72 +Offload 2883440 3079 49 +Reload 2885400 3533 49 +Offload 2887360 3128 40 +Offload 2888960 3396 42 +Offload 2890640 3582 14 +Reload 2891200 3216 96 +Visit 2895040 506 +Visit 2895040 505 +Visit 2895040 504 +Offload 2895040 3596 38 +Offload 2896560 3713 41 +Reload 2898200 3987 79 +Offload 2901360 3216 56 +Reload 2903600 3670 56 +Offload 2905840 3272 40 +Offload 2907440 3533 49 +Offload 2909400 3754 14 +Reload 2909960 3353 103 +Visit 2914080 509 +Visit 2914080 508 +Visit 2914080 507 +Offload 2914080 3768 10 +Offload 2914480 3850 72 +Offload 2917360 3353 4 +Reload 2917520 4124 86 +Offload 2920960 3357 63 +Reload 2923480 3807 63 +Offload 2926000 3420 36 +Offload 2927440 3670 4 +Reload 2927600 3490 40 +Visit 2929200 512 +Visit 2929200 511 +Visit 2929200 510 +Offload 2929200 3674 52 +Offload 2931280 3987 41 +Reload 2932920 4261 93 +Offload 2936640 3490 40 +Offload 2938240 3807 30 +Reload 2939440 3944 70 +Offload 2942240 3837 33 +Offload 2943560 4028 14 +Reload 2944120 3627 47 +Visit 2946000 515 +Visit 2946000 514 +Visit 2946000 513 +Offload 2946000 4042 24 +Offload 2946960 4124 76 +Reload 2950000 4398 100 +Offload 2954000 3627 47 +Offload 2955880 3944 30 +Reload 2957080 4081 77 +Offload 2960160 3974 40 +Offload 2961760 4200 10 +Offload 2962160 4261 4 +Reload 2962320 3764 54 +Visit 2964480 518 +Visit 2964480 517 +Visit 2964480 516 +Offload 2964480 4265 89 +Offload 2968040 3764 18 +Reload 2968760 4535 107 +Offload 2973040 3782 36 +Offload 2974480 4081 48 +Reload 2976400 4218 84 +Offload 2979760 4129 29 +Offload 2980920 4398 32 +Reload 2982200 3901 61 +Visit 2984640 521 +Visit 2984640 520 +Visit 2984640 519 +Offload 2984640 4430 44 +Reload 2986400 4672 44 +Offload 2988160 3901 61 +Offload 2990600 4218 30 +Reload 2991800 4355 91 +Offload 2995440 4248 54 +Offload 2997600 4474 14 +Reload 2998160 4038 68 +Visit 3000880 524 +Visit 3000880 523 +Visit 3000880 522 +Offload 3000880 4488 10 +Offload 3001280 4535 41 +Reload 3002920 4809 51 +Offload 3004960 4038 68 +Offload 3007680 4355 16 +Reload 3008320 4492 84 +Offload 3011680 4371 75 +Reload 3014680 4175 75 +Visit 3017680 527 +Visit 3017680 526 +Visit 3017680 525 +Offload 3017680 4590 52 +Offload 3019760 4672 6 +Reload 3020000 4946 58 +Offload 3022320 4175 67 +Reload 3025000 4629 49 +Reload 3026960 4716 18 +Offload 3027680 4242 8 +Offload 3028000 4492 74 +Reload 3030960 4312 82 +Visit 3034240 530 +Visit 3034240 529 +Visit 3034240 528 +Offload 3034240 4566 24 +Offload 3035200 4809 41 +Reload 3036840 5083 65 +Offload 3039440 4312 42 +Reload 3041120 4766 42 +Offload 3042800 4354 40 +Offload 3044400 4629 49 +Reload 3046360 4449 89 +Visit 3049920 533 +Visit 3049920 532 +Visit 3049920 531 +Offload 3049920 4678 56 +Offload 3052160 4850 10 +Offload 3052560 4946 6 +Reload 3052800 5220 72 +Offload 3055680 4449 49 +Reload 3057640 4903 49 +Offload 3059600 4498 40 +Offload 3061200 4766 42 +Offload 3062880 4952 14 +Reload 3063440 4586 96 +Visit 3067280 536 +Visit 3067280 535 +Visit 3067280 534 +Offload 3067280 4966 38 +Offload 3068800 5083 41 +Reload 3070440 5357 79 +Offload 3073600 4586 56 +Reload 3075840 5040 56 +Offload 3078080 4642 40 +Offload 3079680 4903 49 +Offload 3081640 5124 14 +Reload 3082200 4723 103 +Visit 3086320 539 +Visit 3086320 538 +Visit 3086320 537 +Offload 3086320 5138 10 +Offload 3086720 5220 72 +Offload 3089600 4723 4 +Reload 3089760 5494 86 +Offload 3093200 4727 63 +Reload 3095720 5177 63 +Offload 3098240 4790 36 +Offload 3099680 5040 4 +Reload 3099840 4860 40 +Visit 3101440 542 +Visit 3101440 541 +Visit 3101440 540 +Offload 3101440 5044 52 +Offload 3103520 5357 41 +Reload 3105160 5631 93 +Offload 3108880 4860 40 +Offload 3110480 5177 30 +Reload 3111680 5314 70 +Offload 3114480 5207 33 +Offload 3115800 5398 14 +Reload 3116360 4997 47 +Visit 3118240 545 +Visit 3118240 544 +Visit 3118240 543 +Offload 3118240 5412 24 +Offload 3119200 5494 76 +Reload 3122240 5768 100 +Offload 3126240 4997 47 +Offload 3128120 5314 30 +Reload 3129320 5451 77 +Offload 3132400 5344 40 +Offload 3134000 5570 10 +Offload 3134400 5631 4 +Reload 3134560 5134 54 +Visit 3136720 548 +Visit 3136720 547 +Visit 3136720 546 +Offload 3136720 5635 89 +Offload 3140280 5134 18 +Reload 3141000 5905 107 +Offload 3145280 5152 36 +Offload 3146720 5451 48 +Reload 3148640 5588 84 +Offload 3152000 5499 29 +Offload 3153160 5768 32 +Reload 3154440 5271 61 +Visit 3156880 551 +Visit 3156880 550 +Visit 3156880 549 +Offload 3156880 5800 44 +Reload 3158640 6042 44 +Offload 3160400 5271 61 +Offload 3162840 5588 30 +Reload 3164040 5725 91 +Offload 3167680 5618 54 +Offload 3169840 5844 14 +Reload 3170400 5408 68 +Visit 3173120 554 +Visit 3173120 553 +Visit 3173120 552 +Offload 3173120 5858 10 +Offload 3173520 5905 41 +Reload 3175160 6179 51 +Offload 3177200 5408 68 +Offload 3179920 5725 16 +Reload 3180560 5862 84 +Offload 3183920 5741 75 +Reload 3186920 5545 75 +Visit 3189920 557 +Visit 3189920 556 +Visit 3189920 555 +Offload 3189920 5960 52 +Offload 3192000 6042 6 +Reload 3192240 6316 58 +Offload 3194560 5545 67 +Reload 3197240 5999 49 +Reload 3199200 6086 18 +Offload 3199920 5612 8 +Offload 3200240 5862 74 +Reload 3203200 5682 82 +Visit 3206480 560 +Visit 3206480 559 +Visit 3206480 558 +Offload 3206480 5936 24 +Offload 3207440 6179 41 +Reload 3209080 6453 65 +Offload 3211680 5682 42 +Reload 3213360 6136 42 +Offload 3215040 5724 40 +Offload 3216640 5999 49 +Reload 3218600 5819 89 +Visit 3222160 563 +Visit 3222160 562 +Visit 3222160 561 +Offload 3222160 6048 56 +Offload 3224400 6220 10 +Offload 3224800 6316 6 +Reload 3225040 6590 72 +Offload 3227920 5819 49 +Reload 3229880 6273 49 +Offload 3231840 5868 40 +Offload 3233440 6136 42 +Offload 3235120 6322 14 +Reload 3235680 5956 96 +Visit 3239520 566 +Visit 3239520 565 +Visit 3239520 564 +Offload 3239520 6336 38 +Offload 3241040 6453 41 +Reload 3242680 6727 79 +Offload 3245840 5956 56 +Reload 3248080 6410 56 +Offload 3250320 6012 40 +Offload 3251920 6273 49 +Offload 3253880 6494 14 +Reload 3254440 6093 103 +Visit 3258560 569 +Visit 3258560 568 +Visit 3258560 567 +Offload 3258560 6508 10 +Offload 3258960 6590 72 +Offload 3261840 6093 4 +Reload 3262000 6864 86 +Offload 3265440 6097 63 +Reload 3267960 6547 63 +Offload 3270480 6160 36 +Offload 3271920 6410 4 +Reload 3272080 6230 40 +Visit 3273680 572 +Visit 3273680 571 +Visit 3273680 570 +Offload 3273680 6414 52 +Offload 3275760 6727 41 +Reload 3277400 7001 93 +Offload 3281120 6230 40 +Offload 3282720 6547 30 +Reload 3283920 6684 70 +Offload 3286720 6577 33 +Offload 3288040 6768 14 +Reload 3288600 6367 47 +Visit 3290480 575 +Visit 3290480 574 +Visit 3290480 573 +Offload 3290480 6782 24 +Offload 3291440 6864 76 +Reload 3294480 7138 100 +Offload 3298480 6367 47 +Offload 3300360 6684 30 +Reload 3301560 6821 77 +Offload 3304640 6714 40 +Offload 3306240 6940 10 +Offload 3306640 7001 4 +Reload 3306800 6504 54 +Visit 3308960 578 +Visit 3308960 577 +Visit 3308960 576 +Offload 3308960 7005 89 +Offload 3312520 6504 18 +Reload 3313240 7275 107 +Offload 3317520 6522 36 +Offload 3318960 6821 48 +Reload 3320880 6958 84 +Offload 3324240 6869 29 +Offload 3325400 7138 32 +Reload 3326680 6641 61 +Visit 3329120 581 +Visit 3329120 580 +Visit 3329120 579 +Offload 3329120 7170 44 +Reload 3330880 7412 44 +Offload 3332640 6641 61 +Offload 3335080 6958 30 +Reload 3336280 7095 91 +Offload 3339920 6988 54 +Offload 3342080 7214 14 +Reload 3342640 6778 68 +Visit 3345360 584 +Visit 3345360 583 +Visit 3345360 582 +Offload 3345360 7228 10 +Offload 3345760 7275 41 +Reload 3347400 7549 51 +Offload 3349440 6778 68 +Offload 3352160 7095 16 +Reload 3352800 7232 84 +Offload 3356160 7111 75 +Reload 3359160 6915 75 +Visit 3362160 587 +Visit 3362160 586 +Visit 3362160 585 +Offload 3362160 7330 52 +Offload 3364240 7412 6 +Reload 3364480 7686 58 +Offload 3366800 6915 67 +Reload 3369480 7369 49 +Reload 3371440 7456 18 +Offload 3372160 6982 8 +Offload 3372480 7232 74 +Reload 3375440 7052 82 +Visit 3378720 590 +Visit 3378720 589 +Visit 3378720 588 +Offload 3378720 7306 24 +Offload 3379680 7549 41 +Reload 3381320 7823 65 +Offload 3383920 7052 42 +Reload 3385600 7506 42 +Offload 3387280 7094 40 +Offload 3388880 7369 49 +Reload 3390840 7189 89 +Visit 3394400 593 +Visit 3394400 592 +Visit 3394400 591 +Offload 3394400 7418 56 +Offload 3396640 7590 10 +Offload 3397040 7686 6 +Reload 3397280 7960 72 +Offload 3400160 7189 49 +Reload 3402120 7643 49 +Offload 3404080 7238 40 +Offload 3405680 7506 42 +Offload 3407360 7692 14 +Reload 3407920 7326 96 +Visit 3411760 596 +Visit 3411760 595 +Visit 3411760 594 +Offload 3411760 7706 38 +Offload 3413280 7823 41 +Reload 3414920 8097 79 +Offload 3418080 7326 56 +Reload 3420320 7780 56 +Offload 3422560 7382 40 +Offload 3424160 7643 49 +Offload 3426120 7864 14 +Reload 3426680 7463 103 +Visit 3430800 599 +Visit 3430800 598 +Visit 3430800 597 +Offload 3430800 7878 10 +Offload 3431200 7960 72 +Offload 3434080 7463 4 +Reload 3434240 8234 86 +Offload 3437680 7467 63 +Reload 3440200 7917 63 +Offload 3442720 7530 36 +Offload 3444160 7780 4 +Reload 3444320 7600 40 +Visit 3445920 602 +Visit 3445920 601 +Visit 3445920 600 +Offload 3445920 7784 52 +Offload 3448000 8097 41 +Reload 3449640 8371 93 +Offload 3453360 7600 40 +Offload 3454960 7917 30 +Reload 3456160 8054 70 +Offload 3458960 7947 33 +Offload 3460280 8138 14 +Reload 3460840 7737 47 +Visit 3462720 605 +Visit 3462720 604 +Visit 3462720 603 +Offload 3462720 8152 24 +Offload 3463680 8234 76 +Reload 3466720 8508 100 +Offload 3470720 7737 47 +Offload 3472600 8054 30 +Reload 3473800 8191 77 +Offload 3476880 8084 40 +Offload 3478480 8310 10 +Offload 3478880 8371 4 +Reload 3479040 7874 54 +Visit 3481200 608 +Visit 3481200 607 +Visit 3481200 606 +Offload 3481200 8375 89 +Offload 3484760 7874 18 +Reload 3485480 8645 107 +Offload 3489760 7892 36 +Offload 3491200 8191 48 +Reload 3493120 8328 84 +Offload 3496480 8239 29 +Offload 3497640 8508 32 +Reload 3498920 8011 61 +Visit 3501360 611 +Visit 3501360 610 +Visit 3501360 609 +Offload 3501360 8540 44 +Reload 3503120 8782 44 +Offload 3504880 8011 61 +Offload 3507320 8328 30 +Reload 3508520 8465 91 +Offload 3512160 8358 54 +Offload 3514320 8584 14 +Reload 3514880 8148 68 +Visit 3517600 614 +Visit 3517600 613 +Visit 3517600 612 +Offload 3517600 8598 10 +Offload 3518000 8645 41 +Reload 3519640 8919 51 +Offload 3521680 8148 68 +Offload 3524400 8465 16 +Reload 3525040 8602 84 +Offload 3528400 8481 75 +Reload 3531400 8285 75 +Visit 3534400 617 +Visit 3534400 616 +Visit 3534400 615 +Offload 3534400 8700 52 +Offload 3536480 8782 6 +Reload 3536720 9056 58 +Offload 3539040 8285 67 +Reload 3541720 8739 49 +Reload 3543680 8826 18 +Offload 3544400 8352 8 +Offload 3544720 8602 74 +Reload 3547680 8422 82 +Visit 3550960 620 +Visit 3550960 619 +Visit 3550960 618 +Offload 3550960 8676 24 +Offload 3551920 8919 41 +Reload 3553560 9193 65 +Offload 3556160 8422 42 +Reload 3557840 8876 42 +Offload 3559520 8464 40 +Offload 3561120 8739 49 +Reload 3563080 8559 89 +Visit 3566640 623 +Visit 3566640 622 +Visit 3566640 621 +Offload 3566640 8788 56 +Offload 3568880 8960 10 +Offload 3569280 9056 6 +Reload 3569520 9330 72 +Offload 3572400 8559 49 +Reload 3574360 9013 49 +Offload 3576320 8608 40 +Offload 3577920 8876 42 +Offload 3579600 9062 14 +Reload 3580160 8696 96 +Visit 3584000 626 +Visit 3584000 625 +Visit 3584000 624 +Offload 3584000 9076 38 +Offload 3585520 9193 41 +Reload 3587160 9467 79 +Offload 3590320 8696 56 +Reload 3592560 9150 56 +Offload 3594800 8752 40 +Offload 3596400 9013 49 +Offload 3598360 9234 14 +Reload 3598920 8833 103 +Visit 3603040 629 +Visit 3603040 628 +Visit 3603040 627 +Offload 3603040 9248 10 +Offload 3603440 9330 72 +Offload 3606320 8833 4 +Reload 3606480 9604 86 +Offload 3609920 8837 63 +Reload 3612440 9287 63 +Offload 3614960 8900 36 +Offload 3616400 9150 4 +Reload 3616560 8970 40 +Visit 3618160 632 +Visit 3618160 631 +Visit 3618160 630 +Offload 3618160 9154 52 +Offload 3620240 9467 41 +Reload 3621880 9741 93 +Offload 3625600 8970 40 +Offload 3627200 9287 30 +Reload 3628400 9424 70 +Offload 3631200 9317 33 +Offload 3632520 9508 14 +Reload 3633080 9107 47 +Visit 3634960 635 +Visit 3634960 634 +Visit 3634960 633 +Offload 3634960 9522 24 +Offload 3635920 9604 76 +Reload 3638960 9878 100 +Offload 3642960 9107 47 +Offload 3644840 9424 30 +Reload 3646040 9561 77 +Offload 3649120 9454 40 +Offload 3650720 9680 10 +Offload 3651120 9741 4 +Reload 3651280 9244 54 +Visit 3653440 638 +Visit 3653440 637 +Visit 3653440 636 +Offload 3653440 9745 89 +Offload 3657000 9244 18 +Reload 3657720 10015 107 +Offload 3662000 9262 36 +Offload 3663440 9561 48 +Reload 3665360 9698 84 +Offload 3668720 9609 29 +Offload 3669880 9878 32 +Reload 3671160 9381 61 +Visit 3673600 641 +Visit 3673600 640 +Visit 3673600 639 +Offload 3673600 9910 44 +Reload 3675360 10152 44 +Offload 3677120 9381 61 +Offload 3679560 9698 30 +Reload 3680760 9835 91 +Offload 3684400 9728 54 +Offload 3686560 9954 14 +Reload 3687120 9518 68 +Visit 3689840 644 +Visit 3689840 643 +Visit 3689840 642 +Offload 3689840 9968 10 +Offload 3690240 10015 41 +Reload 3691880 10289 51 +Offload 3693920 9518 68 +Offload 3696640 9835 16 +Reload 3697280 9972 84 +Offload 3700640 9851 75 +Reload 3703640 9655 75 +Visit 3706640 647 +Visit 3706640 646 +Visit 3706640 645 +Offload 3706640 10070 52 +Offload 3708720 10152 6 +Reload 3708960 10426 58 +Offload 3711280 9655 67 +Reload 3713960 10109 49 +Reload 3715920 10196 18 +Offload 3716640 9722 8 +Offload 3716960 9972 74 +Reload 3719920 9792 82 +Visit 3723200 650 +Visit 3723200 649 +Visit 3723200 648 +Offload 3723200 10046 24 +Offload 3724160 10289 41 +Reload 3725800 10563 65 +Offload 3728400 9792 42 +Reload 3730080 10246 42 +Offload 3731760 9834 40 +Offload 3733360 10109 49 +Reload 3735320 9929 89 +Visit 3738880 653 +Visit 3738880 652 +Visit 3738880 651 +Offload 3738880 10158 56 +Offload 3741120 10330 10 +Offload 3741520 10426 6 +Reload 3741760 10700 72 +Offload 3744640 9929 49 +Reload 3746600 10383 49 +Offload 3748560 9978 40 +Offload 3750160 10246 42 +Offload 3751840 10432 14 +Reload 3752400 10066 96 +Visit 3756240 656 +Visit 3756240 655 +Visit 3756240 654 +Offload 3756240 10446 38 +Offload 3757760 10563 41 +Reload 3759400 10837 79 +Offload 3762560 10066 56 +Reload 3764800 10520 56 +Offload 3767040 10122 40 +Offload 3768640 10383 49 +Offload 3770600 10604 14 +Reload 3771160 10203 103 +Visit 3775280 659 +Visit 3775280 658 +Visit 3775280 657 +Offload 3775280 10618 10 +Offload 3775680 10700 72 +Offload 3778560 10203 4 +Reload 3778720 10974 86 +Offload 3782160 10207 63 +Reload 3784680 10657 63 +Offload 3787200 10270 36 +Offload 3788640 10520 4 +Reload 3788800 10340 40 +Visit 3790400 662 +Visit 3790400 661 +Visit 3790400 660 +Offload 3790400 10524 52 +Offload 3792480 10837 41 +Reload 3794120 11111 93 +Offload 3797840 10340 40 +Offload 3799440 10657 30 +Reload 3800640 10794 70 +Offload 3803440 10687 33 +Offload 3804760 10878 14 +Reload 3805320 10477 47 +Visit 3807200 665 +Visit 3807200 664 +Visit 3807200 663 +Offload 3807200 10892 24 +Offload 3808160 10974 76 +Reload 3811200 11248 100 +Offload 3815200 10477 47 +Offload 3817080 10794 30 +Reload 3818280 10931 77 +Offload 3821360 10824 40 +Offload 3822960 11050 10 +Offload 3823360 11111 4 +Reload 3823520 10614 54 +Visit 3825680 668 +Visit 3825680 667 +Visit 3825680 666 +Offload 3825680 11115 89 +Offload 3829240 10614 18 +Reload 3829960 11385 107 +Offload 3834240 10632 36 +Offload 3835680 10931 48 +Reload 3837600 11068 84 +Offload 3840960 10979 29 +Offload 3842120 11248 32 +Reload 3843400 10751 61 +Visit 3845840 671 +Visit 3845840 670 +Visit 3845840 669 +Offload 3845840 11280 44 +Reload 3847600 11522 44 +Offload 3849360 10751 61 +Offload 3851800 11068 30 +Reload 3853000 11205 91 +Offload 3856640 11098 54 +Offload 3858800 11324 14 +Reload 3859360 10888 68 +Visit 3862080 674 +Visit 3862080 673 +Visit 3862080 672 +Offload 3862080 11338 10 +Offload 3862480 11385 41 +Reload 3864120 11659 51 +Offload 3866160 10888 68 +Offload 3868880 11205 16 +Reload 3869520 11342 84 +Offload 3872880 11221 75 +Reload 3875880 11025 75 +Visit 3878880 677 +Visit 3878880 676 +Visit 3878880 675 +Offload 3878880 11440 52 +Offload 3880960 11522 6 +Reload 3881200 11796 58 +Offload 3883520 11025 67 +Reload 3886200 11479 49 +Reload 3888160 11566 18 +Offload 3888880 11092 8 +Offload 3889200 11342 74 +Reload 3892160 11162 82 +Visit 3895440 680 +Visit 3895440 679 +Visit 3895440 678 +Offload 3895440 11416 24 +Offload 3896400 11659 41 +Reload 3898040 11933 65 +Offload 3900640 11162 42 +Reload 3902320 11616 42 +Offload 3904000 11204 40 +Offload 3905600 11479 49 +Reload 3907560 11299 89 +Visit 3911120 683 +Visit 3911120 682 +Visit 3911120 681 +Offload 3911120 11528 56 +Offload 3913360 11700 10 +Offload 3913760 11796 6 +Reload 3914000 12070 72 +Offload 3916880 11299 49 +Reload 3918840 11753 49 +Offload 3920800 11348 40 +Offload 3922400 11616 42 +Offload 3924080 11802 14 +Reload 3924640 11436 96 +Visit 3928480 686 +Visit 3928480 685 +Visit 3928480 684 +Offload 3928480 11816 38 +Offload 3930000 11933 41 +Reload 3931640 12207 79 +Offload 3934800 11436 56 +Reload 3937040 11890 56 +Offload 3939280 11492 40 +Offload 3940880 11753 49 +Offload 3942840 11974 14 +Reload 3943400 11573 103 +Visit 3947520 689 +Visit 3947520 688 +Visit 3947520 687 +Offload 3947520 11988 10 +Offload 3947920 12070 72 +Offload 3950800 11573 4 +Reload 3950960 12344 86 +Offload 3954400 11577 63 +Reload 3956920 12027 63 +Offload 3959440 11640 36 +Offload 3960880 11890 4 +Reload 3961040 11710 40 +Visit 3962640 692 +Visit 3962640 691 +Visit 3962640 690 +Offload 3962640 11894 52 +Offload 3964720 12207 41 +Reload 3966360 12481 93 +Offload 3970080 11710 40 +Offload 3971680 12027 30 +Reload 3972880 12164 70 +Offload 3975680 12057 33 +Offload 3977000 12248 14 +Reload 3977560 11847 47 +Visit 3979440 695 +Visit 3979440 694 +Visit 3979440 693 +Offload 3979440 12262 24 +Offload 3980400 12344 76 +Reload 3983440 12618 100 +Offload 3987440 11847 47 +Offload 3989320 12164 30 +Reload 3990520 12301 77 +Offload 3993600 12194 40 +Offload 3995200 12420 10 +Offload 3995600 12481 4 +Reload 3995760 11984 54 +Visit 3997920 698 +Visit 3997920 697 +Visit 3997920 696 +Offload 3997920 12485 89 +Offload 4001480 11984 18 +Reload 4002200 12755 107 +Offload 4006480 12002 36 +Offload 4007920 12301 48 +Reload 4009840 12438 84 +Offload 4013200 12349 29 +Offload 4014360 12618 32 +Reload 4015640 12121 61 +Visit 4018080 701 +Visit 4018080 700 +Visit 4018080 699 +Offload 4018080 12650 44 +Reload 4019840 12892 44 +Offload 4021600 12121 61 +Offload 4024040 12438 30 +Reload 4025240 12575 91 +Offload 4028880 12468 54 +Offload 4031040 12694 14 +Reload 4031600 12258 68 +Visit 4034320 704 +Visit 4034320 703 +Visit 4034320 702 +Offload 4034320 12708 10 +Offload 4034720 12755 41 +Reload 4036360 13029 51 +Offload 4038400 12258 68 +Offload 4041120 12575 16 +Reload 4041760 12712 84 +Offload 4045120 12591 75 +Reload 4048120 12395 75 +Visit 4051120 707 +Visit 4051120 706 +Visit 4051120 705 +Offload 4051120 12810 52 +Offload 4053200 12892 6 +Reload 4053440 13166 58 +Offload 4055760 12395 67 +Reload 4058440 12849 49 +Reload 4060400 12936 18 +Offload 4061120 12462 8 +Offload 4061440 12712 74 +Reload 4064400 12532 82 +Visit 4067680 710 +Visit 4067680 709 +Visit 4067680 708 +Offload 4067680 12786 24 +Offload 4068640 13029 41 +Reload 4070280 13303 65 +Offload 4072880 12532 42 +Reload 4074560 12986 42 +Offload 4076240 12574 40 +Offload 4077840 12849 49 +Reload 4079800 12669 89 +Visit 4083360 713 +Visit 4083360 712 +Visit 4083360 711 +Offload 4083360 12898 56 +Offload 4085600 13070 10 +Offload 4086000 13166 6 +Reload 4086240 13440 72 +Offload 4089120 12669 49 +Reload 4091080 13123 49 +Offload 4093040 12718 40 +Offload 4094640 12986 42 +Offload 4096320 13172 14 +Reload 4096880 12806 96 +Visit 4100720 716 +Visit 4100720 715 +Visit 4100720 714 +Offload 4100720 13186 38 +Offload 4102240 13303 41 +Reload 4103880 13577 79 +Offload 4107040 12806 56 +Reload 4109280 13260 56 +Offload 4111520 12862 40 +Offload 4113120 13123 49 +Offload 4115080 13344 14 +Reload 4115640 12943 103 +Visit 4119760 719 +Visit 4119760 718 +Visit 4119760 717 +Offload 4119760 13358 10 +Offload 4120160 13440 72 +Offload 4123040 12943 4 +Reload 4123200 13714 86 +Offload 4126640 12947 63 +Reload 4129160 13397 63 +Offload 4131680 13010 36 +Offload 4133120 13260 4 +Reload 4133280 13080 40 +Visit 4134880 722 +Visit 4134880 721 +Visit 4134880 720 +Offload 4134880 13264 52 +Offload 4136960 13577 41 +Reload 4138600 13851 93 +Offload 4142320 13080 40 +Offload 4143920 13397 30 +Reload 4145120 13534 70 +Offload 4147920 13427 33 +Offload 4149240 13618 14 +Reload 4149800 13217 47 +Visit 4151680 725 +Visit 4151680 724 +Visit 4151680 723 +Offload 4151680 13632 24 +Offload 4152640 13714 76 +Reload 4155680 13988 100 +Offload 4159680 13217 47 +Offload 4161560 13534 30 +Reload 4162760 13671 77 +Offload 4165840 13564 40 +Offload 4167440 13790 10 +Offload 4167840 13851 4 +Reload 4168000 13354 54 +Visit 4170160 728 +Visit 4170160 727 +Visit 4170160 726 +Offload 4170160 13855 89 +Offload 4173720 13354 18 +Reload 4174440 14125 107 +Offload 4178720 13372 36 +Offload 4180160 13671 48 +Reload 4182080 13808 84 +Offload 4185440 13719 29 +Offload 4186600 13988 32 +Reload 4187880 13491 61 +Visit 4190320 731 +Visit 4190320 730 +Visit 4190320 729 +Offload 4190320 14020 44 +Reload 4192080 14262 44 +Offload 4193840 13491 61 +Offload 4196280 13808 30 +Reload 4197480 13945 91 +Offload 4201120 13838 54 +Offload 4203280 14064 14 +Reload 4203840 13628 68 +Visit 4206560 734 +Visit 4206560 733 +Visit 4206560 732 +Offload 4206560 14078 10 +Offload 4206960 14125 41 +Reload 4208600 14399 51 +Offload 4210640 13628 68 +Offload 4213360 13945 16 +Reload 4214000 14082 84 +Offload 4217360 13961 75 +Reload 4220360 13765 75 +Visit 4223360 737 +Visit 4223360 736 +Visit 4223360 735 +Offload 4223360 14180 52 +Offload 4225440 14262 6 +Reload 4225680 14536 58 +Offload 4228000 13765 67 +Reload 4230680 14219 49 +Reload 4232640 14306 18 +Offload 4233360 13832 8 +Offload 4233680 14082 74 +Reload 4236640 13902 82 +Visit 4239920 740 +Visit 4239920 739 +Visit 4239920 738 +Offload 4239920 14156 24 +Offload 4240880 14399 41 +Reload 4242520 14673 65 +Offload 4245120 13902 42 +Reload 4246800 14356 42 +Offload 4248480 13944 40 +Offload 4250080 14219 49 +Reload 4252040 14039 89 +Visit 4255600 743 +Visit 4255600 742 +Visit 4255600 741 +Offload 4255600 14268 56 +Offload 4257840 14440 10 +Offload 4258240 14536 6 +Reload 4258480 14810 72 +Offload 4261360 14039 49 +Reload 4263320 14493 49 +Offload 4265280 14088 40 +Offload 4266880 14356 42 +Offload 4268560 14542 14 +Reload 4269120 14176 96 +Visit 4272960 746 +Visit 4272960 745 +Visit 4272960 744 +Offload 4272960 14556 38 +Offload 4274480 14673 41 +Reload 4276120 14947 79 +Offload 4279280 14176 56 +Reload 4281520 14630 56 +Offload 4283760 14232 40 +Offload 4285360 14493 49 +Offload 4287320 14714 14 +Reload 4287880 14313 103 +Visit 4292000 749 +Visit 4292000 748 +Visit 4292000 747 +Offload 4292000 14728 10 +Offload 4292400 14810 72 +Offload 4295280 14313 4 +Reload 4295440 15084 86 +Offload 4298880 14317 63 +Reload 4301400 14767 63 +Offload 4303920 14380 36 +Offload 4305360 14630 4 +Reload 4305520 14450 40 +Visit 4307120 752 +Visit 4307120 751 +Visit 4307120 750 +Offload 4307120 14634 52 +Offload 4309200 14947 41 +Reload 4310840 15221 93 +Offload 4314560 14450 40 +Offload 4316160 14767 30 +Reload 4317360 14904 70 +Offload 4320160 14797 33 +Offload 4321480 14988 14 +Reload 4322040 14587 47 +Visit 4323920 755 +Visit 4323920 754 +Visit 4323920 753 +Offload 4323920 15002 24 +Offload 4324880 15084 76 +Reload 4327920 15358 100 +Offload 4331920 14587 47 +Offload 4333800 14904 30 +Reload 4335000 15041 77 +Offload 4338080 14934 40 +Offload 4339680 15160 10 +Offload 4340080 15221 4 +Reload 4340240 14724 54 +Visit 4342400 758 +Visit 4342400 757 +Visit 4342400 756 +Offload 4342400 15225 89 +Offload 4345960 14724 18 +Reload 4346680 15495 107 +Offload 4350960 14742 36 +Offload 4352400 15041 48 +Reload 4354320 15178 84 +Offload 4357680 15089 29 +Offload 4358840 15358 32 +Reload 4360120 14861 61 +Visit 4362560 761 +Visit 4362560 760 +Visit 4362560 759 +Offload 4362560 15390 44 +Reload 4364320 15632 44 +Offload 4366080 14861 61 +Offload 4368520 15178 30 +Reload 4369720 15315 91 +Offload 4373360 15208 54 +Offload 4375520 15434 14 +Reload 4376080 14998 68 +Visit 4378800 764 +Visit 4378800 763 +Visit 4378800 762 +Offload 4378800 15448 10 +Offload 4379200 15495 41 +Reload 4380840 15769 51 +Offload 4382880 14998 68 +Offload 4385600 15315 16 +Reload 4386240 15452 84 +Offload 4389600 15331 75 +Reload 4392600 15135 75 +Visit 4395600 767 +Visit 4395600 766 +Visit 4395600 765 +Offload 4395600 15550 52 +Offload 4397680 15632 6 +Reload 4397920 15906 58 +Offload 4400240 15135 67 +Reload 4402920 15589 49 +Reload 4404880 15676 18 +Offload 4405600 15202 8 +Offload 4405920 15452 74 +Reload 4408880 15272 82 +Visit 4412160 770 +Visit 4412160 769 +Visit 4412160 768 +Offload 4412160 15526 24 +Offload 4413120 15769 41 +Reload 4414760 16043 65 +Offload 4417360 15272 42 +Reload 4419040 15726 42 +Offload 4420720 15314 40 +Offload 4422320 15589 49 +Reload 4424280 15409 89 +Visit 4427840 773 +Visit 4427840 772 +Visit 4427840 771 +Offload 4427840 15638 56 +Offload 4430080 15810 10 +Offload 4430480 15906 6 +Reload 4430720 16180 72 +Offload 4433600 15409 49 +Reload 4435560 15863 49 +Offload 4437520 15458 40 +Offload 4439120 15726 42 +Offload 4440800 15912 14 +Reload 4441360 15546 96 +Visit 4445200 776 +Visit 4445200 775 +Visit 4445200 774 +Offload 4445200 15926 38 +Offload 4446720 16043 41 +Reload 4448360 16317 79 +Offload 4451520 15546 56 +Reload 4453760 16000 56 +Offload 4456000 15602 40 +Offload 4457600 15863 49 +Offload 4459560 16084 14 +Reload 4460120 15683 103 +Visit 4464240 779 +Visit 4464240 778 +Visit 4464240 777 +Offload 4464240 16098 10 +Offload 4464640 16180 72 +Offload 4467520 15683 4 +Reload 4467680 16454 86 +Offload 4471120 15687 63 +Reload 4473640 16137 63 +Offload 4476160 15750 36 +Offload 4477600 16000 4 +Reload 4477760 15820 40 +Visit 4479360 782 +Visit 4479360 781 +Visit 4479360 780 +Offload 4479360 16004 52 +Offload 4481440 16317 41 +Reload 4483080 16591 93 +Offload 4486800 15820 40 +Offload 4488400 16137 30 +Reload 4489600 16274 70 +Offload 4492400 16167 33 +Offload 4493720 16358 14 +Reload 4494280 15957 47 +Visit 4496160 785 +Visit 4496160 784 +Visit 4496160 783 +Offload 4496160 16372 24 +Offload 4497120 16454 76 +Reload 4500160 16728 100 +Offload 4504160 15957 47 +Offload 4506040 16274 30 +Reload 4507240 16411 77 +Offload 4510320 16304 40 +Offload 4511920 16530 10 +Offload 4512320 16591 4 +Reload 4512480 16094 54 +Visit 4514640 788 +Visit 4514640 787 +Visit 4514640 786 +Offload 4514640 16595 89 +Offload 4518200 16094 18 +Reload 4518920 16865 107 +Offload 4523200 16112 36 +Offload 4524640 16411 48 +Reload 4526560 16548 84 +Offload 4529920 16459 29 +Offload 4531080 16728 32 +Reload 4532360 16231 61 +Visit 4534800 791 +Visit 4534800 790 +Visit 4534800 789 +Offload 4534800 16760 44 +Reload 4536560 17002 44 +Offload 4538320 16231 61 +Offload 4540760 16548 30 +Reload 4541960 16685 91 +Offload 4545600 16578 54 +Offload 4547760 16804 14 +Reload 4548320 16368 68 +Visit 4551040 794 +Visit 4551040 793 +Visit 4551040 792 +Offload 4551040 16818 10 +Offload 4551440 16865 41 +Reload 4553080 17139 51 +Offload 4555120 16368 68 +Offload 4557840 16685 16 +Reload 4558480 16822 84 +Offload 4561840 16701 75 +Reload 4564840 16505 75 +Visit 4567840 797 +Visit 4567840 796 +Visit 4567840 795 +Offload 4567840 16920 52 +Offload 4569920 17002 6 +Reload 4570160 17276 58 +Offload 4572480 16505 67 +Reload 4575160 16959 49 +Reload 4577120 17046 18 +Offload 4577840 16572 8 +Offload 4578160 16822 74 +Reload 4581120 16642 82 +Visit 4584400 800 +Visit 4584400 799 +Visit 4584400 798 +Offload 4584400 16896 24 +Offload 4585360 17139 41 +Reload 4587000 17413 65 +Offload 4589600 16642 42 +Reload 4591280 17096 42 +Offload 4592960 16684 40 +Offload 4594560 16959 49 +Reload 4596520 16779 89 +Visit 4600080 803 +Visit 4600080 802 +Visit 4600080 801 +Offload 4600080 17008 56 +Offload 4602320 17180 10 +Offload 4602720 17276 6 +Reload 4602960 17550 72 +Offload 4605840 16779 49 +Reload 4607800 17233 49 +Offload 4609760 16828 40 +Offload 4611360 17096 42 +Offload 4613040 17282 14 +Reload 4613600 16916 96 +Visit 4617440 806 +Visit 4617440 805 +Visit 4617440 804 +Offload 4617440 17296 38 +Offload 4618960 17413 41 +Reload 4620600 17687 79 +Offload 4623760 16916 56 +Reload 4626000 17370 56 +Offload 4628240 16972 40 +Offload 4629840 17233 49 +Offload 4631800 17454 14 +Reload 4632360 17053 103 +Visit 4636480 809 +Visit 4636480 808 +Visit 4636480 807 +Offload 4636480 17468 10 +Offload 4636880 17550 72 +Offload 4639760 17053 4 +Reload 4639920 17824 86 +Offload 4643360 17057 63 +Reload 4645880 17507 63 +Offload 4648400 17120 36 +Offload 4649840 17370 4 +Reload 4650000 17190 40 +Visit 4651600 812 +Visit 4651600 811 +Visit 4651600 810 +Offload 4651600 17374 52 +Offload 4653680 17687 41 +Reload 4655320 17961 93 +Offload 4659040 17190 40 +Offload 4660640 17507 30 +Reload 4661840 17644 70 +Offload 4664640 17537 33 +Offload 4665960 17728 14 +Reload 4666520 17327 47 +Visit 4668400 815 +Visit 4668400 814 +Visit 4668400 813 +Offload 4668400 17742 24 +Offload 4669360 17824 76 +Reload 4672400 18098 100 +Offload 4676400 17327 47 +Offload 4678280 17644 30 +Reload 4679480 17781 77 +Offload 4682560 17674 40 +Offload 4684160 17900 10 +Offload 4684560 17961 4 +Reload 4684720 17464 54 +Visit 4686880 818 +Visit 4686880 817 +Visit 4686880 816 +Offload 4686880 17965 89 +Offload 4690440 17464 18 +Reload 4691160 18235 107 +Offload 4695440 17482 36 +Offload 4696880 17781 48 +Reload 4698800 17918 84 +Offload 4702160 17829 29 +Offload 4703320 18098 32 +Reload 4704600 17601 61 +Visit 4707040 821 +Visit 4707040 820 +Visit 4707040 819 +Offload 4707040 18130 44 +Reload 4708800 18372 44 +Offload 4710560 17601 61 +Offload 4713000 17918 30 +Reload 4714200 18055 91 +Offload 4717840 17948 54 +Offload 4720000 18174 14 +Reload 4720560 17738 68 +Visit 4723280 824 +Visit 4723280 823 +Visit 4723280 822 +Offload 4723280 18188 10 +Offload 4723680 18235 41 +Reload 4725320 18509 51 +Offload 4727360 17738 68 +Offload 4730080 18055 16 +Reload 4730720 18192 84 +Offload 4734080 18071 75 +Reload 4737080 17875 75 +Visit 4740080 827 +Visit 4740080 826 +Visit 4740080 825 +Offload 4740080 18290 52 +Offload 4742160 18372 6 +Reload 4742400 18646 58 +Offload 4744720 17875 67 +Reload 4747400 18329 49 +Reload 4749360 18416 18 +Offload 4750080 17942 8 +Offload 4750400 18192 74 +Reload 4753360 18012 82 +Visit 4756640 830 +Visit 4756640 829 +Visit 4756640 828 +Offload 4756640 18266 24 +Offload 4757600 18509 41 +Reload 4759240 18783 65 +Offload 4761840 18012 42 +Reload 4763520 18466 42 +Offload 4765200 18054 40 +Offload 4766800 18329 49 +Reload 4768760 18149 89 +Visit 4772320 833 +Visit 4772320 832 +Visit 4772320 831 +Offload 4772320 18378 56 +Offload 4774560 18550 10 +Offload 4774960 18646 6 +Reload 4775200 18920 72 +Offload 4778080 18149 49 +Reload 4780040 18603 49 +Offload 4782000 18198 40 +Offload 4783600 18466 42 +Offload 4785280 18652 14 +Reload 4785840 18286 96 +Visit 4789680 836 +Visit 4789680 835 +Visit 4789680 834 +Offload 4789680 18666 38 +Offload 4791200 18783 41 +Reload 4792840 19057 79 +Offload 4796000 18286 56 +Reload 4798240 18740 56 +Offload 4800480 18342 40 +Offload 4802080 18603 49 +Offload 4804040 18824 14 +Reload 4804600 18423 103 +Visit 4808720 839 +Visit 4808720 838 +Visit 4808720 837 +Offload 4808720 18838 10 +Offload 4809120 18920 72 +Offload 4812000 18423 4 +Reload 4812160 19194 86 +Offload 4815600 18427 63 +Reload 4818120 18877 63 +Offload 4820640 18490 36 +Offload 4822080 18740 4 +Reload 4822240 18560 40 +Visit 4823840 842 +Visit 4823840 841 +Visit 4823840 840 +Offload 4823840 18744 52 +Offload 4825920 19057 41 +Reload 4827560 19331 93 +Offload 4831280 18560 40 +Offload 4832880 18877 30 +Reload 4834080 19014 70 +Offload 4836880 18907 33 +Offload 4838200 19098 14 +Reload 4838760 18697 47 +Visit 4840640 845 +Visit 4840640 844 +Visit 4840640 843 +Offload 4840640 19112 24 +Offload 4841600 19194 76 +Reload 4844640 19468 100 +Offload 4848640 18697 47 +Offload 4850520 19014 30 +Reload 4851720 19151 77 +Offload 4854800 19044 40 +Offload 4856400 19270 10 +Offload 4856800 19331 4 +Reload 4856960 18834 54 +Visit 4859120 848 +Visit 4859120 847 +Visit 4859120 846 +Offload 4859120 19335 89 +Offload 4862680 18834 18 +Reload 4863400 19605 107 +Offload 4867680 18852 36 +Offload 4869120 19151 48 +Reload 4871040 19288 84 +Offload 4874400 19199 29 +Offload 4875560 19468 32 +Reload 4876840 18971 61 +Visit 4879280 851 +Visit 4879280 850 +Visit 4879280 849 +Offload 4879280 19500 44 +Reload 4881040 19742 44 +Offload 4882800 18971 61 +Offload 4885240 19288 30 +Reload 4886440 19425 91 +Offload 4890080 19318 54 +Offload 4892240 19544 14 +Reload 4892800 19108 68 +Visit 4895520 854 +Visit 4895520 853 +Visit 4895520 852 +Offload 4895520 19558 4 +Offload 4895680 19660 33 +Reload 4897000 19568 37 +Offload 4898480 19108 68 +Offload 4901200 19425 7 +Reload 4901480 19245 75 +Offload 4904480 19432 51 +Reload 4906520 79 51 +Visit 4908560 856 +Visit 4908560 855 +Visit 4908560 857 +Offload 4908560 19483 33 +Offload 4909880 19693 6 +Offload 4910120 79 9 +Reload 4910480 19712 30 +Reload 4911680 19786 18 +Offload 4912400 88 42 +Offload 4914080 19245 40 +Reload 4915680 19382 82 +Offload 4918960 19285 35 +Offload 4920360 19562 23 +Reload 4921280 216 58 +Visit 4923600 859 +Visit 4923600 858 +Visit 4923600 860 +Offload 4923600 19608 52 +Offload 4925680 216 14 +Reload 4926240 19519 66 +Offload 4928880 230 44 +Offload 4930640 19382 21 +Reload 4931480 353 65 +Offload 4934080 19403 42 +Reload 4935760 36 42 +Visit 4937440 861 +Visit 4937440 863 +Visit 4937440 862 +Offload 4937440 19445 19 +Offload 4938200 19752 24 +Reload 4939160 19656 43 +Offload 4940880 36 42 +Offload 4942560 353 30 +Reload 4943760 490 72 +Offload 4946640 383 35 +Offload 4948040 19519 14 +Reload 4948600 173 49 +Visit 4950560 864 +Visit 4950560 866 +Visit 4950560 865 +Offload 4950560 19533 75 +Offload 4953560 19776 17 +Reload 4954240 19804 92 +Offload 4957920 173 49 +Offload 4959880 490 30 +Reload 4961080 627 79 +Offload 4964240 520 42 +Offload 4965920 19656 14 +Reload 4966480 310 56 +Visit 4968720 867 +Visit 4968720 869 +Visit 4968720 868 +Offload 4968720 19670 82 +Offload 4972000 310 4 +Reload 4972160 764 86 +Offload 4975600 314 52 +Offload 4977680 627 11 +Reload 4978120 447 63 +Offload 4980640 638 40 +Reload 4982240 130 40 +Visit 4983840 872 +Visit 4983840 871 +Visit 4983840 870 +Offload 4983840 678 28 +Offload 4984960 19793 65 +Reload 4987560 901 93 +Offload 4991280 130 40 +Offload 4992880 447 30 +Reload 4994080 584 70 +Offload 4996880 477 33 +Offload 4998200 764 14 +Reload 4998760 267 47 +Visit 5000640 875 +Visit 5000640 874 +Visit 5000640 873 +Offload 5000640 778 72 +Offload 5003520 19858 28 +Reload 5004640 1038 100 +Offload 5008640 267 47 +Offload 5010520 584 30 +Reload 5011720 721 77 +Offload 5014800 614 40 +Offload 5016400 901 14 +Reload 5016960 404 54 +Visit 5019120 878 +Visit 5019120 877 +Visit 5019120 876 +Offload 5019120 915 79 +Offload 5022280 19886 10 +Offload 5022680 404 18 +Reload 5023400 1175 107 +Offload 5027680 422 36 +Offload 5029120 721 48 +Reload 5031040 858 84 +Offload 5034400 769 29 +Offload 5035560 1038 32 +Reload 5036840 541 61 +Visit 5039280 881 +Visit 5039280 880 +Visit 5039280 879 +Offload 5039280 1070 44 +Reload 5041040 1312 44 +Offload 5042800 541 61 +Offload 5045240 858 30 +Reload 5046440 995 91 +Offload 5050080 888 54 +Offload 5052240 1114 14 +Reload 5052800 678 68 +Visit 5055520 884 +Visit 5055520 883 +Visit 5055520 882 +Offload 5055520 1128 10 +Offload 5055920 1175 41 +Reload 5057560 1449 51 +Offload 5059600 678 68 +Offload 5062320 995 16 +Reload 5062960 1132 84 +Offload 5066320 1011 75 +Reload 5069320 815 75 +Visit 5072320 887 +Visit 5072320 886 +Visit 5072320 885 +Offload 5072320 1230 52 +Offload 5074400 1312 6 +Reload 5074640 1586 58 +Offload 5076960 815 67 +Reload 5079640 1269 49 +Reload 5081600 1356 18 +Offload 5082320 882 8 +Offload 5082640 1132 74 +Reload 5085600 952 82 +Visit 5088880 890 +Visit 5088880 889 +Visit 5088880 888 +Offload 5088880 1206 24 +Offload 5089840 1449 41 +Reload 5091480 1723 65 +Offload 5094080 952 42 +Reload 5095760 1406 42 +Offload 5097440 994 40 +Offload 5099040 1269 49 +Reload 5101000 1089 89 +Visit 5104560 893 +Visit 5104560 892 +Visit 5104560 891 +Offload 5104560 1318 56 +Offload 5106800 1490 10 +Offload 5107200 1586 6 +Reload 5107440 1860 72 +Offload 5110320 1089 49 +Reload 5112280 1543 49 +Offload 5114240 1138 40 +Offload 5115840 1406 42 +Offload 5117520 1592 14 +Reload 5118080 1226 96 +Visit 5121920 896 +Visit 5121920 895 +Visit 5121920 894 +Offload 5121920 1606 38 +Offload 5123440 1723 41 +Reload 5125080 1997 79 +Offload 5128240 1226 56 +Reload 5130480 1680 56 +Offload 5132720 1282 40 +Offload 5134320 1543 49 +Offload 5136280 1764 14 +Reload 5136840 1363 103 +Visit 5140960 899 +Visit 5140960 898 +Visit 5140960 897 +Offload 5140960 1778 10 +Offload 5141360 1860 72 +Offload 5144240 1363 4 +Reload 5144400 2134 86 +Offload 5147840 1367 63 +Reload 5150360 1817 63 +Offload 5152880 1430 36 +Offload 5154320 1680 4 +Reload 5154480 1500 40 +Visit 5156080 902 +Visit 5156080 901 +Visit 5156080 900 +Offload 5156080 1684 52 +Offload 5158160 1997 41 +Reload 5159800 2271 93 +Offload 5163520 1500 40 +Offload 5165120 1817 30 +Reload 5166320 1954 70 +Offload 5169120 1847 33 +Offload 5170440 2038 14 +Reload 5171000 1637 47 +Visit 5172880 905 +Visit 5172880 904 +Visit 5172880 903 +Offload 5172880 2052 24 +Offload 5173840 2134 76 +Reload 5176880 2408 100 +Offload 5180880 1637 47 +Offload 5182760 1954 30 +Reload 5183960 2091 77 +Offload 5187040 1984 40 +Offload 5188640 2210 10 +Offload 5189040 2271 4 +Reload 5189200 1774 54 +Visit 5191360 908 +Visit 5191360 907 +Visit 5191360 906 +Offload 5191360 2275 89 +Offload 5194920 1774 18 +Reload 5195640 2545 107 +Offload 5199920 1792 36 +Offload 5201360 2091 48 +Reload 5203280 2228 84 +Offload 5206640 2139 29 +Offload 5207800 2408 32 +Reload 5209080 1911 61 +Visit 5211520 911 +Visit 5211520 910 +Visit 5211520 909 +Offload 5211520 2440 44 +Reload 5213280 2682 44 +Offload 5215040 1911 61 +Offload 5217480 2228 30 +Reload 5218680 2365 91 +Offload 5222320 2258 54 +Offload 5224480 2484 14 +Reload 5225040 2048 68 +Visit 5227760 914 +Visit 5227760 913 +Visit 5227760 912 +Offload 5227760 2498 10 +Offload 5228160 2545 41 +Reload 5229800 2819 51 +Offload 5231840 2048 68 +Offload 5234560 2365 16 +Reload 5235200 2502 84 +Offload 5238560 2381 75 +Reload 5241560 2185 75 +Visit 5244560 917 +Visit 5244560 916 +Visit 5244560 915 +Offload 5244560 2600 52 +Offload 5246640 2682 6 +Reload 5246880 2956 58 +Offload 5249200 2185 67 +Reload 5251880 2639 49 +Reload 5253840 2726 18 +Offload 5254560 2252 8 +Offload 5254880 2502 74 +Reload 5257840 2322 82 +Visit 5261120 920 +Visit 5261120 919 +Visit 5261120 918 +Offload 5261120 2576 24 +Offload 5262080 2819 41 +Reload 5263720 3093 65 +Offload 5266320 2322 42 +Reload 5268000 2776 42 +Offload 5269680 2364 40 +Offload 5271280 2639 49 +Reload 5273240 2459 89 +Visit 5276800 923 +Visit 5276800 922 +Visit 5276800 921 +Offload 5276800 2688 56 +Offload 5279040 2860 10 +Offload 5279440 2956 6 +Reload 5279680 3230 72 +Offload 5282560 2459 49 +Reload 5284520 2913 49 +Offload 5286480 2508 40 +Offload 5288080 2776 42 +Offload 5289760 2962 14 +Reload 5290320 2596 96 +Visit 5294160 926 +Visit 5294160 925 +Visit 5294160 924 +Offload 5294160 2976 38 +Offload 5295680 3093 41 +Reload 5297320 3367 79 +Offload 5300480 2596 56 +Reload 5302720 3050 56 +Offload 5304960 2652 40 +Offload 5306560 2913 49 +Offload 5308520 3134 14 +Reload 5309080 2733 103 +Visit 5313200 929 +Visit 5313200 928 +Visit 5313200 927 +Offload 5313200 3148 10 +Offload 5313600 3230 72 +Offload 5316480 2733 4 +Reload 5316640 3504 86 +Offload 5320080 2737 63 +Reload 5322600 3187 63 +Offload 5325120 2800 36 +Offload 5326560 3050 4 +Reload 5326720 2870 40 +Visit 5328320 932 +Visit 5328320 931 +Visit 5328320 930 +Offload 5328320 3054 52 +Offload 5330400 3367 41 +Reload 5332040 3641 93 +Offload 5335760 2870 40 +Offload 5337360 3187 30 +Reload 5338560 3324 70 +Offload 5341360 3217 33 +Offload 5342680 3408 14 +Reload 5343240 3007 47 +Visit 5345120 935 +Visit 5345120 934 +Visit 5345120 933 +Offload 5345120 3422 24 +Offload 5346080 3504 76 +Reload 5349120 3778 100 +Offload 5353120 3007 47 +Offload 5355000 3324 30 +Reload 5356200 3461 77 +Offload 5359280 3354 40 +Offload 5360880 3580 10 +Offload 5361280 3641 4 +Reload 5361440 3144 54 +Visit 5363600 938 +Visit 5363600 937 +Visit 5363600 936 +Offload 5363600 3645 89 +Offload 5367160 3144 18 +Reload 5367880 3915 107 +Offload 5372160 3162 36 +Offload 5373600 3461 48 +Reload 5375520 3598 84 +Offload 5378880 3509 29 +Offload 5380040 3778 32 +Reload 5381320 3281 61 +Visit 5383760 941 +Visit 5383760 940 +Visit 5383760 939 +Offload 5383760 3810 44 +Reload 5385520 4052 44 +Offload 5387280 3281 61 +Offload 5389720 3598 30 +Reload 5390920 3735 91 +Offload 5394560 3628 54 +Offload 5396720 3854 14 +Reload 5397280 3418 68 +Visit 5400000 944 +Visit 5400000 943 +Visit 5400000 942 +Offload 5400000 3868 10 +Offload 5400400 3915 41 +Reload 5402040 4189 51 +Offload 5404080 3418 68 +Offload 5406800 3735 16 +Reload 5407440 3872 84 +Offload 5410800 3751 75 +Reload 5413800 3555 75 +Visit 5416800 947 +Visit 5416800 946 +Visit 5416800 945 +Offload 5416800 3970 52 +Offload 5418880 4052 6 +Reload 5419120 4326 58 +Offload 5421440 3555 67 +Reload 5424120 4009 49 +Reload 5426080 4096 18 +Offload 5426800 3622 8 +Offload 5427120 3872 74 +Reload 5430080 3692 82 +Visit 5433360 950 +Visit 5433360 949 +Visit 5433360 948 +Offload 5433360 3946 24 +Offload 5434320 4189 41 +Reload 5435960 4463 65 +Offload 5438560 3692 42 +Reload 5440240 4146 42 +Offload 5441920 3734 40 +Offload 5443520 4009 49 +Reload 5445480 3829 89 +Visit 5449040 953 +Visit 5449040 952 +Visit 5449040 951 +Offload 5449040 4058 56 +Offload 5451280 4230 10 +Offload 5451680 4326 6 +Reload 5451920 4600 72 +Offload 5454800 3829 49 +Reload 5456760 4283 49 +Offload 5458720 3878 40 +Offload 5460320 4146 42 +Offload 5462000 4332 14 +Reload 5462560 3966 96 +Visit 5466400 956 +Visit 5466400 955 +Visit 5466400 954 +Offload 5466400 4346 38 +Offload 5467920 4463 41 +Reload 5469560 4737 79 +Offload 5472720 3966 56 +Reload 5474960 4420 56 +Offload 5477200 4022 40 +Offload 5478800 4283 49 +Offload 5480760 4504 14 +Reload 5481320 4103 103 +Visit 5485440 959 +Visit 5485440 958 +Visit 5485440 957 +Offload 5485440 4518 10 +Offload 5485840 4600 72 +Offload 5488720 4103 4 +Reload 5488880 4874 86 +Offload 5492320 4107 63 +Reload 5494840 4557 63 +Offload 5497360 4170 36 +Offload 5498800 4420 4 +Reload 5498960 4240 40 +Visit 5500560 962 +Visit 5500560 961 +Visit 5500560 960 +Offload 5500560 4424 52 +Offload 5502640 4737 41 +Reload 5504280 5011 93 +Offload 5508000 4240 40 +Offload 5509600 4557 30 +Reload 5510800 4694 70 +Offload 5513600 4587 33 +Offload 5514920 4778 14 +Reload 5515480 4377 47 +Visit 5517360 965 +Visit 5517360 964 +Visit 5517360 963 +Offload 5517360 4792 24 +Offload 5518320 4874 76 +Reload 5521360 5148 100 +Offload 5525360 4377 47 +Offload 5527240 4694 30 +Reload 5528440 4831 77 +Offload 5531520 4724 40 +Offload 5533120 4950 10 +Offload 5533520 5011 4 +Reload 5533680 4514 54 +Visit 5535840 968 +Visit 5535840 967 +Visit 5535840 966 +Offload 5535840 5015 89 +Offload 5539400 4514 18 +Reload 5540120 5285 107 +Offload 5544400 4532 36 +Offload 5545840 4831 48 +Reload 5547760 4968 84 +Offload 5551120 4879 29 +Offload 5552280 5148 32 +Reload 5553560 4651 61 +Visit 5556000 971 +Visit 5556000 970 +Visit 5556000 969 +Offload 5556000 5180 44 +Reload 5557760 5422 44 +Offload 5559520 4651 61 +Offload 5561960 4968 30 +Reload 5563160 5105 91 +Offload 5566800 4998 54 +Offload 5568960 5224 14 +Reload 5569520 4788 68 +Visit 5572240 974 +Visit 5572240 973 +Visit 5572240 972 +Offload 5572240 5238 10 +Offload 5572640 5285 41 +Reload 5574280 5559 51 +Offload 5576320 4788 68 +Offload 5579040 5105 16 +Reload 5579680 5242 84 +Offload 5583040 5121 75 +Reload 5586040 4925 75 +Visit 5589040 977 +Visit 5589040 976 +Visit 5589040 975 +Offload 5589040 5340 52 +Offload 5591120 5422 6 +Reload 5591360 5696 58 +Offload 5593680 4925 67 +Reload 5596360 5379 49 +Reload 5598320 5466 18 +Offload 5599040 4992 8 +Offload 5599360 5242 74 +Reload 5602320 5062 82 +Visit 5605600 980 +Visit 5605600 979 +Visit 5605600 978 +Offload 5605600 5316 24 +Offload 5606560 5559 41 +Reload 5608200 5833 65 +Offload 5610800 5062 42 +Reload 5612480 5516 42 +Offload 5614160 5104 40 +Offload 5615760 5379 49 +Reload 5617720 5199 89 +Visit 5621280 983 +Visit 5621280 982 +Visit 5621280 981 +Offload 5621280 5428 56 +Offload 5623520 5600 10 +Offload 5623920 5696 6 +Reload 5624160 5970 72 +Offload 5627040 5199 49 +Reload 5629000 5653 49 +Offload 5630960 5248 40 +Offload 5632560 5516 42 +Offload 5634240 5702 14 +Reload 5634800 5336 96 +Visit 5638640 986 +Visit 5638640 985 +Visit 5638640 984 +Offload 5638640 5716 38 +Offload 5640160 5833 41 +Reload 5641800 6107 79 +Offload 5644960 5336 56 +Reload 5647200 5790 56 +Offload 5649440 5392 40 +Offload 5651040 5653 49 +Offload 5653000 5874 14 +Reload 5653560 5473 103 +Visit 5657680 989 +Visit 5657680 988 +Visit 5657680 987 +Offload 5657680 5888 10 +Offload 5658080 5970 72 +Offload 5660960 5473 4 +Reload 5661120 6244 86 +Offload 5664560 5477 63 +Reload 5667080 5927 63 +Offload 5669600 5540 36 +Offload 5671040 5790 4 +Reload 5671200 5610 40 +Visit 5672800 992 +Visit 5672800 991 +Visit 5672800 990 +Offload 5672800 5794 52 +Offload 5674880 6107 41 +Reload 5676520 6381 93 +Offload 5680240 5610 40 +Offload 5681840 5927 30 +Reload 5683040 6064 70 +Offload 5685840 5957 33 +Offload 5687160 6148 14 +Reload 5687720 5747 47 +Visit 5689600 995 +Visit 5689600 994 +Visit 5689600 993 +Offload 5689600 6162 24 +Offload 5690560 6244 76 +Reload 5693600 6518 100 +Offload 5697600 5747 47 +Offload 5699480 6064 30 +Reload 5700680 6201 77 +Offload 5703760 6094 40 +Offload 5705360 6320 10 +Offload 5705760 6381 4 +Reload 5705920 5884 54 +Visit 5708080 998 +Visit 5708080 997 +Visit 5708080 996 +Offload 5708080 6385 89 +Offload 5711640 5884 18 +Reload 5712360 6655 107 +Offload 5716640 5902 36 +Offload 5718080 6201 48 +Reload 5720000 6338 84 +Offload 5723360 6249 29 +Offload 5724520 6518 32 +Reload 5725800 6021 61 +Visit 5728240 1001 +Visit 5728240 1000 +Visit 5728240 999 +Offload 5728240 6550 44 +Reload 5730000 6792 44 +Offload 5731760 6021 61 +Offload 5734200 6338 30 +Reload 5735400 6475 91 +Offload 5739040 6368 54 +Offload 5741200 6594 14 +Reload 5741760 6158 68 +Visit 5744480 1004 +Visit 5744480 1003 +Visit 5744480 1002 +Offload 5744480 6608 10 +Offload 5744880 6655 41 +Reload 5746520 6929 51 +Offload 5748560 6158 68 +Offload 5751280 6475 16 +Reload 5751920 6612 84 +Offload 5755280 6491 75 +Reload 5758280 6295 75 +Visit 5761280 1007 +Visit 5761280 1006 +Visit 5761280 1005 +Offload 5761280 6710 52 +Offload 5763360 6792 6 +Reload 5763600 7066 58 +Offload 5765920 6295 67 +Reload 5768600 6749 49 +Reload 5770560 6836 18 +Offload 5771280 6362 8 +Offload 5771600 6612 74 +Reload 5774560 6432 82 +Visit 5777840 1010 +Visit 5777840 1009 +Visit 5777840 1008 +Offload 5777840 6686 24 +Offload 5778800 6929 41 +Reload 5780440 7203 65 +Offload 5783040 6432 42 +Reload 5784720 6886 42 +Offload 5786400 6474 40 +Offload 5788000 6749 49 +Reload 5789960 6569 89 +Visit 5793520 1013 +Visit 5793520 1012 +Visit 5793520 1011 +Offload 5793520 6798 56 +Offload 5795760 6970 10 +Offload 5796160 7066 6 +Reload 5796400 7340 72 +Offload 5799280 6569 49 +Reload 5801240 7023 49 +Offload 5803200 6618 40 +Offload 5804800 6886 42 +Offload 5806480 7072 14 +Reload 5807040 6706 96 +Visit 5810880 1016 +Visit 5810880 1015 +Visit 5810880 1014 +Offload 5810880 7086 38 +Offload 5812400 7203 41 +Reload 5814040 7477 79 +Offload 5817200 6706 56 +Reload 5819440 7160 56 +Offload 5821680 6762 40 +Offload 5823280 7023 49 +Offload 5825240 7244 14 +Reload 5825800 6843 103 +Visit 5829920 1019 +Visit 5829920 1018 +Visit 5829920 1017 +Offload 5829920 7258 10 +Offload 5830320 7340 72 +Offload 5833200 6843 4 +Reload 5833360 7614 86 +Offload 5836800 6847 63 +Reload 5839320 7297 63 +Offload 5841840 6910 36 +Offload 5843280 7160 4 +Reload 5843440 6980 40 +Visit 5845040 1022 +Visit 5845040 1021 +Visit 5845040 1020 +Offload 5845040 7164 52 +Offload 5847120 7477 41 +Reload 5848760 7751 93 +Offload 5852480 6980 40 +Offload 5854080 7297 30 +Reload 5855280 7434 70 +Offload 5858080 7327 33 +Offload 5859400 7518 14 +Reload 5859960 7117 47 +Visit 5861840 1025 +Visit 5861840 1024 +Visit 5861840 1023 +Offload 5861840 7532 24 +Offload 5862800 7614 76 +Reload 5865840 7888 100 +Offload 5869840 7117 47 +Offload 5871720 7434 30 +Reload 5872920 7571 77 +Offload 5876000 7464 40 +Offload 5877600 7690 10 +Offload 5878000 7751 4 +Reload 5878160 7254 54 +Visit 5880320 1028 +Visit 5880320 1027 +Visit 5880320 1026 +Offload 5880320 7755 89 +Offload 5883880 7254 18 +Reload 5884600 8025 107 +Offload 5888880 7272 36 +Offload 5890320 7571 48 +Reload 5892240 7708 84 +Offload 5895600 7619 29 +Offload 5896760 7888 32 +Reload 5898040 7391 61 +Visit 5900480 1031 +Visit 5900480 1030 +Visit 5900480 1029 +Offload 5900480 7920 44 +Reload 5902240 8162 44 +Offload 5904000 7391 61 +Offload 5906440 7708 30 +Reload 5907640 7845 91 +Offload 5911280 7738 54 +Offload 5913440 7964 14 +Reload 5914000 7528 68 +Visit 5916720 1034 +Visit 5916720 1033 +Visit 5916720 1032 +Offload 5916720 7978 10 +Offload 5917120 8025 41 +Reload 5918760 8299 51 +Offload 5920800 7528 68 +Offload 5923520 7845 16 +Reload 5924160 7982 84 +Offload 5927520 7861 75 +Reload 5930520 7665 75 +Visit 5933520 1037 +Visit 5933520 1036 +Visit 5933520 1035 +Offload 5933520 8080 52 +Offload 5935600 8162 6 +Reload 5935840 8436 58 +Offload 5938160 7665 67 +Reload 5940840 8119 49 +Reload 5942800 8206 18 +Offload 5943520 7732 8 +Offload 5943840 7982 74 +Reload 5946800 7802 82 +Visit 5950080 1040 +Visit 5950080 1039 +Visit 5950080 1038 +Offload 5950080 8056 24 +Offload 5951040 8299 41 +Reload 5952680 8573 65 +Offload 5955280 7802 42 +Reload 5956960 8256 42 +Offload 5958640 7844 40 +Offload 5960240 8119 49 +Reload 5962200 7939 89 +Visit 5965760 1043 +Visit 5965760 1042 +Visit 5965760 1041 +Offload 5965760 8168 56 +Offload 5968000 8340 10 +Offload 5968400 8436 6 +Reload 5968640 8710 72 +Offload 5971520 7939 49 +Reload 5973480 8393 49 +Offload 5975440 7988 40 +Offload 5977040 8256 42 +Offload 5978720 8442 14 +Reload 5979280 8076 96 +Visit 5983120 1046 +Visit 5983120 1045 +Visit 5983120 1044 +Offload 5983120 8456 38 +Offload 5984640 8573 41 +Reload 5986280 8847 79 +Offload 5989440 8076 56 +Reload 5991680 8530 56 +Offload 5993920 8132 40 +Offload 5995520 8393 49 +Offload 5997480 8614 14 +Reload 5998040 8213 103 +Visit 6002160 1049 +Visit 6002160 1048 +Visit 6002160 1047 +Offload 6002160 8628 10 +Offload 6002560 8710 72 +Offload 6005440 8213 4 +Reload 6005600 8984 86 +Offload 6009040 8217 63 +Reload 6011560 8667 63 +Offload 6014080 8280 36 +Offload 6015520 8530 4 +Reload 6015680 8350 40 +Visit 6017280 1052 +Visit 6017280 1051 +Visit 6017280 1050 +Offload 6017280 8534 52 +Offload 6019360 8847 41 +Reload 6021000 9121 93 +Offload 6024720 8350 40 +Offload 6026320 8667 30 +Reload 6027520 8804 70 +Offload 6030320 8697 33 +Offload 6031640 8888 14 +Reload 6032200 8487 47 +Visit 6034080 1055 +Visit 6034080 1054 +Visit 6034080 1053 +Offload 6034080 8902 24 +Offload 6035040 8984 76 +Reload 6038080 9258 100 +Offload 6042080 8487 47 +Offload 6043960 8804 30 +Reload 6045160 8941 77 +Offload 6048240 8834 40 +Offload 6049840 9060 10 +Offload 6050240 9121 4 +Reload 6050400 8624 54 +Visit 6052560 1058 +Visit 6052560 1057 +Visit 6052560 1056 +Offload 6052560 9125 89 +Offload 6056120 8624 18 +Reload 6056840 9395 107 +Offload 6061120 8642 36 +Offload 6062560 8941 48 +Reload 6064480 9078 84 +Offload 6067840 8989 29 +Offload 6069000 9258 32 +Reload 6070280 8761 61 +Visit 6072720 1061 +Visit 6072720 1060 +Visit 6072720 1059 +Offload 6072720 9290 44 +Reload 6074480 9532 44 +Offload 6076240 8761 61 +Offload 6078680 9078 30 +Reload 6079880 9215 91 +Offload 6083520 9108 54 +Offload 6085680 9334 14 +Reload 6086240 8898 68 +Visit 6088960 1064 +Visit 6088960 1063 +Visit 6088960 1062 +Offload 6088960 9348 10 +Offload 6089360 9395 41 +Reload 6091000 9669 51 +Offload 6093040 8898 68 +Offload 6095760 9215 16 +Reload 6096400 9352 84 +Offload 6099760 9231 75 +Reload 6102760 9035 75 +Visit 6105760 1067 +Visit 6105760 1066 +Visit 6105760 1065 +Offload 6105760 9450 52 +Offload 6107840 9532 6 +Reload 6108080 9806 58 +Offload 6110400 9035 67 +Reload 6113080 9489 49 +Reload 6115040 9576 18 +Offload 6115760 9102 8 +Offload 6116080 9352 74 +Reload 6119040 9172 82 +Visit 6122320 1070 +Visit 6122320 1069 +Visit 6122320 1068 +Offload 6122320 9426 24 +Offload 6123280 9669 41 +Reload 6124920 9943 65 +Offload 6127520 9172 42 +Reload 6129200 9626 42 +Offload 6130880 9214 40 +Offload 6132480 9489 49 +Reload 6134440 9309 89 +Visit 6138000 1073 +Visit 6138000 1072 +Visit 6138000 1071 +Offload 6138000 9538 56 +Offload 6140240 9710 10 +Offload 6140640 9806 6 +Reload 6140880 10080 72 +Offload 6143760 9309 49 +Reload 6145720 9763 49 +Offload 6147680 9358 40 +Offload 6149280 9626 42 +Offload 6150960 9812 14 +Reload 6151520 9446 96 +Visit 6155360 1076 +Visit 6155360 1075 +Visit 6155360 1074 +Offload 6155360 9826 38 +Offload 6156880 9943 41 +Reload 6158520 10217 79 +Offload 6161680 9446 56 +Reload 6163920 9900 56 +Offload 6166160 9502 40 +Offload 6167760 9763 49 +Offload 6169720 9984 14 +Reload 6170280 9583 103 +Visit 6174400 1079 +Visit 6174400 1078 +Visit 6174400 1077 +Offload 6174400 9998 10 +Offload 6174800 10080 72 +Offload 6177680 9583 4 +Reload 6177840 10354 86 +Offload 6181280 9587 63 +Reload 6183800 10037 63 +Offload 6186320 9650 36 +Offload 6187760 9900 4 +Reload 6187920 9720 40 +Visit 6189520 1082 +Visit 6189520 1081 +Visit 6189520 1080 +Offload 6189520 9904 52 +Offload 6191600 10217 41 +Reload 6193240 10491 93 +Offload 6196960 9720 40 +Offload 6198560 10037 30 +Reload 6199760 10174 70 +Offload 6202560 10067 33 +Offload 6203880 10258 14 +Reload 6204440 9857 47 +Visit 6206320 1085 +Visit 6206320 1084 +Visit 6206320 1083 +Offload 6206320 10272 24 +Offload 6207280 10354 76 +Reload 6210320 10628 100 +Offload 6214320 9857 47 +Offload 6216200 10174 30 +Reload 6217400 10311 77 +Offload 6220480 10204 40 +Offload 6222080 10430 10 +Offload 6222480 10491 4 +Reload 6222640 9994 54 +Visit 6224800 1088 +Visit 6224800 1087 +Visit 6224800 1086 +Offload 6224800 10495 89 +Offload 6228360 9994 18 +Reload 6229080 10765 107 +Offload 6233360 10012 36 +Offload 6234800 10311 48 +Reload 6236720 10448 84 +Offload 6240080 10359 29 +Offload 6241240 10628 32 +Reload 6242520 10131 61 +Visit 6244960 1091 +Visit 6244960 1090 +Visit 6244960 1089 +Offload 6244960 10660 44 +Reload 6246720 10902 44 +Offload 6248480 10131 61 +Offload 6250920 10448 30 +Reload 6252120 10585 91 +Offload 6255760 10478 54 +Offload 6257920 10704 14 +Reload 6258480 10268 68 +Visit 6261200 1094 +Visit 6261200 1093 +Visit 6261200 1092 +Offload 6261200 10718 10 +Offload 6261600 10765 41 +Reload 6263240 11039 51 +Offload 6265280 10268 68 +Offload 6268000 10585 16 +Reload 6268640 10722 84 +Offload 6272000 10601 75 +Reload 6275000 10405 75 +Visit 6278000 1097 +Visit 6278000 1096 +Visit 6278000 1095 +Offload 6278000 10820 52 +Offload 6280080 10902 6 +Reload 6280320 11176 58 +Offload 6282640 10405 67 +Reload 6285320 10859 49 +Reload 6287280 10946 18 +Offload 6288000 10472 8 +Offload 6288320 10722 74 +Reload 6291280 10542 82 +Visit 6294560 1100 +Visit 6294560 1099 +Visit 6294560 1098 +Offload 6294560 10796 24 +Offload 6295520 11039 41 +Reload 6297160 11313 65 +Offload 6299760 10542 42 +Reload 6301440 10996 42 +Offload 6303120 10584 40 +Offload 6304720 10859 49 +Reload 6306680 10679 89 +Visit 6310240 1103 +Visit 6310240 1102 +Visit 6310240 1101 +Offload 6310240 10908 56 +Offload 6312480 11080 10 +Offload 6312880 11176 6 +Reload 6313120 11450 72 +Offload 6316000 10679 49 +Reload 6317960 11133 49 +Offload 6319920 10728 40 +Offload 6321520 10996 42 +Offload 6323200 11182 14 +Reload 6323760 10816 96 +Visit 6327600 1106 +Visit 6327600 1105 +Visit 6327600 1104 +Offload 6327600 11196 38 +Offload 6329120 11313 41 +Reload 6330760 11587 79 +Offload 6333920 10816 56 +Reload 6336160 11270 56 +Offload 6338400 10872 40 +Offload 6340000 11133 49 +Offload 6341960 11354 14 +Reload 6342520 10953 103 +Visit 6346640 1109 +Visit 6346640 1108 +Visit 6346640 1107 +Offload 6346640 11368 10 +Offload 6347040 11450 72 +Offload 6349920 10953 4 +Reload 6350080 11724 86 +Offload 6353520 10957 63 +Reload 6356040 11407 63 +Offload 6358560 11020 36 +Offload 6360000 11270 4 +Reload 6360160 11090 40 +Visit 6361760 1112 +Visit 6361760 1111 +Visit 6361760 1110 +Offload 6361760 11274 52 +Offload 6363840 11587 41 +Reload 6365480 11861 93 +Offload 6369200 11090 40 +Offload 6370800 11407 30 +Reload 6372000 11544 70 +Offload 6374800 11437 33 +Offload 6376120 11628 14 +Reload 6376680 11227 47 +Visit 6378560 1115 +Visit 6378560 1114 +Visit 6378560 1113 +Offload 6378560 11642 24 +Offload 6379520 11724 76 +Reload 6382560 11998 100 +Offload 6386560 11227 47 +Offload 6388440 11544 30 +Reload 6389640 11681 77 +Offload 6392720 11574 40 +Offload 6394320 11800 10 +Offload 6394720 11861 4 +Reload 6394880 11364 54 +Visit 6397040 1118 +Visit 6397040 1117 +Visit 6397040 1116 +Offload 6397040 11865 89 +Offload 6400600 11364 18 +Reload 6401320 12135 107 +Offload 6405600 11382 36 +Offload 6407040 11681 48 +Reload 6408960 11818 84 +Offload 6412320 11729 29 +Offload 6413480 11998 32 +Reload 6414760 11501 61 +Visit 6417200 1121 +Visit 6417200 1120 +Visit 6417200 1119 +Offload 6417200 12030 44 +Reload 6418960 12272 44 +Offload 6420720 11501 61 +Offload 6423160 11818 30 +Reload 6424360 11955 91 +Offload 6428000 11848 54 +Offload 6430160 12074 14 +Reload 6430720 11638 68 +Visit 6433440 1124 +Visit 6433440 1123 +Visit 6433440 1122 +Offload 6433440 12088 10 +Offload 6433840 12135 41 +Reload 6435480 12409 51 +Offload 6437520 11638 68 +Offload 6440240 11955 16 +Reload 6440880 12092 84 +Offload 6444240 11971 75 +Reload 6447240 11775 75 +Visit 6450240 1127 +Visit 6450240 1126 +Visit 6450240 1125 +Offload 6450240 12190 52 +Offload 6452320 12272 6 +Reload 6452560 12546 58 +Offload 6454880 11775 67 +Reload 6457560 12229 49 +Reload 6459520 12316 18 +Offload 6460240 11842 8 +Offload 6460560 12092 74 +Reload 6463520 11912 82 +Visit 6466800 1130 +Visit 6466800 1129 +Visit 6466800 1128 +Offload 6466800 12166 24 +Offload 6467760 12409 41 +Reload 6469400 12683 65 +Offload 6472000 11912 42 +Reload 6473680 12366 42 +Offload 6475360 11954 40 +Offload 6476960 12229 49 +Reload 6478920 12049 89 +Visit 6482480 1133 +Visit 6482480 1132 +Visit 6482480 1131 +Offload 6482480 12278 56 +Offload 6484720 12450 10 +Offload 6485120 12546 6 +Reload 6485360 12820 72 +Offload 6488240 12049 49 +Reload 6490200 12503 49 +Offload 6492160 12098 40 +Offload 6493760 12366 42 +Offload 6495440 12552 14 +Reload 6496000 12186 96 +Visit 6499840 1136 +Visit 6499840 1135 +Visit 6499840 1134 +Offload 6499840 12566 38 +Offload 6501360 12683 41 +Reload 6503000 12957 79 +Offload 6506160 12186 56 +Reload 6508400 12640 56 +Offload 6510640 12242 40 +Offload 6512240 12503 49 +Offload 6514200 12724 14 +Reload 6514760 12323 103 +Visit 6518880 1139 +Visit 6518880 1138 +Visit 6518880 1137 +Offload 6518880 12738 10 +Offload 6519280 12820 72 +Offload 6522160 12323 4 +Reload 6522320 13094 86 +Offload 6525760 12327 63 +Reload 6528280 12777 63 +Offload 6530800 12390 36 +Offload 6532240 12640 4 +Reload 6532400 12460 40 +Visit 6534000 1142 +Visit 6534000 1141 +Visit 6534000 1140 +Offload 6534000 12644 52 +Offload 6536080 12957 41 +Reload 6537720 13231 93 +Offload 6541440 12460 40 +Offload 6543040 12777 30 +Reload 6544240 12914 70 +Offload 6547040 12807 33 +Offload 6548360 12998 14 +Reload 6548920 12597 47 +Visit 6550800 1145 +Visit 6550800 1144 +Visit 6550800 1143 +Offload 6550800 13012 24 +Offload 6551760 13094 76 +Reload 6554800 13368 100 +Offload 6558800 12597 47 +Offload 6560680 12914 30 +Reload 6561880 13051 77 +Offload 6564960 12944 40 +Offload 6566560 13170 10 +Offload 6566960 13231 4 +Reload 6567120 12734 54 +Visit 6569280 1148 +Visit 6569280 1147 +Visit 6569280 1146 +Offload 6569280 13235 89 +Offload 6572840 12734 18 +Reload 6573560 13505 107 +Offload 6577840 12752 36 +Offload 6579280 13051 48 +Reload 6581200 13188 84 +Offload 6584560 13099 29 +Offload 6585720 13368 32 +Reload 6587000 12871 61 +Visit 6589440 1151 +Visit 6589440 1150 +Visit 6589440 1149 +Offload 6589440 13400 44 +Reload 6591200 13642 44 +Offload 6592960 12871 61 +Offload 6595400 13188 30 +Reload 6596600 13325 91 +Offload 6600240 13218 54 +Offload 6602400 13444 14 +Reload 6602960 13008 68 +Visit 6605680 1154 +Visit 6605680 1153 +Visit 6605680 1152 +Offload 6605680 13458 10 +Offload 6606080 13505 41 +Reload 6607720 13779 51 +Offload 6609760 13008 68 +Offload 6612480 13325 16 +Reload 6613120 13462 84 +Offload 6616480 13341 75 +Reload 6619480 13145 75 +Visit 6622480 1157 +Visit 6622480 1156 +Visit 6622480 1155 +Offload 6622480 13560 52 +Offload 6624560 13642 6 +Reload 6624800 13916 58 +Offload 6627120 13145 67 +Reload 6629800 13599 49 +Reload 6631760 13686 18 +Offload 6632480 13212 8 +Offload 6632800 13462 74 +Reload 6635760 13282 82 +Visit 6639040 1160 +Visit 6639040 1159 +Visit 6639040 1158 +Offload 6639040 13536 24 +Offload 6640000 13779 41 +Reload 6641640 14053 65 +Offload 6644240 13282 42 +Reload 6645920 13736 42 +Offload 6647600 13324 40 +Offload 6649200 13599 49 +Reload 6651160 13419 89 +Visit 6654720 1163 +Visit 6654720 1162 +Visit 6654720 1161 +Offload 6654720 13648 56 +Offload 6656960 13820 10 +Offload 6657360 13916 6 +Reload 6657600 14190 72 +Offload 6660480 13419 49 +Reload 6662440 13873 49 +Offload 6664400 13468 40 +Offload 6666000 13736 42 +Offload 6667680 13922 14 +Reload 6668240 13556 96 +Visit 6672080 1166 +Visit 6672080 1165 +Visit 6672080 1164 +Offload 6672080 13936 38 +Offload 6673600 14053 41 +Reload 6675240 14327 79 +Offload 6678400 13556 56 +Reload 6680640 14010 56 +Offload 6682880 13612 40 +Offload 6684480 13873 49 +Offload 6686440 14094 14 +Reload 6687000 13693 103 +Visit 6691120 1169 +Visit 6691120 1168 +Visit 6691120 1167 +Offload 6691120 14108 10 +Offload 6691520 14190 72 +Offload 6694400 13693 4 +Reload 6694560 14464 86 +Offload 6698000 13697 63 +Reload 6700520 14147 63 +Offload 6703040 13760 36 +Offload 6704480 14010 4 +Reload 6704640 13830 40 +Visit 6706240 1172 +Visit 6706240 1171 +Visit 6706240 1170 +Offload 6706240 14014 52 +Offload 6708320 14327 41 +Reload 6709960 14601 93 +Offload 6713680 13830 40 +Offload 6715280 14147 30 +Reload 6716480 14284 70 +Offload 6719280 14177 33 +Offload 6720600 14368 14 +Reload 6721160 13967 47 +Visit 6723040 1175 +Visit 6723040 1174 +Visit 6723040 1173 +Offload 6723040 14382 24 +Offload 6724000 14464 76 +Reload 6727040 14738 100 +Offload 6731040 13967 47 +Offload 6732920 14284 30 +Reload 6734120 14421 77 +Offload 6737200 14314 40 +Offload 6738800 14540 10 +Offload 6739200 14601 4 +Reload 6739360 14104 54 +Visit 6741520 1178 +Visit 6741520 1177 +Visit 6741520 1176 +Offload 6741520 14605 89 +Offload 6745080 14104 18 +Reload 6745800 14875 107 +Offload 6750080 14122 36 +Offload 6751520 14421 48 +Reload 6753440 14558 84 +Offload 6756800 14469 29 +Offload 6757960 14738 32 +Reload 6759240 14241 61 +Visit 6761680 1181 +Visit 6761680 1180 +Visit 6761680 1179 +Offload 6761680 14770 44 +Reload 6763440 15012 44 +Offload 6765200 14241 61 +Offload 6767640 14558 30 +Reload 6768840 14695 91 +Offload 6772480 14588 54 +Offload 6774640 14814 14 +Reload 6775200 14378 68 +Visit 6777920 1184 +Visit 6777920 1183 +Visit 6777920 1182 +Offload 6777920 14828 10 +Offload 6778320 14875 41 +Reload 6779960 15149 51 +Offload 6782000 14378 68 +Offload 6784720 14695 16 +Reload 6785360 14832 84 +Offload 6788720 14711 75 +Reload 6791720 14515 75 +Visit 6794720 1187 +Visit 6794720 1186 +Visit 6794720 1185 +Offload 6794720 14930 52 +Offload 6796800 15012 6 +Reload 6797040 15286 58 +Offload 6799360 14515 67 +Reload 6802040 14969 49 +Reload 6804000 15056 18 +Offload 6804720 14582 8 +Offload 6805040 14832 74 +Reload 6808000 14652 82 +Visit 6811280 1190 +Visit 6811280 1189 +Visit 6811280 1188 +Offload 6811280 14906 24 +Offload 6812240 15149 41 +Reload 6813880 15423 65 +Offload 6816480 14652 42 +Reload 6818160 15106 42 +Offload 6819840 14694 40 +Offload 6821440 14969 49 +Reload 6823400 14789 89 +Visit 6826960 1193 +Visit 6826960 1192 +Visit 6826960 1191 +Offload 6826960 15018 56 +Offload 6829200 15190 10 +Offload 6829600 15286 6 +Reload 6829840 15560 72 +Offload 6832720 14789 49 +Reload 6834680 15243 49 +Offload 6836640 14838 40 +Offload 6838240 15106 42 +Offload 6839920 15292 14 +Reload 6840480 14926 96 +Visit 6844320 1196 +Visit 6844320 1195 +Visit 6844320 1194 +Offload 6844320 15306 38 +Offload 6845840 15423 41 +Reload 6847480 15697 79 +Offload 6850640 14926 56 +Reload 6852880 15380 56 +Offload 6855120 14982 40 +Offload 6856720 15243 49 +Offload 6858680 15464 14 +Reload 6859240 15063 103 +Visit 6863360 1199 +Visit 6863360 1198 +Visit 6863360 1197 +Offload 6863360 15478 10 +Offload 6863760 15560 72 +Offload 6866640 15063 4 +Reload 6866800 15834 86 +Offload 6870240 15067 63 +Reload 6872760 15517 63 +Offload 6875280 15130 36 +Offload 6876720 15380 4 +Reload 6876880 15200 40 +Visit 6878480 1202 +Visit 6878480 1201 +Visit 6878480 1200 +Offload 6878480 15384 52 +Offload 6880560 15697 41 +Reload 6882200 15971 93 +Offload 6885920 15200 40 +Offload 6887520 15517 30 +Reload 6888720 15654 70 +Offload 6891520 15547 33 +Offload 6892840 15738 14 +Reload 6893400 15337 47 +Visit 6895280 1205 +Visit 6895280 1204 +Visit 6895280 1203 +Offload 6895280 15752 24 +Offload 6896240 15834 76 +Reload 6899280 16108 100 +Offload 6903280 15337 47 +Offload 6905160 15654 30 +Reload 6906360 15791 77 +Offload 6909440 15684 40 +Offload 6911040 15910 10 +Offload 6911440 15971 4 +Reload 6911600 15474 54 +Visit 6913760 1208 +Visit 6913760 1207 +Visit 6913760 1206 +Offload 6913760 15975 89 +Offload 6917320 15474 18 +Reload 6918040 16245 107 +Offload 6922320 15492 36 +Offload 6923760 15791 48 +Reload 6925680 15928 84 +Offload 6929040 15839 29 +Offload 6930200 16108 32 +Reload 6931480 15611 61 +Visit 6933920 1211 +Visit 6933920 1210 +Visit 6933920 1209 +Offload 6933920 16140 44 +Reload 6935680 16382 44 +Offload 6937440 15611 61 +Offload 6939880 15928 30 +Reload 6941080 16065 91 +Offload 6944720 15958 54 +Offload 6946880 16184 14 +Reload 6947440 15748 68 +Visit 6950160 1214 +Visit 6950160 1213 +Visit 6950160 1212 +Offload 6950160 16198 10 +Offload 6950560 16245 41 +Reload 6952200 16519 51 +Offload 6954240 15748 68 +Offload 6956960 16065 16 +Reload 6957600 16202 84 +Offload 6960960 16081 75 +Reload 6963960 15885 75 +Visit 6966960 1217 +Visit 6966960 1216 +Visit 6966960 1215 +Offload 6966960 16300 52 +Offload 6969040 16382 6 +Reload 6969280 16656 58 +Offload 6971600 15885 67 +Reload 6974280 16339 49 +Reload 6976240 16426 18 +Offload 6976960 15952 8 +Offload 6977280 16202 74 +Reload 6980240 16022 82 +Visit 6983520 1220 +Visit 6983520 1219 +Visit 6983520 1218 +Offload 6983520 16276 24 +Offload 6984480 16519 41 +Reload 6986120 16793 65 +Offload 6988720 16022 42 +Reload 6990400 16476 42 +Offload 6992080 16064 40 +Offload 6993680 16339 49 +Reload 6995640 16159 89 +Visit 6999200 1223 +Visit 6999200 1222 +Visit 6999200 1221 +Offload 6999200 16388 56 +Offload 7001440 16560 10 +Offload 7001840 16656 6 +Reload 7002080 16930 72 +Offload 7004960 16159 49 +Reload 7006920 16613 49 +Offload 7008880 16208 40 +Offload 7010480 16476 42 +Offload 7012160 16662 14 +Reload 7012720 16296 96 +Visit 7016560 1226 +Visit 7016560 1225 +Visit 7016560 1224 +Offload 7016560 16676 38 +Offload 7018080 16793 41 +Reload 7019720 17067 79 +Offload 7022880 16296 56 +Reload 7025120 16750 56 +Offload 7027360 16352 40 +Offload 7028960 16613 49 +Offload 7030920 16834 14 +Reload 7031480 16433 103 +Visit 7035600 1229 +Visit 7035600 1228 +Visit 7035600 1227 +Offload 7035600 16848 10 +Offload 7036000 16930 72 +Offload 7038880 16433 4 +Reload 7039040 17204 86 +Offload 7042480 16437 63 +Reload 7045000 16887 63 +Offload 7047520 16500 36 +Offload 7048960 16750 4 +Reload 7049120 16570 40 +Visit 7050720 1232 +Visit 7050720 1231 +Visit 7050720 1230 +Offload 7050720 16754 52 +Offload 7052800 17067 41 +Reload 7054440 17341 93 +Offload 7058160 16570 40 +Offload 7059760 16887 30 +Reload 7060960 17024 70 +Offload 7063760 16917 33 +Offload 7065080 17108 14 +Reload 7065640 16707 47 +Visit 7067520 1235 +Visit 7067520 1234 +Visit 7067520 1233 +Offload 7067520 17122 24 +Offload 7068480 17204 76 +Reload 7071520 17478 100 +Offload 7075520 16707 47 +Offload 7077400 17024 30 +Reload 7078600 17161 77 +Offload 7081680 17054 40 +Offload 7083280 17280 10 +Offload 7083680 17341 4 +Reload 7083840 16844 54 +Visit 7086000 1238 +Visit 7086000 1237 +Visit 7086000 1236 +Offload 7086000 17345 89 +Offload 7089560 16844 18 +Reload 7090280 17615 107 +Offload 7094560 16862 36 +Offload 7096000 17161 48 +Reload 7097920 17298 84 +Offload 7101280 17209 29 +Offload 7102440 17478 32 +Reload 7103720 16981 61 +Visit 7106160 1241 +Visit 7106160 1240 +Visit 7106160 1239 +Offload 7106160 17510 44 +Reload 7107920 17752 44 +Offload 7109680 16981 61 +Offload 7112120 17298 30 +Reload 7113320 17435 91 +Offload 7116960 17328 54 +Offload 7119120 17554 14 +Reload 7119680 17118 68 +Visit 7122400 1244 +Visit 7122400 1243 +Visit 7122400 1242 +Offload 7122400 17568 10 +Offload 7122800 17615 41 +Reload 7124440 17889 51 +Offload 7126480 17118 68 +Offload 7129200 17435 16 +Reload 7129840 17572 84 +Offload 7133200 17451 75 +Reload 7136200 17255 75 +Visit 7139200 1247 +Visit 7139200 1246 +Visit 7139200 1245 +Offload 7139200 17670 52 +Offload 7141280 17752 6 +Reload 7141520 18026 58 +Offload 7143840 17255 67 +Reload 7146520 17709 49 +Reload 7148480 17796 18 +Offload 7149200 17322 8 +Offload 7149520 17572 74 +Reload 7152480 17392 82 +Visit 7155760 1250 +Visit 7155760 1249 +Visit 7155760 1248 +Offload 7155760 17646 24 +Offload 7156720 17889 41 +Reload 7158360 18163 65 +Offload 7160960 17392 42 +Reload 7162640 17846 42 +Offload 7164320 17434 40 +Offload 7165920 17709 49 +Reload 7167880 17529 89 +Visit 7171440 1253 +Visit 7171440 1252 +Visit 7171440 1251 +Offload 7171440 17758 56 +Offload 7173680 17930 10 +Offload 7174080 18026 6 +Reload 7174320 18300 72 +Offload 7177200 17529 49 +Reload 7179160 17983 49 +Offload 7181120 17578 40 +Offload 7182720 17846 42 +Offload 7184400 18032 14 +Reload 7184960 17666 96 +Visit 7188800 1256 +Visit 7188800 1255 +Visit 7188800 1254 +Offload 7188800 18046 38 +Offload 7190320 18163 41 +Reload 7191960 18437 79 +Offload 7195120 17666 56 +Reload 7197360 18120 56 +Offload 7199600 17722 40 +Offload 7201200 17983 49 +Offload 7203160 18204 14 +Reload 7203720 17803 103 +Visit 7207840 1259 +Visit 7207840 1258 +Visit 7207840 1257 +Fin 7208365 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out.planner_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out.planner_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..4394fbc51ab3ffd423c1c7006ddb32c8accdec80 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/mega_multiseg.out.planner_tmp" @@ -0,0 +1,4989 @@ +Reload 0 634 86 +Reload 3440 317 63 +Reload 5960 0 40 +Visit 7560 2 +Visit 7560 1 +Visit 7560 0 +Reload 7560 771 93 +Offload 11280 0 32 +Reload 12560 454 70 +Offload 15360 32 8 +Offload 15680 317 39 +Reload 17240 137 47 +Visit 19120 5 +Visit 19120 4 +Visit 19120 3 +Offload 19120 356 24 +Offload 20080 634 76 +Reload 23120 908 100 +Offload 27120 137 47 +Offload 29000 454 30 +Reload 30200 591 77 +Offload 33280 484 40 +Offload 34880 710 10 +Offload 35280 771 4 +Reload 35440 274 54 +Visit 37600 8 +Visit 37600 7 +Visit 37600 6 +Offload 37600 775 89 +Offload 41160 274 18 +Reload 41880 1045 107 +Offload 46160 292 36 +Offload 47600 591 48 +Reload 49520 728 84 +Offload 52880 639 29 +Offload 54040 908 32 +Reload 55320 411 61 +Visit 57760 11 +Visit 57760 10 +Visit 57760 9 +Offload 57760 940 44 +Reload 59520 1182 44 +Offload 61280 411 61 +Offload 63720 728 30 +Reload 64920 865 91 +Offload 68560 758 54 +Offload 70720 984 14 +Reload 71280 548 68 +Visit 74000 14 +Visit 74000 13 +Visit 74000 12 +Offload 74000 998 10 +Offload 74400 1045 41 +Reload 76040 1319 51 +Offload 78080 548 68 +Offload 80800 865 16 +Reload 81440 1002 84 +Offload 84800 881 75 +Reload 87800 685 75 +Visit 90800 17 +Visit 90800 16 +Visit 90800 15 +Offload 90800 1100 52 +Offload 92880 1182 6 +Reload 93120 1456 58 +Offload 95440 685 67 +Reload 98120 1139 49 +Reload 100080 1226 18 +Offload 100800 752 8 +Offload 101120 1002 74 +Reload 104080 822 82 +Visit 107360 20 +Visit 107360 19 +Visit 107360 18 +Offload 107360 1076 24 +Offload 108320 1319 41 +Reload 109960 1593 65 +Offload 112560 822 42 +Reload 114240 1276 42 +Offload 115920 864 40 +Offload 117520 1139 49 +Reload 119480 959 89 +Visit 123040 23 +Visit 123040 22 +Visit 123040 21 +Offload 123040 1188 56 +Offload 125280 1360 10 +Offload 125680 1456 6 +Reload 125920 1730 72 +Offload 128800 959 49 +Reload 130760 1413 49 +Offload 132720 1008 40 +Offload 134320 1276 42 +Offload 136000 1462 14 +Reload 136560 1096 96 +Visit 140400 26 +Visit 140400 25 +Visit 140400 24 +Offload 140400 1476 38 +Offload 141920 1593 41 +Reload 143560 1867 79 +Offload 146720 1096 56 +Reload 148960 1550 56 +Offload 151200 1152 40 +Offload 152800 1413 49 +Offload 154760 1634 14 +Reload 155320 1233 103 +Visit 159440 29 +Visit 159440 28 +Visit 159440 27 +Offload 159440 1648 10 +Offload 159840 1730 72 +Offload 162720 1233 4 +Reload 162880 2004 86 +Offload 166320 1237 63 +Reload 168840 1687 63 +Offload 171360 1300 36 +Offload 172800 1550 4 +Reload 172960 1370 40 +Visit 174560 32 +Visit 174560 31 +Visit 174560 30 +Offload 174560 1554 52 +Offload 176640 1867 41 +Reload 178280 2141 93 +Offload 182000 1370 40 +Offload 183600 1687 30 +Reload 184800 1824 70 +Offload 187600 1717 33 +Offload 188920 1908 14 +Reload 189480 1507 47 +Visit 191360 35 +Visit 191360 34 +Visit 191360 33 +Offload 191360 1922 24 +Offload 192320 2004 76 +Reload 195360 2278 100 +Offload 199360 1507 47 +Offload 201240 1824 30 +Reload 202440 1961 77 +Offload 205520 1854 40 +Offload 207120 2080 10 +Offload 207520 2141 4 +Reload 207680 1644 54 +Visit 209840 38 +Visit 209840 37 +Visit 209840 36 +Offload 209840 2145 89 +Offload 213400 1644 18 +Reload 214120 2415 107 +Offload 218400 1662 36 +Offload 219840 1961 48 +Reload 221760 2098 84 +Offload 225120 2009 29 +Offload 226280 2278 32 +Reload 227560 1781 61 +Visit 230000 41 +Visit 230000 40 +Visit 230000 39 +Offload 230000 2310 44 +Reload 231760 2552 44 +Offload 233520 1781 61 +Offload 235960 2098 30 +Reload 237160 2235 91 +Offload 240800 2128 54 +Offload 242960 2354 14 +Reload 243520 1918 68 +Visit 246240 44 +Visit 246240 43 +Visit 246240 42 +Offload 246240 2368 10 +Offload 246640 2415 41 +Reload 248280 2689 51 +Offload 250320 1918 68 +Offload 253040 2235 16 +Reload 253680 2372 84 +Offload 257040 2251 75 +Reload 260040 2055 75 +Visit 263040 47 +Visit 263040 46 +Visit 263040 45 +Offload 263040 2470 52 +Offload 265120 2552 6 +Reload 265360 2826 58 +Offload 267680 2055 67 +Reload 270360 2509 49 +Reload 272320 2596 18 +Offload 273040 2122 8 +Offload 273360 2372 74 +Reload 276320 2192 82 +Visit 279600 50 +Visit 279600 49 +Visit 279600 48 +Offload 279600 2446 24 +Offload 280560 2689 41 +Reload 282200 2963 65 +Offload 284800 2192 42 +Reload 286480 2646 42 +Offload 288160 2234 40 +Offload 289760 2509 49 +Reload 291720 2329 89 +Visit 295280 53 +Visit 295280 52 +Visit 295280 51 +Offload 295280 2558 56 +Offload 297520 2730 10 +Offload 297920 2826 6 +Reload 298160 3100 72 +Offload 301040 2329 49 +Reload 303000 2783 49 +Offload 304960 2378 40 +Offload 306560 2646 42 +Offload 308240 2832 14 +Reload 308800 2466 96 +Visit 312640 56 +Visit 312640 55 +Visit 312640 54 +Offload 312640 2846 38 +Offload 314160 2963 41 +Reload 315800 3237 79 +Offload 318960 2466 56 +Reload 321200 2920 56 +Offload 323440 2522 40 +Offload 325040 2783 49 +Offload 327000 3004 14 +Reload 327560 2603 103 +Visit 331680 59 +Visit 331680 58 +Visit 331680 57 +Offload 331680 3018 10 +Offload 332080 3100 72 +Offload 334960 2603 4 +Reload 335120 3374 86 +Offload 338560 2607 63 +Reload 341080 3057 63 +Offload 343600 2670 36 +Offload 345040 2920 4 +Reload 345200 2740 40 +Visit 346800 62 +Visit 346800 61 +Visit 346800 60 +Offload 346800 2924 52 +Offload 348880 3237 41 +Reload 350520 3511 93 +Offload 354240 2740 40 +Offload 355840 3057 30 +Reload 357040 3194 70 +Offload 359840 3087 33 +Offload 361160 3278 14 +Reload 361720 2877 47 +Visit 363600 65 +Visit 363600 64 +Visit 363600 63 +Offload 363600 3292 24 +Offload 364560 3374 76 +Reload 367600 3648 100 +Offload 371600 2877 47 +Offload 373480 3194 30 +Reload 374680 3331 77 +Offload 377760 3224 40 +Offload 379360 3450 10 +Offload 379760 3511 4 +Reload 379920 3014 54 +Visit 382080 68 +Visit 382080 67 +Visit 382080 66 +Offload 382080 3515 89 +Offload 385640 3014 18 +Reload 386360 3785 107 +Offload 390640 3032 36 +Offload 392080 3331 48 +Reload 394000 3468 84 +Offload 397360 3379 29 +Offload 398520 3648 32 +Reload 399800 3151 61 +Visit 402240 71 +Visit 402240 70 +Visit 402240 69 +Offload 402240 3680 44 +Reload 404000 3922 44 +Offload 405760 3151 61 +Offload 408200 3468 30 +Reload 409400 3605 91 +Offload 413040 3498 54 +Offload 415200 3724 14 +Reload 415760 3288 68 +Visit 418480 74 +Visit 418480 73 +Visit 418480 72 +Offload 418480 3738 10 +Offload 418880 3785 41 +Reload 420520 4059 51 +Offload 422560 3288 68 +Offload 425280 3605 16 +Reload 425920 3742 84 +Offload 429280 3621 75 +Reload 432280 3425 75 +Visit 435280 77 +Visit 435280 76 +Visit 435280 75 +Offload 435280 3840 52 +Offload 437360 3922 6 +Reload 437600 4196 58 +Offload 439920 3425 67 +Reload 442600 3879 49 +Reload 444560 3966 18 +Offload 445280 3492 8 +Offload 445600 3742 74 +Reload 448560 3562 82 +Visit 451840 80 +Visit 451840 79 +Visit 451840 78 +Offload 451840 3816 24 +Offload 452800 4059 41 +Reload 454440 4333 65 +Offload 457040 3562 42 +Reload 458720 4016 42 +Offload 460400 3604 40 +Offload 462000 3879 49 +Reload 463960 3699 89 +Visit 467520 83 +Visit 467520 82 +Visit 467520 81 +Offload 467520 3928 56 +Offload 469760 4100 10 +Offload 470160 4196 6 +Reload 470400 4470 72 +Offload 473280 3699 49 +Reload 475240 4153 49 +Offload 477200 3748 40 +Offload 478800 4016 42 +Offload 480480 4202 14 +Reload 481040 3836 96 +Visit 484880 86 +Visit 484880 85 +Visit 484880 84 +Offload 484880 4216 38 +Offload 486400 4333 41 +Reload 488040 4607 79 +Offload 491200 3836 56 +Reload 493440 4290 56 +Offload 495680 3892 40 +Offload 497280 4153 49 +Offload 499240 4374 14 +Reload 499800 3973 103 +Visit 503920 89 +Visit 503920 88 +Visit 503920 87 +Offload 503920 4388 10 +Offload 504320 4470 72 +Offload 507200 3973 4 +Reload 507360 4744 86 +Offload 510800 3977 63 +Reload 513320 4427 63 +Offload 515840 4040 36 +Offload 517280 4290 4 +Reload 517440 4110 40 +Visit 519040 92 +Visit 519040 91 +Visit 519040 90 +Offload 519040 4294 52 +Offload 521120 4607 41 +Reload 522760 4881 93 +Offload 526480 4110 40 +Offload 528080 4427 30 +Reload 529280 4564 70 +Offload 532080 4457 33 +Offload 533400 4648 14 +Reload 533960 4247 47 +Visit 535840 95 +Visit 535840 94 +Visit 535840 93 +Offload 535840 4662 24 +Offload 536800 4744 76 +Reload 539840 5018 100 +Offload 543840 4247 47 +Offload 545720 4564 30 +Reload 546920 4701 77 +Offload 550000 4594 40 +Offload 551600 4820 10 +Offload 552000 4881 4 +Reload 552160 4384 54 +Visit 554320 98 +Visit 554320 97 +Visit 554320 96 +Offload 554320 4885 89 +Offload 557880 4384 18 +Reload 558600 5155 107 +Offload 562880 4402 36 +Offload 564320 4701 48 +Reload 566240 4838 84 +Offload 569600 4749 29 +Offload 570760 5018 32 +Reload 572040 4521 61 +Visit 574480 101 +Visit 574480 100 +Visit 574480 99 +Offload 574480 5050 44 +Reload 576240 5292 44 +Offload 578000 4521 61 +Offload 580440 4838 30 +Reload 581640 4975 91 +Offload 585280 4868 54 +Offload 587440 5094 14 +Reload 588000 4658 68 +Visit 590720 104 +Visit 590720 103 +Visit 590720 102 +Offload 590720 5108 10 +Offload 591120 5155 41 +Reload 592760 5429 51 +Offload 594800 4658 68 +Offload 597520 4975 16 +Reload 598160 5112 84 +Offload 601520 4991 75 +Reload 604520 4795 75 +Visit 607520 107 +Visit 607520 106 +Visit 607520 105 +Offload 607520 5210 52 +Offload 609600 5292 6 +Reload 609840 5566 58 +Offload 612160 4795 67 +Reload 614840 5249 49 +Reload 616800 5336 18 +Offload 617520 4862 8 +Offload 617840 5112 74 +Reload 620800 4932 82 +Visit 624080 110 +Visit 624080 109 +Visit 624080 108 +Offload 624080 5186 24 +Offload 625040 5429 41 +Reload 626680 5703 65 +Offload 629280 4932 42 +Reload 630960 5386 42 +Offload 632640 4974 40 +Offload 634240 5249 49 +Reload 636200 5069 89 +Visit 639760 113 +Visit 639760 112 +Visit 639760 111 +Offload 639760 5298 56 +Offload 642000 5470 10 +Offload 642400 5566 6 +Reload 642640 5840 72 +Offload 645520 5069 49 +Reload 647480 5523 49 +Offload 649440 5118 40 +Offload 651040 5386 42 +Offload 652720 5572 14 +Reload 653280 5206 96 +Visit 657120 116 +Visit 657120 115 +Visit 657120 114 +Offload 657120 5586 38 +Offload 658640 5703 41 +Reload 660280 5977 79 +Offload 663440 5206 56 +Reload 665680 5660 56 +Offload 667920 5262 40 +Offload 669520 5523 49 +Offload 671480 5744 14 +Reload 672040 5343 103 +Visit 676160 119 +Visit 676160 118 +Visit 676160 117 +Offload 676160 5758 10 +Offload 676560 5840 72 +Offload 679440 5343 4 +Reload 679600 6114 86 +Offload 683040 5347 63 +Reload 685560 5797 63 +Offload 688080 5410 36 +Offload 689520 5660 4 +Reload 689680 5480 40 +Visit 691280 122 +Visit 691280 121 +Visit 691280 120 +Offload 691280 5664 52 +Offload 693360 5977 41 +Reload 695000 6251 93 +Offload 698720 5480 40 +Offload 700320 5797 30 +Reload 701520 5934 70 +Offload 704320 5827 33 +Offload 705640 6018 14 +Reload 706200 5617 47 +Visit 708080 125 +Visit 708080 124 +Visit 708080 123 +Offload 708080 6032 24 +Offload 709040 6114 76 +Reload 712080 6388 100 +Offload 716080 5617 47 +Offload 717960 5934 30 +Reload 719160 6071 77 +Offload 722240 5964 40 +Offload 723840 6190 10 +Offload 724240 6251 4 +Reload 724400 5754 54 +Visit 726560 128 +Visit 726560 127 +Visit 726560 126 +Offload 726560 6255 89 +Offload 730120 5754 18 +Reload 730840 6525 107 +Offload 735120 5772 36 +Offload 736560 6071 48 +Reload 738480 6208 84 +Offload 741840 6119 29 +Offload 743000 6388 32 +Reload 744280 5891 61 +Visit 746720 131 +Visit 746720 130 +Visit 746720 129 +Offload 746720 6420 44 +Reload 748480 6662 44 +Offload 750240 5891 61 +Offload 752680 6208 30 +Reload 753880 6345 91 +Offload 757520 6238 54 +Offload 759680 6464 14 +Reload 760240 6028 68 +Visit 762960 134 +Visit 762960 133 +Visit 762960 132 +Offload 762960 6478 10 +Offload 763360 6525 41 +Reload 765000 6799 51 +Offload 767040 6028 68 +Offload 769760 6345 16 +Reload 770400 6482 84 +Offload 773760 6361 75 +Reload 776760 6165 75 +Visit 779760 137 +Visit 779760 136 +Visit 779760 135 +Offload 779760 6580 52 +Offload 781840 6662 6 +Reload 782080 6936 58 +Offload 784400 6165 67 +Reload 787080 6619 49 +Reload 789040 6706 18 +Offload 789760 6232 8 +Offload 790080 6482 74 +Reload 793040 6302 82 +Visit 796320 140 +Visit 796320 139 +Visit 796320 138 +Offload 796320 6556 24 +Offload 797280 6799 41 +Reload 798920 7073 65 +Offload 801520 6302 42 +Reload 803200 6756 42 +Offload 804880 6344 40 +Offload 806480 6619 49 +Reload 808440 6439 89 +Visit 812000 143 +Visit 812000 142 +Visit 812000 141 +Offload 812000 6668 56 +Offload 814240 6840 10 +Offload 814640 6936 6 +Reload 814880 7210 72 +Offload 817760 6439 49 +Reload 819720 6893 49 +Offload 821680 6488 40 +Offload 823280 6756 42 +Offload 824960 6942 14 +Reload 825520 6576 96 +Visit 829360 146 +Visit 829360 145 +Visit 829360 144 +Offload 829360 6956 38 +Offload 830880 7073 41 +Reload 832520 7347 79 +Offload 835680 6576 56 +Reload 837920 7030 56 +Offload 840160 6632 40 +Offload 841760 6893 49 +Offload 843720 7114 14 +Reload 844280 6713 103 +Visit 848400 149 +Visit 848400 148 +Visit 848400 147 +Offload 848400 7128 10 +Offload 848800 7210 72 +Offload 851680 6713 4 +Reload 851840 7484 86 +Offload 855280 6717 63 +Reload 857800 7167 63 +Offload 860320 6780 36 +Offload 861760 7030 4 +Reload 861920 6850 40 +Visit 863520 152 +Visit 863520 151 +Visit 863520 150 +Offload 863520 7034 52 +Offload 865600 7347 41 +Reload 867240 7621 93 +Offload 870960 6850 40 +Offload 872560 7167 30 +Reload 873760 7304 70 +Offload 876560 7197 33 +Offload 877880 7388 14 +Reload 878440 6987 47 +Visit 880320 155 +Visit 880320 154 +Visit 880320 153 +Offload 880320 7402 24 +Offload 881280 7484 76 +Reload 884320 7758 100 +Offload 888320 6987 47 +Offload 890200 7304 30 +Reload 891400 7441 77 +Offload 894480 7334 40 +Offload 896080 7560 10 +Offload 896480 7621 4 +Reload 896640 7124 54 +Visit 898800 158 +Visit 898800 157 +Visit 898800 156 +Offload 898800 7625 89 +Offload 902360 7124 18 +Reload 903080 7895 107 +Offload 907360 7142 36 +Offload 908800 7441 48 +Reload 910720 7578 84 +Offload 914080 7489 29 +Offload 915240 7758 32 +Reload 916520 7261 61 +Visit 918960 161 +Visit 918960 160 +Visit 918960 159 +Offload 918960 7790 44 +Reload 920720 8032 44 +Offload 922480 7261 61 +Offload 924920 7578 30 +Reload 926120 7715 91 +Offload 929760 7608 54 +Offload 931920 7834 14 +Reload 932480 7398 68 +Visit 935200 164 +Visit 935200 163 +Visit 935200 162 +Offload 935200 7848 10 +Offload 935600 7895 41 +Reload 937240 8169 51 +Offload 939280 7398 68 +Offload 942000 7715 16 +Reload 942640 7852 84 +Offload 946000 7731 75 +Reload 949000 7535 75 +Visit 952000 167 +Visit 952000 166 +Visit 952000 165 +Offload 952000 7950 52 +Offload 954080 8032 6 +Reload 954320 8306 58 +Offload 956640 7535 67 +Reload 959320 7989 49 +Reload 961280 8076 18 +Offload 962000 7602 8 +Offload 962320 7852 74 +Reload 965280 7672 82 +Visit 968560 170 +Visit 968560 169 +Visit 968560 168 +Offload 968560 7926 24 +Offload 969520 8169 41 +Reload 971160 8443 65 +Offload 973760 7672 42 +Reload 975440 8126 42 +Offload 977120 7714 40 +Offload 978720 7989 49 +Reload 980680 7809 89 +Visit 984240 173 +Visit 984240 172 +Visit 984240 171 +Offload 984240 8038 56 +Offload 986480 8210 10 +Offload 986880 8306 6 +Reload 987120 8580 72 +Offload 990000 7809 49 +Reload 991960 8263 49 +Offload 993920 7858 40 +Offload 995520 8126 42 +Offload 997200 8312 14 +Reload 997760 7946 96 +Visit 1001600 176 +Visit 1001600 175 +Visit 1001600 174 +Offload 1001600 8326 38 +Offload 1003120 8443 41 +Reload 1004760 8717 79 +Offload 1007920 7946 56 +Reload 1010160 8400 56 +Offload 1012400 8002 40 +Offload 1014000 8263 49 +Offload 1015960 8484 14 +Reload 1016520 8083 103 +Visit 1020640 179 +Visit 1020640 178 +Visit 1020640 177 +Offload 1020640 8498 10 +Offload 1021040 8580 72 +Offload 1023920 8083 4 +Reload 1024080 8854 86 +Offload 1027520 8087 63 +Reload 1030040 8537 63 +Offload 1032560 8150 36 +Offload 1034000 8400 4 +Reload 1034160 8220 40 +Visit 1035760 182 +Visit 1035760 181 +Visit 1035760 180 +Offload 1035760 8404 52 +Offload 1037840 8717 41 +Reload 1039480 8991 93 +Offload 1043200 8220 40 +Offload 1044800 8537 30 +Reload 1046000 8674 70 +Offload 1048800 8567 33 +Offload 1050120 8758 14 +Reload 1050680 8357 47 +Visit 1052560 185 +Visit 1052560 184 +Visit 1052560 183 +Offload 1052560 8772 24 +Offload 1053520 8854 76 +Reload 1056560 9128 100 +Offload 1060560 8357 47 +Offload 1062440 8674 30 +Reload 1063640 8811 77 +Offload 1066720 8704 40 +Offload 1068320 8930 10 +Offload 1068720 8991 4 +Reload 1068880 8494 54 +Visit 1071040 188 +Visit 1071040 187 +Visit 1071040 186 +Offload 1071040 8995 89 +Offload 1074600 8494 18 +Reload 1075320 9265 107 +Offload 1079600 8512 36 +Offload 1081040 8811 48 +Reload 1082960 8948 84 +Offload 1086320 8859 29 +Offload 1087480 9128 32 +Reload 1088760 8631 61 +Visit 1091200 191 +Visit 1091200 190 +Visit 1091200 189 +Offload 1091200 9160 44 +Reload 1092960 9402 44 +Offload 1094720 8631 61 +Offload 1097160 8948 30 +Reload 1098360 9085 91 +Offload 1102000 8978 54 +Offload 1104160 9204 14 +Reload 1104720 8768 68 +Visit 1107440 194 +Visit 1107440 193 +Visit 1107440 192 +Offload 1107440 9218 10 +Offload 1107840 9265 41 +Reload 1109480 9539 51 +Offload 1111520 8768 68 +Offload 1114240 9085 16 +Reload 1114880 9222 84 +Offload 1118240 9101 75 +Reload 1121240 8905 75 +Visit 1124240 197 +Visit 1124240 196 +Visit 1124240 195 +Offload 1124240 9320 52 +Offload 1126320 9402 6 +Reload 1126560 9676 58 +Offload 1128880 8905 67 +Reload 1131560 9359 49 +Reload 1133520 9446 18 +Offload 1134240 8972 8 +Offload 1134560 9222 74 +Reload 1137520 9042 82 +Visit 1140800 200 +Visit 1140800 199 +Visit 1140800 198 +Offload 1140800 9296 24 +Offload 1141760 9539 41 +Reload 1143400 9813 65 +Offload 1146000 9042 42 +Reload 1147680 9496 42 +Offload 1149360 9084 40 +Offload 1150960 9359 49 +Reload 1152920 9179 89 +Visit 1156480 203 +Visit 1156480 202 +Visit 1156480 201 +Offload 1156480 9408 56 +Offload 1158720 9580 10 +Offload 1159120 9676 6 +Reload 1159360 9950 72 +Offload 1162240 9179 49 +Reload 1164200 9633 49 +Offload 1166160 9228 40 +Offload 1167760 9496 42 +Offload 1169440 9682 14 +Reload 1170000 9316 96 +Visit 1173840 206 +Visit 1173840 205 +Visit 1173840 204 +Offload 1173840 9696 38 +Offload 1175360 9813 41 +Reload 1177000 10087 79 +Offload 1180160 9316 56 +Reload 1182400 9770 56 +Offload 1184640 9372 40 +Offload 1186240 9633 49 +Offload 1188200 9854 14 +Reload 1188760 9453 103 +Visit 1192880 209 +Visit 1192880 208 +Visit 1192880 207 +Offload 1192880 9868 10 +Offload 1193280 9950 72 +Offload 1196160 9453 4 +Reload 1196320 10224 86 +Offload 1199760 9457 63 +Reload 1202280 9907 63 +Offload 1204800 9520 36 +Offload 1206240 9770 4 +Reload 1206400 9590 40 +Visit 1208000 212 +Visit 1208000 211 +Visit 1208000 210 +Offload 1208000 9774 52 +Offload 1210080 10087 41 +Reload 1211720 10361 93 +Offload 1215440 9590 40 +Offload 1217040 9907 30 +Reload 1218240 10044 70 +Offload 1221040 9937 33 +Offload 1222360 10128 14 +Reload 1222920 9727 47 +Visit 1224800 215 +Visit 1224800 214 +Visit 1224800 213 +Offload 1224800 10142 24 +Offload 1225760 10224 76 +Reload 1228800 10498 100 +Offload 1232800 9727 47 +Offload 1234680 10044 30 +Reload 1235880 10181 77 +Offload 1238960 10074 40 +Offload 1240560 10300 10 +Offload 1240960 10361 4 +Reload 1241120 9864 54 +Visit 1243280 218 +Visit 1243280 217 +Visit 1243280 216 +Offload 1243280 10365 89 +Offload 1246840 9864 18 +Reload 1247560 10635 107 +Offload 1251840 9882 36 +Offload 1253280 10181 48 +Reload 1255200 10318 84 +Offload 1258560 10229 29 +Offload 1259720 10498 32 +Reload 1261000 10001 61 +Visit 1263440 221 +Visit 1263440 220 +Visit 1263440 219 +Offload 1263440 10530 44 +Reload 1265200 10772 44 +Offload 1266960 10001 61 +Offload 1269400 10318 30 +Reload 1270600 10455 91 +Offload 1274240 10348 54 +Offload 1276400 10574 14 +Reload 1276960 10138 68 +Visit 1279680 224 +Visit 1279680 223 +Visit 1279680 222 +Offload 1279680 10588 10 +Offload 1280080 10635 41 +Reload 1281720 10909 51 +Offload 1283760 10138 68 +Offload 1286480 10455 16 +Reload 1287120 10592 84 +Offload 1290480 10471 75 +Reload 1293480 10275 75 +Visit 1296480 227 +Visit 1296480 226 +Visit 1296480 225 +Offload 1296480 10690 52 +Offload 1298560 10772 6 +Reload 1298800 11046 58 +Offload 1301120 10275 67 +Reload 1303800 10729 49 +Reload 1305760 10816 18 +Offload 1306480 10342 8 +Offload 1306800 10592 74 +Reload 1309760 10412 82 +Visit 1313040 230 +Visit 1313040 229 +Visit 1313040 228 +Offload 1313040 10666 24 +Offload 1314000 10909 41 +Reload 1315640 11183 65 +Offload 1318240 10412 42 +Reload 1319920 10866 42 +Offload 1321600 10454 40 +Offload 1323200 10729 49 +Reload 1325160 10549 89 +Visit 1328720 233 +Visit 1328720 232 +Visit 1328720 231 +Offload 1328720 10778 56 +Offload 1330960 10950 10 +Offload 1331360 11046 6 +Reload 1331600 11320 72 +Offload 1334480 10549 49 +Reload 1336440 11003 49 +Offload 1338400 10598 40 +Offload 1340000 10866 42 +Offload 1341680 11052 14 +Reload 1342240 10686 96 +Visit 1346080 236 +Visit 1346080 235 +Visit 1346080 234 +Offload 1346080 11066 38 +Offload 1347600 11183 41 +Reload 1349240 11457 79 +Offload 1352400 10686 56 +Reload 1354640 11140 56 +Offload 1356880 10742 40 +Offload 1358480 11003 49 +Offload 1360440 11224 14 +Reload 1361000 10823 103 +Visit 1365120 239 +Visit 1365120 238 +Visit 1365120 237 +Offload 1365120 11238 10 +Offload 1365520 11320 72 +Offload 1368400 10823 4 +Reload 1368560 11594 86 +Offload 1372000 10827 63 +Reload 1374520 11277 63 +Offload 1377040 10890 36 +Offload 1378480 11140 4 +Reload 1378640 10960 40 +Visit 1380240 242 +Visit 1380240 241 +Visit 1380240 240 +Offload 1380240 11144 52 +Offload 1382320 11457 41 +Reload 1383960 11731 93 +Offload 1387680 10960 40 +Offload 1389280 11277 30 +Reload 1390480 11414 70 +Offload 1393280 11307 33 +Offload 1394600 11498 14 +Reload 1395160 11097 47 +Visit 1397040 245 +Visit 1397040 244 +Visit 1397040 243 +Offload 1397040 11512 24 +Offload 1398000 11594 76 +Reload 1401040 11868 100 +Offload 1405040 11097 47 +Offload 1406920 11414 30 +Reload 1408120 11551 77 +Offload 1411200 11444 40 +Offload 1412800 11670 10 +Offload 1413200 11731 4 +Reload 1413360 11234 54 +Visit 1415520 248 +Visit 1415520 247 +Visit 1415520 246 +Offload 1415520 11735 89 +Offload 1419080 11234 18 +Reload 1419800 12005 107 +Offload 1424080 11252 36 +Offload 1425520 11551 48 +Reload 1427440 11688 84 +Offload 1430800 11599 29 +Offload 1431960 11868 32 +Reload 1433240 11371 61 +Visit 1435680 251 +Visit 1435680 250 +Visit 1435680 249 +Offload 1435680 11900 44 +Reload 1437440 12142 44 +Offload 1439200 11371 61 +Offload 1441640 11688 30 +Reload 1442840 11825 91 +Offload 1446480 11718 54 +Offload 1448640 11944 14 +Reload 1449200 11508 68 +Visit 1451920 254 +Visit 1451920 253 +Visit 1451920 252 +Offload 1451920 11958 10 +Offload 1452320 12005 41 +Reload 1453960 12279 51 +Offload 1456000 11508 68 +Offload 1458720 11825 16 +Reload 1459360 11962 84 +Offload 1462720 11841 75 +Reload 1465720 11645 75 +Visit 1468720 257 +Visit 1468720 256 +Visit 1468720 255 +Offload 1468720 12060 52 +Offload 1470800 12142 6 +Reload 1471040 12416 58 +Offload 1473360 11645 67 +Reload 1476040 12099 49 +Reload 1478000 12186 18 +Offload 1478720 11712 8 +Offload 1479040 11962 74 +Reload 1482000 11782 82 +Visit 1485280 260 +Visit 1485280 259 +Visit 1485280 258 +Offload 1485280 12036 24 +Offload 1486240 12279 41 +Reload 1487880 12553 65 +Offload 1490480 11782 42 +Reload 1492160 12236 42 +Offload 1493840 11824 40 +Offload 1495440 12099 49 +Reload 1497400 11919 89 +Visit 1500960 263 +Visit 1500960 262 +Visit 1500960 261 +Offload 1500960 12148 56 +Offload 1503200 12320 10 +Offload 1503600 12416 6 +Reload 1503840 12690 72 +Offload 1506720 11919 49 +Reload 1508680 12373 49 +Offload 1510640 11968 40 +Offload 1512240 12236 42 +Offload 1513920 12422 14 +Reload 1514480 12056 96 +Visit 1518320 266 +Visit 1518320 265 +Visit 1518320 264 +Offload 1518320 12436 38 +Offload 1519840 12553 41 +Reload 1521480 12827 79 +Offload 1524640 12056 56 +Reload 1526880 12510 56 +Offload 1529120 12112 40 +Offload 1530720 12373 49 +Offload 1532680 12594 14 +Reload 1533240 12193 103 +Visit 1537360 269 +Visit 1537360 268 +Visit 1537360 267 +Offload 1537360 12608 10 +Offload 1537760 12690 72 +Offload 1540640 12193 4 +Reload 1540800 12964 86 +Offload 1544240 12197 63 +Reload 1546760 12647 63 +Offload 1549280 12260 36 +Offload 1550720 12510 4 +Reload 1550880 12330 40 +Visit 1552480 272 +Visit 1552480 271 +Visit 1552480 270 +Offload 1552480 12514 52 +Offload 1554560 12827 41 +Reload 1556200 13101 93 +Offload 1559920 12330 40 +Offload 1561520 12647 30 +Reload 1562720 12784 70 +Offload 1565520 12677 33 +Offload 1566840 12868 14 +Reload 1567400 12467 47 +Visit 1569280 275 +Visit 1569280 274 +Visit 1569280 273 +Offload 1569280 12882 24 +Offload 1570240 12964 76 +Reload 1573280 13238 100 +Offload 1577280 12467 47 +Offload 1579160 12784 30 +Reload 1580360 12921 77 +Offload 1583440 12814 40 +Offload 1585040 13040 10 +Offload 1585440 13101 4 +Reload 1585600 12604 54 +Visit 1587760 278 +Visit 1587760 277 +Visit 1587760 276 +Offload 1587760 13105 89 +Offload 1591320 12604 18 +Reload 1592040 13375 107 +Offload 1596320 12622 36 +Offload 1597760 12921 48 +Reload 1599680 13058 84 +Offload 1603040 12969 29 +Offload 1604200 13238 32 +Reload 1605480 12741 61 +Visit 1607920 281 +Visit 1607920 280 +Visit 1607920 279 +Offload 1607920 13270 44 +Reload 1609680 13512 44 +Offload 1611440 12741 61 +Offload 1613880 13058 30 +Reload 1615080 13195 91 +Offload 1618720 13088 54 +Offload 1620880 13314 14 +Reload 1621440 12878 68 +Visit 1624160 284 +Visit 1624160 283 +Visit 1624160 282 +Offload 1624160 13328 10 +Offload 1624560 13375 41 +Reload 1626200 13649 51 +Offload 1628240 12878 68 +Offload 1630960 13195 16 +Reload 1631600 13332 84 +Offload 1634960 13211 75 +Reload 1637960 13015 75 +Visit 1640960 287 +Visit 1640960 286 +Visit 1640960 285 +Offload 1640960 13430 52 +Offload 1643040 13512 6 +Reload 1643280 13786 58 +Offload 1645600 13015 67 +Reload 1648280 13469 49 +Reload 1650240 13556 18 +Offload 1650960 13082 8 +Offload 1651280 13332 74 +Reload 1654240 13152 82 +Visit 1657520 290 +Visit 1657520 289 +Visit 1657520 288 +Offload 1657520 13406 24 +Offload 1658480 13649 41 +Reload 1660120 13923 65 +Offload 1662720 13152 42 +Reload 1664400 13606 42 +Offload 1666080 13194 40 +Offload 1667680 13469 49 +Reload 1669640 13289 89 +Visit 1673200 293 +Visit 1673200 292 +Visit 1673200 291 +Offload 1673200 13518 56 +Offload 1675440 13690 10 +Offload 1675840 13786 6 +Reload 1676080 14060 72 +Offload 1678960 13289 49 +Reload 1680920 13743 49 +Offload 1682880 13338 40 +Offload 1684480 13606 42 +Offload 1686160 13792 14 +Reload 1686720 13426 96 +Visit 1690560 296 +Visit 1690560 295 +Visit 1690560 294 +Offload 1690560 13806 38 +Offload 1692080 13923 41 +Reload 1693720 14197 79 +Offload 1696880 13426 56 +Reload 1699120 13880 56 +Offload 1701360 13482 40 +Offload 1702960 13743 49 +Offload 1704920 13964 14 +Reload 1705480 13563 103 +Visit 1709600 299 +Visit 1709600 298 +Visit 1709600 297 +Offload 1709600 13978 10 +Offload 1710000 14060 72 +Offload 1712880 13563 4 +Reload 1713040 14334 86 +Offload 1716480 13567 63 +Reload 1719000 14017 63 +Offload 1721520 13630 36 +Offload 1722960 13880 4 +Reload 1723120 13700 40 +Visit 1724720 302 +Visit 1724720 301 +Visit 1724720 300 +Offload 1724720 13884 52 +Offload 1726800 14197 41 +Reload 1728440 14471 93 +Offload 1732160 13700 40 +Offload 1733760 14017 30 +Reload 1734960 14154 70 +Offload 1737760 14047 33 +Offload 1739080 14238 14 +Reload 1739640 13837 47 +Visit 1741520 305 +Visit 1741520 304 +Visit 1741520 303 +Offload 1741520 14252 24 +Offload 1742480 14334 76 +Reload 1745520 14608 100 +Offload 1749520 13837 47 +Offload 1751400 14154 30 +Reload 1752600 14291 77 +Offload 1755680 14184 40 +Offload 1757280 14410 10 +Offload 1757680 14471 4 +Reload 1757840 13974 54 +Visit 1760000 308 +Visit 1760000 307 +Visit 1760000 306 +Offload 1760000 14475 89 +Offload 1763560 13974 18 +Reload 1764280 14745 107 +Offload 1768560 13992 36 +Offload 1770000 14291 48 +Reload 1771920 14428 84 +Offload 1775280 14339 29 +Offload 1776440 14608 32 +Reload 1777720 14111 61 +Visit 1780160 311 +Visit 1780160 310 +Visit 1780160 309 +Offload 1780160 14640 44 +Reload 1781920 14882 44 +Offload 1783680 14111 61 +Offload 1786120 14428 30 +Reload 1787320 14565 91 +Offload 1790960 14458 54 +Offload 1793120 14684 14 +Reload 1793680 14248 68 +Visit 1796400 314 +Visit 1796400 313 +Visit 1796400 312 +Offload 1796400 14698 10 +Offload 1796800 14745 41 +Reload 1798440 15019 51 +Offload 1800480 14248 68 +Offload 1803200 14565 16 +Reload 1803840 14702 84 +Offload 1807200 14581 75 +Reload 1810200 14385 75 +Visit 1813200 317 +Visit 1813200 316 +Visit 1813200 315 +Offload 1813200 14800 52 +Offload 1815280 14882 6 +Reload 1815520 15156 58 +Offload 1817840 14385 67 +Reload 1820520 14839 49 +Reload 1822480 14926 18 +Offload 1823200 14452 8 +Offload 1823520 14702 74 +Reload 1826480 14522 82 +Visit 1829760 320 +Visit 1829760 319 +Visit 1829760 318 +Offload 1829760 14776 24 +Offload 1830720 15019 41 +Reload 1832360 15293 65 +Offload 1834960 14522 42 +Reload 1836640 14976 42 +Offload 1838320 14564 40 +Offload 1839920 14839 49 +Reload 1841880 14659 89 +Visit 1845440 323 +Visit 1845440 322 +Visit 1845440 321 +Offload 1845440 14888 56 +Offload 1847680 15060 10 +Offload 1848080 15156 6 +Reload 1848320 15430 72 +Offload 1851200 14659 49 +Reload 1853160 15113 49 +Offload 1855120 14708 40 +Offload 1856720 14976 42 +Offload 1858400 15162 14 +Reload 1858960 14796 96 +Visit 1862800 326 +Visit 1862800 325 +Visit 1862800 324 +Offload 1862800 15176 38 +Offload 1864320 15293 41 +Reload 1865960 15567 79 +Offload 1869120 14796 56 +Reload 1871360 15250 56 +Offload 1873600 14852 40 +Offload 1875200 15113 49 +Offload 1877160 15334 14 +Reload 1877720 14933 103 +Visit 1881840 329 +Visit 1881840 328 +Visit 1881840 327 +Offload 1881840 15348 10 +Offload 1882240 15430 72 +Offload 1885120 14933 4 +Reload 1885280 15704 86 +Offload 1888720 14937 63 +Reload 1891240 15387 63 +Offload 1893760 15000 36 +Offload 1895200 15250 4 +Reload 1895360 15070 40 +Visit 1896960 332 +Visit 1896960 331 +Visit 1896960 330 +Offload 1896960 15254 52 +Offload 1899040 15567 41 +Reload 1900680 15841 93 +Offload 1904400 15070 40 +Offload 1906000 15387 30 +Reload 1907200 15524 70 +Offload 1910000 15417 33 +Offload 1911320 15608 14 +Reload 1911880 15207 47 +Visit 1913760 335 +Visit 1913760 334 +Visit 1913760 333 +Offload 1913760 15622 24 +Offload 1914720 15704 76 +Reload 1917760 15978 100 +Offload 1921760 15207 47 +Offload 1923640 15524 30 +Reload 1924840 15661 77 +Offload 1927920 15554 40 +Offload 1929520 15780 10 +Offload 1929920 15841 4 +Reload 1930080 15344 54 +Visit 1932240 338 +Visit 1932240 337 +Visit 1932240 336 +Offload 1932240 15845 89 +Offload 1935800 15344 18 +Reload 1936520 16115 107 +Offload 1940800 15362 36 +Offload 1942240 15661 48 +Reload 1944160 15798 84 +Offload 1947520 15709 29 +Offload 1948680 15978 32 +Reload 1949960 15481 61 +Visit 1952400 341 +Visit 1952400 340 +Visit 1952400 339 +Offload 1952400 16010 44 +Reload 1954160 16252 44 +Offload 1955920 15481 61 +Offload 1958360 15798 30 +Reload 1959560 15935 91 +Offload 1963200 15828 54 +Offload 1965360 16054 14 +Reload 1965920 15618 68 +Visit 1968640 344 +Visit 1968640 343 +Visit 1968640 342 +Offload 1968640 16068 10 +Offload 1969040 16115 41 +Reload 1970680 16389 51 +Offload 1972720 15618 68 +Offload 1975440 15935 16 +Reload 1976080 16072 84 +Offload 1979440 15951 75 +Reload 1982440 15755 75 +Visit 1985440 347 +Visit 1985440 346 +Visit 1985440 345 +Offload 1985440 16170 52 +Offload 1987520 16252 6 +Reload 1987760 16526 58 +Offload 1990080 15755 67 +Reload 1992760 16209 49 +Reload 1994720 16296 18 +Offload 1995440 15822 8 +Offload 1995760 16072 74 +Reload 1998720 15892 82 +Visit 2002000 350 +Visit 2002000 349 +Visit 2002000 348 +Offload 2002000 16146 24 +Offload 2002960 16389 41 +Reload 2004600 16663 65 +Offload 2007200 15892 42 +Reload 2008880 16346 42 +Offload 2010560 15934 40 +Offload 2012160 16209 49 +Reload 2014120 16029 89 +Visit 2017680 353 +Visit 2017680 352 +Visit 2017680 351 +Offload 2017680 16258 56 +Offload 2019920 16430 10 +Offload 2020320 16526 6 +Reload 2020560 16800 72 +Offload 2023440 16029 49 +Reload 2025400 16483 49 +Offload 2027360 16078 40 +Offload 2028960 16346 42 +Offload 2030640 16532 14 +Reload 2031200 16166 96 +Visit 2035040 356 +Visit 2035040 355 +Visit 2035040 354 +Offload 2035040 16546 38 +Offload 2036560 16663 41 +Reload 2038200 16937 79 +Offload 2041360 16166 56 +Reload 2043600 16620 56 +Offload 2045840 16222 40 +Offload 2047440 16483 49 +Offload 2049400 16704 14 +Reload 2049960 16303 103 +Visit 2054080 359 +Visit 2054080 358 +Visit 2054080 357 +Offload 2054080 16718 10 +Offload 2054480 16800 72 +Offload 2057360 16303 4 +Reload 2057520 17074 86 +Offload 2060960 16307 63 +Reload 2063480 16757 63 +Offload 2066000 16370 36 +Offload 2067440 16620 4 +Reload 2067600 16440 40 +Visit 2069200 362 +Visit 2069200 361 +Visit 2069200 360 +Offload 2069200 16624 52 +Offload 2071280 16937 41 +Reload 2072920 17211 93 +Offload 2076640 16440 40 +Offload 2078240 16757 30 +Reload 2079440 16894 70 +Offload 2082240 16787 33 +Offload 2083560 16978 14 +Reload 2084120 16577 47 +Visit 2086000 365 +Visit 2086000 364 +Visit 2086000 363 +Offload 2086000 16992 24 +Offload 2086960 17074 76 +Reload 2090000 17348 100 +Offload 2094000 16577 47 +Offload 2095880 16894 30 +Reload 2097080 17031 77 +Offload 2100160 16924 40 +Offload 2101760 17150 10 +Offload 2102160 17211 4 +Reload 2102320 16714 54 +Visit 2104480 368 +Visit 2104480 367 +Visit 2104480 366 +Offload 2104480 17215 89 +Offload 2108040 16714 18 +Reload 2108760 17485 107 +Offload 2113040 16732 36 +Offload 2114480 17031 48 +Reload 2116400 17168 84 +Offload 2119760 17079 29 +Offload 2120920 17348 32 +Reload 2122200 16851 61 +Visit 2124640 371 +Visit 2124640 370 +Visit 2124640 369 +Offload 2124640 17380 44 +Reload 2126400 17622 44 +Offload 2128160 16851 61 +Offload 2130600 17168 30 +Reload 2131800 17305 91 +Offload 2135440 17198 54 +Offload 2137600 17424 14 +Reload 2138160 16988 68 +Visit 2140880 374 +Visit 2140880 373 +Visit 2140880 372 +Offload 2140880 17438 10 +Offload 2141280 17485 41 +Reload 2142920 17759 51 +Offload 2144960 16988 68 +Offload 2147680 17305 16 +Reload 2148320 17442 84 +Offload 2151680 17321 75 +Reload 2154680 17125 75 +Visit 2157680 377 +Visit 2157680 376 +Visit 2157680 375 +Offload 2157680 17540 52 +Offload 2159760 17622 6 +Reload 2160000 17896 58 +Offload 2162320 17125 67 +Reload 2165000 17579 49 +Reload 2166960 17666 18 +Offload 2167680 17192 8 +Offload 2168000 17442 74 +Reload 2170960 17262 82 +Visit 2174240 380 +Visit 2174240 379 +Visit 2174240 378 +Offload 2174240 17516 24 +Offload 2175200 17759 41 +Reload 2176840 18033 65 +Offload 2179440 17262 42 +Reload 2181120 17716 42 +Offload 2182800 17304 40 +Offload 2184400 17579 49 +Reload 2186360 17399 89 +Visit 2189920 383 +Visit 2189920 382 +Visit 2189920 381 +Offload 2189920 17628 56 +Offload 2192160 17800 10 +Offload 2192560 17896 6 +Reload 2192800 18170 72 +Offload 2195680 17399 49 +Reload 2197640 17853 49 +Offload 2199600 17448 40 +Offload 2201200 17716 42 +Offload 2202880 17902 14 +Reload 2203440 17536 96 +Visit 2207280 386 +Visit 2207280 385 +Visit 2207280 384 +Offload 2207280 17916 38 +Offload 2208800 18033 41 +Reload 2210440 18307 79 +Offload 2213600 17536 56 +Reload 2215840 17990 56 +Offload 2218080 17592 40 +Offload 2219680 17853 49 +Offload 2221640 18074 14 +Reload 2222200 17673 103 +Visit 2226320 389 +Visit 2226320 388 +Visit 2226320 387 +Offload 2226320 18088 10 +Offload 2226720 18170 72 +Offload 2229600 17673 4 +Reload 2229760 18444 86 +Offload 2233200 17677 63 +Reload 2235720 18127 63 +Offload 2238240 17740 36 +Offload 2239680 17990 4 +Reload 2239840 17810 40 +Visit 2241440 392 +Visit 2241440 391 +Visit 2241440 390 +Offload 2241440 17994 52 +Offload 2243520 18307 41 +Reload 2245160 18581 93 +Offload 2248880 17810 40 +Offload 2250480 18127 30 +Reload 2251680 18264 70 +Offload 2254480 18157 33 +Offload 2255800 18348 14 +Reload 2256360 17947 47 +Visit 2258240 395 +Visit 2258240 394 +Visit 2258240 393 +Offload 2258240 18362 24 +Offload 2259200 18444 76 +Reload 2262240 18718 100 +Offload 2266240 17947 47 +Offload 2268120 18264 30 +Reload 2269320 18401 77 +Offload 2272400 18294 40 +Offload 2274000 18520 10 +Offload 2274400 18581 4 +Reload 2274560 18084 54 +Visit 2276720 398 +Visit 2276720 397 +Visit 2276720 396 +Offload 2276720 18585 89 +Offload 2280280 18084 18 +Reload 2281000 18855 107 +Offload 2285280 18102 36 +Offload 2286720 18401 48 +Reload 2288640 18538 84 +Offload 2292000 18449 29 +Offload 2293160 18718 32 +Reload 2294440 18221 61 +Visit 2296880 401 +Visit 2296880 400 +Visit 2296880 399 +Offload 2296880 18750 44 +Reload 2298640 18992 44 +Offload 2300400 18221 61 +Offload 2302840 18538 30 +Reload 2304040 18675 91 +Offload 2307680 18568 54 +Offload 2309840 18794 14 +Reload 2310400 18358 68 +Visit 2313120 404 +Visit 2313120 403 +Visit 2313120 402 +Offload 2313120 18808 10 +Offload 2313520 18855 41 +Reload 2315160 19129 51 +Offload 2317200 18358 68 +Offload 2319920 18675 16 +Reload 2320560 18812 84 +Offload 2323920 18691 75 +Reload 2326920 18495 75 +Visit 2329920 407 +Visit 2329920 406 +Visit 2329920 405 +Offload 2329920 18910 52 +Offload 2332000 18992 6 +Reload 2332240 19266 58 +Offload 2334560 18495 67 +Reload 2337240 18949 49 +Reload 2339200 19036 18 +Offload 2339920 18562 8 +Offload 2340240 18812 74 +Reload 2343200 18632 82 +Visit 2346480 410 +Visit 2346480 409 +Visit 2346480 408 +Offload 2346480 18886 24 +Offload 2347440 19129 41 +Reload 2349080 19403 65 +Offload 2351680 18632 42 +Reload 2353360 19086 42 +Offload 2355040 18674 40 +Offload 2356640 18949 49 +Reload 2358600 18769 89 +Visit 2362160 413 +Visit 2362160 412 +Visit 2362160 411 +Offload 2362160 18998 56 +Offload 2364400 19170 10 +Offload 2364800 19266 6 +Reload 2365040 19540 72 +Offload 2367920 18769 49 +Reload 2369880 19223 49 +Offload 2371840 18818 40 +Offload 2373440 19086 42 +Offload 2375120 19272 14 +Reload 2375680 18906 96 +Visit 2379520 416 +Visit 2379520 415 +Visit 2379520 414 +Offload 2379520 19286 38 +Offload 2381040 19403 41 +Reload 2382680 19677 79 +Offload 2385840 18906 56 +Reload 2388080 19360 56 +Offload 2390320 18962 40 +Offload 2391920 19223 49 +Offload 2393880 19444 14 +Reload 2394440 19043 103 +Visit 2398560 419 +Visit 2398560 418 +Visit 2398560 417 +Offload 2398560 19458 10 +Offload 2398960 19560 33 +Reload 2400280 19497 43 +Offload 2402000 19043 40 +Reload 2403600 19180 40 +Offload 2405200 19083 63 +Offload 2407720 19360 23 +Reload 2408640 14 86 +Visit 2412080 421 +Visit 2412080 420 +Visit 2412080 422 +Offload 2412080 19383 33 +Offload 2413400 19593 10 +Reload 2413800 19634 43 +Offload 2415520 14 47 +Reload 2417400 19317 47 +Offload 2419280 61 39 +Offload 2420840 19180 40 +Offload 2422440 19497 14 +Reload 2423000 151 93 +Visit 2426720 424 +Visit 2426720 423 +Visit 2426720 425 +Offload 2426720 19511 49 +Offload 2428680 19603 9 +Offload 2429040 19704 19 +Reload 2429800 19771 77 +Offload 2432880 151 54 +Reload 2435040 19454 54 +Offload 2437200 205 39 +Offload 2438760 19317 47 +Offload 2440640 19634 14 +Reload 2441200 288 100 +Visit 2445200 427 +Visit 2445200 426 +Visit 2445200 428 +Offload 2445200 19652 52 +Offload 2447280 19723 5 +Reload 2447480 19591 57 +Offload 2449760 288 100 +Offload 2453760 19454 7 +Reload 2454040 425 107 +Offload 2458320 19461 47 +Offload 2460200 19728 28 +Offload 2461320 19771 9 +Reload 2461680 108 84 +Visit 2465040 429 +Visit 2465040 431 +Visit 2465040 430 +Offload 2465040 19796 52 +Reload 2467120 19728 52 +Offload 2469200 108 44 +Reload 2470960 562 44 +Offload 2472720 152 40 +Offload 2474320 425 51 +Reload 2476360 245 91 +Visit 2480000 432 +Visit 2480000 434 +Visit 2480000 433 +Offload 2480000 476 51 +Reload 2482040 699 51 +Offload 2484080 245 91 +Offload 2487720 527 5 +Offload 2487920 562 2 +Reload 2488000 382 98 +Offload 2491920 564 42 +Offload 2493600 19591 33 +Reload 2494920 65 75 +Visit 2497920 437 +Visit 2497920 436 +Visit 2497920 435 +Offload 2497920 19624 28 +Offload 2499040 19728 30 +Reload 2500240 836 58 +Offload 2502560 65 75 +Offload 2505560 382 30 +Reload 2506760 519 105 +Offload 2510960 412 68 +Offload 2513680 699 14 +Reload 2514240 202 82 +Visit 2517520 440 +Visit 2517520 439 +Visit 2517520 438 +Offload 2517520 713 37 +Offload 2519000 19758 28 +Reload 2520120 973 65 +Offload 2522720 202 42 +Reload 2524400 656 42 +Offload 2526080 244 40 +Offload 2527680 519 49 +Reload 2529640 339 89 +Visit 2533200 443 +Visit 2533200 442 +Visit 2533200 441 +Offload 2533200 568 56 +Offload 2535440 836 16 +Reload 2536080 1110 72 +Offload 2538960 339 49 +Reload 2540920 793 49 +Offload 2542880 388 40 +Offload 2544480 656 42 +Offload 2546160 852 14 +Reload 2546720 476 96 +Visit 2550560 446 +Visit 2550560 445 +Visit 2550560 444 +Offload 2550560 866 28 +Offload 2551680 973 51 +Reload 2553720 1247 79 +Offload 2556880 476 56 +Reload 2559120 930 56 +Offload 2561360 532 40 +Offload 2562960 793 49 +Offload 2564920 1024 14 +Reload 2565480 613 103 +Visit 2569600 449 +Visit 2569600 448 +Visit 2569600 447 +Offload 2569600 1110 72 +Offload 2572480 19786 10 +Offload 2572880 613 4 +Reload 2573040 1384 86 +Offload 2576480 617 63 +Reload 2579000 1067 63 +Offload 2581520 680 36 +Offload 2582960 930 4 +Reload 2583120 750 40 +Visit 2584720 452 +Visit 2584720 451 +Visit 2584720 450 +Offload 2584720 934 52 +Offload 2586800 1247 41 +Reload 2588440 1521 93 +Offload 2592160 750 40 +Offload 2593760 1067 30 +Reload 2594960 1204 70 +Offload 2597760 1097 33 +Offload 2599080 1288 14 +Reload 2599640 887 47 +Visit 2601520 455 +Visit 2601520 454 +Visit 2601520 453 +Offload 2601520 1302 24 +Offload 2602480 1384 76 +Reload 2605520 1658 100 +Offload 2609520 887 47 +Offload 2611400 1204 30 +Reload 2612600 1341 77 +Offload 2615680 1234 40 +Offload 2617280 1460 10 +Offload 2617680 1521 4 +Reload 2617840 1024 54 +Visit 2620000 458 +Visit 2620000 457 +Visit 2620000 456 +Offload 2620000 1525 89 +Offload 2623560 1024 18 +Reload 2624280 1795 107 +Offload 2628560 1042 36 +Offload 2630000 1341 48 +Reload 2631920 1478 84 +Offload 2635280 1389 29 +Offload 2636440 1658 32 +Reload 2637720 1161 61 +Visit 2640160 461 +Visit 2640160 460 +Visit 2640160 459 +Offload 2640160 1690 44 +Reload 2641920 1932 44 +Offload 2643680 1161 61 +Offload 2646120 1478 30 +Reload 2647320 1615 91 +Offload 2650960 1508 54 +Offload 2653120 1734 14 +Reload 2653680 1298 68 +Visit 2656400 464 +Visit 2656400 463 +Visit 2656400 462 +Offload 2656400 1748 10 +Offload 2656800 1795 41 +Reload 2658440 2069 51 +Offload 2660480 1298 68 +Offload 2663200 1615 16 +Reload 2663840 1752 84 +Offload 2667200 1631 75 +Reload 2670200 1435 75 +Visit 2673200 467 +Visit 2673200 466 +Visit 2673200 465 +Offload 2673200 1850 52 +Offload 2675280 1932 6 +Reload 2675520 2206 58 +Offload 2677840 1435 67 +Reload 2680520 1889 49 +Reload 2682480 1976 18 +Offload 2683200 1502 8 +Offload 2683520 1752 74 +Reload 2686480 1572 82 +Visit 2689760 470 +Visit 2689760 469 +Visit 2689760 468 +Offload 2689760 1826 24 +Offload 2690720 2069 41 +Reload 2692360 2343 65 +Offload 2694960 1572 42 +Reload 2696640 2026 42 +Offload 2698320 1614 40 +Offload 2699920 1889 49 +Reload 2701880 1709 89 +Visit 2705440 473 +Visit 2705440 472 +Visit 2705440 471 +Offload 2705440 1938 56 +Offload 2707680 2110 10 +Offload 2708080 2206 6 +Reload 2708320 2480 72 +Offload 2711200 1709 49 +Reload 2713160 2163 49 +Offload 2715120 1758 40 +Offload 2716720 2026 42 +Offload 2718400 2212 14 +Reload 2718960 1846 96 +Visit 2722800 476 +Visit 2722800 475 +Visit 2722800 474 +Offload 2722800 2226 38 +Offload 2724320 2343 41 +Reload 2725960 2617 79 +Offload 2729120 1846 56 +Reload 2731360 2300 56 +Offload 2733600 1902 40 +Offload 2735200 2163 49 +Offload 2737160 2384 14 +Reload 2737720 1983 103 +Visit 2741840 479 +Visit 2741840 478 +Visit 2741840 477 +Offload 2741840 2398 10 +Offload 2742240 2480 72 +Offload 2745120 1983 4 +Reload 2745280 2754 86 +Offload 2748720 1987 63 +Reload 2751240 2437 63 +Offload 2753760 2050 36 +Offload 2755200 2300 4 +Reload 2755360 2120 40 +Visit 2756960 482 +Visit 2756960 481 +Visit 2756960 480 +Offload 2756960 2304 52 +Offload 2759040 2617 41 +Reload 2760680 2891 93 +Offload 2764400 2120 40 +Offload 2766000 2437 30 +Reload 2767200 2574 70 +Offload 2770000 2467 33 +Offload 2771320 2658 14 +Reload 2771880 2257 47 +Visit 2773760 485 +Visit 2773760 484 +Visit 2773760 483 +Offload 2773760 2672 24 +Offload 2774720 2754 76 +Reload 2777760 3028 100 +Offload 2781760 2257 47 +Offload 2783640 2574 30 +Reload 2784840 2711 77 +Offload 2787920 2604 40 +Offload 2789520 2830 10 +Offload 2789920 2891 4 +Reload 2790080 2394 54 +Visit 2792240 488 +Visit 2792240 487 +Visit 2792240 486 +Offload 2792240 2895 89 +Offload 2795800 2394 18 +Reload 2796520 3165 107 +Offload 2800800 2412 36 +Offload 2802240 2711 48 +Reload 2804160 2848 84 +Offload 2807520 2759 29 +Offload 2808680 3028 32 +Reload 2809960 2531 61 +Visit 2812400 491 +Visit 2812400 490 +Visit 2812400 489 +Offload 2812400 3060 44 +Reload 2814160 3302 44 +Offload 2815920 2531 61 +Offload 2818360 2848 30 +Reload 2819560 2985 91 +Offload 2823200 2878 54 +Offload 2825360 3104 14 +Reload 2825920 2668 68 +Visit 2828640 494 +Visit 2828640 493 +Visit 2828640 492 +Offload 2828640 3118 10 +Offload 2829040 3165 41 +Reload 2830680 3439 51 +Offload 2832720 2668 68 +Offload 2835440 2985 16 +Reload 2836080 3122 84 +Offload 2839440 3001 75 +Reload 2842440 2805 75 +Visit 2845440 497 +Visit 2845440 496 +Visit 2845440 495 +Offload 2845440 3220 52 +Offload 2847520 3302 6 +Reload 2847760 3576 58 +Offload 2850080 2805 67 +Reload 2852760 3259 49 +Reload 2854720 3346 18 +Offload 2855440 2872 8 +Offload 2855760 3122 74 +Reload 2858720 2942 82 +Visit 2862000 500 +Visit 2862000 499 +Visit 2862000 498 +Offload 2862000 3196 24 +Offload 2862960 3439 41 +Reload 2864600 3713 65 +Offload 2867200 2942 42 +Reload 2868880 3396 42 +Offload 2870560 2984 40 +Offload 2872160 3259 49 +Reload 2874120 3079 89 +Visit 2877680 503 +Visit 2877680 502 +Visit 2877680 501 +Offload 2877680 3308 56 +Offload 2879920 3480 10 +Offload 2880320 3576 6 +Reload 2880560 3850 72 +Offload 2883440 3079 49 +Reload 2885400 3533 49 +Offload 2887360 3128 40 +Offload 2888960 3396 42 +Offload 2890640 3582 14 +Reload 2891200 3216 96 +Visit 2895040 506 +Visit 2895040 505 +Visit 2895040 504 +Offload 2895040 3596 38 +Offload 2896560 3713 41 +Reload 2898200 3987 79 +Offload 2901360 3216 56 +Reload 2903600 3670 56 +Offload 2905840 3272 40 +Offload 2907440 3533 49 +Offload 2909400 3754 14 +Reload 2909960 3353 103 +Visit 2914080 509 +Visit 2914080 508 +Visit 2914080 507 +Offload 2914080 3768 10 +Offload 2914480 3850 72 +Offload 2917360 3353 4 +Reload 2917520 4124 86 +Offload 2920960 3357 63 +Reload 2923480 3807 63 +Offload 2926000 3420 36 +Offload 2927440 3670 4 +Reload 2927600 3490 40 +Visit 2929200 512 +Visit 2929200 511 +Visit 2929200 510 +Offload 2929200 3674 52 +Offload 2931280 3987 41 +Reload 2932920 4261 93 +Offload 2936640 3490 40 +Offload 2938240 3807 30 +Reload 2939440 3944 70 +Offload 2942240 3837 33 +Offload 2943560 4028 14 +Reload 2944120 3627 47 +Visit 2946000 515 +Visit 2946000 514 +Visit 2946000 513 +Offload 2946000 4042 24 +Offload 2946960 4124 76 +Reload 2950000 4398 100 +Offload 2954000 3627 47 +Offload 2955880 3944 30 +Reload 2957080 4081 77 +Offload 2960160 3974 40 +Offload 2961760 4200 10 +Offload 2962160 4261 4 +Reload 2962320 3764 54 +Visit 2964480 518 +Visit 2964480 517 +Visit 2964480 516 +Offload 2964480 4265 89 +Offload 2968040 3764 18 +Reload 2968760 4535 107 +Offload 2973040 3782 36 +Offload 2974480 4081 48 +Reload 2976400 4218 84 +Offload 2979760 4129 29 +Offload 2980920 4398 32 +Reload 2982200 3901 61 +Visit 2984640 521 +Visit 2984640 520 +Visit 2984640 519 +Offload 2984640 4430 44 +Reload 2986400 4672 44 +Offload 2988160 3901 61 +Offload 2990600 4218 30 +Reload 2991800 4355 91 +Offload 2995440 4248 54 +Offload 2997600 4474 14 +Reload 2998160 4038 68 +Visit 3000880 524 +Visit 3000880 523 +Visit 3000880 522 +Offload 3000880 4488 10 +Offload 3001280 4535 41 +Reload 3002920 4809 51 +Offload 3004960 4038 68 +Offload 3007680 4355 16 +Reload 3008320 4492 84 +Offload 3011680 4371 75 +Reload 3014680 4175 75 +Visit 3017680 527 +Visit 3017680 526 +Visit 3017680 525 +Offload 3017680 4590 52 +Offload 3019760 4672 6 +Reload 3020000 4946 58 +Offload 3022320 4175 67 +Reload 3025000 4629 49 +Reload 3026960 4716 18 +Offload 3027680 4242 8 +Offload 3028000 4492 74 +Reload 3030960 4312 82 +Visit 3034240 530 +Visit 3034240 529 +Visit 3034240 528 +Offload 3034240 4566 24 +Offload 3035200 4809 41 +Reload 3036840 5083 65 +Offload 3039440 4312 42 +Reload 3041120 4766 42 +Offload 3042800 4354 40 +Offload 3044400 4629 49 +Reload 3046360 4449 89 +Visit 3049920 533 +Visit 3049920 532 +Visit 3049920 531 +Offload 3049920 4678 56 +Offload 3052160 4850 10 +Offload 3052560 4946 6 +Reload 3052800 5220 72 +Offload 3055680 4449 49 +Reload 3057640 4903 49 +Offload 3059600 4498 40 +Offload 3061200 4766 42 +Offload 3062880 4952 14 +Reload 3063440 4586 96 +Visit 3067280 536 +Visit 3067280 535 +Visit 3067280 534 +Offload 3067280 4966 38 +Offload 3068800 5083 41 +Reload 3070440 5357 79 +Offload 3073600 4586 56 +Reload 3075840 5040 56 +Offload 3078080 4642 40 +Offload 3079680 4903 49 +Offload 3081640 5124 14 +Reload 3082200 4723 103 +Visit 3086320 539 +Visit 3086320 538 +Visit 3086320 537 +Offload 3086320 5138 10 +Offload 3086720 5220 72 +Offload 3089600 4723 4 +Reload 3089760 5494 86 +Offload 3093200 4727 63 +Reload 3095720 5177 63 +Offload 3098240 4790 36 +Offload 3099680 5040 4 +Reload 3099840 4860 40 +Visit 3101440 542 +Visit 3101440 541 +Visit 3101440 540 +Offload 3101440 5044 52 +Offload 3103520 5357 41 +Reload 3105160 5631 93 +Offload 3108880 4860 40 +Offload 3110480 5177 30 +Reload 3111680 5314 70 +Offload 3114480 5207 33 +Offload 3115800 5398 14 +Reload 3116360 4997 47 +Visit 3118240 545 +Visit 3118240 544 +Visit 3118240 543 +Offload 3118240 5412 24 +Offload 3119200 5494 76 +Reload 3122240 5768 100 +Offload 3126240 4997 47 +Offload 3128120 5314 30 +Reload 3129320 5451 77 +Offload 3132400 5344 40 +Offload 3134000 5570 10 +Offload 3134400 5631 4 +Reload 3134560 5134 54 +Visit 3136720 548 +Visit 3136720 547 +Visit 3136720 546 +Offload 3136720 5635 89 +Offload 3140280 5134 18 +Reload 3141000 5905 107 +Offload 3145280 5152 36 +Offload 3146720 5451 48 +Reload 3148640 5588 84 +Offload 3152000 5499 29 +Offload 3153160 5768 32 +Reload 3154440 5271 61 +Visit 3156880 551 +Visit 3156880 550 +Visit 3156880 549 +Offload 3156880 5800 44 +Reload 3158640 6042 44 +Offload 3160400 5271 61 +Offload 3162840 5588 30 +Reload 3164040 5725 91 +Offload 3167680 5618 54 +Offload 3169840 5844 14 +Reload 3170400 5408 68 +Visit 3173120 554 +Visit 3173120 553 +Visit 3173120 552 +Offload 3173120 5858 10 +Offload 3173520 5905 41 +Reload 3175160 6179 51 +Offload 3177200 5408 68 +Offload 3179920 5725 16 +Reload 3180560 5862 84 +Offload 3183920 5741 75 +Reload 3186920 5545 75 +Visit 3189920 557 +Visit 3189920 556 +Visit 3189920 555 +Offload 3189920 5960 52 +Offload 3192000 6042 6 +Reload 3192240 6316 58 +Offload 3194560 5545 67 +Reload 3197240 5999 49 +Reload 3199200 6086 18 +Offload 3199920 5612 8 +Offload 3200240 5862 74 +Reload 3203200 5682 82 +Visit 3206480 560 +Visit 3206480 559 +Visit 3206480 558 +Offload 3206480 5936 24 +Offload 3207440 6179 41 +Reload 3209080 6453 65 +Offload 3211680 5682 42 +Reload 3213360 6136 42 +Offload 3215040 5724 40 +Offload 3216640 5999 49 +Reload 3218600 5819 89 +Visit 3222160 563 +Visit 3222160 562 +Visit 3222160 561 +Offload 3222160 6048 56 +Offload 3224400 6220 10 +Offload 3224800 6316 6 +Reload 3225040 6590 72 +Offload 3227920 5819 49 +Reload 3229880 6273 49 +Offload 3231840 5868 40 +Offload 3233440 6136 42 +Offload 3235120 6322 14 +Reload 3235680 5956 96 +Visit 3239520 566 +Visit 3239520 565 +Visit 3239520 564 +Offload 3239520 6336 38 +Offload 3241040 6453 41 +Reload 3242680 6727 79 +Offload 3245840 5956 56 +Reload 3248080 6410 56 +Offload 3250320 6012 40 +Offload 3251920 6273 49 +Offload 3253880 6494 14 +Reload 3254440 6093 103 +Visit 3258560 569 +Visit 3258560 568 +Visit 3258560 567 +Offload 3258560 6508 10 +Offload 3258960 6590 72 +Offload 3261840 6093 4 +Reload 3262000 6864 86 +Offload 3265440 6097 63 +Reload 3267960 6547 63 +Offload 3270480 6160 36 +Offload 3271920 6410 4 +Reload 3272080 6230 40 +Visit 3273680 572 +Visit 3273680 571 +Visit 3273680 570 +Offload 3273680 6414 52 +Offload 3275760 6727 41 +Reload 3277400 7001 93 +Offload 3281120 6230 40 +Offload 3282720 6547 30 +Reload 3283920 6684 70 +Offload 3286720 6577 33 +Offload 3288040 6768 14 +Reload 3288600 6367 47 +Visit 3290480 575 +Visit 3290480 574 +Visit 3290480 573 +Offload 3290480 6782 24 +Offload 3291440 6864 76 +Reload 3294480 7138 100 +Offload 3298480 6367 47 +Offload 3300360 6684 30 +Reload 3301560 6821 77 +Offload 3304640 6714 40 +Offload 3306240 6940 10 +Offload 3306640 7001 4 +Reload 3306800 6504 54 +Visit 3308960 578 +Visit 3308960 577 +Visit 3308960 576 +Offload 3308960 7005 89 +Offload 3312520 6504 18 +Reload 3313240 7275 107 +Offload 3317520 6522 36 +Offload 3318960 6821 48 +Reload 3320880 6958 84 +Offload 3324240 6869 29 +Offload 3325400 7138 32 +Reload 3326680 6641 61 +Visit 3329120 581 +Visit 3329120 580 +Visit 3329120 579 +Offload 3329120 7170 44 +Reload 3330880 7412 44 +Offload 3332640 6641 61 +Offload 3335080 6958 30 +Reload 3336280 7095 91 +Offload 3339920 6988 54 +Offload 3342080 7214 14 +Reload 3342640 6778 68 +Visit 3345360 584 +Visit 3345360 583 +Visit 3345360 582 +Offload 3345360 7228 10 +Offload 3345760 7275 41 +Reload 3347400 7549 51 +Offload 3349440 6778 68 +Offload 3352160 7095 16 +Reload 3352800 7232 84 +Offload 3356160 7111 75 +Reload 3359160 6915 75 +Visit 3362160 587 +Visit 3362160 586 +Visit 3362160 585 +Offload 3362160 7330 52 +Offload 3364240 7412 6 +Reload 3364480 7686 58 +Offload 3366800 6915 67 +Reload 3369480 7369 49 +Reload 3371440 7456 18 +Offload 3372160 6982 8 +Offload 3372480 7232 74 +Reload 3375440 7052 82 +Visit 3378720 590 +Visit 3378720 589 +Visit 3378720 588 +Offload 3378720 7306 24 +Offload 3379680 7549 41 +Reload 3381320 7823 65 +Offload 3383920 7052 42 +Reload 3385600 7506 42 +Offload 3387280 7094 40 +Offload 3388880 7369 49 +Reload 3390840 7189 89 +Visit 3394400 593 +Visit 3394400 592 +Visit 3394400 591 +Offload 3394400 7418 56 +Offload 3396640 7590 10 +Offload 3397040 7686 6 +Reload 3397280 7960 72 +Offload 3400160 7189 49 +Reload 3402120 7643 49 +Offload 3404080 7238 40 +Offload 3405680 7506 42 +Offload 3407360 7692 14 +Reload 3407920 7326 96 +Visit 3411760 596 +Visit 3411760 595 +Visit 3411760 594 +Offload 3411760 7706 38 +Offload 3413280 7823 41 +Reload 3414920 8097 79 +Offload 3418080 7326 56 +Reload 3420320 7780 56 +Offload 3422560 7382 40 +Offload 3424160 7643 49 +Offload 3426120 7864 14 +Reload 3426680 7463 103 +Visit 3430800 599 +Visit 3430800 598 +Visit 3430800 597 +Offload 3430800 7878 10 +Offload 3431200 7960 72 +Offload 3434080 7463 4 +Reload 3434240 8234 86 +Offload 3437680 7467 63 +Reload 3440200 7917 63 +Offload 3442720 7530 36 +Offload 3444160 7780 4 +Reload 3444320 7600 40 +Visit 3445920 602 +Visit 3445920 601 +Visit 3445920 600 +Offload 3445920 7784 52 +Offload 3448000 8097 41 +Reload 3449640 8371 93 +Offload 3453360 7600 40 +Offload 3454960 7917 30 +Reload 3456160 8054 70 +Offload 3458960 7947 33 +Offload 3460280 8138 14 +Reload 3460840 7737 47 +Visit 3462720 605 +Visit 3462720 604 +Visit 3462720 603 +Offload 3462720 8152 24 +Offload 3463680 8234 76 +Reload 3466720 8508 100 +Offload 3470720 7737 47 +Offload 3472600 8054 30 +Reload 3473800 8191 77 +Offload 3476880 8084 40 +Offload 3478480 8310 10 +Offload 3478880 8371 4 +Reload 3479040 7874 54 +Visit 3481200 608 +Visit 3481200 607 +Visit 3481200 606 +Offload 3481200 8375 89 +Offload 3484760 7874 18 +Reload 3485480 8645 107 +Offload 3489760 7892 36 +Offload 3491200 8191 48 +Reload 3493120 8328 84 +Offload 3496480 8239 29 +Offload 3497640 8508 32 +Reload 3498920 8011 61 +Visit 3501360 611 +Visit 3501360 610 +Visit 3501360 609 +Offload 3501360 8540 44 +Reload 3503120 8782 44 +Offload 3504880 8011 61 +Offload 3507320 8328 30 +Reload 3508520 8465 91 +Offload 3512160 8358 54 +Offload 3514320 8584 14 +Reload 3514880 8148 68 +Visit 3517600 614 +Visit 3517600 613 +Visit 3517600 612 +Offload 3517600 8598 10 +Offload 3518000 8645 41 +Reload 3519640 8919 51 +Offload 3521680 8148 68 +Offload 3524400 8465 16 +Reload 3525040 8602 84 +Offload 3528400 8481 75 +Reload 3531400 8285 75 +Visit 3534400 617 +Visit 3534400 616 +Visit 3534400 615 +Offload 3534400 8700 52 +Offload 3536480 8782 6 +Reload 3536720 9056 58 +Offload 3539040 8285 67 +Reload 3541720 8739 49 +Reload 3543680 8826 18 +Offload 3544400 8352 8 +Offload 3544720 8602 74 +Reload 3547680 8422 82 +Visit 3550960 620 +Visit 3550960 619 +Visit 3550960 618 +Offload 3550960 8676 24 +Offload 3551920 8919 41 +Reload 3553560 9193 65 +Offload 3556160 8422 42 +Reload 3557840 8876 42 +Offload 3559520 8464 40 +Offload 3561120 8739 49 +Reload 3563080 8559 89 +Visit 3566640 623 +Visit 3566640 622 +Visit 3566640 621 +Offload 3566640 8788 56 +Offload 3568880 8960 10 +Offload 3569280 9056 6 +Reload 3569520 9330 72 +Offload 3572400 8559 49 +Reload 3574360 9013 49 +Offload 3576320 8608 40 +Offload 3577920 8876 42 +Offload 3579600 9062 14 +Reload 3580160 8696 96 +Visit 3584000 626 +Visit 3584000 625 +Visit 3584000 624 +Offload 3584000 9076 38 +Offload 3585520 9193 41 +Reload 3587160 9467 79 +Offload 3590320 8696 56 +Reload 3592560 9150 56 +Offload 3594800 8752 40 +Offload 3596400 9013 49 +Offload 3598360 9234 14 +Reload 3598920 8833 103 +Visit 3603040 629 +Visit 3603040 628 +Visit 3603040 627 +Offload 3603040 9248 10 +Offload 3603440 9330 72 +Offload 3606320 8833 4 +Reload 3606480 9604 86 +Offload 3609920 8837 63 +Reload 3612440 9287 63 +Offload 3614960 8900 36 +Offload 3616400 9150 4 +Reload 3616560 8970 40 +Visit 3618160 632 +Visit 3618160 631 +Visit 3618160 630 +Offload 3618160 9154 52 +Offload 3620240 9467 41 +Reload 3621880 9741 93 +Offload 3625600 8970 40 +Offload 3627200 9287 30 +Reload 3628400 9424 70 +Offload 3631200 9317 33 +Offload 3632520 9508 14 +Reload 3633080 9107 47 +Visit 3634960 635 +Visit 3634960 634 +Visit 3634960 633 +Offload 3634960 9522 24 +Offload 3635920 9604 76 +Reload 3638960 9878 100 +Offload 3642960 9107 47 +Offload 3644840 9424 30 +Reload 3646040 9561 77 +Offload 3649120 9454 40 +Offload 3650720 9680 10 +Offload 3651120 9741 4 +Reload 3651280 9244 54 +Visit 3653440 638 +Visit 3653440 637 +Visit 3653440 636 +Offload 3653440 9745 89 +Offload 3657000 9244 18 +Reload 3657720 10015 107 +Offload 3662000 9262 36 +Offload 3663440 9561 48 +Reload 3665360 9698 84 +Offload 3668720 9609 29 +Offload 3669880 9878 32 +Reload 3671160 9381 61 +Visit 3673600 641 +Visit 3673600 640 +Visit 3673600 639 +Offload 3673600 9910 44 +Reload 3675360 10152 44 +Offload 3677120 9381 61 +Offload 3679560 9698 30 +Reload 3680760 9835 91 +Offload 3684400 9728 54 +Offload 3686560 9954 14 +Reload 3687120 9518 68 +Visit 3689840 644 +Visit 3689840 643 +Visit 3689840 642 +Offload 3689840 9968 10 +Offload 3690240 10015 41 +Reload 3691880 10289 51 +Offload 3693920 9518 68 +Offload 3696640 9835 16 +Reload 3697280 9972 84 +Offload 3700640 9851 75 +Reload 3703640 9655 75 +Visit 3706640 647 +Visit 3706640 646 +Visit 3706640 645 +Offload 3706640 10070 52 +Offload 3708720 10152 6 +Reload 3708960 10426 58 +Offload 3711280 9655 67 +Reload 3713960 10109 49 +Reload 3715920 10196 18 +Offload 3716640 9722 8 +Offload 3716960 9972 74 +Reload 3719920 9792 82 +Visit 3723200 650 +Visit 3723200 649 +Visit 3723200 648 +Offload 3723200 10046 24 +Offload 3724160 10289 41 +Reload 3725800 10563 65 +Offload 3728400 9792 42 +Reload 3730080 10246 42 +Offload 3731760 9834 40 +Offload 3733360 10109 49 +Reload 3735320 9929 89 +Visit 3738880 653 +Visit 3738880 652 +Visit 3738880 651 +Offload 3738880 10158 56 +Offload 3741120 10330 10 +Offload 3741520 10426 6 +Reload 3741760 10700 72 +Offload 3744640 9929 49 +Reload 3746600 10383 49 +Offload 3748560 9978 40 +Offload 3750160 10246 42 +Offload 3751840 10432 14 +Reload 3752400 10066 96 +Visit 3756240 656 +Visit 3756240 655 +Visit 3756240 654 +Offload 3756240 10446 38 +Offload 3757760 10563 41 +Reload 3759400 10837 79 +Offload 3762560 10066 56 +Reload 3764800 10520 56 +Offload 3767040 10122 40 +Offload 3768640 10383 49 +Offload 3770600 10604 14 +Reload 3771160 10203 103 +Visit 3775280 659 +Visit 3775280 658 +Visit 3775280 657 +Offload 3775280 10618 10 +Offload 3775680 10700 72 +Offload 3778560 10203 4 +Reload 3778720 10974 86 +Offload 3782160 10207 63 +Reload 3784680 10657 63 +Offload 3787200 10270 36 +Offload 3788640 10520 4 +Reload 3788800 10340 40 +Visit 3790400 662 +Visit 3790400 661 +Visit 3790400 660 +Offload 3790400 10524 52 +Offload 3792480 10837 41 +Reload 3794120 11111 93 +Offload 3797840 10340 40 +Offload 3799440 10657 30 +Reload 3800640 10794 70 +Offload 3803440 10687 33 +Offload 3804760 10878 14 +Reload 3805320 10477 47 +Visit 3807200 665 +Visit 3807200 664 +Visit 3807200 663 +Offload 3807200 10892 24 +Offload 3808160 10974 76 +Reload 3811200 11248 100 +Offload 3815200 10477 47 +Offload 3817080 10794 30 +Reload 3818280 10931 77 +Offload 3821360 10824 40 +Offload 3822960 11050 10 +Offload 3823360 11111 4 +Reload 3823520 10614 54 +Visit 3825680 668 +Visit 3825680 667 +Visit 3825680 666 +Offload 3825680 11115 89 +Offload 3829240 10614 18 +Reload 3829960 11385 107 +Offload 3834240 10632 36 +Offload 3835680 10931 48 +Reload 3837600 11068 84 +Offload 3840960 10979 29 +Offload 3842120 11248 32 +Reload 3843400 10751 61 +Visit 3845840 671 +Visit 3845840 670 +Visit 3845840 669 +Offload 3845840 11280 44 +Reload 3847600 11522 44 +Offload 3849360 10751 61 +Offload 3851800 11068 30 +Reload 3853000 11205 91 +Offload 3856640 11098 54 +Offload 3858800 11324 14 +Reload 3859360 10888 68 +Visit 3862080 674 +Visit 3862080 673 +Visit 3862080 672 +Offload 3862080 11338 10 +Offload 3862480 11385 41 +Reload 3864120 11659 51 +Offload 3866160 10888 68 +Offload 3868880 11205 16 +Reload 3869520 11342 84 +Offload 3872880 11221 75 +Reload 3875880 11025 75 +Visit 3878880 677 +Visit 3878880 676 +Visit 3878880 675 +Offload 3878880 11440 52 +Offload 3880960 11522 6 +Reload 3881200 11796 58 +Offload 3883520 11025 67 +Reload 3886200 11479 49 +Reload 3888160 11566 18 +Offload 3888880 11092 8 +Offload 3889200 11342 74 +Reload 3892160 11162 82 +Visit 3895440 680 +Visit 3895440 679 +Visit 3895440 678 +Offload 3895440 11416 24 +Offload 3896400 11659 41 +Reload 3898040 11933 65 +Offload 3900640 11162 42 +Reload 3902320 11616 42 +Offload 3904000 11204 40 +Offload 3905600 11479 49 +Reload 3907560 11299 89 +Visit 3911120 683 +Visit 3911120 682 +Visit 3911120 681 +Offload 3911120 11528 56 +Offload 3913360 11700 10 +Offload 3913760 11796 6 +Reload 3914000 12070 72 +Offload 3916880 11299 49 +Reload 3918840 11753 49 +Offload 3920800 11348 40 +Offload 3922400 11616 42 +Offload 3924080 11802 14 +Reload 3924640 11436 96 +Visit 3928480 686 +Visit 3928480 685 +Visit 3928480 684 +Offload 3928480 11816 38 +Offload 3930000 11933 41 +Reload 3931640 12207 79 +Offload 3934800 11436 56 +Reload 3937040 11890 56 +Offload 3939280 11492 40 +Offload 3940880 11753 49 +Offload 3942840 11974 14 +Reload 3943400 11573 103 +Visit 3947520 689 +Visit 3947520 688 +Visit 3947520 687 +Offload 3947520 11988 10 +Offload 3947920 12070 72 +Offload 3950800 11573 4 +Reload 3950960 12344 86 +Offload 3954400 11577 63 +Reload 3956920 12027 63 +Offload 3959440 11640 36 +Offload 3960880 11890 4 +Reload 3961040 11710 40 +Visit 3962640 692 +Visit 3962640 691 +Visit 3962640 690 +Offload 3962640 11894 52 +Offload 3964720 12207 41 +Reload 3966360 12481 93 +Offload 3970080 11710 40 +Offload 3971680 12027 30 +Reload 3972880 12164 70 +Offload 3975680 12057 33 +Offload 3977000 12248 14 +Reload 3977560 11847 47 +Visit 3979440 695 +Visit 3979440 694 +Visit 3979440 693 +Offload 3979440 12262 24 +Offload 3980400 12344 76 +Reload 3983440 12618 100 +Offload 3987440 11847 47 +Offload 3989320 12164 30 +Reload 3990520 12301 77 +Offload 3993600 12194 40 +Offload 3995200 12420 10 +Offload 3995600 12481 4 +Reload 3995760 11984 54 +Visit 3997920 698 +Visit 3997920 697 +Visit 3997920 696 +Offload 3997920 12485 89 +Offload 4001480 11984 18 +Reload 4002200 12755 107 +Offload 4006480 12002 36 +Offload 4007920 12301 48 +Reload 4009840 12438 84 +Offload 4013200 12349 29 +Offload 4014360 12618 32 +Reload 4015640 12121 61 +Visit 4018080 701 +Visit 4018080 700 +Visit 4018080 699 +Offload 4018080 12650 44 +Reload 4019840 12892 44 +Offload 4021600 12121 61 +Offload 4024040 12438 30 +Reload 4025240 12575 91 +Offload 4028880 12468 54 +Offload 4031040 12694 14 +Reload 4031600 12258 68 +Visit 4034320 704 +Visit 4034320 703 +Visit 4034320 702 +Offload 4034320 12708 10 +Offload 4034720 12755 41 +Reload 4036360 13029 51 +Offload 4038400 12258 68 +Offload 4041120 12575 16 +Reload 4041760 12712 84 +Offload 4045120 12591 75 +Reload 4048120 12395 75 +Visit 4051120 707 +Visit 4051120 706 +Visit 4051120 705 +Offload 4051120 12810 52 +Offload 4053200 12892 6 +Reload 4053440 13166 58 +Offload 4055760 12395 67 +Reload 4058440 12849 49 +Reload 4060400 12936 18 +Offload 4061120 12462 8 +Offload 4061440 12712 74 +Reload 4064400 12532 82 +Visit 4067680 710 +Visit 4067680 709 +Visit 4067680 708 +Offload 4067680 12786 24 +Offload 4068640 13029 41 +Reload 4070280 13303 65 +Offload 4072880 12532 42 +Reload 4074560 12986 42 +Offload 4076240 12574 40 +Offload 4077840 12849 49 +Reload 4079800 12669 89 +Visit 4083360 713 +Visit 4083360 712 +Visit 4083360 711 +Offload 4083360 12898 56 +Offload 4085600 13070 10 +Offload 4086000 13166 6 +Reload 4086240 13440 72 +Offload 4089120 12669 49 +Reload 4091080 13123 49 +Offload 4093040 12718 40 +Offload 4094640 12986 42 +Offload 4096320 13172 14 +Reload 4096880 12806 96 +Visit 4100720 716 +Visit 4100720 715 +Visit 4100720 714 +Offload 4100720 13186 38 +Offload 4102240 13303 41 +Reload 4103880 13577 79 +Offload 4107040 12806 56 +Reload 4109280 13260 56 +Offload 4111520 12862 40 +Offload 4113120 13123 49 +Offload 4115080 13344 14 +Reload 4115640 12943 103 +Visit 4119760 719 +Visit 4119760 718 +Visit 4119760 717 +Offload 4119760 13358 10 +Offload 4120160 13440 72 +Offload 4123040 12943 4 +Reload 4123200 13714 86 +Offload 4126640 12947 63 +Reload 4129160 13397 63 +Offload 4131680 13010 36 +Offload 4133120 13260 4 +Reload 4133280 13080 40 +Visit 4134880 722 +Visit 4134880 721 +Visit 4134880 720 +Offload 4134880 13264 52 +Offload 4136960 13577 41 +Reload 4138600 13851 93 +Offload 4142320 13080 40 +Offload 4143920 13397 30 +Reload 4145120 13534 70 +Offload 4147920 13427 33 +Offload 4149240 13618 14 +Reload 4149800 13217 47 +Visit 4151680 725 +Visit 4151680 724 +Visit 4151680 723 +Offload 4151680 13632 24 +Offload 4152640 13714 76 +Reload 4155680 13988 100 +Offload 4159680 13217 47 +Offload 4161560 13534 30 +Reload 4162760 13671 77 +Offload 4165840 13564 40 +Offload 4167440 13790 10 +Offload 4167840 13851 4 +Reload 4168000 13354 54 +Visit 4170160 728 +Visit 4170160 727 +Visit 4170160 726 +Offload 4170160 13855 89 +Offload 4173720 13354 18 +Reload 4174440 14125 107 +Offload 4178720 13372 36 +Offload 4180160 13671 48 +Reload 4182080 13808 84 +Offload 4185440 13719 29 +Offload 4186600 13988 32 +Reload 4187880 13491 61 +Visit 4190320 731 +Visit 4190320 730 +Visit 4190320 729 +Offload 4190320 14020 44 +Reload 4192080 14262 44 +Offload 4193840 13491 61 +Offload 4196280 13808 30 +Reload 4197480 13945 91 +Offload 4201120 13838 54 +Offload 4203280 14064 14 +Reload 4203840 13628 68 +Visit 4206560 734 +Visit 4206560 733 +Visit 4206560 732 +Offload 4206560 14078 10 +Offload 4206960 14125 41 +Reload 4208600 14399 51 +Offload 4210640 13628 68 +Offload 4213360 13945 16 +Reload 4214000 14082 84 +Offload 4217360 13961 75 +Reload 4220360 13765 75 +Visit 4223360 737 +Visit 4223360 736 +Visit 4223360 735 +Offload 4223360 14180 52 +Offload 4225440 14262 6 +Reload 4225680 14536 58 +Offload 4228000 13765 67 +Reload 4230680 14219 49 +Reload 4232640 14306 18 +Offload 4233360 13832 8 +Offload 4233680 14082 74 +Reload 4236640 13902 82 +Visit 4239920 740 +Visit 4239920 739 +Visit 4239920 738 +Offload 4239920 14156 24 +Offload 4240880 14399 41 +Reload 4242520 14673 65 +Offload 4245120 13902 42 +Reload 4246800 14356 42 +Offload 4248480 13944 40 +Offload 4250080 14219 49 +Reload 4252040 14039 89 +Visit 4255600 743 +Visit 4255600 742 +Visit 4255600 741 +Offload 4255600 14268 56 +Offload 4257840 14440 10 +Offload 4258240 14536 6 +Reload 4258480 14810 72 +Offload 4261360 14039 49 +Reload 4263320 14493 49 +Offload 4265280 14088 40 +Offload 4266880 14356 42 +Offload 4268560 14542 14 +Reload 4269120 14176 96 +Visit 4272960 746 +Visit 4272960 745 +Visit 4272960 744 +Offload 4272960 14556 38 +Offload 4274480 14673 41 +Reload 4276120 14947 79 +Offload 4279280 14176 56 +Reload 4281520 14630 56 +Offload 4283760 14232 40 +Offload 4285360 14493 49 +Offload 4287320 14714 14 +Reload 4287880 14313 103 +Visit 4292000 749 +Visit 4292000 748 +Visit 4292000 747 +Offload 4292000 14728 10 +Offload 4292400 14810 72 +Offload 4295280 14313 4 +Reload 4295440 15084 86 +Offload 4298880 14317 63 +Reload 4301400 14767 63 +Offload 4303920 14380 36 +Offload 4305360 14630 4 +Reload 4305520 14450 40 +Visit 4307120 752 +Visit 4307120 751 +Visit 4307120 750 +Offload 4307120 14634 52 +Offload 4309200 14947 41 +Reload 4310840 15221 93 +Offload 4314560 14450 40 +Offload 4316160 14767 30 +Reload 4317360 14904 70 +Offload 4320160 14797 33 +Offload 4321480 14988 14 +Reload 4322040 14587 47 +Visit 4323920 755 +Visit 4323920 754 +Visit 4323920 753 +Offload 4323920 15002 24 +Offload 4324880 15084 76 +Reload 4327920 15358 100 +Offload 4331920 14587 47 +Offload 4333800 14904 30 +Reload 4335000 15041 77 +Offload 4338080 14934 40 +Offload 4339680 15160 10 +Offload 4340080 15221 4 +Reload 4340240 14724 54 +Visit 4342400 758 +Visit 4342400 757 +Visit 4342400 756 +Offload 4342400 15225 89 +Offload 4345960 14724 18 +Reload 4346680 15495 107 +Offload 4350960 14742 36 +Offload 4352400 15041 48 +Reload 4354320 15178 84 +Offload 4357680 15089 29 +Offload 4358840 15358 32 +Reload 4360120 14861 61 +Visit 4362560 761 +Visit 4362560 760 +Visit 4362560 759 +Offload 4362560 15390 44 +Reload 4364320 15632 44 +Offload 4366080 14861 61 +Offload 4368520 15178 30 +Reload 4369720 15315 91 +Offload 4373360 15208 54 +Offload 4375520 15434 14 +Reload 4376080 14998 68 +Visit 4378800 764 +Visit 4378800 763 +Visit 4378800 762 +Offload 4378800 15448 10 +Offload 4379200 15495 41 +Reload 4380840 15769 51 +Offload 4382880 14998 68 +Offload 4385600 15315 16 +Reload 4386240 15452 84 +Offload 4389600 15331 75 +Reload 4392600 15135 75 +Visit 4395600 767 +Visit 4395600 766 +Visit 4395600 765 +Offload 4395600 15550 52 +Offload 4397680 15632 6 +Reload 4397920 15906 58 +Offload 4400240 15135 67 +Reload 4402920 15589 49 +Reload 4404880 15676 18 +Offload 4405600 15202 8 +Offload 4405920 15452 74 +Reload 4408880 15272 82 +Visit 4412160 770 +Visit 4412160 769 +Visit 4412160 768 +Offload 4412160 15526 24 +Offload 4413120 15769 41 +Reload 4414760 16043 65 +Offload 4417360 15272 42 +Reload 4419040 15726 42 +Offload 4420720 15314 40 +Offload 4422320 15589 49 +Reload 4424280 15409 89 +Visit 4427840 773 +Visit 4427840 772 +Visit 4427840 771 +Offload 4427840 15638 56 +Offload 4430080 15810 10 +Offload 4430480 15906 6 +Reload 4430720 16180 72 +Offload 4433600 15409 49 +Reload 4435560 15863 49 +Offload 4437520 15458 40 +Offload 4439120 15726 42 +Offload 4440800 15912 14 +Reload 4441360 15546 96 +Visit 4445200 776 +Visit 4445200 775 +Visit 4445200 774 +Offload 4445200 15926 38 +Offload 4446720 16043 41 +Reload 4448360 16317 79 +Offload 4451520 15546 56 +Reload 4453760 16000 56 +Offload 4456000 15602 40 +Offload 4457600 15863 49 +Offload 4459560 16084 14 +Reload 4460120 15683 103 +Visit 4464240 779 +Visit 4464240 778 +Visit 4464240 777 +Offload 4464240 16098 10 +Offload 4464640 16180 72 +Offload 4467520 15683 4 +Reload 4467680 16454 86 +Offload 4471120 15687 63 +Reload 4473640 16137 63 +Offload 4476160 15750 36 +Offload 4477600 16000 4 +Reload 4477760 15820 40 +Visit 4479360 782 +Visit 4479360 781 +Visit 4479360 780 +Offload 4479360 16004 52 +Offload 4481440 16317 41 +Reload 4483080 16591 93 +Offload 4486800 15820 40 +Offload 4488400 16137 30 +Reload 4489600 16274 70 +Offload 4492400 16167 33 +Offload 4493720 16358 14 +Reload 4494280 15957 47 +Visit 4496160 785 +Visit 4496160 784 +Visit 4496160 783 +Offload 4496160 16372 24 +Offload 4497120 16454 76 +Reload 4500160 16728 100 +Offload 4504160 15957 47 +Offload 4506040 16274 30 +Reload 4507240 16411 77 +Offload 4510320 16304 40 +Offload 4511920 16530 10 +Offload 4512320 16591 4 +Reload 4512480 16094 54 +Visit 4514640 788 +Visit 4514640 787 +Visit 4514640 786 +Offload 4514640 16595 89 +Offload 4518200 16094 18 +Reload 4518920 16865 107 +Offload 4523200 16112 36 +Offload 4524640 16411 48 +Reload 4526560 16548 84 +Offload 4529920 16459 29 +Offload 4531080 16728 32 +Reload 4532360 16231 61 +Visit 4534800 791 +Visit 4534800 790 +Visit 4534800 789 +Offload 4534800 16760 44 +Reload 4536560 17002 44 +Offload 4538320 16231 61 +Offload 4540760 16548 30 +Reload 4541960 16685 91 +Offload 4545600 16578 54 +Offload 4547760 16804 14 +Reload 4548320 16368 68 +Visit 4551040 794 +Visit 4551040 793 +Visit 4551040 792 +Offload 4551040 16818 10 +Offload 4551440 16865 41 +Reload 4553080 17139 51 +Offload 4555120 16368 68 +Offload 4557840 16685 16 +Reload 4558480 16822 84 +Offload 4561840 16701 75 +Reload 4564840 16505 75 +Visit 4567840 797 +Visit 4567840 796 +Visit 4567840 795 +Offload 4567840 16920 52 +Offload 4569920 17002 6 +Reload 4570160 17276 58 +Offload 4572480 16505 67 +Reload 4575160 16959 49 +Reload 4577120 17046 18 +Offload 4577840 16572 8 +Offload 4578160 16822 74 +Reload 4581120 16642 82 +Visit 4584400 800 +Visit 4584400 799 +Visit 4584400 798 +Offload 4584400 16896 24 +Offload 4585360 17139 41 +Reload 4587000 17413 65 +Offload 4589600 16642 42 +Reload 4591280 17096 42 +Offload 4592960 16684 40 +Offload 4594560 16959 49 +Reload 4596520 16779 89 +Visit 4600080 803 +Visit 4600080 802 +Visit 4600080 801 +Offload 4600080 17008 56 +Offload 4602320 17180 10 +Offload 4602720 17276 6 +Reload 4602960 17550 72 +Offload 4605840 16779 49 +Reload 4607800 17233 49 +Offload 4609760 16828 40 +Offload 4611360 17096 42 +Offload 4613040 17282 14 +Reload 4613600 16916 96 +Visit 4617440 806 +Visit 4617440 805 +Visit 4617440 804 +Offload 4617440 17296 38 +Offload 4618960 17413 41 +Reload 4620600 17687 79 +Offload 4623760 16916 56 +Reload 4626000 17370 56 +Offload 4628240 16972 40 +Offload 4629840 17233 49 +Offload 4631800 17454 14 +Reload 4632360 17053 103 +Visit 4636480 809 +Visit 4636480 808 +Visit 4636480 807 +Offload 4636480 17468 10 +Offload 4636880 17550 72 +Offload 4639760 17053 4 +Reload 4639920 17824 86 +Offload 4643360 17057 63 +Reload 4645880 17507 63 +Offload 4648400 17120 36 +Offload 4649840 17370 4 +Reload 4650000 17190 40 +Visit 4651600 812 +Visit 4651600 811 +Visit 4651600 810 +Offload 4651600 17374 52 +Offload 4653680 17687 41 +Reload 4655320 17961 93 +Offload 4659040 17190 40 +Offload 4660640 17507 30 +Reload 4661840 17644 70 +Offload 4664640 17537 33 +Offload 4665960 17728 14 +Reload 4666520 17327 47 +Visit 4668400 815 +Visit 4668400 814 +Visit 4668400 813 +Offload 4668400 17742 24 +Offload 4669360 17824 76 +Reload 4672400 18098 100 +Offload 4676400 17327 47 +Offload 4678280 17644 30 +Reload 4679480 17781 77 +Offload 4682560 17674 40 +Offload 4684160 17900 10 +Offload 4684560 17961 4 +Reload 4684720 17464 54 +Visit 4686880 818 +Visit 4686880 817 +Visit 4686880 816 +Offload 4686880 17965 89 +Offload 4690440 17464 18 +Reload 4691160 18235 107 +Offload 4695440 17482 36 +Offload 4696880 17781 48 +Reload 4698800 17918 84 +Offload 4702160 17829 29 +Offload 4703320 18098 32 +Reload 4704600 17601 61 +Visit 4707040 821 +Visit 4707040 820 +Visit 4707040 819 +Offload 4707040 18130 44 +Reload 4708800 18372 44 +Offload 4710560 17601 61 +Offload 4713000 17918 30 +Reload 4714200 18055 91 +Offload 4717840 17948 54 +Offload 4720000 18174 14 +Reload 4720560 17738 68 +Visit 4723280 824 +Visit 4723280 823 +Visit 4723280 822 +Offload 4723280 18188 10 +Offload 4723680 18235 41 +Reload 4725320 18509 51 +Offload 4727360 17738 68 +Offload 4730080 18055 16 +Reload 4730720 18192 84 +Offload 4734080 18071 75 +Reload 4737080 17875 75 +Visit 4740080 827 +Visit 4740080 826 +Visit 4740080 825 +Offload 4740080 18290 52 +Offload 4742160 18372 6 +Reload 4742400 18646 58 +Offload 4744720 17875 67 +Reload 4747400 18329 49 +Reload 4749360 18416 18 +Offload 4750080 17942 8 +Offload 4750400 18192 74 +Reload 4753360 18012 82 +Visit 4756640 830 +Visit 4756640 829 +Visit 4756640 828 +Offload 4756640 18266 24 +Offload 4757600 18509 41 +Reload 4759240 18783 65 +Offload 4761840 18012 42 +Reload 4763520 18466 42 +Offload 4765200 18054 40 +Offload 4766800 18329 49 +Reload 4768760 18149 89 +Visit 4772320 833 +Visit 4772320 832 +Visit 4772320 831 +Offload 4772320 18378 56 +Offload 4774560 18550 10 +Offload 4774960 18646 6 +Reload 4775200 18920 72 +Offload 4778080 18149 49 +Reload 4780040 18603 49 +Offload 4782000 18198 40 +Offload 4783600 18466 42 +Offload 4785280 18652 14 +Reload 4785840 18286 96 +Visit 4789680 836 +Visit 4789680 835 +Visit 4789680 834 +Offload 4789680 18666 38 +Offload 4791200 18783 41 +Reload 4792840 19057 79 +Offload 4796000 18286 56 +Reload 4798240 18740 56 +Offload 4800480 18342 40 +Offload 4802080 18603 49 +Offload 4804040 18824 14 +Reload 4804600 18423 103 +Visit 4808720 839 +Visit 4808720 838 +Visit 4808720 837 +Offload 4808720 18838 10 +Offload 4809120 18920 72 +Offload 4812000 18423 4 +Reload 4812160 19194 86 +Offload 4815600 18427 63 +Reload 4818120 18877 63 +Offload 4820640 18490 36 +Offload 4822080 18740 4 +Reload 4822240 18560 40 +Visit 4823840 842 +Visit 4823840 841 +Visit 4823840 840 +Offload 4823840 18744 52 +Offload 4825920 19057 41 +Reload 4827560 19331 93 +Offload 4831280 18560 40 +Offload 4832880 18877 30 +Reload 4834080 19014 70 +Offload 4836880 18907 33 +Offload 4838200 19098 14 +Reload 4838760 18697 47 +Visit 4840640 845 +Visit 4840640 844 +Visit 4840640 843 +Offload 4840640 19112 24 +Offload 4841600 19194 76 +Reload 4844640 19468 100 +Offload 4848640 18697 47 +Offload 4850520 19014 30 +Reload 4851720 19151 77 +Offload 4854800 19044 40 +Offload 4856400 19270 10 +Offload 4856800 19331 4 +Reload 4856960 18834 54 +Visit 4859120 848 +Visit 4859120 847 +Visit 4859120 846 +Offload 4859120 19335 89 +Offload 4862680 18834 18 +Reload 4863400 19605 107 +Offload 4867680 18852 36 +Offload 4869120 19151 48 +Reload 4871040 19288 84 +Offload 4874400 19199 29 +Offload 4875560 19468 32 +Reload 4876840 18971 61 +Visit 4879280 851 +Visit 4879280 850 +Visit 4879280 849 +Offload 4879280 19500 44 +Reload 4881040 19742 44 +Offload 4882800 18971 61 +Offload 4885240 19288 30 +Reload 4886440 19425 91 +Offload 4890080 19318 54 +Offload 4892240 19544 14 +Reload 4892800 19108 68 +Visit 4895520 854 +Visit 4895520 853 +Visit 4895520 852 +Offload 4895520 19558 4 +Offload 4895680 19660 33 +Reload 4897000 19568 37 +Offload 4898480 19108 68 +Offload 4901200 19425 7 +Reload 4901480 19245 75 +Offload 4904480 19432 51 +Reload 4906520 79 51 +Visit 4908560 856 +Visit 4908560 855 +Visit 4908560 857 +Offload 4908560 19483 33 +Offload 4909880 19693 6 +Offload 4910120 79 9 +Reload 4910480 19712 30 +Reload 4911680 19786 18 +Offload 4912400 88 42 +Offload 4914080 19245 40 +Reload 4915680 19382 82 +Offload 4918960 19285 35 +Offload 4920360 19562 23 +Reload 4921280 216 58 +Visit 4923600 859 +Visit 4923600 858 +Visit 4923600 860 +Offload 4923600 19608 52 +Offload 4925680 216 14 +Reload 4926240 19519 66 +Offload 4928880 230 44 +Offload 4930640 19382 21 +Reload 4931480 353 65 +Offload 4934080 19403 42 +Reload 4935760 36 42 +Visit 4937440 861 +Visit 4937440 863 +Visit 4937440 862 +Offload 4937440 19445 19 +Offload 4938200 19752 24 +Reload 4939160 19656 43 +Offload 4940880 36 42 +Offload 4942560 353 30 +Reload 4943760 490 72 +Offload 4946640 383 35 +Offload 4948040 19519 14 +Reload 4948600 173 49 +Visit 4950560 864 +Visit 4950560 866 +Visit 4950560 865 +Offload 4950560 19533 75 +Offload 4953560 19776 17 +Reload 4954240 19804 92 +Offload 4957920 173 49 +Offload 4959880 490 30 +Reload 4961080 627 79 +Offload 4964240 520 42 +Offload 4965920 19656 14 +Reload 4966480 310 56 +Visit 4968720 867 +Visit 4968720 869 +Visit 4968720 868 +Offload 4968720 19670 82 +Offload 4972000 310 4 +Reload 4972160 764 86 +Offload 4975600 314 52 +Offload 4977680 627 11 +Reload 4978120 447 63 +Offload 4980640 638 40 +Reload 4982240 130 40 +Visit 4983840 872 +Visit 4983840 871 +Visit 4983840 870 +Offload 4983840 678 28 +Offload 4984960 19793 65 +Reload 4987560 901 93 +Offload 4991280 130 40 +Offload 4992880 447 30 +Reload 4994080 584 70 +Offload 4996880 477 33 +Offload 4998200 764 14 +Reload 4998760 267 47 +Visit 5000640 875 +Visit 5000640 874 +Visit 5000640 873 +Offload 5000640 778 72 +Offload 5003520 19858 28 +Reload 5004640 1038 100 +Offload 5008640 267 47 +Offload 5010520 584 30 +Reload 5011720 721 77 +Offload 5014800 614 40 +Offload 5016400 901 14 +Reload 5016960 404 54 +Visit 5019120 878 +Visit 5019120 877 +Visit 5019120 876 +Offload 5019120 915 79 +Offload 5022280 19886 10 +Offload 5022680 404 18 +Reload 5023400 1175 107 +Offload 5027680 422 36 +Offload 5029120 721 48 +Reload 5031040 858 84 +Offload 5034400 769 29 +Offload 5035560 1038 32 +Reload 5036840 541 61 +Visit 5039280 881 +Visit 5039280 880 +Visit 5039280 879 +Offload 5039280 1070 44 +Reload 5041040 1312 44 +Offload 5042800 541 61 +Offload 5045240 858 30 +Reload 5046440 995 91 +Offload 5050080 888 54 +Offload 5052240 1114 14 +Reload 5052800 678 68 +Visit 5055520 884 +Visit 5055520 883 +Visit 5055520 882 +Offload 5055520 1128 10 +Offload 5055920 1175 41 +Reload 5057560 1449 51 +Offload 5059600 678 68 +Offload 5062320 995 16 +Reload 5062960 1132 84 +Offload 5066320 1011 75 +Reload 5069320 815 75 +Visit 5072320 887 +Visit 5072320 886 +Visit 5072320 885 +Offload 5072320 1230 52 +Offload 5074400 1312 6 +Reload 5074640 1586 58 +Offload 5076960 815 67 +Reload 5079640 1269 49 +Reload 5081600 1356 18 +Offload 5082320 882 8 +Offload 5082640 1132 74 +Reload 5085600 952 82 +Visit 5088880 890 +Visit 5088880 889 +Visit 5088880 888 +Offload 5088880 1206 24 +Offload 5089840 1449 41 +Reload 5091480 1723 65 +Offload 5094080 952 42 +Reload 5095760 1406 42 +Offload 5097440 994 40 +Offload 5099040 1269 49 +Reload 5101000 1089 89 +Visit 5104560 893 +Visit 5104560 892 +Visit 5104560 891 +Offload 5104560 1318 56 +Offload 5106800 1490 10 +Offload 5107200 1586 6 +Reload 5107440 1860 72 +Offload 5110320 1089 49 +Reload 5112280 1543 49 +Offload 5114240 1138 40 +Offload 5115840 1406 42 +Offload 5117520 1592 14 +Reload 5118080 1226 96 +Visit 5121920 896 +Visit 5121920 895 +Visit 5121920 894 +Offload 5121920 1606 38 +Offload 5123440 1723 41 +Reload 5125080 1997 79 +Offload 5128240 1226 56 +Reload 5130480 1680 56 +Offload 5132720 1282 40 +Offload 5134320 1543 49 +Offload 5136280 1764 14 +Reload 5136840 1363 103 +Visit 5140960 899 +Visit 5140960 898 +Visit 5140960 897 +Offload 5140960 1778 10 +Offload 5141360 1860 72 +Offload 5144240 1363 4 +Reload 5144400 2134 86 +Offload 5147840 1367 63 +Reload 5150360 1817 63 +Offload 5152880 1430 36 +Offload 5154320 1680 4 +Reload 5154480 1500 40 +Visit 5156080 902 +Visit 5156080 901 +Visit 5156080 900 +Offload 5156080 1684 52 +Offload 5158160 1997 41 +Reload 5159800 2271 93 +Offload 5163520 1500 40 +Offload 5165120 1817 30 +Reload 5166320 1954 70 +Offload 5169120 1847 33 +Offload 5170440 2038 14 +Reload 5171000 1637 47 +Visit 5172880 905 +Visit 5172880 904 +Visit 5172880 903 +Offload 5172880 2052 24 +Offload 5173840 2134 76 +Reload 5176880 2408 100 +Offload 5180880 1637 47 +Offload 5182760 1954 30 +Reload 5183960 2091 77 +Offload 5187040 1984 40 +Offload 5188640 2210 10 +Offload 5189040 2271 4 +Reload 5189200 1774 54 +Visit 5191360 908 +Visit 5191360 907 +Visit 5191360 906 +Offload 5191360 2275 89 +Offload 5194920 1774 18 +Reload 5195640 2545 107 +Offload 5199920 1792 36 +Offload 5201360 2091 48 +Reload 5203280 2228 84 +Offload 5206640 2139 29 +Offload 5207800 2408 32 +Reload 5209080 1911 61 +Visit 5211520 911 +Visit 5211520 910 +Visit 5211520 909 +Offload 5211520 2440 44 +Reload 5213280 2682 44 +Offload 5215040 1911 61 +Offload 5217480 2228 30 +Reload 5218680 2365 91 +Offload 5222320 2258 54 +Offload 5224480 2484 14 +Reload 5225040 2048 68 +Visit 5227760 914 +Visit 5227760 913 +Visit 5227760 912 +Offload 5227760 2498 10 +Offload 5228160 2545 41 +Reload 5229800 2819 51 +Offload 5231840 2048 68 +Offload 5234560 2365 16 +Reload 5235200 2502 84 +Offload 5238560 2381 75 +Reload 5241560 2185 75 +Visit 5244560 917 +Visit 5244560 916 +Visit 5244560 915 +Offload 5244560 2600 52 +Offload 5246640 2682 6 +Reload 5246880 2956 58 +Offload 5249200 2185 67 +Reload 5251880 2639 49 +Reload 5253840 2726 18 +Offload 5254560 2252 8 +Offload 5254880 2502 74 +Reload 5257840 2322 82 +Visit 5261120 920 +Visit 5261120 919 +Visit 5261120 918 +Offload 5261120 2576 24 +Offload 5262080 2819 41 +Reload 5263720 3093 65 +Offload 5266320 2322 42 +Reload 5268000 2776 42 +Offload 5269680 2364 40 +Offload 5271280 2639 49 +Reload 5273240 2459 89 +Visit 5276800 923 +Visit 5276800 922 +Visit 5276800 921 +Offload 5276800 2688 56 +Offload 5279040 2860 10 +Offload 5279440 2956 6 +Reload 5279680 3230 72 +Offload 5282560 2459 49 +Reload 5284520 2913 49 +Offload 5286480 2508 40 +Offload 5288080 2776 42 +Offload 5289760 2962 14 +Reload 5290320 2596 96 +Visit 5294160 926 +Visit 5294160 925 +Visit 5294160 924 +Offload 5294160 2976 38 +Offload 5295680 3093 41 +Reload 5297320 3367 79 +Offload 5300480 2596 56 +Reload 5302720 3050 56 +Offload 5304960 2652 40 +Offload 5306560 2913 49 +Offload 5308520 3134 14 +Reload 5309080 2733 103 +Visit 5313200 929 +Visit 5313200 928 +Visit 5313200 927 +Offload 5313200 3148 10 +Offload 5313600 3230 72 +Offload 5316480 2733 4 +Reload 5316640 3504 86 +Offload 5320080 2737 63 +Reload 5322600 3187 63 +Offload 5325120 2800 36 +Offload 5326560 3050 4 +Reload 5326720 2870 40 +Visit 5328320 932 +Visit 5328320 931 +Visit 5328320 930 +Offload 5328320 3054 52 +Offload 5330400 3367 41 +Reload 5332040 3641 93 +Offload 5335760 2870 40 +Offload 5337360 3187 30 +Reload 5338560 3324 70 +Offload 5341360 3217 33 +Offload 5342680 3408 14 +Reload 5343240 3007 47 +Visit 5345120 935 +Visit 5345120 934 +Visit 5345120 933 +Offload 5345120 3422 24 +Offload 5346080 3504 76 +Reload 5349120 3778 100 +Offload 5353120 3007 47 +Offload 5355000 3324 30 +Reload 5356200 3461 77 +Offload 5359280 3354 40 +Offload 5360880 3580 10 +Offload 5361280 3641 4 +Reload 5361440 3144 54 +Visit 5363600 938 +Visit 5363600 937 +Visit 5363600 936 +Offload 5363600 3645 89 +Offload 5367160 3144 18 +Reload 5367880 3915 107 +Offload 5372160 3162 36 +Offload 5373600 3461 48 +Reload 5375520 3598 84 +Offload 5378880 3509 29 +Offload 5380040 3778 32 +Reload 5381320 3281 61 +Visit 5383760 941 +Visit 5383760 940 +Visit 5383760 939 +Offload 5383760 3810 44 +Reload 5385520 4052 44 +Offload 5387280 3281 61 +Offload 5389720 3598 30 +Reload 5390920 3735 91 +Offload 5394560 3628 54 +Offload 5396720 3854 14 +Reload 5397280 3418 68 +Visit 5400000 944 +Visit 5400000 943 +Visit 5400000 942 +Offload 5400000 3868 10 +Offload 5400400 3915 41 +Reload 5402040 4189 51 +Offload 5404080 3418 68 +Offload 5406800 3735 16 +Reload 5407440 3872 84 +Offload 5410800 3751 75 +Reload 5413800 3555 75 +Visit 5416800 947 +Visit 5416800 946 +Visit 5416800 945 +Offload 5416800 3970 52 +Offload 5418880 4052 6 +Reload 5419120 4326 58 +Offload 5421440 3555 67 +Reload 5424120 4009 49 +Reload 5426080 4096 18 +Offload 5426800 3622 8 +Offload 5427120 3872 74 +Reload 5430080 3692 82 +Visit 5433360 950 +Visit 5433360 949 +Visit 5433360 948 +Offload 5433360 3946 24 +Offload 5434320 4189 41 +Reload 5435960 4463 65 +Offload 5438560 3692 42 +Reload 5440240 4146 42 +Offload 5441920 3734 40 +Offload 5443520 4009 49 +Reload 5445480 3829 89 +Visit 5449040 953 +Visit 5449040 952 +Visit 5449040 951 +Offload 5449040 4058 56 +Offload 5451280 4230 10 +Offload 5451680 4326 6 +Reload 5451920 4600 72 +Offload 5454800 3829 49 +Reload 5456760 4283 49 +Offload 5458720 3878 40 +Offload 5460320 4146 42 +Offload 5462000 4332 14 +Reload 5462560 3966 96 +Visit 5466400 956 +Visit 5466400 955 +Visit 5466400 954 +Offload 5466400 4346 38 +Offload 5467920 4463 41 +Reload 5469560 4737 79 +Offload 5472720 3966 56 +Reload 5474960 4420 56 +Offload 5477200 4022 40 +Offload 5478800 4283 49 +Offload 5480760 4504 14 +Reload 5481320 4103 103 +Visit 5485440 959 +Visit 5485440 958 +Visit 5485440 957 +Offload 5485440 4518 10 +Offload 5485840 4600 72 +Offload 5488720 4103 4 +Reload 5488880 4874 86 +Offload 5492320 4107 63 +Reload 5494840 4557 63 +Offload 5497360 4170 36 +Offload 5498800 4420 4 +Reload 5498960 4240 40 +Visit 5500560 962 +Visit 5500560 961 +Visit 5500560 960 +Offload 5500560 4424 52 +Offload 5502640 4737 41 +Reload 5504280 5011 93 +Offload 5508000 4240 40 +Offload 5509600 4557 30 +Reload 5510800 4694 70 +Offload 5513600 4587 33 +Offload 5514920 4778 14 +Reload 5515480 4377 47 +Visit 5517360 965 +Visit 5517360 964 +Visit 5517360 963 +Offload 5517360 4792 24 +Offload 5518320 4874 76 +Reload 5521360 5148 100 +Offload 5525360 4377 47 +Offload 5527240 4694 30 +Reload 5528440 4831 77 +Offload 5531520 4724 40 +Offload 5533120 4950 10 +Offload 5533520 5011 4 +Reload 5533680 4514 54 +Visit 5535840 968 +Visit 5535840 967 +Visit 5535840 966 +Offload 5535840 5015 89 +Offload 5539400 4514 18 +Reload 5540120 5285 107 +Offload 5544400 4532 36 +Offload 5545840 4831 48 +Reload 5547760 4968 84 +Offload 5551120 4879 29 +Offload 5552280 5148 32 +Reload 5553560 4651 61 +Visit 5556000 971 +Visit 5556000 970 +Visit 5556000 969 +Offload 5556000 5180 44 +Reload 5557760 5422 44 +Offload 5559520 4651 61 +Offload 5561960 4968 30 +Reload 5563160 5105 91 +Offload 5566800 4998 54 +Offload 5568960 5224 14 +Reload 5569520 4788 68 +Visit 5572240 974 +Visit 5572240 973 +Visit 5572240 972 +Offload 5572240 5238 10 +Offload 5572640 5285 41 +Reload 5574280 5559 51 +Offload 5576320 4788 68 +Offload 5579040 5105 16 +Reload 5579680 5242 84 +Offload 5583040 5121 75 +Reload 5586040 4925 75 +Visit 5589040 977 +Visit 5589040 976 +Visit 5589040 975 +Offload 5589040 5340 52 +Offload 5591120 5422 6 +Reload 5591360 5696 58 +Offload 5593680 4925 67 +Reload 5596360 5379 49 +Reload 5598320 5466 18 +Offload 5599040 4992 8 +Offload 5599360 5242 74 +Reload 5602320 5062 82 +Visit 5605600 980 +Visit 5605600 979 +Visit 5605600 978 +Offload 5605600 5316 24 +Offload 5606560 5559 41 +Reload 5608200 5833 65 +Offload 5610800 5062 42 +Reload 5612480 5516 42 +Offload 5614160 5104 40 +Offload 5615760 5379 49 +Reload 5617720 5199 89 +Visit 5621280 983 +Visit 5621280 982 +Visit 5621280 981 +Offload 5621280 5428 56 +Offload 5623520 5600 10 +Offload 5623920 5696 6 +Reload 5624160 5970 72 +Offload 5627040 5199 49 +Reload 5629000 5653 49 +Offload 5630960 5248 40 +Offload 5632560 5516 42 +Offload 5634240 5702 14 +Reload 5634800 5336 96 +Visit 5638640 986 +Visit 5638640 985 +Visit 5638640 984 +Offload 5638640 5716 38 +Offload 5640160 5833 41 +Reload 5641800 6107 79 +Offload 5644960 5336 56 +Reload 5647200 5790 56 +Offload 5649440 5392 40 +Offload 5651040 5653 49 +Offload 5653000 5874 14 +Reload 5653560 5473 103 +Visit 5657680 989 +Visit 5657680 988 +Visit 5657680 987 +Offload 5657680 5888 10 +Offload 5658080 5970 72 +Offload 5660960 5473 4 +Reload 5661120 6244 86 +Offload 5664560 5477 63 +Reload 5667080 5927 63 +Offload 5669600 5540 36 +Offload 5671040 5790 4 +Reload 5671200 5610 40 +Visit 5672800 992 +Visit 5672800 991 +Visit 5672800 990 +Offload 5672800 5794 52 +Offload 5674880 6107 41 +Reload 5676520 6381 93 +Offload 5680240 5610 40 +Offload 5681840 5927 30 +Reload 5683040 6064 70 +Offload 5685840 5957 33 +Offload 5687160 6148 14 +Reload 5687720 5747 47 +Visit 5689600 995 +Visit 5689600 994 +Visit 5689600 993 +Offload 5689600 6162 24 +Offload 5690560 6244 76 +Reload 5693600 6518 100 +Offload 5697600 5747 47 +Offload 5699480 6064 30 +Reload 5700680 6201 77 +Offload 5703760 6094 40 +Offload 5705360 6320 10 +Offload 5705760 6381 4 +Reload 5705920 5884 54 +Visit 5708080 998 +Visit 5708080 997 +Visit 5708080 996 +Offload 5708080 6385 89 +Offload 5711640 5884 18 +Reload 5712360 6655 107 +Offload 5716640 5902 36 +Offload 5718080 6201 48 +Reload 5720000 6338 84 +Offload 5723360 6249 29 +Offload 5724520 6518 32 +Reload 5725800 6021 61 +Visit 5728240 1001 +Visit 5728240 1000 +Visit 5728240 999 +Offload 5728240 6550 44 +Reload 5730000 6792 44 +Offload 5731760 6021 61 +Offload 5734200 6338 30 +Reload 5735400 6475 91 +Offload 5739040 6368 54 +Offload 5741200 6594 14 +Reload 5741760 6158 68 +Visit 5744480 1004 +Visit 5744480 1003 +Visit 5744480 1002 +Offload 5744480 6608 10 +Offload 5744880 6655 41 +Reload 5746520 6929 51 +Offload 5748560 6158 68 +Offload 5751280 6475 16 +Reload 5751920 6612 84 +Offload 5755280 6491 75 +Reload 5758280 6295 75 +Visit 5761280 1007 +Visit 5761280 1006 +Visit 5761280 1005 +Offload 5761280 6710 52 +Offload 5763360 6792 6 +Reload 5763600 7066 58 +Offload 5765920 6295 67 +Reload 5768600 6749 49 +Reload 5770560 6836 18 +Offload 5771280 6362 8 +Offload 5771600 6612 74 +Reload 5774560 6432 82 +Visit 5777840 1010 +Visit 5777840 1009 +Visit 5777840 1008 +Offload 5777840 6686 24 +Offload 5778800 6929 41 +Reload 5780440 7203 65 +Offload 5783040 6432 42 +Reload 5784720 6886 42 +Offload 5786400 6474 40 +Offload 5788000 6749 49 +Reload 5789960 6569 89 +Visit 5793520 1013 +Visit 5793520 1012 +Visit 5793520 1011 +Offload 5793520 6798 56 +Offload 5795760 6970 10 +Offload 5796160 7066 6 +Reload 5796400 7340 72 +Offload 5799280 6569 49 +Reload 5801240 7023 49 +Offload 5803200 6618 40 +Offload 5804800 6886 42 +Offload 5806480 7072 14 +Reload 5807040 6706 96 +Visit 5810880 1016 +Visit 5810880 1015 +Visit 5810880 1014 +Offload 5810880 7086 38 +Offload 5812400 7203 41 +Reload 5814040 7477 79 +Offload 5817200 6706 56 +Reload 5819440 7160 56 +Offload 5821680 6762 40 +Offload 5823280 7023 49 +Offload 5825240 7244 14 +Reload 5825800 6843 103 +Visit 5829920 1019 +Visit 5829920 1018 +Visit 5829920 1017 +Offload 5829920 7258 10 +Offload 5830320 7340 72 +Offload 5833200 6843 4 +Reload 5833360 7614 86 +Offload 5836800 6847 63 +Reload 5839320 7297 63 +Offload 5841840 6910 36 +Offload 5843280 7160 4 +Reload 5843440 6980 40 +Visit 5845040 1022 +Visit 5845040 1021 +Visit 5845040 1020 +Offload 5845040 7164 52 +Offload 5847120 7477 41 +Reload 5848760 7751 93 +Offload 5852480 6980 40 +Offload 5854080 7297 30 +Reload 5855280 7434 70 +Offload 5858080 7327 33 +Offload 5859400 7518 14 +Reload 5859960 7117 47 +Visit 5861840 1025 +Visit 5861840 1024 +Visit 5861840 1023 +Offload 5861840 7532 24 +Offload 5862800 7614 76 +Reload 5865840 7888 100 +Offload 5869840 7117 47 +Offload 5871720 7434 30 +Reload 5872920 7571 77 +Offload 5876000 7464 40 +Offload 5877600 7690 10 +Offload 5878000 7751 4 +Reload 5878160 7254 54 +Visit 5880320 1028 +Visit 5880320 1027 +Visit 5880320 1026 +Offload 5880320 7755 89 +Offload 5883880 7254 18 +Reload 5884600 8025 107 +Offload 5888880 7272 36 +Offload 5890320 7571 48 +Reload 5892240 7708 84 +Offload 5895600 7619 29 +Offload 5896760 7888 32 +Reload 5898040 7391 61 +Visit 5900480 1031 +Visit 5900480 1030 +Visit 5900480 1029 +Offload 5900480 7920 44 +Reload 5902240 8162 44 +Offload 5904000 7391 61 +Offload 5906440 7708 30 +Reload 5907640 7845 91 +Offload 5911280 7738 54 +Offload 5913440 7964 14 +Reload 5914000 7528 68 +Visit 5916720 1034 +Visit 5916720 1033 +Visit 5916720 1032 +Offload 5916720 7978 10 +Offload 5917120 8025 41 +Reload 5918760 8299 51 +Offload 5920800 7528 68 +Offload 5923520 7845 16 +Reload 5924160 7982 84 +Offload 5927520 7861 75 +Reload 5930520 7665 75 +Visit 5933520 1037 +Visit 5933520 1036 +Visit 5933520 1035 +Offload 5933520 8080 52 +Offload 5935600 8162 6 +Reload 5935840 8436 58 +Offload 5938160 7665 67 +Reload 5940840 8119 49 +Reload 5942800 8206 18 +Offload 5943520 7732 8 +Offload 5943840 7982 74 +Reload 5946800 7802 82 +Visit 5950080 1040 +Visit 5950080 1039 +Visit 5950080 1038 +Offload 5950080 8056 24 +Offload 5951040 8299 41 +Reload 5952680 8573 65 +Offload 5955280 7802 42 +Reload 5956960 8256 42 +Offload 5958640 7844 40 +Offload 5960240 8119 49 +Reload 5962200 7939 89 +Visit 5965760 1043 +Visit 5965760 1042 +Visit 5965760 1041 +Offload 5965760 8168 56 +Offload 5968000 8340 10 +Offload 5968400 8436 6 +Reload 5968640 8710 72 +Offload 5971520 7939 49 +Reload 5973480 8393 49 +Offload 5975440 7988 40 +Offload 5977040 8256 42 +Offload 5978720 8442 14 +Reload 5979280 8076 96 +Visit 5983120 1046 +Visit 5983120 1045 +Visit 5983120 1044 +Offload 5983120 8456 38 +Offload 5984640 8573 41 +Reload 5986280 8847 79 +Offload 5989440 8076 56 +Reload 5991680 8530 56 +Offload 5993920 8132 40 +Offload 5995520 8393 49 +Offload 5997480 8614 14 +Reload 5998040 8213 103 +Visit 6002160 1049 +Visit 6002160 1048 +Visit 6002160 1047 +Offload 6002160 8628 10 +Offload 6002560 8710 72 +Offload 6005440 8213 4 +Reload 6005600 8984 86 +Offload 6009040 8217 63 +Reload 6011560 8667 63 +Offload 6014080 8280 36 +Offload 6015520 8530 4 +Reload 6015680 8350 40 +Visit 6017280 1052 +Visit 6017280 1051 +Visit 6017280 1050 +Offload 6017280 8534 52 +Offload 6019360 8847 41 +Reload 6021000 9121 93 +Offload 6024720 8350 40 +Offload 6026320 8667 30 +Reload 6027520 8804 70 +Offload 6030320 8697 33 +Offload 6031640 8888 14 +Reload 6032200 8487 47 +Visit 6034080 1055 +Visit 6034080 1054 +Visit 6034080 1053 +Offload 6034080 8902 24 +Offload 6035040 8984 76 +Reload 6038080 9258 100 +Offload 6042080 8487 47 +Offload 6043960 8804 30 +Reload 6045160 8941 77 +Offload 6048240 8834 40 +Offload 6049840 9060 10 +Offload 6050240 9121 4 +Reload 6050400 8624 54 +Visit 6052560 1058 +Visit 6052560 1057 +Visit 6052560 1056 +Offload 6052560 9125 89 +Offload 6056120 8624 18 +Reload 6056840 9395 107 +Offload 6061120 8642 36 +Offload 6062560 8941 48 +Reload 6064480 9078 84 +Offload 6067840 8989 29 +Offload 6069000 9258 32 +Reload 6070280 8761 61 +Visit 6072720 1061 +Visit 6072720 1060 +Visit 6072720 1059 +Offload 6072720 9290 44 +Reload 6074480 9532 44 +Offload 6076240 8761 61 +Offload 6078680 9078 30 +Reload 6079880 9215 91 +Offload 6083520 9108 54 +Offload 6085680 9334 14 +Reload 6086240 8898 68 +Visit 6088960 1064 +Visit 6088960 1063 +Visit 6088960 1062 +Offload 6088960 9348 10 +Offload 6089360 9395 41 +Reload 6091000 9669 51 +Offload 6093040 8898 68 +Offload 6095760 9215 16 +Reload 6096400 9352 84 +Offload 6099760 9231 75 +Reload 6102760 9035 75 +Visit 6105760 1067 +Visit 6105760 1066 +Visit 6105760 1065 +Offload 6105760 9450 52 +Offload 6107840 9532 6 +Reload 6108080 9806 58 +Offload 6110400 9035 67 +Reload 6113080 9489 49 +Reload 6115040 9576 18 +Offload 6115760 9102 8 +Offload 6116080 9352 74 +Reload 6119040 9172 82 +Visit 6122320 1070 +Visit 6122320 1069 +Visit 6122320 1068 +Offload 6122320 9426 24 +Offload 6123280 9669 41 +Reload 6124920 9943 65 +Offload 6127520 9172 42 +Reload 6129200 9626 42 +Offload 6130880 9214 40 +Offload 6132480 9489 49 +Reload 6134440 9309 89 +Visit 6138000 1073 +Visit 6138000 1072 +Visit 6138000 1071 +Offload 6138000 9538 56 +Offload 6140240 9710 10 +Offload 6140640 9806 6 +Reload 6140880 10080 72 +Offload 6143760 9309 49 +Reload 6145720 9763 49 +Offload 6147680 9358 40 +Offload 6149280 9626 42 +Offload 6150960 9812 14 +Reload 6151520 9446 96 +Visit 6155360 1076 +Visit 6155360 1075 +Visit 6155360 1074 +Offload 6155360 9826 38 +Offload 6156880 9943 41 +Reload 6158520 10217 79 +Offload 6161680 9446 56 +Reload 6163920 9900 56 +Offload 6166160 9502 40 +Offload 6167760 9763 49 +Offload 6169720 9984 14 +Reload 6170280 9583 103 +Visit 6174400 1079 +Visit 6174400 1078 +Visit 6174400 1077 +Offload 6174400 9998 10 +Offload 6174800 10080 72 +Offload 6177680 9583 4 +Reload 6177840 10354 86 +Offload 6181280 9587 63 +Reload 6183800 10037 63 +Offload 6186320 9650 36 +Offload 6187760 9900 4 +Reload 6187920 9720 40 +Visit 6189520 1082 +Visit 6189520 1081 +Visit 6189520 1080 +Offload 6189520 9904 52 +Offload 6191600 10217 41 +Reload 6193240 10491 93 +Offload 6196960 9720 40 +Offload 6198560 10037 30 +Reload 6199760 10174 70 +Offload 6202560 10067 33 +Offload 6203880 10258 14 +Reload 6204440 9857 47 +Visit 6206320 1085 +Visit 6206320 1084 +Visit 6206320 1083 +Offload 6206320 10272 24 +Offload 6207280 10354 76 +Reload 6210320 10628 100 +Offload 6214320 9857 47 +Offload 6216200 10174 30 +Reload 6217400 10311 77 +Offload 6220480 10204 40 +Offload 6222080 10430 10 +Offload 6222480 10491 4 +Reload 6222640 9994 54 +Visit 6224800 1088 +Visit 6224800 1087 +Visit 6224800 1086 +Offload 6224800 10495 89 +Offload 6228360 9994 18 +Reload 6229080 10765 107 +Offload 6233360 10012 36 +Offload 6234800 10311 48 +Reload 6236720 10448 84 +Offload 6240080 10359 29 +Offload 6241240 10628 32 +Reload 6242520 10131 61 +Visit 6244960 1091 +Visit 6244960 1090 +Visit 6244960 1089 +Offload 6244960 10660 44 +Reload 6246720 10902 44 +Offload 6248480 10131 61 +Offload 6250920 10448 30 +Reload 6252120 10585 91 +Offload 6255760 10478 54 +Offload 6257920 10704 14 +Reload 6258480 10268 68 +Visit 6261200 1094 +Visit 6261200 1093 +Visit 6261200 1092 +Offload 6261200 10718 10 +Offload 6261600 10765 41 +Reload 6263240 11039 51 +Offload 6265280 10268 68 +Offload 6268000 10585 16 +Reload 6268640 10722 84 +Offload 6272000 10601 75 +Reload 6275000 10405 75 +Visit 6278000 1097 +Visit 6278000 1096 +Visit 6278000 1095 +Offload 6278000 10820 52 +Offload 6280080 10902 6 +Reload 6280320 11176 58 +Offload 6282640 10405 67 +Reload 6285320 10859 49 +Reload 6287280 10946 18 +Offload 6288000 10472 8 +Offload 6288320 10722 74 +Reload 6291280 10542 82 +Visit 6294560 1100 +Visit 6294560 1099 +Visit 6294560 1098 +Offload 6294560 10796 24 +Offload 6295520 11039 41 +Reload 6297160 11313 65 +Offload 6299760 10542 42 +Reload 6301440 10996 42 +Offload 6303120 10584 40 +Offload 6304720 10859 49 +Reload 6306680 10679 89 +Visit 6310240 1103 +Visit 6310240 1102 +Visit 6310240 1101 +Offload 6310240 10908 56 +Offload 6312480 11080 10 +Offload 6312880 11176 6 +Reload 6313120 11450 72 +Offload 6316000 10679 49 +Reload 6317960 11133 49 +Offload 6319920 10728 40 +Offload 6321520 10996 42 +Offload 6323200 11182 14 +Reload 6323760 10816 96 +Visit 6327600 1106 +Visit 6327600 1105 +Visit 6327600 1104 +Offload 6327600 11196 38 +Offload 6329120 11313 41 +Reload 6330760 11587 79 +Offload 6333920 10816 56 +Reload 6336160 11270 56 +Offload 6338400 10872 40 +Offload 6340000 11133 49 +Offload 6341960 11354 14 +Reload 6342520 10953 103 +Visit 6346640 1109 +Visit 6346640 1108 +Visit 6346640 1107 +Offload 6346640 11368 10 +Offload 6347040 11450 72 +Offload 6349920 10953 4 +Reload 6350080 11724 86 +Offload 6353520 10957 63 +Reload 6356040 11407 63 +Offload 6358560 11020 36 +Offload 6360000 11270 4 +Reload 6360160 11090 40 +Visit 6361760 1112 +Visit 6361760 1111 +Visit 6361760 1110 +Offload 6361760 11274 52 +Offload 6363840 11587 41 +Reload 6365480 11861 93 +Offload 6369200 11090 40 +Offload 6370800 11407 30 +Reload 6372000 11544 70 +Offload 6374800 11437 33 +Offload 6376120 11628 14 +Reload 6376680 11227 47 +Visit 6378560 1115 +Visit 6378560 1114 +Visit 6378560 1113 +Offload 6378560 11642 24 +Offload 6379520 11724 76 +Reload 6382560 11998 100 +Offload 6386560 11227 47 +Offload 6388440 11544 30 +Reload 6389640 11681 77 +Offload 6392720 11574 40 +Offload 6394320 11800 10 +Offload 6394720 11861 4 +Reload 6394880 11364 54 +Visit 6397040 1118 +Visit 6397040 1117 +Visit 6397040 1116 +Offload 6397040 11865 89 +Offload 6400600 11364 18 +Reload 6401320 12135 107 +Offload 6405600 11382 36 +Offload 6407040 11681 48 +Reload 6408960 11818 84 +Offload 6412320 11729 29 +Offload 6413480 11998 32 +Reload 6414760 11501 61 +Visit 6417200 1121 +Visit 6417200 1120 +Visit 6417200 1119 +Offload 6417200 12030 44 +Reload 6418960 12272 44 +Offload 6420720 11501 61 +Offload 6423160 11818 30 +Reload 6424360 11955 91 +Offload 6428000 11848 54 +Offload 6430160 12074 14 +Reload 6430720 11638 68 +Visit 6433440 1124 +Visit 6433440 1123 +Visit 6433440 1122 +Offload 6433440 12088 10 +Offload 6433840 12135 41 +Reload 6435480 12409 51 +Offload 6437520 11638 68 +Offload 6440240 11955 16 +Reload 6440880 12092 84 +Offload 6444240 11971 75 +Reload 6447240 11775 75 +Visit 6450240 1127 +Visit 6450240 1126 +Visit 6450240 1125 +Offload 6450240 12190 52 +Offload 6452320 12272 6 +Reload 6452560 12546 58 +Offload 6454880 11775 67 +Reload 6457560 12229 49 +Reload 6459520 12316 18 +Offload 6460240 11842 8 +Offload 6460560 12092 74 +Reload 6463520 11912 82 +Visit 6466800 1130 +Visit 6466800 1129 +Visit 6466800 1128 +Offload 6466800 12166 24 +Offload 6467760 12409 41 +Reload 6469400 12683 65 +Offload 6472000 11912 42 +Reload 6473680 12366 42 +Offload 6475360 11954 40 +Offload 6476960 12229 49 +Reload 6478920 12049 89 +Visit 6482480 1133 +Visit 6482480 1132 +Visit 6482480 1131 +Offload 6482480 12278 56 +Offload 6484720 12450 10 +Offload 6485120 12546 6 +Reload 6485360 12820 72 +Offload 6488240 12049 49 +Reload 6490200 12503 49 +Offload 6492160 12098 40 +Offload 6493760 12366 42 +Offload 6495440 12552 14 +Reload 6496000 12186 96 +Visit 6499840 1136 +Visit 6499840 1135 +Visit 6499840 1134 +Offload 6499840 12566 38 +Offload 6501360 12683 41 +Reload 6503000 12957 79 +Offload 6506160 12186 56 +Reload 6508400 12640 56 +Offload 6510640 12242 40 +Offload 6512240 12503 49 +Offload 6514200 12724 14 +Reload 6514760 12323 103 +Visit 6518880 1139 +Visit 6518880 1138 +Visit 6518880 1137 +Offload 6518880 12738 10 +Offload 6519280 12820 72 +Offload 6522160 12323 4 +Reload 6522320 13094 86 +Offload 6525760 12327 63 +Reload 6528280 12777 63 +Offload 6530800 12390 36 +Offload 6532240 12640 4 +Reload 6532400 12460 40 +Visit 6534000 1142 +Visit 6534000 1141 +Visit 6534000 1140 +Offload 6534000 12644 52 +Offload 6536080 12957 41 +Reload 6537720 13231 93 +Offload 6541440 12460 40 +Offload 6543040 12777 30 +Reload 6544240 12914 70 +Offload 6547040 12807 33 +Offload 6548360 12998 14 +Reload 6548920 12597 47 +Visit 6550800 1145 +Visit 6550800 1144 +Visit 6550800 1143 +Offload 6550800 13012 24 +Offload 6551760 13094 76 +Reload 6554800 13368 100 +Offload 6558800 12597 47 +Offload 6560680 12914 30 +Reload 6561880 13051 77 +Offload 6564960 12944 40 +Offload 6566560 13170 10 +Offload 6566960 13231 4 +Reload 6567120 12734 54 +Visit 6569280 1148 +Visit 6569280 1147 +Visit 6569280 1146 +Offload 6569280 13235 89 +Offload 6572840 12734 18 +Reload 6573560 13505 107 +Offload 6577840 12752 36 +Offload 6579280 13051 48 +Reload 6581200 13188 84 +Offload 6584560 13099 29 +Offload 6585720 13368 32 +Reload 6587000 12871 61 +Visit 6589440 1151 +Visit 6589440 1150 +Visit 6589440 1149 +Offload 6589440 13400 44 +Reload 6591200 13642 44 +Offload 6592960 12871 61 +Offload 6595400 13188 30 +Reload 6596600 13325 91 +Offload 6600240 13218 54 +Offload 6602400 13444 14 +Reload 6602960 13008 68 +Visit 6605680 1154 +Visit 6605680 1153 +Visit 6605680 1152 +Offload 6605680 13458 10 +Offload 6606080 13505 41 +Reload 6607720 13779 51 +Offload 6609760 13008 68 +Offload 6612480 13325 16 +Reload 6613120 13462 84 +Offload 6616480 13341 75 +Reload 6619480 13145 75 +Visit 6622480 1157 +Visit 6622480 1156 +Visit 6622480 1155 +Offload 6622480 13560 52 +Offload 6624560 13642 6 +Reload 6624800 13916 58 +Offload 6627120 13145 67 +Reload 6629800 13599 49 +Reload 6631760 13686 18 +Offload 6632480 13212 8 +Offload 6632800 13462 74 +Reload 6635760 13282 82 +Visit 6639040 1160 +Visit 6639040 1159 +Visit 6639040 1158 +Offload 6639040 13536 24 +Offload 6640000 13779 41 +Reload 6641640 14053 65 +Offload 6644240 13282 42 +Reload 6645920 13736 42 +Offload 6647600 13324 40 +Offload 6649200 13599 49 +Reload 6651160 13419 89 +Visit 6654720 1163 +Visit 6654720 1162 +Visit 6654720 1161 +Offload 6654720 13648 56 +Offload 6656960 13820 10 +Offload 6657360 13916 6 +Reload 6657600 14190 72 +Offload 6660480 13419 49 +Reload 6662440 13873 49 +Offload 6664400 13468 40 +Offload 6666000 13736 42 +Offload 6667680 13922 14 +Reload 6668240 13556 96 +Visit 6672080 1166 +Visit 6672080 1165 +Visit 6672080 1164 +Offload 6672080 13936 38 +Offload 6673600 14053 41 +Reload 6675240 14327 79 +Offload 6678400 13556 56 +Reload 6680640 14010 56 +Offload 6682880 13612 40 +Offload 6684480 13873 49 +Offload 6686440 14094 14 +Reload 6687000 13693 103 +Visit 6691120 1169 +Visit 6691120 1168 +Visit 6691120 1167 +Offload 6691120 14108 10 +Offload 6691520 14190 72 +Offload 6694400 13693 4 +Reload 6694560 14464 86 +Offload 6698000 13697 63 +Reload 6700520 14147 63 +Offload 6703040 13760 36 +Offload 6704480 14010 4 +Reload 6704640 13830 40 +Visit 6706240 1172 +Visit 6706240 1171 +Visit 6706240 1170 +Offload 6706240 14014 52 +Offload 6708320 14327 41 +Reload 6709960 14601 93 +Offload 6713680 13830 40 +Offload 6715280 14147 30 +Reload 6716480 14284 70 +Offload 6719280 14177 33 +Offload 6720600 14368 14 +Reload 6721160 13967 47 +Visit 6723040 1175 +Visit 6723040 1174 +Visit 6723040 1173 +Offload 6723040 14382 24 +Offload 6724000 14464 76 +Reload 6727040 14738 100 +Offload 6731040 13967 47 +Offload 6732920 14284 30 +Reload 6734120 14421 77 +Offload 6737200 14314 40 +Offload 6738800 14540 10 +Offload 6739200 14601 4 +Reload 6739360 14104 54 +Visit 6741520 1178 +Visit 6741520 1177 +Visit 6741520 1176 +Offload 6741520 14605 89 +Offload 6745080 14104 18 +Reload 6745800 14875 107 +Offload 6750080 14122 36 +Offload 6751520 14421 48 +Reload 6753440 14558 84 +Offload 6756800 14469 29 +Offload 6757960 14738 32 +Reload 6759240 14241 61 +Visit 6761680 1181 +Visit 6761680 1180 +Visit 6761680 1179 +Offload 6761680 14770 44 +Reload 6763440 15012 44 +Offload 6765200 14241 61 +Offload 6767640 14558 30 +Reload 6768840 14695 91 +Offload 6772480 14588 54 +Offload 6774640 14814 14 +Reload 6775200 14378 68 +Visit 6777920 1184 +Visit 6777920 1183 +Visit 6777920 1182 +Offload 6777920 14828 10 +Offload 6778320 14875 41 +Reload 6779960 15149 51 +Offload 6782000 14378 68 +Offload 6784720 14695 16 +Reload 6785360 14832 84 +Offload 6788720 14711 75 +Reload 6791720 14515 75 +Visit 6794720 1187 +Visit 6794720 1186 +Visit 6794720 1185 +Offload 6794720 14930 52 +Offload 6796800 15012 6 +Reload 6797040 15286 58 +Offload 6799360 14515 67 +Reload 6802040 14969 49 +Reload 6804000 15056 18 +Offload 6804720 14582 8 +Offload 6805040 14832 74 +Reload 6808000 14652 82 +Visit 6811280 1190 +Visit 6811280 1189 +Visit 6811280 1188 +Offload 6811280 14906 24 +Offload 6812240 15149 41 +Reload 6813880 15423 65 +Offload 6816480 14652 42 +Reload 6818160 15106 42 +Offload 6819840 14694 40 +Offload 6821440 14969 49 +Reload 6823400 14789 89 +Visit 6826960 1193 +Visit 6826960 1192 +Visit 6826960 1191 +Offload 6826960 15018 56 +Offload 6829200 15190 10 +Offload 6829600 15286 6 +Reload 6829840 15560 72 +Offload 6832720 14789 49 +Reload 6834680 15243 49 +Offload 6836640 14838 40 +Offload 6838240 15106 42 +Offload 6839920 15292 14 +Reload 6840480 14926 96 +Visit 6844320 1196 +Visit 6844320 1195 +Visit 6844320 1194 +Offload 6844320 15306 38 +Offload 6845840 15423 41 +Reload 6847480 15697 79 +Offload 6850640 14926 56 +Reload 6852880 15380 56 +Offload 6855120 14982 40 +Offload 6856720 15243 49 +Offload 6858680 15464 14 +Reload 6859240 15063 103 +Visit 6863360 1199 +Visit 6863360 1198 +Visit 6863360 1197 +Offload 6863360 15478 10 +Offload 6863760 15560 72 +Offload 6866640 15063 4 +Reload 6866800 15834 86 +Offload 6870240 15067 63 +Reload 6872760 15517 63 +Offload 6875280 15130 36 +Offload 6876720 15380 4 +Reload 6876880 15200 40 +Visit 6878480 1202 +Visit 6878480 1201 +Visit 6878480 1200 +Offload 6878480 15384 52 +Offload 6880560 15697 41 +Reload 6882200 15971 93 +Offload 6885920 15200 40 +Offload 6887520 15517 30 +Reload 6888720 15654 70 +Offload 6891520 15547 33 +Offload 6892840 15738 14 +Reload 6893400 15337 47 +Visit 6895280 1205 +Visit 6895280 1204 +Visit 6895280 1203 +Offload 6895280 15752 24 +Offload 6896240 15834 76 +Reload 6899280 16108 100 +Offload 6903280 15337 47 +Offload 6905160 15654 30 +Reload 6906360 15791 77 +Offload 6909440 15684 40 +Offload 6911040 15910 10 +Offload 6911440 15971 4 +Reload 6911600 15474 54 +Visit 6913760 1208 +Visit 6913760 1207 +Visit 6913760 1206 +Offload 6913760 15975 89 +Offload 6917320 15474 18 +Reload 6918040 16245 107 +Offload 6922320 15492 36 +Offload 6923760 15791 48 +Reload 6925680 15928 84 +Offload 6929040 15839 29 +Offload 6930200 16108 32 +Reload 6931480 15611 61 +Visit 6933920 1211 +Visit 6933920 1210 +Visit 6933920 1209 +Offload 6933920 16140 44 +Reload 6935680 16382 44 +Offload 6937440 15611 61 +Offload 6939880 15928 30 +Reload 6941080 16065 91 +Offload 6944720 15958 54 +Offload 6946880 16184 14 +Reload 6947440 15748 68 +Visit 6950160 1214 +Visit 6950160 1213 +Visit 6950160 1212 +Offload 6950160 16198 10 +Offload 6950560 16245 41 +Reload 6952200 16519 51 +Offload 6954240 15748 68 +Offload 6956960 16065 16 +Reload 6957600 16202 84 +Offload 6960960 16081 75 +Reload 6963960 15885 75 +Visit 6966960 1217 +Visit 6966960 1216 +Visit 6966960 1215 +Offload 6966960 16300 52 +Offload 6969040 16382 6 +Reload 6969280 16656 58 +Offload 6971600 15885 67 +Reload 6974280 16339 49 +Reload 6976240 16426 18 +Offload 6976960 15952 8 +Offload 6977280 16202 74 +Reload 6980240 16022 82 +Visit 6983520 1220 +Visit 6983520 1219 +Visit 6983520 1218 +Offload 6983520 16276 24 +Offload 6984480 16519 41 +Reload 6986120 16793 65 +Offload 6988720 16022 42 +Reload 6990400 16476 42 +Offload 6992080 16064 40 +Offload 6993680 16339 49 +Reload 6995640 16159 89 +Visit 6999200 1223 +Visit 6999200 1222 +Visit 6999200 1221 +Offload 6999200 16388 56 +Offload 7001440 16560 10 +Offload 7001840 16656 6 +Reload 7002080 16930 72 +Offload 7004960 16159 49 +Reload 7006920 16613 49 +Offload 7008880 16208 40 +Offload 7010480 16476 42 +Offload 7012160 16662 14 +Reload 7012720 16296 96 +Visit 7016560 1226 +Visit 7016560 1225 +Visit 7016560 1224 +Offload 7016560 16676 38 +Offload 7018080 16793 41 +Reload 7019720 17067 79 +Offload 7022880 16296 56 +Reload 7025120 16750 56 +Offload 7027360 16352 40 +Offload 7028960 16613 49 +Offload 7030920 16834 14 +Reload 7031480 16433 103 +Visit 7035600 1229 +Visit 7035600 1228 +Visit 7035600 1227 +Offload 7035600 16848 10 +Offload 7036000 16930 72 +Offload 7038880 16433 4 +Reload 7039040 17204 86 +Offload 7042480 16437 63 +Reload 7045000 16887 63 +Offload 7047520 16500 36 +Offload 7048960 16750 4 +Reload 7049120 16570 40 +Visit 7050720 1232 +Visit 7050720 1231 +Visit 7050720 1230 +Offload 7050720 16754 52 +Offload 7052800 17067 41 +Reload 7054440 17341 93 +Offload 7058160 16570 40 +Offload 7059760 16887 30 +Reload 7060960 17024 70 +Offload 7063760 16917 33 +Offload 7065080 17108 14 +Reload 7065640 16707 47 +Visit 7067520 1235 +Visit 7067520 1234 +Visit 7067520 1233 +Offload 7067520 17122 24 +Offload 7068480 17204 76 +Reload 7071520 17478 100 +Offload 7075520 16707 47 +Offload 7077400 17024 30 +Reload 7078600 17161 77 +Offload 7081680 17054 40 +Offload 7083280 17280 10 +Offload 7083680 17341 4 +Reload 7083840 16844 54 +Visit 7086000 1238 +Visit 7086000 1237 +Visit 7086000 1236 +Offload 7086000 17345 89 +Offload 7089560 16844 18 +Reload 7090280 17615 107 +Offload 7094560 16862 36 +Offload 7096000 17161 48 +Reload 7097920 17298 84 +Offload 7101280 17209 29 +Offload 7102440 17478 32 +Reload 7103720 16981 61 +Visit 7106160 1241 +Visit 7106160 1240 +Visit 7106160 1239 +Offload 7106160 17510 44 +Reload 7107920 17752 44 +Offload 7109680 16981 61 +Offload 7112120 17298 30 +Reload 7113320 17435 91 +Offload 7116960 17328 54 +Offload 7119120 17554 14 +Reload 7119680 17118 68 +Visit 7122400 1244 +Visit 7122400 1243 +Visit 7122400 1242 +Offload 7122400 17568 10 +Offload 7122800 17615 41 +Reload 7124440 17889 51 +Offload 7126480 17118 68 +Offload 7129200 17435 16 +Reload 7129840 17572 84 +Offload 7133200 17451 75 +Reload 7136200 17255 75 +Visit 7139200 1247 +Visit 7139200 1246 +Visit 7139200 1245 +Offload 7139200 17670 52 +Offload 7141280 17752 6 +Reload 7141520 18026 58 +Offload 7143840 17255 67 +Reload 7146520 17709 49 +Reload 7148480 17796 18 +Offload 7149200 17322 8 +Offload 7149520 17572 74 +Reload 7152480 17392 82 +Visit 7155760 1250 +Visit 7155760 1249 +Visit 7155760 1248 +Offload 7155760 17646 24 +Offload 7156720 17889 41 +Reload 7158360 18163 65 +Offload 7160960 17392 42 +Reload 7162640 17846 42 +Offload 7164320 17434 40 +Offload 7165920 17709 49 +Reload 7167880 17529 89 +Visit 7171440 1253 +Visit 7171440 1252 +Visit 7171440 1251 +Offload 7171440 17758 56 +Offload 7173680 17930 10 +Offload 7174080 18026 6 +Reload 7174320 18300 72 +Offload 7177200 17529 49 +Reload 7179160 17983 49 +Offload 7181120 17578 40 +Offload 7182720 17846 42 +Offload 7184400 18032 14 +Reload 7184960 17666 96 +Visit 7188800 1256 +Visit 7188800 1255 +Visit 7188800 1254 +Offload 7188800 18046 38 +Offload 7190320 18163 41 +Reload 7191960 18437 79 +Offload 7195120 17666 56 +Reload 7197360 18120 56 +Offload 7199600 17722 40 +Offload 7201200 17983 49 +Offload 7203160 18204 14 +Reload 7203720 17803 103 +Visit 7207840 1259 +Visit 7207840 1258 +Visit 7207840 1257 +Fin 7208365 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.in" new file mode 100644 index 0000000000000000000000000000000000000000..5dbcf3561e02f4dfde164c74d8b992ebacac79e9 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.in" @@ -0,0 +1,17 @@ +1024 128 16 +0 64 0 30 +96 48 0 35 +192 64 40 35 +288 48 40 30 +0 64 80 40 +96 48 80 30 +192 64 120 45 +288 48 120 35 +384 64 160 30 +480 48 160 25 +0 64 220 35 +96 48 220 30 +192 64 260 40 +288 48 260 35 +384 64 320 30 +480 48 320 25 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.out" new file mode 100644 index 0000000000000000000000000000000000000000..041df43e7354918348b8d5f995b159c1acdaec78 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/memory_churn.out" @@ -0,0 +1,56 @@ +Reload 0 96 48 +Reload 1920 0 64 +Visit 4480 1 +Visit 4480 0 +Offload 4510 0 32 +Reload 5790 288 48 +Offload 7710 32 32 +Offload 8990 96 32 +Reload 10270 192 64 +Visit 12830 3 +Visit 12830 2 +Offload 12860 288 32 +Reload 14140 96 32 +Offload 15420 192 64 +Reload 17980 0 64 +Visit 20540 5 +Visit 20540 4 +Offload 20570 96 32 +Reload 21850 288 32 +Offload 23130 0 64 +Reload 25690 192 64 +Visit 28250 7 +Visit 28250 6 +Offload 28250 128 16 +Offload 28890 192 32 +Reload 30170 480 48 +Offload 32090 224 32 +Offload 33370 288 32 +Reload 34650 384 64 +Visit 37210 9 +Visit 37210 8 +Offload 37210 320 16 +Offload 37850 384 32 +Reload 39130 96 48 +Offload 41050 416 32 +Offload 42330 480 32 +Reload 43610 0 64 +Visit 46170 11 +Visit 46170 10 +Offload 46170 512 16 +Offload 46810 0 32 +Reload 48090 288 48 +Offload 50010 32 32 +Offload 51290 96 32 +Reload 52570 192 64 +Visit 55130 13 +Visit 55130 12 +Offload 55130 128 16 +Offload 55770 192 32 +Reload 57050 480 48 +Offload 58970 224 32 +Offload 60250 288 32 +Reload 61530 384 64 +Visit 64090 15 +Visit 64090 14 +Fin 64120 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/planner_summary.txt" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/planner_summary.txt" new file mode 100644 index 0000000000000000000000000000000000000000..fdd93b772876eff6ef0d7dfe11458dffc44dadc1 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/planner_summary.txt" @@ -0,0 +1 @@ +ok All tasks finish at 12040 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload..out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload..out" new file mode 100644 index 0000000000000000000000000000000000000000..5749a11531f8b9c760ec311dc133e514b0d0f42e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload..out" @@ -0,0 +1,13 @@ +Reload 0 0 70 +Reload 2800 70 10 +Reload 3200 120 20 +Visit 4000 0 +Visit 4000 1 +Visit 4000 2 +Reload 5161 260 20 +Offload 6000 120 20 +Reload 6800 140 20 +Visit 7600 3 +Visit 7600 4 +Visit 7600 5 +Fin 7800 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.in" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.in" new file mode 100644 index 0000000000000000000000000000000000000000..1d9d70ce364b716e539dd19a8451dd492d806de6 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.in" @@ -0,0 +1,7 @@ +500 120 6 +0 80 0 2000 +70 10 0 2000 +120 20 0 2000 +140 20 4000 200 +0 80 4000 200 +260 20 4000 200 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out" new file mode 100644 index 0000000000000000000000000000000000000000..5749a11531f8b9c760ec311dc133e514b0d0f42e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out" @@ -0,0 +1,13 @@ +Reload 0 0 70 +Reload 2800 70 10 +Reload 3200 120 20 +Visit 4000 0 +Visit 4000 1 +Visit 4000 2 +Reload 5161 260 20 +Offload 6000 120 20 +Reload 6800 140 20 +Visit 7600 3 +Visit 7600 4 +Visit 7600 5 +Fin 7800 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.planner_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.planner_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..ffde7f47799d71de1516ad2f1494896d223735da --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.planner_tmp" @@ -0,0 +1,15 @@ +Reload 0 120 20 +Reload 800 70 10 +Reload 1200 0 70 +Visit 4000 2 +Visit 4000 1 +Visit 4000 0 +Reload 4000 260 20 +Offload 6000 0 20 +Reload 6800 140 20 +Offload 7600 120 20 +Reload 8400 0 20 +Visit 9200 5 +Visit 9200 3 +Visit 9200 4 +Fin 9400 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.smt_tmp" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.smt_tmp" new file mode 100644 index 0000000000000000000000000000000000000000..5749a11531f8b9c760ec311dc133e514b0d0f42e --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/proactive_offload.out.smt_tmp" @@ -0,0 +1,13 @@ +Reload 0 0 70 +Reload 2800 70 10 +Reload 3200 120 20 +Visit 4000 0 +Visit 4000 1 +Visit 4000 2 +Reload 5161 260 20 +Offload 6000 120 20 +Reload 6800 140 20 +Visit 7600 3 +Visit 7600 4 +Visit 7600 5 +Fin 7800 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/smt_summary.txt" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/smt_summary.txt" new file mode 100644 index 0000000000000000000000000000000000000000..fdd93b772876eff6ef0d7dfe11458dffc44dadc1 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/smt_summary.txt" @@ -0,0 +1 @@ +ok All tasks finish at 12040 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/summary.txt" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/summary.txt" new file mode 100644 index 0000000000000000000000000000000000000000..89cd976056a976c390cd431158ec271d02df3850 --- /dev/null +++ "b/2025/work/09 \344\275\225\346\242\223\346\272\220/src/solver/tests/summary.txt" @@ -0,0 +1,8 @@ +example1: ok All tasks finish at 12040 +example2: ok All tasks finish at 12020 +example3: ok All tasks finish at 17020 +fragmented_segments: ok All tasks finish at 20825 +long_trace: ok All tasks finish at 311260 +mega_multiseg: ok All tasks finish at 7208365 +memory_churn: ok All tasks finish at 64120 +proactive_offload: ok All tasks finish at 7800 diff --git "a/2025/work/09 \344\275\225\346\242\223\346\272\220/\345\244\247\346\250\241\345\236\213\350\256\255\346\216\250\345\205\250\345\261\200\345\206\205\345\255\230\350\247\204\345\210\222\346\261\202\350\247\243.pdf" "b/2025/work/09 \344\275\225\346\242\223\346\272\220/\345\244\247\346\250\241\345\236\213\350\256\255\346\216\250\345\205\250\345\261\200\345\206\205\345\255\230\350\247\204\345\210\222\346\261\202\350\247\243.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..d6cb852e6860797894cd07e0a6a19320ec7ee1c9 Binary files /dev/null and "b/2025/work/09 \344\275\225\346\242\223\346\272\220/\345\244\247\346\250\241\345\236\213\350\256\255\346\216\250\345\205\250\345\261\200\345\206\205\345\255\230\350\247\204\345\210\222\346\261\202\350\247\243.pdf" differ