// File: /workspace/github_cpp_makefile_star2_O2/temelmertcan[P]multgen/src/multgen.cpp
// Function: create_mult(int, int, int, int, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, std::__cxx11::list<int, std::allocator<int>>&, std::queue<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>&, int&, bool**&)
int create_mult ( int  in1_size,
                  int  in2_size,
                  int  out_size,
		  int  shift_amount,
		  bool allowXes,
                  string final_stage_adder,
                  string pp_encoding,
                  string tree,
                  bool create_fin_adder,
                  string& module_name,
                  std::list<int>& extra_ones_indices,
                  queue<string>& verilog,
                  int& adder_size,
                  bool**& zeros_in_output){

  int pp_dim1, pp_dim2;
  string** pp_matrix;

  module_name = tree + "_" + pp_encoding + "_"
    + (create_fin_adder?final_stage_adder + "_" : "")
    + to_string(in1_size) + "x"
    + to_string(in2_size) + (allowXes ? "" : "_noX");
    
  if (create_fin_adder){

    if (shift_amount>0 || out_size!=(in1_size + in2_size))
      module_name += "_" + to_string(out_size-1) + "to" + to_string(shift_amount);

    verilog.push ("// Specification module to help understand what the design implements.");
    verilog.push ("module "+module_name+"_spec (");
    verilog.push("indent");
    verilog.push("indent");
    verilog.push ("input logic [" + to_string(in1_size-1) + ":0] IN1,");
    verilog.push ("input logic [" + to_string(in2_size-1) +  ":0] IN2,");
    verilog.push ("input logic [0:0] IN3, //redundant");
    verilog.push ("output logic design_is_correct, // is set to 1 iff the output of " + module_name + " matches its spec.");
    verilog.push ("output logic ["  + to_string(out_size-1) +  ":"+to_string(shift_amount)+"] design_res,");
    verilog.push ("output logic ["  + to_string(out_size-1) +  ":"+to_string(shift_amount)+"] spec_res);");
    verilog.push("outdent");
    verilog.push("");

    string signed_str = (pp_encoding[0] == 'S')?"signed'":"unsigned'";

    if (shift_amount>0){
      verilog.push("wire logic [" + to_string(out_size-1) + ":0] tmp_spec_res;");
      verilog.push("assign tmp_spec_res = "+signed_str+"(IN1) * "+signed_str+"(IN2);");
      verilog.push("assign spec_res["  + to_string(out_size-1) +  ":"+to_string(shift_amount)
		   +"] =  tmp_spec_res["  + to_string(out_size-1) +  ":"+to_string(shift_amount)
		   +"];");
    }else
      verilog.push("assign spec_res = "+signed_str+"(IN1) * "+signed_str+"(IN2);");

    verilog.push(module_name + " mult(IN1, IN2, design_res);");
    verilog.push("assign design_is_correct = ((spec_res == design_res) ? 1 : 0);");
    verilog.push("");
    verilog.push("outdent");
    verilog.push ("endmodule");
    verilog.push("");

    verilog.push ("\n");
  }

  verilog.push ("module " + module_name + "(");
  verilog.push("indent");
  verilog.push("indent");
  verilog.push ("input logic [" + to_string(in1_size - 1) + ":0] IN1," );
  verilog.push ("input logic [" + to_string(in2_size - 1) + ":0] IN2," );
  if (create_fin_adder)
    verilog.push ("output logic ["  + to_string(out_size-1) +  ":"+to_string(shift_amount)+"] result);" );
  else
    {
      verilog.push ("output logic [" + to_string(out_size - 1) + ":0] result0," );
      verilog.push ("output logic [" + to_string(out_size - 1) + ":0] result1);" );
    }
  verilog.push("outdent");
  verilog.push("");

  verilog.push("\n// Creating Partial Products \n");

  bool signed_mult = (pp_encoding[0] == 'S');
  int pp_adder_size = 0;

  if (pp_encoding.compare ("USP") == 0) {
    create_unsignedpp (in1_size, in2_size, pp_matrix,
                       pp_dim1, pp_dim2, verilog);

  } else if (pp_encoding.compare ("SSP") == 0) {
    create_signedpp (in1_size, in2_size, pp_matrix,
                     pp_dim1, pp_dim2, extra_ones_indices,
		     verilog);
  } else if (pp_encoding.compare ("SB4") == 0) {
    create_br4pp (in1_size, in2_size, true, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices,
		  allowXes, verilog);
    // create_signedbr4pp (in1_size, in2_size, pp_matrix,
    //                     pp_dim1, pp_dim2, verilog);
  } else if (pp_encoding.compare ("SB8") == 0) {
    create_br8pp (in1_size, in2_size, true, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices,
		  final_stage_adder, pp_adder_size,
		  allowXes, verilog);
  } else if (pp_encoding.compare ("UB8") == 0) {
    create_br8pp (in1_size, in2_size, false, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices,
		  final_stage_adder, pp_adder_size,
		  allowXes, verilog);
  } else if (pp_encoding.compare ("SB16") == 0) {
    create_br16pp (in1_size, in2_size, true, pp_matrix,
                   pp_dim1, pp_dim2, extra_ones_indices,
		   final_stage_adder, pp_adder_size,
		   allowXes, verilog);
  }  else if (pp_encoding.compare ("UB16") == 0) {
    create_br16pp (in1_size, in2_size, false, pp_matrix,
                   pp_dim1, pp_dim2, extra_ones_indices,
		   final_stage_adder, pp_adder_size, allowXes, verilog);
  } else if (pp_encoding.compare ("SB2") == 0) {
    create_br2pp (in1_size, in2_size, true, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices, allowXes, verilog);
    // create_signedbr2pp (in1_size, in2_size, pp_matrix,
    //                     pp_dim1, pp_dim2, verilog);
  } else if (pp_encoding.compare ("UB2") == 0) {
    create_br2pp (in1_size, in2_size, false, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices, allowXes, verilog);
    // create_unsignedbr2pp (in1_size, in2_size, pp_matrix,
    //                       pp_dim1, pp_dim2, verilog);
  } else if (pp_encoding.compare ("UB4") == 0) {
    create_br4pp (in1_size, in2_size, false, pp_matrix,
                  pp_dim1, pp_dim2, extra_ones_indices, allowXes, verilog);
    // create_unsignedbr4pp (in1_size, in2_size, pp_matrix,
    //                       pp_dim1, pp_dim2, verilog);
  } else {
    cout << "Bad PP Selection! Given: " << pp_encoding << endl;
    return 1;
  }

  if (create_fin_adder && !extra_ones_indices.empty()){

    // cout << "pp_dim2: " << pp_dim2 << endl;
    // for (auto e : extra_ones_indices)
    //   cout << e << " ";
    // cout << endl;

    add_extra_ones_to_pp_matrix (pp_matrix[pp_dim1-1], pp_dim2, extra_ones_indices);
    extra_ones_indices.clear();
  }

  print_pp (pp_matrix, pp_dim1, pp_dim2, verilog, true);

  // if (!extra_ones_indices.empty()){
  //   cout << "extra_ones_indices ";
  //   for (auto e : extra_ones_indices)
  //     cout << e << " ";
  //   cout << endl;
  // }

  // For information printing purposes only:
  string extra_ones_for_partial_mult = ""; // for partial mults, the extra ones may not be included.
  if (!extra_ones_indices.empty()){
    //verilog.push("\n// Extra_ones: \n");
    // cout << "extra_ones_indices: ";
    // for (auto i : extra_ones_indices)
    //   cout << i << " ";
    // cout << endl;
    string * extra_ones;
    add_extra_ones_to_pp_matrix (extra_ones, pp_dim2, extra_ones_indices);
    for (int i = pp_dim2-1; i>=0; i--)
      extra_ones_for_partial_mult += (extra_ones[i]=="1'b1"?"1":"0");
    //verilog.push("indent");
    verilog.push("");
    verilog.push ("// Extra ones that help with sign extension are not included in the multiplication.");
    verilog.push ("// To get the full multiplication result, you'd need to add b" + extra_ones_for_partial_mult + " to the tree above");
    //verilog.push("outdent");
  }
 
    

  verilog.push("\n// Creating Summation Tree \n");

  if (tree.compare ("WT") == 0) {
    create_wallacetree (pp_matrix, final_stage_adder, pp_dim1, pp_dim2,
                        out_size, shift_amount,
                        create_fin_adder,
                        signed_mult,
                        verilog,
                        adder_size,
                        zeros_in_output);

  } else if (tree.compare ("c42") == 0) {
    create_4to2tree (pp_matrix, final_stage_adder, pp_dim1, pp_dim2,
		     out_size, shift_amount,
		     create_fin_adder,
		     signed_mult,
		     verilog,
		     adder_size,
		     zeros_in_output);
  } else if (tree.compare ("DT") == 0){
    create_daddatree (pp_matrix, final_stage_adder, pp_dim1, pp_dim2,
                      out_size, shift_amount,
                      create_fin_adder,
                      signed_mult,
                      verilog,
                      adder_size,
                      zeros_in_output);
  } else {
    cout << "Bad Summation tree Selection!" << endl;
    return 1;
  }

  verilog.push("outdent");

  verilog.push ("endmodule\n\n");

  verilog.push("");

  

  cout << endl;
  cout << "Multiplier Module (" << module_name << ") is created." << endl;
  cout << "   Inputs: IN1[" << in1_size-1 << ":0], IN2[" << in2_size-1 << ":0]" << endl;
  if (create_fin_adder){
    cout << "   Output: result[" << out_size-1 << ":"<< shift_amount <<"]" << endl;
    cout << "   Function: result = IN1 * IN2" << (shift_amount==0?"":" >> "+to_string(shift_amount)) << (signed_mult?" (signed)":" (unsigned)") << endl;
  }else{
    cout << "   Outputs: result0[" << out_size-1 << ":0], result1[" << out_size-1 << ":0]" << endl;
    cout << "   Function: IN1 * IN2 " << (signed_mult?"(signed)":"(unsigned)") << " = result0 + result1 + "<< pp_dim2 << "'b" << extra_ones_for_partial_mult << " (Extra ones are to complete the sign extension)." << endl;
  }


  if (pp_adder_size>0)
    create_adder (final_stage_adder, true, pp_adder_size, verilog);
    
  return 0;

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x2e8, %rsp            # imm = 0x2E8
movq %r9, -0xb8(%rbp)
movl %r8d, %r13d
movl %ecx, %r15d
movq %rsi, -0xa0(%rbp)
movl %edi, %ebx
movq 0x18(%rbp), %rsi
movq 0x10(%rbp), %r12
movl %edx, -0x54(%rbp)
leaq 0x2dfa0(%rip), %rdx     # 0x33146
leaq -0x1d0(%rbp), %r14
movq %r14, %rdi
callq 0x11c3b
leaq -0x1b0(%rbp), %rdi
movq %r14, %rsi
movq %r12, %rdx
callq 0x11d77
leaq 0x2df78(%rip), %rdx     # 0x33146
leaq -0x120(%rbp), %rdi
leaq -0x1b0(%rbp), %rsi
callq 0x11ba1
cmpb $0x0, 0x20(%rbp)
je 0x5203
leaq 0x2df58(%rip), %rdx     # 0x33146
leaq -0x150(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x11c3b
jmp 0x521d
leaq 0x2e3c7(%rip), %rsi     # 0x335d1
leaq -0x150(%rbp), %rdi
leaq -0xf9(%rbp), %rdx
callq 0x20b0
leaq -0xf8(%rbp), %rdi
leaq -0x120(%rbp), %rsi
leaq -0x150(%rbp), %rdx
callq 0x11bca
leaq -0x190(%rbp), %rdi
movl %ebx, %esi
callq 0x11c73
leaq -0xd8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
leaq -0x190(%rbp), %rdx
callq 0x11bca
leaq 0x2c18d(%rip), %rdx     # 0x313f3
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x11ba1
leaq -0x170(%rbp), %rdi
movq -0xa0(%rbp), %rsi
callq 0x11c73
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
leaq -0x170(%rbp), %rdx
callq 0x11bca
leaq 0x2e327(%rip), %rax     # 0x335d1
leaq 0x2cbb0(%rip), %rdx     # 0x31e61
testb %r13b, %r13b
cmovneq %rax, %rdx
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
movl %r13d, -0x124(%rbp)
movq 0x28(%rbp), %r12
leaq -0x78(%rbp), %r14
movq %r12, %rdi
movq %r14, %rsi
callq 0x2210
movq %r14, %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x170(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0x190(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq -0x150(%rbp), %rdi
callq 0x20f0
cmpb $0x0, 0x20(%rbp)
movq 0x38(%rbp), %r13
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x1b0(%rbp), %rdi
callq 0x20f0
leaq -0x1d0(%rbp), %rdi
callq 0x20f0
cmpb $0x0, 0x20(%rbp)
je 0x5cbb
testl %r15d, %r15d
setle %al
movl -0x54(%rbp), %esi
movq -0xa0(%rbp), %rcx
addl %ebx, %ecx
cmpl %ecx, %esi
sete %cl
testb %cl, %al
jne 0x5430
decl %esi
leaq -0xd8(%rbp), %r14
movq %r14, %rdi
callq 0x11c73
leaq 0x2dda1(%rip), %rsi     # 0x33146
leaq -0x98(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2caab(%rip), %rdx     # 0x31e66
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0xf8(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
leaq -0xf8(%rbp), %rdx
callq 0x11bca
leaq -0x78(%rbp), %rsi
movq %r12, %rdi
callq 0x2360
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq 0x2ca32(%rip), %rsi     # 0x31e69
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2c848(%rip), %rsi     # 0x31ca8
leaq -0x50(%rbp), %r14
movq %r14, %rdi
movq %r12, %rdx
callq 0x11cd3
leaq 0x2c83a(%rip), %rdx     # 0x31cb0
leaq -0x78(%rbp), %rdi
movq %r14, %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2c811(%rip), %rsi     # 0x31cb8
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2c7e8(%rip), %rsi     # 0x31cb8
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leal -0x1(%rbx), %esi
leaq -0x98(%rbp), %r14
movq %r14, %rdi
callq 0x11c73
leaq 0x2c7c9(%rip), %rsi     # 0x31cd4
leaq -0x50(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2c7c4(%rip), %rdx     # 0x31ce2
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
movq -0xa0(%rbp), %rax
leal -0x1(%rax), %esi
movq %r14, %rdi
callq 0x11c73
leaq 0x2c766(%rip), %rsi     # 0x31cd4
leaq -0x50(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2c76a(%rip), %rdx     # 0x31ceb
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq 0x2c8f1(%rip), %rsi     # 0x31eb0
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2c8eb(%rip), %rsi     # 0x31ed3
leaq -0x50(%rbp), %r14
movq %r14, %rdi
movq %r12, %rdx
callq 0x11cd3
leaq 0x2cc21(%rip), %rdx     # 0x3221f
leaq -0x78(%rbp), %rdi
movq %r14, %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
movl -0x54(%rbp), %esi
decl %esi
leaq -0xf8(%rbp), %r14
movq %r14, %rdi
callq 0x11c73
leaq 0x2c6cd(%rip), %rsi     # 0x31d10
leaq -0xd8(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2b051(%rip), %rdx     # 0x306aa
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x11ba1
leaq -0x120(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x11bca
leaq 0x2c87c(%rip), %rdx     # 0x31f15
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
movl -0x54(%rbp), %esi
decl %esi
movq %r14, %rdi
callq 0x11c73
leaq 0x2c608(%rip), %rsi     # 0x31d10
leaq -0xd8(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2af8c(%rip), %rdx     # 0x306aa
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x11ba1
movq 0x10(%rbp), %r14
leaq -0x120(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x11bca
leaq 0x2c5bf(%rip), %rdx     # 0x31d21
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq 0x2c56a(%rip), %rsi     # 0x31d2e
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2dde4(%rip), %rsi     # 0x335d1
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
movq (%r14), %rax
cmpb $0x53, (%rax)
leaq 0x2c709(%rip), %rax     # 0x31f25
leaq 0x2c700(%rip), %rsi     # 0x31f23
cmoveq %rax, %rsi
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
testl %r15d, %r15d
jle 0x5aea
movl -0x54(%rbp), %esi
decl %esi
leaq -0xd8(%rbp), %rdi
callq 0x11c73
leaq 0x2c6d8(%rip), %rsi     # 0x31f2d
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rdx
callq 0x11d49
leaq 0x2c6cb(%rip), %rdx     # 0x31f3a
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq 0x2c699(%rip), %rsi     # 0x31f4c
leaq -0xf8(%rbp), %rdi
leaq -0x78(%rbp), %rdx
callq 0x11cd3
leaq 0x2c98e(%rip), %rdx     # 0x32258
leaq -0xd8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x11ba1
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
leaq -0x78(%rbp), %rdx
callq 0x11d77
leaq 0x2c668(%rip), %rdx     # 0x31f63
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
movl -0x54(%rbp), %esi
decl %esi
leaq -0x190(%rbp), %rdi
callq 0x11c73
leaq 0x2c60e(%rip), %rsi     # 0x31f6a
leaq -0x150(%rbp), %rdi
leaq -0x190(%rbp), %rdx
callq 0x11d49
leaq 0x2ad34(%rip), %rdx     # 0x306aa
leaq -0x1d0(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x11ba1
leaq -0x170(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x1b0(%rbp), %rdi
leaq -0x1d0(%rbp), %rsi
leaq -0x170(%rbp), %rdx
callq 0x11bca
leaq 0x2c5c2(%rip), %rdx     # 0x31f7b
leaq -0x120(%rbp), %rdi
leaq -0x1b0(%rbp), %rsi
callq 0x11ba1
movl -0x54(%rbp), %esi
decl %esi
leaq -0x230(%rbp), %rdi
callq 0x11c73
leaq -0xf8(%rbp), %rdi
leaq -0x120(%rbp), %rsi
leaq -0x230(%rbp), %rdx
callq 0x11bca
leaq 0x2acac(%rip), %rdx     # 0x306aa
leaq -0xd8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x11ba1
leaq -0x210(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
leaq -0x210(%rbp), %rdx
callq 0x11bca
leaq 0x2d00c(%rip), %rdx     # 0x32a4d
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0x210(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq -0x230(%rbp), %rdi
callq 0x20f0
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x1b0(%rbp), %rdi
callq 0x20f0
leaq -0x170(%rbp), %rdi
callq 0x20f0
leaq -0x1d0(%rbp), %rdi
callq 0x20f0
leaq -0x150(%rbp), %rdi
callq 0x20f0
leaq -0x190(%rbp), %rdi
jmp 0x5b7d
leaq 0x2c49d(%rip), %rsi     # 0x31f8e
leaq -0xf8(%rbp), %rdi
leaq -0x78(%rbp), %rdx
callq 0x11cd3
leaq 0x2c750(%rip), %rdx     # 0x32258
leaq -0xd8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x11ba1
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
leaq -0x78(%rbp), %rdx
callq 0x11d77
leaq 0x2c42a(%rip), %rdx     # 0x31f63
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq 0x2c418(%rip), %rdx     # 0x31fa1
leaq -0x50(%rbp), %rdi
movq %r12, %rsi
callq 0x11c3b
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2c40d(%rip), %rsi     # 0x31fbe
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2d9f4(%rip), %rsi     # 0x335d1
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2c125(%rip), %rsi     # 0x31d2e
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2c1a1(%rip), %rsi     # 0x31dd6
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2d970(%rip), %rsi     # 0x335d1
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2abea(%rip), %rsi     # 0x30877
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2bfe6(%rip), %rsi     # 0x31ca8
leaq -0x50(%rbp), %r14
movq %r14, %rdi
movq %r12, %rdx
callq 0x11cd3
leaq 0x2d3a5(%rip), %rdx     # 0x3307d
leaq -0x78(%rbp), %rdi
movq %r14, %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2bfaf(%rip), %rsi     # 0x31cb8
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2bf86(%rip), %rsi     # 0x31cb8
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leal -0x1(%rbx), %r12d
leaq -0x98(%rbp), %r14
movq %r14, %rdi
movl %r12d, %esi
callq 0x11c73
leaq 0x2bf63(%rip), %rsi     # 0x31cd4
leaq -0x50(%rbp), %rdi
movq %r14, %rdx
callq 0x11d49
leaq 0x2bf5e(%rip), %rdx     # 0x31ce2
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
movq 0x10(%rbp), %r14
movl %r12d, -0x12c(%rbp)
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
movq -0xa0(%rbp), %rax
leal -0x1(%rax), %esi
leaq -0x98(%rbp), %r12
movq %r12, %rdi
movl %esi, -0x128(%rbp)
callq 0x11c73
leaq 0x2bee8(%rip), %rsi     # 0x31cd4
leaq -0x50(%rbp), %rdi
movq %r12, %rdx
callq 0x11d49
leaq 0x2beec(%rip), %rdx     # 0x31ceb
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
cmpb $0x0, 0x20(%rbp)
je 0x5f0c
movl -0x54(%rbp), %esi
decl %esi
leaq -0xf8(%rbp), %r12
movq %r12, %rdi
callq 0x11c73
leaq 0x2beb5(%rip), %rsi     # 0x31d10
leaq -0xd8(%rbp), %rdi
movq %r12, %rdx
callq 0x11d49
leaq 0x2a839(%rip), %rdx     # 0x306aa
leaq -0x98(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x11ba1
leaq -0x120(%rbp), %rdi
movl %r15d, %esi
callq 0x11c73
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x11bca
leaq 0x2c14c(%rip), %rdx     # 0x31ffd
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
jmp 0x5fc3
movl -0x54(%rbp), %esi
decl %esi
movq %r12, %rdi
callq 0x11c73
leaq 0x2bdf0(%rip), %rsi     # 0x31d10
leaq -0x50(%rbp), %rdi
movq %r12, %rdx
callq 0x11d49
leaq 0x2c0d5(%rip), %rdx     # 0x32008
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
movl -0x54(%rbp), %esi
decl %esi
movq %r12, %rdi
callq 0x11c73
leaq 0x2bd92(%rip), %rsi     # 0x31d10
leaq -0x50(%rbp), %rdi
movq %r12, %rdx
callq 0x11d49
leaq 0x2c084(%rip), %rdx     # 0x32015
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x11ba1
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq 0x2bd5f(%rip), %rsi     # 0x31d2e
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2d5d9(%rip), %rsi     # 0x335d1
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x78(%rbp), %rdi
callq 0x20f0
leaq 0x2c002(%rip), %rsi     # 0x32023
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
leaq -0x78(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
movq 0x30(%rbp), %r12
leaq -0x78(%rbp), %rdi
callq 0x20f0
movq (%r14), %rax
movb (%rax), %al
movb %al, -0x29(%rbp)
andl $0x0, -0xf8(%rbp)
leaq 0x2b550(%rip), %rsi     # 0x315ad
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x6172
leaq 0x2b535(%rip), %rsi     # 0x315a9
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x6197
leaq 0x2b52e(%rip), %rsi     # 0x315b9
movq %r14, %rdi
callq 0x2090
movzbl -0x124(%rbp), %r13d
testl %eax, %eax
je 0x61c4
leaq 0x2b517(%rip), %rsi     # 0x315c1
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x61fd
leaq 0x2b504(%rip), %rsi     # 0x315c5
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x6258
leaq 0x2b249(%rip), %rsi     # 0x31321
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x62b2
leaq 0x2b4da(%rip), %rsi     # 0x315c9
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x630a
leaq 0x2b4ab(%rip), %rsi     # 0x315b1
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x69ff
leaq 0x2b498(%rip), %rsi     # 0x315b5
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x6a20
leaq 0x2b489(%rip), %rsi     # 0x315bd
movq %r14, %rdi
callq 0x2090
testl %eax, %eax
je 0x6a54
movq 0x38e7d(%rip), %rdi     # 0x3efc8
leaq 0x2bef1(%rip), %rsi     # 0x32043
callq 0x21c0
movq %rax, %rdi
movq %r14, %rsi
callq 0x2190
movq %rax, %rdi
callq 0x2110
pushq $0x1
popq %rbx
jmp 0x69eb
leaq -0xa8(%rbp), %rdx
leaq -0x58(%rbp), %rcx
leaq -0x30(%rbp), %r8
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
movq %r13, %r9
callq 0x19bde
jmp 0x6368
subq $0x8, %rsp
leaq -0xa8(%rbp), %rdx
leaq -0x58(%rbp), %rcx
leaq -0x30(%rbp), %r8
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
movq %r12, %r9
pushq %r13
callq 0x1a234
popq %rax
popq %rcx
jmp 0x6368
subq $0x8, %rsp
pushq $0x1
popq %rdx
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
movq 0x38(%rbp), %rax
pushq %rax
pushq %r13
movq %rax, %r13
pushq %r12
callq 0x1bc9f
addq $0x20, %rsp
jmp 0x6368
leaq -0x2b0(%rbp), %r14
movq %r14, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
subq $0x8, %rsp
pushq $0x1
popq %rdx
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
pushq 0x38(%rbp)
pushq %r13
leaq -0xf8(%rbp), %rax
pushq %rax
pushq %r14
pushq %r12
callq 0x1dfd9
addq $0x30, %rsp
leaq -0x2b0(%rbp), %rdi
jmp 0x635f
leaq -0x290(%rbp), %r14
movq %r14, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
subq $0x8, %rsp
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
xorl %edx, %edx
pushq 0x38(%rbp)
pushq %r13
leaq -0xf8(%rbp), %rax
pushq %rax
pushq %r14
pushq %r12
callq 0x1dfd9
addq $0x30, %rsp
leaq -0x290(%rbp), %rdi
jmp 0x635f
leaq -0x270(%rbp), %r14
movq %r14, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
subq $0x8, %rsp
pushq $0x1
popq %rdx
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
pushq 0x38(%rbp)
pushq %r13
leaq -0xf8(%rbp), %rax
pushq %rax
pushq %r14
pushq %r12
callq 0x21812
addq $0x30, %rsp
leaq -0x270(%rbp), %rdi
jmp 0x635f
leaq -0x250(%rbp), %r14
movq %r14, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
subq $0x8, %rsp
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
xorl %edx, %edx
pushq 0x38(%rbp)
pushq %r13
leaq -0xf8(%rbp), %rax
pushq %rax
pushq %r14
pushq %r12
callq 0x21812
addq $0x30, %rsp
leaq -0x250(%rbp), %rdi
callq 0x20f0
movq 0x38(%rbp), %r13
cmpb $0x0, 0x20(%rbp)
je 0x639a
cmpq %r12, (%r12)
je 0x639a
movq -0xa8(%rbp), %rax
movslq -0x58(%rbp), %rcx
leaq (%rax,%rcx,8), %rdi
addq $-0x8, %rdi
movl -0x30(%rbp), %esi
movq %r12, %rdx
callq 0x19879
movq %r12, %rdi
callq 0x11da0
movq -0xa8(%rbp), %rdi
movl -0x58(%rbp), %esi
movl -0x30(%rbp), %edx
pushq $0x1
popq %r8
movq %r13, %rcx
callq 0x199ab
leaq 0x2d217(%rip), %rsi     # 0x335d1
leaq -0x78(%rbp), %rdi
leaq -0x50(%rbp), %rdx
callq 0x20b0
cmpq %r12, (%r12)
movl %r15d, -0xac(%rbp)
je 0x64eb
movl -0x30(%rbp), %esi
leaq -0xd8(%rbp), %rdi
movq %r12, %rdx
callq 0x19879
movl -0x30(%rbp), %edi
leal 0x1(%rdi), %r14d
shlq $0x5, %rdi
addq $-0x20, %rdi
leaq 0x2c84d(%rip), %r15     # 0x32c4d
leaq 0x2cbc0(%rip), %rbx     # 0x32fc7
leaq -0x78(%rbp), %r13
decl %r14d
testl %r14d, %r14d
jle 0x6440
leaq -0x20(%rdi), %r12
addq -0xd8(%rbp), %rdi
leaq 0x2bc38(%rip), %rsi     # 0x3205d
callq 0x11b91
testb %al, %al
movq %rbx, %rsi
cmovneq %r15, %rsi
movq %r13, %rdi
callq 0x2340
movq %r12, %rdi
jmp 0x640b
leaq 0x2d18a(%rip), %rsi     # 0x335d1
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq 0x38(%rbp), %r13
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2bbeb(%rip), %rsi     # 0x32062
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2bc13(%rip), %rsi     # 0x320b6
leaq -0x98(%rbp), %rdi
leaq -0x78(%rbp), %rdx
callq 0x11cd3
leaq 0x2bc3a(%rip), %rdx     # 0x320f4
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x11ba1
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq -0x98(%rbp), %rdi
callq 0x20f0
leaq 0x2bc15(%rip), %rsi     # 0x32107
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r13, %rdi
callq 0x120e4
movq 0x18(%rbp), %rbx
movq 0x48(%rbp), %r15
movq 0x40(%rbp), %r13
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2afe1(%rip), %rsi     # 0x3150b
movq %rbx, %rdi
callq 0x2090
movzbl 0x20(%rbp), %r14d
testl %eax, %eax
je 0x658c
leaq 0x2afcc(%rip), %rsi     # 0x3150e
movq %rbx, %rdi
callq 0x2090
testl %eax, %eax
je 0x65e8
leaq 0x2adcd(%rip), %rsi     # 0x31326
movq %rbx, %rdi
callq 0x2090
testl %eax, %eax
je 0x6641
movq 0x38a58(%rip), %rdi     # 0x3efc8
leaq 0x2bbae(%rip), %rsi     # 0x32125
callq 0x21c0
pushq $0x1
popq %rbx
movq %rax, %rdi
callq 0x2110
jmp 0x69e2
movq -0xa8(%rbp), %r12
leaq -0x310(%rbp), %rbx
movq %rbx, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
xorl %eax, %eax
cmpb $0x53, -0x29(%rbp)
sete %al
movl -0x58(%rbp), %edx
movl -0x30(%rbp), %ecx
movl -0x54(%rbp), %r8d
subq $0x8, %rsp
movq %r12, %rdi
movq %rbx, %rsi
movl -0xac(%rbp), %r9d
pushq %r15
pushq %r13
movq 0x38(%rbp), %r15
pushq %r15
pushq %rax
pushq %r14
callq 0x2c773
addq $0x30, %rsp
jmp 0x6698
movq -0xa8(%rbp), %r12
leaq -0x2f0(%rbp), %rbx
movq %rbx, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
xorl %eax, %eax
cmpb $0x53, -0x29(%rbp)
sete %al
movl -0x58(%rbp), %edx
movl -0x30(%rbp), %ecx
movl -0x54(%rbp), %r8d
subq $0x8, %rsp
movq %r12, %rdi
movq %rbx, %rsi
movl -0xac(%rbp), %r9d
pushq %r15
pushq %r13
movq 0x38(%rbp), %r15
pushq %r15
pushq %rax
pushq %r14
callq 0x2ddef
addq $0x30, %rsp
jmp 0x6698
movq -0xa8(%rbp), %r12
leaq -0x2d0(%rbp), %rbx
movq %rbx, %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
xorl %eax, %eax
cmpb $0x53, -0x29(%rbp)
sete %al
movl -0x58(%rbp), %edx
movl -0x30(%rbp), %ecx
subq $0x8, %rsp
leaq -0x54(%rbp), %r8
movq %r12, %rdi
movq %rbx, %rsi
movl -0xac(%rbp), %r9d
pushq %r15
pushq %r13
movq 0x38(%rbp), %r15
pushq %r15
pushq %rax
pushq %r14
callq 0x27b05
addq $0x30, %rsp
movq %rbx, %rdi
callq 0x20f0
leaq 0x2b687(%rip), %rsi     # 0x31d2e
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r15, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2ba70(%rip), %rsi     # 0x32143
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r15, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
leaq 0x2ced2(%rip), %rsi     # 0x335d1
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %r15, %rdi
callq 0x120e4
leaq -0x50(%rbp), %rdi
callq 0x20f0
movq 0x3889d(%rip), %rdi     # 0x3efc8
callq 0x2110
movq 0x38891(%rip), %rdi     # 0x3efc8
leaq 0x2bcc4(%rip), %rsi     # 0x32402
callq 0x21c0
movq %rax, %rdi
movq 0x28(%rbp), %rsi
callq 0x2190
leaq 0x2b699(%rip), %rsi     # 0x31def
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
movq 0x3885b(%rip), %rdi     # 0x3efc8
leaq 0x2b689(%rip), %rsi     # 0x31dfd
callq 0x21c0
movq %rax, %rdi
movl -0x12c(%rbp), %esi
callq 0x2320
leaq 0x2b67f(%rip), %rsi     # 0x31e0d
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
movl -0x128(%rbp), %esi
callq 0x2320
leaq 0x2b66c(%rip), %rsi     # 0x31e17
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
cmpb $0x0, 0x20(%rbp)
je 0x686a
movq 0x387fc(%rip), %rdi     # 0x3efc8
leaq 0x2b652(%rip), %rsi     # 0x31e25
callq 0x21c0
movl -0x54(%rbp), %esi
decl %esi
movq %rax, %rdi
callq 0x2320
leaq 0x29ebe(%rip), %rsi     # 0x306aa
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
movl -0xac(%rbp), %esi
callq 0x2320
leaq 0x2b610(%rip), %rsi     # 0x31e19
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
movq 0x387a8(%rip), %rdi     # 0x3efc8
leaq 0x2b928(%rip), %rsi     # 0x3214f
callq 0x21c0
movq %rax, %rbx
movl -0xac(%rbp), %r14d
testl %r14d, %r14d
je 0x693c
leaq -0x98(%rbp), %rdi
movl %r14d, %esi
callq 0x11c73
leaq 0x2b91a(%rip), %rsi     # 0x3216f
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x11d49
jmp 0x6953
movq 0x38757(%rip), %rdi     # 0x3efc8
leaq 0x2b906(%rip), %rsi     # 0x3217e
callq 0x21c0
movl -0x54(%rbp), %esi
decl %esi
movq %rax, %rdi
callq 0x2320
leaq 0x2b902(%rip), %rsi     # 0x32193
movq %rax, %rdi
callq 0x21c0
movl -0x54(%rbp), %esi
decl %esi
movq %rax, %rdi
callq 0x2320
leaq 0x2b56a(%rip), %rsi     # 0x31e17
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
movq 0x38704(%rip), %rdi     # 0x3efc8
leaq 0x2b8d6(%rip), %rsi     # 0x321a1
callq 0x21c0
cmpb $0x53, -0x29(%rbp)
leaq 0x2b89a(%rip), %rcx     # 0x32175
leaq 0x2bc9d(%rip), %rsi     # 0x3257f
cmoveq %rcx, %rsi
movq %rax, %rdi
callq 0x21c0
leaq 0x2b8c4(%rip), %rsi     # 0x321b9
movq %rax, %rdi
callq 0x21c0
movl -0x30(%rbp), %esi
movq %rax, %rdi
callq 0x2320
leaq 0x2b8c2(%rip), %rsi     # 0x321d1
movq %rax, %rdi
callq 0x21c0
leaq -0x78(%rbp), %rsi
movq %rax, %rdi
callq 0x2190
leaq 0x2b8aa(%rip), %rsi     # 0x321d4
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
jmp 0x699f
leaq 0x2cc8e(%rip), %rsi     # 0x335d1
leaq -0x50(%rbp), %rdi
leaq -0x98(%rbp), %rdx
callq 0x20b0
leaq -0x50(%rbp), %rsi
movq %rbx, %rdi
callq 0x2190
cmpb $0x53, -0x29(%rbp)
leaq 0x2b80a(%rip), %rcx     # 0x32174
leaq 0x2bc0d(%rip), %rsi     # 0x3257e
cmoveq %rcx, %rsi
movq %rax, %rdi
callq 0x21c0
movq %rax, %rdi
callq 0x2110
leaq -0x50(%rbp), %rdi
callq 0x20f0
testl %r14d, %r14d
je 0x699f
leaq -0x98(%rbp), %rdi
callq 0x20f0
xorl %ebx, %ebx
cmpl $0x0, -0xf8(%rbp)
jle 0x69e2
leaq -0x1f0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x2250
movl -0xf8(%rbp), %edx
leaq -0x1f0(%rbp), %rdi
pushq $0x1
popq %rsi
movq 0x38(%rbp), %rcx
callq 0x48ae
leaq -0x1f0(%rbp), %rdi
callq 0x20f0
leaq -0x78(%rbp), %rdi
callq 0x20f0
movl %ebx, %eax
addq $0x2e8, %rsp            # imm = 0x2E8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
subq $0x8, %rsp
pushq $0x1
popq %rdx
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
jmp 0x6a3e
subq $0x8, %rsp
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
xorl %edx, %edx
movq 0x38(%rbp), %rax
pushq %rax
pushq %r13
movq %rax, %r13
pushq %r12
callq 0x1ac67
jmp 0x61f4
subq $0x8, %rsp
leaq -0xa8(%rbp), %rcx
leaq -0x58(%rbp), %r8
leaq -0x30(%rbp), %r9
movl %ebx, %edi
movq -0xa0(%rbp), %rsi
xorl %edx, %edx
jmp 0x61e3
movq %rax, %rbx
leaq -0x250(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
leaq -0x270(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
leaq -0x290(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
leaq -0x2b0(%rbp), %rdi
jmp 0x7063
jmp 0x705c
movq %rax, %rbx
leaq -0x2d0(%rbp), %rdi
jmp 0x7053
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6ad8
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6ae9
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
jmp 0x6c6f
movq %rax, %rbx
jmp 0x6c6f
jmp 0x6ceb
movq %rax, %rbx
leaq -0x2f0(%rbp), %rdi
jmp 0x7053
movq %rax, %rbx
jmp 0x704c
jmp 0x705c
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6b34
movq %rax, %rbx
leaq -0xf8(%rbp), %rdi
callq 0x20f0
jmp 0x6b45
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6b53
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6b64
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6b81
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6b92
movq %rax, %rbx
leaq -0x210(%rbp), %rdi
callq 0x20f0
jmp 0x6ba3
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
jmp 0x6bb4
movq %rax, %rbx
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq -0x230(%rbp), %rdi
callq 0x20f0
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x1b0(%rbp), %rdi
callq 0x20f0
leaq -0x170(%rbp), %rdi
callq 0x20f0
leaq -0x1d0(%rbp), %rdi
callq 0x20f0
leaq -0x150(%rbp), %rdi
callq 0x20f0
leaq -0x190(%rbp), %rdi
jmp 0x6ce4
movq %rax, %rbx
jmp 0x6bc0
movq %rax, %rbx
jmp 0x6bcc
movq %rax, %rbx
jmp 0x6bd8
movq %rax, %rbx
jmp 0x6be4
movq %rax, %rbx
jmp 0x6bf0
movq %rax, %rbx
jmp 0x6bfc
movq %rax, %rbx
jmp 0x6c08
jmp 0x6ceb
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6c4d
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6c5e
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
jmp 0x6c6f
movq %rax, %rbx
leaq -0xf8(%rbp), %rdi
jmp 0x6ce4
jmp 0x6ceb
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6c8b
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6c9c
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
jmp 0x6ce4
jmp 0x6ceb
movq %rax, %rbx
leaq -0x310(%rbp), %rdi
jmp 0x7053
movq %rax, %rbx
leaq -0x1f0(%rbp), %rdi
jmp 0x7053
jmp 0x6cdd
jmp 0x6ceb
jmp 0x6cdd
jmp 0x6ceb
jmp 0x6cdd
jmp 0x6ceb
jmp 0x6cdd
jmp 0x6ceb
jmp 0x6cdd
jmp 0x6ceb
jmp 0x6cdd
jmp 0x6ceb
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6cee
movq %rax, %rbx
jmp 0x705f
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6d12
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6d1a
movq %rax, %rbx
jmp 0x6f52
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6d2d
jmp 0x6f5d
movq %rax, %rbx
leaq -0x120(%rbp), %rdi
callq 0x20f0
jmp 0x6d4c
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6d5d
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6d65
movq %rax, %rbx
jmp 0x6f52
movq %rax, %rbx
jmp 0x6dc8
jmp 0x6f5d
jmp 0x6dd6
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6d98
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6da6
movq %rax, %rbx
leaq -0x120(%rbp), %rdi
callq 0x20f0
jmp 0x6db7
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6dc8
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
jmp 0x6e28
movq %rax, %rbx
jmp 0x6e28
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6dec
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6dfa
movq %rax, %rbx
leaq -0x120(%rbp), %rdi
callq 0x20f0
jmp 0x6e0b
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6e1c
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
jmp 0x6e28
jmp 0x6f80
jmp 0x6f8e
jmp 0x6f70
jmp 0x6f78
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6e5e
movq %rax, %rbx
jmp 0x6f52
jmp 0x6f5d
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6e79
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6e87
movq %rax, %rbx
jmp 0x6f60
jmp 0x6f70
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6eb1
movq %rax, %rbx
jmp 0x6f91
jmp 0x6f70
jmp 0x6f78
jmp 0x6ec2
movq %rax, %rbx
jmp 0x7006
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6edb
movq %rax, %rbx
jmp 0x704c
jmp 0x705c
jmp 0x6f0d
jmp 0x705c
jmp 0x6f0d
jmp 0x705c
jmp 0x705c
jmp 0x6f0d
jmp 0x705c
jmp 0x6f0d
jmp 0x705c
jmp 0x6f0d
jmp 0x705c
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
jmp 0x7053
jmp 0x705c
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
jmp 0x6f70
jmp 0x6f78
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6f3d
movq %rax, %rbx
jmp 0x6f52
jmp 0x6f5d
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6f52
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6f60
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
jmp 0x7063
jmp 0x6f70
jmp 0x6f78
movq %rax, %rbx
jmp 0x705f
movq %rax, %rbx
jmp 0x7068
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
jmp 0x6f91
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
jmp 0x6fab
movq %rax, %rbx
leaq -0x170(%rbp), %rdi
callq 0x20f0
jmp 0x6fbc
movq %rax, %rbx
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x6fcd
movq %rax, %rbx
leaq -0xd8(%rbp), %rdi
callq 0x20f0
jmp 0x6fde
movq %rax, %rbx
leaq -0x190(%rbp), %rdi
callq 0x20f0
leaq -0xf8(%rbp), %rdi
callq 0x20f0
leaq -0x150(%rbp), %rdi
callq 0x20f0
cmpb $0x0, 0x20(%rbp)
leaq -0x120(%rbp), %rdi
callq 0x20f0
leaq -0x1b0(%rbp), %rdi
callq 0x20f0
leaq -0x1d0(%rbp), %rdi
jmp 0x7063
movq %rax, %rbx
jmp 0x6fea
movq %rax, %rbx
jmp 0x6ff6
movq %rax, %rbx
jmp 0x7012
movq %rax, %rbx
jmp 0x701e
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x20f0
testl %r14d, %r14d
je 0x705f
leaq -0x98(%rbp), %rdi
callq 0x20f0
jmp 0x705f
jmp 0x705c
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x20f0
movq %rbx, %rdi
callq 0x2330