// File: /workspace/github_cpp_makefile_star2_O1/schneebergerlab[P]DrLink/analyze_molecule.cpp
// Function: analyze_molecule(int, char**)
bool analyze_molecule(int argc, char* argv[])
{
    if(argc != 6)
    {
        cout << "\n   Usage: DrLink molecule preprocessed_bamInfo.gz max_inter_read_dist min_molecule_size out_prefix_str "               << endl;
        cout << "     max_inter_read_dist\tINT\tbp: reads with same barcode but distance >= value will be separated into sub-molecules. " << endl;
        cout << "                             \tThis depends on sequencing library design: if expected mean size of molecules is EXP kp, we can use 1.5*EXP bp." << endl;   
        cout << "     min_molecule_size\tINT\tbp: size of molecules <= value will not contribute to final statistics, e.g., 1000 bp. "    << endl;
        return false;
    }
    clock_t tbeg;
    tbeg = clock();
    bool verbose = true;            // TODO: add option
    unsigned long winsize = 100000; // same barcode in chr with distance>100kb => two molecules; note this depends on sequencing library design
    // input file
    string procbamfile("");    
    int minMoleSize = 1000;
    std::stringstream minMsize;
    minMsize.str("");
    minMsize << minMoleSize;    
    string out_prefix("");
    if(argc == 6)
    {
        procbamfile = (string)argv[2];
        winsize     = strtoul(argv[3], NULL, 0); 
        minMoleSize = atoi(argv[4]);
        out_prefix  = (string)argv[5]; 
        minMsize.str("");
        minMsize << minMoleSize;       
    }
    // step 1. read chr size info
    /*
    map<string, string> chrSizes;
    if(!read_chrsize(chrsizefile.c_str(), &chrSizes))
    {
        cout << "   Error: reading chr size failed (analyze_molecule.cpp). " << endl;
        return false;
    }
    */
    // step 2.
    cout << "   Info: analyzing molecules started..." << endl;
    // open converted file.gz.
    if(procbamfile.find(".gz")==std::string::npos)
    {
        cout << "   Error: current version only supported gzipped file. " << endl;
        return false;
    }
    igzstream alifp;
    alifp.open(procbamfile.c_str());
    if(!alifp.good())
    {
        cout << "   Error: cannot open " << procbamfile << endl;
        return false;
    }
    // 2.1 prepare variable for analyzing/outputing alignments/clusters
    string ofilename = out_prefix + "_min" + minMsize.str() + "bp_molecule_table_trashme.txt.gz";
    ogzstream moutfp;
    moutfp.open(ofilename.c_str(), ios::out);
    if(!moutfp)
    {
        cout << "    Error: cannot open file " << ofilename << " for writing. " << endl;
        return false;
    }
    moutfp << "#chr#barcode\tfirst_aligned\tlast_aligned\tmolecule_len\tmolecule_cov\tread_num\tUni_flag\tlast_aligned_end\treads_region\tR1R2\treads_id" << endl;
    map<string,  unsigned long> molecule_cov;          // key: 0.01x, 0.02x,0.03x, ...,    val: number of molecules
    map<int,     unsigned long> molecule_len;          // key: 0kb, 1kb, 2kb,...           val: number of molecules.
    map<int,     unsigned long> molecule_len_sum;      // key: 0kb, 1kb, 2kb,...           val: total length of molecules in bin 
    map<int,     unsigned long> molecule_read_num;     // key: 1,2,3...                    val: number of molecules
    map<int,     unsigned long> molecule_read_num_sum; // key: 1,2,3...                    val: total length of reads in bin
    // note that below is a statistic of the read-distances within the same chr#barcode (but possibly several molecules).
    map<int,     unsigned long> molecule_read_interval;// key: 200,201,...                 val: total number of cases with that inter-read-distance-given-by-key
    map<string,            int> barcode_molecule_cnt;  // key: barcode1, barcode2,...      val: number of molecules
    multimap<string, ALIGNINFO> bcPosQueue; // from barcode find read-aligning (sta, end)-positions
    // 2.2 cluster existing alignments in queue and output molecule info -- caution in RAM
    string lastChr("");
    string currentChr("");
    unsigned long lineNum = 0;
    while(alifp.good())
    {
        string line("");
        getline(alifp, line);
        if(line.size()==0 || line[0]=='#' || line[0]=='*') continue;
        
        lineNum ++;
        if(lineNum%10000000 == 0) cout << "    " << lineNum << "th aligm..." << endl;
        
        // chr pos inbamCIGAR barcode MI read-ordering:inbamFLAG reversed-align read-id
        // 1	125	128M	TTTCCTCAGGGTTTCT	0	R1:99 rc        idddddd
        vector<string> lineinfo = split_string(line, '\t');
        if(lineinfo.size() < 6) continue;        
        if(lastChr.size() == 0)
        {
            lastChr    = lineinfo[0];
        }
        currentChr = lineinfo[0];        
        
        if(currentChr.compare(lastChr)!=0 && bcPosQueue.size()>0)
        {
            // output alignments for last chr and record statistics
            write_chr_alignment(moutfp,
                                &bcPosQueue, 
                                &molecule_cov,
                                &molecule_len,
                                &molecule_len_sum,
                                &molecule_read_num,
                                &molecule_read_num_sum,
                                &molecule_read_interval,
                                &barcode_molecule_cnt,
                                lastChr,
                                winsize,
                                minMoleSize);
            // clean info for last Chr
            bcPosQueue.clear();
            lastChr = currentChr;
        }
        unsigned long stapos = strtoul(lineinfo[1].c_str(), NULL, 0); // alignment start position
        int covlen = 0;
        covlen = decipher_cigar(lineinfo[2]);                         // covered len by alignment
        string key("");
        key    = lineinfo[0] + "#" + lineinfo[3];                     // chr+"#"+barcode            
        ALIGNINFO span;
        span.first  = stapos;
        span.second = stapos+covlen-1;                                //
        if(lineinfo[5].find("R1") != std::string::npos)
        {
            span.rorder = "1";
        }
        else
        if(lineinfo[5].find("R2") != std::string::npos)
        {
            span.rorder = "2";
        }  
        else
        {
            span.rorder = "x";
        }      
        span.readid = lineinfo[7];
        span.rcigar = lineinfo[2];
        // chr+"#"+barcode => (sta, end) : allow multi-aligns with the same barcode.
        bcPosQueue.insert(std::pair<string, ALIGNINFO>(key, span));
    }
    // output alignments for last chr record statistics
    if(bcPosQueue.size()>0)
    {
        // output alignments for last chr and record statistics
        write_chr_alignment(moutfp,
                            &bcPosQueue, 
                            &molecule_cov,
                            &molecule_len,
                            &molecule_len_sum,
                            &molecule_read_num,       
                            &molecule_read_num_sum, 
                            &molecule_read_interval,                    
                            &barcode_molecule_cnt,
                            lastChr,
                            winsize,
                            minMoleSize);
        // clean info for last Chr
        bcPosQueue.clear();
    }
    //
    alifp.close();
    moutfp.close();    
    // output statistics
    if(!write_molecule_stat(molecule_cov, 
                            molecule_len, 
                            molecule_len_sum,
                            molecule_read_num,
                            molecule_read_num_sum,
                            molecule_read_interval,
                            barcode_molecule_cnt, 
                            out_prefix, 
                            minMoleSize))
    {
        return false;
    }
    //
    cout << "   Info: molecule raw info    collected in " << ofilename << endl;
    cout << "   Info: molecule coverage    collected in"  << out_prefix + "_min" + minMsize.str() + "bp_moleCov_stat.txt" << endl;
    cout << "   Info: molecule length      collected in"  << out_prefix + "_min" + minMsize.str() + "bp_moleLen_stat.txt" << endl;  
    cout << "   Info: molecule read number collected in"  << out_prefix + "_min" + minMsize.str() + "bp_readNum_stat.txt" << endl;  
    cout << "   Info: reads' distances     collected in " << out_prefix + "_min" + minMsize.str() + "bp_readDist_stat.txt" << endl;
    cout << "   Info: time on analyzing molecules: "      << (float)(clock()-tbeg)/CLOCKS_PER_SEC << " seconds.\n" << endl;        
    return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc28, %rsp            # imm = 0xC28
cmpl $0x6, %edi
jne 0x701a
movq %rsi, %r14
callq 0x4200
movq %rax, %rbp
leaq 0x1d0(%rsp), %r13
movq %r13, -0x10(%r13)
leaq 0x37dce(%rip), %rdx     # 0x3eb22
leaq 0x1c0(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
leaq 0xaa0(%rsp), %rdi
callq 0x4240
leaq 0x578(%rsp), %r12
movq %r12, -0x10(%r12)
leaq 0x37d9d(%rip), %rdx     # 0x3eb22
leaq 0x568(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
leaq 0xab8(%rsp), %rdi
leaq 0x568(%rsp), %rsi
callq 0x4490
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x6dc7
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0xab0(%rsp), %rbx
movq %rbx, %rdi
movl $0x3e8, %esi            # imm = 0x3E8
callq 0x4580
leaq 0xc0(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x37d33(%rip), %rdx     # 0x3eb22
leaq 0xb0(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
movq 0x10(%r14), %rsi
leaq 0x568(%rsp), %rdi
leaq 0x808(%rsp), %rdx
callq 0x5346
leaq 0x1c0(%rsp), %rdi
leaq 0x568(%rsp), %r15
movq %r15, %rsi
callq 0x43e0
movq (%r15), %rdi
cmpq %r12, %rdi
je 0x6e48
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x18(%r14), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4130
movq %rax, 0x1e8(%rsp)
movq 0x20(%r14), %rdi
callq 0x44d0
movl %eax, %r15d
movq 0x28(%r14), %rsi
leaq 0x568(%rsp), %rdi
leaq 0x808(%rsp), %rdx
callq 0x5346
leaq 0xb0(%rsp), %rdi
leaq 0x568(%rsp), %r14
movq %r14, %rsi
callq 0x43e0
movq (%r14), %rdi
cmpq %r12, %rdi
je 0x6eb2
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x568(%rsp), %rdi
movq %r12, (%rdi)
leaq 0x37c5e(%rip), %rdx     # 0x3eb22
movq %rdx, %rsi
callq 0x5384
leaq 0x568(%rsp), %rsi
leaq 0xab8(%rsp), %rdi
callq 0x4490
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x6efe
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
movq %rbx, %rdi
movl %r15d, %esi
callq 0x4580
movq 0x450b8(%rip), %rbx     # 0x4bfc8
leaq 0x33bb9(%rip), %rsi     # 0x3aad0
movl $0x27, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq 0x45086(%rip), %rdi     # 0x4bfc8
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x334e1(%rip), %rsi     # 0x3a437
leaq 0x1c0(%rsp), %rdi
movl $0x3, %ecx
xorl %edx, %edx
callq 0x4590
cmpq $-0x1, %rax
je 0x7114
leaq 0x568(%rsp), %rdi
callq 0xcc30
movq 0x1c0(%rsp), %rsi
leaq 0x568(%rsp), %rdi
movl $0x8, %edx
callq 0x39386
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
je 0x7161
movq 0x4500c(%rip), %rdi     # 0x4bfc8
leaq 0x33b6d(%rip), %rsi     # 0x3ab30
movl $0x16, %edx
callq 0x43a0
movq 0x1c0(%rsp), %rsi
movq 0x1c8(%rsp), %rdx
movq 0x44fe4(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x891a
movq 0x44fa7(%rip), %rbx     # 0x4bfc8
leaq 0x338c8(%rip), %rsi     # 0x3a8f0
movl $0x68, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x338f6(%rip), %rsi     # 0x3a959
movl $0x75, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x33931(%rip), %rsi     # 0x3a9cf
movl $0x8d, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x33984(%rip), %rsi     # 0x3aa5d
movl $0x72, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x89be
movq 0x44ead(%rip), %rbx     # 0x4bfc8
leaq 0x339d6(%rip), %rsi     # 0x3aaf8
movl $0x37, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq 0x44e7b(%rip), %rdi     # 0x4bfc8
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x895b
leaq 0xe0(%rsp), %rax
movq %rax, -0x10(%rax)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
leaq 0xd0(%rsp), %rdi
callq 0xda32
leaq 0x339b3(%rip), %rsi     # 0x3ab47
leaq 0xd0(%rsp), %rdi
callq 0x45e0
leaq 0x40(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0xd0(%rsp), %rcx
movq 0xd8(%rsp), %r8
movq 0x48(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %esi
leaq 0xe0(%rsp), %rdi
cmpq %rdi, %rcx
je 0x71e6
movq 0xe0(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x7205
leaq 0x50(%rsp), %rdi
movl $0xf, %esi
cmpq %rdi, -0x10(%rdi)
je 0x7200
movq 0x50(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x7219
movq 0x40(%rsp), %rsi
leaq 0xd0(%rsp), %rdi
callq 0x4120
jmp 0x7227
leaq 0x40(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x818(%rsp), %rdx
movq %rdx, -0x10(%rdx)
movq (%rax), %rsi
leaq 0x10(%rax), %rcx
cmpq %rcx, %rsi
je 0x7254
movq %rsi, 0x808(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x818(%rsp)
jmp 0x725a
movups (%rcx), %xmm0
movups %xmm0, (%rdx)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x810(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x338cb(%rip), %rsi     # 0x3ab4c
leaq 0x808(%rsp), %rdi
callq 0x45e0
leaq 0x1b0(%rsp), %r12
movq %r12, -0x10(%r12)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x72bf
movq %rdx, 0x1a0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x1b0(%rsp)
jmp 0x72c7
movups (%rcx), %xmm0
movups %xmm0, (%r12)
movq 0x8(%rax), %rdx
movq %rdx, 0x1a8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq 0x818(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x7303
movq 0x818(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x50(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x731e
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x7343
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x808(%rsp), %rdi
callq 0x69c4
movq 0x1a0(%rsp), %rsi
leaq 0x808(%rsp), %rdi
movl $0x10, %edx
callq 0x39386
movq 0x808(%rsp), %rax
movq -0x18(%rax), %rax
testb $0x5, 0x828(%rsp,%rax)
je 0x73f9
movq 0x44c41(%rip), %rdi     # 0x4bfc8
leaq 0x337df(%rip), %rsi     # 0x3ab6d
movl $0x1c, %edx
callq 0x43a0
movq 0x1a0(%rsp), %rsi
movq 0x1a8(%rsp), %rdx
movq 0x44c19(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
leaq 0x337cc(%rip), %rsi     # 0x3ab8a
movl $0xe, %edx
movq %rax, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x88dc
leaq 0x990(%rsp), %rbx
leaq 0x33791(%rip), %rsi     # 0x3ab99
movl $0x7f, %edx
movq %rbx, %rdi
callq 0x43a0
movq 0x990(%rsp), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x3f0(%rsp), %rcx
xorl %eax, %eax
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x3c0(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x390(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x360(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x330(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x300(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x2d0(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x260(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x190(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x375fc(%rip), %rdx     # 0x3eb22
leaq 0x180(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
movq %r15, 0x1e0(%rsp)
movq %rbp, 0x250(%rsp)
leaq 0x200(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x375c9(%rip), %rdx     # 0x3eb22
leaq 0x1f0(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
leaq 0x50(%rsp), %r13
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
jne 0x7c6e
leaq 0x10(%rsp), %r12
movq %rsp, %rbx
leaq 0xd0(%rsp), %rcx
movq $0x0, 0x178(%rsp)
movq %rcx, %r15
movq %r12, (%rsp)
movq %rbx, %rdi
leaq 0x3756d(%rip), %rdx     # 0x3eb22
movq %rdx, %rsi
callq 0x5384
movq 0x6f0(%rsp), %rax
movq -0x18(%rax), %rdi
leaq 0x6f0(%rsp), %rax
addq %rax, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %edx
leaq 0x6f0(%rsp), %rdi
movq %rbx, %rsi
callq 0x45c0
cmpq $0x0, 0x8(%rsp)
je 0x7c38
movq (%rsp), %rax
movzbl (%rax), %eax
cmpl $0x23, %eax
movq %r15, %rcx
je 0x7c3b
cmpl $0x2a, %eax
je 0x7c3b
movq 0x178(%rsp), %rcx
incq %rcx
movq %rcx, %rax
movq %rcx, 0x178(%rsp)
movabsq $-0x1afcdb885172b95b, %rcx # imm = 0xE5032477AE8D46A5
imulq %rcx, %rax
rorq $0x7, %rax
movabsq $0x1ad7f29abca, %rcx    # imm = 0x1AD7F29ABCA
cmpq %rcx, %rax
ja 0x76ba
movl $0x4, %edx
movq 0x4496c(%rip), %rdi     # 0x4bfc8
leaq 0x34d26(%rip), %rsi     # 0x3c389
callq 0x43a0
movq 0x44959(%rip), %rdi     # 0x4bfc8
movq 0x178(%rsp), %rsi
callq 0x4210
movq %rax, %r14
movl $0xb, %edx
movq %rax, %rdi
leaq 0x32e33(%rip), %rsi     # 0x3a4c1
callq 0x43a0
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %r14, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movb $0x9, 0xd0(%rsp)
leaq 0x160(%rsp), %rdi
movq %rbx, %rsi
movq %r15, %rdx
callq 0x36b7c
movq 0x160(%rsp), %rsi
movq 0x168(%rsp), %rax
subq %rsi, %rax
cmpq $0xc0, %rax
jb 0x7c2b
cmpq $0x0, 0x188(%rsp)
jne 0x770c
leaq 0x180(%rsp), %rdi
callq 0x41c0
movq 0x160(%rsp), %rsi
leaq 0x1f0(%rsp), %rdi
callq 0x41c0
movq 0x1f8(%rsp), %r12
movq 0x188(%rsp), %r14
cmpq %r12, %r14
movq %r12, %rdx
cmovbq %r14, %rdx
testq %rdx, %rdx
je 0x775c
movq 0x180(%rsp), %rsi
movq 0x1f0(%rsp), %rdi
callq 0x4350
testl %eax, %eax
sete %al
jmp 0x775e
movb $0x1, %al
cmpq %r14, %r12
sete %cl
testb %cl, %al
jne 0x7858
cmpq $0x0, 0x280(%rsp)
je 0x7858
leaq 0x220(%rsp), %rax
movq %rax, 0x210(%rsp)
movq 0x180(%rsp), %rsi
addq %rsi, %r14
leaq 0x210(%rsp), %rdi
movq %r14, %rdx
callq 0xda32
leaq 0x808(%rsp), %rdi
leaq 0x258(%rsp), %rsi
leaq 0x3e8(%rsp), %rdx
leaq 0x3b8(%rsp), %rcx
leaq 0x388(%rsp), %r8
leaq 0x358(%rsp), %r9
pushq 0x1e0(%rsp)
pushq 0x1f0(%rsp)
leaq 0x220(%rsp), %rax
pushq %rax
leaq 0x2e0(%rsp), %rax
pushq %rax
leaq 0x318(%rsp), %rax
pushq %rax
leaq 0x350(%rsp), %rax
pushq %rax
callq 0x8f5c
addq $0x30, %rsp
movq 0x210(%rsp), %rdi
leaq 0x220(%rsp), %rax
cmpq %rax, %rdi
je 0x7836
movq 0x220(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xdac2
leaq 0x180(%rsp), %rdi
leaq 0x1f0(%rsp), %rsi
callq 0x41c0
movq 0x160(%rsp), %rax
movq 0x20(%rax), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4130
movq %rax, %r12
movq 0x160(%rsp), %rax
leaq 0x240(%rsp), %rcx
movq %rcx, 0x230(%rsp)
movq 0x40(%rax), %rsi
movq 0x48(%rax), %rdx
addq %rsi, %rdx
leaq 0x230(%rsp), %r14
movq %r14, %rdi
callq 0xda32
movq %r14, %rdi
callq 0xb1b2
movl %eax, %r14d
movq 0x230(%rsp), %rdi
leaq 0x240(%rsp), %rax
cmpq %rax, %rdi
je 0x78d3
movq 0x240(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x30(%rsp), %rax
movq %rax, 0x20(%rsp)
leaq 0x20(%rsp), %rdi
leaq 0x37239(%rip), %rdx     # 0x3eb22
movq %rdx, %rsi
callq 0x5384
movq 0x160(%rsp), %rax
movq %r13, %rbp
movq %r13, 0x40(%rsp)
movq (%rax), %rsi
movq 0x8(%rax), %rdx
addq %rsi, %rdx
leaq 0x40(%rsp), %r13
movq %r13, %rdi
callq 0xda32
movq %r13, %rdi
leaq 0x376d0(%rip), %rsi     # 0x3eff2
callq 0x45e0
movq 0x160(%rsp), %rax
movq 0x60(%rax), %rsi
movq 0x68(%rax), %rdx
movq %r13, %rdi
callq 0x4120
leaq 0xe0(%rsp), %r13
movq %r13, 0xd0(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
movq %r15, %rsi
je 0x7976
movq %rdx, 0xd0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe0(%rsp)
jmp 0x797e
movups (%rcx), %xmm0
movups %xmm0, (%r13)
movq 0x8(%rax), %rdx
movq %rdx, 0xd8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq 0x20(%rsp), %rdi
callq 0x43e0
movq 0xd0(%rsp), %rdi
cmpq %r13, %rdi
je 0x79c0
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %r13
cmpq %r13, %rdi
je 0x79dc
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x60(%rsp), %rax
movq %rax, 0x50(%rsp)
xorl %ecx, %ecx
movq %rcx, 0x58(%rsp)
movb %cl, 0x60(%rsp)
leaq 0x80(%rsp), %rax
movq %rax, 0x70(%rsp)
movq %rcx, 0x78(%rsp)
movb %cl, 0x80(%rsp)
leaq 0xa0(%rsp), %rax
movq %rax, 0x90(%rsp)
movq %rcx, 0x98(%rsp)
movb %cl, 0xa0(%rsp)
movq %r12, 0x40(%rsp)
movslq %r14d, %rax
leaq -0x1(%r12,%rax), %rax
movq %rax, 0x48(%rsp)
movq 0x160(%rsp), %rdi
movl $0xa0, %eax
addq %rax, %rdi
movl $0x2, %ecx
leaq 0x32c55(%rip), %rsi     # 0x3a6ac
xorl %edx, %edx
callq 0x4590
leaq 0x32bdc(%rip), %rcx     # 0x3a641
cmpq $-0x1, %rax
jne 0x7aa4
movq 0x160(%rsp), %rdi
movl $0xa0, %eax
addq %rax, %rdi
movl $0x2, %ecx
leaq 0x32c28(%rip), %rsi     # 0x3a6af
xorl %edx, %edx
callq 0x4590
cmpq $-0x1, %rax
leaq 0x36230(%rip), %rcx     # 0x3dcc9
leaq 0x371fa(%rip), %rax     # 0x3ec9a
cmoveq %rax, %rcx
movq 0x58(%rsp), %rdx
movl $0x1, %r8d
leaq 0x50(%rsp), %rdi
xorl %esi, %esi
leaq 0x10(%rsp), %r12
callq 0x44c0
movq 0x160(%rsp), %rsi
movl $0xe0, %eax
addq %rax, %rsi
leaq 0x70(%rsp), %rdi
callq 0x41c0
movq 0x160(%rsp), %rsi
addq $0x40, %rsi
leaq 0x90(%rsp), %rdi
callq 0x41c0
movq %r15, %r14
movq %r15, %rdi
leaq 0x20(%rsp), %rsi
leaq 0x40(%rsp), %rdx
callq 0xcd1a
leaq 0x258(%rsp), %rdi
movq %r14, %rsi
callq 0xdaf0
movq 0x140(%rsp), %rdi
leaq 0x150(%rsp), %rax
cmpq %rax, %rdi
je 0x7b3d
movq 0x150(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x120(%rsp), %rdi
leaq 0x130(%rsp), %rax
cmpq %rax, %rdi
je 0x7b62
movq 0x130(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x100(%rsp), %rdi
leaq 0x110(%rsp), %rax
cmpq %rax, %rdi
je 0x7b87
movq 0x110(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x7bac
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x90(%rsp), %rdi
leaq 0xa0(%rsp), %rax
cmpq %rax, %rdi
je 0x7bd1
movq 0xa0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x70(%rsp), %rdi
leaq 0x80(%rsp), %rax
cmpq %rax, %rdi
je 0x7bf3
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
cmpq %rax, %rdi
je 0x7c0f
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x20(%rsp), %rdi
leaq 0x30(%rsp), %rax
cmpq %rax, %rdi
je 0x7c2b
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x160(%rsp), %rdi
callq 0x6aa2
movq %r15, %rcx
movq (%rsp), %rdi
cmpq %r12, %rdi
je 0x7c54
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq %r15, %rcx
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
je 0x75a4
cmpq $0x0, 0x280(%rsp)
leaq 0x1d0(%rsp), %r13
movq 0x1e0(%rsp), %r15
je 0x7d46
leaq 0x2b8(%rsp), %r14
movq %r14, -0x10(%r14)
movq 0x180(%rsp), %rsi
movq 0x188(%rsp), %rdx
addq %rsi, %rdx
leaq 0x2a8(%rsp), %rbx
movq %rbx, %rdi
callq 0xda32
leaq 0x2c8(%rsp), %rax
leaq 0x2f8(%rsp), %r10
leaq 0x328(%rsp), %r11
leaq 0x808(%rsp), %rdi
leaq 0x258(%rsp), %rsi
leaq 0x3e8(%rsp), %rdx
leaq 0x3b8(%rsp), %rcx
leaq 0x388(%rsp), %r8
leaq 0x358(%rsp), %r9
pushq %r15
pushq 0x1f0(%rsp)
pushq %rbx
pushq %rax
pushq %r10
pushq %r11
callq 0x8f5c
addq $0x30, %rsp
movq 0x2a8(%rsp), %rdi
cmpq %r14, %rdi
je 0x7d39
movq 0x2b8(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xdac2
leaq 0x568(%rsp), %rdi
callq 0x3962e
leaq 0x808(%rsp), %rdi
callq 0x3962e
leaq 0x508(%rsp), %rdi
leaq 0x3e8(%rsp), %rsi
callq 0xd1f6
leaq 0x4d8(%rsp), %rdi
leaq 0x3b8(%rsp), %rsi
callq 0xd482
leaq 0x4a8(%rsp), %rdi
leaq 0x388(%rsp), %rsi
callq 0xd482
leaq 0x478(%rsp), %rdi
leaq 0x358(%rsp), %rsi
callq 0xd482
leaq 0x448(%rsp), %rdi
leaq 0x328(%rsp), %rsi
callq 0xd482
leaq 0x418(%rsp), %rdi
leaq 0x2f8(%rsp), %rsi
callq 0xd482
leaq 0x538(%rsp), %rbx
leaq 0x2c8(%rsp), %rsi
movq %rbx, %rdi
callq 0xd656
leaq 0x298(%rsp), %r12
movq %r12, -0x10(%r12)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
leaq 0x288(%rsp), %r14
movq %r14, %rdi
callq 0xda32
subq $0x8, %rsp
leaq 0x510(%rsp), %rdi
leaq 0x4e0(%rsp), %rsi
leaq 0x4b0(%rsp), %rdx
leaq 0x480(%rsp), %rcx
leaq 0x450(%rsp), %r8
leaq 0x420(%rsp), %r9
pushq %r15
pushq %r14
pushq %rbx
callq 0xb2aa
addq $0x20, %rsp
movl %eax, %ebp
movq 0x288(%rsp), %rdi
cmpq %r12, %rdi
je 0x7e87
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x538(%rsp), %rdi
callq 0xd8e0
leaq 0x418(%rsp), %rdi
callq 0xd8f4
leaq 0x448(%rsp), %rdi
callq 0xd8f4
leaq 0x478(%rsp), %rdi
callq 0xd8f4
leaq 0x4a8(%rsp), %rdi
callq 0xd8f4
leaq 0x4d8(%rsp), %rdi
callq 0xd8f4
leaq 0x508(%rsp), %rdi
callq 0xd908
testb %bpl, %bpl
leaq 0x1b0(%rsp), %r12
je 0x882a
movq 0x440ce(%rip), %rdi     # 0x4bfc8
leaq 0x32d18(%rip), %rsi     # 0x3ac19
movl $0x2b, %edx
callq 0x43a0
movq 0x1a0(%rsp), %rsi
movq 0x1a8(%rsp), %rdx
movq 0x440a6(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0x44070(%rip), %rdi     # 0x4bfc8
leaq 0x32ce6(%rip), %rsi     # 0x3ac45
movl $0x2a, %edx
callq 0x43a0
leaq 0x10(%rsp), %r14
movq %r14, -0x10(%r14)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
movq %rsp, %rdi
callq 0xda32
leaq 0x32bb3(%rip), %rsi     # 0x3ab47
movq %rsp, %rdi
callq 0x45e0
leaq 0x20(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq (%rsp), %rcx
movq 0x8(%rsp), %r8
movq 0x28(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %esi
cmpq %r14, %rcx
je 0x7fcf
movq 0x10(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x7fee
leaq 0x30(%rsp), %rdi
movl $0xf, %esi
cmpq %rdi, -0x10(%rdi)
je 0x7fe9
movq 0x30(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x7ffd
movq 0x20(%rsp), %rsi
movq %rsp, %rdi
callq 0x4120
jmp 0x800b
leaq 0x20(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x50(%rsp), %rsi
movq %rsi, 0x40(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x8030
movq %rdx, 0x40(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x50(%rsp)
jmp 0x8036
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x48(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x32c16(%rip), %rsi     # 0x3ac70
leaq 0x40(%rsp), %rdi
callq 0x45e0
leaq 0xe0(%rsp), %rsi
movq %rsi, 0xd0(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x8098
movq %rdx, 0xd0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe0(%rsp)
jmp 0x809e
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xd8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0x43ef8(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x8124
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x8140
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x30(%rsp), %r15
movq -0x10(%r15), %rdi
cmpq %r15, %rdi
je 0x815b
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
movq (%rsp), %rdi
cmpq %r14, %rdi
je 0x8171
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43e50(%rip), %rdi     # 0x4bfc8
leaq 0x32b05(%rip), %rsi     # 0x3ac84
movl $0x2a, %edx
callq 0x43a0
movq %rsp, %rdi
movq %r14, (%rdi)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
callq 0xda32
leaq 0x32999(%rip), %rsi     # 0x3ab47
movq %rsp, %rdi
callq 0x45e0
leaq 0x20(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq (%rsp), %rcx
movq 0x8(%rsp), %r8
movq 0x28(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %esi
cmpq %r14, %rcx
je 0x81e9
movq 0x10(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8204
movl $0xf, %esi
cmpq %r15, 0x20(%rsp)
je 0x81ff
movq 0x30(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8213
movq 0x20(%rsp), %rsi
movq %rsp, %rdi
callq 0x4120
jmp 0x8221
leaq 0x20(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x50(%rsp), %rsi
movq %rsi, 0x40(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x8246
movq %rdx, 0x40(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x50(%rsp)
jmp 0x824c
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x48(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x32a3f(%rip), %rsi     # 0x3acaf
leaq 0x40(%rsp), %rdi
callq 0x45e0
leaq 0xe0(%rsp), %rsi
movq %rsi, 0xd0(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x82ae
movq %rdx, 0xd0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe0(%rsp)
jmp 0x82b4
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xd8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0x43ce2(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x833a
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x8356
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x20(%rsp), %rdi
cmpq %r15, %rdi
je 0x836d
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
movq (%rsp), %rdi
cmpq %r14, %rdi
je 0x8383
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43c3e(%rip), %rdi     # 0x4bfc8
leaq 0x32932(%rip), %rsi     # 0x3acc3
movl $0x2a, %edx
callq 0x43a0
movq %rsp, %rdi
movq %r14, (%rdi)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
callq 0xda32
leaq 0x32787(%rip), %rsi     # 0x3ab47
movq %rsp, %rdi
callq 0x45e0
leaq 0x20(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq (%rsp), %rcx
movq 0x8(%rsp), %r8
movq 0x28(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %esi
cmpq %r14, %rcx
je 0x83fb
movq 0x10(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8416
movl $0xf, %esi
cmpq %r15, 0x20(%rsp)
je 0x8411
movq 0x30(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8425
movq 0x20(%rsp), %rsi
movq %rsp, %rdi
callq 0x4120
jmp 0x8433
leaq 0x20(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x50(%rsp), %rsi
movq %rsi, 0x40(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x8458
movq %rdx, 0x40(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x50(%rsp)
jmp 0x845e
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x48(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x3286c(%rip), %rsi     # 0x3acee
leaq 0x40(%rsp), %rdi
callq 0x45e0
leaq 0xe0(%rsp), %rsi
movq %rsi, 0xd0(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x84c0
movq %rdx, 0xd0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe0(%rsp)
jmp 0x84c6
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xd8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0x43ad0(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x854c
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x8568
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x20(%rsp), %rdi
cmpq %r15, %rdi
je 0x857f
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
movq (%rsp), %rdi
cmpq %r14, %rdi
je 0x8595
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43a2c(%rip), %rdi     # 0x4bfc8
leaq 0x3275f(%rip), %rsi     # 0x3ad02
movl $0x2b, %edx
callq 0x43a0
movq %rsp, %rdi
movq %r14, (%rdi)
movq 0xb0(%rsp), %rsi
movq 0xb8(%rsp), %rdx
addq %rsi, %rdx
callq 0xda32
leaq 0x32575(%rip), %rsi     # 0x3ab47
movq %rsp, %rdi
callq 0x45e0
leaq 0x20(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq (%rsp), %rcx
movq 0x8(%rsp), %r8
movq 0x28(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %esi
cmpq %r14, %rcx
je 0x860d
movq 0x10(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8628
movl $0xf, %esi
cmpq %r15, 0x20(%rsp)
je 0x8623
movq 0x30(%rsp), %rsi
cmpq %rsi, %rax
jbe 0x8637
movq 0x20(%rsp), %rsi
movq %rsp, %rdi
callq 0x4120
jmp 0x8645
leaq 0x20(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x50(%rsp), %rsi
movq %rsi, 0x40(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x866a
movq %rdx, 0x40(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x50(%rsp)
jmp 0x8670
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x48(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x3269a(%rip), %rsi     # 0x3ad2e
leaq 0x40(%rsp), %rdi
callq 0x45e0
leaq 0xe0(%rsp), %rsi
movq %rsi, 0xd0(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x86d2
movq %rdx, 0xd0(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe0(%rsp)
jmp 0x86d8
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xd8(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0x438be(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x875e
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x877a
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x20(%rsp), %rdi
cmpq %r15, %rdi
je 0x8791
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
movq (%rsp), %rdi
cmpq %r14, %rdi
je 0x87a7
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x4381a(%rip), %rdi     # 0x4bfc8
leaq 0x3258e(%rip), %rsi     # 0x3ad43
movl $0x26, %edx
callq 0x43a0
callq 0x4200
subq 0x250(%rsp), %rax
xorps %xmm0, %xmm0
cvtsi2ss %rax, %xmm0
divss 0x31bb0(%rip), %xmm0    # 0x3a38c
cvtss2sd %xmm0, %xmm0
movq 0x437e1(%rip), %rdi     # 0x4bfc8
callq 0x4510
movq %rax, %rbx
leaq 0x320c1(%rip), %rsi     # 0x3a8b7
movl $0xa, %edx
movq %rax, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0x1f0(%rsp), %rdi
leaq 0x200(%rsp), %rax
cmpq %rax, %rdi
je 0x884f
movq 0x200(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x180(%rsp), %rdi
leaq 0x190(%rsp), %rax
cmpq %rax, %rdi
je 0x8874
movq 0x190(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd91c
leaq 0x2c8(%rsp), %rdi
callq 0xd8e0
leaq 0x2f8(%rsp), %rdi
callq 0xd8f4
leaq 0x328(%rsp), %rdi
callq 0xd8f4
leaq 0x358(%rsp), %rdi
callq 0xd8f4
leaq 0x388(%rsp), %rdi
callq 0xd8f4
leaq 0x3b8(%rsp), %rdi
callq 0xd8f4
leaq 0x3e8(%rsp), %rdi
callq 0xd908
leaq 0x4313d(%rip), %rsi     # 0x4ba20
leaq 0x808(%rsp), %rdi
callq 0x39330
leaq 0x998(%rsp), %rdi
callq 0x4140
movq 0x1a0(%rsp), %rdi
cmpq %r12, %rdi
je 0x891a
movq 0x1b0(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x4331f(%rip), %rax     # 0x4bc40
leaq 0x700(%rsp), %rbx
movq %rax, -0x10(%rbx)
leaq 0x43334(%rip), %rax     # 0x4bc68
movq %rax, (%rbx)
movq $0x0, -0x8(%rbx)
leaq 0x43262(%rip), %rsi     # 0x4bba8
leaq 0x568(%rsp), %rdi
callq 0x39330
movq %rbx, %rdi
callq 0x4140
movq 0xb0(%rsp), %rdi
leaq 0xc0(%rsp), %rax
cmpq %rax, %rdi
je 0x8980
movq 0xc0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43611(%rip), %rsi     # 0x4bf98
leaq 0xaa0(%rsp), %rdi
callq 0x4260
leaq 0xb20(%rsp), %rdi
callq 0x4140
movq 0x1c0(%rsp), %rdi
cmpq %r13, %rdi
je 0x89be
movq 0x1d0(%rsp), %rsi
incq %rsi
callq 0x4340
movl %ebp, %eax
addq $0xc28, %rsp            # imm = 0xC28
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x89ec
jmp 0x89f4
jmp 0x8a17
jmp 0x8a17
jmp 0x8dac
jmp 0x89ec
jmp 0x89f4
jmp 0x8a17
jmp 0x8a17
jmp 0x8dac
movq %rax, %rbx
jmp 0x8bdc
movq %rax, %rbx
jmp 0x8bf8
jmp 0x8a17
jmp 0x8a17
jmp 0x8dac
movq %rax, %rbx
jmp 0x8c49
movq %rax, %rbx
jmp 0x8c65
jmp 0x8a17
movq %rax, %rbx
jmp 0x8c0f
jmp 0x8dac
movq %rax, %rbx
movq 0x2a8(%rsp), %rdi
cmpq %r14, %rdi
je 0x8ddf
movq 0x2b8(%rsp), %rsi
jmp 0x8dd7
movq %rax, %rbx
movq 0x210(%rsp), %rdi
leaq 0x220(%rsp), %rax
cmpq %rax, %rdi
je 0x8d26
movq 0x220(%rsp), %rsi
jmp 0x8d1e
movq %rax, %rbx
movq 0x288(%rsp), %rdi
cmpq %r12, %rdi
je 0x8a93
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8a93
movq %rax, %rbx
leaq 0x538(%rsp), %rdi
callq 0xd8e0
jmp 0x8aa5
movq %rax, %rbx
leaq 0x418(%rsp), %rdi
callq 0xd8f4
jmp 0x8ab7
movq %rax, %rbx
leaq 0x448(%rsp), %rdi
callq 0xd8f4
jmp 0x8ac9
movq %rax, %rbx
leaq 0x478(%rsp), %rdi
callq 0xd8f4
leaq 0x4a8(%rsp), %rdi
callq 0xd8f4
leaq 0x4d8(%rsp), %rdi
callq 0xd8f4
leaq 0x508(%rsp), %rdi
callq 0xd908
jmp 0x8ddf
movq %rax, %rbx
jmp 0x8ad6
movq %rax, %rbx
jmp 0x8ae3
movq %rax, %rbx
jmp 0x8af0
movq %rax, %rbx
jmp 0x8e04
movq %rax, %rbx
jmp 0x8e29
movq %rax, %rbx
leaq 0xd0(%rsp), %rdi
callq 0xce12
jmp 0x8d00
jmp 0x8cfd
movq %rax, %rbx
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
jne 0x8b63
jmp 0x8d0a
movq %rax, %rbx
movq 0x40(%rsp), %rdi
cmpq %rbp, %rdi
je 0x8d0a
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8d0a
movq %rax, %rbx
jmp 0x8d0a
jmp 0x8cf8
movq %rax, %rbx
movq 0x230(%rsp), %rdi
leaq 0x240(%rsp), %rax
cmpq %rax, %rdi
je 0x8d26
movq 0x240(%rsp), %rsi
jmp 0x8d1e
jmp 0x8cf8
jmp 0x8bb4
jmp 0x8bb4
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x8bdc
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x8bf8
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x20(%rsp), %rdi
cmpq %r15, %rdi
je 0x8c0f
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
movq (%rsp), %rdi
cmpq %r14, %rdi
jne 0x8dd2
jmp 0x8ddf
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x8c49
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x40(%rsp), %rdi
leaq 0x50(%rsp), %rax
cmpq %rax, %rdi
je 0x8c65
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x30(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
jne 0x8c02
jmp 0x8c0f
jmp 0x8dc1
movq %rax, %rbx
jmp 0x8eb2
movq %rax, %rbx
leaq 0x818(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x8cab
movq 0x818(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8cab
movq %rax, %rbx
leaq 0x50(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x8ccd
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8ccd
jmp 0x8cca
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x8ed7
movq 0xe0(%rsp), %rsi
jmp 0x8ecf
jmp 0x8db9
movq %rax, %rbx
jmp 0x8d26
movq %rax, %rbx
leaq 0x40(%rsp), %rdi
callq 0xce7c
movq 0x20(%rsp), %rdi
leaq 0x30(%rsp), %rax
cmpq %rax, %rdi
je 0x8d26
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x160(%rsp), %rdi
callq 0x6aa2
jmp 0x8dc4
jmp 0x8ee6
jmp 0x8dac
movq %rax, %rbx
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x8ee9
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8ee9
jmp 0x8ee6
jmp 0x8ee6
jmp 0x8ee6
jmp 0x8d9c
jmp 0x8d9c
movq %rax, %rbx
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x8f0e
movq 0x578(%rsp), %rsi
jmp 0x8f06
movq %rax, %rbx
jmp 0x8f0e
movq %rax, %rbx
jmp 0x8f2f
movq %rax, %rbx
jmp 0x8ddf
movq %rax, %rbx
jmp 0x8e91
movq %rax, %rbx
jmp 0x8ed7
movq %rax, %rbx
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x8ddf
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x1f0(%rsp), %rdi
leaq 0x200(%rsp), %rax
cmpq %rax, %rdi
je 0x8e04
movq 0x200(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x180(%rsp), %rdi
leaq 0x190(%rsp), %rax
cmpq %rax, %rdi
je 0x8e29
movq 0x190(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd91c
leaq 0x2c8(%rsp), %rdi
callq 0xd8e0
leaq 0x2f8(%rsp), %rdi
callq 0xd8f4
leaq 0x328(%rsp), %rdi
callq 0xd8f4
leaq 0x358(%rsp), %rdi
callq 0xd8f4
leaq 0x388(%rsp), %rdi
callq 0xd8f4
leaq 0x3b8(%rsp), %rdi
callq 0xd8f4
leaq 0x3e8(%rsp), %rdi
callq 0xd908
leaq 0x42b88(%rip), %rsi     # 0x4ba20
leaq 0x808(%rsp), %rdi
callq 0x39330
leaq 0x998(%rsp), %rdi
callq 0x4140
movq 0x1a0(%rsp), %rdi
leaq 0x1b0(%rsp), %rax
cmpq %rax, %rdi
je 0x8ed7
movq 0x1b0(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x568(%rsp), %rdi
callq 0xcecc
jmp 0x8ee9
movq %rax, %rbx
movq 0xb0(%rsp), %rdi
leaq 0xc0(%rsp), %rax
cmpq %rax, %rdi
je 0x8f0e
movq 0xc0(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43083(%rip), %rsi     # 0x4bf98
leaq 0xaa0(%rsp), %rdi
callq 0x4260
leaq 0xb20(%rsp), %rdi
callq 0x4140
movq 0x1c0(%rsp), %rdi
leaq 0x1d0(%rsp), %rax
cmpq %rax, %rdi
je 0x8f54
movq 0x1d0(%rsp), %rsi
incq %rsi
callq 0x4340
movq %rbx, %rdi
callq 0x45a0