*DECK ARGROUP 
USETEXT DNTEXT
USETEXT RPTEXT
PROC ARGROUP; 
          BEGIN 
  
          #AFTER ALL REPORT GROUPS  ROUTINE#
          #X# 
          #THIS ROUTINE#
          #- IS CALLED BY MASSAGER# 
          ITEM
                 FLN          I,
                 LLN          I,
                  CURFNATINDEX I, 
                  RGTDETAILPTR I, 
                  FDRDINDEX   I,
                  NUMDETAILGRP I, 
                  BASEDERGTABL I, 
                  BASERESETBTB I, 
                  RPTDNATPTR  I,
                  RGINDEX     I,
                  AUXINDEX    I,
                  SUMIDINDEX  I,
                RUNMSG       C(120),
                 SAVEDRPTPTR, 
                 TEMP1, 
                  RSTFLAG     I;
  
  
          ITEM   $TEMP$,
                $DUMMY$;
  
          XREF   PROC         INTERCEPT;
          XREF   FUNC         PLTCNVRT I; 
          XREF   PROC         RWSET    ;
          XREF   PROC         RWSET1   ;
          XREF   PROC         GETNEXT  ;
          XREF   FUNC         RP$AUXPTR;
          XREF   FUNC         RWGET    ;
          XREF   FUNC         RWGET1   ;
  
          DEF    GET          #GETFIELD#; 
          DEF    SET          #SETFIELD#; 
          DEF    GETQ         #GETQUICK#; 
  
*CALL RPCOMM
*CALL AUXT1 
*CALL AUXTVALS
*CALL DNATVALS
*CALL FDRDT1
*CALL FNAT1 
*CALL FNATVALS
*CALL GETSET
*CALL PLT1
*CALL PLTVALS 
*CALL PNAT1 
*CALL TABLNAMES 
  
  
  
  
          CONTROL EJECT;
  
          #INTERNAL  PROCEDURE NO.   1# 
  
