// File: patmorin[P]rotate/jain.cpp
// Function: main
int main(int argc, char *argv[]) {
	std::uint64_t n;
    if (argc != 2) usage(argv[0]);
	{
	    std::istringstream is_n(argv[1]);
	    is_n >> n;
	}

	const unsigned BLOCK=96;

	std::cout << "Building and filling...";
	std::cout.flush();
	auto *a = new std::uint32_t[n];

	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_inshuffle()...";
	std::cout.flush();
	print_array(a, n);
	auto start = std::chrono::high_resolution_clock::now();
	jain_inshuffle(a, n);
	auto stop =  std::chrono::high_resolution_clock::now();
	std::chrono::duration<double> elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_inshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_inshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_inshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	jain_inshuffle_pf(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_inshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_inshuffle_pf(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_outshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_outshuffle<BLOCK>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_outshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_outshuffle<BLOCK,true>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	jain_outshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_eytzinger()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_eytzinger<BLOCK,true>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	// TODO: Check correctness of Eytzinger permutation

}

// Assembly:
subq $0x358, %rsp            # imm = 0x358
movl $0x0, 0x354(%rsp)
movl %edi, 0x350(%rsp)
movq %rsi, 0x348(%rsp)
cmpl $0x2, 0x350(%rsp)
je 0x133b
movq 0x348(%rsp), %rax
movq (%rax), %rdi
callq 0x12b0
movq 0x348(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x50(%rsp)
leaq 0x19f(%rsp), %rdi
movq %rdi, 0x58(%rsp)
callq 0x1150
movq 0x50(%rsp), %rsi
movq 0x58(%rsp), %rdx
leaq 0x1a0(%rsp), %rdi
callq 0x10f0
jmp 0x1377
leaq 0x1c0(%rsp), %rdi
leaq 0x1a0(%rsp), %rsi
movl $0x8, %edx
callq 0x1130
jmp 0x1393
leaq 0x1a0(%rsp), %rdi
callq 0x1060
leaq 0x19f(%rsp), %rdi
callq 0x10c0
leaq 0x1c0(%rsp), %rdi
leaq 0x340(%rsp), %rsi
callq 0x1100
jmp 0x13c4
leaq 0x1c0(%rsp), %rdi
callq 0x1050
movl $0x60, 0x188(%rsp)
movq 0x7bed(%rip), %rdi      # 0x8fd0
leaq 0x4c33(%rip), %rsi      # 0x601d
callq 0x10a0
movq 0x7bda(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x340(%rsp), %rax
movl $0x4, %ecx
mulq %rcx
movq %rax, %rdi
seto %cl
movq $-0x1, %rax
testb $0x1, %cl
cmovneq %rax, %rdi
callq 0x1030
movq %rax, 0x180(%rsp)
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x7b77(%rip), %rdi      # 0x8fd0
leaq 0x4bd5(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x7b51(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x7b55(%rip), %rdi      # 0x8fd0
leaq 0x4bb8(%rip), %rsi      # 0x603a
callq 0x10a0
movq 0x7b42(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x23e0
callq 0x1040
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x160(%rsp)
leaq 0x168(%rsp), %rdi
leaq 0x160(%rsp), %rsi
callq 0x25b0
movq 0x7ac0(%rip), %rdi      # 0x8fd0
leaq 0x4b47(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x8(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x8(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x4b23(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x7a6f(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2600
movq 0x7a49(%rip), %rdi      # 0x8fd0
leaq 0x4ada(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x7a36(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x7a04(%rip), %rdi      # 0x8fd0
leaq 0x4a62(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x79de(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x79e2(%rip), %rdi      # 0x8fd0
leaq 0x4a80(%rip), %rsi      # 0x6075
callq 0x10a0
movq 0x79cf(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x158(%rsp)
movq 0x158(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x26a0
callq 0x1040
movq %rax, 0x150(%rsp)
movq 0x150(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x140(%rsp)
leaq 0x148(%rsp), %rdi
leaq 0x140(%rsp), %rsi
callq 0x25b0
movq 0x148(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x791d(%rip), %rdi      # 0x8fd0
leaq 0x49a4(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x10(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x10(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x4980(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x78cc(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2600
movq 0x78a6(%rip), %rdi      # 0x8fd0
leaq 0x4937(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x7893(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x7861(%rip), %rdi      # 0x8fd0
leaq 0x48bf(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x783b(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x783f(%rip), %rdi      # 0x8fd0
leaq 0x4902(%rip), %rsi      # 0x609a
callq 0x10a0
movq 0x782c(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x138(%rsp)
movq 0x138(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x27f0
callq 0x1040
movq %rax, 0x130(%rsp)
movq 0x130(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x120(%rsp)
leaq 0x128(%rsp), %rdi
leaq 0x120(%rsp), %rsi
callq 0x25b0
movq 0x128(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x777a(%rip), %rdi      # 0x8fd0
leaq 0x4801(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x18(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x18(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x47dd(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x7729(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2600
movq 0x7703(%rip), %rdi      # 0x8fd0
leaq 0x4794(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x76f0(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x76be(%rip), %rdi      # 0x8fd0
leaq 0x471c(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x7698(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x769c(%rip), %rdi      # 0x8fd0
leaq 0x4786(%rip), %rsi      # 0x60c1
callq 0x10a0
movq 0x7689(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x118(%rsp)
movq 0x118(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2b00
callq 0x1040
movq %rax, 0x110(%rsp)
movq 0x110(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x100(%rsp)
leaq 0x108(%rsp), %rdi
leaq 0x100(%rsp), %rsi
callq 0x25b0
movq 0x108(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x75d7(%rip), %rdi      # 0x8fd0
leaq 0x465e(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x20(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x20(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x463a(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x7586(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2600
movq 0x7560(%rip), %rdi      # 0x8fd0
leaq 0x45f1(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x754d(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x751b(%rip), %rdi      # 0x8fd0
leaq 0x4579(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x74f5(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x74f9(%rip), %rdi      # 0x8fd0
leaq 0x460b(%rip), %rsi      # 0x60e9
callq 0x10a0
movq 0x74e6(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0xf8(%rsp)
movq 0xf8(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2dd0
callq 0x1040
movq %rax, 0xf0(%rsp)
movq 0xf0(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0xe0(%rsp)
leaq 0xe8(%rsp), %rdi
leaq 0xe0(%rsp), %rsi
callq 0x25b0
movq 0xe8(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x7434(%rip), %rdi      # 0x8fd0
leaq 0x44bb(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x28(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x28(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x4497(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x73e3(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2f40
movq 0x73bd(%rip), %rdi      # 0x8fd0
leaq 0x444e(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x73aa(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x7378(%rip), %rdi      # 0x8fd0
leaq 0x43d6(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x7352(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x7356(%rip), %rdi      # 0x8fd0
leaq 0x448e(%rip), %rsi      # 0x610f
callq 0x10a0
movq 0x7343(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0xd8(%rsp)
movq 0xd8(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2fe0
callq 0x1040
movq %rax, 0xd0(%rsp)
movq 0xd0(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0xc0(%rsp)
leaq 0xc8(%rsp), %rdi
leaq 0xc0(%rsp), %rsi
callq 0x25b0
movq 0xc8(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x7291(%rip), %rdi      # 0x8fd0
leaq 0x4318(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x30(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x30(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x42f4(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x7240(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2f40
movq 0x721a(%rip), %rdi      # 0x8fd0
leaq 0x42ab(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x7207(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x71d5(%rip), %rdi      # 0x8fd0
leaq 0x4233(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x71af(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x71b3(%rip), %rdi      # 0x8fd0
leaq 0x4313(%rip), %rsi      # 0x6137
callq 0x10a0
movq 0x71a0(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0xb8(%rsp)
movq 0xb8(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x30f0
callq 0x1040
movq %rax, 0xb0(%rsp)
movq 0xb0(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0xa0(%rsp)
leaq 0xa8(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
callq 0x25b0
movq 0xa8(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x70ee(%rip), %rdi      # 0x8fd0
leaq 0x4175(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x38(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x38(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x4151(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x709d(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2f40
movq 0x7077(%rip), %rdi      # 0x8fd0
leaq 0x4108(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x7064(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x7032(%rip), %rdi      # 0x8fd0
leaq 0x4090(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x700c(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x7010(%rip), %rdi      # 0x8fd0
leaq 0x419b(%rip), %rsi      # 0x6162
callq 0x10a0
movq 0x6ffd(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x98(%rsp)
movq 0x98(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x3200
callq 0x1040
movq %rax, 0x90(%rsp)
movq 0x90(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x80(%rsp)
leaq 0x88(%rsp), %rdi
leaq 0x80(%rsp), %rsi
callq 0x25b0
movq 0x88(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x6f4b(%rip), %rdi      # 0x8fd0
leaq 0x3fd2(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x40(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x40(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x3fae(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x6efa(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2f40
movq 0x6ed4(%rip), %rdi      # 0x8fd0
leaq 0x3f65(%rip), %rsi      # 0x6068
callq 0x10a0
movq 0x6ec1(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x180(%rsp), %rsi
movq 0x340(%rsp), %rax
shlq $0x2, %rax
addq %rax, %rsi
xorl %edx, %edx
callq 0x22f0
movq 0x6e8f(%rip), %rdi      # 0x8fd0
leaq 0x3eed(%rip), %rsi      # 0x6035
callq 0x10a0
movq %rax, %rdi
movq 0x6e69(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x6e6d(%rip), %rdi      # 0x8fd0
leaq 0x401d(%rip), %rsi      # 0x6187
callq 0x10a0
movq 0x6e5a(%rip), %rdi      # 0x8fd0
callq 0x1070
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
callq 0x1040
movq %rax, 0x78(%rsp)
movq 0x78(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x33a0
callq 0x1040
movq %rax, 0x70(%rsp)
movq 0x70(%rsp), %rax
movq %rax, 0x170(%rsp)
leaq 0x170(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x2560
movq %rax, 0x60(%rsp)
leaq 0x68(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x25b0
movq 0x68(%rsp), %rax
movq %rax, 0x168(%rsp)
movq 0x6dc0(%rip), %rdi      # 0x8fd0
leaq 0x3e47(%rip), %rsi      # 0x605e
callq 0x10a0
movq %rax, 0x48(%rsp)
leaq 0x168(%rsp), %rdi
callq 0x25f0
movq 0x48(%rsp), %rdi
callq 0x1160
movq %rax, %rdi
leaq 0x3e23(%rip), %rsi      # 0x6065
callq 0x10a0
movq %rax, %rdi
movq 0x6d6f(%rip), %rsi      # 0x8fc0
callq 0x10b0
movq 0x180(%rsp), %rdi
movq 0x340(%rsp), %rsi
callq 0x2340
movl 0x354(%rsp), %eax
addq $0x358, %rsp            # imm = 0x358
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x190(%rsp)
movl %eax, 0x18c(%rsp)
jmp 0x22b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x190(%rsp)
movl %eax, 0x18c(%rsp)
leaq 0x1a0(%rsp), %rdi
callq 0x1060
leaq 0x19f(%rsp), %rdi
callq 0x10c0
jmp 0x22e1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x190(%rsp)
movl %eax, 0x18c(%rsp)
leaq 0x1c0(%rsp), %rdi
callq 0x1050
movq 0x190(%rsp), %rdi
callq 0x1140
nop