// File: /workspace/github_cpp_makefile_star2_O2/goodix[P]gdix_hid_firmware_update/gt7868q/gt7868q_update.cpp
// Function: GT7868QUpdate::fw_update(unsigned int)
int GT7868QUpdate::fw_update(unsigned int firmware_flag)
{
	int retry;
	int ret, i;
	unsigned char temp_buf[65];
	unsigned char *fw_data = NULL;
	unsigned char buf_switch_to_patch[] = {0x00, 0x10, 0x00, 0x00, 0x01, 0x01};
	unsigned char buf_start_update[] = {0x00, 0x11, 0x00, 0x00, 0x01, 0x01};
	unsigned char buf_restart[] = {0x0E, 0x13, 0x00, 0x00, 0x01, 0x01};
	unsigned char buf_switch_ptp_mode[] = {0x32, 0x00, 0x00, 0x00, 0x32};
	unsigned char buf_dis_report_coor[] = {0x33, 0x00, 0x00, 0x00, 0x33};
	unsigned char buf_en_report_coor[] = {0x34, 0x00, 0x00, 0x00, 0x34};

	int sub_fw_num = 0;
	unsigned char sub_fw_type;
	unsigned int sub_fw_len;
	unsigned int sub_fw_flash_addr;
	unsigned int sub_fw_info_pos =
		image->GetFirmwareSubFwInfoOffset(); // SUB_FW_INFO_OFFSET;
	unsigned int fw_image_offset =
		image->GetFirmwareSubFwDataOffset(); // SUB_FW_DATA_OFFSET;

	ret = dev->Write(buf_switch_to_patch, sizeof(buf_switch_to_patch));
	if (ret < 0) {
		gdix_err("Failed switch to patch\n");
		goto update_err;
	}
	usleep(250000);

	/*dis report coor*/
	gdix_info("disable report coor\n");
	retry = 3;
	do {
		ret = dev->Write(CMD_ADDR, buf_dis_report_coor,
						 sizeof(buf_dis_report_coor));
		if (ret < 0) {
			gdix_err("Failed disable report coor\n");
		}
	} while (--retry);

	retry = GDIX_RETRY_TIMES;
	do {
		ret = dev->Read(BL_STATE_ADDR, temp_buf, 1);
		gdix_dbg("BL_STATE_ADDR:0x%x\n", BL_STATE_ADDR);
		if (ret < 0) {
			gdix_err("Failed read 0x%x, ret = %d\n", BL_STATE_ADDR, ret);
			goto update_err;
		}
		if (temp_buf[0] == 0xDD)
			break;
		gdix_info("0x%x value is 0x%x != 0xDD, retry\n", BL_STATE_ADDR,
				  temp_buf[0]);
		usleep(30000);
	} while (--retry);

	if (!retry) {
		gdix_err("Reg 0x%x != 0xDD\n", BL_STATE_ADDR);
		ret = -2;
		goto update_err;
	}

	/* Start update */
	ret = dev->Write(buf_start_update, sizeof(buf_start_update));
	if (ret < 0) {
		gdix_err("Failed start update, ret=%d\n", ret);
		goto update_err;
	}
	usleep(100000);

	/* Start load firmware */
	fw_data = image->GetFirmwareData();
	if (!fw_data) {
		gdix_err("No valid fw data \n");
		ret = -4;
		goto update_err;
	}

	sub_fw_num =
		image->GetFirmwareSubFwNum(); // fw_data[FW_IMAGE_SUB_FWNUM_OFFSET];
	sub_fw_info_pos =
		image->GetFirmwareSubFwInfoOffset(); // SUB_FW_INFO_OFFSET;
	fw_image_offset =
		image->GetFirmwareSubFwDataOffset(); // SUB_FW_DATA_OFFSET;
	gdix_dbg("load sub firmware, sub_fw_num=%d\n", sub_fw_num);
	if (sub_fw_num == 0) {
		ret = -5;
		goto update_err;
	}

	/* load normal firmware package */
	for (i = 0; i < sub_fw_num; i++) {
		sub_fw_type = fw_data[sub_fw_info_pos];
		gdix_dbg("load sub firmware, sub_fw_type=0x%x\n", sub_fw_type);
		sub_fw_len = (fw_data[sub_fw_info_pos + 1] << 24) |
					 (fw_data[sub_fw_info_pos + 2] << 16) |
					 (fw_data[sub_fw_info_pos + 3] << 8) |
					 fw_data[sub_fw_info_pos + 4];

		sub_fw_flash_addr =
			(fw_data[sub_fw_info_pos + 5] << 8) | fw_data[sub_fw_info_pos + 6];
		sub_fw_flash_addr = sub_fw_flash_addr << 8;
		if (!(firmware_flag & (0x01 << sub_fw_type))) {
			gdix_info("Sub firmware type does not math:type=%d\n", sub_fw_type);
			fw_image_offset += sub_fw_len;
			sub_fw_info_pos += 8;
			continue;
		}

		/* if sub fw type is HID subsystem we need compare version before update
		 */
		// TODO update hid subsystem
		gdix_dbg("load sub firmware addr:0x%x,len:0x%x\n", sub_fw_flash_addr,
				 sub_fw_len);
		ret = load_sub_firmware(sub_fw_flash_addr, &fw_data[fw_image_offset],
								sub_fw_len);
		if (ret < 0) {
			gdix_dbg("Failed load sub firmware, ret=%d\n", ret);
			goto update_err;
		}
		fw_image_offset += sub_fw_len;
		sub_fw_info_pos += 8;
	}

	/* flash config with isp if NEED_UPDATE_CONFIG_WITH_ISP flag is setted or
	 * hid subsystem updated.
	 */
	if (image->GetUpdateFlag() & NEED_UPDATE_CONFIG_WITH_ISP) {
		this->is_cfg_flashed_with_isp = true;
		ret = flash_cfg_with_isp();
		if (ret < 0) {
			gdix_err("failed flash config with isp, ret %d\n", ret);
			goto update_err;
		}
	}

	/*en report coor*/
	gdix_info("enable report coor\n");
	ret = dev->Write(CMD_ADDR, buf_en_report_coor, sizeof(buf_en_report_coor));
	if (ret < 0) {
		gdix_err("Failed enable report coor\n");
	}

	/* reset IC */
	gdix_dbg("reset ic\n");
	retry = 3;
	do {
		ret = dev->Write(buf_restart, sizeof(buf_restart));
		if (ret >= 0)
			break;
		usleep(20000);
	} while (--retry);
	if (retry == 0 && ret < 0)
		gdix_dbg("Failed write restart command, ret=%d\n", ret);
	else
		ret = 0;

	usleep(300000);

	if (dev->Write(CMD_ADDR, buf_switch_ptp_mode, sizeof(buf_switch_ptp_mode)) <
		0) {
		gdix_err("Failed switch to ptp mode\n");
	}
	return ret;

update_err:
	/*en report coor*/
	gdix_info("enable report coor\n");
	ret = dev->Write(CMD_ADDR, buf_en_report_coor, sizeof(buf_en_report_coor));
	if (ret < 0) {
		gdix_err("Failed enable report coor\n");
	}

	/* reset IC */
	gdix_dbg("reset ic\n");
	retry = 3;
	do {
		if (dev->Write(buf_restart, sizeof(buf_restart)) >= 0)
			break;
		usleep(20000);
	} while (--retry);
	if (retry == 0 && ret < 0)
		gdix_dbg("Failed write restart command, ret=%d\n", ret);

	usleep(300000);
	if (dev->Write(CMD_ADDR, buf_switch_ptp_mode, sizeof(buf_switch_ptp_mode)) <
		0) {
		gdix_err("Failed switch to ptp mode\n");
	}
	return ret;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movl %esi, 0x2c(%rsp)
movq %rdi, %rbx
movw $0x101, %ax             # imm = 0x101
leaq 0x38(%rsp), %r14
movw %ax, 0x4(%r14)
movl $0x1000, (%r14)         # imm = 0x1000
movw %ax, 0x34(%rsp)
movl $0x1100, 0x30(%rsp)     # imm = 0x1100
movw %ax, 0x1c(%rsp)
movl $0x130e, 0x18(%rsp)     # imm = 0x130E
movb $0x32, 0x10(%rsp)
movl $0x32, 0xc(%rsp)
movb $0x33, 0x24(%rsp)
movl $0x33, 0x20(%rsp)
movb $0x34, 0x8(%rsp)
movl $0x34, 0x4(%rsp)
movq 0x10(%rdi), %rdi
movq (%rdi), %rax
callq *0x60(%rax)
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0x68(%rax)
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
pushq $0x6
popq %rdx
movq %r14, %rsi
callq *0x38(%rax)
testl %eax, %eax
js 0x78fc
movl $0x3d090, %edi          # imm = 0x3D090
callq 0x5170
leaq 0x18b16(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x77a4
movq 0x18831(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xea31(%rip), %rsi      # 0x161c2
leaq 0x10a3e(%rip), %rdx     # 0x181d6
movl $0x98, %ecx
xorl %eax, %eax
callq 0x5180
pushq $-0x3
popq %r13
leaq 0x20(%rsp), %r14
pushq $0x5
popq %rbp
leaq 0xe4eb(%rip), %r15      # 0x15ca2
leaq 0x10a18(%rip), %r12     # 0x181d6
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
movl $0x4160, %esi           # imm = 0x4160
movq %r14, %rdx
movl %ebp, %ecx
callq *0x30(%rax)
testl %eax, %eax
jns 0x77e2
leaq 0x18ab4(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
je 0x77e9
incl %r13d
jne 0x77be
jmp 0x7807
movq 0x187e8(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
movq %r15, %rsi
movq %r12, %rdx
movl $0x9e, %ecx
xorl %eax, %eax
callq 0x5180
jmp 0x77e2
pushq $-0x6
popq %r15
leaq 0x40(%rsp), %r14
pushq $0x1
popq %rbp
leaq 0x109bc(%rip), %r12     # 0x181d6
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
movl $0x5095, %esi           # imm = 0x5095
movq %r14, %rdx
movl %ebp, %ecx
callq *0x20(%rax)
movl %eax, %r13d
leaq 0x18a59(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7863
movq 0x18774(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe99a(%rip), %rsi      # 0x161e8
movq %r12, %rdx
movl $0xa5, %ecx
movl $0x5095, %r8d           # imm = 0x5095
xorl %eax, %eax
callq 0x5180
testl %r13d, %r13d
js 0x7935
movzbl 0x40(%rsp), %r9d
cmpl $0xdd, %r9d
je 0x7977
leaq 0x18a0b(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x78b1
movq 0x18726(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe99e(%rip), %rsi      # 0x1623a
movq %r12, %rdx
movl $0xad, %ecx
movl $0x5095, %r8d           # imm = 0x5095
xorl %eax, %eax
callq 0x5180
movl $0x7530, %edi           # imm = 0x7530
callq 0x5170
incl %r15d
jne 0x781a
leaq 0x189c6(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7d1d
movq 0x186fd(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe989(%rip), %rsi      # 0x1626e
leaq 0x108ea(%rip), %rdx     # 0x181d6
movl $0xb2, %ecx
movl $0x5095, %r8d           # imm = 0x5095
jmp 0x7d16
leaq 0x1898e(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7d1d
movq 0x186c5(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe87c(%rip), %rsi      # 0x16199
leaq 0x108b2(%rip), %rdx     # 0x181d6
movl $0x92, %ecx
xorl %eax, %eax
callq 0x5180
jmp 0x7d1d
leaq 0x18955(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7d1d
movq 0x1868c(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe8b7(%rip), %rsi      # 0x1620d
leaq 0x10879(%rip), %rdx     # 0x181d6
movl $0xa7, %ecx
movl $0x5095, %r8d           # imm = 0x5095
movl %r13d, %r9d
xorl %eax, %eax
callq 0x5180
jmp 0x7d1d
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
leaq 0x30(%rsp), %rsi
pushq $0x6
popq %rdx
callq *0x38(%rax)
testl %eax, %eax
js 0x7b68
movl $0x186a0, %edi          # imm = 0x186A0
callq 0x5170
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
testq %rax, %rax
je 0x7b9a
movq %rax, %r14
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0x58(%rax)
movl %eax, %r15d
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0x60(%rax)
movl %eax, %r12d
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0x68(%rax)
movl %eax, %ebp
leaq 0x188b3(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7a0a
movq 0x185ce(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe8ef(%rip), %rsi      # 0x162e3
leaq 0x107db(%rip), %rdx     # 0x181d6
movl $0xcd, %ecx
movl %r15d, %r8d
xorl %eax, %eax
callq 0x5180
testl %r15d, %r15d
je 0x7d1d
xorl %eax, %eax
testl %r15d, %r15d
cmovlel %eax, %r15d
addl $0x6, %r12d
subl $0x1, %r15d
jb 0x7bcc
movl %r15d, 0x28(%rsp)
movl %ebp, 0x14(%rsp)
leal -0x6(%r12), %eax
movl %eax, %eax
movzbl (%r14,%rax), %r13d
leaq 0x1884b(%rip), %rax     # 0x20291
cmpb $0x0, (%rax)
je 0x7a72
movq 0x18566(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe8ba(%rip), %rsi      # 0x16316
leaq 0x10773(%rip), %rdx     # 0x181d6
movl $0xd6, %ecx
movl %r13d, %r8d
xorl %eax, %eax
callq 0x5180
leal -0x5(%r12), %eax
movzbl (%r14,%rax), %eax
shll $0x18, %eax
leal -0x4(%r12), %ecx
movzbl (%r14,%rcx), %ecx
shll $0x10, %ecx
orl %eax, %ecx
leal -0x3(%r12), %eax
movzbl (%r14,%rax), %eax
shll $0x8, %eax
orl %ecx, %eax
leal -0x2(%r12), %ecx
movzbl (%r14,%rcx), %r15d
orl %eax, %r15d
movl 0x2c(%rsp), %eax
btl %r13d, %eax
leaq 0x187d8(%rip), %rax     # 0x20291
movb (%rax), %al
jae 0x7b28
leal -0x1(%r12), %ecx
movzbl (%r14,%rcx), %ecx
movl %r12d, %edx
movzbl (%r14,%rdx), %r13d
shll $0x10, %ecx
shll $0x8, %r13d
orl %ecx, %r13d
testb %al, %al
je 0x7b07
movq 0x184d4(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe898(%rip), %rsi      # 0x16386
leaq 0x106e1(%rip), %rdx     # 0x181d6
movl $0xea, %ecx
movl %r13d, %r8d
movl %r15d, %r9d
xorl %eax, %eax
callq 0x5180
movl 0x14(%rsp), %ebp
movl %ebp, %edx
addq %r14, %rdx
movq (%rbx), %rax
movq %rbx, %rdi
movl %r13d, %esi
movl %r15d, %ecx
callq *0x28(%rax)
testl %eax, %eax
jns 0x7b57
jmp 0x7cea
testb %al, %al
movl 0x14(%rsp), %ebp
je 0x7b57
movq 0x18481(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe80b(%rip), %rsi      # 0x1634c
leaq 0x1068e(%rip), %rdx     # 0x181d6
movl $0xe0, %ecx
movl %r13d, %r8d
xorl %eax, %eax
callq 0x5180
addl %r15d, %ebp
addl $0x8, %r12d
movl 0x28(%rsp), %r15d
jmp 0x7a20
leaq 0x18722(%rip), %rcx     # 0x20291
cmpb $0x1, (%rcx)
jne 0x7d1d
movq 0x18459(%rip), %rcx     # 0x1ffd8
movq (%rcx), %rdi
leaq 0xe708(%rip), %rsi      # 0x16291
leaq 0x10646(%rip), %rdx     # 0x181d6
movl $0xba, %ecx
jmp 0x7d13
leaq 0x186f0(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7d1d
movq 0x18427(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe704(%rip), %rsi      # 0x162bf
leaq 0x10614(%rip), %rdx     # 0x181d6
movl $0xc2, %ecx
jmp 0x7929
movq 0x10(%rbx), %rdi
movq (%rdi), %rax
callq *0xa8(%rax)
testb $0x10, %al
je 0x7bf2
movb $0x1, 0x1a(%rbx)
movq (%rbx), %rax
movq %rbx, %rdi
callq *0x40(%rax)
testl %eax, %eax
js 0x7edd
leaq 0x18698(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7c22
movq 0x183b3(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe265(%rip), %rsi      # 0x15e74
leaq 0x105c0(%rip), %rdx     # 0x181d6
movl $0x102, %ecx            # imm = 0x102
xorl %eax, %eax
callq 0x5180
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
leaq 0x4(%rsp), %rdx
pushq $0x5
popq %rcx
movl $0x4160, %esi           # imm = 0x4160
callq *0x30(%rax)
leaq 0x18651(%rip), %rcx     # 0x20291
movb (%rcx), %cl
testl %eax, %eax
jns 0x7c4f
testb $0x1, %cl
jne 0x7f0f
testb $0x1, %cl
je 0x7c78
movq 0x1835d(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe7ee(%rip), %rsi      # 0x16453
leaq 0x1056a(%rip), %rdx     # 0x181d6
movl $0x109, %ecx            # imm = 0x109
xorl %eax, %eax
callq 0x5180
pushq $-0x3
popq %r12
leaq 0x18(%rsp), %r14
pushq $0x6
popq %r15
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
movq %r14, %rsi
movl %r15d, %edx
callq *0x38(%rax)
testl %eax, %eax
jns 0x7e9b
movl %eax, %ebp
movl $0x4e20, %edi           # imm = 0x4E20
callq 0x5170
incl %r12d
jne 0x7c85
leaq 0x185dc(%rip), %rax     # 0x20291
cmpb $0x1, (%rax)
jne 0x7e9d
movq 0x182f3(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe79f(%rip), %rsi      # 0x1646e
leaq 0x10500(%rip), %rdx     # 0x181d6
movl $0x112, %ecx            # imm = 0x112
movl %ebp, %r8d
xorl %eax, %eax
callq 0x5180
jmp 0x7e9d
leaq 0x185a0(%rip), %rcx     # 0x20291
cmpb $0x1, (%rcx)
jne 0x7d1d
movq 0x182bb(%rip), %rcx     # 0x1ffb8
movq (%rcx), %rdi
leaq 0xe6b6(%rip), %rsi      # 0x163bd
leaq 0x104c8(%rip), %rdx     # 0x181d6
movl $0xee, %ecx
movl %eax, %r8d
xorl %eax, %eax
callq 0x5180
leaq 0x1856d(%rip), %r14     # 0x20291
cmpb $0x1, (%r14)
jne 0x7d4e
movq 0x18287(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe139(%rip), %rsi      # 0x15e74
leaq 0x10494(%rip), %rdx     # 0x181d6
movl $0x120, %ecx            # imm = 0x120
xorl %eax, %eax
callq 0x5180
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
leaq 0x4(%rsp), %rdx
pushq $0x5
popq %rcx
movl $0x4160, %esi           # imm = 0x4160
callq *0x30(%rax)
movl %eax, %ebp
movb (%r14), %al
testl %ebp, %ebp
jns 0x7d76
testb $0x1, %al
jne 0x7e49
testb $0x1, %al
je 0x7d9e
movq 0x18237(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe6c8(%rip), %rsi      # 0x16453
leaq 0x10444(%rip), %rdx     # 0x181d6
movl $0x127, %ecx            # imm = 0x127
xorl %eax, %eax
callq 0x5180
pushq $-0x3
popq %r13
leaq 0x18(%rsp), %r14
pushq $0x6
popq %r15
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
movq %r14, %rsi
movl %r15d, %edx
callq *0x38(%rax)
movl %eax, %r12d
testl %eax, %eax
jns 0x7dd1
movl $0x4e20, %edi           # imm = 0x4E20
callq 0x5170
incl %r13d
jne 0x7dab
testl %ebp, %r12d
leaq 0x184b6(%rip), %r14     # 0x20291
jns 0x7e0a
cmpb $0x1, (%r14)
jne 0x7e0a
movq 0x181ce(%rip), %rax     # 0x1ffb8
movq (%rax), %rdi
leaq 0xe67a(%rip), %rsi      # 0x1646e
leaq 0x103db(%rip), %rdx     # 0x181d6
movl $0x12f, %ecx            # imm = 0x12F
movl %ebp, %r8d
xorl %eax, %eax
callq 0x5180
movl $0x493e0, %edi          # imm = 0x493E0
callq 0x5170
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
leaq 0xc(%rsp), %rdx
pushq $0x5
popq %rcx
movl $0x4160, %esi           # imm = 0x4160
callq *0x30(%rax)
testl %eax, %eax
jns 0x7e35
cmpb $0x1, (%r14)
je 0x7e75
movl %ebp, %eax
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x18188(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe5cd(%rip), %rsi      # 0x16427
leaq 0x10375(%rip), %rdx     # 0x181d6
movl $0x123, %ecx            # imm = 0x123
xorl %eax, %eax
callq 0x5180
movb (%r14), %al
jmp 0x7d76
movl $0x134, %ecx            # imm = 0x134
movq 0x18157(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe61a(%rip), %rsi      # 0x164a5
leaq 0x10344(%rip), %rdx     # 0x181d6
xorl %eax, %eax
callq 0x5180
jmp 0x7e35
xorl %ebp, %ebp
movl $0x493e0, %edi          # imm = 0x493E0
callq 0x5170
movq 0x8(%rbx), %rdi
movq (%rdi), %rax
leaq 0xc(%rsp), %rdx
pushq $0x5
popq %rcx
movl $0x4160, %esi           # imm = 0x4160
callq *0x30(%rax)
testl %eax, %eax
jns 0x7e35
leaq 0x183c4(%rip), %rax     # 0x20291
cmpb $0x0, (%rax)
je 0x7e35
movl $0x11a, %ecx            # imm = 0x11A
jmp 0x7e7a
leaq 0x183ad(%rip), %rcx     # 0x20291
cmpb $0x1, (%rcx)
jne 0x7d1d
movq 0x180e4(%rip), %rcx     # 0x1ffd8
movq (%rcx), %rdi
leaq 0xe4f2(%rip), %rsi      # 0x163f0
leaq 0x102d1(%rip), %rdx     # 0x181d6
movl $0xfc, %ecx
jmp 0x7d13
movq 0x180c2(%rip), %rax     # 0x1ffd8
movq (%rax), %rdi
leaq 0xe507(%rip), %rsi      # 0x16427
leaq 0x102af(%rip), %rdx     # 0x181d6
movl $0x105, %ecx            # imm = 0x105
xorl %eax, %eax
callq 0x5180
leaq 0x18357(%rip), %rax     # 0x20291
movb (%rax), %cl
jmp 0x7c4f
nop