
/* std::istream::ignore(long) */

istream * __thiscall std::istream::ignore(istream *this,long param_1)

{
  long *plVar1;
  uint uVar2;
  int iVar3;
  byte *pbVar4;
  istream *piVar5;
  long lVar6;
  long lVar7;
  byte *pbVar8;
  sentry sVar9;
  sentry local_39 [9];
  
  if (param_1 == 1) {
    piVar5 = (istream *)ignore(this);
    return piVar5;
  }
  *(undefined8 *)(this + 8) = 0;
  sentry::sentry(local_39,this,true);
  if ((param_1 < 1) || (local_39[0] == (sentry)0x0)) {
    return this;
  }
  plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8);
  if ((byte *)plVar1[2] < (byte *)plVar1[3]) {
    uVar2 = (uint)*(byte *)plVar1[2];
  }
  else {
    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);
  }
  lVar7 = *(long *)(this + 8);
  sVar9 = (sentry)0x0;
  do {
    while (lVar7 < param_1) {
      if (uVar2 == 0xffffffff) {
LAB_002f6fe8:
        if (param_1 != 0x7fffffffffffffff) {
          if (sVar9 != (sentry)0x0) {
            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;
          }
          goto LAB_002f7043;
        }
        goto LAB_002f7030;
      }
      pbVar8 = (byte *)plVar1[3];
      pbVar4 = (byte *)plVar1[2];
      lVar6 = param_1 - lVar7;
      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {
        lVar6 = (long)pbVar8 - (long)pbVar4;
      }
      if (lVar6 < 2) {
        *(long *)(this + 8) = lVar7 + 1;
        if (pbVar4 < pbVar8) {
          pbVar4 = pbVar4 + 1;
          plVar1[2] = (long)pbVar4;
        }
        else {
          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);
          if (iVar3 == -1) goto LAB_002f6fe8;
          pbVar4 = (byte *)plVar1[2];
          pbVar8 = (byte *)plVar1[3];
        }
        if (pbVar8 <= pbVar4) goto LAB_002f7060;
        uVar2 = (uint)*pbVar4;
        lVar7 = *(long *)(this + 8);
      }
      else {
        pbVar4 = pbVar4 + lVar6;
        lVar7 = lVar7 + lVar6;
        plVar1[2] = (long)pbVar4;
        *(long *)(this + 8) = lVar7;
        if (pbVar4 < pbVar8) {
          uVar2 = (uint)*pbVar4;
        }
        else {
LAB_002f7060:
                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */
          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);
          lVar7 = *(long *)(this + 8);
        }
      }
    }
    if (param_1 != 0x7fffffffffffffff) {
      if (sVar9 != (sentry)0x0) {
        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;
      }
      if (uVar2 != 0xffffffff) {
        return this;
      }
      goto LAB_002f7043;
    }
    if (uVar2 == 0xffffffff) {
LAB_002f7030:
      if (sVar9 != (sentry)0x0) {
        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;
      }
LAB_002f7043:
      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),
                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |
                 _S_eofbit);
      return this;
    }
    *(undefined8 *)(this + 8) = 0x8000000000000000;
    lVar7 = -0x8000000000000000;
    sVar9 = local_39[0];
  } while( true );
}



long * FUN_002f6e90(long *param_1,long param_2)

{
  uint uVar1;
  int iVar2;
  byte *pbVar3;
  long *plVar4;
  long lVar5;
  long lVar6;
  byte *pbVar7;
  char cVar8;
  char local_39 [9];
  
  if (param_2 == 1) {
    plVar4 = (long *)FUN_00297d90();
    return plVar4;
  }
  param_1[1] = 0;
  FUN_00296fe0(local_39,param_1,1);
  if ((param_2 < 1) || (local_39[0] == '\0')) {
    return param_1;
  }
  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);
  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {
    uVar1 = (uint)*(byte *)plVar4[2];
  }
  else {
    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);
  }
  lVar6 = param_1[1];
  cVar8 = '\0';
  do {
    while (lVar6 < param_2) {
      if (uVar1 == 0xffffffff) {
LAB_002f6fe8:
        if (param_2 != 0x7fffffffffffffff) {
          if (cVar8 != '\0') {
            param_1[1] = 0x7fffffffffffffff;
          }
          goto LAB_002f7043;
        }
        goto LAB_002f7030;
      }
      pbVar7 = (byte *)plVar4[3];
      pbVar3 = (byte *)plVar4[2];
      lVar5 = param_2 - lVar6;
      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {
        lVar5 = (long)pbVar7 - (long)pbVar3;
      }
      if (lVar5 < 2) {
        param_1[1] = lVar6 + 1;
        if (pbVar3 < pbVar7) {
          pbVar3 = pbVar3 + 1;
          plVar4[2] = (long)pbVar3;
        }
        else {
          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);
          if (iVar2 == -1) goto LAB_002f6fe8;
          pbVar3 = (byte *)plVar4[2];
          pbVar7 = (byte *)plVar4[3];
        }
        if (pbVar7 <= pbVar3) goto LAB_002f7060;
        uVar1 = (uint)*pbVar3;
        lVar6 = param_1[1];
      }
      else {
        pbVar3 = pbVar3 + lVar5;
        lVar6 = lVar6 + lVar5;
        plVar4[2] = (long)pbVar3;
        param_1[1] = lVar6;
        if (pbVar3 < pbVar7) {
          uVar1 = (uint)*pbVar3;
        }
        else {
LAB_002f7060:
                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */
          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);
          lVar6 = param_1[1];
        }
      }
    }
    if (param_2 != 0x7fffffffffffffff) {
      if (cVar8 != '\0') {
        param_1[1] = 0x7fffffffffffffff;
      }
      if (uVar1 != 0xffffffff) {
        return param_1;
      }
      goto LAB_002f7043;
    }
    if (uVar1 == 0xffffffff) {
LAB_002f7030:
      if (cVar8 != '\0') {
        param_1[1] = 0x7fffffffffffffff;
      }
LAB_002f7043:
      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;
      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);
      return param_1;
    }
    param_1[1] = -0x8000000000000000;
    lVar6 = -0x8000000000000000;
    cVar8 = local_39[0];
  } while( true );
}


