// File: /workspace/github_c_makefile_star2_O3/asford[P]tmalign/TMalign.cpp
// Function: main
int main(int argc, char *argv[])
{
	strcpy(version, "20120126");

    if (argc < 2) 
    {
        print_help(argv[0]);        
    } 
	
	
	clock_t t1, t2;
	t1 = clock();

    /*********************************************************************************/
	/*                                get argument                                   */ 
    /*********************************************************************************/
    char xname[MAXLEN], yname[MAXLEN],  Lnorm_ave[MAXLEN];
	bool A_opt, B_opt, h_opt=false;
	A_opt = B_opt = o_opt = a_opt = u_opt = d_opt = v_opt = false;

	for(int i = 0; i < argc; i++)
	{
		if ( !strcmp(argv[i],"-B") && i < argc ) { strcpy(xname,    argv[i+1]);      B_opt = true; }
		if ( !strcmp(argv[i],"-A") && i < argc ) { strcpy(yname,    argv[i+1]);      A_opt = true; }
		if ( !strcmp(argv[i],"-o") && i < argc ) { strcpy(out_reg,  argv[i+1]);      o_opt = true; }
		if ( !strcmp(argv[i],"-u") && i < argc ) { Lnorm_ass      = atof(argv[i+1]); u_opt = true; }
		if ( !strcmp(argv[i],"-a") && i < argc ) { strcpy(Lnorm_ave, argv[i+1]);     a_opt = true; }
		if ( !strcmp(argv[i],"-d") && i < argc ) { d0_scale        = atof(argv[i+1]); d_opt = true; }
		if ( !strcmp(argv[i],"-v") ) { v_opt = true; }
		if ( !strcmp(argv[i],"-h") ) { h_opt = true; }
	}


	if(!B_opt || !A_opt)
	{

		if( h_opt )
		{
			print_help(argv[0]);    			
		}
		
		if(v_opt)
		{
			cout <<endl;
			cout << " *****************************************************************************" << endl
				 << " * TM-align (Version "<< version <<"): A protein structural alignment algorithm     *" << endl
				 << " * Reference: Y Zhang and J Skolnick, Nucl Acids Res 33, 2302-9 (2005)       *" << endl
				 << " * Please email your comments and suggestions to Yang Zhang (zhng@umich.edu) *" << endl
				 << " *****************************************************************************" << endl;	
			exit(EXIT_FAILURE);
		}
	}

	if( !B_opt )
	{
		cout << "Please provide structure B" << endl;
		exit(EXIT_FAILURE);
	}		
	if( !A_opt )
	{
		cout << "Please provide structure A" << endl;
		exit(EXIT_FAILURE);
	}


	if( a_opt )
	{
		if(!strcmp(Lnorm_ave, "T"))
		{
		}
		else if(!strcmp(Lnorm_ave, "F"))
		{
			a_opt=false;
		}
		else
		{
			cout << "Wrong value for option -a!  It should be T or F" << endl;
			exit(EXIT_FAILURE);
		}
	}
	if( u_opt )
	{
		if(Lnorm_ass<=0)
		{
			cout << "Wrong value for option -u!  It should be >0" << endl;
			exit(EXIT_FAILURE);
		}
	}
	if( d_opt )
	{
		if(d0_scale<=0)
		{
			cout << "Wrong value for option -d!  It should be >0" << endl;
			exit(EXIT_FAILURE);
		}
	}














    /*********************************************************************************/
	/*                                load data                                      */ 
    /*********************************************************************************/
    load_PDB_allocate_memory(xname, yname);



    

    /*********************************************************************************/
	/*                                parameter set                                  */ 
    /*********************************************************************************/
	parameter_set4search(xlen, ylen);          //please set parameters in the function
    int simplify_step     = 40;               //for similified search engine
    int score_sum_method  = 8;                //for scoring method, whether only sum over pairs with dis<score_d8
        
	int i;
    int *invmap0          = new int[ylen+1]; 
    int *invmap           = new int[ylen+1]; 
    double TM, TMmax=-1;
	for(i=0; i<ylen; i++)
	{
		invmap0[i]=-1;
	}	


	double ddcc=0.4;
	if(Lnorm <= 40) ddcc=0.1;   //Lnorm was setted in parameter_set4search
      

    /*********************************************************************************/
	/*         get initial alignment with gapless threading                          */ 
    /*********************************************************************************/
    get_initial(xa, ya, xlen, ylen, invmap0);
    //find the max TMscore for this initial alignment with the simplified search_engin
    TM=detailed_search(xa, ya, xlen, ylen, invmap0, t, u, simplify_step, score_sum_method);
	if(TM>TMmax)
    {
        TMmax=TM;
    }           
    //run dynamic programing iteratively to find the best alignment
    TM=DP_iter(xa, ya, xlen, ylen, t, u, invmap, 0, 2, 30);
    if(TM>TMmax)
    {        
        TMmax=TM;
        for(int i=0; i<ylen; i++)
        {
            invmap0[i]=invmap[i];
        }
    }
	
    
	


    /*********************************************************************************/
	/*         get initial alignment based on secondary structure                    */ 
    /*********************************************************************************/	
	get_initial_ss(xa, ya, xlen, ylen, invmap);
    TM=detailed_search(xa, ya, xlen, ylen, invmap, t, u, simplify_step, score_sum_method);
    if(TM>TMmax)
    {
        TMmax=TM;
        for(int i=0; i<ylen; i++)
        {
            invmap0[i]=invmap[i];
        }
    } 
    if(TM > TMmax*0.2)
    {
        TM=DP_iter(xa, ya, xlen, ylen, t, u, invmap, 0, 2, 30);
        if(TM>TMmax)
        {
            TMmax=TM;
            for(int i=0; i<ylen; i++)
            {
                invmap0[i]=invmap[i];
            }
        }   
    }
	//output_align(invmap0, ylen);


	
    /*********************************************************************************/
	/*         get initial alignment based on local superposition                    */ 
    /*********************************************************************************/	
	//=initial5 in original TM-align
    if(get_initial_local(xa, ya, xlen, ylen, invmap))
	{		
		TM=detailed_search(xa, ya, xlen, ylen, invmap, t, u, simplify_step, score_sum_method);
		if(TM>TMmax)
		{
			TMmax=TM;
			for(int i=0; i<ylen; i++)
			{
				invmap0[i]=invmap[i];
			}
		} 
		if(TM > TMmax*ddcc)
		{
			TM=DP_iter(xa, ya, xlen, ylen, t, u, invmap, 0, 2, 2);
			if(TM>TMmax)
			{
				TMmax=TM;
				for(int i=0; i<ylen; i++)
				{
					invmap0[i]=invmap[i];
				}
			}   
		}
		//output_align(invmap0, ylen);
	}    
	else
	{
		cout << endl << endl << "Warning: initial alignment from local superposition fail!" << endl << endl <<endl;		
	}
	
	



    /*********************************************************************************/
	/*    get initial alignment based on previous alignment+secondary structure      */ 
    /*********************************************************************************/	
	//=initial3 in original TM-align
    get_initial_ssplus(xa, ya, xlen, ylen, invmap0, invmap);
    TM=detailed_search(xa, ya, xlen, ylen, invmap, t, u, simplify_step, score_sum_method);
    if(TM>TMmax)
    {
        TMmax=TM;
        for(i=0; i<ylen; i++)
        {
            invmap0[i]=invmap[i];
        }
    } 
    if(TM > TMmax*ddcc)
    {
        TM=DP_iter(xa, ya, xlen, ylen, t, u, invmap, 0, 2, 30);
        if(TM>TMmax)
        {
            TMmax=TM;
            for(i=0; i<ylen; i++)
            {
                invmap0[i]=invmap[i];
            }
        }   
    }
	//output_align(invmap0, ylen);   
      
	


	

    /*********************************************************************************/
	/*        get initial alignment based on fragment gapless threading              */ 
    /*********************************************************************************/	    
	//=initial4 in original TM-align
	get_initial_fgt(xa, ya, xlen, ylen, xresno, yresno, invmap);
    TM=detailed_search(xa, ya, xlen, ylen, invmap, t, u, simplify_step, score_sum_method);	
    if(TM>TMmax)
    {
        TMmax=TM;
        for(i=0; i<ylen; i++)
        {
            invmap0[i]=invmap[i];
        }
    } 
    if(TM > TMmax*ddcc)
    {
        TM=DP_iter(xa, ya, xlen, ylen, t, u, invmap, 1, 2, 2);
        if(TM>TMmax)
        {         
            TMmax=TM;
            for(i=0; i<ylen; i++)
            {
                invmap0[i]=invmap[i];
            }
        }   
    } 
	//output_align(invmap0, ylen); 






	
    //*********************************************************************************//
    //     The alignment will not be changed any more in the following                 //
    //*********************************************************************************//
	//check if the initial alignment is generated approately	
	bool flag=false;
	for(i=0; i<ylen; i++)
	{
		if(invmap0[i]>=0)
		{
			flag=true;
			break;			
		}			
	}		
	if(!flag) 
	{
		cout << "There is no alignment between the two proteins!" << endl;
		cout << "Program stop with no result!" << endl;
		return 1;
	}
	//cout << "final alignment" << endl;
	//output_align(invmap0, ylen);










    //*********************************************************************************//
    //       Detailed TMscore search engine  --> prepare for final TMscore             //
    //*********************************************************************************//       
    //run detailed TMscore search engine for the best alignment, and 
	//extract the best rotation matrix (t, u) for the best alginment
    simplify_step=1;
    score_sum_method=8;
    TM=detailed_search(xa, ya, xlen, ylen, invmap0, t, u, simplify_step, score_sum_method);

	//select pairs with dis<d8 for final TMscore computation and output alignment
	int n_ali8, k=0;
	int n_ali=0;
	int *m1, *m2;
	double d;
	m1=new int[xlen]; //alignd index in x
	m2=new int[ylen]; //alignd index in y
	do_rotation(xa, xt, xlen, t, u);
	k=0;
    for(int j=0; j<ylen; j++)
    {
        i=invmap0[j];
        if(i>=0)//aligned
        {
			n_ali++;        
            d=sqrt(dist(&xt[i][0], &ya[j][0]));
			if(d <= score_d8)
			{
				m1[k]=i;
				m2[k]=j;

				xtm[k][0]=xa[i][0];
                xtm[k][1]=xa[i][1];
                xtm[k][2]=xa[i][2];
                    
                ytm[k][0]=ya[j][0];
                ytm[k][1]=ya[j][1];
                ytm[k][2]=ya[j][2];								
				
				k++;
			}
		}
	}
	n_ali8=k;







    //*********************************************************************************//
    //                               Final TMscore                                     //
    //                     Please set parameters for output                            //
    //*********************************************************************************//
    double rmsd, TM1, TM2;
	double d0_out=5.0;  
    simplify_step=1;
    score_sum_method=0;

	double t0[3], u0[3][3];
	double d0_0, TM_0;
	double Lnorm_0=ylen;
	
	
	//normalized by length of structure A
	parameter_set4final(Lnorm_0);
	d0A=d0;
	d0_0=d0A;
	TM1=TMscore8_search(xtm, ytm, n_ali8, t0, u0, simplify_step, score_sum_method, &rmsd);
	TM_0=TM1;

	//normalized by length of structure B
	parameter_set4final(xlen+0.0);
	d0B=d0;
	TM2=TMscore8_search(xtm, ytm, n_ali8, t, u, simplify_step, score_sum_method, &rmsd);




	if(a_opt)
	{
		//normalized by average length of structures A, B
		Lnorm_0=(xlen+ylen)*0.5;
		parameter_set4final(Lnorm_0);
		d0a=d0;
		d0_0=d0a;
		TM3=TMscore8_search(xtm, ytm, n_ali8, t, u, simplify_step, score_sum_method, &rmsd);
		TM_0=TM3;
	}
	if(u_opt)
	{	
		//normalized by user assigned length		
		parameter_set4final(Lnorm_ass);		
		d0u=d0;		
		d0_0=d0u;
		Lnorm_0=Lnorm_ass;
		TM4=TMscore8_search(xtm, ytm, n_ali8, t, u, simplify_step, score_sum_method, &rmsd);	
		TM_0=TM4;
	}
	if(d_opt)
	{	
		//scaled by user assigned d0
		parameter_set4scale(ylen, d0_scale);
		d0_out=d0_scale;
		d0_0=d0_scale;
		//Lnorm_0=ylen;
		Lnorm_d0=Lnorm_0;
		TM5=TMscore8_search(xtm, ytm, n_ali8, t, u, simplify_step, score_sum_method, &rmsd);	
		TM_0=TM5;
	}

   
        
	output_results(xname, yname, xlen, ylen, t0, u0, TM1, TM2, rmsd, d0_out, m1, m2, n_ali8, n_ali, TM_0, Lnorm_0, d0_0);
                    
 









    //*********************************************************************************//
    //                            Done! Free memory                                    //
    //*********************************************************************************//           
    free_memory();
    delete [] invmap0;
    delete [] invmap;
	delete [] m1;
	delete [] m2;


    t2 = clock();    
    float diff = ((float)t2 - (float)t1)/CLOCKS_PER_SEC;
    printf("\nTotal running time is %5.2f seconds\n", diff);        

 	return 0;	
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x75e8, %rsp           # imm = 0x75E8
movq %rsi, %r14
movabsq $0x3632313032313032, %rax # imm = 0x3632313032313032
movq %rax, 0x1f741d(%rip)    # 0x602550
movb $0x0, 0x1f741e(%rip)    # 0x602558
cmpl $0x1, %edi
jle 0x40c256
movl %edi, %ebp
callq 0x5411e0
movq %rax, 0x38(%rsp)
xorl %eax, %eax
movb %al, 0x1f9c95(%rip)     # 0x604dec
movb %al, 0x1f9c8e(%rip)     # 0x604deb
movb %al, 0x1f9c87(%rip)     # 0x604dea
movb %al, 0x1f9c80(%rip)     # 0x604de9
movq $0x0, 0x10(%rsp)
movb %al, 0x1f9c70(%rip)     # 0x604de8
movl %ebp, %r13d
negq %r13
leaq 0x27c0(%rsp), %r15
movq $0x0, 0x18(%rsp)
movq $0x0, 0x20(%rsp)
movq $0x0, 0x28(%rsp)
xorl %r12d, %r12d
movq $0x0, (%rsp)
xorl %ebp, %ebp
movq $0x0, 0x8(%rsp)
incq %r12
movq -0x8(%r14,%r12,8), %rbx
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x42, 0x1(%rbx)
jne 0x40b200
cmpb $0x0, 0x2(%rbx)
jne 0x40b200
movq (%r14,%r12,8), %rsi
movq %r15, %rdi
callq 0x401080
cmpb $0x2d, (%rbx)
je 0x40b1fd
leaq (%r12,%r13), %rax
incq %rax
incq %r12
movb $0x1, %bpl
cmpq $0x1, %rax
jne 0x40b1ba
jmp 0x40b33f
movb $0x1, %bpl
cmpb $0x41, 0x1(%rbx)
jne 0x40b22c
cmpb $0x0, 0x2(%rbx)
jne 0x40b22c
movq (%r14,%r12,8), %rsi
leaq 0xb0(%rsp), %rdi
callq 0x401080
movb $0x1, %al
movq %rax, (%rsp)
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x6f, 0x1(%rbx)
jne 0x40b25d
cmpb $0x0, 0x2(%rbx)
jne 0x40b25d
movq (%r14,%r12,8), %rsi
leaq 0x1f745d(%rip), %rdi    # 0x6026a0
callq 0x401080
movb $0x1, 0x1f9b99(%rip)    # 0x604de8
movq -0x8(%r14,%r12,8), %rbx
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x75, 0x1(%rbx)
jne 0x40b291
cmpb $0x0, 0x2(%rbx)
jne 0x40b291
movq (%r14,%r12,8), %rdi
callq 0x4cdbb0
movsd %xmm0, 0x1f9b36(%rip)   # 0x604db0
movb $0x1, 0x1f9b69(%rip)    # 0x604dea
movb $0x1, %al
movq %rax, 0x18(%rsp)
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x61, 0x1(%rbx)
jne 0x40b2c1
cmpb $0x0, 0x2(%rbx)
jne 0x40b2c1
movq (%r14,%r12,8), %rsi
leaq 0x4ed0(%rsp), %rdi
callq 0x401080
movb $0x1, 0x1f9b34(%rip)    # 0x604de9
movb $0x1, %al
movq %rax, 0x20(%rsp)
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x64, 0x1(%rbx)
jne 0x40b2f1
cmpb $0x0, 0x2(%rbx)
jne 0x40b2f1
movq (%r14,%r12,8), %rdi
callq 0x4cdbb0
movsd %xmm0, 0x1f9ae2(%rip)   # 0x604dc0
movb $0x1, 0x1f9b06(%rip)    # 0x604deb
movb $0x1, %al
movq %rax, 0x10(%rsp)
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x76, 0x1(%rbx)
jne 0x40b310
cmpb $0x0, 0x2(%rbx)
jne 0x40b310
movb $0x1, 0x1f9ae8(%rip)    # 0x604dec
movb $0x1, %al
movq %rax, 0x28(%rsp)
cmpb $0x2d, (%rbx)
jne 0x40b329
cmpb $0x68, 0x1(%rbx)
jne 0x40b329
cmpb $0x0, 0x2(%rbx)
sete %al
movq 0x8(%rsp), %rcx
orb %al, %cl
movq %rcx, 0x8(%rsp)
movq %r13, %rax
addq %r12, %rax
jne 0x40b1b7
testb $0x1, %bpl
je 0x40bdd0
movq (%rsp), %rcx
movb $0x1, %al
testb $0x1, %cl
jne 0x40b371
testb $0x1, 0x8(%rsp)
jne 0x40c256
testb $0x1, 0x28(%rsp)
jne 0x40c284
testb %al, %al
je 0x40c318
testb $0x1, %cl
je 0x40c328
movzwl 0x4ed0(%rsp), %eax
cmpw $0x54, %ax
setne %cl
andb 0x20(%rsp), %cl
cmpb $0x1, %cl
jne 0x40b39a
cmpw $0x46, %ax
jne 0x40c338
movb $0x0, 0x1f9a4f(%rip)    # 0x604de9
testb $0x1, 0x18(%rsp)
je 0x40b3b7
movsd 0x1f9a07(%rip), %xmm0   # 0x604db0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x40c25e
testb $0x1, 0x10(%rsp)
je 0x40b3d4
movsd 0x1f99fa(%rip), %xmm0   # 0x604dc0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x40c271
leaq 0x27c0(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
callq 0x406ff3
movl 0x1f71c1(%rip), %edi    # 0x6025b0
movl 0x1f71bf(%rip), %esi    # 0x6025b4
callq 0x40afc1
movslq 0x1f71b3(%rip), %r12    # 0x6025b4
cmpq $-0x1, %r12
leaq 0x4(,%r12,4), %rax
movq $-0x1, %rbx
cmovgeq %rax, %rbx
movq %rbx, %rdi
callq 0x40d300
movq %rax, %r14
movq %rbx, %rdi
callq 0x40d300
movq %rax, 0x18(%rsp)
testq %r12, %r12
jle 0x40b44a
leaq (,%r12,4), %rdx
movq %r14, %rdi
movl $0xff, %esi
callq 0x401060
movsd 0x178c8e(%rip), %xmm0   # 0x5840e0
xorl %ebp, %ebp
ucomisd 0x1f7114(%rip), %xmm0   # 0x602570
setb %r15b
movq 0x1f7159(%rip), %rdi    # 0x6025c0
movq 0x1f715a(%rip), %rsi    # 0x6025c8
movl 0x1f713c(%rip), %edx    # 0x6025b0
movl %r12d, %ecx
movq %r14, %r8
callq 0x40805a
movq 0x1f713a(%rip), %rdi    # 0x6025c0
movq 0x1f713b(%rip), %rsi    # 0x6025c8
movl 0x1f7121(%rip), %ecx    # 0x6025b4
subq $0x8, %rsp
leaq 0x1f71b2(%rip), %r12    # 0x602650
leaq 0x1f718b(%rip), %rbx    # 0x602630
movq %r14, 0x28(%rsp)
movq %r14, %r8
movq %rbx, %r9
pushq $0x8
pushq $0x28
pushq %r12
callq 0x407982
addq $0x20, %rsp
maxsd 0x178b69(%rip), %xmm0   # 0x584030
movsd %xmm0, 0x8(%rsp)
movq 0x1f70ec(%rip), %rdi    # 0x6025c0
movq 0x1f70ed(%rip), %rsi    # 0x6025c8
movl 0x1f70cf(%rip), %edx    # 0x6025b0
movl 0x1f70cd(%rip), %ecx    # 0x6025b4
movq %rbx, %r8
movq %r12, %r9
pushq $0x1e
pushq $0x2
pushq $0x0
movq 0x30(%rsp), %rbx
pushq %rbx
callq 0x409726
movsd 0x28(%rsp), %xmm1
addq $0x20, %rsp
ucomisd %xmm1, %xmm0
movl 0x1f70a1(%rip), %r13d   # 0x6025b4
jbe 0x40b54b
testl %r13d, %r13d
jle 0x40b542
leaq (,%r13,4), %rdx
movq 0x20(%rsp), %rdi
movq 0x18(%rsp), %rbx
movq %rbx, %rsi
movsd %xmm0, 0x8(%rsp)
callq 0x401118
movsd 0x8(%rsp), %xmm1
jmp 0x40b54b
movapd %xmm0, %xmm1
movq 0x18(%rsp), %rbx
movsd %xmm1, 0x8(%rsp)
movb %r15b, %bpl
movq 0x1f7065(%rip), %rdi    # 0x6025c0
movq 0x1f7066(%rip), %rsi    # 0x6025c8
movl 0x1f7048(%rip), %edx    # 0x6025b0
movl %r13d, %ecx
movq %rbx, %r8
callq 0x40876d
movq 0x1f7046(%rip), %rdi    # 0x6025c0
movq 0x1f7047(%rip), %rsi    # 0x6025c8
movl 0x1f702d(%rip), %ecx    # 0x6025b4
subq $0x8, %rsp
leaq 0x1f709e(%rip), %r9     # 0x602630
movq %rbx, %r8
pushq $0x8
pushq $0x28
pushq %r12
callq 0x407982
movsd 0x28(%rsp), %xmm1
addq $0x20, %rsp
ucomisd %xmm1, %xmm0
movl 0x1f6fff(%rip), %r13d   # 0x6025b4
movq 0x20(%rsp), %r14
movq %rbx, %r15
jbe 0x40b5e7
testl %r13d, %r13d
jle 0x40b5e3
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
movsd %xmm0, 0x8(%rsp)
callq 0x401118
movsd 0x8(%rsp), %xmm0
movapd %xmm0, %xmm1
leaq 0x178b92(%rip), %rbx    # 0x584180
movsd 0x178af2(%rip), %xmm2   # 0x5840e8
mulsd %xmm1, %xmm2
ucomisd %xmm2, %xmm0
jbe 0x40b66e
movq 0x1f6fb9(%rip), %rdi    # 0x6025c0
movq 0x1f6fba(%rip), %rsi    # 0x6025c8
movl 0x1f6f9c(%rip), %edx    # 0x6025b0
leaq 0x1f7015(%rip), %r8     # 0x602630
leaq 0x1f702e(%rip), %r9     # 0x602650
movl %r13d, %ecx
pushq $0x1e
pushq $0x2
pushq $0x0
pushq %r15
movsd %xmm1, 0x28(%rsp)
callq 0x409726
movsd 0x28(%rsp), %xmm1
addq $0x20, %rsp
ucomisd %xmm1, %xmm0
movl 0x1f6f67(%rip), %r13d   # 0x6025b4
jbe 0x40b66e
movsd %xmm0, (%rsp)
testl %r13d, %r13d
jle 0x40b673
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
callq 0x401118
jmp 0x40b673
movsd %xmm1, (%rsp)
movsd (%rbx,%rbp,8), %xmm0
movsd %xmm0, 0x8(%rsp)
movq 0x1f6f3b(%rip), %rdi    # 0x6025c0
movq 0x1f6f3c(%rip), %rsi    # 0x6025c8
movl 0x1f6f1e(%rip), %edx    # 0x6025b0
movl %r13d, %ecx
movq %r15, %r8
callq 0x4087cc
testb %al, %al
je 0x40b79e
movq 0x1f6f14(%rip), %rdi    # 0x6025c0
movq 0x1f6f15(%rip), %rsi    # 0x6025c8
movl 0x1f6efb(%rip), %ecx    # 0x6025b4
subq $0x8, %rsp
leaq 0x1f6f6c(%rip), %r9     # 0x602630
movq %r15, %r8
pushq $0x8
pushq $0x28
pushq %r12
callq 0x407982
addq $0x20, %rsp
movsd (%rsp), %xmm1
ucomisd %xmm1, %xmm0
movl 0x1f6ece(%rip), %r13d   # 0x6025b4
jbe 0x40b70e
testl %r13d, %r13d
jle 0x40b70a
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
movsd %xmm0, (%rsp)
callq 0x401118
movsd (%rsp), %xmm0
movapd %xmm0, %xmm1
movapd %xmm1, %xmm2
mulsd 0x8(%rsp), %xmm2
ucomisd %xmm2, %xmm0
jbe 0x40b891
movq 0x1f6e97(%rip), %rdi    # 0x6025c0
movq 0x1f6e98(%rip), %rsi    # 0x6025c8
movl 0x1f6e7a(%rip), %edx    # 0x6025b0
movl $0x2, %eax
leaq 0x1f6eee(%rip), %r8     # 0x602630
leaq 0x1f6f07(%rip), %r9     # 0x602650
movl %r13d, %ecx
pushq %rax
pushq %rax
pushq $0x0
pushq %r15
movsd %xmm1, 0x20(%rsp)
callq 0x409726
movsd 0x20(%rsp), %xmm1
addq $0x20, %rsp
ucomisd %xmm1, %xmm0
movl 0x1f6e42(%rip), %r13d   # 0x6025b4
jbe 0x40b891
movsd %xmm0, (%rsp)
testl %r13d, %r13d
jle 0x40b896
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
callq 0x401118
jmp 0x40b896
movq $0x605d20, %rbx         # imm = 0x605D20
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movq %rax, %rbx
leaq 0x17956f(%rip), %rsi    # 0x584d6f
movl $0x39, %edx
movq %rax, %rdi
callq 0x476080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movl 0x1f6d25(%rip), %r13d   # 0x6025b4
jmp 0x40b896
movsd %xmm1, (%rsp)
movq 0x1f6d23(%rip), %rdi    # 0x6025c0
movq 0x1f6d24(%rip), %rsi    # 0x6025c8
movl 0x1f6d06(%rip), %ebx    # 0x6025b0
movl %ebx, %edx
movl %r13d, %ecx
movq %r14, %r8
callq 0x408db0
movsd 0x178771(%rip), %xmm0   # 0x584030
movl %ebx, %edi
movl %r13d, %esi
movq %r15, %rdx
callq 0x405b3e
movq 0x1f6ced(%rip), %rdi    # 0x6025c0
movq 0x1f6cee(%rip), %rsi    # 0x6025c8
movl 0x1f6cd4(%rip), %ecx    # 0x6025b4
subq $0x8, %rsp
leaq 0x1f6d45(%rip), %r9     # 0x602630
movq %r15, %r8
pushq $0x8
pushq $0x28
pushq %r12
callq 0x407982
addq $0x20, %rsp
movsd (%rsp), %xmm1
ucomisd %xmm1, %xmm0
movl 0x1f6ca7(%rip), %r13d   # 0x6025b4
jbe 0x40b935
testl %r13d, %r13d
jle 0x40b931
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
movsd %xmm0, (%rsp)
callq 0x401118
movsd (%rsp), %xmm0
movapd %xmm0, %xmm1
movapd %xmm1, %xmm2
mulsd 0x8(%rsp), %xmm2
ucomisd %xmm2, %xmm0
jbe 0x40b9b3
movq 0x1f6c74(%rip), %rdi    # 0x6025c0
movq 0x1f6c75(%rip), %rsi    # 0x6025c8
movl 0x1f6c57(%rip), %edx    # 0x6025b0
leaq 0x1f6cd0(%rip), %r8     # 0x602630
leaq 0x1f6ce9(%rip), %r9     # 0x602650
movl %r13d, %ecx
pushq $0x1e
pushq $0x2
pushq $0x0
pushq %r15
movsd %xmm1, 0x20(%rsp)
callq 0x409726
movsd 0x20(%rsp), %xmm1
addq $0x20, %rsp
ucomisd %xmm1, %xmm0
movl 0x1f6c22(%rip), %r13d   # 0x6025b4
jbe 0x40b9b3
movsd %xmm0, (%rsp)
testl %r13d, %r13d
jle 0x40b9b8
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
callq 0x401118
jmp 0x40b9b8
movsd %xmm1, (%rsp)
movq 0x1f6c01(%rip), %rdi    # 0x6025c0
movq 0x1f6c02(%rip), %rsi    # 0x6025c8
movl 0x1f6be4(%rip), %edx    # 0x6025b0
movq 0x1f6bfd(%rip), %r8     # 0x6025d0
movq 0x1f6bfe(%rip), %r9     # 0x6025d8
subq $0x8, %rsp
movl %r13d, %ecx
pushq %r15
callq 0x4091f3
addq $0x10, %rsp
movq 0x1f6bcd(%rip), %rdi    # 0x6025c0
movq 0x1f6bce(%rip), %rsi    # 0x6025c8
movl 0x1f6bb4(%rip), %ecx    # 0x6025b4
subq $0x8, %rsp
leaq 0x1f6c25(%rip), %r9     # 0x602630
movq %r15, %r8
pushq $0x8
pushq $0x28
pushq %r12
callq 0x407982
addq $0x20, %rsp
movsd (%rsp), %xmm1
ucomisd %xmm1, %xmm0
movl 0x1f6b87(%rip), %r13d   # 0x6025b4
jbe 0x40ba55
testl %r13d, %r13d
jle 0x40ba51
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
movsd %xmm0, (%rsp)
callq 0x401118
movsd (%rsp), %xmm0
movapd %xmm0, %xmm1
movsd 0x8(%rsp), %xmm2
mulsd %xmm1, %xmm2
ucomisd %xmm2, %xmm0
jbe 0x40bacc
movq 0x1f6b54(%rip), %rdi    # 0x6025c0
movq 0x1f6b55(%rip), %rsi    # 0x6025c8
movl 0x1f6b37(%rip), %edx    # 0x6025b0
movl $0x2, %eax
leaq 0x1f6bab(%rip), %r8     # 0x602630
leaq 0x1f6bc4(%rip), %r9     # 0x602650
movl %r13d, %ecx
pushq %rax
pushq %rax
pushq $0x1
pushq %r15
movsd %xmm1, 0x20(%rsp)
callq 0x409726
addq $0x20, %rsp
ucomisd (%rsp), %xmm0
movl 0x1f6b04(%rip), %r13d   # 0x6025b4
jbe 0x40bacc
testl %r13d, %r13d
jle 0x40bae9
leaq (,%r13,4), %rdx
movq %r14, %rdi
movq %r15, %rsi
callq 0x401118
jmp 0x40bad1
testl %r13d, %r13d
jle 0x40bae9
movl %r13d, %ecx
xorl %eax, %eax
cmpl $0x0, (%r14,%rax,4)
jns 0x40bb70
incq %rax
cmpq %rax, %rcx
jne 0x40bad6
movq $0x605d20, %rbx         # imm = 0x605D20
leaq 0x1792b2(%rip), %rsi    # 0x584da9
movl $0x2f, %edx
movq %rbx, %rdi
callq 0x476080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
leaq 0x1792a7(%rip), %rsi    # 0x584dd9
movl $0x1c, %edx
movq %rbx, %rdi
callq 0x476080
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4571d0
movsbl %al, %esi
movq %rbx, %rdi
callq 0x475b80
movq %rax, %rdi
callq 0x475150
movl $0x1, %eax
jmp 0x40c244
movq 0x1f6a49(%rip), %rdi    # 0x6025c0
movq 0x1f6a4a(%rip), %rsi    # 0x6025c8
subq $0x8, %rsp
leaq 0x1f6aa7(%rip), %r9     # 0x602630
movq %r14, %r8
pushq $0x8
pushq $0x1
pushq %r12
callq 0x407982
addq $0x20, %rsp
movslq 0x1f6a0e(%rip), %r15    # 0x6025b0
leaq (,%r15,4), %rdi
testq %r15, %r15
movq $-0x1, %r14
cmovsq %r14, %rdi
callq 0x40d300
movq %rax, (%rsp)
movslq 0x1f69ec(%rip), %rbx    # 0x6025b4
leaq (,%rbx,4), %rdi
testq %rbx, %rbx
cmovsq %r14, %rdi
callq 0x40d300
movq %rax, 0x10(%rsp)
testq %r15, %r15
jle 0x40bc27
movq 0x1f69d3(%rip), %r12    # 0x6025c0
movq 0x1f69fc(%rip), %r13    # 0x6025f0
xorl %r14d, %r14d
leaq 0x1f6a32(%rip), %rbp    # 0x602630
leaq 0x1f6a4b(%rip), %rbx    # 0x602650
movq (%r12,%r14,8), %rdx
movq (%r13,%r14,8), %rcx
movq %rbp, %rdi
movq %rbx, %rsi
callq 0x4058ff
incq %r14
cmpq %r14, %r15
jne 0x40bc05
movl 0x1f698d(%rip), %ebx    # 0x6025b4
movl %ebx, %eax
movabsq $0x3fe0000000000000, %r14 # imm = 0x3FE0000000000000
testl %ebx, %ebx
movq 0x20(%rsp), %r15
jle 0x40bd9f
movq 0x1f69a9(%rip), %rcx    # 0x6025f0
movq 0x1f697a(%rip), %rdx    # 0x6025c8
movq 0x1f696b(%rip), %rsi    # 0x6025c0
movq 0x1f6984(%rip), %rdi    # 0x6025e0
movq 0x1f6985(%rip), %r8     # 0x6025e8
xorl %r9d, %r9d
xorl %r10d, %r10d
xorl %ebp, %ebp
movq (%rsp), %r12
movq 0x10(%rsp), %r13
movslq (%r15,%r9,4), %rbx
testq %rbx, %rbx
js 0x40bd23
incl %r10d
movq (%rcx,%rbx,8), %r14
movq (%rdx,%r9,8), %r11
movsd (%r14), %xmm0
subsd (%r11), %xmm0
mulsd %xmm0, %xmm0
movupd 0x8(%r14), %xmm1
movupd 0x8(%r11), %xmm2
subpd %xmm2, %xmm1
mulpd %xmm1, %xmm1
addsd %xmm1, %xmm0
unpckhpd %xmm1, %xmm1            # xmm1 = xmm1[1,1]
addsd %xmm0, %xmm1
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
ucomisd 0x1f68af(%rip), %xmm0   # 0x602578
ja 0x40bd23
movslq %ebp, %rbp
movl %ebx, (%r12,%rbp,4)
movl %r9d, (%r13,%rbp,4)
movq (%rsi,%rbx,8), %rbx
movsd (%rbx), %xmm0
movq (%rdi,%rbp,8), %r14
movsd %xmm0, (%r14)
movsd 0x8(%rbx), %xmm0
movsd %xmm0, 0x8(%r14)
movsd 0x10(%rbx), %xmm0
movsd %xmm0, 0x10(%r14)
movsd (%r11), %xmm0
movq (%r8,%rbp,8), %rbx
movsd %xmm0, (%rbx)
movsd 0x8(%r11), %xmm0
movsd %xmm0, 0x8(%rbx)
movsd 0x10(%r11), %xmm0
movsd %xmm0, 0x10(%rbx)
incl %ebp
incq %r9
cmpq %r9, %rax
jne 0x40bc74
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
movabsq $0x3fe0000000000000, %rcx # imm = 0x3FE0000000000000
movq %rcx, 0x1f6821(%rip)    # 0x602568
movsd %xmm0, 0x8(%rsp)
movsd %xmm0, 0x1f681b(%rip)   # 0x602570
movsd 0x1782bb(%rip), %xmm1   # 0x584018
cmpl $0x16, %eax
jl 0x40bddf
addl $-0xf, %eax
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
callq 0x4aaee0
mulsd 0x17832f(%rip), %xmm0   # 0x5840a8
addsd 0x178357(%rip), %xmm0   # 0x5840d8
ucomisd 0x17828f(%rip), %xmm0   # 0x584018
jae 0x40bddb
movabsq $0x3fe0000000000000, %r14 # imm = 0x3FE0000000000000
movsd 0x17827b(%rip), %xmm1   # 0x584018
jmp 0x40bde9
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
movq %r14, 0x1f67bb(%rip)    # 0x602568
movsd %xmm0, 0x8(%rsp)
movsd %xmm0, 0x1f67b5(%rip)   # 0x602570
movsd 0x178255(%rip), %xmm1   # 0x584018
xorl %ebp, %ebp
movq (%rsp), %r12
movq 0x10(%rsp), %r13
jmp 0x40bde9
xorl %eax, %eax
movq (%rsp), %rcx
jmp 0x40b34a
movapd %xmm0, %xmm1
movabsq $0x3fe0000000000000, %r14 # imm = 0x3FE0000000000000
movsd %xmm1, 0x1f678f(%rip)   # 0x602580
movsd 0x17827f(%rip), %xmm0   # 0x584078
minsd %xmm1, %xmm0
maxsd 0x1782ab(%rip), %xmm0   # 0x5840b0
movsd %xmm0, 0x1f677b(%rip)   # 0x602588
movsd %xmm1, 0x10(%rsp)
movsd %xmm1, 0x1f8fad(%rip)   # 0x604dc8
movq 0x1f67be(%rip), %rdi    # 0x6025e0
movq 0x1f67bf(%rip), %rsi    # 0x6025e8
leaq 0x30(%rsp), %rax
leaq 0x40(%rsp), %rcx
leaq 0x60(%rsp), %r8
movl %ebp, %edx
movl $0x1, %r9d
pushq %rax
pushq $0x0
callq 0x407418
addq $0x10, %rsp
movl 0x1f675e(%rip), %eax    # 0x6025b0
xorps %xmm1, %xmm1
cvtsi2sd %eax, %xmm1
movsd %xmm0, (%rsp)
movq %r14, %rbx
movq %r14, 0x1f6700(%rip)    # 0x602568
movsd %xmm1, 0x1f6700(%rip)   # 0x602570
cmpl $0x16, %eax
jl 0x40be9e
addl $-0xf, %eax
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
callq 0x4aaee0
mulsd 0x17821c(%rip), %xmm0   # 0x5840a8
addsd 0x178244(%rip), %xmm0   # 0x5840d8
ucomisd 0x17817c(%rip), %xmm0   # 0x584018
jae 0x40bea6
movsd 0x178172(%rip), %xmm0   # 0x584018
movsd %xmm0, 0x1f66d2(%rip)   # 0x602580
movsd 0x1781c2(%rip), %xmm1   # 0x584078
minsd %xmm0, %xmm1
maxsd 0x1781ee(%rip), %xmm1   # 0x5840b0
movsd %xmm1, 0x1f66be(%rip)   # 0x602588
movsd %xmm0, 0x1f8efe(%rip)   # 0x604dd0
movq 0x1f6707(%rip), %rdi    # 0x6025e0
movq 0x1f6708(%rip), %rsi    # 0x6025e8
leaq 0x1f6749(%rip), %rcx    # 0x602630
leaq 0x1f6762(%rip), %r8     # 0x602650
movl %ebp, %edx
movl $0x1, %r9d
leaq 0x30(%rsp), %r14
pushq %r14
pushq $0x0
callq 0x407418
addq $0x10, %rsp
movsd %xmm0, 0x28(%rsp)
cmpb $0x0, 0x1f8ed4(%rip)    # 0x604de9
movsd (%rsp), %xmm4
je 0x40bffe
movl 0x1f668e(%rip), %eax    # 0x6025b4
addl 0x1f6684(%rip), %eax    # 0x6025b0
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
mulsd 0x1780dd(%rip), %xmm0   # 0x584018
movq %rbx, 0x1f6626(%rip)    # 0x602568
movsd %xmm0, 0x1f6626(%rip)   # 0x602570
movsd %xmm0, 0x8(%rsp)
ucomisd 0x178170(%rip), %xmm0   # 0x5840c8
jbe 0x40bf87
movsd 0x17816e(%rip), %xmm0   # 0x5840d0
addsd 0x8(%rsp), %xmm0
callq 0x4aaee0
mulsd 0x178133(%rip), %xmm0   # 0x5840a8
addsd 0x17815b(%rip), %xmm0   # 0x5840d8
ucomisd 0x178093(%rip), %xmm0   # 0x584018
jae 0x40bf8f
movsd 0x178089(%rip), %xmm0   # 0x584018
movsd %xmm0, 0x1f65e9(%rip)   # 0x602580
movsd 0x1780d9(%rip), %xmm1   # 0x584078
minsd %xmm0, %xmm1
maxsd 0x178105(%rip), %xmm1   # 0x5840b0
movsd %xmm1, 0x1f65d5(%rip)   # 0x602588
movsd %xmm0, 0x10(%rsp)
movsd %xmm0, 0x1f8e1f(%rip)   # 0x604de0
movq 0x1f6618(%rip), %rdi    # 0x6025e0
movq 0x1f6619(%rip), %rsi    # 0x6025e8
leaq 0x1f665a(%rip), %rcx    # 0x602630
leaq 0x1f6673(%rip), %r8     # 0x602650
movl %ebp, %edx
movl $0x1, %r9d
pushq %r14
pushq $0x0
callq 0x407418
addq $0x10, %rsp
movapd %xmm0, %xmm4
movsd %xmm0, 0x1f8df2(%rip)   # 0x604df0
cmpb $0x1, 0x1f8de5(%rip)    # 0x604dea
jne 0x40c0da
movsd 0x1f8d9d(%rip), %xmm1   # 0x604db0
movq %rbx, 0x1f654e(%rip)    # 0x602568
movsd %xmm1, 0x1f654e(%rip)   # 0x602570
movsd 0x17809e(%rip), %xmm0   # 0x5840c8
movsd %xmm1, 0x8(%rsp)
ucomisd %xmm1, %xmm0
jae 0x40c063
movsd 0x178092(%rip), %xmm0   # 0x5840d0
addsd 0x8(%rsp), %xmm0
callq 0x4aaee0
mulsd 0x178057(%rip), %xmm0   # 0x5840a8
addsd 0x17807f(%rip), %xmm0   # 0x5840d8
ucomisd 0x177fb7(%rip), %xmm0   # 0x584018
jae 0x40c06b
movsd 0x177fad(%rip), %xmm0   # 0x584018
movsd %xmm0, 0x1f650d(%rip)   # 0x602580
movsd 0x177ffd(%rip), %xmm1   # 0x584078
minsd %xmm0, %xmm1
maxsd 0x178029(%rip), %xmm1   # 0x5840b0
movsd %xmm1, 0x1f64f9(%rip)   # 0x602588
movsd %xmm0, 0x10(%rsp)
movsd %xmm0, 0x1f8d3b(%rip)   # 0x604dd8
movq 0x1f653c(%rip), %rdi    # 0x6025e0
movq 0x1f653d(%rip), %rsi    # 0x6025e8
leaq 0x1f657e(%rip), %rcx    # 0x602630
leaq 0x1f6597(%rip), %r8     # 0x602650
movl %ebp, %edx
movl $0x1, %r9d
pushq %r14
pushq $0x0
callq 0x407418
addq $0x10, %rsp
movapd %xmm0, %xmm4
movsd %xmm0, 0x1f8d1e(%rip)   # 0x604df8
cmpb $0x1, 0x1f8d0a(%rip)    # 0x604deb
jne 0x40c188
movsd 0x1f8cd1(%rip), %xmm1   # 0x604dc0
movsd %xmm1, 0x10(%rsp)
movsd %xmm1, 0x1f6483(%rip)   # 0x602580
xorps %xmm0, %xmm0
cvtsi2sdl 0x1f64ac(%rip), %xmm0 # 0x6025b4
movsd %xmm0, 0x1f6460(%rip)   # 0x602570
movsd 0x177f60(%rip), %xmm0   # 0x584078
minsd %xmm1, %xmm0
maxsd 0x177f8c(%rip), %xmm0   # 0x5840b0
movsd %xmm0, 0x1f645c(%rip)   # 0x602588
movsd 0x8(%rsp), %xmm0
movsd %xmm0, 0x1f8c7e(%rip)   # 0x604db8
movq 0x1f649f(%rip), %rdi    # 0x6025e0
movq 0x1f64a0(%rip), %rsi    # 0x6025e8
leaq 0x1f64e1(%rip), %rcx    # 0x602630
leaq 0x1f64fa(%rip), %r8     # 0x602650
movl %ebp, %edx
movl $0x1, %r9d
pushq %r14
pushq $0x0
callq 0x407418
movsd 0x20(%rsp), %xmm3
movsd 0x18(%rsp), %xmm5
addq $0x10, %rsp
movapd %xmm0, %xmm4
movsd %xmm0, 0x1f8c7d(%rip)   # 0x604e00
movaps %xmm3, %xmm6
jmp 0x40c19c
movsd 0x177f60(%rip), %xmm3   # 0x5840f0
movsd 0x8(%rsp), %xmm5
movsd 0x10(%rsp), %xmm6
movl 0x1f640e(%rip), %edx    # 0x6025b0
movl 0x1f640c(%rip), %ecx    # 0x6025b4
movsd 0x30(%rsp), %xmm2
subq $0x8, %rsp
leaq 0x27c8(%rsp), %rdi
leaq 0xb8(%rsp), %rsi
leaq 0x48(%rsp), %r8
leaq 0x68(%rsp), %r9
movsd 0x8(%rsp), %xmm0
movsd 0x30(%rsp), %xmm1
pushq %rbp
pushq %r13
pushq %r12
callq 0x40a3d4
addq $0x20, %rsp
callq 0x4071ee
movq %r15, %rdi
callq 0x40c600
movq 0x18(%rsp), %rdi
callq 0x40c600
movq %r12, %rdi
callq 0x40c600
movq %r13, %rdi
callq 0x40c600
callq 0x5411e0
xorps %xmm0, %xmm0
cvtsi2ss %rax, %xmm0
xorps %xmm1, %xmm1
cvtsi2ssq 0x38(%rsp), %xmm1
subss %xmm1, %xmm0
mulss 0x177f80(%rip), %xmm0   # 0x5841b0
cvtss2sd %xmm0, %xmm0
leaq 0x178bbb(%rip), %rdi    # 0x584df6
movb $0x1, %al
callq 0x4d9ab0
xorl %eax, %eax
addq $0x75e8, %rsp           # imm = 0x75E8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq (%r14), %rdi
callq 0x40ac3f
movq $0x605d20, %rdi         # imm = 0x605D20
leaq 0x178aab(%rip), %rsi    # 0x584d17
jmp 0x40c346
movq $0x605d20, %rdi         # imm = 0x605D20
leaq 0x178ac4(%rip), %rsi    # 0x584d43
jmp 0x40c346
movq $0x605d20, %r14         # imm = 0x605D20
movq %r14, %rdi
callq 0x475e90
leaq 0x17817e(%rip), %rbx    # 0x584418
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4765b0
movq %rax, %rdi
callq 0x475e90
leaq 0x1781b3(%rip), %rsi    # 0x584467
movq %rax, %rdi
callq 0x4765b0
leaq 0x1f628d(%rip), %rsi    # 0x602550
movq %rax, %rdi
callq 0x4765b0
leaq 0x1781ab(%rip), %rsi    # 0x58447d
movq %rax, %rdi
callq 0x4765b0
movq %rax, %rdi
callq 0x475e90
leaq 0x1781c6(%rip), %rsi    # 0x5844af
movq %rax, %rdi
callq 0x4765b0
movq %rax, %rdi
callq 0x475e90
leaq 0x1781fe(%rip), %rsi    # 0x5844fe
movq %rax, %rdi
callq 0x4765b0
movq %rax, %rdi
callq 0x475e90
movq %rax, %rdi
movq %rbx, %rsi
jmp 0x40c346
movq $0x605d20, %rdi         # imm = 0x605D20
leaq 0x17898b(%rip), %rsi    # 0x584cb1
jmp 0x40c346
movq $0x605d20, %rdi         # imm = 0x605D20
leaq 0x178996(%rip), %rsi    # 0x584ccc
jmp 0x40c346
movq $0x605d20, %rdi         # imm = 0x605D20
leaq 0x1789a1(%rip), %rsi    # 0x584ce7
callq 0x4765b0
movq %rax, %rdi
callq 0x475e90
movl $0x1, %edi
callq 0x4ce720