
int * __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)

{
  int *piVar1;
  int iVar2;
  code *pcVar3;
  int *piVar4;
  int iVar5;
  int iVar6;
  int *extraout_ECX;
  int *piVar7;
  byte *pbVar8;
  int unaff_EDI;
  byte local_25;
  
  piVar4 = (int *)FUN_000196fd();
  iVar2 = *piVar4;
  piVar7 = extraout_ECX;
  if (extraout_ECX == (int *)0x0) {
    if (param_3 == 0) {
      iVar5 = *(int *)(iVar2 + 8);
    }
    else {
      iVar5 = FUN_00028f30();
    }
    if ((iVar5 != 0) &&
       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))
    goto LAB_0005ac21;
  }
  else {
LAB_0005ac21:
    if (piVar7[3] != 0) {
      return piVar7;
    }
  }
  if (*(int *)(iVar2 + 0xfc) != 0) {
    iVar5 = FUN_00027060();
    if (iVar5 == 0) goto LAB_0005ad18;
    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);
    FUN_00024d80();
  }
  if (*(int *)(iVar2 + 0x100) != 0) {
    iVar5 = FUN_00026c00();
    if (iVar5 != 0) {
      *(int *)(iVar5 + 0x20) = iVar2;
      *(undefined2 *)(iVar5 + 8) = 1;
      FUN_00045350(1,0);
    }
    iVar5 = FUN_0004ce10();
    if (iVar5 != 0) {
      (**(code **)(iVar2 + 0x100))
                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);
    }
    FUN_00025480();
  }
LAB_0005ad18:
  if (param_3 == 0) {
    iVar5 = *(int *)(iVar2 + 8);
  }
  else {
    iVar5 = FUN_00028f30();
  }
  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)
     ) {
    if (piVar7[3] != 0) {
      return piVar7;
    }
    iVar5 = *piVar7;
    local_25 = 3;
    pbVar8 = (byte *)(unaff_EDI + 0xa219f);
    if (iVar5 == 0) goto LAB_0005adeb;
    do {
      iVar6 = FUN_00028f30();
      while( true ) {
        if (iVar6 == 0) {
                    /* WARNING: Does not return */
          pcVar3 = (code *)invalidInstructionException();
          (*pcVar3)();
        }
        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);
        if (piVar1[3] != 0) {
          *piVar7 = *piVar1;
          piVar7[1] = piVar1[1];
          piVar7[2] = piVar1[2];
          iVar2 = piVar1[3];
          piVar7[4] = 0;
          piVar7[3] = iVar2;
          return piVar7;
        }
        pbVar8 = pbVar8 + 1;
        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;
        local_25 = *pbVar8;
        if (iVar5 != 0) break;
LAB_0005adeb:
        iVar6 = *(int *)(iVar2 + 8);
      }
    } while( true );
  }
LAB_0005ad46:
  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);
  piVar4[3] = 0x101;
  return (int *)0x0;
}