PROC GENRGPNAT; 
          BEGIN 
          LASTPNATINDX = LASTPNATINDX + 1;
          SET(PN$PREVSECTN,PNAT$,LASTPNATINDX,RPDUMSECTION);
          #SEE"ONCE-ONLY"SECTION# 
          #NOT A SOURCE STATEMENT ITEM# 
          END #GENRGPNAT# 
          CONTROL EJECT;
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("ARGROUP")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          #* BEGINNING OF AFTER ALL-REPORT-GROUPS PROCEDURES# 
          #IF NECESSARY, DO FURTHER ANALYSIS FOR PART 1 OF RULE 1A# 
          #OF TABLE 5  RF REPORT GROUP PRESENTATION RULES#
  
          IF RFPFANALAARG EQ 1
          THEN
              BEGIN 
              RFPFANALAARG = 0; 
              IF PFFINALLCSET  NQ 0 
                  #IE. - IF PF REPORT GROUP EXISTS AND CONDITIONS WERE# 
                  #SUCH THAT IT WAS WORTHWHILE TO CALCULATE#
                  #PFFINALLCSET#
              THEN
                  BEGIN 
                  FLN = PFFINALLCSET  + 1;
                  IF RFFPLP  LS  FLN
                  THEN
                      BEGIN 
  
                      #DIAGNOSTIC    (ADVISORY)#
                      #IF PAGE FOOTING AND REPORT FOOTING ARE#
                      #PRESENTED ON THE SAME PAGE, FIRST PRINT# 
                      #LINE POSITION OF RF WILL VIOLATE      #
                      #UPPER LIMIT RULE OF TABLE 5 PRESENTATION RULES.# 
                      CALLADIAG(RFDIAGLINREF,87); 
                      IF ANALONLYREPT  EQ 0 
                          AND 
                          BUILTRFTABLS EQ 1 
                      THEN
                          BEGIN 
  
                          #SETUP RFRGLINK TO TELL RGEN TO GENERATE CODE#
                          #TO CHECK FOR THIS CONFLICT#
  
                          RWSET1(RFPF$OVERLAP  #CURRRFRGPTR#,1);
                          SET(PL$LINE,PLT$,RPPLTOFFSET,0);
                          SET(PL$COLUMN,PLT$,RPPLTOFFSET,0);
                          SET(PL$LENGTH,PLT$,RPPLTOFFSET,1);
                          SET(PL$TYPE,PLT$,RPPLTOFFSET,PLTUNSGNILIT); 
                          RUNMSG = "6"; 
                          SETPLST(RPPLTOFFSET,LOC(RUNMSG)); 
                          RWSET1(RF$ERRORMES #CURRRFRGPTR#,RPPLTOFFSET);
                          RPPLTOFFSET = RPPLTOFFSET + 1;
                          END 
                      END 
                  END 
              END 
          #* * * * * * * * * * * * * * * * * * * * *# 
          #X# 
          #IF NECESSARY, DO FURTHER ANALYSIS FOR  RULE 2-LOWER LIMIT# 
          #RULE- OF TABLE 5 RF REPORT GROUP PRESENTATION RULES# 
  
          IF RFPFLOWLIMAN EQ 1
          THEN
              BEGIN 
              RFPFLOWLIMAN = 0; 
              IF PFFINALLCSET NQ 0
                  #IE. - IF PF REPORT GROUP EXISTS AND CONDITIONS#
                  #WERE SUCH THAT IT WAS WORTHWHILE TO CALCULATE# 
                  #PFFINALLCSET#
              THEN
                  BEGIN 
                  #COMPUTE LAST LINE NUMBER BASED ON FACT THAT# 
                  #FPLP = PFFINALLCSET + INTEGER# 
                  #OF FIRST LINE NUMBER CLAUSE IN RF.#
                  LLN = PFFINALLCSET + SUMRELINENOS;
                  IF LLN GR RFLOWLIMIT
                      #PAGE LIMIT#
                  THEN
                      BEGIN 
  
                      #DIAGNOSTIC  (ADVISORY)#
                      #AN ATTEMPT TO PRESENT THIS REPORT FOOTING# 
                      #ON THE SAME PAGE AS THE PAGE FOOTING     # 
                      #WOULD VIOLATE LOWER LIMIT RULE. IF ATTEMPTED#
                      #ANY LINES THAT WOULD VIOLATE PAGE LIMIT WILL NOT#
                      #BE PRESENTED.# 
  
                      #NOTE-# 
                      #IS IMPORTANT THAT LAST PART OF DIAG MESSAGE# 
                      #APPEAR, AS LINES WILL BE OMITTED WITHOUT WARNING#
                      #OR NOTICE AT EXECUTION TIME.#
                      CALLADIAG(RFDIAGLINREF,88); 
                      IF ANALONLYREPT EQ 0
                          AND 
                          BUILTRFTABLS EQ 1 
                      THEN
                          BEGIN 
                          #SET UP RFRGLINK TO TELL R-GEN TO GENERATE# 
                          #CODE TO CHECK FOR VIOLATION OF PAGE LIMIT# 
                          #AT EXECUTION TIME IN REPORT FOOTING ROUTINE.#
                          RWSET1(PFRFOVERLIMT  #CURRRFRGPTR#,1);
                          END 
                      END 
                  END 
              END 
          #* * * * * * * * * * * * * * * * * * * #
          PFFINALLCSET = 0; 
          BUILTRFTABLS = 0; 
  
          #* * * * * * * * * * * * * * * * * * * * * * * * * * * * #
          #* * * * * * * * * * * * * * * * * * * * * * * * #
          #X# 
          #IF SEQOFLN = AR  IN THE PAGE HEADING REPORT GROUP(IF IT #
          #EXISTED) THEN# 
          #FURTHER ANALYSIS MUST BE DONE HERE FOR  RULE 1A  OF# 
          #TABLE 2  PH REPORT GROUP PRESENTATION RULES.#
          IF PHRHANALAARG EQ 1
          THEN
              BEGIN 
              PHRHANALAARG = 0; 
              IF RHFINALLCSET  NQ 0 
                  #IE. - IF REPORT HEADING REPORT GROUP EXISTS# 
                  #AND CONDITIONS WERE SUCH THAT IT WAS#
                  #WORTHWHILE TO CALCULATE RH-FINAL-LINE-COUNTER-#
                  #SETTING# 
              THEN
                  BEGIN 
                  FLN = RHFINALLCSET + 1; 
                  IF PHFPLP LS FLN
                  THEN
                      BEGIN 
  
                      #DIAGNOSTIC        (ADVISORY)#
                      #IF REPORT HEADING AND PAGE HEADING ARE # 
                      #PRESENTED ON THE SAME PAGE, FIRST PRINT LINE # 
                      #POSITION OF PH WILL VIOLATE UPPER     #
                      # LIMIT RULE  OF  TABLE 2 PRESENTATION RULES.#
                      CALLADIAG(PHDIAGLINREF,89); 
                      IF ANALONLYREPT  EQ 0 
                          AND 
                          BUILTPHTABLS EQ 1 
                      THEN
                          BEGIN 
  
                          #SETUP PHRGLINK TO TELL RGEN TO GENERATE CODE#
                          #TO CHECK FOR THIS CONFLICT#
  
                          RWSET1(RHPH$OVERLAP  #CURRPHRGPTR#,1);
                          SET(PL$LENGTH,PLT$,RPPLTOFFSET,1);
                          SET(PL$TYPE,PLT$,RPPLTOFFSET,PLTUNSGNILIT); 
                          SET(PL$LINE,PLT$,RPPLTOFFSET,0);
                          SET(PL$COLUMN,PLT$,RPPLTOFFSET,0);
                          RUNMSG = "5"; 
                          SETPLST(RPPLTOFFSET,LOC(RUNMSG)); 
                          RWSET1(PLT$ERRORMES  #CURRPHRGPTR#, 
                                  RPPLTOFFSET); 
                          RPPLTOFFSET = RPPLTOFFSET  + 1; 
                          END 
                      END 
                  END 
              END 
          #* * * * * * * * * * * * * * * * * * * * * * #
          #X# 
          #IF NECESSARY, DO FURTHER ANALYSIS FOR RULE 2- LOWER LIMIT# 
          #RULE- OF TABLE 2 PH REPORT GROUP PRESENTATION RULES# 
  
          IF PHRHLOWLIMAN EQ 1
          THEN
              BEGIN 
              PHRHLOWLIMAN = 0; 
              IF RHFINALLCSET  NQ  0
                  #IE. -IF RH REPORT GROUP EXISTS AND CONDITIONS# 
                  #WERE SUCH THAT IT WAS WORTHWHILE TO CALCULATE# 
                  #RHFINALLCSET#
              THEN
                  BEGIN 
                  #COMPUTE LAST LINE NUMBER BASED ON FACT THAT# 
                  #FPLP = RHFINALLCSET + INTEGER# 
                  #OF FIRST LINE NUMBER CLAUSE IN PH.#
                  LLN = RHFINALLCSET + PHSUMRELLINE;
                  IF LLN GR PHLOWERLIMIT
                      #FIRST-DETAIL - 1#
                  THEN
                      BEGIN 
  
                      #DIAGNOSTIC (ADVISORY)# 
                      #AN ATTEMPT TO PRESENT THIS PAGE HEADING ON#
                      #THE SAME PAGE AS THE REPORT HEADING WOULD #
                      #VIOLATE LOWER LIMIT RULE.  IF ATTEMPTED,  #
                      #ANY LINE THAT WOULD VIOLATE THE LIMIT WILL#
                      #NOT BE PRESENTED.           #
  
                      #NOTE-# 
                      #IS IMPORTANT THAT LAST PART OF DIAG MESSAGE# 
                      #APPEAR, AS LINES WILL BE OMITTED WITHOUT WARNING#
                      #OR NOTICE AT EXECUTION TIME.#
                      CALLADIAG(PHDIAGLINREF,90); 
                      IF ANALONLYREPT  EQ 0 
                          AND 
                          BUILTPHTABLS EQ 1 
                      THEN
                          BEGIN 
                          #SET UP PHRGLINK TO TELL R-GEN TO GENERATE# 
                          #CODE TO CHECK FOR VIOLATION OF LOWER LIMIT#
                          #AT EXECUTION TIME IN PAGE HEADING ROUTINE# 
  
                          RWSET1(RHPHOVERLIMT  #CURRPHRGPTR#,1);
                          END 
                      END 
                  END 
              END 
          #* * * * * * * * * * * * * * * * * * * * #
          RHFINALLCSET  = 0;
          BUILTPHTABLS = 0; 
  
          #RESET TO 0 THE FOLLOWING USED IN TYPE CLAUSE-RT# 
  
          CHFRGOCURD = 0; 
          CFFRGOCURD = 0; 
          RHDEFIND = 0; 
          PHDEFIND = 0; 
          CHFDEFIND = 0;
          CFFDEFIND = 0;
          PFDEFINED = 0;
          RFDEFIND = 0; 
          #* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
          #SET EOT DELIM IN THE FOLLOWING TABLES.  RGTLINK, GRINDLINK#
  
          RWSET1(RGEOTDELIM  #CURRRPTGRPTR#,1); 
          #SAVE CURRRPTGRPPTR SO WE CAN RESET DELIM TO 0 #
          # IF WE BUILD A NEW LAST ENTRY BECAUSE THERE IS # 
          #NO DETAIL GROUPS.    # 
          SAVEDRPTPTR = CURRRPTGRPTR; 
          RWSET1(GITEOT$DELIM  #CURRGRINDPTR#,1); 
          RWSET1(SUMCNTRDELIM  #CURRSUMCNPTR#,1); 
          $TEMP$ = RWGET1(BASE$GRPIND  #CURRIRTPTR#); 
          IF RWGET(DEGROUPDNAT,$TEMP$) EQ 0 
          THEN
              BEGIN 
              RWSET(GITEOT$DELIM,NEXTGRINDPTR,1); 
              GETNEXT(GRINDLINK); 
              END 
          #* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
  
          IF RDOCURDSWTCH  NQ  0
              AND 
              NOFDFLAG  EQ 0
              #IE. RD APPEARED IN FD# 
              AND 
              INHIBITABLDF  EQ 0
          THEN
              BEGIN 
  
              #THE ITEMLENGTH MUST BE SET IN THE DNAT FOR PRINTLINEREC# 
              #NAME-1 (IRTLINK). IT SHOULD BE SET = THE LENGTH OF THE # 
              #LONGEST PRINT LINE DESCRIBED#
  
              $TEMP$ = RWGET1(PL$REC$NAME  #CURRIRTPTR#); 
              SET(DN$ITMLEN,DNAT$,$TEMP$,LNGTHLONGPLE); 
  
  
  
              #DN$ITMLEN(RECNAME1) = MAXIMUM PRINT LINE LENGTH + #
              #CARRIAGE CONTROL LENGTH + OPTIONALLY 2 BYTES FOR A CODE# 
  
         IF NOCODECLAUSE EQ 0 
         THEN LNGTHLONGPLE = LNGTHLONGPLE + 3;
         ELSE LNGTHLONGPLE = LNGTHLONGPLE + 1;
         SET(DN$ITMLEN,DNAT$,RECNAME1DNAT,LNGTHLONGPLE);
  
              #CHECK/SET  RECORD LENGTH IN PROPER FNAT FOR CURRENT RD#
  
              FOR FDRDINDEX =  1  STEP 1 UNTIL LASTFDRDNTRY DO
                  BEGIN 
                  IF GETQ(FR$REPTNAME,FDRDT$,FDRDINDEX) EQ CURRDDNAT
                  THEN
                      GOTO CAARG1;
                  #KNOW WILL FIND IT# 
                  END 
CAARG1: 
              CURFNATINDEX = GETQ(FR$FNATPTR,FDRDT$,FDRDINDEX); 
              IF GETQ(FN$RCTMIN,FNAT$,CURFNATINDEX) NQ 0
              THEN
                  BEGIN 
                  IF SHORTESTPLEN  LS 
                      GETQ(FN$RCTMIN,FNAT$,CURFNATINDEX)
                  THEN
                      GOTO RCCVIOLATION;
                  END 
              IF GETQ(FN$RCTMAX,FNAT$,CURFNATINDEX) NQ 0
              THEN
                  BEGIN 
                  IF LNGTHLONGPLE  GR 
                      GETQ(FN$RCTMAX,FNAT$,CURFNATINDEX)
                  THEN
                      BEGIN 
RCCVIOLATION: 
  
                      #DIAGNOSTIC#
                      #RECORD DESCRIPTION ASSOCIATED WITH INDICATED#
                      #RD VIOLATES RECORD CONTAINS CLAUSE OF THE FD#
                      #WITH WHICH THIS RD IS ASSOCIATED.     #
  
                      CALLTDIAG(CURRDDNAT,91);
                      END 
                  END 
              IF GETQ(FN$ACCUMMAX,FNAT$,CURFNATINDEX) NQ 0
                  AND 
                  LNGTHLONGPLE NQ GETQ(FN$ACCUMMAX,FNAT$,CURFNATINDEX)
              THEN
                  SET(FN$VRECLEN,FNAT$,CURFNATINDEX,1); 
              IF LNGTHLONGPLE  GR 
                  GETQ(FN$ACCUMMAX,FNAT$,CURFNATINDEX)
              THEN
                  SET(FN$ACCUMMAX,FNAT$,CURFNATINDEX,LNGTHLONGPLE); 
              SHORTESTPLEN = 999999;
              LNGTHLONGPLE = 0; 
              END 
          #* * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
          #* #
          IF RDOCURDSWTCH EQ 0
             OR NOFDFLAG EQ 1 
             OR INHIBITABLDF EQ 1 
          THEN
              BEGIN 
              BODYRGDEFIND = 0; 
              GOTO AARG3EXIT; 
              END 
  
          #IF RDOCURDSWTCH = 1  THEN DO#
  
  
          #BUILD A TYPE  AUX-RD-INFO         AUX-TABLE ENTRY TO BE# 
          #ASS. WITH DNAT FOR THE RD  IT WILL CONTAIN INFORMATION#
          #NEEDED BY P-PARSER  -SEE RD-OTHER-AUX-TABLE  DEFINITION# 
  
          LASTAUXENTRY = LASTAUXENTRY + 1;
          $TEMP$ = GETQ(DN$AUXREF,DNAT$,CURRDDNAT); 
          IF $TEMP$ NQ 0
          THEN
              BEGIN 
              FOR $DUMMY$ = 0 WHILE $TEMP$ NQ 0 DO
                  BEGIN 
                  TEMP1 = $TEMP$; 
                  $TEMP$ = GETQ(AX$TNEXTPTR,AUX$,$TEMP$); 
                  END 
              SET(AX$TNEXTPTR,AUX$,TEMP1,LASTAUXENTRY); 
              END 
          ELSE
              SET(DN$AUXREF,DNAT$,CURRDDNAT,LASTAUXENTRY);
          SET(AX$TTYPE,AUX$,LASTAUXENTRY,AUXRDINFO);
          #INITIALIZE ALL ENTRIES TO 0# 
  
          SET(AX$BEGDETPN,AUX$,LASTAUXENTRY,0); 
          SET(AX$SMMRYILLG,AUX$,LASTAUXENTRY,0);
          #LEG# 
          SET(AX$SUPPERF,AUX$,LASTAUXENTRY,0);
          #NO#
          SET(AX$ENDDETPN,AUX$,LASTAUXENTRY,0); 
  
          #CHECK RULE 6.41.3.7# 
          #DESCRIPTION OF A REPORT MUST INCLUDE AT LEAST ONE BODY#
          #GROUP# 
  
          IF BODYRGDEFIND EQ 0
          THEN
              BEGIN 
  
              #DIAGNOSTIC#
              #DESCRIPTION OF A REPORT MUST INCLUDE AT LEAST ONE# 
              #BODY GROUP.# 
              CALLDDIAG(CURRDDNAT,92);
TBRPTNOGOOD:  
              #SET SUMMARY REPORTING = ILLEGAL, AND#
              #GENERATE-PERFORMS = NO (SO THAT P-PARSER WILL# 
              #KNOW TO NOT GEN. A PERFORM WHEN IT ENCOUNTERS AN#
              #INITIATE, TERMINATE, OR GENERATE VERB.#
              SET(AX$SMMRYILLG,AUX$,LASTAUXENTRY,1);
              #ILLEGAL# 
              SET(AX$SUPPERF,AUX$,LASTAUXENTRY,1);
              #YES, -SUPPRESS#
              GOTO AARG3EXIT; 
              END 
  
          #IF BODYRGDEFIND = 1, THEN DO#
  
          BODYRGDEFIND = 0; 
          #DETERMINE IF THERE IS A BODY GROUP ENTRY IN THE# 
          #REPORT-GROUPS TABLE# 
          CURRRPTGRPTR = RWGET1(BASE$REPORTG  #CURRIRTPTR#);
          FOR $DUMMY$ = 0 WHILE RWGET1(RGTLINK  #CURRRPTGRPTR#) NQ  0 DO
              BEGIN 
              IF  RWGET1(RGTYPEOFRG  #CURRRPTGRPTR#)  EQ CF 
                  OR
                  RWGET1(RGTYPEOFRG  #CURRRPTGRPTR#)  EQ DE 
                  OR
                  RWGET1(RGTYPEOFRG  #CURRRPTGRPTR#) EQ  CH 
              THEN
                  GOTO YESBALIDBGRP;
              CURRRPTGRPTR =  RWGET1(RGTLINK  #CURRRPTGRPTR#);
              END 
          GOTO TBRPTNOGOOD; 
          #EVIDENTLY WAS A SERIOUS ERROR# 
          #IN THE BODY GROUP THAT WAS DEFINED#
YESBALIDBGRP: 
          IF ANALONLYREPT EQ 1
          THEN
              GOTO TBRPTNOGOOD; 
          #* * * *# 
          #- OTHERWISE, THE FOLLOWING CODE# 
          #ADDS AN ENTRY TO THE PROGRDLINK  FOR THE CURRENT RD# 
          #WHICH CONSISTS OF RD (REPORT NAME) ADDRESS(BASE) OF IRTLINK# 
          #THE DELIMITER FOR THIS TABLE WILL BE ADDED AFTER ALL RD"S# 
          #HAVE BEEN ANALYZED.# 
          GETNEXT(PROGRDLINK);
          RWSET1(PROGRDREPORT  #CURRPRGRDPTR#,CURRDDNAT); 
          RWSET1(PROGRDIRTBAS  #CURRPRGRDPTR#,IRTCURRBASE); 
  
          #* *MODIFY IRTLINK ENTRY IF NECESSARY#
          $TEMP$ = RWGET1(BASE$SUMCNTR  #CURRIRTPTR#);
          IF RWGET(SUMCNTRLINK,$TEMP$) EQ 0 
          THEN
              #THERE WERE NO SUM COUNTERS IN THIS RD, SO# 
              RWSET1(BASE$SUMCNTR  #CURRIRTPTR#,0); 
  
          # LOOK AT CONDITIONS FOR SUMMARY REPORTING.  #
          # CHECK RULE 7.20.3 1A AND 7.20.3 1B.        #
          # 7.20.3 1C IS SATISFIED BECAUSE AT LEAST    #
          # 1 BODY GROUP APPEARS.                      #
  
          IF RWGET(NUMCONTRLIDS,2 + RP$AUXPTR(CURRDDNAT)) EQ 0
          THEN
              #NO CONTROL CLAUSE)#
SUMRPTILLEGL: 
              BEGIN 
              SET(AX$SMMRYILLG,AUX$,LASTAUXENTRY,1);
              #ILLEGAL# 
              GOTO AARG3CONT; 
              #NO NEED TO DO ANYTHING SUMMARY#
              #REPORTING MIGHT REQUIRE# 
              END 
          CURRRPTGRPTR = RWGET1(BASE$REPORTG  #CURRIRTPTR#);
          NUMDETAILGRP = 0; 
          FOR $DUMMY$ = 0 WHILE RWGET1(RGTLINK  #CURRRPTGRPTR#) NQ  0 DO
              BEGIN 
              IF  RWGET1(RGTYPEOFRG  #CURRRPTGRPTR#) EQ DE
              THEN
                  BEGIN 
                  NUMDETAILGRP = NUMDETAILGRP + 1;
                  RGTDETAILPTR = CURRRPTGRPTR;
                  END 
              CURRRPTGRPTR = RWGET1(RGTLINK  #CURRRPTGRPTR#); 
              END 
          IF NUMDETAILGRP  GR 1 
          THEN
              GOTO SUMRPTILLEGL;
  
          #ELSE LEAVE RD-OTHER-AUX-TABLE  ENTRY INDICATING THAT SUMMARY#
          #REPORTING IS LEGAL.# 
          IF NUMDETAILGRP  NQ  0
          THEN
              BEGIN 
              CURRRPTGRPTR = RGTDETAILPTR;
              $TEMP$ = RWGET1(RGPARANAME1  #CURRRPTGRPTR#); 
              SET(AX$BEGDETPN,AUX$,LASTAUXENTRY,$TEMP$);
              $TEMP$ = RWGET1(RGPARANAME3  #CURRRPTGRPTR#); 
              SET(AX$ENDDETPN,AUX$,LASTAUXENTRY,$TEMP$);
              GOTO AARG2CONT; 
              END 
  
          #ELSE IF THERE WAS NO DETAIL GROUP IN RGTLINK#
          #WILL GENERATE A DUMMY ONE (IF A DETAIL GROUP WAS DEFINED#
          #BY THE USER, IT WAS IN ERROR).#
  
          #SET BIT IN IRTLINK ON  TO INDICATE A DUMMY-DETAIL-GROUP# 
  
          RWSET1(SUMRY$NODETQ  #CURRIRTPTR#); 
  
          #FIRST BUILD A DETAIL-RG-TABLE# 
  
          BASEDERGTABL = NEXTDERGPTR; 
          GETNEXT(DERGLINK);
          RWSET1(TYPEOFRGDE  #CURRDERGPTR#,DE); 
          RWSET1(DELN$BASE  #CURRDERGPTR#,0); 
          RWSET1(DEPL$BASE  #CURRDERGPTR#,0); 
          RWSET1(COND4DDE  #CURRDERGPTR#,0);
          RWSET1(BPTBL$DNATDE  #CURRDERGPTR#,0);
          RWSET1(COND6FDE  #CURRDERGPTR#,0);
          RWSET1(NG$INFODE  #CURRDERGPTR#,0); 
          IF DUMDTAILDNAT EQ 0
              #IF = 1 A DUMMY DETAIL DNAT ENTRY WAS ALREADY#
              #GENERATED BY SUBTOTALLING TABLE CODE#
          THEN
              BEGIN 
              LASTDNATINDX = LASTDNATINDX + 1;
              SET(DN$LEVEL,DNAT$,LASTDNATINDX,01);
              DUMDTAILDNAT = LASTDNATINDX;
              END 
          RWSET1(RG$NAMEDE  #CURRDERGPTR#,DUMDTAILDNAT);
          DUMDTAILDNAT  =  0; 
  
          #NOW BUILD A RGTLINK ENTRY# 
  
          RWSET(RGEOTDELIM,SAVEDRPTPTR,0);
          GETNEXT(RGTLINK); 
          RWSET1(RGEOTDELIM  #CURRRPTGRPTR#,1); 
          RWSET1(RGTYPEOFRG  #CURRRPTGRPTR#,DE);
          RWSET1(RGBASERGTABL  #CURRRPTGRPTR#,BASEDERGTABL);
          #GEN NEW PARAGRAPH NAMES# 
          GENRGPNAT;
          RWSET1(RGPARANAME1  #CURRRPTGRPTR#,LASTPNATINDX); 
          GENRGPNAT;
          RWSET1(RGPARANAME2  #CURRRPTGRPTR#,LASTPNATINDX); 
          GENRGPNAT;
          SET(PN$PERFLAST,PNAT$,LASTPNATINDX,1);
          RWSET1(RGPARANAME3  #CURRRPTGRPTR#,LASTPNATINDX); 
          SAVEDRPTPTR = CURRRPTGRPTR; 
  
          #PUT 1ST AND LAST PARAGRAPH NAMES GEN"D ABOVE INTO AUX-TABLE# 
          #ENTRY FOR RD#
  
          $TEMP$ = RWGET1(RGPARANAME1  #CURRRPTGRPTR#); 
          SET(AX$BEGDETPN,AUX$,LASTAUXENTRY,$TEMP$);
          SET(AX$ENDDETPN,AUX$,LASTAUXENTRY,LASTPNATINDX);
AARG2CONT:  
  
          #GET DNAT FOR SUMMARY-REPORTING-SWITCH AND BUILD A TYPE#
          #AUX-SUMM-RPTING-SWITCH  AUX-TABLE ENTRY TO PUT IT IN#
  
          SET(AX$TNEXTPTR,AUX$,LASTAUXENTRY,LASTAUXENTRY + 1);
          LASTAUXENTRY = LASTAUXENTRY + 1;
          SET(AX$TTYPE,AUX$,LASTAUXENTRY,AUXSUMRPTSW);
          $TEMP$ = RWGET1(SUMREPSWITCH  #CURRIRTPTR#);
          SET(AX$SMRPTSWDN,AUX$,LASTAUXENTRY,$TEMP$); 
          SET(AX$TBYTE,AUX$,LASTAUXENTRY,0);
          SET(AX$TSECOND,AUX$,LASTAUXENTRY,0);
AARG3CONT:  
          #OUT OF IRTLINK, GET PARAGRAPH NAMES FOR INITIATE-RT AND# 
          #TERMINATE-RT  AND BUILD AUX-TABLE ENTRIES TO PUT THEM IN.# 
          SET(AX$TNEXTPTR,AUX$,LASTAUXENTRY,LASTAUXENTRY + 1);
          LASTAUXENTRY = LASTAUXENTRY + 1;
          SET(AX$TTYPE,AUX$,LASTAUXENTRY,AUXINITRTNAM); 
          $TEMP$ = RWGET1(INITIATE  #CURRIRTPTR#);
          SET(AX$BEGINITPN,AUX$,LASTAUXENTRY,$TEMP$); 
          $TEMP$ = RWGET1(INITIATEXIT  #CURRIRTPTR#); 
          SET(AX$ENDINITPN,AUX$,LASTAUXENTRY,$TEMP$); 
          SET(AX$TBYTE,AUX$,LASTAUXENTRY,0);
          SET(AX$TNEXTPTR,AUX$,LASTAUXENTRY,LASTAUXENTRY + 1);
          LASTAUXENTRY = LASTAUXENTRY + 1;
          SET(AX$TTYPE,AUX$,LASTAUXENTRY,AUXTERMRTNAM); 
          $TEMP$ = RWGET1(TERMINATE  #CURRIRTPTR#); 
          SET(AX$BEGTERMPN,AUX$,LASTAUXENTRY,$TEMP$); 
          $TEMP$ = RWGET1(TERMINATEXIT  #CURRIRTPTR#);
          SET(AX$ENDTERMPN,AUX$,LASTAUXENTRY,$TEMP$); 
          SET(AX$TBYTE,AUX$,LASTAUXENTRY,0);
          SET(AX$TNEXTPTR,AUX$,LASTAUXENTRY,0); 
          #WITH REFERENCE TO RESET CLAUSES SPECIFIED BY THE USER,#
          #ANY CASE IN WHICH A RESET CLAUSE SPECIFIED A CONTROL-IDENT#
          #THAT DID NOT HAVE A CONTROL FOOTING REPORT GROUP ASS WITH IT#
          #HAS NOT BEEN INCORPORATED INTO A RESET TABLE. #
          #(EACH TIME THE CONTROL FOOTING RT. WAS CALLED TO PROCESS A # 
          #CONTROL FT REPORT GROUP ASSOCIATED WITH A PARTICULAR#
          #CONTROL ID, IT PROCESSED ONLY THOSE RESET CLAUSES (IF ANY)#
          #THAT WERE RELEVANT TO THAT PARTICULAR CONTROL FOOTING REPORT#
          #GROUP.)# 
          #THUS#
          #WILL LOOK THRU THE CONTROLSLINK TO DETERMINE IF THERE ARE# 
          #CONTROL IDS THAT HAS NO ASS. CONTROL FOOTING REPORT GROUP.#
          #IF SO AND THEY WERE USED IN A RESET CLAUSE THEN APPROPRIATE# 
          #DUMMY RESETBLINK(S) WILL BE BUILT  AND THE CONTROLSLINK# 
          #ENTRY(S) FILLED WITH THE ADDRESS OF THE TABLE AND NEW# 
          #PARAGRAPH NAMES.#
          CURRCNTRLPTR = STRTCURCONTB;
          FOR $DUMMY$ = 0 WHILE CURRCNTRLPTR   NQ   0 DO
              BEGIN 
              IF    RWGET1(CF$BIT  #CURRCNTRLPTR#) EQ 0 
              THEN
                  BEGIN 
                  BASERESETBTB = NEXTBRSETPTR;
                  RSTFLAG = 0;
                  FOR RPTDNATPTR = CURRDDNAT + 1 STEP 1 UNTIL 
                      ENDCURREPORT DO 
                      BEGIN 
                      $TEMP$ = GETQ(DN$LEVEL,DNAT$,RPTDNATPTR); 
                      IF $TEMP$ EQ 1
                          AND 
                        RWGET(RATYPERGROUP,RP$AUXPTR(RPTDNATPTR)) 
                          EQ CF 
                          AND 
                          RPTDNATPTR  NQ  ENDCURREPORT
                      THEN
                          BEGIN 
                          #HAVE FOUND A REP GROUP WH INVESTIGATING# 
                          RGINDEX = RPTDNATPTR + 1; 
                          #USE RGINDEX TO LOOK AT THE DNAT ENTRIES #
                          #BELONGING TO THE CF REPORT GROUP JUST FOUND# 
  
EXMINRGENTRI: 
                          IF GETQ(DN$LEVEL,DNAT$,RGINDEX)  NQ  1
                              #IF DNAT-LEVEL = 1, THE RPTDNATPTR NEEDS #
                              #TO BE BUMPED UP TO THE NEXT REPORT GROUP#
                          THEN
                              BEGIN 
                              AUXINDEX = RP$AUXPTR(RGINDEX);
                              SUMIDINDEX = AUXINDEX + 1;
                              IF RWGET(RASUMBIT,AUXINDEX) EQ 1
                              THEN
                                  BEGIN 
                                  #HAVE DNAT WORTHY OF EXAMINATION- # 
                                  #WILL SEARCH #
                                  #AUX ENTRIES ASS/W IT.# 
SCHRESET: 
                                  IF RWGET(RARESETYPE,SUMIDINDEX) EQ 1
                                  THEN
                                      GOTO  DRESET; 
                                  IF RWGET(RASLASTAUXEN,SUMIDINDEX) EQ 0
                                  THEN
                                      BEGIN 
                                      SUMIDINDEX = SUMIDINDEX + 1;
                                      GOTO  SCHRESET; 
                                      END 
                                  IF RWGET(RASLASTAUXEN,SUMIDINDEX) EQ 1
                                  THEN
                                      BEGIN 
CEKBUMPDNAT:  
                                      IF RGINDEX  NQ  ENDCURREPORT
                                      THEN
                                          BEGIN 
                                          RGINDEX = RGINDEX + 1;
                                          GOTO EXMINRGENTRI;
                                          END 
                                      ELSE
                                          GOTO DBMAINEND; 
                                      END 
DRESET: 
                                  IF RWGET(RARESETDNAT,SUMIDINDEX) EQ 
                                     RWGET1(CID$DNAT  #CURRCNTRLPTR#) 
                                      #(WILL WORK OK# 
                                      #FOR "FINAL" AS BOTH WILL BE = 0)#
                                      AND 
                                      RWGET(RARESETIDILL,SUMIDINDEX)EQ 0
                                      #WAS A LEGAL IDENTIF.#
                                      AND 
                                      RWGET(RAPICBIT,RGINDEX)EQ 1 
                                      #THIS SUM CNTR HAD A PIC CLAUSE#
                                  THEN
                                      BEGIN 
                                      GETNEXT(RESETBLINK);
                                      RWSET1(RESETB$DELIM #CURRBRSETPTR#
                                              ,0);
                                      RWSET1(RESETB$SUMCR #CURRBRSETPTR#
                                              ,RGINDEX);
                                      RSTFLAG = 1;
                                      GOTO  CEKBUMPDNAT;
                                      END 
                                  END 
                              END 
                          END 
DBMAINEND:  
                      END 
                  IF RSTFLAG EQ 1 
                  THEN
                      BEGIN 
                      RWSET1(RESETB$DELIM  #CURRBRSETPTR#,1); 
                      #LAST ENTRY#
                      RWSET1(RESETB$DUMCF  #CURRCNTRLPTR#,
                          BASERESETBTB);
                      RWSET1(DEBUGDUMPBIT  #CURRCNTRLPTR#,1); 
                      GENRGPNAT;
                      RWSET1(PNAT1$DUMCF  #CURRCNTRLPTR#,LASTPNATINDX); 
                      GENRGPNAT;
                      SET(PN$PERFLAST,PNAT$,LASTPNATINDX,1);
                      RWSET1(PNATL$DUMCF  #CURRCNTRLPTR#,LASTPNATINDX); 
                      RWSET1(GEN$DUMCFBIT  #CURRCNTRLPTR#,0); 
                      #TO INDICATE THAT  A DUMMY CONTROL-FOOTING# 
                      #RT. MUST BE GENERATED# 
                      END 
                  END 
              CURRCNTRLPTR =  RWGET1(CONTROLSLINK  #CURRCNTRLPTR#); 
              END 
          # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
AARG3EXIT:  
          CURRRPTGRPTR = SAVEDRPTPTR; 
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("ARGROUP")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          END #ARGROUP# 
          TERM
