// File: iamlouk[P]asbi/src/tokenizer.cc
// Function: tok::Tokenizer::next()
Token Tokenizer::next() {
	if (tokbuffed) {
		tokbuffed = false;
		return tokbuf;
	}

	if (pos >= source.length())
		return Token(EOFTok, line);

	char c = source[pos];
	switch (c) {
	case '\n':
		line += 1;
	case ' ': case '\t': case '\v':
		pos++;
		return next();
	case '#':
		while (pos < source.length() && source[pos] != '\n') pos++;
		line++;
		pos++;
		return next();
	case '"':
	case '\'':
		return next_string(c);
	case '(':
		pos++;
		return Token(LeftBracket, line);
	case ')':
		pos++;
		return Token(RightBracket, line);
	case '{':
		pos++;
		return Token(LeftCurlyBracket, line);
	case '}':
		pos++;
		return Token(RightCurlyBracket, line);
	case '[':
		pos++;
		return Token(LeftSquareBracket, line);
	case ']':
		pos++;
		return Token(RightSquareBracket, line);
	case '-':
		pos++;
		if (pos < source.length() && source[pos] == '>') {
			pos++;
			return Token(Arrow, line);
		}
		return Token(Minus, line);
	case '+':
		pos++;
		return Token(Plus, line);
	case '*':
		pos++;
		return Token(Mul, line);
	case '/':
		pos++;
		if (pos < source.length() && source[pos] == '/') {
			while (pos < source.length() && source[pos] != '\n') pos++;
			line++;
			pos++;
			return next();
		}
		if (pos < source.length() && source[pos] == '*') {
			pos++;
			while (pos + 1 < source.length() && !(source[pos] == '*' && source[pos + 1] == '/')) {
				if (source[pos++] == '\n') {
					line++;
				}
			}
			pos += 2;
			return next();
		}
		return Token(Div, line);
	case '!':
		pos++;
		if (pos < source.length() && source[pos] == '=') {
			pos++;
			return Token(EqualsNot, line);
		}
		return Token(Not, line);
	case '=':
		pos++;
		if (pos < source.length() && source[pos] == '=') {
			pos++;
			return Token(Equals, line);
		}
		return Token(Assign, line);
	case '|':
		pos++;
		return Token(Or, line);
	case '&':
		pos++;
		return Token(And, line);
	case ',':
		pos++;
		return Token(Comma, line);
	case ':':
		pos++;
		if (pos < source.length() && source[pos] == '=') {
			pos++;
			return Token(Declare, line);
		}
		if (pos < source.length() && source[pos] == ':') {
			pos++;
			return Token(DoubleColon, line);
		}
		return Token(Colon, line);
	case '<':
		pos++;
		if (pos < source.length() && source[pos] == '=') {
			pos++;
			return Token(SmallerOrEqual, line);
		}
		return Token(Smaller, line);
	case '>':
		pos++;
		if (pos < source.length() && source[pos] == '=') {
			pos++;
			return Token(BiggerOrEqual, line);
		}
		return Token(Bigger, line);
	case ';':
		pos++;
		return Token(Semicolon, line);
	case '.':
		pos++;
		return Token(Dot, line);
	case '~':
		pos++;
		return Token(KeyValue, line);
	default:
		if ('0' <= c && c <= '9')
			return next_number();

		if (!is_identifier(c))
			throw utils::tokenizer_error("unkown char", line, source[pos]);

		std::string* str = new std::string("");
		while (pos < source.length()) {
			char c = source[pos];
			if (!is_identifier(c))
				break;

			*str += c;
			pos++;
		}

		auto mappos = keywords.find(*str);
		if (mappos == keywords.end()) {
			return Token(Identifier, str, line);
		} else {
			delete str;
			mappos->second.line = line;
			return mappos->second;
		}
	}
}

