// File: /workspace/github_cpp_makefile_star2_O3/lishen2[P]Excel_formula_parser_cpp/FormulaParser.cpp
// Function: ExcelFormula::FormulaParser::parserToToken1()
void FormulaParser::parserToToken1()
	{
		if (m_formula.size() < 2 
				|| m_formula[0] != '=') return;

		//! keywords used in parsing excel formual
		const char QUOTE_DOUBLE  = '"';
		const char QUOTE_SINGLE  = '\'';
		const char BRACKET_CLOSE = ']';
		const char BRACKET_OPEN  = '[';
		const char BRACE_OPEN    = '{';
		const char BRACE_CLOSE   = '}';
		const char PAREN_OPEN    = '(';
		const char PAREN_CLOSE   = ')';
		const char SEMICOLON     = ';';
		const char WHITESPACE    = ' ';
		const char COMMA         = ',';
		const char ERROR_START   = '#';

		const string OPERATORS_SN = "+-";
		const string OPERATORS_INFIX = "+-*/^&=><";
		const string OPERATORS_POSTFIX = "%";

		const char* ERRORS[] = {"#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A"};
		const int ERRORS_LEN = 7; 

		const char* COMPARATORS_MULTI[] = {">=", "<=", "<>"};
		const int COMPARATORS_MULTI_LEN = 3;

		bool inString = false;
		bool inPath = false;
		bool inRange = false;
		bool inError = false;

		int index = 1;
		string value = "";      

		while(index < m_formula.size())
		{
			// state-dependent character evaluation (order is important)

			// double-quoted strings
			// embeds are doubled
			// end marks token

			if (inString) {    
				if (m_formula[index] == QUOTE_DOUBLE) {
					if (((index + 2) <= m_formula.size()) && (m_formula[index + 1] == QUOTE_DOUBLE)) {
						value += QUOTE_DOUBLE;
						index++;
					} else {
						inString = false;
						m_tmpAry.add(MakeToken(value.c_str(), Token::Operand, Token::Text));
						value = "";
					}      
				} else {
					value += m_formula[index];
				}
				index++;
				continue;
			}

			// single-quoted strings (links)
			// embeds are double
			// end does not mark a token

			if (inPath) {
				if (m_formula[index] == QUOTE_SINGLE) {
					if (((index + 2) <= m_formula.size()) && (m_formula[index + 1] == QUOTE_SINGLE)) {
						value += QUOTE_SINGLE;
						index++;
					} else {
						inPath = false;
					}
				} else {
					value += m_formula[index];
				}
				index++;
				continue; 
			}    

			// bracked strings (R1C1 range index or linked workbook name)
			// no embeds (changed to "()" by Excel)
			// end does not mark a token

			if (inRange) {
				if (m_formula[index] == BRACKET_CLOSE) {
					inRange = false;
				}
				value += m_formula[index];
				index++;
				continue;
			}

			// error values
			// end marks a token, determined from absolute list of values

			if (inError) {
				value += m_formula[index];
				index++;
				if (StrUtils::indexOf(ERRORS_LEN, ERRORS, value.c_str()) != -1) {
					inError = false;
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand, Token::Error));
					value = "";
				}
				continue;
			}

			// scientific notation check

			if ((OPERATORS_SN).find_first_of(m_formula[index]) != string::npos) {
				if (value.size() > 1) {
					if (m_regex->PartialMatch(value.c_str())) {
						value+= m_formula[index];
						index++;
						continue;
					}
				}
			}

			// independent character evaluation (order not important)

			// establish state-dependent character evaluations

			if (m_formula[index] == QUOTE_DOUBLE) {  
				if (value.size() > 0) {  // unexpected
					m_tmpAry.add(MakeToken(value.c_str(), Token::Unknown));
					value = "";
				}
				inString = true;
				index++;
				continue;
			}

			if (m_formula[index] == QUOTE_SINGLE) {
				if (value.size() > 0) { // unexpected
					m_tmpAry.add(MakeToken(value.c_str(), Token::Unknown));
					value = "";
				}
				inPath = true;
				index++;
				continue;
			}

			if (m_formula[index] == BRACKET_OPEN) {
				inRange = true;
				value += BRACKET_OPEN;
				index++;
				continue;
			}

			if (m_formula[index] == ERROR_START) {
				if (value.size() > 0) { // unexpected
					m_tmpAry.add(MakeToken(value.c_str(), Token::Unknown));
					value = "";
				}
				inError = true;
				value += ERROR_START;
				index++;
				continue;
			}

			// mark start and end of arrays and array rows

			if (m_formula[index] == BRACE_OPEN) {  
				if (value.size() > 0) { // unexpected
					m_tmpAry.add(MakeToken(value.c_str(), Token::Unknown));
					value = "";
				}
				m_tmpStack.push(m_tmpAry.add(MakeToken("ARRAY", Token::Function, Token::Start)));
				m_tmpStack.push(m_tmpAry.add(MakeToken("ARRAYROW", Token::Function, Token::Start)));
				index++;
				continue;
			}

			if (m_formula[index] == SEMICOLON) {  
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				m_tmpAry.add(m_tmpStack.pop());
				m_tmpAry.add(MakeToken(",", Token::Argument));
				m_tmpStack.push(m_tmpAry.add(MakeToken("ARRAYROW", Token::Function, Token::Start)));
				index++;
				continue;
			}

			if (m_formula[index] == BRACE_CLOSE) {  
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				m_tmpAry.add(m_tmpStack.pop());
				m_tmpAry.add(m_tmpStack.pop());
				index++;
				continue;
			}

			// trim white-space

			if (m_formula[index] == WHITESPACE) {
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				m_tmpAry.add(MakeToken("", Token::Whitespace));
				index++;
				while ((m_formula[index] == WHITESPACE) && (index < m_formula.size())) { 
					index++;
				}
				continue;
			}

			// multi-character comparators

			if ((index + 2) <= m_formula.size()) {
				if (StrUtils::indexOf(COMPARATORS_MULTI_LEN, COMPARATORS_MULTI, m_formula.substr(index, 2).c_str()) != -1) {
					if (value.size() > 0) {
						m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
						value = "";
					}
					m_tmpAry.add(MakeToken(m_formula.substr(index, 2).c_str(), Token::OperatorInfix, Token::Logical));
					index += 2;
					continue;     
				}
			}

			// standard infix operators

			if ((OPERATORS_INFIX).find_first_of(m_formula[index]) != string::npos) {
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				char buf[2] = {0};
				buf[0] = m_formula[index];
				m_tmpAry.add(MakeToken(buf, Token::OperatorInfix));
				index++;
				continue;     
			}

			// standard postfix operators (only one)

			static string operatorsProtfixStr(OPERATORS_POSTFIX);
			if (operatorsProtfixStr.find_first_of(m_formula[index]) != string::npos) {
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				char buf[2] = {0};
				buf[0] = m_formula[index];
				m_tmpAry.add(MakeToken(buf, Token::OperatorPostfix));
				index++;
				continue;     
			}

			// start subexpression or function

			if (m_formula[index] == PAREN_OPEN) {
				if (value.size() > 0) {
					m_tmpStack.push(m_tmpAry.add(MakeToken(value.c_str(), Token::Function, Token::Start)));
					value = "";
				} else {
					m_tmpStack.push(m_tmpAry.add(MakeToken("", Token::Subexpression, Token::Start)));
				}
				index++;
				continue;
			}

			// function, subexpression, or array parameters, or operand unions

			if (m_formula[index] == COMMA) {
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				if (m_tmpStack.getCurrent()->getType() != Token::Function) {
					m_tmpAry.add(MakeToken(",", Token::OperatorInfix, Token::Union));
				} else {
					m_tmpAry.add(MakeToken(",", Token::Argument));
				}
				index++;
				continue;
			}

			// stop subexpression

			if (m_formula[index] == PAREN_CLOSE) {
				if (value.size() > 0) {
					m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
					value = "";
				}
				m_tmpAry.add(m_tmpStack.pop());
				index++;
				continue;
			}

			// token accumulation

			value += m_formula[index];
			index++;

		}

		// dump remaining accumulation

		if (value.size() > 0) {
			m_tmpAry.add(MakeToken(value.c_str(), Token::Operand));
		}

		m_tmpAry.toVector(m_tokens);

	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x128, %rsp            # imm = 0x128
