// File: MPSLab-ASU[P]DiRAC/./src/baseAccelSim.cc
// Function: baseAccelSim::readArchSpec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
void baseAccelSim::readArchSpec(string archSpecFileName) {
	string key, value, line;
	map <string, string> archSpec;

	ifstream inFile(archSpecFileName.c_str());

	if(!inFile)
	{
		cout << "Cannot open and read file: " << archSpecFileName.c_str() << endl;
		exit (EXIT_FAILURE);
	}

	while(getline(inFile, line)) {
		istringstream tokenStream(line);
		tokenStream >> key >> value;
		// Skip comments beginning with #
		// Skip empty lines
		if ( (key.find("#") != std::string::npos) || (line.empty()) )
	    continue;
		archSpec[key] = value;
	}
	inFile.close();

	nRows_PE_Array 				= stoi(archSpec["nRows_PE_Array"]);
	nCols_PE_Array 				= stoi(archSpec["nCols_PE_Array"]);
	RF_size 							= stoi(archSpec["RF_size"]);
	SPM_size 							= stoi(archSpec["SPM_size"]);
	total_banks_in_SPM 		= stoi(archSpec["total_banks_in_SPM"]);
	total_bytes_in_bank = stoi(archSpec["total_bytes_in_bank"]);
	accelerator_freq 			= stoi(archSpec["accelerator_freq"]);
	DMA_latency_setup 		= stoi(archSpec["DMA_init_cycles"]);
	DMA_latency_transfer_byte		= stod(archSpec["DMA_cycles_per_byte"]);
	DMA_freq 							= stoi(archSpec["DMA_freq"]);
	multiplier_stages			= stoi(archSpec["multiplier_stages"]);
	adder_stages 					= stoi(archSpec["adder_stages"]);
	maxItems_PE_FIFO			= stoi(archSpec["maxItems_PE_FIFO"]);
	size_insMem						= stoi(archSpec["size_insMem"]);

	inNetworks						= stoi(archSpec["inNetworks"]);
	outNetworks						= stoi(archSpec["outNetworks"]);

	total_PEs 						= nRows_PE_Array * nCols_PE_Array;
	// Consider total number of registers in the Register Files of PEs
	RF_size 							= RF_size / sizeof(data_type);
	totalNetworks					= inNetworks + outNetworks;
	// PE pipeline stages: Fetch+ Decoder + RF_Read + Multiplier+Adder + RF_Write
	uint8_t PE_pipeline_stages	= multiplier_stages + adder_stages + 4;
	delay_PE_WB_reduce		= PE_pipeline_stages;

	assert(nRows_PE_Array >= 1 && "Total PEs in a row should be 1 or more.");
	assert(nCols_PE_Array >= 1 && "Total PEs in a column should be 1 or more.");
	assert(RF_size >= 1 && "Registers in the RFs must be 1 or more.");
	assert(SPM_size >= RF_size && "Size of scratchpad memory must be larger than RF size.");
	assert(total_banks_in_SPM >= 1 &&
		"Total banks in Scratch-pad should be 1 or more.");
	assert(total_bytes_in_bank >= 1 &&
		"Total bytes in a bank of the Scratch-pad Memory must be 1 or more.");
	assert(SPM_size == (total_banks_in_SPM * total_bytes_in_bank) &&
		"SPM size must match SPM configuration with multi-banks.");
	assert(accelerator_freq > 0 &&
		"Frequency of the dataflow accelerator must be larger than 0 Hz.");
	assert(DMA_latency_setup > 0 &&
		"Initiation Cycles for DMA invocation should be greater than 0.");
	assert(DMA_latency_transfer_byte > 0 &&
		"Cycles per byte for transfering data through DMA must be greater than 0.");
	assert(DMA_freq > 0 &&
		"Frequency of the DMA for transferring the data must be larger than 0 Hz.");
	assert(multiplier_stages > 0 &&
		"Multiplier stages of Multiply-and-ACcumulate unit must be greater than 0.");
	assert(adder_stages > 0 &&
		"Adder stages of Multiply-and-ACcumulate unit must be greater than 0.");
	assert(maxItems_PE_FIFO > 1 && "Length of FIFOs in PEs for communicating via interconnect should be two or more.");
	assert(size_insMem > 0 && "Total instructions for executing an RF pass should be one or more.");
	assert(inNetworks >= 2 && "Total networks to communicate input data should be 2 or more.");
	assert(outNetworks >= 1 && "Total networks to communicate output data should be 1 or more.");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x890, %rsp            # imm = 0x890
movq %rsi, -0x6c8(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x4a2620
leaq -0x50(%rbp), %rdi
callq 0x4a2620
leaq -0x70(%rbp), %rdi
callq 0x4a2620
leaq -0xa0(%rbp), %rdi
callq 0x40ed40
movq -0x6c8(%rbp), %rdi
callq 0x4a4170
movq %rax, %rsi
leaq -0x2a8(%rbp), %rdi
movl $0x8, %edx
callq 0x46e8c0
jmp 0x4056b3
movq -0x2a8(%rbp), %rax
movq -0x18(%rax), %rax
leaq -0x2a8(%rbp,%rax), %rdi
callq 0x472d80
movb %al, -0x6c9(%rbp)
jmp 0x4056d3
movb -0x6c9(%rbp), %al
testb $0x1, %al
jne 0x4056e2
jmp 0x40576f
movq $0x61f900, %rdi         # imm = 0x61F900
leaq 0x19b920(%rip), %rsi    # 0x5a1010
callq 0x492450
movq %rax, -0x6d8(%rbp)
jmp 0x4056fe
movq -0x6c8(%rbp), %rdi
callq 0x4a4170
movq -0x6d8(%rbp), %rdi
movq %rax, %rsi
callq 0x492450
movq %rax, -0x6e0(%rbp)
jmp 0x405722
movq -0x6e0(%rbp), %rdi
movq $0x491d30, %rsi         # imm = 0x491D30
callq 0x490f40
jmp 0x405737
movl $0x1, %edi
callq 0x4ec1e0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406b90
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406b84
jmp 0x405771
leaq -0x2a8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x4a5170
movq %rax, -0x6e8(%rbp)
jmp 0x40578a
movq -0x6e8(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x472d70
movb %al, -0x6e9(%rbp)
jmp 0x4057a8
movb -0x6e9(%rbp), %al
testb $0x1, %al
jne 0x4057b7
jmp 0x4058a8
leaq -0x438(%rbp), %rdi
leaq -0x70(%rbp), %rsi
movl $0x8, %edx
callq 0x49a120
jmp 0x4057ce
leaq -0x438(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x4277f0
movq %rax, -0x6f8(%rbp)
jmp 0x4057e7
movq -0x6f8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4277f0
jmp 0x4057f9
leaq -0x30(%rbp), %rdi
leaq 0x1a34cc(%rip), %rsi    # 0x5a8cd0
xorl %eax, %eax
movl %eax, %edx
callq 0x4a4290
cmpq $-0x1, %rax
jne 0x405822
leaq -0x70(%rbp), %rdi
callq 0x4a2c50
testb $0x1, %al
jne 0x405822
jmp 0x405851
movl $0x2, -0x43c(%rbp)
jmp 0x405886
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x438(%rbp), %rdi
callq 0x497a10
jmp 0x406b84
leaq -0xa0(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x40ed60
movq %rax, -0x700(%rbp)
jmp 0x40586a
movq -0x700(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4a2760
jmp 0x40587c
movl $0x0, -0x43c(%rbp)
leaq -0x438(%rbp), %rdi
callq 0x497a10
movl -0x43c(%rbp), %eax
testl %eax, %eax
je 0x4058a3
jmp 0x40589e
jmp 0x405771
jmp 0x405771
leaq -0x2a8(%rbp), %rdi
callq 0x46ee70
jmp 0x4058b6
leaq -0x461(%rbp), %rdi
movq %rdi, -0x708(%rbp)
callq 0x426c50
movq -0x708(%rbp), %rdx
leaq 0x19b7fa(%rip), %rsi    # 0x5a10d1
leaq -0x460(%rbp), %rdi
callq 0x40ef60
jmp 0x4058e5
leaq -0xa0(%rbp), %rdi
leaq -0x460(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x710(%rbp)
jmp 0x405901
movq -0x710(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x714(%rbp)
jmp 0x40591e
movl -0x714(%rbp), %eax
movw %ax, 0x218c81(%rip)     # 0x61e5ac
leaq -0x460(%rbp), %rdi
callq 0x4a2730
leaq -0x461(%rbp), %rdi
callq 0x426c70
leaq -0x489(%rbp), %rdi
movq %rdi, -0x720(%rbp)
callq 0x426c50
movq -0x720(%rbp), %rdx
leaq 0x19b77c(%rip), %rsi    # 0x5a10e0
leaq -0x488(%rbp), %rdi
callq 0x40ef60
jmp 0x405972
leaq -0xa0(%rbp), %rdi
leaq -0x488(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x728(%rbp)
jmp 0x40598e
movq -0x728(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x72c(%rbp)
jmp 0x4059ab
movl -0x72c(%rbp), %eax
movw %ax, 0x218bf6(%rip)     # 0x61e5ae
leaq -0x488(%rbp), %rdi
callq 0x4a2730
leaq -0x489(%rbp), %rdi
callq 0x426c70
leaq -0x4b1(%rbp), %rdi
movq %rdi, -0x738(%rbp)
callq 0x426c50
movq -0x738(%rbp), %rdx
leaq 0x19b6fe(%rip), %rsi    # 0x5a10ef
leaq -0x4b0(%rbp), %rdi
callq 0x40ef60
jmp 0x4059ff
leaq -0xa0(%rbp), %rdi
leaq -0x4b0(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x740(%rbp)
jmp 0x405a1b
movq -0x740(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x744(%rbp)
jmp 0x405a38
movl -0x744(%rbp), %eax
movw %ax, 0x218b6b(%rip)     # 0x61e5b0
leaq -0x4b0(%rbp), %rdi
callq 0x4a2730
leaq -0x4b1(%rbp), %rdi
callq 0x426c70
leaq -0x4d9(%rbp), %rdi
movq %rdi, -0x750(%rbp)
callq 0x426c50
movq -0x750(%rbp), %rdx
leaq 0x19b679(%rip), %rsi    # 0x5a10f7
leaq -0x4d8(%rbp), %rdi
callq 0x40ef60
jmp 0x405a8c
leaq -0xa0(%rbp), %rdi
leaq -0x4d8(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x758(%rbp)
jmp 0x405aa8
movq -0x758(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x75c(%rbp)
jmp 0x405ac5
movl -0x75c(%rbp), %eax
movl %eax, 0x218ae3(%rip)    # 0x61e5b4
leaq -0x4d8(%rbp), %rdi
callq 0x4a2730
leaq -0x4d9(%rbp), %rdi
callq 0x426c70
leaq -0x501(%rbp), %rdi
movq %rdi, -0x768(%rbp)
callq 0x426c50
movq -0x768(%rbp), %rdx
leaq 0x19b5f6(%rip), %rsi    # 0x5a1100
leaq -0x500(%rbp), %rdi
callq 0x40ef60
jmp 0x405b18
leaq -0xa0(%rbp), %rdi
leaq -0x500(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x770(%rbp)
jmp 0x405b34
movq -0x770(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x774(%rbp)
jmp 0x405b51
movl -0x774(%rbp), %eax
movw %ax, 0x218a5c(%rip)     # 0x61e5ba
leaq -0x500(%rbp), %rdi
callq 0x4a2730
leaq -0x501(%rbp), %rdi
callq 0x426c70
leaq -0x529(%rbp), %rdi
movq %rdi, -0x780(%rbp)
callq 0x426c50
movq -0x780(%rbp), %rdx
leaq 0x19b57c(%rip), %rsi    # 0x5a1113
leaq -0x528(%rbp), %rdi
callq 0x40ef60
jmp 0x405ba5
leaq -0xa0(%rbp), %rdi
leaq -0x528(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x788(%rbp)
jmp 0x405bc1
movq -0x788(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x78c(%rbp)
jmp 0x405bde
movl -0x78c(%rbp), %eax
movw %ax, 0x2189d1(%rip)     # 0x61e5bc
leaq -0x528(%rbp), %rdi
callq 0x4a2730
leaq -0x529(%rbp), %rdi
callq 0x426c70
leaq -0x551(%rbp), %rdi
movq %rdi, -0x798(%rbp)
callq 0x426c50
movq -0x798(%rbp), %rdx
leaq 0x19b503(%rip), %rsi    # 0x5a1127
leaq -0x550(%rbp), %rdi
callq 0x40ef60
jmp 0x405c32
leaq -0xa0(%rbp), %rdi
leaq -0x550(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x7a0(%rbp)
jmp 0x405c4e
movq -0x7a0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x7a4(%rbp)
jmp 0x405c6b
movl -0x7a4(%rbp), %eax
cvtsi2ss %eax, %xmm0
movss %xmm0, 0x218943(%rip)   # 0x61e5c0
leaq -0x550(%rbp), %rdi
callq 0x4a2730
leaq -0x551(%rbp), %rdi
callq 0x426c70
leaq -0x579(%rbp), %rdi
movq %rdi, -0x7b0(%rbp)
callq 0x426c50
movq -0x7b0(%rbp), %rdx
leaq 0x19b482(%rip), %rsi    # 0x5a1138
leaq -0x578(%rbp), %rdi
callq 0x40ef60
jmp 0x405cc4
leaq -0xa0(%rbp), %rdi
leaq -0x578(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x7b8(%rbp)
jmp 0x405ce0
movq -0x7b8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x7bc(%rbp)
jmp 0x405cfd
movl -0x7bc(%rbp), %eax
cvtsi2ss %eax, %xmm0
movss %xmm0, 0x2188b5(%rip)   # 0x61e5c4
leaq -0x578(%rbp), %rdi
callq 0x4a2730
leaq -0x579(%rbp), %rdi
callq 0x426c70
leaq -0x5a1(%rbp), %rdi
movq %rdi, -0x7c8(%rbp)
callq 0x426c50
movq -0x7c8(%rbp), %rdx
leaq 0x19b400(%rip), %rsi    # 0x5a1148
leaq -0x5a0(%rbp), %rdi
callq 0x40ef60
jmp 0x405d56
leaq -0xa0(%rbp), %rdi
leaq -0x5a0(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x7d0(%rbp)
jmp 0x405d72
movq -0x7d0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x40f010
movsd %xmm0, -0x7d8(%rbp)
jmp 0x405d8c
movsd -0x7d8(%rbp), %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x218828(%rip)   # 0x61e5c8
leaq -0x5a0(%rbp), %rdi
callq 0x4a2730
leaq -0x5a1(%rbp), %rdi
callq 0x426c70
leaq -0x5c9(%rbp), %rdi
movq %rdi, -0x7e0(%rbp)
callq 0x426c50
movq -0x7e0(%rbp), %rdx
leaq 0x19b383(%rip), %rsi    # 0x5a115c
leaq -0x5c8(%rbp), %rdi
callq 0x40ef60
jmp 0x405de7
leaq -0xa0(%rbp), %rdi
leaq -0x5c8(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x7e8(%rbp)
jmp 0x405e03
movq -0x7e8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x7ec(%rbp)
jmp 0x405e20
movl -0x7ec(%rbp), %eax
cvtsi2ss %eax, %xmm0
movss %xmm0, 0x21879a(%rip)   # 0x61e5cc
leaq -0x5c8(%rbp), %rdi
callq 0x4a2730
leaq -0x5c9(%rbp), %rdi
callq 0x426c70
leaq -0x5f1(%rbp), %rdi
movq %rdi, -0x7f8(%rbp)
callq 0x426c50
movq -0x7f8(%rbp), %rdx
leaq 0x19b2fa(%rip), %rsi    # 0x5a1165
leaq -0x5f0(%rbp), %rdi
callq 0x40ef60
jmp 0x405e79
leaq -0xa0(%rbp), %rdi
leaq -0x5f0(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x800(%rbp)
jmp 0x405e95
movq -0x800(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x804(%rbp)
jmp 0x405eb2
movl -0x804(%rbp), %eax
movb %al, 0x216296(%rip)     # 0x61c154
leaq -0x5f0(%rbp), %rdi
callq 0x4a2730
leaq -0x5f1(%rbp), %rdi
callq 0x426c70
leaq -0x619(%rbp), %rdi
movq %rdi, -0x810(%rbp)
callq 0x426c50
movq -0x810(%rbp), %rdx
leaq 0x19b280(%rip), %rsi    # 0x5a1177
leaq -0x618(%rbp), %rdi
callq 0x40ef60
jmp 0x405f05
leaq -0xa0(%rbp), %rdi
leaq -0x618(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x818(%rbp)
jmp 0x405f21
movq -0x818(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x81c(%rbp)
jmp 0x405f3e
movl -0x81c(%rbp), %eax
movb %al, 0x21620b(%rip)     # 0x61c155
leaq -0x618(%rbp), %rdi
callq 0x4a2730
leaq -0x619(%rbp), %rdi
callq 0x426c70
leaq -0x641(%rbp), %rdi
movq %rdi, -0x828(%rbp)
callq 0x426c50
movq -0x828(%rbp), %rdx
leaq 0x19b201(%rip), %rsi    # 0x5a1184
leaq -0x640(%rbp), %rdi
callq 0x40ef60
jmp 0x405f91
leaq -0xa0(%rbp), %rdi
leaq -0x640(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x830(%rbp)
jmp 0x405fad
movq -0x830(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x834(%rbp)
jmp 0x405fca
movl -0x834(%rbp), %eax
movb %al, 0x216180(%rip)     # 0x61c156
leaq -0x640(%rbp), %rdi
callq 0x4a2730
leaq -0x641(%rbp), %rdi
callq 0x426c70
leaq -0x669(%rbp), %rdi
movq %rdi, -0x840(%rbp)
callq 0x426c50
movq -0x840(%rbp), %rdx
leaq 0x19b186(%rip), %rsi    # 0x5a1195
leaq -0x668(%rbp), %rdi
callq 0x40ef60
jmp 0x40601d
leaq -0xa0(%rbp), %rdi
leaq -0x668(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x848(%rbp)
jmp 0x406039
movq -0x848(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x84c(%rbp)
jmp 0x406056
movl -0x84c(%rbp), %eax
movw %ax, 0x218555(%rip)     # 0x61e5b8
leaq -0x668(%rbp), %rdi
callq 0x4a2730
leaq -0x669(%rbp), %rdi
callq 0x426c70
leaq -0x691(%rbp), %rdi
movq %rdi, -0x858(%rbp)
callq 0x426c50
movq -0x858(%rbp), %rdx
leaq 0x19b105(%rip), %rsi    # 0x5a11a1
leaq -0x690(%rbp), %rdi
callq 0x40ef60
jmp 0x4060aa
leaq -0xa0(%rbp), %rdi
leaq -0x690(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x860(%rbp)
jmp 0x4060c6
movq -0x860(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x864(%rbp)
jmp 0x4060e3
movl -0x864(%rbp), %eax
movb %al, 0x216062(%rip)     # 0x61c151
leaq -0x690(%rbp), %rdi
callq 0x4a2730
leaq -0x691(%rbp), %rdi
callq 0x426c70
leaq -0x6b9(%rbp), %rdi
movq %rdi, -0x870(%rbp)
callq 0x426c50
movq -0x870(%rbp), %rdx
leaq 0x19b084(%rip), %rsi    # 0x5a11ac
leaq -0x6b8(%rbp), %rdi
callq 0x40ef60
jmp 0x406136
leaq -0xa0(%rbp), %rdi
leaq -0x6b8(%rbp), %rsi
callq 0x40ee80
movq %rax, -0x878(%rbp)
jmp 0x406152
movq -0x878(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x40ee40
movl %eax, -0x87c(%rbp)
jmp 0x40616f
movl -0x87c(%rbp), %eax
movb %al, 0x218469(%rip)     # 0x61e5e4
leaq -0x6b8(%rbp), %rdi
callq 0x4a2730
leaq -0x6b9(%rbp), %rdi
callq 0x426c70
movzwl 0x218412(%rip), %eax    # 0x61e5ac
movzwl 0x21840d(%rip), %ecx    # 0x61e5ae
imull %ecx, %eax
movl %eax, 0x2183fe(%rip)    # 0x61e5a8
movzwl 0x2183ff(%rip), %eax    # 0x61e5b0
shrq %rax
movw %ax, 0x2183f5(%rip)     # 0x61e5b0
movzbl 0x215f8f(%rip), %eax    # 0x61c151
movzbl 0x21841b(%rip), %ecx    # 0x61e5e4
addl %ecx, %eax
movb %al, 0x215f82(%rip)     # 0x61c153
movzbl 0x215f7c(%rip), %eax    # 0x61c154
movzbl 0x215f76(%rip), %ecx    # 0x61c155
addl %ecx, %eax
addl $0x4, %eax
movb %al, -0x6ba(%rbp)
movb -0x6ba(%rbp), %al
movb %al, 0x215f5a(%rip)     # 0x61c150
movzwl 0x2183af(%rip), %ecx    # 0x61e5ac
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x87d(%rbp)
jl 0x406214
movb $0x1, %al
movb %al, -0x87d(%rbp)
jmp 0x406214
movb -0x87d(%rbp), %al
testb $0x1, %al
jne 0x406220
jmp 0x406225
jmp 0x406674
leaq 0x19afb4(%rip), %rdi    # 0x5a11e0
leaq 0x19ae5b(%rip), %rsi    # 0x5a108e
movl $0x6a, %edx
leaq 0x19afe2(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406276
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x460(%rbp), %rdi
callq 0x4a2730
leaq -0x461(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x4062b9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x488(%rbp), %rdi
callq 0x4a2730
leaq -0x489(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x4062fc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x4b0(%rbp), %rdi
callq 0x4a2730
leaq -0x4b1(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x40633f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x4d8(%rbp), %rdi
callq 0x4a2730
leaq -0x4d9(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406382
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x500(%rbp), %rdi
callq 0x4a2730
leaq -0x501(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x4063c5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x528(%rbp), %rdi
callq 0x4a2730
leaq -0x529(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406408
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x550(%rbp), %rdi
callq 0x4a2730
leaq -0x551(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x40644b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x578(%rbp), %rdi
callq 0x4a2730
leaq -0x579(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x40648e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x5a0(%rbp), %rdi
callq 0x4a2730
leaq -0x5a1(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x4064d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x5c8(%rbp), %rdi
callq 0x4a2730
leaq -0x5c9(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406514
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x5f0(%rbp), %rdi
callq 0x4a2730
leaq -0x5f1(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406557
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x618(%rbp), %rdi
callq 0x4a2730
leaq -0x619(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x40659a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x640(%rbp), %rdi
callq 0x4a2730
leaq -0x641(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x4065dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x668(%rbp), %rdi
callq 0x4a2730
leaq -0x669(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406620
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x690(%rbp), %rdi
callq 0x4a2730
leaq -0x691(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
jmp 0x406663
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2b4(%rbp)
leaq -0x6b8(%rbp), %rdi
callq 0x4a2730
leaq -0x6b9(%rbp), %rdi
callq 0x426c70
jmp 0x406b84
movzwl 0x217f33(%rip), %ecx    # 0x61e5ae
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x87e(%rbp)
jl 0x406692
movb $0x1, %al
movb %al, -0x87e(%rbp)
jmp 0x406692
movb -0x87e(%rbp), %al
testb $0x1, %al
jne 0x40669e
jmp 0x4066a0
jmp 0x4066bf
leaq 0x19abcd(%rip), %rdi    # 0x5a1274
leaq 0x19a9e0(%rip), %rsi    # 0x5a108e
movl $0x6b, %edx
leaq 0x19ab67(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzwl 0x217eea(%rip), %ecx    # 0x61e5b0
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x87f(%rbp)
jl 0x4066dd
movb $0x1, %al
movb %al, -0x87f(%rbp)
jmp 0x4066dd
movb -0x87f(%rbp), %al
testb $0x1, %al
jne 0x4066e9
jmp 0x4066eb
jmp 0x40670a
leaq 0x19abee(%rip), %rdi    # 0x5a12e0
leaq 0x19a995(%rip), %rsi    # 0x5a108e
movl $0x6c, %edx
leaq 0x19ab1c(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movl 0x217ea4(%rip), %ecx    # 0x61e5b4
movzwl 0x217e99(%rip), %edx    # 0x61e5b0
xorl %eax, %eax
cmpl %edx, %ecx
movb %al, -0x880(%rbp)
jb 0x40672d
movb $0x1, %al
movb %al, -0x880(%rbp)
jmp 0x40672d
movb -0x880(%rbp), %al
testb $0x1, %al
jne 0x406739
jmp 0x40673b
jmp 0x40675a
leaq 0x19ac0f(%rip), %rdi    # 0x5a1351
leaq 0x19a945(%rip), %rsi    # 0x5a108e
movl $0x6d, %edx
leaq 0x19aacc(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzwl 0x217e59(%rip), %ecx    # 0x61e5ba
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x881(%rbp)
jl 0x406778
movb $0x1, %al
movb %al, -0x881(%rbp)
jmp 0x406778
movb -0x881(%rbp), %al
testb $0x1, %al
jne 0x406784
jmp 0x406786
jmp 0x4067a5
leaq 0x19ac44(%rip), %rdi    # 0x5a13d1
leaq 0x19a8fa(%rip), %rsi    # 0x5a108e
movl $0x6f, %edx
leaq 0x19aa81(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzwl 0x217e10(%rip), %ecx    # 0x61e5bc
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x882(%rbp)
jl 0x4067c3
movb $0x1, %al
movb %al, -0x882(%rbp)
jmp 0x4067c3
movb -0x882(%rbp), %al
testb $0x1, %al
jne 0x4067cf
jmp 0x4067d1
jmp 0x4067f0
leaq 0x19ac89(%rip), %rdi    # 0x5a1461
leaq 0x19a8af(%rip), %rsi    # 0x5a108e
movl $0x71, %edx
leaq 0x19aa36(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movl 0x217dbe(%rip), %ecx    # 0x61e5b4
movzwl 0x217dbd(%rip), %edx    # 0x61e5ba
movzwl 0x217db8(%rip), %eax    # 0x61e5bc
imull %eax, %edx
xorl %eax, %eax
cmpl %edx, %ecx
movb %al, -0x883(%rbp)
jne 0x40681d
movb $0x1, %al
movb %al, -0x883(%rbp)
jmp 0x40681d
movb -0x883(%rbp), %al
testb $0x1, %al
jne 0x406829
jmp 0x40682b
jmp 0x40684a
leaq 0x19acc8(%rip), %rdi    # 0x5a14fa
leaq 0x19a855(%rip), %rsi    # 0x5a108e
movl $0x73, %edx
leaq 0x19a9dc(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movss 0x217d6e(%rip), %xmm0   # 0x61e5c0
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0x884(%rbp)
jbe 0x40686c
movb $0x1, %al
movb %al, -0x884(%rbp)
jmp 0x40686c
movb -0x884(%rbp), %al
testb $0x1, %al
jne 0x406878
jmp 0x40687a
jmp 0x406899
leaq 0x19ad2d(%rip), %rdi    # 0x5a15ae
leaq 0x19a806(%rip), %rsi    # 0x5a108e
movl $0x75, %edx
leaq 0x19a98d(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movss 0x217d23(%rip), %xmm0   # 0x61e5c4
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0x885(%rbp)
jbe 0x4068bb
movb $0x1, %al
movb %al, -0x885(%rbp)
jmp 0x4068bb
movb -0x885(%rbp), %al
testb $0x1, %al
jne 0x4068c7
jmp 0x4068c9
jmp 0x4068e8
leaq 0x19ad77(%rip), %rdi    # 0x5a1647
leaq 0x19a7b7(%rip), %rsi    # 0x5a108e
movl $0x77, %edx
leaq 0x19a93e(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movss 0x217cd8(%rip), %xmm0   # 0x61e5c8
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0x886(%rbp)
jbe 0x40690a
movb $0x1, %al
movb %al, -0x886(%rbp)
jmp 0x40690a
movb -0x886(%rbp), %al
testb $0x1, %al
jne 0x406916
jmp 0x406918
jmp 0x406937
leaq 0x19adcb(%rip), %rdi    # 0x5a16ea
leaq 0x19a768(%rip), %rsi    # 0x5a108e
movl $0x79, %edx
leaq 0x19a8ef(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movss 0x217c8d(%rip), %xmm0   # 0x61e5cc
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0x887(%rbp)
jbe 0x406959
movb $0x1, %al
movb %al, -0x887(%rbp)
jmp 0x406959
movb -0x887(%rbp), %al
testb $0x1, %al
jne 0x406965
jmp 0x406967
jmp 0x406986
leaq 0x19ae31(%rip), %rdi    # 0x5a179f
leaq 0x19a719(%rip), %rsi    # 0x5a108e
movl $0x7b, %edx
leaq 0x19a8a0(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzbl 0x2157c7(%rip), %ecx    # 0x61c154
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x888(%rbp)
jle 0x4069a4
movb $0x1, %al
movb %al, -0x888(%rbp)
jmp 0x4069a4
movb -0x888(%rbp), %al
testb $0x1, %al
jne 0x4069b0
jmp 0x4069b2
jmp 0x4069d1
leaq 0x19ae8b(%rip), %rdi    # 0x5a1844
leaq 0x19a6ce(%rip), %rsi    # 0x5a108e
movl $0x7d, %edx
leaq 0x19a855(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzbl 0x21577d(%rip), %ecx    # 0x61c155
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x889(%rbp)
jle 0x4069ef
movb $0x1, %al
movb %al, -0x889(%rbp)
jmp 0x4069ef
movb -0x889(%rbp), %al
testb $0x1, %al
jne 0x4069fb
jmp 0x4069fd
jmp 0x406a1c
leaq 0x19aeea(%rip), %rdi    # 0x5a18ee
leaq 0x19a683(%rip), %rsi    # 0x5a108e
movl $0x7f, %edx
leaq 0x19a80a(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzbl 0x215733(%rip), %ecx    # 0x61c156
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x88a(%rbp)
jle 0x406a3a
movb $0x1, %al
movb %al, -0x88a(%rbp)
jmp 0x406a3a
movb -0x88a(%rbp), %al
testb $0x1, %al
jne 0x406a46
jmp 0x406a48
jmp 0x406a67
leaq 0x19af4b(%rip), %rdi    # 0x5a199a
leaq 0x19a638(%rip), %rsi    # 0x5a108e
movl $0x80, %edx
leaq 0x19a7bf(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzwl 0x217b4a(%rip), %ecx    # 0x61e5b8
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x88b(%rbp)
jle 0x406a85
movb $0x1, %al
movb %al, -0x88b(%rbp)
jmp 0x406a85
movb -0x88b(%rbp), %al
testb $0x1, %al
jne 0x406a91
jmp 0x406a93
jmp 0x406ab2
leaq 0x19afae(%rip), %rdi    # 0x5a1a48
leaq 0x19a5ed(%rip), %rsi    # 0x5a108e
movl $0x81, %edx
leaq 0x19a774(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzbl 0x215698(%rip), %ecx    # 0x61c151
xorl %eax, %eax
cmpl $0x2, %ecx
movb %al, -0x88c(%rbp)
jl 0x406ad0
movb $0x1, %al
movb %al, -0x88c(%rbp)
jmp 0x406ad0
movb -0x88c(%rbp), %al
testb $0x1, %al
jne 0x406adc
jmp 0x406ade
jmp 0x406afd
leaq 0x19aff9(%rip), %rdi    # 0x5a1ade
leaq 0x19a5a2(%rip), %rsi    # 0x5a108e
movl $0x82, %edx
leaq 0x19a729(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
movzbl 0x217ae0(%rip), %ecx    # 0x61e5e4
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x88d(%rbp)
jl 0x406b1b
movb $0x1, %al
movb %al, -0x88d(%rbp)
jmp 0x406b1b
movb -0x88d(%rbp), %al
testb $0x1, %al
jne 0x406b27
jmp 0x406b29
jmp 0x406b48
leaq 0x19b040(%rip), %rdi    # 0x5a1b70
leaq 0x19a557(%rip), %rsi    # 0x5a108e
movl $0x83, %edx
leaq 0x19a6de(%rip), %rcx    # 0x5a1221
callq 0x4e53d0
leaq -0x2a8(%rbp), %rdi
callq 0x46f220
leaq -0xa0(%rbp), %rdi
callq 0x40f050
leaq -0x70(%rbp), %rdi
callq 0x4a2730
leaq -0x50(%rbp), %rdi
callq 0x4a2730
leaq -0x30(%rbp), %rdi
callq 0x4a2730
addq $0x890, %rsp            # imm = 0x890
popq %rbp
retq
leaq -0x2a8(%rbp), %rdi
callq 0x46f220
leaq -0xa0(%rbp), %rdi
callq 0x40f050
leaq -0x70(%rbp), %rdi
callq 0x4a2730
leaq -0x50(%rbp), %rdi
callq 0x4a2730
leaq -0x30(%rbp), %rdi
callq 0x4a2730
movq -0x2b0(%rbp), %rdi
callq 0x4d0770
nopw %cs:(%rax,%rax)