// Assembly:
subq $0x138, %rsp            # imm = 0x138
movq %rdi, 0x120(%rsp)
movq 0x120(%rsp), %rax
movq %rax, 0xe0(%rsp)
testb $0x1, 0x28(%rax)
je 0x938e
movq 0xe0(%rsp), %rax
movb $0x0, 0x28(%rax)
movq 0x18(%rax), %rcx
movq %rcx, 0x128(%rsp)
movq 0x20(%rax), %rax
movq %rax, 0x130(%rsp)
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0xd8(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0xd8(%rsp), %rax
cmpq %rcx, %rax
jb 0x93dc
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x25, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rsi
movq 0x10(%rax), %rdi
callq 0x64e0
movb (%rax), %al
movb %al, 0x11f(%rsp)
movsbl 0x11f(%rsp), %eax
addl $-0x9, %eax
movl %eax, %ecx
movq %rcx, 0xd0(%rsp)
subl $0x75, %eax
ja 0x9e59
movq 0xd0(%rsp), %rax
leaq 0x2ee9a(%rip), %rcx     # 0x382c0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movq 0xe0(%rsp), %rdi
movq (%rdi), %rax
addq $0x1, %rax
movq %rax, (%rdi)
callq 0x9340
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
jmp 0x946e
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0xc0(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq 0xc0(%rsp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0xcf(%rsp)
jae 0x94c7
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0xa, %eax
setne %al
movb %al, 0xcf(%rsp)
movb 0xcf(%rsp), %al
testb $0x1, %al
jne 0x94d4
jmp 0x94e8
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x946e
movq 0xe0(%rsp), %rdi
movl 0x8(%rdi), %eax
addl $0x1, %eax
movl %eax, 0x8(%rdi)
movq (%rdi), %rax
addq $0x1, %rax
movq %rax, (%rdi)
callq 0x9340
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
movq 0xe0(%rsp), %rdi
movsbl 0x11f(%rsp), %esi
callq 0x8e40
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x17, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x18, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x19, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1a, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1b, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1c, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0xb8(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0xb8(%rsp), %rax
cmpq %rcx, %rax
jae 0x96cd
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3e, %eax
jne 0x96cd
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xc, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x9, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x8, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xa, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0xb0(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0xb0(%rsp), %rax
cmpq %rcx, %rax
jae 0x9852
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x2f, %eax
jne 0x9852
jmp 0x97a3
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0xa0(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq 0xa0(%rsp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0xaf(%rsp)
jae 0x97fc
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0xa, %eax
setne %al
movb %al, 0xaf(%rsp)
movb 0xaf(%rsp), %al
testb $0x1, %al
jne 0x9809
jmp 0x981d
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x97a3
movq 0xe0(%rsp), %rdi
movl 0x8(%rdi), %eax
addl $0x1, %eax
movl %eax, 0x8(%rdi)
movq (%rdi), %rax
addq $0x1, %rax
movq %rax, (%rdi)
callq 0x9340
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x98(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x98(%rsp), %rax
cmpq %rcx, %rax
jae 0x99bf
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x2a, %eax
jne 0x99bf
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x88(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq 0x88(%rsp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0x97(%rsp)
jae 0x994a
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %ecx
xorl %eax, %eax
cmpl $0x2a, %ecx
movb %al, 0x87(%rsp)
jne 0x993a
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
addq $0x1, %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x2f, %eax
sete %al
movb %al, 0x87(%rsp)
movb 0x87(%rsp), %al
xorb $-0x1, %al
movb %al, 0x97(%rsp)
movb 0x97(%rsp), %al
testb $0x1, %al
jne 0x9957
jmp 0x9993
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
movq %rsi, %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
callq 0x64e0
movsbl (%rax), %eax
cmpl $0xa, %eax
jne 0x998e
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
jmp 0x98b4
movq 0xe0(%rsp), %rdi
movq (%rdi), %rax
addq $0x2, %rax
movq %rax, (%rdi)
callq 0x9340
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xb, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0x78(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x78(%rsp), %rax
cmpq %rcx, %rax
jae 0x9a59
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3d, %eax
jne 0x9a59
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xf, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x14, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0x70(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x70(%rsp), %rax
cmpq %rcx, %rax
jae 0x9af3
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3d, %eax
jne 0x9af3
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xe, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x6, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x15, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x16, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1d, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0x68(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x68(%rsp), %rax
cmpq %rcx, %rax
jae 0x9c11
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3d, %eax
jne 0x9c11
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x7, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x60(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x60(%rsp), %rax
cmpq %rcx, %rax
jae 0x9c7f
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3a, %eax
jne 0x9c7f
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x21, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1f, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0x58(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x58(%rsp), %rax
cmpq %rcx, %rax
jae 0x9d19
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3d, %eax
jne 0x9d19
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x12, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x10, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq (%rax), %rcx
movq %rcx, 0x50(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x50(%rsp), %rax
cmpq %rcx, %rax
jae 0x9db3
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movsbl (%rax), %eax
cmpl $0x3d, %eax
jne 0x9db3
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x13, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x11, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x1e, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0x20, %esi
callq 0xb5d0
jmp 0xa149
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movl 0x8(%rax), %edx
leaq 0x128(%rsp), %rdi
movl $0xd, %esi
callq 0xb5d0
jmp 0xa149
movsbl 0x11f(%rsp), %ecx
movl $0x30, %eax
cmpl %ecx, %eax
jg 0x9e99
movsbl 0x11f(%rsp), %eax
cmpl $0x39, %eax
jg 0x9e99
movq 0xe0(%rsp), %rdi
callq 0x9090
movq %rax, 0x128(%rsp)
movq %rdx, 0x130(%rsp)
jmp 0xa149
movsbl 0x11f(%rsp), %edi
callq 0xa170
testb $0x1, %al
jne 0x9f35
movl $0x38, %edi
callq 0x6200
movq %rax, %rcx
movq 0xe0(%rsp), %rax
movq %rcx, 0x40(%rsp)
movq %rcx, 0x38(%rsp)
movl 0x8(%rax), %ecx
movl %ecx, 0x4c(%rsp)
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movq 0x40(%rsp), %rdi
movl 0x4c(%rsp), %edx
movsbl (%rax), %ecx
leaq 0x2e663(%rip), %rsi     # 0x38556
callq 0x171c0
jmp 0x9efa
movq 0x38(%rsp), %rdi
leaq 0x415e2(%rip), %rsi     # 0x4b4e8
leaq 0x1ac3(%rip), %rdx      # 0xb9d0
callq 0x6780
movq 0x38(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
callq 0x6320
jmp 0xa161
movl $0x20, %edi
callq 0x6460
movq %rax, 0x28(%rsp)
movq %rax, 0x20(%rsp)
movb $0x1, 0xfe(%rsp)
leaq 0xff(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x67b0
movq 0x28(%rsp), %rdi
movq 0x30(%rsp), %rdx
leaq 0x2e190(%rip), %rsi     # 0x38104
callq 0x7c20
jmp 0x9f7b
movb $0x0, 0xfe(%rsp)
leaq 0xff(%rsp), %rdi
callq 0x64c0
movq 0x20(%rsp), %rax
movq %rax, 0x100(%rsp)
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x18(%rsp)
movq 0x10(%rax), %rdi
callq 0x66c0
movq %rax, %rcx
movq 0x18(%rsp), %rax
cmpq %rcx, %rax
jae 0xa066
movq 0xe0(%rsp), %rax
movq 0x10(%rax), %rdi
movq (%rax), %rsi
callq 0x64e0
movb (%rax), %al
movb %al, 0xfd(%rsp)
movsbl 0xfd(%rsp), %edi
callq 0xa170
testb $0x1, %al
jne 0xa038
jmp 0xa066
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0xff(%rsp), %rdi
callq 0x64c0
testb $0x1, 0xfe(%rsp)
jne 0xa024
jmp 0xa033
movq 0x20(%rsp), %rdi
movl $0x20, %esi
callq 0x6470
jmp 0xa161
movb 0xfd(%rsp), %al
movq 0x100(%rsp), %rdi
movsbl %al, %esi
callq 0x62a0
movq 0xe0(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x9f9d
movq 0x100(%rsp), %rsi
leaq 0x423db(%rip), %rdi     # 0x4c450
callq 0xbb10
movq %rax, 0xf0(%rsp)
leaq 0x423c7(%rip), %rdi     # 0x4c450
callq 0xbb60
movq %rax, 0xe8(%rsp)
leaq 0xf0(%rsp), %rdi
leaq 0xe8(%rsp), %rsi
callq 0xbb40
testb $0x1, %al
jne 0xa0b1
jmp 0xa0d5
movq 0xe0(%rsp), %rax
movq 0x100(%rsp), %rdx
movl 0x8(%rax), %ecx
leaq 0x128(%rsp), %rdi
xorl %esi, %esi
callq 0xba10
jmp 0xa149
movq 0x100(%rsp), %rax
movq %rax, 0x10(%rsp)
cmpq $0x0, %rax
je 0xa101
movq 0x10(%rsp), %rdi
callq 0x6290
movq 0x10(%rsp), %rdi
movl $0x20, %esi
callq 0x6470
movq 0xe0(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, 0xc(%rsp)
leaq 0xf0(%rsp), %rdi
callq 0xbb90
movl 0xc(%rsp), %ecx
movl %ecx, 0x24(%rax)
leaq 0xf0(%rsp), %rdi
callq 0xbb90
movq 0x20(%rax), %rcx
movq %rcx, 0x128(%rsp)
movq 0x28(%rax), %rax
movq %rax, 0x130(%rsp)
movq 0x128(%rsp), %rax
movq 0x130(%rsp), %rdx
addq $0x138, %rsp            # imm = 0x138
retq
movq 0x110(%rsp), %rdi
callq 0x67a0
nop