PUSH EBP
MOV EBP,EDX
PUSH EDI
CALL 0x000196fd
ADD EDI,0xee2cb
PUSH ESI
PUSH EBX
MOV EBX,ECX
SUB ESP,0x1c
MOV ESI,dword ptr [EAX]
MOV dword ptr [ESP],EDI
MOV EDI,EAX
TEST ECX,ECX
JZ 0x0005ac38
MOV EAX,dword ptr [EBX + 0xc]
TEST EAX,EAX
JZ 0x0005ac68
ADD ESP,0x1c
MOV EAX,EBX
POP EBX
POP ESI
POP EDI
POP EBP
RET
MOV EAX,dword ptr [ESP + 0x30]
TEST EAX,EAX
JZ 0x0005ad78
MOV EDX,dword ptr [ESP + 0x30]
XOR ECX,ECX
MOV EAX,ESI
CALL 0x00028f30
TEST EAX,EAX
JZ 0x0005ac68
MOV ECX,EBP
MOVZX EDX,CL
LEA EDX,[EDX + EDX*0x4]
LEA EBX,[EAX + EDX*0x4 + -0x14]
TEST EBX,EBX
JNZ 0x0005ac21
LEA ESI,[ESI]
MOV EAX,dword ptr [ESI + 0xfc]
TEST EAX,EAX
JZ 0x0005aca7
MOV EDX,dword ptr [ESP + 0x30]
MOV EAX,ESI
CALL 0x00027060
MOV EBX,EAX
TEST EAX,EAX
JZ 0x0005ad18
PUSH EAX
MOV EAX,EBP
MOVZX EAX,AL
PUSH EAX
PUSH ESI
PUSH dword ptr [ESI + 0x104]
CALL dword ptr [ESI + 0xfc]
MOV EDX,EBX
MOV EAX,ESI
CALL 0x00024d80
ADD ESP,0x10
MOV EAX,dword ptr [ESI + 0x100]
TEST EAX,EAX
JZ 0x0005ad18
MOV EDX,0x28
XOR ECX,ECX
MOV EAX,ESI
CALL 0x00026c00
MOV EBX,EAX
TEST EAX,EAX
JZ 0x0005aceb
SUB ESP,0x8
MOV EAX,0x1
MOV dword ptr [EBX + 0x20],ESI
MOV ECX,0xffffffff
MOV word ptr [EBX + 0x8],AX
MOV EAX,EBX
PUSH 0x0
PUSH 0x1
MOV EDX,dword ptr [ESP + 0x40]
CALL 0x00045350
ADD ESP,0x10
MOV EDX,0x2
MOV EAX,EBX
CALL 0x0004ce10
TEST EAX,EAX
JZ 0x0005ad11
PUSH EAX
MOVZX EAX,byte ptr [ESI + 0x4a]
PUSH EAX
PUSH ESI
PUSH dword ptr [ESI + 0x104]
CALL dword ptr [ESI + 0x100]
ADD ESP,0x10
MOV EAX,EBX
CALL 0x00025480
MOV EBX,dword ptr [ESP + 0x30]
TEST EBX,EBX
JZ 0x0005adf0
MOV EDX,dword ptr [ESP + 0x30]
XOR ECX,ECX
MOV EAX,ESI
CALL 0x00028f30
TEST EAX,EAX
JZ 0x0005ad46
MOV ECX,EBP
MOVZX EBP,CL
LEA EDX,[EBP + EBP*0x4]
LEA EBX,[EAX + EDX*0x4 + -0x14]
TEST EBX,EBX
JNZ 0x0005ad80
SUB ESP,0x4
XOR EBX,EBX
PUSH dword ptr [ESP + 0x34]
MOV EAX,dword ptr [ESP + 0x8]
LEA EAX,[EAX + 0xfffba324]
PUSH EAX
PUSH EDI
CALL 0x000578c0
ADD ESP,0x10
MOV dword ptr [EDI + 0xc],0x101
MOV EAX,EBX
ADD ESP,0x1c
POP EBX
POP ESI
POP EDI
POP EBP
RET
MOV EAX,dword ptr [ESI + 0x8]
JMP 0x0005ac51
MOV ECX,dword ptr [EBX + 0xc]
TEST ECX,ECX
JNZ 0x0005ac28
MOV ECX,dword ptr [ESP]
MOV EAX,dword ptr [EBX]
MOV dword ptr [ESP + 0xc],EBX
MOV byte ptr [ESP + 0x7],0x3
LEA EBP,[ECX + 0xfffb3ed4]
MOV EBX,EAX
LEA ECX,[EBP + 0x3]
MOV dword ptr [ESP + 0x8],ECX
TEST EBX,EBX
JZ 0x0005adeb
XOR ECX,ECX
MOV EDX,EBX
MOV EAX,ESI
CALL 0x00028f30
TEST EAX,EAX
JZ 0x00014442
MOVZX EDX,byte ptr [ESP + 0x7]
LEA EDX,[EDX + EDX*0x4]
LEA EAX,[EAX + EDX*0x4 + -0x14]
MOV EDX,dword ptr [EAX + 0xc]
TEST EDX,EDX
JNZ 0x0005ae00
ADD EBP,0x1
CMP dword ptr [ESP + 0x8],EBP
JZ 0x0005ad46
MOVZX EAX,byte ptr [EBP]
MOV byte ptr [ESP + 0x7],AL
TEST EBX,EBX
JNZ 0x0005adac
MOV EAX,dword ptr [ESI + 0x8]
JMP 0x0005adb7
MOV EAX,dword ptr [ESI + 0x8]
JMP 0x0005ad31
MOV EDX,dword ptr [EAX]
MOV EBX,dword ptr [ESP + 0xc]
MOV dword ptr [EBX],EDX
MOV EDX,dword ptr [EAX + 0x4]
MOV dword ptr [EBX + 0x4],EDX
MOV EDX,dword ptr [EAX + 0x8]
MOV dword ptr [EBX + 0x8],EDX
MOV EAX,dword ptr [EAX + 0xc]
MOV dword ptr [EBX + 0x10],0x0
MOV dword ptr [EBX + 0xc],EAX
JMP 0x0005ac28
(translation_unit "int * __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)\n\n{\n  int *piVar1;\n  int iVar2;\n  code *pcVar3;\n  int *piVar4;\n  int iVar5;\n  int iVar6;\n  int *extraout_ECX;\n  int *piVar7;\n  byte *pbVar8;\n  int unaff_EDI;\n  byte local_25;\n  \n  piVar4 = (int *)FUN_000196fd();\n  iVar2 = *piVar4;\n  piVar7 = extraout_ECX;\n  if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }\n  if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }\n  if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }\nLAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }\n  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }\nLAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);\n  piVar4[3] = 0x101;\n  return (int *)0x0;\n}\n\n" (function_definition "int * __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)\n\n{\n  int *piVar1;\n  int iVar2;\n  code *pcVar3;\n  int *piVar4;\n  int iVar5;\n  int iVar6;\n  int *extraout_ECX;\n  int *piVar7;\n  byte *pbVar8;\n  int unaff_EDI;\n  byte local_25;\n  \n  piVar4 = (int *)FUN_000196fd();\n  iVar2 = *piVar4;\n  piVar7 = extraout_ECX;\n  if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }\n  if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }\n  if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }\nLAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }\n  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }\nLAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);\n  piVar4[3] = 0x101;\n  return (int *)0x0;\n}" primitive_type (pointer_declarator "* __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)" * (ERROR "__regparm2" identifier) (function_declarator "FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)" identifier (parameter_list "(undefined4 param_1,byte param_2,int param_3)" ( (parameter_declaration "undefined4 param_1" type_identifier identifier) , (parameter_declaration "byte param_2" type_identifier identifier) , (parameter_declaration "int param_3" primitive_type identifier) )))) (compound_statement "{\n  int *piVar1;\n  int iVar2;\n  code *pcVar3;\n  int *piVar4;\n  int iVar5;\n  int iVar6;\n  int *extraout_ECX;\n  int *piVar7;\n  byte *pbVar8;\n  int unaff_EDI;\n  byte local_25;\n  \n  piVar4 = (int *)FUN_000196fd();\n  iVar2 = *piVar4;\n  piVar7 = extraout_ECX;\n  if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }\n  if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }\n  if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }\nLAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }\n  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }\nLAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);\n  piVar4[3] = 0x101;\n  return (int *)0x0;\n}" { (declaration "int *piVar1;" primitive_type (pointer_declarator "*piVar1" * identifier) ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "code *pcVar3;" type_identifier (pointer_declarator "*pcVar3" * identifier) ;) (declaration "int *piVar4;" primitive_type (pointer_declarator "*piVar4" * identifier) ;) (declaration "int iVar5;" primitive_type identifier ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "int *extraout_ECX;" primitive_type (pointer_declarator "*extraout_ECX" * identifier) ;) (declaration "int *piVar7;" primitive_type (pointer_declarator "*piVar7" * identifier) ;) (declaration "byte *pbVar8;" type_identifier (pointer_declarator "*pbVar8" * identifier) ;) (declaration "int unaff_EDI;" primitive_type identifier ;) (declaration "byte local_25;" type_identifier identifier ;) (expression_statement "piVar4 = (int *)FUN_000196fd();" (assignment_expression "piVar4 = (int *)FUN_000196fd()" identifier = (cast_expression "(int *)FUN_000196fd()" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_000196fd()" identifier (argument_list "()" ( ))))) ;) (expression_statement "iVar2 = *piVar4;" (assignment_expression "iVar2 = *piVar4" identifier = (pointer_expression "*piVar4" * identifier)) ;) (expression_statement "piVar7 = extraout_ECX;" (assignment_expression "piVar7 = extraout_ECX" identifier = identifier) ;) (if_statement "if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" if (parenthesized_expression "(extraout_ECX == (int *)0x0)" ( (binary_expression "extraout_ECX == (int *)0x0" identifier == (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }" { (if_statement "if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n      iVar5 = *(int *)(iVar2 + 8);\n    }" { (expression_statement "iVar5 = *(int *)(iVar2 + 8);" (assignment_expression "iVar5 = *(int *)(iVar2 + 8)" identifier = (pointer_expression "*(int *)(iVar2 + 8)" * (cast_expression "(int *)(iVar2 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 8)" ( (binary_expression "iVar2 + 8" identifier + number_literal) ))))) ;) }) (else_clause "else {\n      iVar5 = FUN_00028f30();\n    }" else (compound_statement "{\n      iVar5 = FUN_00028f30();\n    }" { (expression_statement "iVar5 = FUN_00028f30();" (assignment_expression "iVar5 = FUN_00028f30()" identifier = (call_expression "FUN_00028f30()" identifier (argument_list "()" ( )))) ;) }))) (if_statement "if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;" if (parenthesized_expression "((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))" ( (binary_expression "(iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (parenthesized_expression "(iVar5 != 0)" ( (binary_expression "iVar5 != 0" identifier != number_literal) )) && (parenthesized_expression "(piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" ( (comma_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0" (assignment_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" identifier = (cast_expression "(int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar5 + -0x14 + (uint)param_2 * 0x14)" ( (binary_expression "iVar5 + -0x14 + (uint)param_2 * 0x14" (binary_expression "iVar5 + -0x14" identifier + number_literal) + (binary_expression "(uint)param_2 * 0x14" (cast_expression "(uint)param_2" ( (type_descriptor "uint" type_identifier) ) identifier) * number_literal)) )))) , (binary_expression "piVar7 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal))) ))) )) (goto_statement "goto LAB_0005ac21;" goto statement_identifier ;)) }) (else_clause "else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" else (compound_statement "{\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" { (labeled_statement "LAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }" statement_identifier : (if_statement "if (piVar7[3] != 0) {\n      return piVar7;\n    }" if (parenthesized_expression "(piVar7[3] != 0)" ( (binary_expression "piVar7[3] != 0" (subscript_expression "piVar7[3]" identifier [ number_literal ]) != number_literal) )) (compound_statement "{\n      return piVar7;\n    }" { (return_statement "return piVar7;" return identifier ;) }))) }))) (if_statement "if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }" if (parenthesized_expression "(*(int *)(iVar2 + 0xfc) != 0)" ( (binary_expression "*(int *)(iVar2 + 0xfc) != 0" (pointer_expression "*(int *)(iVar2 + 0xfc)" * (cast_expression "(int *)(iVar2 + 0xfc)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0xfc)" ( (binary_expression "iVar2 + 0xfc" identifier + number_literal) )))) != number_literal) )) (compound_statement "{\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }" { (expression_statement "iVar5 = FUN_00027060();" (assignment_expression "iVar5 = FUN_00027060()" identifier = (call_expression "FUN_00027060()" identifier (argument_list "()" ( )))) ;) (if_statement "if (iVar5 == 0) goto LAB_0005ad18;" if (parenthesized_expression "(iVar5 == 0)" ( (binary_expression "iVar5 == 0" identifier == number_literal) )) (goto_statement "goto LAB_0005ad18;" goto statement_identifier ;)) (expression_statement "(**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);" (call_expression "(**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5)" (parenthesized_expression "(**(code **)(iVar2 + 0xfc))" ( (pointer_expression "**(code **)(iVar2 + 0xfc)" * (pointer_expression "*(code **)(iVar2 + 0xfc)" * (cast_expression "(code **)(iVar2 + 0xfc)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(iVar2 + 0xfc)" ( (binary_expression "iVar2 + 0xfc" identifier + number_literal) ))))) )) (argument_list "(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5)" ( (pointer_expression "*(undefined4 *)(iVar2 + 0x104)" * (cast_expression "(undefined4 *)(iVar2 + 0x104)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x104)" ( (binary_expression "iVar2 + 0x104" identifier + number_literal) )))) , identifier , identifier , identifier ))) ;) (expression_statement "FUN_00024d80();" (call_expression "FUN_00024d80()" identifier (argument_list "()" ( ))) ;) })) (if_statement "if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }" if (parenthesized_expression "(*(int *)(iVar2 + 0x100) != 0)" ( (binary_expression "*(int *)(iVar2 + 0x100) != 0" (pointer_expression "*(int *)(iVar2 + 0x100)" * (cast_expression "(int *)(iVar2 + 0x100)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x100)" ( (binary_expression "iVar2 + 0x100" identifier + number_literal) )))) != number_literal) )) (compound_statement "{\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }" { (expression_statement "iVar5 = FUN_00026c00();" (assignment_expression "iVar5 = FUN_00026c00()" identifier = (call_expression "FUN_00026c00()" identifier (argument_list "()" ( )))) ;) (if_statement "if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }" if (parenthesized_expression "(iVar5 != 0)" ( (binary_expression "iVar5 != 0" identifier != number_literal) )) (compound_statement "{\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }" { (expression_statement "*(int *)(iVar5 + 0x20) = iVar2;" (assignment_expression "*(int *)(iVar5 + 0x20) = iVar2" (pointer_expression "*(int *)(iVar5 + 0x20)" * (cast_expression "(int *)(iVar5 + 0x20)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar5 + 0x20)" ( (binary_expression "iVar5 + 0x20" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(undefined2 *)(iVar5 + 8) = 1;" (assignment_expression "*(undefined2 *)(iVar5 + 8) = 1" (pointer_expression "*(undefined2 *)(iVar5 + 8)" * (cast_expression "(undefined2 *)(iVar5 + 8)" ( (type_descriptor "undefined2 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar5 + 8)" ( (binary_expression "iVar5 + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "FUN_00045350(1,0);" (call_expression "FUN_00045350(1,0)" identifier (argument_list "(1,0)" ( number_literal , number_literal ))) ;) })) (expression_statement "iVar5 = FUN_0004ce10();" (assignment_expression "iVar5 = FUN_0004ce10()" identifier = (call_expression "FUN_0004ce10()" identifier (argument_list "()" ( )))) ;) (if_statement "if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }" if (parenthesized_expression "(iVar5 != 0)" ( (binary_expression "iVar5 != 0" identifier != number_literal) )) (compound_statement "{\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }" { (expression_statement "(**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);" (call_expression "(**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5)" (parenthesized_expression "(**(code **)(iVar2 + 0x100))" ( (pointer_expression "**(code **)(iVar2 + 0x100)" * (pointer_expression "*(code **)(iVar2 + 0x100)" * (cast_expression "(code **)(iVar2 + 0x100)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(iVar2 + 0x100)" ( (binary_expression "iVar2 + 0x100" identifier + number_literal) ))))) )) (argument_list "(*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5)" ( (pointer_expression "*(undefined4 *)(iVar2 + 0x104)" * (cast_expression "(undefined4 *)(iVar2 + 0x104)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x104)" ( (binary_expression "iVar2 + 0x104" identifier + number_literal) )))) , identifier , (pointer_expression "*(undefined1 *)(iVar2 + 0x4a)" * (cast_expression "(undefined1 *)(iVar2 + 0x4a)" ( (type_descriptor "undefined1 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x4a)" ( (binary_expression "iVar2 + 0x4a" identifier + number_literal) )))) , identifier ))) ;) })) (expression_statement "FUN_00025480();" (call_expression "FUN_00025480()" identifier (argument_list "()" ( ))) ;) })) (labeled_statement "LAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }" statement_identifier : (if_statement "if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n    iVar5 = *(int *)(iVar2 + 8);\n  }" { (expression_statement "iVar5 = *(int *)(iVar2 + 8);" (assignment_expression "iVar5 = *(int *)(iVar2 + 8)" identifier = (pointer_expression "*(int *)(iVar2 + 8)" * (cast_expression "(int *)(iVar2 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 8)" ( (binary_expression "iVar2 + 8" identifier + number_literal) ))))) ;) }) (else_clause "else {\n    iVar5 = FUN_00028f30();\n  }" else (compound_statement "{\n    iVar5 = FUN_00028f30();\n  }" { (expression_statement "iVar5 = FUN_00028f30();" (assignment_expression "iVar5 = FUN_00028f30()" identifier = (call_expression "FUN_00028f30()" identifier (argument_list "()" ( )))) ;) })))) (if_statement "if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }" if (parenthesized_expression "((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     )" ( (binary_expression "(iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (parenthesized_expression "(iVar5 != 0)" ( (binary_expression "iVar5 != 0" identifier != number_literal) )) && (parenthesized_expression "(piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" ( (comma_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0" (assignment_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" identifier = (cast_expression "(int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar5 + -0x14 + (uint)param_2 * 0x14)" ( (binary_expression "iVar5 + -0x14 + (uint)param_2 * 0x14" (binary_expression "iVar5 + -0x14" identifier + number_literal) + (binary_expression "(uint)param_2 * 0x14" (cast_expression "(uint)param_2" ( (type_descriptor "uint" type_identifier) ) identifier) * number_literal)) )))) , (binary_expression "piVar7 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal))) ))) )) (compound_statement "{\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }" { (if_statement "if (piVar7[3] != 0) {\n      return piVar7;\n    }" if (parenthesized_expression "(piVar7[3] != 0)" ( (binary_expression "piVar7[3] != 0" (subscript_expression "piVar7[3]" identifier [ number_literal ]) != number_literal) )) (compound_statement "{\n      return piVar7;\n    }" { (return_statement "return piVar7;" return identifier ;) })) (expression_statement "iVar5 = *piVar7;" (assignment_expression "iVar5 = *piVar7" identifier = (pointer_expression "*piVar7" * identifier)) ;) (expression_statement "local_25 = 3;" (assignment_expression "local_25 = 3" identifier = number_literal) ;) (expression_statement "pbVar8 = (byte *)(unaff_EDI + 0xa219f);" (assignment_expression "pbVar8 = (byte *)(unaff_EDI + 0xa219f)" identifier = (cast_expression "(byte *)(unaff_EDI + 0xa219f)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(unaff_EDI + 0xa219f)" ( (binary_expression "unaff_EDI + 0xa219f" identifier + number_literal) )))) ;) (if_statement "if (iVar5 == 0) goto LAB_0005adeb;" if (parenthesized_expression "(iVar5 == 0)" ( (binary_expression "iVar5 == 0" identifier == number_literal) )) (goto_statement "goto LAB_0005adeb;" goto statement_identifier ;)) (do_statement "do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );" do (compound_statement "{\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    }" { (expression_statement "iVar6 = FUN_00028f30();" (assignment_expression "iVar6 = FUN_00028f30()" identifier = (call_expression "FUN_00028f30()" identifier (argument_list "()" ( )))) ;) (while_statement "while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }" { (if_statement "if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }" if (parenthesized_expression "(iVar6 == 0)" ( (binary_expression "iVar6 == 0" identifier == number_literal) )) (compound_statement "{\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }" { (expression_statement "pcVar3 = (code *)invalidInstructionException();" (assignment_expression "pcVar3 = (code *)invalidInstructionException()" identifier = (cast_expression "(code *)invalidInstructionException()" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "invalidInstructionException()" identifier (argument_list "()" ( ))))) ;) (expression_statement "(*pcVar3)();" (call_expression "(*pcVar3)()" (parenthesized_expression "(*pcVar3)" ( (pointer_expression "*pcVar3" * identifier) )) (argument_list "()" ( ))) ;) })) (expression_statement "piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);" (assignment_expression "piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14)" identifier = (cast_expression "(int *)(iVar6 + -0x14 + (uint)local_25 * 0x14)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar6 + -0x14 + (uint)local_25 * 0x14)" ( (binary_expression "iVar6 + -0x14 + (uint)local_25 * 0x14" (binary_expression "iVar6 + -0x14" identifier + number_literal) + (binary_expression "(uint)local_25 * 0x14" (cast_expression "(uint)local_25" ( (type_descriptor "uint" type_identifier) ) identifier) * number_literal)) )))) ;) (if_statement "if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }" if (parenthesized_expression "(piVar1[3] != 0)" ( (binary_expression "piVar1[3] != 0" (subscript_expression "piVar1[3]" identifier [ number_literal ]) != number_literal) )) (compound_statement "{\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }" { (expression_statement "*piVar7 = *piVar1;" (assignment_expression "*piVar7 = *piVar1" (pointer_expression "*piVar7" * identifier) = (pointer_expression "*piVar1" * identifier)) ;) (expression_statement "piVar7[1] = piVar1[1];" (assignment_expression "piVar7[1] = piVar1[1]" (subscript_expression "piVar7[1]" identifier [ number_literal ]) = (subscript_expression "piVar1[1]" identifier [ number_literal ])) ;) (expression_statement "piVar7[2] = piVar1[2];" (assignment_expression "piVar7[2] = piVar1[2]" (subscript_expression "piVar7[2]" identifier [ number_literal ]) = (subscript_expression "piVar1[2]" identifier [ number_literal ])) ;) (expression_statement "iVar2 = piVar1[3];" (assignment_expression "iVar2 = piVar1[3]" identifier = (subscript_expression "piVar1[3]" identifier [ number_literal ])) ;) (expression_statement "piVar7[4] = 0;" (assignment_expression "piVar7[4] = 0" (subscript_expression "piVar7[4]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "piVar7[3] = iVar2;" (assignment_expression "piVar7[3] = iVar2" (subscript_expression "piVar7[3]" identifier [ number_literal ]) = identifier) ;) (return_statement "return piVar7;" return identifier ;) })) (expression_statement "pbVar8 = pbVar8 + 1;" (assignment_expression "pbVar8 = pbVar8 + 1" identifier = (binary_expression "pbVar8 + 1" identifier + number_literal)) ;) (if_statement "if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;" if (parenthesized_expression "((byte *)(unaff_EDI + 0xa21a2) == pbVar8)" ( (binary_expression "(byte *)(unaff_EDI + 0xa21a2) == pbVar8" (cast_expression "(byte *)(unaff_EDI + 0xa21a2)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(unaff_EDI + 0xa21a2)" ( (binary_expression "unaff_EDI + 0xa21a2" identifier + number_literal) ))) == identifier) )) (goto_statement "goto LAB_0005ad46;" goto statement_identifier ;)) (expression_statement "local_25 = *pbVar8;" (assignment_expression "local_25 = *pbVar8" identifier = (pointer_expression "*pbVar8" * identifier)) ;) (if_statement "if (iVar5 != 0) break;" if (parenthesized_expression "(iVar5 != 0)" ( (binary_expression "iVar5 != 0" identifier != number_literal) )) (break_statement "break;" break ;)) (labeled_statement "LAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);" statement_identifier : (expression_statement "iVar6 = *(int *)(iVar2 + 8);" (assignment_expression "iVar6 = *(int *)(iVar2 + 8)" identifier = (pointer_expression "*(int *)(iVar2 + 8)" * (cast_expression "(int *)(iVar2 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 8)" ( (binary_expression "iVar2 + 8" identifier + number_literal) ))))) ;)) })) }) while (parenthesized_expression "( true )" ( true )) ;) })) (labeled_statement "LAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);" statement_identifier : (expression_statement "FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);" (call_expression "FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3)" identifier (argument_list "(piVar4,&UNK_000a85ef + unaff_EDI,param_3)" ( identifier , (binary_expression "&UNK_000a85ef + unaff_EDI" (pointer_expression "&UNK_000a85ef" & identifier) + identifier) , identifier ))) ;)) (expression_statement "piVar4[3] = 0x101;" (assignment_expression "piVar4[3] = 0x101" (subscript_expression "piVar4[3]" identifier [ number_literal ]) = number_literal) ;) (return_statement "return (int *)0x0;" return (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal) ;) })))
(translation_unit (function_definition TYPE (pointer_declarator * (ERROR IDENT) (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) )))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( ))))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) }))) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != LIT) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) + (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) * LIT)) )))) , (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT))) ))) )) (goto_statement goto statement_identifier ;)) }) (else_clause else (compound_statement { (labeled_statement statement_identifier : (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) != LIT) )) (compound_statement { (return_statement return IDENT ;) }))) }))) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (goto_statement goto statement_identifier ;)) (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (argument_list ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) , IDENT , IDENT , IDENT ))) ;) (expression_statement (call_expression IDENT (argument_list ( ))) ;) })) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (expression_statement (call_expression IDENT (argument_list ( LIT , LIT ))) ;) })) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (argument_list ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) , IDENT , (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) , IDENT ))) ;) })) (expression_statement (call_expression IDENT (argument_list ( ))) ;) })) (labeled_statement statement_identifier : (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) })))) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != LIT) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) + (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) * LIT)) )))) , (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT))) ))) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) != LIT) )) (compound_statement { (return_statement return IDENT ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (goto_statement goto statement_identifier ;)) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (while_statement while (parenthesized_expression ( BOOL )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( ))))) ;) (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * IDENT) )) (argument_list ( ))) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) + (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) * LIT)) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) != LIT) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (return_statement return IDENT ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))) == IDENT) )) (goto_statement goto statement_identifier ;)) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (break_statement break ;)) (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;)) })) }) while (parenthesized_expression ( BOOL )) ;) })) (labeled_statement statement_identifier : (expression_statement (call_expression IDENT (argument_list ( IDENT , (binary_expression (pointer_expression & IDENT) + IDENT) , IDENT ))) ;)) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (return_statement return (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT) ;) })))
(function_definition "int * __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)\n\n{\n  int *piVar1;\n  int iVar2;\n  code *pcVar3;\n  int *piVar4;\n  int iVar5;\n  int iVar6;\n  int *extraout_ECX;\n  int *piVar7;\n  byte *pbVar8;\n  int unaff_EDI;\n  byte local_25;\n  \n  piVar4 = (int *)FUN_000196fd();\n  iVar2 = *piVar4;\n  piVar7 = extraout_ECX;\n  if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }\n  if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }\n  if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }\nLAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }\n  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }\nLAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);\n  piVar4[3] = 0x101;\n  return (int *)0x0;\n}" (primitive_type "int") (pointer_declarator "* __regparm2 FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)" (* "*") (ERROR "__regparm2" (identifier "__regparm2")) (function_declarator "FUN_0005ac00(undefined4 param_1,byte param_2,int param_3)" (identifier "FUN_0005ac00") (parameter_list "(undefined4 param_1,byte param_2,int param_3)" (( "(") (parameter_declaration "undefined4 param_1" (type_identifier "undefined4") (identifier "param_1")) (, ",") (parameter_declaration "byte param_2" (type_identifier "byte") (identifier "param_2")) (, ",") (parameter_declaration "int param_3" (primitive_type "int") (identifier "param_3")) () ")")))) (compound_statement "{\n  int *piVar1;\n  int iVar2;\n  code *pcVar3;\n  int *piVar4;\n  int iVar5;\n  int iVar6;\n  int *extraout_ECX;\n  int *piVar7;\n  byte *pbVar8;\n  int unaff_EDI;\n  byte local_25;\n  \n  piVar4 = (int *)FUN_000196fd();\n  iVar2 = *piVar4;\n  piVar7 = extraout_ECX;\n  if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }\n  if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }\n  if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }\nLAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }\n  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }\nLAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);\n  piVar4[3] = 0x101;\n  return (int *)0x0;\n}" ({ "{") (declaration "int *piVar1;" (primitive_type "int") (pointer_declarator "*piVar1" (* "*") (identifier "piVar1")) (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (declaration "code *pcVar3;" (type_identifier "code") (pointer_declarator "*pcVar3" (* "*") (identifier "pcVar3")) (; ";")) (declaration "int *piVar4;" (primitive_type "int") (pointer_declarator "*piVar4" (* "*") (identifier "piVar4")) (; ";")) (declaration "int iVar5;" (primitive_type "int") (identifier "iVar5") (; ";")) (declaration "int iVar6;" (primitive_type "int") (identifier "iVar6") (; ";")) (declaration "int *extraout_ECX;" (primitive_type "int") (pointer_declarator "*extraout_ECX" (* "*") (identifier "extraout_ECX")) (; ";")) (declaration "int *piVar7;" (primitive_type "int") (pointer_declarator "*piVar7" (* "*") (identifier "piVar7")) (; ";")) (declaration "byte *pbVar8;" (type_identifier "byte") (pointer_declarator "*pbVar8" (* "*") (identifier "pbVar8")) (; ";")) (declaration "int unaff_EDI;" (primitive_type "int") (identifier "unaff_EDI") (; ";")) (declaration "byte local_25;" (type_identifier "byte") (identifier "local_25") (; ";")) (expression_statement "piVar4 = (int *)FUN_000196fd();" (assignment_expression "piVar4 = (int *)FUN_000196fd()" (identifier "piVar4") (= "=") (cast_expression "(int *)FUN_000196fd()" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "FUN_000196fd()" (identifier "FUN_000196fd") (argument_list "()" (( "(") () ")"))))) (; ";")) (expression_statement "iVar2 = *piVar4;" (assignment_expression "iVar2 = *piVar4" (identifier "iVar2") (= "=") (pointer_expression "*piVar4" (* "*") (identifier "piVar4"))) (; ";")) (expression_statement "piVar7 = extraout_ECX;" (assignment_expression "piVar7 = extraout_ECX" (identifier "piVar7") (= "=") (identifier "extraout_ECX")) (; ";")) (if_statement "if (extraout_ECX == (int *)0x0) {\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }\n  else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" (if "if") (parenthesized_expression "(extraout_ECX == (int *)0x0)" (( "(") (binary_expression "extraout_ECX == (int *)0x0" (identifier "extraout_ECX") (== "==") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }\n    if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;\n  }" ({ "{") (if_statement "if (param_3 == 0) {\n      iVar5 = *(int *)(iVar2 + 8);\n    }\n    else {\n      iVar5 = FUN_00028f30();\n    }" (if "if") (parenthesized_expression "(param_3 == 0)" (( "(") (binary_expression "param_3 == 0" (identifier "param_3") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n      iVar5 = *(int *)(iVar2 + 8);\n    }" ({ "{") (expression_statement "iVar5 = *(int *)(iVar2 + 8);" (assignment_expression "iVar5 = *(int *)(iVar2 + 8)" (identifier "iVar5") (= "=") (pointer_expression "*(int *)(iVar2 + 8)" (* "*") (cast_expression "(int *)(iVar2 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 8)" (( "(") (binary_expression "iVar2 + 8" (identifier "iVar2") (+ "+") (number_literal "8")) () ")"))))) (; ";")) (} "}")) (else_clause "else {\n      iVar5 = FUN_00028f30();\n    }" (else "else") (compound_statement "{\n      iVar5 = FUN_00028f30();\n    }" ({ "{") (expression_statement "iVar5 = FUN_00028f30();" (assignment_expression "iVar5 = FUN_00028f30()" (identifier "iVar5") (= "=") (call_expression "FUN_00028f30()" (identifier "FUN_00028f30") (argument_list "()" (( "(") () ")")))) (; ";")) (} "}")))) (if_statement "if ((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))\n    goto LAB_0005ac21;" (if "if") (parenthesized_expression "((iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))" (( "(") (binary_expression "(iVar5 != 0) &&\n       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (parenthesized_expression "(iVar5 != 0)" (( "(") (binary_expression "iVar5 != 0" (identifier "iVar5") (!= "!=") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "(piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (( "(") (comma_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0" (assignment_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" (identifier "piVar7") (= "=") (cast_expression "(int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar5 + -0x14 + (uint)param_2 * 0x14)" (( "(") (binary_expression "iVar5 + -0x14 + (uint)param_2 * 0x14" (binary_expression "iVar5 + -0x14" (identifier "iVar5") (+ "+") (number_literal "-0x14")) (+ "+") (binary_expression "(uint)param_2 * 0x14" (cast_expression "(uint)param_2" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (identifier "param_2")) (* "*") (number_literal "0x14"))) () ")")))) (, ",") (binary_expression "piVar7 != (int *)0x0" (identifier "piVar7") (!= "!=") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0")))) () ")"))) () ")")) (goto_statement "goto LAB_0005ac21;" (goto "goto") (statement_identifier "LAB_0005ac21") (; ";"))) (} "}")) (else_clause "else {\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" (else "else") (compound_statement "{\nLAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n  }" ({ "{") (labeled_statement "LAB_0005ac21:\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }" (statement_identifier "LAB_0005ac21") (: ":") (if_statement "if (piVar7[3] != 0) {\n      return piVar7;\n    }" (if "if") (parenthesized_expression "(piVar7[3] != 0)" (( "(") (binary_expression "piVar7[3] != 0" (subscript_expression "piVar7[3]" (identifier "piVar7") ([ "[") (number_literal "3") (] "]")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      return piVar7;\n    }" ({ "{") (return_statement "return piVar7;" (return "return") (identifier "piVar7") (; ";")) (} "}")))) (} "}")))) (if_statement "if (*(int *)(iVar2 + 0xfc) != 0) {\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }" (if "if") (parenthesized_expression "(*(int *)(iVar2 + 0xfc) != 0)" (( "(") (binary_expression "*(int *)(iVar2 + 0xfc) != 0" (pointer_expression "*(int *)(iVar2 + 0xfc)" (* "*") (cast_expression "(int *)(iVar2 + 0xfc)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0xfc)" (( "(") (binary_expression "iVar2 + 0xfc" (identifier "iVar2") (+ "+") (number_literal "0xfc")) () ")")))) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    iVar5 = FUN_00027060();\n    if (iVar5 == 0) goto LAB_0005ad18;\n    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);\n    FUN_00024d80();\n  }" ({ "{") (expression_statement "iVar5 = FUN_00027060();" (assignment_expression "iVar5 = FUN_00027060()" (identifier "iVar5") (= "=") (call_expression "FUN_00027060()" (identifier "FUN_00027060") (argument_list "()" (( "(") () ")")))) (; ";")) (if_statement "if (iVar5 == 0) goto LAB_0005ad18;" (if "if") (parenthesized_expression "(iVar5 == 0)" (( "(") (binary_expression "iVar5 == 0" (identifier "iVar5") (== "==") (number_literal "0")) () ")")) (goto_statement "goto LAB_0005ad18;" (goto "goto") (statement_identifier "LAB_0005ad18") (; ";"))) (expression_statement "(**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);" (call_expression "(**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5)" (parenthesized_expression "(**(code **)(iVar2 + 0xfc))" (( "(") (pointer_expression "**(code **)(iVar2 + 0xfc)" (* "*") (pointer_expression "*(code **)(iVar2 + 0xfc)" (* "*") (cast_expression "(code **)(iVar2 + 0xfc)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(iVar2 + 0xfc)" (( "(") (binary_expression "iVar2 + 0xfc" (identifier "iVar2") (+ "+") (number_literal "0xfc")) () ")"))))) () ")")) (argument_list "(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5)" (( "(") (pointer_expression "*(undefined4 *)(iVar2 + 0x104)" (* "*") (cast_expression "(undefined4 *)(iVar2 + 0x104)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x104)" (( "(") (binary_expression "iVar2 + 0x104" (identifier "iVar2") (+ "+") (number_literal "0x104")) () ")")))) (, ",") (identifier "iVar2") (, ",") (identifier "param_2") (, ",") (identifier "iVar5") () ")"))) (; ";")) (expression_statement "FUN_00024d80();" (call_expression "FUN_00024d80()" (identifier "FUN_00024d80") (argument_list "()" (( "(") () ")"))) (; ";")) (} "}"))) (if_statement "if (*(int *)(iVar2 + 0x100) != 0) {\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }" (if "if") (parenthesized_expression "(*(int *)(iVar2 + 0x100) != 0)" (( "(") (binary_expression "*(int *)(iVar2 + 0x100) != 0" (pointer_expression "*(int *)(iVar2 + 0x100)" (* "*") (cast_expression "(int *)(iVar2 + 0x100)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x100)" (( "(") (binary_expression "iVar2 + 0x100" (identifier "iVar2") (+ "+") (number_literal "0x100")) () ")")))) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    iVar5 = FUN_00026c00();\n    if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }\n    iVar5 = FUN_0004ce10();\n    if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }\n    FUN_00025480();\n  }" ({ "{") (expression_statement "iVar5 = FUN_00026c00();" (assignment_expression "iVar5 = FUN_00026c00()" (identifier "iVar5") (= "=") (call_expression "FUN_00026c00()" (identifier "FUN_00026c00") (argument_list "()" (( "(") () ")")))) (; ";")) (if_statement "if (iVar5 != 0) {\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }" (if "if") (parenthesized_expression "(iVar5 != 0)" (( "(") (binary_expression "iVar5 != 0" (identifier "iVar5") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      *(int *)(iVar5 + 0x20) = iVar2;\n      *(undefined2 *)(iVar5 + 8) = 1;\n      FUN_00045350(1,0);\n    }" ({ "{") (expression_statement "*(int *)(iVar5 + 0x20) = iVar2;" (assignment_expression "*(int *)(iVar5 + 0x20) = iVar2" (pointer_expression "*(int *)(iVar5 + 0x20)" (* "*") (cast_expression "(int *)(iVar5 + 0x20)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar5 + 0x20)" (( "(") (binary_expression "iVar5 + 0x20" (identifier "iVar5") (+ "+") (number_literal "0x20")) () ")")))) (= "=") (identifier "iVar2")) (; ";")) (expression_statement "*(undefined2 *)(iVar5 + 8) = 1;" (assignment_expression "*(undefined2 *)(iVar5 + 8) = 1" (pointer_expression "*(undefined2 *)(iVar5 + 8)" (* "*") (cast_expression "(undefined2 *)(iVar5 + 8)" (( "(") (type_descriptor "undefined2 *" (type_identifier "undefined2") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar5 + 8)" (( "(") (binary_expression "iVar5 + 8" (identifier "iVar5") (+ "+") (number_literal "8")) () ")")))) (= "=") (number_literal "1")) (; ";")) (expression_statement "FUN_00045350(1,0);" (call_expression "FUN_00045350(1,0)" (identifier "FUN_00045350") (argument_list "(1,0)" (( "(") (number_literal "1") (, ",") (number_literal "0") () ")"))) (; ";")) (} "}"))) (expression_statement "iVar5 = FUN_0004ce10();" (assignment_expression "iVar5 = FUN_0004ce10()" (identifier "iVar5") (= "=") (call_expression "FUN_0004ce10()" (identifier "FUN_0004ce10") (argument_list "()" (( "(") () ")")))) (; ";")) (if_statement "if (iVar5 != 0) {\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }" (if "if") (parenthesized_expression "(iVar5 != 0)" (( "(") (binary_expression "iVar5 != 0" (identifier "iVar5") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      (**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);\n    }" ({ "{") (expression_statement "(**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);" (call_expression "(**(code **)(iVar2 + 0x100))\n                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5)" (parenthesized_expression "(**(code **)(iVar2 + 0x100))" (( "(") (pointer_expression "**(code **)(iVar2 + 0x100)" (* "*") (pointer_expression "*(code **)(iVar2 + 0x100)" (* "*") (cast_expression "(code **)(iVar2 + 0x100)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(iVar2 + 0x100)" (( "(") (binary_expression "iVar2 + 0x100" (identifier "iVar2") (+ "+") (number_literal "0x100")) () ")"))))) () ")")) (argument_list "(*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5)" (( "(") (pointer_expression "*(undefined4 *)(iVar2 + 0x104)" (* "*") (cast_expression "(undefined4 *)(iVar2 + 0x104)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x104)" (( "(") (binary_expression "iVar2 + 0x104" (identifier "iVar2") (+ "+") (number_literal "0x104")) () ")")))) (, ",") (identifier "iVar2") (, ",") (pointer_expression "*(undefined1 *)(iVar2 + 0x4a)" (* "*") (cast_expression "(undefined1 *)(iVar2 + 0x4a)" (( "(") (type_descriptor "undefined1 *" (type_identifier "undefined1") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x4a)" (( "(") (binary_expression "iVar2 + 0x4a" (identifier "iVar2") (+ "+") (number_literal "0x4a")) () ")")))) (, ",") (identifier "iVar5") () ")"))) (; ";")) (} "}"))) (expression_statement "FUN_00025480();" (call_expression "FUN_00025480()" (identifier "FUN_00025480") (argument_list "()" (( "(") () ")"))) (; ";")) (} "}"))) (labeled_statement "LAB_0005ad18:\n  if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }" (statement_identifier "LAB_0005ad18") (: ":") (if_statement "if (param_3 == 0) {\n    iVar5 = *(int *)(iVar2 + 8);\n  }\n  else {\n    iVar5 = FUN_00028f30();\n  }" (if "if") (parenthesized_expression "(param_3 == 0)" (( "(") (binary_expression "param_3 == 0" (identifier "param_3") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n    iVar5 = *(int *)(iVar2 + 8);\n  }" ({ "{") (expression_statement "iVar5 = *(int *)(iVar2 + 8);" (assignment_expression "iVar5 = *(int *)(iVar2 + 8)" (identifier "iVar5") (= "=") (pointer_expression "*(int *)(iVar2 + 8)" (* "*") (cast_expression "(int *)(iVar2 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 8)" (( "(") (binary_expression "iVar2 + 8" (identifier "iVar2") (+ "+") (number_literal "8")) () ")"))))) (; ";")) (} "}")) (else_clause "else {\n    iVar5 = FUN_00028f30();\n  }" (else "else") (compound_statement "{\n    iVar5 = FUN_00028f30();\n  }" ({ "{") (expression_statement "iVar5 = FUN_00028f30();" (assignment_expression "iVar5 = FUN_00028f30()" (identifier "iVar5") (= "=") (call_expression "FUN_00028f30()" (identifier "FUN_00028f30") (argument_list "()" (( "(") () ")")))) (; ";")) (} "}"))))) (if_statement "if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     ) {\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }" (if "if") (parenthesized_expression "((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)\n     )" (( "(") (binary_expression "(iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (parenthesized_expression "(iVar5 != 0)" (( "(") (binary_expression "iVar5 != 0" (identifier "iVar5") (!= "!=") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "(piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)" (( "(") (comma_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0" (assignment_expression "piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" (identifier "piVar7") (= "=") (cast_expression "(int *)(iVar5 + -0x14 + (uint)param_2 * 0x14)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar5 + -0x14 + (uint)param_2 * 0x14)" (( "(") (binary_expression "iVar5 + -0x14 + (uint)param_2 * 0x14" (binary_expression "iVar5 + -0x14" (identifier "iVar5") (+ "+") (number_literal "-0x14")) (+ "+") (binary_expression "(uint)param_2 * 0x14" (cast_expression "(uint)param_2" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (identifier "param_2")) (* "*") (number_literal "0x14"))) () ")")))) (, ",") (binary_expression "piVar7 != (int *)0x0" (identifier "piVar7") (!= "!=") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0")))) () ")"))) () ")")) (compound_statement "{\n    if (piVar7[3] != 0) {\n      return piVar7;\n    }\n    iVar5 = *piVar7;\n    local_25 = 3;\n    pbVar8 = (byte *)(unaff_EDI + 0xa219f);\n    if (iVar5 == 0) goto LAB_0005adeb;\n    do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );\n  }" ({ "{") (if_statement "if (piVar7[3] != 0) {\n      return piVar7;\n    }" (if "if") (parenthesized_expression "(piVar7[3] != 0)" (( "(") (binary_expression "piVar7[3] != 0" (subscript_expression "piVar7[3]" (identifier "piVar7") ([ "[") (number_literal "3") (] "]")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      return piVar7;\n    }" ({ "{") (return_statement "return piVar7;" (return "return") (identifier "piVar7") (; ";")) (} "}"))) (expression_statement "iVar5 = *piVar7;" (assignment_expression "iVar5 = *piVar7" (identifier "iVar5") (= "=") (pointer_expression "*piVar7" (* "*") (identifier "piVar7"))) (; ";")) (expression_statement "local_25 = 3;" (assignment_expression "local_25 = 3" (identifier "local_25") (= "=") (number_literal "3")) (; ";")) (expression_statement "pbVar8 = (byte *)(unaff_EDI + 0xa219f);" (assignment_expression "pbVar8 = (byte *)(unaff_EDI + 0xa219f)" (identifier "pbVar8") (= "=") (cast_expression "(byte *)(unaff_EDI + 0xa219f)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(unaff_EDI + 0xa219f)" (( "(") (binary_expression "unaff_EDI + 0xa219f" (identifier "unaff_EDI") (+ "+") (number_literal "0xa219f")) () ")")))) (; ";")) (if_statement "if (iVar5 == 0) goto LAB_0005adeb;" (if "if") (parenthesized_expression "(iVar5 == 0)" (( "(") (binary_expression "iVar5 == 0" (identifier "iVar5") (== "==") (number_literal "0")) () ")")) (goto_statement "goto LAB_0005adeb;" (goto "goto") (statement_identifier "LAB_0005adeb") (; ";"))) (do_statement "do {\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    } while( true );" (do "do") (compound_statement "{\n      iVar6 = FUN_00028f30();\n      while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }\n    }" ({ "{") (expression_statement "iVar6 = FUN_00028f30();" (assignment_expression "iVar6 = FUN_00028f30()" (identifier "iVar6") (= "=") (call_expression "FUN_00028f30()" (identifier "FUN_00028f30") (argument_list "()" (( "(") () ")")))) (; ";")) (while_statement "while( true ) {\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }" (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (compound_statement "{\n        if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }\n        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);\n        if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }\n        pbVar8 = pbVar8 + 1;\n        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;\n        local_25 = *pbVar8;\n        if (iVar5 != 0) break;\nLAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);\n      }" ({ "{") (if_statement "if (iVar6 == 0) {\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }" (if "if") (parenthesized_expression "(iVar6 == 0)" (( "(") (binary_expression "iVar6 == 0" (identifier "iVar6") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n                    \n          pcVar3 = (code *)invalidInstructionException();\n          (*pcVar3)();\n        }" ({ "{") (expression_statement "pcVar3 = (code *)invalidInstructionException();" (assignment_expression "pcVar3 = (code *)invalidInstructionException()" (identifier "pcVar3") (= "=") (cast_expression "(code *)invalidInstructionException()" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "invalidInstructionException()" (identifier "invalidInstructionException") (argument_list "()" (( "(") () ")"))))) (; ";")) (expression_statement "(*pcVar3)();" (call_expression "(*pcVar3)()" (parenthesized_expression "(*pcVar3)" (( "(") (pointer_expression "*pcVar3" (* "*") (identifier "pcVar3")) () ")")) (argument_list "()" (( "(") () ")"))) (; ";")) (} "}"))) (expression_statement "piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);" (assignment_expression "piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14)" (identifier "piVar1") (= "=") (cast_expression "(int *)(iVar6 + -0x14 + (uint)local_25 * 0x14)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar6 + -0x14 + (uint)local_25 * 0x14)" (( "(") (binary_expression "iVar6 + -0x14 + (uint)local_25 * 0x14" (binary_expression "iVar6 + -0x14" (identifier "iVar6") (+ "+") (number_literal "-0x14")) (+ "+") (binary_expression "(uint)local_25 * 0x14" (cast_expression "(uint)local_25" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (identifier "local_25")) (* "*") (number_literal "0x14"))) () ")")))) (; ";")) (if_statement "if (piVar1[3] != 0) {\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }" (if "if") (parenthesized_expression "(piVar1[3] != 0)" (( "(") (binary_expression "piVar1[3] != 0" (subscript_expression "piVar1[3]" (identifier "piVar1") ([ "[") (number_literal "3") (] "]")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n          *piVar7 = *piVar1;\n          piVar7[1] = piVar1[1];\n          piVar7[2] = piVar1[2];\n          iVar2 = piVar1[3];\n          piVar7[4] = 0;\n          piVar7[3] = iVar2;\n          return piVar7;\n        }" ({ "{") (expression_statement "*piVar7 = *piVar1;" (assignment_expression "*piVar7 = *piVar1" (pointer_expression "*piVar7" (* "*") (identifier "piVar7")) (= "=") (pointer_expression "*piVar1" (* "*") (identifier "piVar1"))) (; ";")) (expression_statement "piVar7[1] = piVar1[1];" (assignment_expression "piVar7[1] = piVar1[1]" (subscript_expression "piVar7[1]" (identifier "piVar7") ([ "[") (number_literal "1") (] "]")) (= "=") (subscript_expression "piVar1[1]" (identifier "piVar1") ([ "[") (number_literal "1") (] "]"))) (; ";")) (expression_statement "piVar7[2] = piVar1[2];" (assignment_expression "piVar7[2] = piVar1[2]" (subscript_expression "piVar7[2]" (identifier "piVar7") ([ "[") (number_literal "2") (] "]")) (= "=") (subscript_expression "piVar1[2]" (identifier "piVar1") ([ "[") (number_literal "2") (] "]"))) (; ";")) (expression_statement "iVar2 = piVar1[3];" (assignment_expression "iVar2 = piVar1[3]" (identifier "iVar2") (= "=") (subscript_expression "piVar1[3]" (identifier "piVar1") ([ "[") (number_literal "3") (] "]"))) (; ";")) (expression_statement "piVar7[4] = 0;" (assignment_expression "piVar7[4] = 0" (subscript_expression "piVar7[4]" (identifier "piVar7") ([ "[") (number_literal "4") (] "]")) (= "=") (number_literal "0")) (; ";")) (expression_statement "piVar7[3] = iVar2;" (assignment_expression "piVar7[3] = iVar2" (subscript_expression "piVar7[3]" (identifier "piVar7") ([ "[") (number_literal "3") (] "]")) (= "=") (identifier "iVar2")) (; ";")) (return_statement "return piVar7;" (return "return") (identifier "piVar7") (; ";")) (} "}"))) (expression_statement "pbVar8 = pbVar8 + 1;" (assignment_expression "pbVar8 = pbVar8 + 1" (identifier "pbVar8") (= "=") (binary_expression "pbVar8 + 1" (identifier "pbVar8") (+ "+") (number_literal "1"))) (; ";")) (if_statement "if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;" (if "if") (parenthesized_expression "((byte *)(unaff_EDI + 0xa21a2) == pbVar8)" (( "(") (binary_expression "(byte *)(unaff_EDI + 0xa21a2) == pbVar8" (cast_expression "(byte *)(unaff_EDI + 0xa21a2)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(unaff_EDI + 0xa21a2)" (( "(") (binary_expression "unaff_EDI + 0xa21a2" (identifier "unaff_EDI") (+ "+") (number_literal "0xa21a2")) () ")"))) (== "==") (identifier "pbVar8")) () ")")) (goto_statement "goto LAB_0005ad46;" (goto "goto") (statement_identifier "LAB_0005ad46") (; ";"))) (expression_statement "local_25 = *pbVar8;" (assignment_expression "local_25 = *pbVar8" (identifier "local_25") (= "=") (pointer_expression "*pbVar8" (* "*") (identifier "pbVar8"))) (; ";")) (if_statement "if (iVar5 != 0) break;" (if "if") (parenthesized_expression "(iVar5 != 0)" (( "(") (binary_expression "iVar5 != 0" (identifier "iVar5") (!= "!=") (number_literal "0")) () ")")) (break_statement "break;" (break "break") (; ";"))) (labeled_statement "LAB_0005adeb:\n        iVar6 = *(int *)(iVar2 + 8);" (statement_identifier "LAB_0005adeb") (: ":") (expression_statement "iVar6 = *(int *)(iVar2 + 8);" (assignment_expression "iVar6 = *(int *)(iVar2 + 8)" (identifier "iVar6") (= "=") (pointer_expression "*(int *)(iVar2 + 8)" (* "*") (cast_expression "(int *)(iVar2 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 8)" (( "(") (binary_expression "iVar2 + 8" (identifier "iVar2") (+ "+") (number_literal "8")) () ")"))))) (; ";"))) (} "}"))) (} "}")) (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (; ";")) (} "}"))) (labeled_statement "LAB_0005ad46:\n  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);" (statement_identifier "LAB_0005ad46") (: ":") (expression_statement "FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);" (call_expression "FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3)" (identifier "FUN_000578c0") (argument_list "(piVar4,&UNK_000a85ef + unaff_EDI,param_3)" (( "(") (identifier "piVar4") (, ",") (binary_expression "&UNK_000a85ef + unaff_EDI" (pointer_expression "&UNK_000a85ef" (& "&") (identifier "UNK_000a85ef")) (+ "+") (identifier "unaff_EDI")) (, ",") (identifier "param_3") () ")"))) (; ";"))) (expression_statement "piVar4[3] = 0x101;" (assignment_expression "piVar4[3] = 0x101" (subscript_expression "piVar4[3]" (identifier "piVar4") ([ "[") (number_literal "3") (] "]")) (= "=") (number_literal "0x101")) (; ";")) (return_statement "return (int *)0x0;" (return "return") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0")) (; ";")) (} "}")))
(translation_unit (function_definition type: (primitive_type) declarator: (pointer_declarator (ERROR (identifier)) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (primitive_type) declarator: (identifier))))) body: (compound_statement (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (call_expression function: (identifier) arguments: (argument_list))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))))) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal))))))) consequence: (goto_statement label: (statement_identifier)))) alternative: (else_clause (compound_statement (labeled_statement label: (statement_identifier) (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) consequence: (compound_statement (return_statement (identifier)))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (goto_statement label: (statement_identifier))) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) arguments: (argument_list (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) (identifier) (identifier) (identifier)))) (expression_statement (call_expression function: (identifier) arguments: (argument_list))))) (if_statement condition: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (number_literal) (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) arguments: (argument_list (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) (identifier) (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) (identifier)))))) (expression_statement (call_expression function: (identifier) arguments: (argument_list))))) (labeled_statement label: (statement_identifier) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))))) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal))))))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) consequence: (compound_statement (return_statement (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (goto_statement label: (statement_identifier))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (while_statement condition: (parenthesized_expression (true)) body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (identifier) arguments: (argument_list))))) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (identifier))) arguments: (argument_list))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (return_statement (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))) right: (identifier))) consequence: (goto_statement label: (statement_identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (break_statement)) (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))))))) condition: (parenthesized_expression (true))))) (labeled_statement label: (statement_identifier) (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (binary_expression left: (pointer_expression argument: (identifier)) right: (identifier)) (identifier))))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (return_statement (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal))))))

