void FUN_00474e04(uint *param_1,undefined4 *param_2,int param_3)

{
  int iVar1;
  undefined *puVar2;
  undefined4 uVar3;
  int *piVar4;
  uint uVar5;
  uint uVar6;
  code *pcVar7;
  
  while( true ) {
    if (param_2 == (undefined4 *)0x0) {
      return;
    }
    if (param_1[0x47] != 0) {
      return;
    }
    if ((param_2[2] == 0) && ((param_3 != 0 || (2 < *(int *)param_2[1] - 0x19U)))) break;
LAB_00474fe0:
    param_2 = (undefined4 *)*param_2;
  }
  piVar4 = (int *)param_2[1];
  iVar1 = *piVar4;
  uVar6 = param_1[0x45];
  param_2[2] = 1;
  param_1[0x45] = param_2[3];
  if (iVar1 == 0x24) {
    uVar3 = *param_2;
    pcVar7 = FUN_00474bcc;
  }
  else {
    if (iVar1 != 0x25) {
      if (iVar1 != 2) {
        FUN_00473830(param_1,piVar4);
        param_1[0x45] = uVar6;
        goto LAB_00474fe0;
      }
      uVar5 = param_1[0x46];
      param_1[0x46] = 0;
      FUN_004739e0(param_1,piVar4[1]);
      param_1[0x46] = uVar5;
      if ((*param_1 & 4) == 0) {
        puVar2 = &DAT_00497c50;
        pcVar7 = FUN_004737d0;
      }
      else {
        puVar2 = (undefined *)0x2e;
        pcVar7 = FUN_004736cc;
      }
      (*pcVar7)(param_1,puVar2);
      for (piVar4 = *(int **)(param_2[1] + 8); *piVar4 - 0x19U < 3; piVar4 = (int *)piVar4[1]) {
      }
      FUN_004739e0(param_1);
      goto LAB_00474fc4;
    }
    uVar3 = *param_2;
    pcVar7 = FUN_0047501c;
  }
  (*pcVar7)(param_1,piVar4,uVar3);
LAB_00474fc4:
  param_1[0x45] = uVar6;
  return;
}