cmpq $0x2, 0x8(%rdi)
jb 0x3705
movq %rdi, %rbx
movq (%rdi), %rax
cmpb $0x3d, (%rax)
jne 0x3705
leaq -0xe0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25e8(%rip), %rsi      # 0x510e
leaq 0x25e3(%rip), %rdx      # 0x5110
leaq -0xf0(%rbp), %rdi
callq 0x3f3e
leaq -0xc0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25c6(%rip), %rsi      # 0x5111
leaq 0x25c8(%rip), %rdx      # 0x511a
leaq -0xd0(%rbp), %rdi
callq 0x3f3e
leaq -0xa0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25ab(%rip), %rsi      # 0x511b
leaq 0x25a5(%rip), %rdx      # 0x511c
leaq -0xb0(%rbp), %rdi
callq 0x3f3e
movq 0x51e6(%rip), %rax      # 0x7d70
movq %rax, -0x120(%rbp)
movaps 0x51c8(%rip), %xmm0     # 0x7d60
movaps %xmm0, -0x130(%rbp)
movaps 0x51aa(%rip), %xmm0     # 0x7d50
movaps %xmm0, -0x140(%rbp)
movaps 0x518c(%rip), %xmm0     # 0x7d40
movaps %xmm0, -0x150(%rbp)
movq 0x51ce(%rip), %rax      # 0x7d90
movq %rax, -0x100(%rbp)
movaps 0x51b0(%rip), %xmm0     # 0x7d80
movaps %xmm0, -0x110(%rbp)
leaq -0x50(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x2606(%rip), %rdx      # 0x51ec
leaq -0x60(%rbp), %rdi
movq %rdx, %rsi
callq 0x3f3e
movq 0x8(%rbx), %rax
cmpq $0x2, %rax
movq %rbx, %rcx
jb 0x3655
leaq 0x38(%rcx), %rdx
movq %rdx, -0x38(%rbp)
leaq 0x58(%rcx), %rdx
movq %rdx, -0x68(%rbp)
movl $0x1, %edx
movq %rdx, -0x30(%rbp)
movl $0x1, %r12d
movq $0x0, -0x40(%rbp)
xorl %r13d, %r13d
xorl %ebx, %ebx
xorl %r15d, %r15d
movq %rcx, -0x70(%rbp)
movq (%rcx), %rcx
movb (%rcx,%r12), %r14b
testb $0x1, %r15b
je 0x2c8c
cmpb $0x22, %r14b
jne 0x2cd9
movq -0x30(%rbp), %rsi
leal 0x2(%rsi), %edx
movslq %edx, %rdx
cmpq %rdx, %rax
jb 0x2d1e
movslq %esi, %r14
cmpb $0x22, 0x1(%rcx,%r14)
jne 0x2d1e
leaq -0x60(%rbp), %rdi
movl $0x22, %esi
callq 0x2140
incq %r14
movb $0x1, %r15b
movq %r14, -0x30(%rbp)
jmp 0x2d56
testb $0x1, %bl
je 0x2ceb
cmpb $0x27, %r14b
jne 0x2d65
movq -0x30(%rbp), %rsi
leal 0x2(%rsi), %edx
movslq %edx, %rdx
cmpq %rdx, %rax
jb 0x2dfb
movslq %esi, %r14
cmpb $0x27, 0x1(%rcx,%r14)
jne 0x2dfb
leaq -0x60(%rbp), %rdi
movl $0x27, %esi
callq 0x2140
incq %r14
movb $0x1, %bl
movq %r14, -0x30(%rbp)
jmp 0x2dfd
movb $0x1, %r15b
movsbl %r14b, %esi
leaq -0x60(%rbp), %rdi
callq 0x2140
jmp 0x2d56
movsbl %r14b, %esi
testb $0x1, %r13b
je 0x2d79
leaq -0x60(%rbp), %rdi
callq 0x2140
cmpb $0x5d, %r14b
setne %r13b
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
xorl %r15d, %r15d
xorl %ebx, %ebx
jmp 0x2e0a
movq -0x60(%rbp), %rdi
xorl %esi, %esi
movl $0x3, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
xorl %r15d, %r15d
movq -0x58(%rbp), %rdx
leaq -0x60(%rbp), %rdi
xorl %esi, %esi
leaq 0x249e(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
jmp 0x2e0a
movb $0x1, %bl
movsbl %r14b, %esi
leaq -0x60(%rbp), %rdi
callq 0x2140
jmp 0x2dfd
testb $0x1, -0x40(%rbp)
je 0x2e24
leaq -0x60(%rbp), %rdi
callq 0x2140
movq -0x60(%rbp), %rdx
movl $0x7, %edi
leaq -0x150(%rbp), %rsi
callq 0x40d2
movq -0x30(%rbp), %rcx
incl %ecx
movq %rcx, -0x30(%rbp)
cmpl $-0x1, %eax
je 0x30ff
movq -0x60(%rbp), %rdi
xorl %esi, %esi
movl $0x6, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
xorl %r15d, %r15d
movq -0x58(%rbp), %rdx
leaq -0x60(%rbp), %rdi
xorl %esi, %esi
leaq 0x2408(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
xorl %ebx, %ebx
xorl %r13d, %r13d
movq $0x0, -0x40(%rbp)
jmp 0x2e0a
xorl %ebx, %ebx
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
xorl %r15d, %r15d
movslq -0x30(%rbp), %r12
movq -0x70(%rbp), %rcx
movq 0x8(%rcx), %rax
cmpq %r12, %rax
ja 0x2c36
jmp 0x3655
leaq -0xf0(%rbp), %rdi
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
movq -0x70(%rbp), %rbx
je 0x2ea9
cmpq $0x2, -0x58(%rbp)
jb 0x2ea9
movq 0xa8(%rbx), %r15
movq -0x60(%rbp), %rdi
movq %rdi, -0x90(%rbp)
callq 0x20c0
movl %eax, -0x88(%rbp)
movq %r15, %rdi
leaq -0x90(%rbp), %rsi
movq 0x515f(%rip), %rcx      # 0x7fd0
movq %rcx, %rdx
movq %rcx, %r8
movq %rcx, %r9
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
pushq %rcx
callq 0x2090
addq $0x60, %rsp
testb %al, %al
je 0x2ea9
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
leaq -0x60(%rbp), %rdi
callq 0x2140
jmp 0x345b
movq (%rbx), %rax
movb (%rax,%r12), %al
movzbl %al, %ecx
cmpl $0x3a, %ecx
jg 0x2f71
addl $-0x20, %ecx
cmpl $0x7, %ecx
ja 0x3237
leaq 0x21cd(%rip), %rdx      # 0x509c
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
cmpq $0x0, -0x58(%rbp)
je 0x2f06
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x22eb(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq 0x22df(%rip), %rdi      # 0x51ec
movl $0x7, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x70(%rbp), %rcx
movq (%rcx), %rax
movq 0x8(%rcx), %rcx
movslq -0x30(%rbp), %rdx
incq %rdx
movq -0x30(%rbp), %rsi
incl %esi
movq %rsi, -0x30(%rbp)
xorl %r15d, %r15d
cmpb $0x20, (%rax,%rdx)
jne 0x3468
leaq 0x1(%rdx), %rsi
movl $0x0, %ebx
movl $0x0, %r13d
movl $0x0, %edi
movq %rdi, -0x40(%rbp)
cmpq %rdx, %rcx
movq %rsi, %rdx
ja 0x2f35
jmp 0x2e0a
cmpl $0x7a, %ecx
jg 0x2fad
cmpl $0x3b, %ecx
je 0x3112
cmpl $0x5b, %ecx
jne 0x3237
leaq -0x60(%rbp), %rdi
movl $0x5b, %esi
callq 0x2140
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
movb $0x1, %r13b
xorl %r15d, %r15d
xorl %ebx, %ebx
jmp 0x346d
cmpl $0x7b, %ecx
je 0x31a5
cmpl $0x7d, %ecx
jne 0x3237
cmpq $0x0, -0x58(%rbp)
je 0x2fed
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x2204(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x68(%rbp), %rdi
callq 0x47a2
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
callq 0x47a2
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
jmp 0x345b
cmpq $0x0, -0x58(%rbp)
je 0x3056
movq -0x60(%rbp), %rdi
movl $0x8, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x58(%rbp), %rdx
leaq -0x60(%rbp), %rdi
xorl %esi, %esi
leaq 0x219e(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
movb $0x1, %bl
xorl %r15d, %r15d
jmp 0x346a
cmpq $0x0, -0x58(%rbp)
je 0x30a4
movq -0x60(%rbp), %rdi
movl $0x8, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x58(%rbp), %rdx
leaq -0x60(%rbp), %rdi
xorl %esi, %esi
leaq 0x2150(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
movb $0x1, %r15b
jmp 0x3468
cmpq $0x0, -0x58(%rbp)
je 0x30e7
movq -0x60(%rbp), %rdi
movl $0x8, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x210a(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq -0x60(%rbp), %rdi
movl $0x23, %esi
callq 0x2140
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
movb $0x1, %al
movq %rax, -0x40(%rbp)
xorl %r15d, %r15d
xorl %ebx, %ebx
xorl %r13d, %r13d
jmp 0x2e0a
cmpq $0x0, -0x58(%rbp)
je 0x3140
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x20b1(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x68(%rbp), %rdi
callq 0x47a2
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq 0x2005(%rip), %rdi      # 0x5161
movl $0x3, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq 0x1fdf(%rip), %rdi      # 0x5158
movl $0x1, %esi
movl $0x1, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x476c
jmp 0x345b
cmpq $0x0, -0x58(%rbp)
je 0x31d6
movq -0x60(%rbp), %rdi
movl $0x8, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x201b(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq 0x1f75(%rip), %rdi      # 0x5152
movl $0x1, %esi
movl $0x1, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x476c
leaq 0x1f4d(%rip), %rdi      # 0x5158
movl $0x1, %esi
movl $0x1, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x476c
jmp 0x345b
movq -0x30(%rbp), %rcx
leal 0x2(%rcx), %r14d
movslq %r14d, %rcx
cmpq %rcx, 0x8(%rbx)
jb 0x3347
movl $0x2, %ecx
leaq -0x90(%rbp), %rdi
movq %rbx, %rsi
movq %r12, %rdx
callq 0x2190
movq -0x90(%rbp), %rdx
movl $0x3, %edi
leaq -0x110(%rbp), %rsi
callq 0x40d2
movl %eax, %r15d
movq -0x90(%rbp), %rdi
leaq -0x80(%rbp), %rax
cmpq %rax, %rdi
je 0x329a
movq -0x80(%rbp), %rsi
incq %rsi
callq 0x2180
cmpl $-0x1, %r15d
je 0x3340
cmpq $0x0, -0x58(%rbp)
je 0x32d2
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x1f1f(%rip), %rsi      # 0x51ec
callq 0x21c0
movl $0x2, %ecx
leaq -0x90(%rbp), %rdi
movq -0x70(%rbp), %rsi
movq %r12, %rdx
callq 0x2190
movq -0x90(%rbp), %rdi
movl $0x5, %esi
movl $0x5, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x90(%rbp), %rdi
leaq -0x80(%rbp), %rax
cmpq %rax, %rdi
je 0x3328
movq -0x80(%rbp), %rsi
incq %rsi
callq 0x2180
xorl %r15d, %r15d
xorl %ebx, %ebx
xorl %r13d, %r13d
movq $0x0, -0x40(%rbp)
movl %r14d, %eax
jmp 0x2d5c
movq (%rbx), %rax
movb (%rax,%r12), %al
movsbl %al, %esi
leaq -0xd0(%rbp), %rdi
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
je 0x33c8
cmpq $0x0, -0x58(%rbp)
je 0x338c
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x1e65(%rip), %rsi      # 0x51ec
callq 0x21c0
movw $0x0, -0x90(%rbp)
movq -0x70(%rbp), %rax
movq (%rax), %rax
movb (%rax,%r12), %al
movb %al, -0x90(%rbp)
leaq -0x90(%rbp), %rdi
movl $0x5, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
jmp 0x345b
movb 0x4dba(%rip), %al       # 0x8188
testb %al, %al
je 0x35e7
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
leaq 0x4d83(%rip), %rdi      # 0x8168
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
je 0x347a
cmpq $0x0, -0x58(%rbp)
je 0x3424
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x1dcd(%rip), %rsi      # 0x51ec
callq 0x21c0
movw $0x0, -0x90(%rbp)
movq -0x70(%rbp), %rax
movq (%rax), %rax
movb (%rax,%r12), %al
movb %al, -0x90(%rbp)
leaq -0x90(%rbp), %rdi
movl $0x6, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x30(%rbp), %rax
incl %eax
movq %rax, -0x30(%rbp)
xorl %r15d, %r15d
xorl %ebx, %ebx
xorl %r13d, %r13d
movq $0x0, -0x40(%rbp)
jmp 0x2e0a
movq (%rbx), %rax
movzbl (%rax,%r12), %eax
cmpl $0x2c, %eax
je 0x352c
cmpl $0x29, %eax
je 0x34e4
cmpl $0x28, %eax
jne 0x357c
cmpq $0x0, -0x58(%rbp)
je 0x35b4
movq -0x60(%rbp), %rdi
movl $0x1, %esi
movl $0x1, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x476c
leaq -0x60(%rbp), %rdi
leaq 0x1d12(%rip), %rsi      # 0x51ec
callq 0x21c0
jmp 0x345b
cmpq $0x0, -0x58(%rbp)
je 0x3512
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x1cdf(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x68(%rbp), %rdi
callq 0x47a2
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
jmp 0x345b
cmpq $0x0, -0x58(%rbp)
je 0x355a
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
leaq -0x60(%rbp), %rdi
leaq 0x1c97(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x68(%rbp), %rdi
callq 0x47f2
cmpl $0x1, 0x20(%rax)
jne 0x358d
leaq 0x1bf1(%rip), %rdi      # 0x5161
movl $0x3, %esi
callq 0x4328
jmp 0x35a3
movsbl %al, %esi
leaq -0x60(%rbp), %rdi
callq 0x2140
jmp 0x345b
leaq 0x1bcd(%rip), %rdi      # 0x5161
movl $0x5, %esi
movl $0xb, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
jmp 0x345b
leaq 0x1c31(%rip), %rdi      # 0x51ec
movl $0x2, %esi
movl $0x1, %edx
callq 0x4298
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x4470
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x476c
jmp 0x345b
leaq 0x4b9a(%rip), %rdi      # 0x8188
callq 0x2270
testl %eax, %eax
je 0x33d6
leaq 0x4b76(%rip), %rax      # 0x8178
movq %rax, 0x4b5f(%rip)      # 0x8168
movq -0xb0(%rbp), %rsi
movq -0xa8(%rbp), %rdx
addq %rsi, %rdx
leaq 0x4b47(%rip), %rdi      # 0x8168
callq 0x3ea0
movq 0x4993(%rip), %rdi      # 0x7fc0
leaq 0x4b34(%rip), %rsi      # 0x8168
leaq 0x4b15(%rip), %rdx      # 0x8150
callq 0x2150
leaq 0x4b41(%rip), %rdi      # 0x8188
callq 0x20f0
movq -0x70(%rbp), %rbx
jmp 0x33d6
cmpq $0x0, -0x58(%rbp)
movq %rcx, %rbx
je 0x3676
movq -0x60(%rbp), %rdi
xorl %esi, %esi
callq 0x4328
leaq 0x38(%rbx), %rdi
movq %rax, %rsi
callq 0x4470
leaq 0x38(%rbx), %rdi
addq $0x20, %rbx
movq %rbx, %rsi
callq 0x44d4
movq -0x60(%rbp), %rdi
leaq -0x50(%rbp), %rax
cmpq %rax, %rdi
leaq -0xe0(%rbp), %rbx
leaq -0xc0(%rbp), %r14
leaq -0xa0(%rbp), %r15
je 0x36b4
movq -0x50(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xb0(%rbp), %rdi
cmpq %r15, %rdi
je 0x36cf
movq -0xa0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xd0(%rbp), %rdi
cmpq %r14, %rdi
je 0x36ea
movq -0xc0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xf0(%rbp), %rdi
cmpq %rbx, %rdi
je 0x3705
movq -0xe0(%rbp), %rsi
incq %rsi
callq 0x2180
addq $0x128, %rsp            # imm = 0x128
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq 0x4a67(%rip), %rdi      # 0x8188
callq 0x20e0
jmp 0x3769
jmp 0x3766
jmp 0x3766
jmp 0x3730
jmp 0x3766
movq %rax, %rbx
movq -0x90(%rbp), %rdi
leaq -0x80(%rbp), %rax
cmpq %rax, %rdi
je 0x3769
movq -0x80(%rbp), %rsi
incq %rsi
callq 0x2180
jmp 0x3769
jmp 0x3766
jmp 0x3766
movq %rax, %rbx
jmp 0x3782
movq %rax, %rbx
jmp 0x37a4
movq %rax, %rbx
jmp 0x37c6
jmp 0x3766
movq %rax, %rbx
movq -0x60(%rbp), %rdi
leaq -0x50(%rbp), %rax
cmpq %rax, %rdi
je 0x3782
movq -0x50(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xb0(%rbp), %rdi
leaq -0xa0(%rbp), %rax
cmpq %rax, %rdi
je 0x37a4
movq -0xa0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xd0(%rbp), %rdi
leaq -0xc0(%rbp), %rax
cmpq %rax, %rdi
je 0x37c6
movq -0xc0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xf0(%rbp), %rdi
leaq -0xe0(%rbp), %rax
cmpq %rax, %rdi
je 0x37e8
movq -0xe0(%rbp), %rsi
incq %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x2250