#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %BEGIN

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2  !***********************************************************************
  //     3  !*    SHOULD RUN WITHOUT OPUT. LOOPS ON SOME COMPILERS DUE TO          *
  //     4  !*    MISSING LABELS GIVING JUMPS WITH ZERO OFFSET                     *
  //     5  !***********************************************************************
  //     6  %OWNBYTEINTEGERARRAY CH(0:16)='0','1','2','3','4','5','6','7','8',

  static unsigned char CH[17] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71};
  struct _imp_dv CH_dv = {CH, sizeof(unsigned char) /*, dims, <bounds> */};

  //     7+       '9','A','B','C','D','E','F','G'
  //     8  %INTEGER I,K,L

  int I;
  int K;
  int L;

  //     9  %CONSTINTEGER J=0
  //    10        I=4000; L=10

  I = 4000;
  L = 10;

  //    11        %IF I>4095 %AND J#0 %THEN I=I+1

  if (I <= 4095) goto L_0001;
  if (0 == 0) goto L_0001;
  I = I + 1;
L_0001:;

//    12        %IF I>4095 %AND J#0 %THEN I=I+1 %ELSE I=I-1

  if (I <= 4095) goto L_0002;
  if (0 == 0) goto L_0002;
  I = I + 1;
  goto L_0003;
L_0002:;
  I = I - 1;
L_0003:;

//    13        %IF I>4095 %AND J#0 %THEN %START; %FINISH

  if (I <= 4095) goto L_0004;
  if (0 == 0) goto L_0004;
L_0004:;

//    14        %IF I>4095 %AND J#0 %THEN %START

  if (I <= 4095) goto L_0005;
  if (0 == 0) goto L_0005;

    //    15           I=I+1

  I = I + 1;

  //    16        %FINISH %ELSE I=I-1

  goto L_0006;
L_0005:;
  I = I - 1;
L_0006:;

//    17        %IF (I>4095 %AND J#0 ) %AND L=1 %THEN I=I+1

  if (I <= 4095) goto L_0007;
  if (0 == 0) goto L_0007;
  if (L != 1) goto L_0007;
  I = I + 1;
L_0007:;

//    18        %IF (I>4095 %AND J#0) %OR L=1 %THEN I=I+1

  if (I <= 4095) goto L_0008;
  if (0 != 0) goto L_0009;
L_0008:;
  if (L != 1) goto L_000A;
L_0009:;
  I = I + 1;
L_000A:;

//    19        %UNLESS I>4095 %AND J#0 %THEN I=I+1

  if (I <= 4095) goto L_000B;
  if (0 != 0) goto L_000C;
L_000B:;
  I = I + 1;
L_000C:;

//    20        %UNLESS I>4095 %AND J#0 %THEN I=I+1 %ELSE I=I-1

  if (I <= 4095) goto L_000D;
  if (0 != 0) goto L_000E;
L_000D:;
  I = I + 1;
  goto L_000F;
L_000E:;
  I = I - 1;
L_000F:;

//    21        %UNLESS I>4095 %AND J#0 %THEN %START; %FINISH

  if (I <= 4095) goto L_0010;
  if (0 != 0) goto L_0011;
L_0010:;
L_0011:;

//    22        %UNLESS I>4095 %AND J#0 %THEN %START

  if (I <= 4095) goto L_0012;
  if (0 != 0) goto L_0013;
L_0012:;

//    23           I=I+1

  I = I + 1;

  //    24        %FINISH %ELSE I=I-1

  goto L_0014;
L_0013:;
  I = I - 1;
L_0014:;

//    25        %UNLESS (I>4095 %AND J#0 ) %AND L=1 %THEN I=I+1

  if (I <= 4095) goto L_0015;
  if (0 == 0) goto L_0015;
  if (L == 1) goto L_0016;
L_0015:;
  I = I + 1;
L_0016:;

//    26        %UNLESS (I>4095 %AND J#0) %OR L=1 %THEN I=I+1

  if (I <= 4095) goto L_0017;
  if (0 != 0) goto L_0018;
L_0017:;
  if (L == 1) goto L_0018;
  I = I + 1;
L_0018:;

//    27         %FOR K=0,1,16 %CYCLE

  // %for K = 0, 1, 16 %cycle
  {
    K = -1;
  L_0019:
    if (K == 16) goto L_001A;
    K += 1;

    //    28           %UNLESS '0'<=CH(K)<='9' %OR 'A'<=CH(K)<='F' %THEN I=I+1

    {
      // Double-sided test on CH[K] (Part I)
      unsigned char tmp;
      if (48 > (tmp = CH[K])) goto L_001C;
      // Double-sided test on CH[K] (Part II)
      if (tmp <= 57) goto L_001D;
    }
  L_001C:;
    {
      // Double-sided test on CH[K] (Part I)
      unsigned char tmp;
      if (65 > (tmp = CH[K])) goto L_001E;
      // Double-sided test on CH[K] (Part II)
      if (tmp <= 70) goto L_001D;
    }
  L_001E:;
    I = I + 1;
  L_001D:;

  //    29        %REPEAT

    goto L_0019;
  }

L_001A:;

//    30        %IF I=4004 %THEN PRINTSTRING("TEST OK") %ELSE %C

  if (I != 4004) goto L_001F;
  _imp_PRINTSTRING(_imp_str_literal("TEST OK"));
  goto L_0020;
L_001F:;
  _imp_PRINTSTRING(_imp_str_literal("WRONG ANSWERS"));
  _imp_WRITE(I, 5);
L_0020:;

//    31+          PRINTSTRING("WRONG ANSWERS") %AND WRITE(I,5)
//    32  %ENDOFPROGRAM

  _imp_stop(0);
  return 0;
end_0:;
}