PUSH R15
PUSH R14
PUSH R13
PUSH R12
PUSH RBP
PUSH RBX
MOV RBX,RDI
SUB RSP,0x18
CMP RSI,0x1
JZ 0x002f6fd0
MOV qword ptr [RDI + 0x8],0x0
MOV RBP,RSI
MOV RSI,RBX
LEA RDI,[RSP + 0xf]
MOV EDX,0x1
CALL 0x00296fe0
TEST RBP,RBP
JLE 0x002f6fb8
MOVZX R13D,byte ptr [RSP + 0xf]
TEST R13B,R13B
JZ 0x002f6fb8
MOV RAX,qword ptr [RBX]
MOV RAX,qword ptr [RAX + -0x18]
MOV R12,qword ptr [RBX + RAX*0x1 + 0xe8]
MOV RAX,qword ptr [R12 + 0x10]
CMP qword ptr [R12 + 0x18],RAX
JBE 0x002f7098
MOVZX EAX,byte ptr [RAX]
MOV RDX,qword ptr [RBX + 0x8]
XOR R14D,R14D
MOV R15,-0x8000000000000000
NOP dword ptr [RAX + RAX*0x1]
CMP RBP,RDX
JLE 0x002f6f6d
CMP EAX,-0x1
JZ 0x002f6fe8
MOV RSI,qword ptr [R12 + 0x18]
MOV RAX,qword ptr [R12 + 0x10]
MOV RCX,RBP
SUB RCX,RDX
MOV RDI,RSI
SUB RDI,RAX
CMP RCX,RDI
CMOVG RCX,RDI
CMP RCX,0x1
JLE 0x002f7008
ADD RAX,RCX
ADD RDX,RCX
MOV qword ptr [R12 + 0x10],RAX
MOV qword ptr [RBX + 0x8],RDX
CMP RSI,RAX
JBE 0x002f7060
MOVZX EAX,byte ptr [RAX]
CMP RBP,RDX
JG 0x002f6f1d
MOV RSI,0x7fffffffffffffff
CMP RBP,RSI
JNZ 0x002f6f98
CMP EAX,-0x1
JZ 0x002f7030
MOV qword ptr [RBX + 0x8],R15
MOV R14D,R13D
MOV RDX,-0x8000000000000000
JMP 0x002f6f18
TEST R14B,R14B
JZ 0x002f6fab
MOV RSI,0x7fffffffffffffff
MOV qword ptr [RBX + 0x8],RSI
ADD EAX,0x1
JZ 0x002f7043
NOP dword ptr [RAX]
MOV RAX,RBX
ADD RSP,0x18
POP RBX
POP RBP
POP R12
POP R13
POP R14
POP R15
RET
CALL 0x00297d90
ADD RSP,0x18
POP RBX
POP RBP
POP R12
POP R13
POP R14
POP R15
RET
MOV RAX,0x7fffffffffffffff
CMP RBP,RAX
JZ 0x002f7030
TEST R14B,R14B
JZ 0x002f7043
MOV qword ptr [RBX + 0x8],RAX
JMP 0x002f7043
ADD RDX,0x1
MOV qword ptr [RBX + 0x8],RDX
CMP RSI,RAX
JBE 0x002f7073
ADD RAX,0x1
MOV qword ptr [R12 + 0x10],RAX
CMP RSI,RAX
JBE 0x002f7060
MOVZX EAX,byte ptr [RAX]
MOV RDX,qword ptr [RBX + 0x8]
JMP 0x002f6f18
TEST R14B,R14B
JZ 0x002f7043
MOV RAX,0x7fffffffffffffff
MOV qword ptr [RBX + 0x8],RAX
MOV RAX,qword ptr [RBX]
MOV RDI,qword ptr [RAX + -0x18]
ADD RDI,RBX
MOV ESI,dword ptr [RDI + 0x20]
OR ESI,0x2
CALL 0x0029c920
MOV RAX,RBX
JMP 0x002f6fbb
MOV RAX,qword ptr [R12]
MOV RDI,R12
CALL qword ptr [RAX + 0x48]
MOV RDX,qword ptr [RBX + 0x8]
JMP 0x002f6f18
MOV RAX,qword ptr [R12]
MOV RDI,R12
CALL qword ptr [RAX + 0x50]
CMP EAX,-0x1
JZ 0x002f6fe8
MOV RAX,qword ptr [R12 + 0x10]
MOV RSI,qword ptr [R12 + 0x18]
JMP 0x002f701e
MOV RAX,qword ptr [R12]
MOV RDI,R12
CALL qword ptr [RAX + 0x48]
JMP 0x002f6f02
(translation_unit "long * FUN_002f6e90(long *param_1,long param_2)\n\n{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}\n\n" (function_definition "long * FUN_002f6e90(long *param_1,long param_2)\n\n{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_002f6e90(long *param_1,long param_2)" * (function_declarator "FUN_002f6e90(long *param_1,long param_2)" identifier (parameter_list "(long *param_1,long param_2)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) )))) (compound_statement "{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "byte *pbVar3;" type_identifier (pointer_declarator "*pbVar3" * identifier) ;) (declaration "long *plVar4;" (sized_type_specifier "long" long) (pointer_declarator "*plVar4" * identifier) ;) (declaration "long lVar5;" (sized_type_specifier "long" long) identifier ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (declaration "byte *pbVar7;" type_identifier (pointer_declarator "*pbVar7" * identifier) ;) (declaration "char cVar8;" primitive_type identifier ;) (declaration "char local_39 [9];" primitive_type (array_declarator "local_39 [9]" identifier [ number_literal ]) ;) (if_statement "if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" if (parenthesized_expression "(param_2 == 1)" ( (binary_expression "param_2 == 1" identifier == number_literal) )) (compound_statement "{\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" { (expression_statement "plVar4 = (long *)FUN_00297d90();" (assignment_expression "plVar4 = (long *)FUN_00297d90()" identifier = (cast_expression "(long *)FUN_00297d90()" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_00297d90()" identifier (argument_list "()" ( ))))) ;) (return_statement "return plVar4;" return identifier ;) })) (expression_statement "param_1[1] = 0;" (assignment_expression "param_1[1] = 0" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "FUN_00296fe0(local_39,param_1,1);" (call_expression "FUN_00296fe0(local_39,param_1,1)" identifier (argument_list "(local_39,param_1,1)" ( identifier , identifier , number_literal ))) ;) (if_statement "if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }" if (parenthesized_expression "((param_2 < 1) || (local_39[0] == '\0'))" ( (binary_expression "(param_2 < 1) || (local_39[0] == '\0')" (parenthesized_expression "(param_2 < 1)" ( (binary_expression "param_2 < 1" identifier < number_literal) )) || (parenthesized_expression "(local_39[0] == '\0')" ( (binary_expression "local_39[0] == '\0'" (subscript_expression "local_39[0]" identifier [ number_literal ]) == (char_literal "'\0'" ' escape_sequence ')) ))) )) (compound_statement "{\n    return param_1;\n  }" { (return_statement "return param_1;" return identifier ;) })) (expression_statement "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);" (assignment_expression "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" identifier = (pointer_expression "*(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" * (cast_expression "(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" ( (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8" (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18)" (cast_expression "(long)param_1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + (pointer_expression "*(long *)(*param_1 + -0x18)" * (cast_expression "(long *)(*param_1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) ))))) + number_literal) ))))) ;) (if_statement "if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" if (parenthesized_expression "((byte *)plVar4[2] < (byte *)plVar4[3])" ( (binary_expression "(byte *)plVar4[2] < (byte *)plVar4[3]" (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ])) < (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) )) (compound_statement "{\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }" { (expression_statement "uVar1 = (uint)*(byte *)plVar4[2];" (assignment_expression "uVar1 = (uint)*(byte *)plVar4[2]" identifier = (binary_expression "(uint)*(byte *)plVar4[2]" (parenthesized_expression "(uint)" ( identifier )) * (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ])))) ;) }) (else_clause "else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" else (compound_statement "{\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" { (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" ( (pointer_expression "**(code **)(*plVar4 + 0x48)" * (pointer_expression "*(code **)(*plVar4 + 0x48)" * (cast_expression "(code **)(*plVar4 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x48)" ( (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;) }))) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) (expression_statement "cVar8 = '\0';" (assignment_expression "cVar8 = '\0'" identifier = (char_literal "'\0'" ' escape_sequence ')) ;) (do_statement "do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );" do (compound_statement "{\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  }" { (while_statement "while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" while (parenthesized_expression "(lVar6 < param_2)" ( (binary_expression "lVar6 < param_2" identifier < identifier) )) (compound_statement "{\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" { (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" if (parenthesized_expression "(uVar1 == 0xffffffff)" ( (binary_expression "uVar1 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" { (labeled_statement "LAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" statement_identifier : (if_statement "if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" if (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" ( (binary_expression "param_2 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" { (if_statement "if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n            param_1[1] = 0x7fffffffffffffff;\n          }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) }))) (goto_statement "goto LAB_002f7030;" goto statement_identifier ;) })) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" identifier = (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) ;) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" identifier = (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ]))) ;) (expression_statement "lVar5 = param_2 - lVar6;" (assignment_expression "lVar5 = param_2 - lVar6" identifier = (binary_expression "param_2 - lVar6" identifier - identifier)) ;) (if_statement "if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" if (parenthesized_expression "((long)pbVar7 - (long)pbVar3 < param_2 - lVar6)" ( (binary_expression "(long)pbVar7 - (long)pbVar3 < param_2 - lVar6" (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) < (binary_expression "param_2 - lVar6" identifier - identifier)) )) (compound_statement "{\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" { (expression_statement "lVar5 = (long)pbVar7 - (long)pbVar3;" (assignment_expression "lVar5 = (long)pbVar7 - (long)pbVar3" identifier = (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) })) (if_statement "if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" if (parenthesized_expression "(lVar5 < 2)" ( (binary_expression "lVar5 < 2" identifier < number_literal) )) (compound_statement "{\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }" { (expression_statement "param_1[1] = lVar6 + 1;" (assignment_expression "param_1[1] = lVar6 + 1" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (binary_expression "lVar6 + 1" identifier + number_literal)) ;) (if_statement "if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" if (parenthesized_expression "(pbVar3 < pbVar7)" ( (binary_expression "pbVar3 < pbVar7" identifier < identifier) )) (compound_statement "{\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }" { (expression_statement "pbVar3 = pbVar3 + 1;" (assignment_expression "pbVar3 = pbVar3 + 1" identifier = (binary_expression "pbVar3 + 1" identifier + number_literal)) ;) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) }) (else_clause "else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" else (compound_statement "{\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" { (expression_statement "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);" (assignment_expression "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x50))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x50))" ( (pointer_expression "**(code **)(*plVar4 + 0x50)" * (pointer_expression "*(code **)(*plVar4 + 0x50)" * (cast_expression "(code **)(*plVar4 + 0x50)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x50)" ( (binary_expression "*plVar4 + 0x50" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;) (if_statement "if (iVar2 == -1) goto LAB_002f6fe8;" if (parenthesized_expression "(iVar2 == -1)" ( (binary_expression "iVar2 == -1" identifier == number_literal) )) (goto_statement "goto LAB_002f6fe8;" goto statement_identifier ;)) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" identifier = (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ]))) ;) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" identifier = (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) ;) }))) (if_statement "if (pbVar7 <= pbVar3) goto LAB_002f7060;" if (parenthesized_expression "(pbVar7 <= pbVar3)" ( (binary_expression "pbVar7 <= pbVar3" identifier <= identifier) )) (goto_statement "goto LAB_002f7060;" goto statement_identifier ;)) (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" identifier = (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) }) (else_clause "else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" else (compound_statement "{\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" { (expression_statement "pbVar3 = pbVar3 + lVar5;" (assignment_expression "pbVar3 = pbVar3 + lVar5" identifier = (binary_expression "pbVar3 + lVar5" identifier + identifier)) ;) (expression_statement "lVar6 = lVar6 + lVar5;" (assignment_expression "lVar6 = lVar6 + lVar5" identifier = (binary_expression "lVar6 + lVar5" identifier + identifier)) ;) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (expression_statement "param_1[1] = lVar6;" (assignment_expression "param_1[1] = lVar6" (subscript_expression "param_1[1]" identifier [ number_literal ]) = identifier) ;) (if_statement "if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" if (parenthesized_expression "(pbVar3 < pbVar7)" ( (binary_expression "pbVar3 < pbVar7" identifier < identifier) )) (compound_statement "{\n          uVar1 = (uint)*pbVar3;\n        }" { (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" identifier = (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) }) (else_clause "else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" else (compound_statement "{\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" { (labeled_statement "LAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" statement_identifier : comment (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" ( (pointer_expression "**(code **)(*plVar4 + 0x48)" * (pointer_expression "*(code **)(*plVar4 + 0x48)" * (cast_expression "(code **)(*plVar4 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x48)" ( (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;)) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) }))) }))) })) (if_statement "if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" if (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" ( (binary_expression "param_2 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" { (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) })) (if_statement "if (uVar1 != 0xffffffff) {\n        return param_1;\n      }" if (parenthesized_expression "(uVar1 != 0xffffffff)" ( (binary_expression "uVar1 != 0xffffffff" identifier != number_literal) )) (compound_statement "{\n        return param_1;\n      }" { (return_statement "return param_1;" return identifier ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) })) (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" if (parenthesized_expression "(uVar1 == 0xffffffff)" ( (binary_expression "uVar1 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" { (labeled_statement "LAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" statement_identifier : (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) }))) (labeled_statement "LAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" statement_identifier : (expression_statement "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" (assignment_expression "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1" identifier = (binary_expression "*(long *)(*param_1 + -0x18) + (long)param_1" (pointer_expression "*(long *)(*param_1 + -0x18)" * (cast_expression "(long *)(*param_1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) )))) + (cast_expression "(long)param_1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;)) (expression_statement "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);" (call_expression "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2)" identifier (argument_list "(lVar6,*(uint *)(lVar6 + 0x20) | 2)" ( identifier , (binary_expression "*(uint *)(lVar6 + 0x20) | 2" (pointer_expression "*(uint *)(lVar6 + 0x20)" * (cast_expression "(uint *)(lVar6 + 0x20)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 0x20)" ( (binary_expression "lVar6 + 0x20" identifier + number_literal) )))) | number_literal) ))) ;) (return_statement "return param_1;" return identifier ;) })) (expression_statement "param_1[1] = -0x8000000000000000;" (assignment_expression "param_1[1] = -0x8000000000000000" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "lVar6 = -0x8000000000000000;" (assignment_expression "lVar6 = -0x8000000000000000" identifier = number_literal) ;) (expression_statement "cVar8 = local_39[0];" (assignment_expression "cVar8 = local_39[0]" identifier = (subscript_expression "local_39[0]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "/* std::istream::ignore(long) */\n\nistream * __thiscall std::istream::ignore(istream *this,long param_1)\n\n{\n  long *plVar1;\n  uint uVar2;\n  int iVar3;\n  byte *pbVar4;\n  istream *piVar5;\n  long lVar6;\n  long lVar7;\n  byte *pbVar8;\n  sentry sVar9;\n  sentry local_39 [9];\n  \n  if (param_1 == 1) {\n    piVar5 = (istream *)ignore(this);\n    return piVar5;\n  }\n  *(undefined8 *)(this + 8) = 0;\n  sentry::sentry(local_39,this,true);\n  if ((param_1 < 1) || (local_39[0] == (sentry)0x0)) {\n    return this;\n  }\n  plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8);\n  if ((byte *)plVar1[2] < (byte *)plVar1[3]) {\n    uVar2 = (uint)*(byte *)plVar1[2];\n  }\n  else {\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }\n  lVar7 = *(long *)(this + 8);\n  sVar9 = (sentry)0x0;\n  do {\n    while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }\n    if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }\n    *(undefined8 *)(this + 8) = 0x8000000000000000;\n    lVar7 = -0x8000000000000000;\n    sVar9 = local_39[0];\n  } while( true );\n}\n\n" comment (ERROR "istream * __thiscall std::istream::ignore(istream *this," (binary_expression "istream * __thiscall std::istream::ignore(istream *this" (binary_expression "istream * __thiscall" identifier * identifier) (ERROR "std::istream::ignore(istream" identifier : : identifier : : identifier ( identifier) * identifier) ,) (function_definition "long param_1)\n\n{\n  long *plVar1;\n  uint uVar2;\n  int iVar3;\n  byte *pbVar4;\n  istream *piVar5;\n  long lVar6;\n  long lVar7;\n  byte *pbVar8;\n  sentry sVar9;\n  sentry local_39 [9];\n  \n  if (param_1 == 1) {\n    piVar5 = (istream *)ignore(this);\n    return piVar5;\n  }\n  *(undefined8 *)(this + 8) = 0;\n  sentry::sentry(local_39,this,true);\n  if ((param_1 < 1) || (local_39[0] == (sentry)0x0)) {\n    return this;\n  }\n  plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8);\n  if ((byte *)plVar1[2] < (byte *)plVar1[3]) {\n    uVar2 = (uint)*(byte *)plVar1[2];\n  }\n  else {\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }\n  lVar7 = *(long *)(this + 8);\n  sVar9 = (sentry)0x0;\n  do {\n    while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }\n    if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }\n    *(undefined8 *)(this + 8) = 0x8000000000000000;\n    lVar7 = -0x8000000000000000;\n    sVar9 = local_39[0];\n  } while( true );\n}" (sized_type_specifier "long" long) identifier (ERROR ")" )) (compound_statement "{\n  long *plVar1;\n  uint uVar2;\n  int iVar3;\n  byte *pbVar4;\n  istream *piVar5;\n  long lVar6;\n  long lVar7;\n  byte *pbVar8;\n  sentry sVar9;\n  sentry local_39 [9];\n  \n  if (param_1 == 1) {\n    piVar5 = (istream *)ignore(this);\n    return piVar5;\n  }\n  *(undefined8 *)(this + 8) = 0;\n  sentry::sentry(local_39,this,true);\n  if ((param_1 < 1) || (local_39[0] == (sentry)0x0)) {\n    return this;\n  }\n  plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8);\n  if ((byte *)plVar1[2] < (byte *)plVar1[3]) {\n    uVar2 = (uint)*(byte *)plVar1[2];\n  }\n  else {\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }\n  lVar7 = *(long *)(this + 8);\n  sVar9 = (sentry)0x0;\n  do {\n    while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }\n    if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }\n    *(undefined8 *)(this + 8) = 0x8000000000000000;\n    lVar7 = -0x8000000000000000;\n    sVar9 = local_39[0];\n  } while( true );\n}" { (declaration "long *plVar1;" (sized_type_specifier "long" long) (pointer_declarator "*plVar1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "byte *pbVar4;" type_identifier (pointer_declarator "*pbVar4" * identifier) ;) (declaration "istream *piVar5;" type_identifier (pointer_declarator "*piVar5" * identifier) ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (declaration "long lVar7;" (sized_type_specifier "long" long) identifier ;) (declaration "byte *pbVar8;" type_identifier (pointer_declarator "*pbVar8" * identifier) ;) (declaration "sentry sVar9;" type_identifier identifier ;) (declaration "sentry local_39 [9];" type_identifier (array_declarator "local_39 [9]" identifier [ number_literal ]) ;) (if_statement "if (param_1 == 1) {\n    piVar5 = (istream *)ignore(this);\n    return piVar5;\n  }" if (parenthesized_expression "(param_1 == 1)" ( (binary_expression "param_1 == 1" identifier == number_literal) )) (compound_statement "{\n    piVar5 = (istream *)ignore(this);\n    return piVar5;\n  }" { (expression_statement "piVar5 = (istream *)ignore(this);" (assignment_expression "piVar5 = (istream *)ignore(this)" identifier = (cast_expression "(istream *)ignore(this)" ( (type_descriptor "istream *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "ignore(this)" identifier (argument_list "(this)" ( identifier ))))) ;) (return_statement "return piVar5;" return identifier ;) })) (expression_statement "*(undefined8 *)(this + 8) = 0;" (assignment_expression "*(undefined8 *)(this + 8) = 0" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = number_literal) ;) (labeled_statement "sentry::sentry(local_39,this,true);" statement_identifier : (ERROR ":" :) (expression_statement "sentry(local_39,this,true);" (call_expression "sentry(local_39,this,true)" identifier (argument_list "(local_39,this,true)" ( identifier , identifier , true ))) ;)) (if_statement "if ((param_1 < 1) || (local_39[0] == (sentry)0x0)) {\n    return this;\n  }" if (parenthesized_expression "((param_1 < 1) || (local_39[0] == (sentry)0x0))" ( (binary_expression "(param_1 < 1) || (local_39[0] == (sentry)0x0)" (parenthesized_expression "(param_1 < 1)" ( (binary_expression "param_1 < 1" identifier < number_literal) )) || (parenthesized_expression "(local_39[0] == (sentry)0x0)" ( (binary_expression "local_39[0] == (sentry)0x0" (subscript_expression "local_39[0]" identifier [ number_literal ]) == (cast_expression "(sentry)0x0" ( (type_descriptor "sentry" type_identifier) ) number_literal)) ))) )) (compound_statement "{\n    return this;\n  }" { (return_statement "return this;" return identifier ;) })) (expression_statement "plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8);" (assignment_expression "plVar1 = *(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8)" identifier = (pointer_expression "*(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8)" * (cast_expression "(long **)(this + *(long *)(*(long *)this + -0x18) + 0xe8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(this + *(long *)(*(long *)this + -0x18) + 0xe8)" ( (binary_expression "this + *(long *)(*(long *)this + -0x18) + 0xe8" (binary_expression "this + *(long *)(*(long *)this + -0x18)" identifier + (pointer_expression "*(long *)(*(long *)this + -0x18)" * (cast_expression "(long *)(*(long *)this + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)this + -0x18)" ( (binary_expression "*(long *)this + -0x18" (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + number_literal) ))))) + number_literal) ))))) ;) (if_statement "if ((byte *)plVar1[2] < (byte *)plVar1[3]) {\n    uVar2 = (uint)*(byte *)plVar1[2];\n  }\n  else {\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }" if (parenthesized_expression "((byte *)plVar1[2] < (byte *)plVar1[3])" ( (binary_expression "(byte *)plVar1[2] < (byte *)plVar1[3]" (cast_expression "(byte *)plVar1[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[2]" identifier [ number_literal ])) < (cast_expression "(byte *)plVar1[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[3]" identifier [ number_literal ]))) )) (compound_statement "{\n    uVar2 = (uint)*(byte *)plVar1[2];\n  }" { (expression_statement "uVar2 = (uint)*(byte *)plVar1[2];" (assignment_expression "uVar2 = (uint)*(byte *)plVar1[2]" identifier = (binary_expression "(uint)*(byte *)plVar1[2]" (parenthesized_expression "(uint)" ( identifier )) * (cast_expression "(byte *)plVar1[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[2]" identifier [ number_literal ])))) ;) }) (else_clause "else {\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }" else (compound_statement "{\n    uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n  }" { (expression_statement "uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);" (assignment_expression "uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1)" identifier = (call_expression "(**(code **)(*plVar1 + 0x48))(plVar1)" (parenthesized_expression "(**(code **)(*plVar1 + 0x48))" ( (pointer_expression "**(code **)(*plVar1 + 0x48)" * (pointer_expression "*(code **)(*plVar1 + 0x48)" * (cast_expression "(code **)(*plVar1 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar1 + 0x48)" ( (binary_expression "*plVar1 + 0x48" (pointer_expression "*plVar1" * identifier) + number_literal) ))))) )) (argument_list "(plVar1)" ( identifier )))) ;) }))) (expression_statement "lVar7 = *(long *)(this + 8);" (assignment_expression "lVar7 = *(long *)(this + 8)" identifier = (pointer_expression "*(long *)(this + 8)" * (cast_expression "(long *)(this + 8)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) ))))) ;) (expression_statement "sVar9 = (sentry)0x0;" (assignment_expression "sVar9 = (sentry)0x0" identifier = (cast_expression "(sentry)0x0" ( (type_descriptor "sentry" type_identifier) ) number_literal)) ;) (do_statement "do {\n    while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }\n    if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }\n    *(undefined8 *)(this + 8) = 0x8000000000000000;\n    lVar7 = -0x8000000000000000;\n    sVar9 = local_39[0];\n  } while( true );" do (compound_statement "{\n    while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }\n    if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }\n    *(undefined8 *)(this + 8) = 0x8000000000000000;\n    lVar7 = -0x8000000000000000;\n    sVar9 = local_39[0];\n  }" { (while_statement "while (lVar7 < param_1) {\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }" while (parenthesized_expression "(lVar7 < param_1)" ( (binary_expression "lVar7 < param_1" identifier < identifier) )) (compound_statement "{\n      if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar8 = (byte *)plVar1[3];\n      pbVar4 = (byte *)plVar1[2];\n      lVar6 = param_1 - lVar7;\n      if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }\n      if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }\n    }" { (if_statement "if (uVar2 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" if (parenthesized_expression "(uVar2 == 0xffffffff)" ( (binary_expression "uVar2 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" { (labeled_statement "LAB_002f6fe8:\n        if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" statement_identifier : (if_statement "if (param_1 != 0x7fffffffffffffff) {\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" if (parenthesized_expression "(param_1 != 0x7fffffffffffffff)" ( (binary_expression "param_1 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n          if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" { (if_statement "if (sVar9 != (sentry)0x0) {\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }" if (parenthesized_expression "(sVar9 != (sentry)0x0)" ( (binary_expression "sVar9 != (sentry)0x0" identifier != (cast_expression "(sentry)0x0" ( (type_descriptor "sentry" type_identifier) ) number_literal)) )) (compound_statement "{\n            *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n          }" { (expression_statement "*(undefined8 *)(this + 8) = 0x7fffffffffffffff;" (assignment_expression "*(undefined8 *)(this + 8) = 0x7fffffffffffffff" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = number_literal) ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) }))) (goto_statement "goto LAB_002f7030;" goto statement_identifier ;) })) (expression_statement "pbVar8 = (byte *)plVar1[3];" (assignment_expression "pbVar8 = (byte *)plVar1[3]" identifier = (cast_expression "(byte *)plVar1[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[3]" identifier [ number_literal ]))) ;) (expression_statement "pbVar4 = (byte *)plVar1[2];" (assignment_expression "pbVar4 = (byte *)plVar1[2]" identifier = (cast_expression "(byte *)plVar1[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[2]" identifier [ number_literal ]))) ;) (expression_statement "lVar6 = param_1 - lVar7;" (assignment_expression "lVar6 = param_1 - lVar7" identifier = (binary_expression "param_1 - lVar7" identifier - identifier)) ;) (if_statement "if ((long)pbVar8 - (long)pbVar4 < param_1 - lVar7) {\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }" if (parenthesized_expression "((long)pbVar8 - (long)pbVar4 < param_1 - lVar7)" ( (binary_expression "(long)pbVar8 - (long)pbVar4 < param_1 - lVar7" (binary_expression "(long)pbVar8 - (long)pbVar4" (cast_expression "(long)pbVar8" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) < (binary_expression "param_1 - lVar7" identifier - identifier)) )) (compound_statement "{\n        lVar6 = (long)pbVar8 - (long)pbVar4;\n      }" { (expression_statement "lVar6 = (long)pbVar8 - (long)pbVar4;" (assignment_expression "lVar6 = (long)pbVar8 - (long)pbVar4" identifier = (binary_expression "(long)pbVar8 - (long)pbVar4" (cast_expression "(long)pbVar8" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) })) (if_statement "if (lVar6 < 2) {\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }\n      else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }" if (parenthesized_expression "(lVar6 < 2)" ( (binary_expression "lVar6 < 2" identifier < number_literal) )) (compound_statement "{\n        *(long *)(this + 8) = lVar7 + 1;\n        if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }\n        if (pbVar8 <= pbVar4) goto LAB_002f7060;\n        uVar2 = (uint)*pbVar4;\n        lVar7 = *(long *)(this + 8);\n      }" { (expression_statement "*(long *)(this + 8) = lVar7 + 1;" (assignment_expression "*(long *)(this + 8) = lVar7 + 1" (pointer_expression "*(long *)(this + 8)" * (cast_expression "(long *)(this + 8)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = (binary_expression "lVar7 + 1" identifier + number_literal)) ;) (if_statement "if (pbVar4 < pbVar8) {\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }\n        else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }" if (parenthesized_expression "(pbVar4 < pbVar8)" ( (binary_expression "pbVar4 < pbVar8" identifier < identifier) )) (compound_statement "{\n          pbVar4 = pbVar4 + 1;\n          plVar1[2] = (long)pbVar4;\n        }" { (expression_statement "pbVar4 = pbVar4 + 1;" (assignment_expression "pbVar4 = pbVar4 + 1" identifier = (binary_expression "pbVar4 + 1" identifier + number_literal)) ;) (expression_statement "plVar1[2] = (long)pbVar4;" (assignment_expression "plVar1[2] = (long)pbVar4" (subscript_expression "plVar1[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) }) (else_clause "else {\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }" else (compound_statement "{\n          iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);\n          if (iVar3 == -1) goto LAB_002f6fe8;\n          pbVar4 = (byte *)plVar1[2];\n          pbVar8 = (byte *)plVar1[3];\n        }" { (expression_statement "iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1);" (assignment_expression "iVar3 = (**(code **)(*plVar1 + 0x50))(plVar1)" identifier = (call_expression "(**(code **)(*plVar1 + 0x50))(plVar1)" (parenthesized_expression "(**(code **)(*plVar1 + 0x50))" ( (pointer_expression "**(code **)(*plVar1 + 0x50)" * (pointer_expression "*(code **)(*plVar1 + 0x50)" * (cast_expression "(code **)(*plVar1 + 0x50)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar1 + 0x50)" ( (binary_expression "*plVar1 + 0x50" (pointer_expression "*plVar1" * identifier) + number_literal) ))))) )) (argument_list "(plVar1)" ( identifier )))) ;) (if_statement "if (iVar3 == -1) goto LAB_002f6fe8;" if (parenthesized_expression "(iVar3 == -1)" ( (binary_expression "iVar3 == -1" identifier == number_literal) )) (goto_statement "goto LAB_002f6fe8;" goto statement_identifier ;)) (expression_statement "pbVar4 = (byte *)plVar1[2];" (assignment_expression "pbVar4 = (byte *)plVar1[2]" identifier = (cast_expression "(byte *)plVar1[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[2]" identifier [ number_literal ]))) ;) (expression_statement "pbVar8 = (byte *)plVar1[3];" (assignment_expression "pbVar8 = (byte *)plVar1[3]" identifier = (cast_expression "(byte *)plVar1[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar1[3]" identifier [ number_literal ]))) ;) }))) (if_statement "if (pbVar8 <= pbVar4) goto LAB_002f7060;" if (parenthesized_expression "(pbVar8 <= pbVar4)" ( (binary_expression "pbVar8 <= pbVar4" identifier <= identifier) )) (goto_statement "goto LAB_002f7060;" goto statement_identifier ;)) (expression_statement "uVar2 = (uint)*pbVar4;" (assignment_expression "uVar2 = (uint)*pbVar4" identifier = (binary_expression "(uint)*pbVar4" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) (expression_statement "lVar7 = *(long *)(this + 8);" (assignment_expression "lVar7 = *(long *)(this + 8)" identifier = (pointer_expression "*(long *)(this + 8)" * (cast_expression "(long *)(this + 8)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) ))))) ;) }) (else_clause "else {\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }" else (compound_statement "{\n        pbVar4 = pbVar4 + lVar6;\n        lVar7 = lVar7 + lVar6;\n        plVar1[2] = (long)pbVar4;\n        *(long *)(this + 8) = lVar7;\n        if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }\n      }" { (expression_statement "pbVar4 = pbVar4 + lVar6;" (assignment_expression "pbVar4 = pbVar4 + lVar6" identifier = (binary_expression "pbVar4 + lVar6" identifier + identifier)) ;) (expression_statement "lVar7 = lVar7 + lVar6;" (assignment_expression "lVar7 = lVar7 + lVar6" identifier = (binary_expression "lVar7 + lVar6" identifier + identifier)) ;) (expression_statement "plVar1[2] = (long)pbVar4;" (assignment_expression "plVar1[2] = (long)pbVar4" (subscript_expression "plVar1[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (expression_statement "*(long *)(this + 8) = lVar7;" (assignment_expression "*(long *)(this + 8) = lVar7" (pointer_expression "*(long *)(this + 8)" * (cast_expression "(long *)(this + 8)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = identifier) ;) (if_statement "if (pbVar4 < pbVar8) {\n          uVar2 = (uint)*pbVar4;\n        }\n        else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }" if (parenthesized_expression "(pbVar4 < pbVar8)" ( (binary_expression "pbVar4 < pbVar8" identifier < identifier) )) (compound_statement "{\n          uVar2 = (uint)*pbVar4;\n        }" { (expression_statement "uVar2 = (uint)*pbVar4;" (assignment_expression "uVar2 = (uint)*pbVar4" identifier = (binary_expression "(uint)*pbVar4" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) }) (else_clause "else {\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }" else (compound_statement "{\nLAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);\n          lVar7 = *(long *)(this + 8);\n        }" { (labeled_statement "LAB_002f7060:\n                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */\n          uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);" statement_identifier : comment (expression_statement "uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1);" (assignment_expression "uVar2 = (**(code **)(*plVar1 + 0x48))(plVar1)" identifier = (call_expression "(**(code **)(*plVar1 + 0x48))(plVar1)" (parenthesized_expression "(**(code **)(*plVar1 + 0x48))" ( (pointer_expression "**(code **)(*plVar1 + 0x48)" * (pointer_expression "*(code **)(*plVar1 + 0x48)" * (cast_expression "(code **)(*plVar1 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar1 + 0x48)" ( (binary_expression "*plVar1 + 0x48" (pointer_expression "*plVar1" * identifier) + number_literal) ))))) )) (argument_list "(plVar1)" ( identifier )))) ;)) (expression_statement "lVar7 = *(long *)(this + 8);" (assignment_expression "lVar7 = *(long *)(this + 8)" identifier = (pointer_expression "*(long *)(this + 8)" * (cast_expression "(long *)(this + 8)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) ))))) ;) }))) }))) })) (if_statement "if (param_1 != 0x7fffffffffffffff) {\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }" if (parenthesized_expression "(param_1 != 0x7fffffffffffffff)" ( (binary_expression "param_1 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\n      if (uVar2 != 0xffffffff) {\n        return this;\n      }\n      goto LAB_002f7043;\n    }" { (if_statement "if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(sVar9 != (sentry)0x0)" ( (binary_expression "sVar9 != (sentry)0x0" identifier != (cast_expression "(sentry)0x0" ( (type_descriptor "sentry" type_identifier) ) number_literal)) )) (compound_statement "{\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }" { (expression_statement "*(undefined8 *)(this + 8) = 0x7fffffffffffffff;" (assignment_expression "*(undefined8 *)(this + 8) = 0x7fffffffffffffff" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = number_literal) ;) })) (if_statement "if (uVar2 != 0xffffffff) {\n        return this;\n      }" if (parenthesized_expression "(uVar2 != 0xffffffff)" ( (binary_expression "uVar2 != 0xffffffff" identifier != number_literal) )) (compound_statement "{\n        return this;\n      }" { (return_statement "return this;" return identifier ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) })) (if_statement "if (uVar2 == 0xffffffff) {\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }" if (parenthesized_expression "(uVar2 == 0xffffffff)" ( (binary_expression "uVar2 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);\n      return this;\n    }" { (labeled_statement "LAB_002f7030:\n      if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }" statement_identifier : (if_statement "if (sVar9 != (sentry)0x0) {\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(sVar9 != (sentry)0x0)" ( (binary_expression "sVar9 != (sentry)0x0" identifier != (cast_expression "(sentry)0x0" ( (type_descriptor "sentry" type_identifier) ) number_literal)) )) (compound_statement "{\n        *(undefined8 *)(this + 8) = 0x7fffffffffffffff;\n      }" { (expression_statement "*(undefined8 *)(this + 8) = 0x7fffffffffffffff;" (assignment_expression "*(undefined8 *)(this + 8) = 0x7fffffffffffffff" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = number_literal) ;) }))) (labeled_statement "LAB_002f7043:\n      ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);" statement_identifier : (labeled_statement "ios::clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);" statement_identifier : (ERROR ":" :) (expression_statement "clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit);" (call_expression "clear((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit)" identifier (argument_list "((ios *)(this + *(long *)(*(long *)this + -0x18)),\n                 *(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit)" ( (cast_expression "(ios *)(this + *(long *)(*(long *)this + -0x18))" ( (type_descriptor "ios *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + *(long *)(*(long *)this + -0x18))" ( (binary_expression "this + *(long *)(*(long *)this + -0x18)" identifier + (pointer_expression "*(long *)(*(long *)this + -0x18)" * (cast_expression "(long *)(*(long *)this + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)this + -0x18)" ( (binary_expression "*(long *)this + -0x18" (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + number_literal) ))))) ))) , (binary_expression "*(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20) |\n                 _S_eofbit" (pointer_expression "*(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20)" * (cast_expression "(_Ios_Iostate *)((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20)" ( (type_descriptor "_Ios_Iostate *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20)" ( (binary_expression "(ios *)(this + *(long *)(*(long *)this + -0x18)) + 0x20" (cast_expression "(ios *)(this + *(long *)(*(long *)this + -0x18))" ( (type_descriptor "ios *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + *(long *)(*(long *)this + -0x18))" ( (binary_expression "this + *(long *)(*(long *)this + -0x18)" identifier + (pointer_expression "*(long *)(*(long *)this + -0x18)" * (cast_expression "(long *)(*(long *)this + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)this + -0x18)" ( (binary_expression "*(long *)this + -0x18" (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + number_literal) ))))) ))) + number_literal) )))) | identifier) ))) ;))) (return_statement "return this;" return identifier ;) })) (expression_statement "*(undefined8 *)(this + 8) = 0x8000000000000000;" (assignment_expression "*(undefined8 *)(this + 8) = 0x8000000000000000" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "lVar7 = -0x8000000000000000;" (assignment_expression "lVar7 = -0x8000000000000000" identifier = number_literal) ;) (expression_statement "sVar9 = local_39[0];" (assignment_expression "sVar9 = local_39[0]" identifier = (subscript_expression "local_39[0]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "long * FUN_002f6e90(long *param_1,long param_2)\n\n{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}\n\n" (function_definition "long * FUN_002f6e90(long *param_1,long param_2)\n\n{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_002f6e90(long *param_1,long param_2)" * (function_declarator "FUN_002f6e90(long *param_1,long param_2)" identifier (parameter_list "(long *param_1,long param_2)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) )))) (compound_statement "{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "byte *pbVar3;" type_identifier (pointer_declarator "*pbVar3" * identifier) ;) (declaration "long *plVar4;" (sized_type_specifier "long" long) (pointer_declarator "*plVar4" * identifier) ;) (declaration "long lVar5;" (sized_type_specifier "long" long) identifier ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (declaration "byte *pbVar7;" type_identifier (pointer_declarator "*pbVar7" * identifier) ;) (declaration "char cVar8;" primitive_type identifier ;) (declaration "char local_39 [9];" primitive_type (array_declarator "local_39 [9]" identifier [ number_literal ]) ;) (if_statement "if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" if (parenthesized_expression "(param_2 == 1)" ( (binary_expression "param_2 == 1" identifier == number_literal) )) (compound_statement "{\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" { (expression_statement "plVar4 = (long *)FUN_00297d90();" (assignment_expression "plVar4 = (long *)FUN_00297d90()" identifier = (cast_expression "(long *)FUN_00297d90()" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_00297d90()" identifier (argument_list "()" ( ))))) ;) (return_statement "return plVar4;" return identifier ;) })) (expression_statement "param_1[1] = 0;" (assignment_expression "param_1[1] = 0" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "FUN_00296fe0(local_39,param_1,1);" (call_expression "FUN_00296fe0(local_39,param_1,1)" identifier (argument_list "(local_39,param_1,1)" ( identifier , identifier , number_literal ))) ;) (if_statement "if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }" if (parenthesized_expression "((param_2 < 1) || (local_39[0] == '\0'))" ( (binary_expression "(param_2 < 1) || (local_39[0] == '\0')" (parenthesized_expression "(param_2 < 1)" ( (binary_expression "param_2 < 1" identifier < number_literal) )) || (parenthesized_expression "(local_39[0] == '\0')" ( (binary_expression "local_39[0] == '\0'" (subscript_expression "local_39[0]" identifier [ number_literal ]) == (char_literal "'\0'" ' escape_sequence ')) ))) )) (compound_statement "{\n    return param_1;\n  }" { (return_statement "return param_1;" return identifier ;) })) (expression_statement "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);" (assignment_expression "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" identifier = (pointer_expression "*(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" * (cast_expression "(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" ( (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8" (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18)" (cast_expression "(long)param_1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + (pointer_expression "*(long *)(*param_1 + -0x18)" * (cast_expression "(long *)(*param_1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) ))))) + number_literal) ))))) ;) (if_statement "if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" if (parenthesized_expression "((byte *)plVar4[2] < (byte *)plVar4[3])" ( (binary_expression "(byte *)plVar4[2] < (byte *)plVar4[3]" (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ])) < (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) )) (compound_statement "{\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }" { (expression_statement "uVar1 = (uint)*(byte *)plVar4[2];" (assignment_expression "uVar1 = (uint)*(byte *)plVar4[2]" identifier = (binary_expression "(uint)*(byte *)plVar4[2]" (parenthesized_expression "(uint)" ( identifier )) * (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ])))) ;) }) (else_clause "else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" else (compound_statement "{\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" { (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" ( (pointer_expression "**(code **)(*plVar4 + 0x48)" * (pointer_expression "*(code **)(*plVar4 + 0x48)" * (cast_expression "(code **)(*plVar4 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x48)" ( (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;) }))) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) (expression_statement "cVar8 = '\0';" (assignment_expression "cVar8 = '\0'" identifier = (char_literal "'\0'" ' escape_sequence ')) ;) (do_statement "do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );" do (compound_statement "{\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  }" { (while_statement "while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" while (parenthesized_expression "(lVar6 < param_2)" ( (binary_expression "lVar6 < param_2" identifier < identifier) )) (compound_statement "{\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" { (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" if (parenthesized_expression "(uVar1 == 0xffffffff)" ( (binary_expression "uVar1 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" { (labeled_statement "LAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" statement_identifier : (if_statement "if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" if (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" ( (binary_expression "param_2 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" { (if_statement "if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n            param_1[1] = 0x7fffffffffffffff;\n          }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) }))) (goto_statement "goto LAB_002f7030;" goto statement_identifier ;) })) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" identifier = (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) ;) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" identifier = (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ]))) ;) (expression_statement "lVar5 = param_2 - lVar6;" (assignment_expression "lVar5 = param_2 - lVar6" identifier = (binary_expression "param_2 - lVar6" identifier - identifier)) ;) (if_statement "if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" if (parenthesized_expression "((long)pbVar7 - (long)pbVar3 < param_2 - lVar6)" ( (binary_expression "(long)pbVar7 - (long)pbVar3 < param_2 - lVar6" (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) < (binary_expression "param_2 - lVar6" identifier - identifier)) )) (compound_statement "{\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" { (expression_statement "lVar5 = (long)pbVar7 - (long)pbVar3;" (assignment_expression "lVar5 = (long)pbVar7 - (long)pbVar3" identifier = (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) - (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) })) (if_statement "if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" if (parenthesized_expression "(lVar5 < 2)" ( (binary_expression "lVar5 < 2" identifier < number_literal) )) (compound_statement "{\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }" { (expression_statement "param_1[1] = lVar6 + 1;" (assignment_expression "param_1[1] = lVar6 + 1" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (binary_expression "lVar6 + 1" identifier + number_literal)) ;) (if_statement "if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" if (parenthesized_expression "(pbVar3 < pbVar7)" ( (binary_expression "pbVar3 < pbVar7" identifier < identifier) )) (compound_statement "{\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }" { (expression_statement "pbVar3 = pbVar3 + 1;" (assignment_expression "pbVar3 = pbVar3 + 1" identifier = (binary_expression "pbVar3 + 1" identifier + number_literal)) ;) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) }) (else_clause "else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" else (compound_statement "{\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" { (expression_statement "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);" (assignment_expression "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x50))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x50))" ( (pointer_expression "**(code **)(*plVar4 + 0x50)" * (pointer_expression "*(code **)(*plVar4 + 0x50)" * (cast_expression "(code **)(*plVar4 + 0x50)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x50)" ( (binary_expression "*plVar4 + 0x50" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;) (if_statement "if (iVar2 == -1) goto LAB_002f6fe8;" if (parenthesized_expression "(iVar2 == -1)" ( (binary_expression "iVar2 == -1" identifier == number_literal) )) (goto_statement "goto LAB_002f6fe8;" goto statement_identifier ;)) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" identifier = (cast_expression "(byte *)plVar4[2]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[2]" identifier [ number_literal ]))) ;) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" identifier = (cast_expression "(byte *)plVar4[3]" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar4[3]" identifier [ number_literal ]))) ;) }))) (if_statement "if (pbVar7 <= pbVar3) goto LAB_002f7060;" if (parenthesized_expression "(pbVar7 <= pbVar3)" ( (binary_expression "pbVar7 <= pbVar3" identifier <= identifier) )) (goto_statement "goto LAB_002f7060;" goto statement_identifier ;)) (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" identifier = (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) }) (else_clause "else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" else (compound_statement "{\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" { (expression_statement "pbVar3 = pbVar3 + lVar5;" (assignment_expression "pbVar3 = pbVar3 + lVar5" identifier = (binary_expression "pbVar3 + lVar5" identifier + identifier)) ;) (expression_statement "lVar6 = lVar6 + lVar5;" (assignment_expression "lVar6 = lVar6 + lVar5" identifier = (binary_expression "lVar6 + lVar5" identifier + identifier)) ;) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" identifier [ number_literal ]) = (cast_expression "(long)pbVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (expression_statement "param_1[1] = lVar6;" (assignment_expression "param_1[1] = lVar6" (subscript_expression "param_1[1]" identifier [ number_literal ]) = identifier) ;) (if_statement "if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" if (parenthesized_expression "(pbVar3 < pbVar7)" ( (binary_expression "pbVar3 < pbVar7" identifier < identifier) )) (compound_statement "{\n          uVar1 = (uint)*pbVar3;\n        }" { (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" identifier = (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" ( identifier )) * identifier)) ;) }) (else_clause "else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" else (compound_statement "{\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" { (labeled_statement "LAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" statement_identifier : (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" identifier = (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" ( (pointer_expression "**(code **)(*plVar4 + 0x48)" * (pointer_expression "*(code **)(*plVar4 + 0x48)" * (cast_expression "(code **)(*plVar4 + 0x48)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*plVar4 + 0x48)" ( (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" * identifier) + number_literal) ))))) )) (argument_list "(plVar4)" ( identifier )))) ;)) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" identifier = (subscript_expression "param_1[1]" identifier [ number_literal ])) ;) }))) }))) })) (if_statement "if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" if (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" ( (binary_expression "param_2 != 0x7fffffffffffffff" identifier != number_literal) )) (compound_statement "{\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" { (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) })) (if_statement "if (uVar1 != 0xffffffff) {\n        return param_1;\n      }" if (parenthesized_expression "(uVar1 != 0xffffffff)" ( (binary_expression "uVar1 != 0xffffffff" identifier != number_literal) )) (compound_statement "{\n        return param_1;\n      }" { (return_statement "return param_1;" return identifier ;) })) (goto_statement "goto LAB_002f7043;" goto statement_identifier ;) })) (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" if (parenthesized_expression "(uVar1 == 0xffffffff)" ( (binary_expression "uVar1 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" { (labeled_statement "LAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" statement_identifier : (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" if (parenthesized_expression "(cVar8 != '\0')" ( (binary_expression "cVar8 != '\0'" identifier != (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" { (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) }))) (labeled_statement "LAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" statement_identifier : (expression_statement "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" (assignment_expression "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1" identifier = (binary_expression "*(long *)(*param_1 + -0x18) + (long)param_1" (pointer_expression "*(long *)(*param_1 + -0x18)" * (cast_expression "(long *)(*param_1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) )))) + (cast_expression "(long)param_1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;)) (expression_statement "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);" (call_expression "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2)" identifier (argument_list "(lVar6,*(uint *)(lVar6 + 0x20) | 2)" ( identifier , (binary_expression "*(uint *)(lVar6 + 0x20) | 2" (pointer_expression "*(uint *)(lVar6 + 0x20)" * (cast_expression "(uint *)(lVar6 + 0x20)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 0x20)" ( (binary_expression "lVar6 + 0x20" identifier + number_literal) )))) | number_literal) ))) ;) (return_statement "return param_1;" return identifier ;) })) (expression_statement "param_1[1] = -0x8000000000000000;" (assignment_expression "param_1[1] = -0x8000000000000000" (subscript_expression "param_1[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "lVar6 = -0x8000000000000000;" (assignment_expression "lVar6 = -0x8000000000000000" identifier = number_literal) ;) (expression_statement "cVar8 = local_39[0];" (assignment_expression "cVar8 = local_39[0]" identifier = (subscript_expression "local_39[0]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit (function_definition (sized_type_specifier long) (pointer_declarator * (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) IDENT) )))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration (sized_type_specifier long) IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE (array_declarator IDENT [ LIT ]) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( ))))) ;) (return_statement return IDENT ;) })) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (expression_statement (call_expression IDENT (argument_list ( IDENT , IDENT , LIT ))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT < LIT) )) || (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) == (char_literal ' escape_sequence ')) ))) )) (compound_statement { (return_statement return IDENT ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])) < (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( IDENT )) * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])))) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) )) (argument_list ( IDENT )))) ;) }))) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression IDENT = (char_literal ' escape_sequence ')) ;) (do_statement do (compound_statement { (while_statement while (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (labeled_statement statement_identifier : (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT != (char_literal ' escape_sequence ')) )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) })) (goto_statement goto statement_identifier ;) }))) (goto_statement goto statement_identifier ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) - (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) < (binary_expression IDENT - IDENT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) - (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT))) ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT < LIT) )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) )) (argument_list ( IDENT )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (goto_statement goto statement_identifier ;)) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) ;) }))) (if_statement if (parenthesized_expression ( (binary_expression IDENT <= IDENT) )) (goto_statement goto statement_identifier ;)) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( IDENT )) * IDENT)) ;) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( IDENT )) * IDENT)) ;) }) (else_clause else (compound_statement { (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) )) (argument_list ( IDENT )))) ;)) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) }))) }))) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT != (char_literal ' escape_sequence ')) )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (return_statement return IDENT ;) })) (goto_statement goto statement_identifier ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (labeled_statement statement_identifier : (if_statement if (parenthesized_expression ( (binary_expression IDENT != (char_literal ' escape_sequence ')) )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) }))) (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) )))) + (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT))) ;)) (expression_statement (call_expression IDENT (argument_list ( IDENT , (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) | LIT) ))) ;) (return_statement return IDENT ;) })) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) }) while (parenthesized_expression ( BOOL )) ;) })))
(function_definition "long * FUN_002f6e90(long *param_1,long param_2)\n\n{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" (sized_type_specifier "long" (long "long")) (pointer_declarator "* FUN_002f6e90(long *param_1,long param_2)" (* "*") (function_declarator "FUN_002f6e90(long *param_1,long param_2)" (identifier "FUN_002f6e90") (parameter_list "(long *param_1,long param_2)" (( "(") (parameter_declaration "long *param_1" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "long param_2" (sized_type_specifier "long" (long "long")) (identifier "param_2")) () ")")))) (compound_statement "{\n  uint uVar1;\n  int iVar2;\n  byte *pbVar3;\n  long *plVar4;\n  long lVar5;\n  long lVar6;\n  byte *pbVar7;\n  char cVar8;\n  char local_39 [9];\n  \n  if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }\n  param_1[1] = 0;\n  FUN_00296fe0(local_39,param_1,1);\n  if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }\n  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);\n  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }\n  lVar6 = param_1[1];\n  cVar8 = '\0';\n  do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );\n}" ({ "{") (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (declaration "byte *pbVar3;" (type_identifier "byte") (pointer_declarator "*pbVar3" (* "*") (identifier "pbVar3")) (; ";")) (declaration "long *plVar4;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar4" (* "*") (identifier "plVar4")) (; ";")) (declaration "long lVar5;" (sized_type_specifier "long" (long "long")) (identifier "lVar5") (; ";")) (declaration "long lVar6;" (sized_type_specifier "long" (long "long")) (identifier "lVar6") (; ";")) (declaration "byte *pbVar7;" (type_identifier "byte") (pointer_declarator "*pbVar7" (* "*") (identifier "pbVar7")) (; ";")) (declaration "char cVar8;" (primitive_type "char") (identifier "cVar8") (; ";")) (declaration "char local_39 [9];" (primitive_type "char") (array_declarator "local_39 [9]" (identifier "local_39") ([ "[") (number_literal "9") (] "]")) (; ";")) (if_statement "if (param_2 == 1) {\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" (if "if") (parenthesized_expression "(param_2 == 1)" (( "(") (binary_expression "param_2 == 1" (identifier "param_2") (== "==") (number_literal "1")) () ")")) (compound_statement "{\n    plVar4 = (long *)FUN_00297d90();\n    return plVar4;\n  }" ({ "{") (expression_statement "plVar4 = (long *)FUN_00297d90();" (assignment_expression "plVar4 = (long *)FUN_00297d90()" (identifier "plVar4") (= "=") (cast_expression "(long *)FUN_00297d90()" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "FUN_00297d90()" (identifier "FUN_00297d90") (argument_list "()" (( "(") () ")"))))) (; ";")) (return_statement "return plVar4;" (return "return") (identifier "plVar4") (; ";")) (} "}"))) (expression_statement "param_1[1] = 0;" (assignment_expression "param_1[1] = 0" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0")) (; ";")) (expression_statement "FUN_00296fe0(local_39,param_1,1);" (call_expression "FUN_00296fe0(local_39,param_1,1)" (identifier "FUN_00296fe0") (argument_list "(local_39,param_1,1)" (( "(") (identifier "local_39") (, ",") (identifier "param_1") (, ",") (number_literal "1") () ")"))) (; ";")) (if_statement "if ((param_2 < 1) || (local_39[0] == '\0')) {\n    return param_1;\n  }" (if "if") (parenthesized_expression "((param_2 < 1) || (local_39[0] == '\0'))" (( "(") (binary_expression "(param_2 < 1) || (local_39[0] == '\0')" (parenthesized_expression "(param_2 < 1)" (( "(") (binary_expression "param_2 < 1" (identifier "param_2") (< "<") (number_literal "1")) () ")")) (|| "||") (parenthesized_expression "(local_39[0] == '\0')" (( "(") (binary_expression "local_39[0] == '\0'" (subscript_expression "local_39[0]" (identifier "local_39") ([ "[") (number_literal "0") (] "]")) (== "==") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")"))) () ")")) (compound_statement "{\n    return param_1;\n  }" ({ "{") (return_statement "return param_1;" (return "return") (identifier "param_1") (; ";")) (} "}"))) (expression_statement "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);" (assignment_expression "plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" (identifier "plVar4") (= "=") (pointer_expression "*(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" (* "*") (cast_expression "(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8)" (( "(") (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8" (binary_expression "(long)param_1 + *(long *)(*param_1 + -0x18)" (cast_expression "(long)param_1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_1")) (+ "+") (pointer_expression "*(long *)(*param_1 + -0x18)" (* "*") (cast_expression "(long *)(*param_1 + -0x18)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_1 + -0x18)" (( "(") (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (+ "+") (number_literal "-0x18")) () ")"))))) (+ "+") (number_literal "0xe8")) () ")"))))) (; ";")) (if_statement "if ((byte *)plVar4[2] < (byte *)plVar4[3]) {\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }\n  else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" (if "if") (parenthesized_expression "((byte *)plVar4[2] < (byte *)plVar4[3])" (( "(") (binary_expression "(byte *)plVar4[2] < (byte *)plVar4[3]" (cast_expression "(byte *)plVar4[2]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]"))) (< "<") (cast_expression "(byte *)plVar4[3]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[3]" (identifier "plVar4") ([ "[") (number_literal "3") (] "]")))) () ")")) (compound_statement "{\n    uVar1 = (uint)*(byte *)plVar4[2];\n  }" ({ "{") (expression_statement "uVar1 = (uint)*(byte *)plVar4[2];" (assignment_expression "uVar1 = (uint)*(byte *)plVar4[2]" (identifier "uVar1") (= "=") (binary_expression "(uint)*(byte *)plVar4[2]" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (* "*") (cast_expression "(byte *)plVar4[2]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]"))))) (; ";")) (} "}")) (else_clause "else {\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" (else "else") (compound_statement "{\n    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n  }" ({ "{") (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" (identifier "uVar1") (= "=") (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" (( "(") (pointer_expression "**(code **)(*plVar4 + 0x48)" (* "*") (pointer_expression "*(code **)(*plVar4 + 0x48)" (* "*") (cast_expression "(code **)(*plVar4 + 0x48)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*plVar4 + 0x48)" (( "(") (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" (* "*") (identifier "plVar4")) (+ "+") (number_literal "0x48")) () ")"))))) () ")")) (argument_list "(plVar4)" (( "(") (identifier "plVar4") () ")")))) (; ";")) (} "}")))) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" (identifier "lVar6") (= "=") (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]"))) (; ";")) (expression_statement "cVar8 = '\0';" (assignment_expression "cVar8 = '\0'" (identifier "cVar8") (= "=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) (; ";")) (do_statement "do {\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  } while( true );" (do "do") (compound_statement "{\n    while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }\n    if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }\n    if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }\n    param_1[1] = -0x8000000000000000;\n    lVar6 = -0x8000000000000000;\n    cVar8 = local_39[0];\n  }" ({ "{") (while_statement "while (lVar6 < param_2) {\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" (while "while") (parenthesized_expression "(lVar6 < param_2)" (( "(") (binary_expression "lVar6 < param_2" (identifier "lVar6") (< "<") (identifier "param_2")) () ")")) (compound_statement "{\n      if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }\n      pbVar7 = (byte *)plVar4[3];\n      pbVar3 = (byte *)plVar4[2];\n      lVar5 = param_2 - lVar6;\n      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }\n      if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }\n    }" ({ "{") (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" (if "if") (parenthesized_expression "(uVar1 == 0xffffffff)" (( "(") (binary_expression "uVar1 == 0xffffffff" (identifier "uVar1") (== "==") (number_literal "0xffffffff")) () ")")) (compound_statement "{\nLAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }\n        goto LAB_002f7030;\n      }" ({ "{") (labeled_statement "LAB_002f6fe8:\n        if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" (statement_identifier "LAB_002f6fe8") (: ":") (if_statement "if (param_2 != 0x7fffffffffffffff) {\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" (if "if") (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" (( "(") (binary_expression "param_2 != 0x7fffffffffffffff" (identifier "param_2") (!= "!=") (number_literal "0x7fffffffffffffff")) () ")")) (compound_statement "{\n          if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }\n          goto LAB_002f7043;\n        }" ({ "{") (if_statement "if (cVar8 != '\0') {\n            param_1[1] = 0x7fffffffffffffff;\n          }" (if "if") (parenthesized_expression "(cVar8 != '\0')" (( "(") (binary_expression "cVar8 != '\0'" (identifier "cVar8") (!= "!=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (compound_statement "{\n            param_1[1] = 0x7fffffffffffffff;\n          }" ({ "{") (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0x7fffffffffffffff")) (; ";")) (} "}"))) (goto_statement "goto LAB_002f7043;" (goto "goto") (statement_identifier "LAB_002f7043") (; ";")) (} "}")))) (goto_statement "goto LAB_002f7030;" (goto "goto") (statement_identifier "LAB_002f7030") (; ";")) (} "}"))) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" (identifier "pbVar7") (= "=") (cast_expression "(byte *)plVar4[3]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[3]" (identifier "plVar4") ([ "[") (number_literal "3") (] "]")))) (; ";")) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" (identifier "pbVar3") (= "=") (cast_expression "(byte *)plVar4[2]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]")))) (; ";")) (expression_statement "lVar5 = param_2 - lVar6;" (assignment_expression "lVar5 = param_2 - lVar6" (identifier "lVar5") (= "=") (binary_expression "param_2 - lVar6" (identifier "param_2") (- "-") (identifier "lVar6"))) (; ";")) (if_statement "if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" (if "if") (parenthesized_expression "((long)pbVar7 - (long)pbVar3 < param_2 - lVar6)" (( "(") (binary_expression "(long)pbVar7 - (long)pbVar3 < param_2 - lVar6" (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar7")) (- "-") (cast_expression "(long)pbVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar3"))) (< "<") (binary_expression "param_2 - lVar6" (identifier "param_2") (- "-") (identifier "lVar6"))) () ")")) (compound_statement "{\n        lVar5 = (long)pbVar7 - (long)pbVar3;\n      }" ({ "{") (expression_statement "lVar5 = (long)pbVar7 - (long)pbVar3;" (assignment_expression "lVar5 = (long)pbVar7 - (long)pbVar3" (identifier "lVar5") (= "=") (binary_expression "(long)pbVar7 - (long)pbVar3" (cast_expression "(long)pbVar7" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar7")) (- "-") (cast_expression "(long)pbVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar3")))) (; ";")) (} "}"))) (if_statement "if (lVar5 < 2) {\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }\n      else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" (if "if") (parenthesized_expression "(lVar5 < 2)" (( "(") (binary_expression "lVar5 < 2" (identifier "lVar5") (< "<") (number_literal "2")) () ")")) (compound_statement "{\n        param_1[1] = lVar6 + 1;\n        if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }\n        if (pbVar7 <= pbVar3) goto LAB_002f7060;\n        uVar1 = (uint)*pbVar3;\n        lVar6 = param_1[1];\n      }" ({ "{") (expression_statement "param_1[1] = lVar6 + 1;" (assignment_expression "param_1[1] = lVar6 + 1" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (binary_expression "lVar6 + 1" (identifier "lVar6") (+ "+") (number_literal "1"))) (; ";")) (if_statement "if (pbVar3 < pbVar7) {\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }\n        else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" (if "if") (parenthesized_expression "(pbVar3 < pbVar7)" (( "(") (binary_expression "pbVar3 < pbVar7" (identifier "pbVar3") (< "<") (identifier "pbVar7")) () ")")) (compound_statement "{\n          pbVar3 = pbVar3 + 1;\n          plVar4[2] = (long)pbVar3;\n        }" ({ "{") (expression_statement "pbVar3 = pbVar3 + 1;" (assignment_expression "pbVar3 = pbVar3 + 1" (identifier "pbVar3") (= "=") (binary_expression "pbVar3 + 1" (identifier "pbVar3") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]")) (= "=") (cast_expression "(long)pbVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar3"))) (; ";")) (} "}")) (else_clause "else {\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" (else "else") (compound_statement "{\n          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);\n          if (iVar2 == -1) goto LAB_002f6fe8;\n          pbVar3 = (byte *)plVar4[2];\n          pbVar7 = (byte *)plVar4[3];\n        }" ({ "{") (expression_statement "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);" (assignment_expression "iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4)" (identifier "iVar2") (= "=") (call_expression "(**(code **)(*plVar4 + 0x50))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x50))" (( "(") (pointer_expression "**(code **)(*plVar4 + 0x50)" (* "*") (pointer_expression "*(code **)(*plVar4 + 0x50)" (* "*") (cast_expression "(code **)(*plVar4 + 0x50)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*plVar4 + 0x50)" (( "(") (binary_expression "*plVar4 + 0x50" (pointer_expression "*plVar4" (* "*") (identifier "plVar4")) (+ "+") (number_literal "0x50")) () ")"))))) () ")")) (argument_list "(plVar4)" (( "(") (identifier "plVar4") () ")")))) (; ";")) (if_statement "if (iVar2 == -1) goto LAB_002f6fe8;" (if "if") (parenthesized_expression "(iVar2 == -1)" (( "(") (binary_expression "iVar2 == -1" (identifier "iVar2") (== "==") (number_literal "-1")) () ")")) (goto_statement "goto LAB_002f6fe8;" (goto "goto") (statement_identifier "LAB_002f6fe8") (; ";"))) (expression_statement "pbVar3 = (byte *)plVar4[2];" (assignment_expression "pbVar3 = (byte *)plVar4[2]" (identifier "pbVar3") (= "=") (cast_expression "(byte *)plVar4[2]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]")))) (; ";")) (expression_statement "pbVar7 = (byte *)plVar4[3];" (assignment_expression "pbVar7 = (byte *)plVar4[3]" (identifier "pbVar7") (= "=") (cast_expression "(byte *)plVar4[3]" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar4[3]" (identifier "plVar4") ([ "[") (number_literal "3") (] "]")))) (; ";")) (} "}")))) (if_statement "if (pbVar7 <= pbVar3) goto LAB_002f7060;" (if "if") (parenthesized_expression "(pbVar7 <= pbVar3)" (( "(") (binary_expression "pbVar7 <= pbVar3" (identifier "pbVar7") (<= "<=") (identifier "pbVar3")) () ")")) (goto_statement "goto LAB_002f7060;" (goto "goto") (statement_identifier "LAB_002f7060") (; ";"))) (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" (identifier "uVar1") (= "=") (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (* "*") (identifier "pbVar3"))) (; ";")) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" (identifier "lVar6") (= "=") (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]"))) (; ";")) (} "}")) (else_clause "else {\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" (else "else") (compound_statement "{\n        pbVar3 = pbVar3 + lVar5;\n        lVar6 = lVar6 + lVar5;\n        plVar4[2] = (long)pbVar3;\n        param_1[1] = lVar6;\n        if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }\n      }" ({ "{") (expression_statement "pbVar3 = pbVar3 + lVar5;" (assignment_expression "pbVar3 = pbVar3 + lVar5" (identifier "pbVar3") (= "=") (binary_expression "pbVar3 + lVar5" (identifier "pbVar3") (+ "+") (identifier "lVar5"))) (; ";")) (expression_statement "lVar6 = lVar6 + lVar5;" (assignment_expression "lVar6 = lVar6 + lVar5" (identifier "lVar6") (= "=") (binary_expression "lVar6 + lVar5" (identifier "lVar6") (+ "+") (identifier "lVar5"))) (; ";")) (expression_statement "plVar4[2] = (long)pbVar3;" (assignment_expression "plVar4[2] = (long)pbVar3" (subscript_expression "plVar4[2]" (identifier "plVar4") ([ "[") (number_literal "2") (] "]")) (= "=") (cast_expression "(long)pbVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "pbVar3"))) (; ";")) (expression_statement "param_1[1] = lVar6;" (assignment_expression "param_1[1] = lVar6" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (identifier "lVar6")) (; ";")) (if_statement "if (pbVar3 < pbVar7) {\n          uVar1 = (uint)*pbVar3;\n        }\n        else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" (if "if") (parenthesized_expression "(pbVar3 < pbVar7)" (( "(") (binary_expression "pbVar3 < pbVar7" (identifier "pbVar3") (< "<") (identifier "pbVar7")) () ")")) (compound_statement "{\n          uVar1 = (uint)*pbVar3;\n        }" ({ "{") (expression_statement "uVar1 = (uint)*pbVar3;" (assignment_expression "uVar1 = (uint)*pbVar3" (identifier "uVar1") (= "=") (binary_expression "(uint)*pbVar3" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (* "*") (identifier "pbVar3"))) (; ";")) (} "}")) (else_clause "else {\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" (else "else") (compound_statement "{\nLAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);\n          lVar6 = param_1[1];\n        }" ({ "{") (labeled_statement "LAB_002f7060:\n                    \n          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (statement_identifier "LAB_002f7060") (: ":") (expression_statement "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);" (assignment_expression "uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4)" (identifier "uVar1") (= "=") (call_expression "(**(code **)(*plVar4 + 0x48))(plVar4)" (parenthesized_expression "(**(code **)(*plVar4 + 0x48))" (( "(") (pointer_expression "**(code **)(*plVar4 + 0x48)" (* "*") (pointer_expression "*(code **)(*plVar4 + 0x48)" (* "*") (cast_expression "(code **)(*plVar4 + 0x48)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*plVar4 + 0x48)" (( "(") (binary_expression "*plVar4 + 0x48" (pointer_expression "*plVar4" (* "*") (identifier "plVar4")) (+ "+") (number_literal "0x48")) () ")"))))) () ")")) (argument_list "(plVar4)" (( "(") (identifier "plVar4") () ")")))) (; ";"))) (expression_statement "lVar6 = param_1[1];" (assignment_expression "lVar6 = param_1[1]" (identifier "lVar6") (= "=") (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]"))) (; ";")) (} "}")))) (} "}")))) (} "}"))) (if_statement "if (param_2 != 0x7fffffffffffffff) {\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" (if "if") (parenthesized_expression "(param_2 != 0x7fffffffffffffff)" (( "(") (binary_expression "param_2 != 0x7fffffffffffffff" (identifier "param_2") (!= "!=") (number_literal "0x7fffffffffffffff")) () ")")) (compound_statement "{\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\n      if (uVar1 != 0xffffffff) {\n        return param_1;\n      }\n      goto LAB_002f7043;\n    }" ({ "{") (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" (if "if") (parenthesized_expression "(cVar8 != '\0')" (( "(") (binary_expression "cVar8 != '\0'" (identifier "cVar8") (!= "!=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" ({ "{") (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0x7fffffffffffffff")) (; ";")) (} "}"))) (if_statement "if (uVar1 != 0xffffffff) {\n        return param_1;\n      }" (if "if") (parenthesized_expression "(uVar1 != 0xffffffff)" (( "(") (binary_expression "uVar1 != 0xffffffff" (identifier "uVar1") (!= "!=") (number_literal "0xffffffff")) () ")")) (compound_statement "{\n        return param_1;\n      }" ({ "{") (return_statement "return param_1;" (return "return") (identifier "param_1") (; ";")) (} "}"))) (goto_statement "goto LAB_002f7043;" (goto "goto") (statement_identifier "LAB_002f7043") (; ";")) (} "}"))) (if_statement "if (uVar1 == 0xffffffff) {\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" (if "if") (parenthesized_expression "(uVar1 == 0xffffffff)" (( "(") (binary_expression "uVar1 == 0xffffffff" (identifier "uVar1") (== "==") (number_literal "0xffffffff")) () ")")) (compound_statement "{\nLAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }\nLAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;\n      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);\n      return param_1;\n    }" ({ "{") (labeled_statement "LAB_002f7030:\n      if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" (statement_identifier "LAB_002f7030") (: ":") (if_statement "if (cVar8 != '\0') {\n        param_1[1] = 0x7fffffffffffffff;\n      }" (if "if") (parenthesized_expression "(cVar8 != '\0')" (( "(") (binary_expression "cVar8 != '\0'" (identifier "cVar8") (!= "!=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (compound_statement "{\n        param_1[1] = 0x7fffffffffffffff;\n      }" ({ "{") (expression_statement "param_1[1] = 0x7fffffffffffffff;" (assignment_expression "param_1[1] = 0x7fffffffffffffff" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0x7fffffffffffffff")) (; ";")) (} "}")))) (labeled_statement "LAB_002f7043:\n      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" (statement_identifier "LAB_002f7043") (: ":") (expression_statement "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;" (assignment_expression "lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1" (identifier "lVar6") (= "=") (binary_expression "*(long *)(*param_1 + -0x18) + (long)param_1" (pointer_expression "*(long *)(*param_1 + -0x18)" (* "*") (cast_expression "(long *)(*param_1 + -0x18)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_1 + -0x18)" (( "(") (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (+ "+") (number_literal "-0x18")) () ")")))) (+ "+") (cast_expression "(long)param_1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_1")))) (; ";"))) (expression_statement "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);" (call_expression "FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2)" (identifier "FUN_0029c920") (argument_list "(lVar6,*(uint *)(lVar6 + 0x20) | 2)" (( "(") (identifier "lVar6") (, ",") (binary_expression "*(uint *)(lVar6 + 0x20) | 2" (pointer_expression "*(uint *)(lVar6 + 0x20)" (* "*") (cast_expression "(uint *)(lVar6 + 0x20)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar6 + 0x20)" (( "(") (binary_expression "lVar6 + 0x20" (identifier "lVar6") (+ "+") (number_literal "0x20")) () ")")))) (| "|") (number_literal "2")) () ")"))) (; ";")) (return_statement "return param_1;" (return "return") (identifier "param_1") (; ";")) (} "}"))) (expression_statement "param_1[1] = -0x8000000000000000;" (assignment_expression "param_1[1] = -0x8000000000000000" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "-0x8000000000000000")) (; ";")) (expression_statement "lVar6 = -0x8000000000000000;" (assignment_expression "lVar6 = -0x8000000000000000" (identifier "lVar6") (= "=") (number_literal "-0x8000000000000000")) (; ";")) (expression_statement "cVar8 = local_39[0];" (assignment_expression "cVar8 = local_39[0]" (identifier "cVar8") (= "=") (subscript_expression "local_39[0]" (identifier "local_39") ([ "[") (number_literal "0") (] "]"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (; ";")) (} "}")))

