// File: AshOlogn[P]ash-language-interpreter/src/parser.cpp
// Function: evalAssignment()
AbstractExpressionNode* evalAssignment() {
  
  AbstractExpressionNode* head = evalLogicOr();
  VariableNode* var = dynamic_cast<VariableNode*>(head);
	ArrayAccessNode* arrVar = dynamic_cast<ArrayAccessNode*>(head);
  
  if((var || arrVar) && isAssignmentOperatorTokenType(peek()->type)) {
  
    //if just variable, make sure it is already declared in some scope
		if(var && !symbolTable->isDeclared(var->variable)) {
      throw StaticVariableScopeError(var->startLine, var->variable, getCodeLineBlock(var->startLine-1, var->startLine-1), false);
		}
    
    //get variable's type
    ParseDataType type = head->evalType;
    
    Token* assignmentToken = consume();
    AbstractExpressionNode* next = evalAssignment();
		
		//make sure the assignment operation is even valid
		if(assignmentToken->type != EQ) {

			ParseOperatorType opType;
			switch(assignmentToken->type) {
				case ADD_EQ: opType = ADD_OP; break;
				case SUBTRACT_EQ: opType = SUBTRACT_OP; break;
				case EXPONENT_EQ: opType = EXPONENT_OP; break;
				case MULTIPLY_EQ: opType = MULTIPLY_OP; break;
				case DIVIDE_EQ: opType = DIVIDE_OP; break;
				case AND_EQ: opType = AND_OP; break;
				case XOR_EQ: opType = XOR_OP; break;
				case OR_EQ: opType = OR_OP; break;
				default: opType = INVALID_OP;
			}

			if(isArithmeticParseOperatorType(opType)) {

				if(!typecheckArithmeticExpression(opType, type, next->evalType)) {
					uint32_t startLine = head->startLine;
					throw StaticTypeError(startLine, next->endLine, getCodeLineBlock(startLine-1, next->endLine-1), 
																toStringParseOperatorType(opType), type, next->evalType); 
				}

			} else {

				if(!typecheckBitLogicalExpression(opType, type, next->evalType)) {
					uint32_t startLine = head->startLine;
					throw StaticTypeError(startLine, next->endLine, getCodeLineBlock(startLine-1, next->endLine-1), 
																toStringParseOperatorType(opType), type, next->evalType); 
				}
			}
		}
    
    switch(assignmentToken->type) {
      case EQ: break;
      case ADD_EQ: next = new ArithmeticOperatorNode(ADD_OP, head, next); break; 
      case SUBTRACT_EQ: next = new ArithmeticOperatorNode(SUBTRACT_OP, head, next); break;
      case EXPONENT_EQ: next = new ArithmeticOperatorNode(EXPONENT_OP, head, next); break;
      case MULTIPLY_EQ: next = new ArithmeticOperatorNode(MULTIPLY_OP, head, next); break;
      case DIVIDE_EQ: next = new ArithmeticOperatorNode(DIVIDE_OP, head, next); break;
      case AND_EQ: {
        if(type == BOOL_T)
          next = new BitLogicalOperatorNode(AND_OP, head, next);
        else 
          next = new BitLogicalOperatorNode(BIT_AND_OP, head, next);
        break;
      }
      
      case XOR_EQ: {
        if(type == BOOL_T)
          next = new BitLogicalOperatorNode(XOR_OP, head, next);
        else 
          next = new BitLogicalOperatorNode(BIT_XOR_OP, head, next);
        break;
      }
      
      case OR_EQ: {
        if(type == BOOL_T)
          next = new BitLogicalOperatorNode(OR_OP, head, next);
        else 
          next = new BitLogicalOperatorNode(BIT_OR_OP, head, next);
        break;
      }
    }
    
    //now make sure that implicit type cast is valid
    if(!typecheckImplicitCastExpression(next->evalType, type)) {
      throw StaticCastError(head->startLine, next->endLine, getCodeLineBlock(head->startLine-1, next->endLine-1), next->evalType, type, false);
    }
    
		if(var) {
			return new AssignmentExpressionNode(var->variable, type, next, symbolTable, var->startLine);
		} else {
			return new ArrayAssignmentExpressionNode(arrVar->array, arrVar->start, next, getCodeLineBlock(arrVar->startLine-1, next->endLine-1), symbolTable);
		}
    
  } else {
    return head;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x210, %rsp            # imm = 0x210
callq 0x390d0
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xd0(%rbp)
cmpq $0x0, %rax
je 0x3926c
movq -0xd0(%rbp), %rdi
leaq 0x1a87d(%rip), %rsi     # 0x53ad0
leaq 0x1a816(%rip), %rdx     # 0x53a70
xorl %eax, %eax
movl %eax, %ecx
callq 0x42b0
movq %rax, -0xd8(%rbp)
jmp 0x39277
xorl %eax, %eax
movq %rax, -0xd8(%rbp)
jmp 0x39277
movq -0xd8(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
cmpq $0x0, %rax
je 0x392ba
movq -0xe0(%rbp), %rdi
leaq 0x1a82f(%rip), %rsi     # 0x53ad0
leaq 0x1a798(%rip), %rdx     # 0x53a40
xorl %eax, %eax
movl %eax, %ecx
callq 0x42b0
movq %rax, -0xe8(%rbp)
jmp 0x392c5
xorl %eax, %eax
movq %rax, -0xe8(%rbp)
jmp 0x392c5
movq -0xe8(%rbp), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x392e2
cmpq $0x0, -0x20(%rbp)
je 0x39dda
callq 0x2fe60
movl (%rax), %edi
callq 0x8440
testb $0x1, %al
jne 0x392f7
jmp 0x39dda
movq -0x18(%rbp), %rcx
movb $0x0, -0x41(%rbp)
xorl %eax, %eax
cmpq $0x0, %rcx
movb %al, -0xe9(%rbp)
je 0x39360
movq 0x1b0fc(%rip), %rax     # 0x54410
movq %rax, -0x100(%rbp)
movq -0x18(%rbp), %rsi
addq $0x20, %rsi
leaq -0x40(%rbp), %rdi
movq %rdi, -0xf8(%rbp)
callq 0x40f0
movq -0x100(%rbp), %rdi
movq -0xf8(%rbp), %rsi
movb $0x1, -0x41(%rbp)
callq 0x2bf50
movb %al, -0xea(%rbp)
jmp 0x39352
movb -0xea(%rbp), %al
xorb $-0x1, %al
movb %al, -0xe9(%rbp)
movb -0xe9(%rbp), %al
movb %al, -0x101(%rbp)
testb $0x1, -0x41(%rbp)
jne 0x39374
jmp 0x3937d
leaq -0x40(%rbp), %rdi
callq 0x4170
movb -0x101(%rbp), %al
testb $0x1, %al
jne 0x3938c
jmp 0x39479
movb $0x1, -0x79(%rbp)
movl $0x38, %edi
callq 0x4130
movq %rax, -0x110(%rbp)
movq -0x18(%rbp), %rsi
movl 0x8(%rsi), %eax
movl %eax, -0x108(%rbp)
addq $0x20, %rsi
leaq -0x78(%rbp), %rdi
callq 0x40f0
jmp 0x393bd
movq -0x18(%rbp), %rax
movl 0x8(%rax), %esi
decl %esi
movl %esi, %edi
callq 0x2feb0
movq %rax, -0x118(%rbp)
jmp 0x393d6
movq -0x118(%rbp), %rcx
movl -0x108(%rbp), %esi
movq -0x110(%rbp), %rdi
leaq -0x78(%rbp), %rdx
xorl %r8d, %r8d
callq 0x3a690
jmp 0x393f8
movq -0x110(%rbp), %rdi
movb $0x0, -0x79(%rbp)
leaq 0x1a31e(%rip), %rsi     # 0x53728
leaq -0x32401(%rip), %rdx    # 0x7010
callq 0x43f0
jmp 0x39df8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
testb $0x1, -0x41(%rbp)
jne 0x3942f
jmp 0x39438
leaq -0x40(%rbp), %rdi
callq 0x4170
jmp 0x39def
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x39460
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x4170
testb $0x1, -0x79(%rbp)
jne 0x39468
jmp 0x39474
movq -0x110(%rbp), %rdi
callq 0x41d0
jmp 0x39def
movq -0x10(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x80(%rbp)
callq 0x2fe10
movq %rax, -0x88(%rbp)
callq 0x39220
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rax
cmpl $0x1f, (%rax)
je 0x3974b
movq -0x88(%rbp), %rax
movl (%rax), %eax
addl $-0x20, %eax
movl %eax, %ecx
movq %rcx, -0x120(%rbp)
subl $0x8, %eax
ja 0x3953c
movq -0x120(%rbp), %rax
leaq 0xb1a9(%rip), %rcx      # 0x4467c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0xf, -0x94(%rbp)
jmp 0x39546
movl $0x10, -0x94(%rbp)
jmp 0x39546
movl $0xb, -0x94(%rbp)
jmp 0x39546
movl $0xc, -0x94(%rbp)
jmp 0x39546
movl $0xd, -0x94(%rbp)
jmp 0x39546
movl $0x1c, -0x94(%rbp)
jmp 0x39546
movl $0x1d, -0x94(%rbp)
jmp 0x39546
movl $0x1e, -0x94(%rbp)
jmp 0x39546
movl $0x2b, -0x94(%rbp)
movl -0x94(%rbp), %edi
callq 0xb4c0
testb $0x1, %al
jne 0x3955a
jmp 0x39653
movl -0x94(%rbp), %edi
movl -0x80(%rbp), %esi
movq -0x90(%rbp), %rax
movl 0x10(%rax), %edx
callq 0x2b6e0
testb $0x1, %al
jne 0x3964e
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0x98(%rbp)
movl $0x38, %edi
callq 0x4130
movq %rax, -0x138(%rbp)
movl -0x98(%rbp), %edi
movl %edi, -0x130(%rbp)
movq -0x90(%rbp), %rax
movl 0xc(%rax), %esi
movl %esi, -0x12c(%rbp)
decl %edi
decl %esi
callq 0x2feb0
movq %rax, -0x128(%rbp)
jmp 0x395c6
movl -0x94(%rbp), %edi
callq 0xb980
movq %rax, -0x140(%rbp)
jmp 0x395da
movq -0x140(%rbp), %r8
movq -0x128(%rbp), %rcx
movl -0x12c(%rbp), %edx
movl -0x130(%rbp), %esi
movq -0x138(%rbp), %rdi
movl -0x80(%rbp), %r9d
movq -0x90(%rbp), %rax
movl 0x10(%rax), %r10d
movq %rsp, %rax
movl %r10d, (%rax)
callq 0x3a820
jmp 0x39617
movq -0x138(%rbp), %rdi
leaq 0x1a0c3(%rip), %rsi     # 0x536e8
leaq -0x3266c(%rip), %rdx    # 0x6fc0
callq 0x43f0
movq -0x138(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x41d0
jmp 0x39def
jmp 0x39749
movl -0x94(%rbp), %edi
movl -0x80(%rbp), %esi
movq -0x90(%rbp), %rax
movl 0x10(%rax), %edx
callq 0x2b8d0
testb $0x1, %al
jne 0x39747
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0x9c(%rbp)
movl $0x38, %edi
callq 0x4130
movq %rax, -0x158(%rbp)
movl -0x9c(%rbp), %edi
movl %edi, -0x150(%rbp)
movq -0x90(%rbp), %rax
movl 0xc(%rax), %esi
movl %esi, -0x14c(%rbp)
decl %edi
decl %esi
callq 0x2feb0
movq %rax, -0x148(%rbp)
jmp 0x396bf
movl -0x94(%rbp), %edi
callq 0xb980
movq %rax, -0x160(%rbp)
jmp 0x396d3
movq -0x160(%rbp), %r8
movq -0x148(%rbp), %rcx
movl -0x14c(%rbp), %edx
movl -0x150(%rbp), %esi
movq -0x158(%rbp), %rdi
movl -0x80(%rbp), %r9d
movq -0x90(%rbp), %rax
movl 0x10(%rax), %r10d
movq %rsp, %rax
movl %r10d, (%rax)
callq 0x3a820
jmp 0x39710
movq -0x158(%rbp), %rdi
leaq 0x19fca(%rip), %rsi     # 0x536e8
leaq -0x32765(%rip), %rdx    # 0x6fc0
callq 0x43f0
movq -0x158(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x41d0
jmp 0x39def
jmp 0x39749
jmp 0x3974b
movq -0x88(%rbp), %rax
movl (%rax), %eax
addl $-0x1f, %eax
movl %eax, %ecx
movq %rcx, -0x168(%rbp)
subl $0x9, %eax
ja 0x39b9b
movq -0x168(%rbp), %rax
leaq 0xaf29(%rip), %rcx      # 0x446a0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x39b9b
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x170(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0xf, %esi
callq 0xd440
jmp 0x397b3
movq -0x170(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b9b
movq -0x170(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x178(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x10, %esi
callq 0xd440
jmp 0x39811
movq -0x178(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b9b
movq -0x178(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x180(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0xb, %esi
callq 0xd440
jmp 0x3986f
movq -0x180(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b9b
movq -0x180(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x188(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0xc, %esi
callq 0xd440
jmp 0x398cd
movq -0x188(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b9b
movq -0x188(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x190(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0xd, %esi
callq 0xd440
jmp 0x3992b
movq -0x190(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b9b
movq -0x190(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
cmpl $0x9, -0x80(%rbp)
jne 0x399bc
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x198(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x1c, %esi
callq 0xd510
jmp 0x3998f
movq -0x198(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39a17
movq -0x198(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x1a0(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x19, %esi
callq 0xd510
jmp 0x399ea
movq -0x1a0(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39a17
movq -0x1a0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
jmp 0x39b9b
cmpl $0x9, -0x80(%rbp)
jne 0x39a7d
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x1a8(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x1d, %esi
callq 0xd510
jmp 0x39a50
movq -0x1a8(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39ad8
movq -0x1a8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x1b0(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x1a, %esi
callq 0xd510
jmp 0x39aab
movq -0x1b0(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39ad8
movq -0x1b0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
jmp 0x39b9b
cmpl $0x9, -0x80(%rbp)
jne 0x39b3e
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x1b8(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x1e, %esi
callq 0xd510
jmp 0x39b11
movq -0x1b8(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b99
movq -0x1b8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movl $0x30, %edi
callq 0x4260
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x1c0(%rbp)
movq -0x10(%rbp), %rdx
movq -0x90(%rbp), %rcx
movl $0x1b, %esi
callq 0xd510
jmp 0x39b6c
movq -0x1c0(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x39b99
movq -0x1c0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
jmp 0x39b9b
movq -0x90(%rbp), %rax
movl 0x10(%rax), %edi
movl -0x80(%rbp), %esi
callq 0x2b450
testb $0x1, %al
jne 0x39c65
movl $0x30, %edi
callq 0x4130
movq %rax, -0x1d8(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %edi
movl %edi, -0x1d0(%rbp)
movq -0x90(%rbp), %rax
movl 0xc(%rax), %esi
movl %esi, -0x1cc(%rbp)
decl %edi
decl %esi
callq 0x2feb0
movq %rax, -0x1c8(%rbp)
jmp 0x39bf5
movq -0x1c8(%rbp), %rcx
movl -0x1cc(%rbp), %edx
movl -0x1d0(%rbp), %esi
movq -0x1d8(%rbp), %rdi
movq -0x90(%rbp), %rax
movl 0x10(%rax), %r8d
movl -0x80(%rbp), %r9d
movq %rsp, %rax
movl $0x0, (%rax)
callq 0x3a7a0
jmp 0x39c2e
movq -0x1d8(%rbp), %rdi
leaq 0x19b2c(%rip), %rsi     # 0x53768
leaq -0x32bc3(%rip), %rdx    # 0x7080
callq 0x43f0
movq -0x1d8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x41d0
jmp 0x39def
cmpq $0x0, -0x18(%rbp)
je 0x39d31
movl $0x50, %edi
callq 0x4260
movq %rax, -0x1e0(%rbp)
movb $0x1, -0xc1(%rbp)
movq -0x18(%rbp), %rsi
addq $0x20, %rsi
leaq -0xc0(%rbp), %rdi
callq 0x40f0
jmp 0x39c9e
movq -0x1e0(%rbp), %rdi
movl -0x80(%rbp), %edx
movq -0x90(%rbp), %rcx
movq 0x1a75a(%rip), %r8      # 0x54410
movq -0x18(%rbp), %rax
movl 0x8(%rax), %r9d
leaq -0xc0(%rbp), %rsi
callq 0xcdd0
jmp 0x39ccc
movq -0x1e0(%rbp), %rax
movb $0x0, -0xc1(%rbp)
movq %rax, -0x8(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x4170
jmp 0x39de2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x39d15
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x4170
testb $0x1, -0xc1(%rbp)
jne 0x39d20
jmp 0x39d2c
movq -0x1e0(%rbp), %rdi
callq 0x4240
jmp 0x39def
movl $0x40, %edi
callq 0x4260
movq %rax, -0x208(%rbp)
movq -0x20(%rbp), %rcx
movq 0x18(%rcx), %rax
movq %rax, -0x200(%rbp)
movq 0x20(%rcx), %rax
movq %rax, -0x1f8(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x1f0(%rbp)
movl 0x8(%rcx), %edi
decl %edi
movl 0xc(%rax), %esi
decl %esi
callq 0x2feb0
movq %rax, -0x1e8(%rbp)
jmp 0x39d82
movq -0x1e8(%rbp), %r8
movq -0x1f0(%rbp), %rcx
movq -0x1f8(%rbp), %rdx
movq -0x200(%rbp), %rsi
movq -0x208(%rbp), %rdi
movq 0x1a664(%rip), %r9      # 0x54410
callq 0xcf00
jmp 0x39db3
movq -0x208(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x39de2
movq -0x208(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
callq 0x4240
jmp 0x39def
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x210, %rsp            # imm = 0x210
popq %rbp
retq
movq -0x50(%rbp), %rdi
callq 0x4420
nopl (%rax,%rax)