int * __regparm2 MASKED(undefined4 param_1,byte param_2,int param_3)

{
  int *piVar1;
  int iVar2;
  code *pcVar3;
  int *piVar4;
  int iVar5;
  int iVar6;
  int *extraout_ECX;
  int *piVar7;
  byte *pbVar8;
  int unaff_EDI;
  byte local_25;
  
  piVar4 = (int *)FUN_000196fd();
  iVar2 = *piVar4;
  piVar7 = extraout_ECX;
  if (extraout_ECX == (int *)0x0) {
    if (param_3 == 0) {
      iVar5 = *(int *)(iVar2 + 8);
    }
    else {
      iVar5 = FUN_00028f30();
    }
    if ((iVar5 != 0) &&
       (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0))
    goto LAB_0005ac21;
  }
  else {
LAB_0005ac21:
    if (piVar7[3] != 0) {
      return piVar7;
    }
  }
  if (*(int *)(iVar2 + 0xfc) != 0) {
    iVar5 = FUN_00027060();
    if (iVar5 == 0) goto LAB_0005ad18;
    (**(code **)(iVar2 + 0xfc))(*(undefined4 *)(iVar2 + 0x104),iVar2,param_2,iVar5);
    FUN_00024d80();
  }
  if (*(int *)(iVar2 + 0x100) != 0) {
    iVar5 = FUN_00026c00();
    if (iVar5 != 0) {
      *(int *)(iVar5 + 0x20) = iVar2;
      *(undefined2 *)(iVar5 + 8) = 1;
      FUN_00045350(1,0);
    }
    iVar5 = FUN_0004ce10();
    if (iVar5 != 0) {
      (**(code **)(iVar2 + 0x100))
                (*(undefined4 *)(iVar2 + 0x104),iVar2,*(undefined1 *)(iVar2 + 0x4a),iVar5);
    }
    FUN_00025480();
  }
LAB_0005ad18:
  if (param_3 == 0) {
    iVar5 = *(int *)(iVar2 + 8);
  }
  else {
    iVar5 = FUN_00028f30();
  }
  if ((iVar5 != 0) && (piVar7 = (int *)(iVar5 + -0x14 + (uint)param_2 * 0x14), piVar7 != (int *)0x0)
     ) {
    if (piVar7[3] != 0) {
      return piVar7;
    }
    iVar5 = *piVar7;
    local_25 = 3;
    pbVar8 = (byte *)(unaff_EDI + 0xa219f);
    if (iVar5 == 0) goto LAB_0005adeb;
    do {
      iVar6 = FUN_00028f30();
      while( true ) {
        if (iVar6 == 0) {
                    /* WARNING: Does not return */
          pcVar3 = (code *)invalidInstructionException();
          (*pcVar3)();
        }
        piVar1 = (int *)(iVar6 + -0x14 + (uint)local_25 * 0x14);
        if (piVar1[3] != 0) {
          *piVar7 = *piVar1;
          piVar7[1] = piVar1[1];
          piVar7[2] = piVar1[2];
          iVar2 = piVar1[3];
          piVar7[4] = 0;
          piVar7[3] = iVar2;
          return piVar7;
        }
        pbVar8 = pbVar8 + 1;
        if ((byte *)(unaff_EDI + 0xa21a2) == pbVar8) goto LAB_0005ad46;
        local_25 = *pbVar8;
        if (iVar5 != 0) break;
LAB_0005adeb:
        iVar6 = *(int *)(iVar2 + 8);
      }
    } while( true );
  }
LAB_0005ad46:
  FUN_000578c0(piVar4,&UNK_000a85ef + unaff_EDI,param_3);
  piVar4[3] = 0x101;
  return (int *)0x0;
}