/* std::istream::ignore(long) */

type_3 * __thiscall std::type_3::var_1(type_3 *var_2,long function_1)

{
  long *plVar1;
  type_1 var_4;
  int var_9;
  type_2 *var_7;
  type_3 *piVar5;
  long var_6;
  long var_3;
  type_2 *var_8;
  type_4 var_5;
  type_4 local_39 [9];
  
  if (function_1 == 1) {
    piVar5 = (type_3 *)var_1(var_2);
    return piVar5;
  }
  *(type_5 *)(var_2 + 8) = 0;
  sentry::type_4(local_39,var_2,true);
  if ((function_1 < 1) || (local_39[0] == (type_4)0x0)) {
    return var_2;
  }
  plVar1 = *(long **)(var_2 + *(long *)(*(long *)var_2 + -0x18) + 0xe8);
  if ((type_2 *)plVar1[2] < (type_2 *)plVar1[3]) {
    var_4 = (type_1)*(type_2 *)plVar1[2];
  }
  else {
    var_4 = (**(type_6 **)(*plVar1 + 0x48))(plVar1);
  }
  var_3 = *(long *)(var_2 + 8);
  var_5 = (type_4)0x0;
  do {
    while (var_3 < function_1) {
      if (var_4 == 0xffffffff) {
LAB_002f6fe8:
        if (function_1 != 0x7fffffffffffffff) {
          if (var_5 != (type_4)0x0) {
            *(type_5 *)(var_2 + 8) = 0x7fffffffffffffff;
          }
          goto LAB_002f7043;
        }
        goto LAB_002f7030;
      }
      var_8 = (type_2 *)plVar1[3];
      var_7 = (type_2 *)plVar1[2];
      var_6 = function_1 - var_3;
      if ((long)var_8 - (long)var_7 < function_1 - var_3) {
        var_6 = (long)var_8 - (long)var_7;
      }
      if (var_6 < 2) {
        *(long *)(var_2 + 8) = var_3 + 1;
        if (var_7 < var_8) {
          var_7 = var_7 + 1;
          plVar1[2] = (long)var_7;
        }
        else {
          var_9 = (**(type_6 **)(*plVar1 + 0x50))(plVar1);
          if (var_9 == -1) goto LAB_002f6fe8;
          var_7 = (type_2 *)plVar1[2];
          var_8 = (type_2 *)plVar1[3];
        }
        if (var_8 <= var_7) goto LAB_002f7060;
        var_4 = (type_1)*var_7;
        var_3 = *(long *)(var_2 + 8);
      }
      else {
        var_7 = var_7 + var_6;
        var_3 = var_3 + var_6;
        plVar1[2] = (long)var_7;
        *(long *)(var_2 + 8) = var_3;
        if (var_7 < var_8) {
          var_4 = (type_1)*var_7;
        }
        else {
LAB_002f7060:
                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */
          var_4 = (**(type_6 **)(*plVar1 + 0x48))(plVar1);
          var_3 = *(long *)(var_2 + 8);
        }
      }
    }
    if (function_1 != 0x7fffffffffffffff) {
      if (var_5 != (type_4)0x0) {
        *(type_5 *)(var_2 + 8) = 0x7fffffffffffffff;
      }
      if (var_4 != 0xffffffff) {
        return var_2;
      }
      goto LAB_002f7043;
    }
    if (var_4 == 0xffffffff) {
LAB_002f7030:
      if (var_5 != (type_4)0x0) {
        *(type_5 *)(var_2 + 8) = 0x7fffffffffffffff;
      }
LAB_002f7043:
      ios::var_10((type_7 *)(var_2 + *(long *)(*(long *)var_2 + -0x18)),
                 *(type_8 *)((type_7 *)(var_2 + *(long *)(*(long *)var_2 + -0x18)) + 0x20) |
                 var_11);
      return var_2;
    }
    *(type_5 *)(var_2 + 8) = 0x8000000000000000;
    var_3 = -0x8000000000000000;
    var_5 = local_39[0];
  } while( true );
}


