// File: /workspace/github_cpp_makefile_star2_O1/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 0x3618
movq %rdi, %rbx
movq (%rdi), %rax
cmpb $0x3d, (%rax)
jne 0x3618
leaq -0xe0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25f4(%rip), %rsi      # 0x510e
leaq 0x25ef(%rip), %rdx      # 0x5110
leaq -0xf0(%rbp), %rdi
callq 0x3eda
leaq -0xc0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25d2(%rip), %rsi      # 0x5111
leaq 0x25d4(%rip), %rdx      # 0x511a
leaq -0xd0(%rbp), %rdi
callq 0x3eda
leaq -0xa0(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x25b7(%rip), %rsi      # 0x511b
leaq 0x25b1(%rip), %rdx      # 0x511c
leaq -0xb0(%rbp), %rdi
callq 0x3eda
movq 0x51f2(%rip), %rax      # 0x7d70
movq %rax, -0x120(%rbp)
movaps 0x51d4(%rip), %xmm0     # 0x7d60
movaps %xmm0, -0x130(%rbp)
movaps 0x51b6(%rip), %xmm0     # 0x7d50
movaps %xmm0, -0x140(%rbp)
movaps 0x5198(%rip), %xmm0     # 0x7d40
movaps %xmm0, -0x150(%rbp)
movq 0x51da(%rip), %rax      # 0x7d90
movq %rax, -0x100(%rbp)
movaps 0x51bc(%rip), %xmm0     # 0x7d80
movaps %xmm0, -0x110(%rbp)
leaq -0x40(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x2612(%rip), %rdx      # 0x51ec
leaq -0x50(%rbp), %rdi
movq %rdx, %rsi
callq 0x3eda
movq 0x8(%rbx), %rax
cmpq $0x2, %rax
jb 0x356b
leaq 0x38(%rbx), %rcx
movq %rcx, -0x30(%rbp)
leaq 0x58(%rbx), %rcx
movq %rcx, -0x58(%rbp)
movl $0x1, %r14d
movl $0x1, %r12d
movq $0x0, -0x88(%rbp)
movl $0x0, -0x5c(%rbp)
movl $0x0, -0x60(%rbp)
xorl %r13d, %r13d
testb $0x1, %r13b
je 0x2c6d
movq (%rbx), %rcx
movb (%rcx,%r12), %dl
cmpb $0x22, %dl
jne 0x2cbb
leal 0x2(%r14), %edx
movslq %edx, %rdx
cmpq %rdx, %rax
jb 0x2d00
movslq %r14d, %r15
cmpb $0x22, 0x1(%rcx,%r15)
jne 0x2d00
leaq -0x50(%rbp), %rdi
movl $0x22, %esi
callq 0x2140
jmp 0x2cb0
testb $0x1, -0x60(%rbp)
je 0x2ccc
movq (%rbx), %rcx
movb (%rcx,%r12), %dl
cmpb $0x27, %dl
jne 0x2d3d
leal 0x2(%r14), %edx
movslq %edx, %rdx
cmpq %rdx, %rax
jb 0x2dcb
movslq %r14d, %r15
cmpb $0x27, 0x1(%rcx,%r15)
jne 0x2dcb
leaq -0x50(%rbp), %rdi
movl $0x27, %esi
callq 0x2140
incq %r15
movl %r15d, %r14d
jmp 0x2dd2
movsbl %dl, %esi
leaq -0x50(%rbp), %rdi
callq 0x2140
jmp 0x2dd2
testb $0x1, -0x5c(%rbp)
je 0x2d4e
movq (%rbx), %rax
movb (%rax,%r12), %r15b
movsbl %r15b, %esi
leaq -0x50(%rbp), %rdi
callq 0x2140
cmpb $0x5d, %r15b
movl -0x5c(%rbp), %ecx
movzbl %cl, %ecx
movl $0x0, %eax
cmovel %eax, %ecx
movl %ecx, -0x5c(%rbp)
jmp 0x2dd2
movq -0x50(%rbp), %rdi
xorl %esi, %esi
movl $0x3, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
xorl %r13d, %r13d
movq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rdi
xorl %esi, %esi
leaq 0x24bc(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
jmp 0x2dd2
movsbl %dl, %esi
leaq -0x50(%rbp), %rdi
callq 0x2140
jmp 0x2dd2
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
testb $0x1, -0x88(%rbp)
je 0x2dea
leaq -0x50(%rbp), %rdi
callq 0x2140
movq -0x50(%rbp), %rdx
movl $0x7, %edi
leaq -0x150(%rbp), %rsi
callq 0x40a0
incl %r14d
cmpl $-0x1, %eax
je 0x2dd5
movq -0x50(%rbp), %rdi
xorl %esi, %esi
movl $0x6, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq $0x0, -0x88(%rbp)
movq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rdi
xorl %esi, %esi
leaq 0x242b(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
jmp 0x2dd5
movl $0x0, -0x60(%rbp)
incl %r14d
movslq %r14d, %r12
movq 0x8(%rbx), %rax
cmpq %r12, %rax
ja 0x2c2c
jmp 0x356b
leaq -0xf0(%rbp), %rdi
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
je 0x2e62
cmpq $0x2, -0x48(%rbp)
jb 0x2e62
movq 0xa8(%rbx), %r15
movq -0x50(%rbp), %rdi
movq %rdi, -0x80(%rbp)
callq 0x20c0
movl %eax, -0x78(%rbp)
movq %r15, %rdi
leaq -0x80(%rbp), %rsi
movq 0x51a6(%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 0x2e62
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
leaq -0x50(%rbp), %rdi
callq 0x2140
jmp 0x2dd2
movq (%rbx), %rax
movzbl (%rax,%r12), %eax
cmpl $0x3a, %eax
jg 0x2f05
addl $-0x20, %eax
cmpl $0x7, %eax
ja 0x31a7
leaq 0x2216(%rip), %rcx      # 0x509c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpq $0x0, -0x48(%rbp)
je 0x2ebd
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x2334(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq 0x2328(%rip), %rdi      # 0x51ec
movl $0x7, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq (%rbx), %rax
movq 0x8(%rbx), %rcx
movslq %r14d, %rdx
incq %rdx
incl %r14d
cmpb $0x20, (%rax,%rdx)
jne 0x2dd5
leaq 0x1(%rdx), %rsi
cmpq %rdx, %rcx
movq %rsi, %rdx
ja 0x2ee7
jmp 0x2dd5
cmpl $0x7a, %eax
jg 0x2f37
cmpl $0x3b, %eax
je 0x3082
cmpl $0x5b, %eax
jne 0x31a7
leaq -0x50(%rbp), %rdi
movl $0x5b, %esi
callq 0x2140
incl %r14d
movb $0x1, %al
movl %eax, -0x5c(%rbp)
jmp 0x2dd5
cmpl $0x7b, %eax
je 0x3115
cmpl $0x7d, %eax
jne 0x31a7
cmpq $0x0, -0x48(%rbp)
je 0x2f77
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x227a(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x58(%rbp), %rdi
callq 0x476a
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
callq 0x476a
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
jmp 0x2dd2
cmpq $0x0, -0x48(%rbp)
je 0x2fe0
movq -0x50(%rbp), %rdi
movl $0x8, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rdi
xorl %esi, %esi
leaq 0x2214(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
incl %r14d
movb $0x1, %al
movl %eax, -0x60(%rbp)
jmp 0x2dd5
cmpq $0x0, -0x48(%rbp)
je 0x3027
movq -0x50(%rbp), %rdi
movl $0x8, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rdi
xorl %esi, %esi
leaq 0x21cd(%rip), %rcx      # 0x51ec
xorl %r8d, %r8d
callq 0x2210
incl %r14d
movb $0x1, %r13b
jmp 0x2dd5
cmpq $0x0, -0x48(%rbp)
je 0x3063
movq -0x50(%rbp), %rdi
movl $0x8, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x218e(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq -0x50(%rbp), %rdi
movl $0x23, %esi
callq 0x2140
incl %r14d
movb $0x1, %al
movq %rax, -0x88(%rbp)
jmp 0x2dd5
cmpq $0x0, -0x48(%rbp)
je 0x30b0
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x2141(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x58(%rbp), %rdi
callq 0x476a
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq 0x2095(%rip), %rdi      # 0x5161
movl $0x3, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq 0x206f(%rip), %rdi      # 0x5158
movl $0x1, %esi
movl $0x1, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0x4734
jmp 0x2dd2
cmpq $0x0, -0x48(%rbp)
je 0x3146
movq -0x50(%rbp), %rdi
movl $0x8, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x20ab(%rip), %rsi      # 0x51ec
callq 0x21c0
leaq 0x2005(%rip), %rdi      # 0x5152
movl $0x1, %esi
movl $0x1, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0x4734
leaq 0x1fdd(%rip), %rdi      # 0x5158
movl $0x1, %esi
movl $0x1, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0x4734
jmp 0x2dd2
leal 0x2(%r14), %eax
movl %eax, -0x8c(%rbp)
cltq
cmpq %rax, 0x8(%rbx)
jb 0x3294
movl $0x2, %ecx
leaq -0x80(%rbp), %rdi
movq %rbx, %rsi
movq %r12, %rdx
callq 0x2190
movq -0x80(%rbp), %rdx
movl $0x3, %edi
leaq -0x110(%rbp), %rsi
callq 0x40a0
movl %eax, %r15d
movq -0x80(%rbp), %rdi
leaq -0x70(%rbp), %rax
cmpq %rax, %rdi
je 0x3202
movq -0x70(%rbp), %rsi
incq %rsi
callq 0x2180
cmpl $-0x1, %r15d
je 0x3294
cmpq $0x0, -0x48(%rbp)
je 0x323a
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x1fb7(%rip), %rsi      # 0x51ec
callq 0x21c0
movl $0x2, %ecx
leaq -0x80(%rbp), %rdi
movq %rbx, %rsi
movq %r12, %rdx
callq 0x2190
movq -0x80(%rbp), %rdi
movl $0x5, %esi
movl $0x5, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x80(%rbp), %rdi
leaq -0x70(%rbp), %rax
cmpq %rax, %rdi
je 0x3286
movq -0x70(%rbp), %rsi
incq %rsi
callq 0x2180
movl -0x8c(%rbp), %eax
movl %eax, %r14d
jmp 0x2dd5
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
leaq -0xd0(%rbp), %rdi
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
je 0x330d
cmpq $0x0, -0x48(%rbp)
je 0x32de
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x1f13(%rip), %rsi      # 0x51ec
callq 0x21c0
movw $0x0, -0x80(%rbp)
movq (%rbx), %rax
movb (%rax,%r12), %al
movb %al, -0x80(%rbp)
leaq -0x80(%rbp), %rdi
movl $0x5, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
jmp 0x2dd2
movb 0x4e75(%rip), %al       # 0x8188
testb %al, %al
je 0x3501
movq (%rbx), %rax
movsbl (%rax,%r12), %esi
leaq 0x4e3e(%rip), %rdi      # 0x8168
xorl %edx, %edx
callq 0x21b0
cmpq $-0x1, %rax
je 0x3394
cmpq $0x0, -0x48(%rbp)
je 0x3365
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x1e8c(%rip), %rsi      # 0x51ec
callq 0x21c0
movw $0x0, -0x80(%rbp)
movq (%rbx), %rax
movb (%rax,%r12), %al
movb %al, -0x80(%rbp)
leaq -0x80(%rbp), %rdi
movl $0x6, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
jmp 0x2dd2
movq (%rbx), %rax
movzbl (%rax,%r12), %eax
cmpl $0x2c, %eax
je 0x3446
cmpl $0x29, %eax
je 0x33fe
cmpl $0x28, %eax
jne 0x3496
cmpq $0x0, -0x48(%rbp)
je 0x34ce
movq -0x50(%rbp), %rdi
movl $0x1, %esi
movl $0x1, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0x4734
leaq -0x50(%rbp), %rdi
leaq 0x1df8(%rip), %rsi      # 0x51ec
callq 0x21c0
jmp 0x2dd2
cmpq $0x0, -0x48(%rbp)
je 0x342c
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x1dc5(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x58(%rbp), %rdi
callq 0x476a
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
jmp 0x2dd2
cmpq $0x0, -0x48(%rbp)
je 0x3474
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
leaq -0x50(%rbp), %rdi
leaq 0x1d7d(%rip), %rsi      # 0x51ec
callq 0x21c0
movq -0x58(%rbp), %rdi
callq 0x47ba
cmpl $0x1, 0x20(%rax)
jne 0x34a7
leaq 0x1cd7(%rip), %rdi      # 0x5161
movl $0x3, %esi
callq 0x42f8
jmp 0x34bd
movsbl %al, %esi
leaq -0x50(%rbp), %rdi
callq 0x2140
jmp 0x2dd2
leaq 0x1cb3(%rip), %rdi      # 0x5161
movl $0x5, %esi
movl $0xb, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
jmp 0x2dd2
leaq 0x1d17(%rip), %rdi      # 0x51ec
movl $0x2, %esi
movl $0x1, %edx
callq 0x4268
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x4444
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0x4734
jmp 0x2dd2
leaq 0x4c80(%rip), %rdi      # 0x8188
callq 0x2270
testl %eax, %eax
je 0x331b
leaq 0x4c5c(%rip), %rax      # 0x8178
movq %rax, 0x4c45(%rip)      # 0x8168
movq -0xb0(%rbp), %rsi
movq -0xa8(%rbp), %rdx
addq %rsi, %rdx
leaq 0x4c2d(%rip), %rdi      # 0x8168
callq 0x3e40
movq 0x4a79(%rip), %rdi      # 0x7fc0
leaq 0x4c1a(%rip), %rsi      # 0x8168
leaq 0x4bfb(%rip), %rdx      # 0x8150
callq 0x2150
leaq 0x4c27(%rip), %rdi      # 0x8188
callq 0x20f0
jmp 0x331b
cmpq $0x0, -0x48(%rbp)
je 0x3589
movq -0x50(%rbp), %rdi
xorl %esi, %esi
callq 0x42f8
leaq 0x38(%rbx), %rdi
movq %rax, %rsi
callq 0x4444
leaq 0x38(%rbx), %rdi
addq $0x20, %rbx
movq %rbx, %rsi
callq 0x44a6
movq -0x50(%rbp), %rdi
leaq -0x40(%rbp), %rax
cmpq %rax, %rdi
leaq -0xe0(%rbp), %rbx
leaq -0xc0(%rbp), %r14
je 0x35c0
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xb0(%rbp), %rdi
leaq -0xa0(%rbp), %rax
cmpq %rax, %rdi
je 0x35e2
movq -0xa0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xd0(%rbp), %rdi
cmpq %r14, %rdi
je 0x35fd
movq -0xc0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xf0(%rbp), %rdi
cmpq %rbx, %rdi
je 0x3618
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 0x4b54(%rip), %rdi      # 0x8188
callq 0x20e0
jmp 0x3679
jmp 0x3676
jmp 0x3676
jmp 0x3643
jmp 0x3676
movq %rax, %rbx
movq -0x80(%rbp), %rdi
leaq -0x70(%rbp), %rax
cmpq %rax, %rdi
je 0x3679
movq -0x70(%rbp), %rsi
incq %rsi
callq 0x2180
jmp 0x3679
jmp 0x3676
jmp 0x3676
movq %rax, %rbx
jmp 0x3692
movq %rax, %rbx
jmp 0x36b4
movq %rax, %rbx
jmp 0x36d6
jmp 0x3676
movq %rax, %rbx
movq -0x50(%rbp), %rdi
leaq -0x40(%rbp), %rax
cmpq %rax, %rdi
je 0x3692
movq -0x40(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xb0(%rbp), %rdi
leaq -0xa0(%rbp), %rax
cmpq %rax, %rdi
je 0x36b4
movq -0xa0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xd0(%rbp), %rdi
leaq -0xc0(%rbp), %rax
cmpq %rax, %rdi
je 0x36d6
movq -0xc0(%rbp), %rsi
incq %rsi
callq 0x2180
movq -0xf0(%rbp), %rdi
leaq -0xe0(%rbp), %rax
cmpq %rax, %rdi
je 0x36f8
movq -0xe0(%rbp), %rsi
incq %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x2250