// File: ksabry[P]bfbrute/src/ProgramIterator.h
// Function: ProgramIterator<400ul, 32ul, 12ul, 32ul>::NextBrackets()
bool NextBrackets()
	{
		while (bracketIdx >= 0)
		{
			uint_fast32_t remainingBrackets = iteratorCount - bracketIdx - 1;
			bool left_valid = bracketIdx == 0 ? remainingBrackets >= 2 : remainingBrackets >= brackets[bracketIdx - 1].depth + 2;
			bool right_valid = bracketIdx == 0 ? false : brackets[bracketIdx - 1].depth > 0;

			// EMPTY -> LEFT -> RIGHT -> EMPTY
			assert(bracketIdx >= 0 && bracketIdx < max_program_size);
			if (brackets[bracketIdx].bracket == Bracket::EMPTY)
			{
				if (left_valid)
				{
					if (!SetBracketLeft()) continue;
					bracketIdx++;
				}
				else if (right_valid)
				{
					if (!SetBracketRight()) continue;
					if (bracketIdx == iteratorCount - 2)
					{
						SetJumps();
						return true;
					}
					bracketIdx++;
				}
				else
				{
					bracketIdx--;
				}
			}
			else if (brackets[bracketIdx].bracket == Bracket::LEFT)
			{
				if (right_valid)
				{
					if (!SetBracketRight()) continue;
					if (bracketIdx == iteratorCount - 2)
					{
						SetJumps();
						return true;
					}
					bracketIdx++;
				}
				else
				{
					brackets[bracketIdx].bracket = Bracket::EMPTY;
					bracketIdx--;
				}
			}
			else
			{
				brackets[bracketIdx].bracket = Bracket::EMPTY;
				bracketIdx--;
			}
		}
		return false;
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq $0x0, 0x4230(%rax)
jl 0xdc02
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
subq 0x4230(%rax), %rcx
subq $0x1, %rcx
movq %rcx, -0x18(%rbp)
cmpq $0x0, 0x4230(%rax)
jne 0xd974
cmpq $0x2, -0x18(%rbp)
setae %al
movb %al, -0x29(%rbp)
jmp 0xd9a9
movq -0x28(%rbp), %rdx
movq -0x18(%rbp), %rax
movq %rdx, %rcx
addq $0x3e30, %rcx           # imm = 0x3E30
movq 0x4230(%rdx), %rdx
subq $0x1, %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movq 0x8(%rcx), %rcx
addq $0x2, %rcx
cmpq %rcx, %rax
setae %al
movb %al, -0x29(%rbp)
movq -0x28(%rbp), %rax
movb -0x29(%rbp), %cl
andb $0x1, %cl
movb %cl, -0x19(%rbp)
cmpq $0x0, 0x4230(%rax)
jne 0xd9c7
xorl %eax, %eax
movb %al, -0x2a(%rbp)
jmp 0xd9f1
movq -0x28(%rbp), %rcx
movq %rcx, %rax
addq $0x3e30, %rax           # imm = 0x3E30
movq 0x4230(%rcx), %rcx
subq $0x1, %rcx
shlq $0x4, %rcx
addq %rcx, %rax
cmpq $0x0, 0x8(%rax)
seta %al
movb %al, -0x2a(%rbp)
movq -0x28(%rbp), %rcx
movb -0x2a(%rbp), %al
andb $0x1, %al
movb %al, -0x1a(%rbp)
xorl %eax, %eax
cmpq $0x0, 0x4230(%rcx)
movb %al, -0x2b(%rbp)
jl 0xda1e
movq -0x28(%rbp), %rax
cmpq $0x20, 0x4230(%rax)
setb %al
movb %al, -0x2b(%rbp)
movb -0x2b(%rbp), %al
testb $0x1, %al
jne 0xda27
jmp 0xda29
jmp 0xda48
leaq 0x5ac2(%rip), %rdi      # 0x134f2
leaq 0x58ca(%rip), %rsi      # 0x13301
movl $0x170, %edx            # imm = 0x170
leaq 0x5ae0(%rip), %rcx      # 0x13523
callq 0x3180
movq -0x28(%rbp), %rcx
movq %rcx, %rax
addq $0x3e30, %rax           # imm = 0x3E30
movq 0x4230(%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
cmpl $0x0, (%rax)
jne 0xdb13
testb $0x1, -0x19(%rbp)
je 0xda9c
movq -0x28(%rbp), %rdi
callq 0xdef0
testb $0x1, %al
jne 0xda84
jmp 0xd934
movq -0x28(%rbp), %rax
movq 0x4230(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdb0e
testb $0x1, -0x1a(%rbp)
je 0xdaf6
movq -0x28(%rbp), %rdi
callq 0xe0a0
testb $0x1, %al
jne 0xdab4
jmp 0xd934
movq -0x28(%rbp), %rcx
movq 0x4230(%rcx), %rax
movq 0x20(%rcx), %rcx
subq $0x2, %rcx
cmpq %rcx, %rax
jne 0xdade
movq -0x28(%rbp), %rdi
callq 0xe180
movb $0x1, -0x1(%rbp)
jmp 0xdc06
movq -0x28(%rbp), %rax
movq 0x4230(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdb0c
movq -0x28(%rbp), %rax
movq 0x4230(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdb0e
jmp 0xdbfd
movq -0x28(%rbp), %rcx
movq %rcx, %rax
addq $0x3e30, %rax           # imm = 0x3E30
movq 0x4230(%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
cmpl $0x1, (%rax)
jne 0xdbc7
testb $0x1, -0x1a(%rbp)
je 0xdb91
movq -0x28(%rbp), %rdi
callq 0xe0a0
testb $0x1, %al
jne 0xdb4f
jmp 0xd934
movq -0x28(%rbp), %rcx
movq 0x4230(%rcx), %rax
movq 0x20(%rcx), %rcx
subq $0x2, %rcx
cmpq %rcx, %rax
jne 0xdb79
movq -0x28(%rbp), %rdi
callq 0xe180
movb $0x1, -0x1(%rbp)
jmp 0xdc06
movq -0x28(%rbp), %rax
movq 0x4230(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdbc5
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x3e30, %rcx           # imm = 0x3E30
movq 0x4230(%rax), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl $0x0, (%rcx)
movq 0x4230(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdbfb
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x3e30, %rcx           # imm = 0x3E30
movq 0x4230(%rax), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl $0x0, (%rcx)
movq 0x4230(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x4230(%rax)
jmp 0xdbfd
jmp 0xd934
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)