(translation_unit (function_definition type: (sized_type_specifier) declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (sized_type_specifier) declarator: (identifier))))) body: (compound_statement (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (array_declarator declarator: (identifier) size: (number_literal))) (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: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (identifier) arguments: (argument_list))))) (return_statement (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (identifier) (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (char_literal (escape_sequence)))))) consequence: (compound_statement (return_statement (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal)))))) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (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: (pointer_expression argument: (identifier)) right: (number_literal))))))) arguments: (argument_list (identifier)))))))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (char_literal (escape_sequence)))) (do_statement body: (compound_statement (while_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (labeled_statement label: (statement_identifier) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (char_literal (escape_sequence)))) consequence: (compound_statement (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))))) (goto_statement label: (statement_identifier))))) (goto_statement label: (statement_identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))) right: (binary_expression left: (identifier) right: (identifier)))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (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: (pointer_expression argument: (identifier)) right: (number_literal))))))) arguments: (argument_list (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (goto_statement label: (statement_identifier))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal)))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (goto_statement label: (statement_identifier))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (identifier)) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (identifier)) right: (identifier))))) alternative: (else_clause (compound_statement (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (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: (pointer_expression argument: (identifier)) right: (number_literal))))))) arguments: (argument_list (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal)))))))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (char_literal (escape_sequence)))) consequence: (compound_statement (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement (identifier)))) (goto_statement label: (statement_identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (labeled_statement label: (statement_identifier) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (char_literal (escape_sequence)))) consequence: (compound_statement (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal)))))) (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal))))) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)))))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (binary_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))))) (return_statement (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal))))) condition: (parenthesized_expression (true))))))

