#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  _imp_enter();  // %begin

  typedef struct RF {
    int I2;
    float R;
    int I;

  } RF;
  //   %recordformat rf ( %integer i, %real r, %integer i2)
  //
  RF REC1;
  RF REC2;
  //   %record (rf) rec1, rec2
  RF *RECN1;
  RF *RECN2;
  //   %record (rf) %name recn1, recn2
  RF RECA1[3 - 2 + 1], RECA2[3 - 2 + 1];
  RF RECA3[5 - 4 + 1][2 - 1 + 1];
  //   %record (rf) %array reca1,reca2(2:3),reca3(4:5,1:2)
  RF *RECAN1;
  RF *RECAN2;
  //   %record (rf) %array %name recan1,recan2
  RF *RECNA1[3 - 2 + 1], *RECNA2[3 - 2 + 1];
  RF *RECNA3[2 - 1 + 1];
  //   %record (rf) %name %array recna1,recna2(2:3),recna3(1:2)
  RF ***RECNAN1;
  RF ***RECNAN2;
  //   %record (rf) %name %array %name recnan1,recnan2
  auto RF RFN1(void) {
    _imp_enter();
    //   %record(rf)%fn rfn1
    return (REC2);  //     %result = rec2

    _imp_leave();
  }
  //   %end
  auto RF *RMAP1(void) {
    _imp_enter();
    //   %record(rf)%map rmap1
    return (&REC2);  //     %result == rec2

    _imp_leave();
  }
  //   %end
  //
  REC1 = REC2;         //   rec1 = rec2
  RECN1 = &REC2;       //   recn1 == rec2
  REC1 = RECN1;        //   rec1 = recn1
  RECA1[2] = REC2;     //   reca1(2) = rec2
  REC1 = RECA1[2];     //   rec1 = reca1(2)
  RECA3[4][2] = REC2;  //   reca3(4,2) = rec2
  REC1 = RECA3[4][2];  //   rec1 = reca3(4,2)
  RECNAN1 = &RECNA1;   //   recnan1 == recna1
  RECNAN1[2] = &REC1;  //   recnan1(2) == rec1
  REC1 = RECNAN1[2];   //   rec1 = recnan1(2)
  REC1 = RFN1();       //   rec1 = rfn1
  *RMAP1() = REC1;     //   rmap1 = rec1
  REC1 = RMAP1();      //   rec1 = rmap1
  //
  // %endofprogram

  _imp_leave();
  exit(0);
  return (0);
}
