// File: /workspace/github_c_makefile_star2_O0/cbouilla[P]AES-attacks-finder/Solver.c
// Function: AjusteSolver
Solver AjusteSolver(Solver B, SysEqLin E) // Refait la solver B par rapport à E (supprime les variables connues, ...)
{
	if (B==NULL) return NULL;
	
	if (B->type==2)
	{
		Solver B2=AjusteSolver(B->fils2,E);
		if (B2!=NULL && B2->Nvar>0)
		{
			SysEqLin F=EsachantX(B2->var,B2->Nvar,E);
			Solver B1=AjusteSolver(B->fils1,F);
			freeSysEq(F);
			if (B1!=NULL && B1->Nvar>0)
			{
				Solver tmp=NewSolver();
				tmp->var=UnionListesTriees(B1->var,B1->Nvar,B2->var,B2->Nvar,&(tmp->Nvar));
				tmp->sortie=B1->sortie+max(B2->sortie,0);
				tmp->temps=max(B2->temps,max(B2->sortie,0)+B1->temps);
				tmp->memoire=max(B1->memoire,B2->memoire);
				tmp->type=2;
				//tmp->parents=1;
				tmp->fils1=B1;
				tmp->fils2=B2;
				return tmp;
			}
			else
			{
				freeSolver(B1);
				return B2;
			}
		}
		else
		{
			freeSolver(B2);
			return AjusteSolver(B->fils1,E);
		}
	}
	
	if (B->type==1)
	{
		Solver B1=AjusteSolver(B->fils1,E);
		Solver B2=AjusteSolver(B->fils2,E);
		Solver tmp=UnionSolver(B1,B2,E);
		freeSolver(B1);
		freeSolver(B2);
		return tmp;
	}
	
	Solver tmp=NewSolver();
	tmp->Nvar=0;
	tmp->var=malloc(B->Nvar*sizeof(int));
	int i;
	for (i = 0; i < B->Nvar; i++) if (E->lignevar[B->var[i]]*E->gen<E->a) tmp->var[tmp->Nvar++]=B->var[i];
	if (tmp->Nvar==0) 
	{
		/* On libère la solver ( ATTENTION !!) */
		free(tmp->var);
		tmp->parents=0;
		return NULL;
	}
	#if 0
	tmp->initialisation=E;
	tmp->mat=InfoSortie_VariablesVersion(tmp->var,tmp->Nvar,E);
	tmp->sortie=tmp->mat->nombre_de_lignes - (E->gen-1)*tmp->Nvar;
	#else
	B->sortie=TailleE(B->var,B->Nvar,E);
	#endif
	if (tmp->Nvar<=B->temps)
	{
		tmp->temps=tmp->Nvar;
		tmp->memoire=0;
	}
	else
	{
		tmp->temps=B->temps;
		tmp->memoire=B->memoire;
	}
	tmp->type=0;
	//tmp->parents=1;
	tmp->fils1=NULL;
	tmp->fils2=NULL;
	return tmp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0xd327
movq $0x0, -0x8(%rbp)
jmp 0xd704
movq -0x10(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x2, %eax
jne 0xd538
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xd300
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0xd515
movq -0x20(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jle 0xd515
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0xd300
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rdi
callq 0x12220
cmpq $0x0, -0x30(%rbp)
je 0xd4ff
movq -0x30(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jle 0xd4ff
callq 0x9280
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
movq (%rax), %rdi
movq -0x30(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x20(%rbp), %rax
movq (%rax), %rdx
movq -0x20(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x38(%rbp), %r8
addq $0x8, %r8
callq 0x24e0
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x60(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jle 0xd414
movq -0x20(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x64(%rbp)
jmp 0xd41b
xorl %eax, %eax
movl %eax, -0x64(%rbp)
jmp 0xd41b
movl -0x60(%rbp), %ecx
movl -0x64(%rbp), %eax
addl %eax, %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x20(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x68(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jle 0xd44a
movq -0x20(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x6c(%rbp)
jmp 0xd451
xorl %eax, %eax
movl %eax, -0x6c(%rbp)
jmp 0xd451
movl -0x68(%rbp), %eax
movl -0x6c(%rbp), %ecx
movq -0x30(%rbp), %rdx
addl 0xc(%rdx), %ecx
cmpl %ecx, %eax
jle 0xd46e
movq -0x20(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x70(%rbp)
jmp 0xd498
movq -0x20(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jle 0xd484
movq -0x20(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x74(%rbp)
jmp 0xd48b
xorl %eax, %eax
movl %eax, -0x74(%rbp)
jmp 0xd48b
movl -0x74(%rbp), %eax
movq -0x30(%rbp), %rcx
addl 0xc(%rcx), %eax
movl %eax, -0x70(%rbp)
movl -0x70(%rbp), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x30(%rbp), %rax
movl 0x10(%rax), %eax
movq -0x20(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0xd4be
movq -0x30(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x78(%rbp)
jmp 0xd4c8
movq -0x20(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x78(%rbp)
movl -0x78(%rbp), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x38(%rbp), %rax
movb $0x2, 0x18(%rax)
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd704
movq -0x30(%rbp), %rdi
callq 0x93b0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd704
movq -0x20(%rbp), %rdi
callq 0x93b0
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xd300
movq %rax, -0x8(%rbp)
jmp 0xd704
movq -0x10(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x1, %eax
jne 0xd5a3
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xd300
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xd300
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x50(%rbp)
movq -0x40(%rbp), %rdi
callq 0x93b0
movq -0x48(%rbp), %rdi
callq 0x93b0
movq -0x50(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd704
callq 0x9280
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movl $0x0, 0x8(%rax)
movq -0x10(%rbp), %rax
movslq 0x8(%rax), %rdi
shlq $0x2, %rdi
callq 0x21c0
movq %rax, %rcx
movq -0x58(%rbp), %rax
movq %rcx, (%rax)
movl $0x0, -0x5c(%rbp)
movl -0x5c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jge 0xd647
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rcx
movslq -0x5c(%rbp), %rdx
movslq (%rcx,%rdx,4), %rcx
movl (%rax,%rcx,4), %eax
movq -0x18(%rbp), %rcx
imull 0x10(%rcx), %eax
movq -0x18(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jge 0xd63a
movq -0x10(%rbp), %rax
movq (%rax), %rax
movslq -0x5c(%rbp), %rcx
movl (%rax,%rcx,4), %edx
movq -0x58(%rbp), %rax
movq (%rax), %rax
movq -0x58(%rbp), %rsi
movl 0x8(%rsi), %ecx
movl %ecx, %edi
addl $0x1, %edi
movl %edi, 0x8(%rsi)
movslq %ecx, %rcx
movl %edx, (%rax,%rcx,4)
jmp 0xd63c
movl -0x5c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rbp)
jmp 0xd5d9
movq -0x58(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0xd675
movq -0x58(%rbp), %rax
movq (%rax), %rdi
callq 0x2030
movq -0x58(%rbp), %rax
movl $0x0, 0x1c(%rax)
movq $0x0, -0x8(%rbp)
jmp 0xd704
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0xee60
movl %eax, %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x58(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jg 0xd6c0
movq -0x58(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x58(%rbp), %rax
movl $0x0, 0x10(%rax)
jmp 0xd6dc
movq -0x10(%rbp), %rax
movl 0xc(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x10(%rbp), %rax
movl 0x10(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x58(%rbp), %rax
movb $0x0, 0x18(%rax)
movq -0x58(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x58(%rbp), %rax
movq $0x0, 0x28(%rax)
movq -0x58(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)