long * MASKED(long *param_1,long param_2)

{
  uint uVar1;
  int iVar2;
  byte *pbVar3;
  long *plVar4;
  long lVar5;
  long lVar6;
  byte *pbVar7;
  char cVar8;
  char local_39 [9];
  
  if (param_2 == 1) {
    plVar4 = (long *)FUN_00297d90();
    return plVar4;
  }
  param_1[1] = 0;
  FUN_00296fe0(local_39,param_1,1);
  if ((param_2 < 1) || (local_39[0] == '\0')) {
    return param_1;
  }
  plVar4 = *(long **)((long)param_1 + *(long *)(*param_1 + -0x18) + 0xe8);
  if ((byte *)plVar4[2] < (byte *)plVar4[3]) {
    uVar1 = (uint)*(byte *)plVar4[2];
  }
  else {
    uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);
  }
  lVar6 = param_1[1];
  cVar8 = '\0';
  do {
    while (lVar6 < param_2) {
      if (uVar1 == 0xffffffff) {
LAB_002f6fe8:
        if (param_2 != 0x7fffffffffffffff) {
          if (cVar8 != '\0') {
            param_1[1] = 0x7fffffffffffffff;
          }
          goto LAB_002f7043;
        }
        goto LAB_002f7030;
      }
      pbVar7 = (byte *)plVar4[3];
      pbVar3 = (byte *)plVar4[2];
      lVar5 = param_2 - lVar6;
      if ((long)pbVar7 - (long)pbVar3 < param_2 - lVar6) {
        lVar5 = (long)pbVar7 - (long)pbVar3;
      }
      if (lVar5 < 2) {
        param_1[1] = lVar6 + 1;
        if (pbVar3 < pbVar7) {
          pbVar3 = pbVar3 + 1;
          plVar4[2] = (long)pbVar3;
        }
        else {
          iVar2 = (**(code **)(*plVar4 + 0x50))(plVar4);
          if (iVar2 == -1) goto LAB_002f6fe8;
          pbVar3 = (byte *)plVar4[2];
          pbVar7 = (byte *)plVar4[3];
        }
        if (pbVar7 <= pbVar3) goto LAB_002f7060;
        uVar1 = (uint)*pbVar3;
        lVar6 = param_1[1];
      }
      else {
        pbVar3 = pbVar3 + lVar5;
        lVar6 = lVar6 + lVar5;
        plVar4[2] = (long)pbVar3;
        param_1[1] = lVar6;
        if (pbVar3 < pbVar7) {
          uVar1 = (uint)*pbVar3;
        }
        else {
LAB_002f7060:
                    /* try { // try from 002f7067 to 002f70a1 has its CatchHandler @ 002f70a7 */
          uVar1 = (**(code **)(*plVar4 + 0x48))(plVar4);
          lVar6 = param_1[1];
        }
      }
    }
    if (param_2 != 0x7fffffffffffffff) {
      if (cVar8 != '\0') {
        param_1[1] = 0x7fffffffffffffff;
      }
      if (uVar1 != 0xffffffff) {
        return param_1;
      }
      goto LAB_002f7043;
    }
    if (uVar1 == 0xffffffff) {
LAB_002f7030:
      if (cVar8 != '\0') {
        param_1[1] = 0x7fffffffffffffff;
      }
LAB_002f7043:
      lVar6 = *(long *)(*param_1 + -0x18) + (long)param_1;
      FUN_0029c920(lVar6,*(uint *)(lVar6 + 0x20) | 2);
      return param_1;
    }
    param_1[1] = -0x8000000000000000;
    lVar6 = -0x8000000000000000;
    cVar8 = local_39[0];
  } while( true );
}

