// File: /workspace/github_cpp_makefile_star2_O2/szmer[P]brill/./src/rules.cpp
// Function: Rule::transform_corp(Corpus*)
Corpus Rule::transform_corp(Corpus * corp) {

	Corpus new_corp;
	new_corp.sentences.reserve(corp->sentences.size());

	// Change from tag X to Y when preceding tag is Z:
	if(id < (RL_PRECEDING+1) * RULE_RANGE) 
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 1; i < corp->sentences[si].size(); i++)
				if(corp->sentences[si][i-1].tag == cue1
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when following tag is Z:
	if(id >= RL_FOLLOWING * RULE_RANGE && id < (RL_FOLLOWING+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 0; i+1 < corp->sentences[si].size(); i++)
				if(corp->sentences[si][i+1].tag == cue1
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when the tag two before is Z:
	if(id >= RL_2BEFORE * RULE_RANGE && id < (RL_2BEFORE+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 2; i < corp->sentences[si].size(); i++)
				if(corp->sentences[si][i-2].tag == cue1
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when the tag two after is Z:
	if(id >= RL_2AFTER * RULE_RANGE && id < (RL_2AFTER+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 0; i+2 < corp->sentences[si].size(); i++)
				if(corp->sentences[si][i+2].tag == cue1
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}


	// Change from tag X to Y when one of two tags before is Z:
	if(id >= RL_ONE_OF_2BEFORE * RULE_RANGE && id < (RL_ONE_OF_2BEFORE+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 2; i < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i-1].tag == cue1
					|| corp->sentences[si][i-2].tag == cue1)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when one of two tags after is Z:
	if(id >= RL_ONE_OF_2AFTER * RULE_RANGE && id < (RL_ONE_OF_2AFTER+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 0; i+2 < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i+1].tag == cue1
					|| corp->sentences[si][i+2].tag == cue1)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when one of three tags before is Z:
	if(id >= RL_ONE_OF_3BEFORE * RULE_RANGE && id < (RL_ONE_OF_3BEFORE+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 3; i < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i-1].tag == cue1
					|| corp->sentences[si][i-2].tag == cue1
					|| corp->sentences[si][i-3].tag == cue1)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when one of three tags after is Z:
	if(id >= RL_ONE_OF_3AFTER * RULE_RANGE && id < (RL_ONE_OF_3AFTER+1) * RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 0; i+3 < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i+1].tag == cue1
					|| corp->sentences[si][i+2].tag == cue1
					|| corp->sentences[si][i+3].tag == cue1)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when preceding tag is W and following Z:
	if(id >= EXTRL_PRECEDING_AND_FOLLOWING * EXT_RULE_RANGE &&
			id < (EXTRL_PRECEDING_AND_FOLLOWING+1) * EXT_RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 1; i+1 < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i-1].tag == cue1
					&& corp->sentences[si][i+1].tag == cue2)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when preceding tag is W and two before Z:
	if(id >= EXTRL_1_AND_2_BEFORE * EXT_RULE_RANGE &&
			id < (EXTRL_1_AND_2_BEFORE+1) * EXT_RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 2; i < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i-1].tag == cue1
					&& corp->sentences[si][i-2].tag == cue2)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	// Change from tag X to Y when following tag is W and two after Z:
	if(id >= EXTRL_1_AND_2_AFTER * EXT_RULE_RANGE &&
			id < (EXTRL_1_AND_2_AFTER+1) * EXT_RULE_RANGE)
		for(unsigned int si = 0; si < corp->sentences.size(); si++) {
			vector<TaggedWord> new_stc(corp->sentences[si]); // make a copy
			for(unsigned int i = 0; i+2 < corp->sentences[si].size(); i++)
				if((corp->sentences[si][i+1].tag == cue1
					&& corp->sentences[si][i+2].tag == cue2)
						&& corp->sentences[si][i].tag == alter_tag)
					new_stc[i].tag = target;
			new_corp.sentences.push_back(new_stc);
		}

	return new_corp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rdx, %r14
movq %rsi, %r15
xorps %xmm0, %xmm0
movups %xmm0, (%rdi)
andq $0x0, 0x10(%rdi)
leaq 0x20(%rdi), %rax
andl $0x0, 0x20(%rdi)
andq $0x0, 0x28(%rdi)
movq %rax, 0x30(%rdi)
movq %rax, 0x38(%rdi)
andq $0x0, 0x40(%rdi)
movq 0x8(%rdx), %rax
subq (%rdx), %rax
pushq $0x18
popq %rcx
cqto
idivq %rcx
movq %rdi, -0x68(%rbp)
movq %rax, %rsi
callq 0x4f6a
movq 0x80(%r15), %rax
cmpq $0x767ed6a, %rax        # imm = 0x767ED6A
movq %r15, -0x40(%rbp)
jg 0x36e8
leaq 0x40(%r15), %rbx
leaq 0x60(%r15), %rax
movq %rax, -0x38(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r13
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x36e1
movq %rdi, -0x30(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %r13, %rdi
callq 0x5292
xorl %eax, %eax
leal 0x1(%rax), %r13d
movq (%r14), %rdx
movq (%rdx,%r12), %rcx
movq 0x8(%rdx,%r12), %rdx
subq %rcx, %rdx
sarq $0x6, %rdx
cmpq %r13, %rdx
jbe 0x36be
movl %eax, %eax
shlq $0x6, %rax
leaq (%rcx,%rax), %rdi
addq $0x20, %rdi
movq %r15, %rsi
callq 0x52e5
testb %al, %al
je 0x36b5
movq (%r14), %rax
movq (%rax,%r12), %rax
movq %r13, %r15
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq %rbx, %rsi
callq 0x52e5
testb %al, %al
je 0x36b5
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x2110
movl %r13d, %eax
movq -0x40(%rbp), %r15
jmp 0x3648
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r13
movq %r13, %rsi
callq 0x5312
movq %r13, %rdi
callq 0x4dc8
movq -0x30(%rbp), %rdi
incl %edi
jmp 0x3616
movq 0x80(%r15), %rax
leaq -0x767ed6b(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x37e3
leaq 0x40(%r15), %rbx
leaq 0x60(%r15), %rax
movq %rax, -0x38(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r13
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x37dc
movq %rdi, -0x30(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %r13, %rdi
callq 0x5292
xorl %r13d, %r13d
movl %r13d, %r15d
leal 0x1(%r15), %r13d
movq (%r14), %rcx
movq (%rcx,%r12), %rax
movq 0x8(%rcx,%r12), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r13, %rcx
jbe 0x37b5
movq %r13, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3741
movq (%r14), %rax
movl %r15d, %r15d
movq (%rax,%r12), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq %rbx, %rsi
callq 0x52e5
testb %al, %al
je 0x3741
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x2110
jmp 0x3741
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r13
movq %r13, %rsi
callq 0x5312
movq %r13, %rdi
callq 0x4dc8
movq -0x30(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x370e
movq 0x80(%r15), %rax
leaq -0xecfdad6(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x38db
leaq 0x40(%r15), %rbx
leaq 0x60(%r15), %rax
movq %rax, -0x38(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r13
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x38d4
movq %rdi, -0x30(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %r13, %rdi
callq 0x5292
xorl %r13d, %r13d
leal 0x2(%r13), %r15d
movq (%r14), %rcx
movq (%rcx,%r12), %rax
movq 0x8(%rcx,%r12), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r15, %rcx
jbe 0x38ad
movl %r13d, %ecx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x38a8
movq (%r14), %rax
movq (%rax,%r12), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq %rbx, %rsi
callq 0x52e5
testb %al, %al
je 0x38a8
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x2110
incl %r13d
jmp 0x383c
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r13
movq %r13, %rsi
callq 0x5312
movq %r13, %rdi
callq 0x4dc8
movq -0x30(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x3809
movq 0x80(%r15), %rax
leaq -0x1637c841(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x39d2
leaq 0x40(%r15), %rbx
leaq 0x60(%r15), %rax
movq %rax, -0x38(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r13
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x39cb
movq %rdi, -0x30(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %r13, %rdi
callq 0x5292
xorl %r13d, %r13d
leal 0x2(%r13), %eax
movq (%r14), %rdx
movq (%rdx,%r12), %rcx
movq 0x8(%rdx,%r12), %rdx
subq %rcx, %rdx
sarq $0x6, %rdx
cmpq %rax, %rdx
jbe 0x39a8
shlq $0x6, %rax
leaq (%rcx,%rax), %rdi
addq $0x20, %rdi
movq %r15, %rsi
callq 0x52e5
testb %al, %al
je 0x399f
movq (%r14), %rax
movl %r13d, %r15d
movq (%rax,%r12), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq %rbx, %rsi
callq 0x52e5
testb %al, %al
je 0x399f
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x2110
incl %r13d
movq -0x40(%rbp), %r15
jmp 0x3934
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r13
movq %r13, %rsi
callq 0x5312
movq %r13, %rdi
callq 0x4dc8
movq -0x30(%rbp), %rdi
incl %edi
jmp 0x3901
movq 0x80(%r15), %rax
leaq -0x1d9fb5ac(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x3afd
leaq 0x40(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x30(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %rbx
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x3af6
movq %rdi, -0x60(%rbp)
imulq $0x18, %rdi, %r13
addq %r13, %rsi
movq %rbx, %rdi
callq 0x5292
xorl %r15d, %r15d
leal 0x2(%r15), %r12d
movq (%r14), %rcx
movq (%rcx,%r13), %rax
movq 0x8(%rcx,%r13), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r12, %rcx
jbe 0x3acf
leal 0x1(%r15), %ebx
movq %rbx, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
jne 0x3a92
movq (%r14), %rax
movl %r15d, %ecx
movq (%rax,%r13), %rax
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3ac7
movq (%r14), %rax
movq (%rax,%r13), %rax
shlq $0x6, %r12
leaq (%rax,%r12), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3ac7
movq -0x58(%rbp), %rax
leaq (%rax,%r12), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x2110
movl %ebx, %r15d
jmp 0x3a2f
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %rbx
movq %rbx, %rsi
callq 0x5312
movq %rbx, %rdi
callq 0x4dc8
movq -0x60(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x39fc
movq 0x80(%r15), %rax
leaq -0x2507a317(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x3c2c
leaq 0x40(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x30(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %rbx
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x3c25
movq %rdi, -0x60(%rbp)
imulq $0x18, %rdi, %r13
addq %r13, %rsi
movq %rbx, %rdi
callq 0x5292
xorl %r12d, %r12d
movl %r12d, %r15d
leal 0x2(%r15), %ebx
movq (%r14), %rcx
movq (%rcx,%r13), %rax
movq 0x8(%rcx,%r13), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %rbx, %rcx
jbe 0x3bfe
leal 0x1(%r15), %r12d
movq %r12, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
jne 0x3bbd
movq (%r14), %rax
movq (%rax,%r13), %rax
shlq $0x6, %rbx
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3b5a
movq (%r14), %rax
movl %r15d, %ebx
movq (%rax,%r13), %rax
shlq $0x6, %rbx
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3b5a
movq -0x58(%rbp), %rax
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x2110
jmp 0x3b5a
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %rbx
movq %rbx, %rsi
callq 0x5312
movq %rbx, %rdi
callq 0x4dc8
movq -0x60(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x3b27
movq 0x80(%r15), %rax
leaq -0x2c6f9082(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x3d71
leaq 0x40(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x30(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r12
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x3d6a
movq %rdi, -0x60(%rbp)
imulq $0x18, %rdi, %rbx
addq %rbx, %rsi
movq %r12, %rdi
callq 0x5292
xorl %r13d, %r13d
leal 0x3(%r13), %r12d
movq (%r14), %rcx
movq (%rcx,%rbx), %rax
movq 0x8(%rcx,%rbx), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r12, %rcx
jbe 0x3d47
leal 0x2(%r13), %ecx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq %r15, %rsi
callq 0x52e5
testb %al, %al
jne 0x3d0a
movq (%r14), %rax
leal 0x1(%r13), %ecx
movq (%rax,%rbx), %rax
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq %r15, %rsi
callq 0x52e5
testb %al, %al
jne 0x3d0a
movq (%r14), %rax
movl %r13d, %ecx
movq (%rax,%rbx), %rax
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq %r15, %rsi
callq 0x52e5
testb %al, %al
je 0x3d3f
movq (%r14), %rax
movq (%rax,%rbx), %rax
shlq $0x6, %r12
leaq (%rax,%r12), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3d3f
movq -0x58(%rbp), %rax
leaq (%rax,%r12), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x2110
incl %r13d
jmp 0x3c89
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r12
movq %r12, %rsi
callq 0x5312
movq %r12, %rdi
callq 0x4dc8
movq -0x60(%rbp), %rdi
incl %edi
jmp 0x3c56
movq 0x80(%r15), %rax
leaq -0x33d77ded(%rax), %rcx
cmpq $0x767ed6a, %rcx        # imm = 0x767ED6A
ja 0x3ec8
leaq 0x40(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x30(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r12
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x3ec1
movq %rdi, -0x60(%rbp)
imulq $0x18, %rdi, %rbx
addq %rbx, %rsi
movq %r12, %rdi
callq 0x5292
xorl %r12d, %r12d
movl %r12d, %r13d
leal 0x3(%r13), %r15d
movq (%r14), %rcx
movq (%rcx,%rbx), %rax
movq 0x8(%rcx,%rbx), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r15, %rcx
jbe 0x3e9a
leal 0x1(%r13), %r12d
movq %r12, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
jne 0x3e59
movq (%r14), %rax
leal 0x2(%r13), %ecx
movq (%rax,%rbx), %rax
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
jne 0x3e59
movq (%r14), %rax
movq (%rax,%rbx), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3dce
movq (%r14), %rax
movl %r13d, %r15d
movq (%rax,%rbx), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3dce
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x2110
jmp 0x3dce
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r12
movq %r12, %rsi
callq 0x5312
movq %r12, %rdi
callq 0x4dc8
movq -0x60(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x3d9b
movq 0x80(%r15), %rax
movabsq $0xe6f93c791, %rdx      # imm = 0xE6F93C791
movabsq $-0xe6f93c791, %rcx     # imm = 0xFFFFFFF1906C386F
addq %rax, %rcx
cmpq %rdx, %rcx
jae 0x4004
leaq 0x20(%r15), %rbx
leaq 0x40(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x30(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %r13
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x3ff3
movq %rdi, -0x60(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %r13, %rdi
callq 0x5292
xorl %r13d, %r13d
leal 0x2(%r13), %r15d
movq (%r14), %rcx
movq (%rcx,%r12), %rax
movq 0x8(%rcx,%r12), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %r15, %rcx
jbe 0x3fcc
movl %r13d, %ecx
incl %r13d
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3f35
movq (%r14), %rax
movq (%rax,%r12), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq %rbx, %rsi
callq 0x52e5
testb %al, %al
je 0x3f35
movq (%r14), %rax
movl %r13d, %r15d
movq (%rax,%r12), %rax
shlq $0x6, %r15
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x3f35
movq -0x58(%rbp), %rax
leaq (%rax,%r15), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x2110
jmp 0x3f35
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %r13
movq %r13, %rsi
callq 0x5312
movq %r13, %rdi
callq 0x4dc8
movq -0x60(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x3f02
movq 0x80(%r15), %rax
movabsq $0xe6f93c791, %rdx      # imm = 0xE6F93C791
movabsq $-0x1cdf278f22, %rcx    # imm = 0xFFFFFFE320D870DE
addq %rax, %rcx
cmpq %rdx, %rcx
jae 0x4147
leaq 0x20(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x40(%r15), %rax
movq %rax, -0x30(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x60(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %rbx
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x4136
movq %rdi, -0x70(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %rbx, %rdi
callq 0x5292
xorl %r13d, %r13d
movl %r13d, %r15d
leal 0x2(%r15), %ebx
movq (%r14), %rcx
movq (%rcx,%r12), %rax
movq 0x8(%rcx,%r12), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %rbx, %rcx
jbe 0x410f
leal 0x1(%r15), %r13d
movq %r13, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x406b
movq (%r14), %rax
movl %r15d, %ecx
movq (%rax,%r12), %rax
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x406b
movq (%r14), %rax
movq (%rax,%r12), %rax
shlq $0x6, %rbx
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x406b
movq -0x58(%rbp), %rax
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x60(%rbp), %rsi
callq 0x2110
jmp 0x406b
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %rbx
movq %rbx, %rsi
callq 0x5312
movq %rbx, %rdi
callq 0x4dc8
movq -0x70(%rbp), %rdi
incl %edi
movq -0x40(%rbp), %r15
jmp 0x4038
movq 0x80(%r15), %rax
movabsq $0xe6f93c791, %rdx      # imm = 0xE6F93C791
movabsq $-0x2b4ebb56b3, %rcx    # imm = 0xFFFFFFD4B144A94D
addq %rax, %rcx
cmpq %rdx, %rcx
jae 0x4275
leaq 0x20(%r15), %rax
movq %rax, -0x38(%rbp)
leaq 0x40(%r15), %rax
movq %rax, -0x30(%rbp)
leaq 0x60(%r15), %rax
movq %rax, -0x60(%rbp)
xorl %edi, %edi
leaq -0x58(%rbp), %rbx
movl %edi, %edi
movq (%r14), %rsi
movq 0x8(%r14), %rax
subq %rsi, %rax
cqto
pushq $0x18
popq %rcx
idivq %rcx
cmpq %rdi, %rax
jbe 0x4275
movq %rdi, -0x70(%rbp)
imulq $0x18, %rdi, %r12
addq %r12, %rsi
movq %rbx, %rdi
callq 0x5292
xorl %r13d, %r13d
movl %r13d, %r15d
leal 0x2(%r15), %ebx
movq (%r14), %rcx
movq (%rcx,%r12), %rax
movq 0x8(%rcx,%r12), %rcx
subq %rax, %rcx
sarq $0x6, %rcx
cmpq %rbx, %rcx
jbe 0x4252
leal 0x1(%r15), %r13d
movq %r13, %rcx
shlq $0x6, %rcx
leaq (%rax,%rcx), %rdi
addq $0x20, %rdi
movq -0x40(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x41ae
movq (%r14), %rax
movq (%rax,%r12), %rax
shlq $0x6, %rbx
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x38(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x41ae
movq (%r14), %rax
movl %r15d, %ebx
movq (%rax,%r12), %rax
shlq $0x6, %rbx
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x30(%rbp), %rsi
callq 0x52e5
testb %al, %al
je 0x41ae
movq -0x58(%rbp), %rax
leaq (%rax,%rbx), %rdi
addq $0x20, %rdi
movq -0x60(%rbp), %rsi
callq 0x2110
jmp 0x41ae
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %rbx
movq %rbx, %rsi
callq 0x5312
movq %rbx, %rdi
callq 0x4dc8
movq -0x70(%rbp), %rdi
incl %edi
jmp 0x417b
movq -0x68(%rbp), %rax
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42b2
jmp 0x42cd
jmp 0x42cd
jmp 0x42b2
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
jmp 0x42b2
jmp 0x42cd
movq %rax, %r14
jmp 0x42d9
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
jmp 0x42cd
movq %rax, %r14
leaq -0x58(%rbp), %rdi
callq 0x4dc8
movq -0x68(%rbp), %rdi
callq 0x4f1e
movq %r14, %rdi
callq 0x22e0