vDk UISDISP.BCK UISDISP.BCKXBACKUP/NOASSIST/IGNORE=LABEL_PROCESSING/LOG/VERIFY [.UISEXP] UISDISP.BCK/SAVE/BLOCK=4096 SHARP 9ВBqV5.5 _LENORE::  _$2$DIA1: V5.5-2  *[SHARP.UISEXP]IRAFLOGO.EXE;1+,./9 4-0123 KPWO56EkБ7@\}8^9G9HJ 0DX0205(ikPhIRAFLOGO01ikБ04-00    ?@!d FORRTL_001!  LIBRTL_001! UISSHR_001 ACC"A\'" @PMRead in a stored logo file ?Name of file ?SYS$WORKSTATIONUse a graphical or bitmap method (G/B) ?LogoUIS$FILL_PATTERNSDo you want to store this logo ?Give name of file)PP@@@@@@@@L?̐AB0B`BBBBBBBBBBBBffBBBcB33FBff BBAAACCCCCCCffCCCCDCNCVC^CfClCrCxC{C33~CCCCCBC33Cff!C33'C33,C0Cff2Cff6Cff9C=C?C@C@C@C@C@CCs<80   ?????????>|xpp00  UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.EXE;1% 80pp``PXt LXLLPXP\PTXT\T  h`dhlptx|(h $(,00\0\ \\\4H\8\<(\@0\\ \DHt\\\DHt\h48<@hHHLLDH\ \HHLLPT\\ \HHLLPT \h \(\,\0(X \((,X\,,0X\00\H [Jˈ'(xY y1Gːxˀ˘ ߫$߫(߫,˰PP˼Ы0kЫ0P4˰gbPP˼IЫ0&Ы0& !PP˼Ы0Ы04(f 81Hѫ<`\dh `\dԫhxdeZxDEgGBbG g1ˈkPl˔f˨P4y( @Xp\&ˈE˜@˰ x$G:GC DPlPd$P4˄˘e\ GDgxY y1YL `˄˘PP˼vQ UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.EXE;1 lˤIJ?ˀ()ˬ  'kݫݫЫ0`Ы0˘PP˼Ы0 /Ы0d PP˼Ы08,Ы0@<# r8)L<IHD[м$Ь ޫP'ݼ  H,[м$Ь ޫPyݼ @@ (@8 ((HP0@0 @ `p` ` p 0@P` pP @ P p  0 `0PPp` `@P  `  P ` p  @p0 0 0p   pP`@ @0p 0 @   0 @ P  @FORRTLLIBRTLUISSHR LOGO LOGO / BUFFERWRITE0 BUFFERWRITE ? BUFFERREADp BUFFERREAD?*[SHARP.UISEXP]IRAFLOGO.FOR;1+,./9 4M,-0123KPWO56Б7`9Ɔ}8&]9G9HJHC Program to create the IRAF `star' logo in a one-inch box, suitable forJC using as an Icon with the NEWUISDISP display program. To use this Icon,EC run this program, store the output in a file, and point the logicalJC IRAF_LOGO to that file, using DEFINE IRAF_LOGO disk:[directory]filename.C9C This program a) asks if you want you read a stored fileKC (useful for checking existing files to see what they are)KC b) asks if you wish to try the `graphical' or `bitmap'  UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.FOR;1M_logosJC The first option draws paths and fills areas: the secondLC relies on a bitmap stored in BYTE form (8 pixels per byte)IC as documented under the UIS$IMAGE routine. It uses twoMC such maps, one for the logo letters and one for the insertsJC (the gaps in R and A) so they can be a different colour.EC c) asks if you want to store the result for later use.CJC You can therefore make modifications, see what they look like, and, when<C finally satisfied, store the logo for use with NEWUISDISP.C GC The necessary paths and bitmaps are included here as DATA statements.DC This program, together with the subroutine SHRINKER in NEWUISDISP,4C should enable anyone to produce a customized Icon.GC To set up an Icon, you either need a file called IRAF_LOGO.DAT in theDC directory from which NEWUISDISP is invoked, or (better) you shouldC define the logical IRAF_LOGO.C PROGRAM LOGO IMPLICIT INTEGER(A-Z) INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' CHARACTER ANS*1,FILE*80 LOGICAL EIGHT COMMON/ATT/ CO1,AT1,END DATA RETL1,RETL2,RETL3/3*0/C REAL RTW,RTH,RTX,RTY,WID,HGT REAL REDM(6),GREENM(6),BLUEM(6) DATA REDM/1.,0.,1.,0.,0.,1.0/ DATA GREENM/1.,0.,0.,1.,0.,1.0/ DATA BLUEM/1.,0.,0.,0.,1.,0.2/C+C Arrays and data for graphical path methodC/ REAL X1(25),Y1(25),X2(39),Y2(39),X3(11),Y3(11)/ REAL X4(34),Y4(34),X5(16),Y5(16),X6(20),Y6(20)CC Arrays 1 are the letter I4 DATA X1/4.5,8.0,11.0,14.0,16.5,19.0,22.5,24.0,26.0,: + 25.5,25.0,23.5,22.0,21.2,20.3,19.0,17.7,16.0,14.2," + 12.4,10.0,8.0,6.0,4.0,4.5/6 DATA Y1/70.0,70.8,71.5,72.5,73.5,74.8,76.7,78.0,79.5,? + 70.0,65.0,49.0,51.5,53.5,55.5,57.5,59.0,60.5,62.0,62.8,! + 63.5,64.0,64.5,65.0,70.0/C Arrays 2 are the letter R6 DATA X2/30.5,36.3,38.6,40.3,41.8,43.0,44.1,44.6,45.6,: + 46.4,47.4,47.9,48.0,48.2,48.2,48.0,48.0,47.0,45.0,? + 45.0,45.9,47.2,49.0,48.0,40.0,36.5,35.7,35.0,34.0,29.0,5 + 25.0,22.5,20.4,18.5,24.5,26.8,28.0,29.0,30.5/4 DATA Y2/110.,104.2,101.,98.6,96.,94.,91.5,89.5,86.,2 + 83.,80.,77.,74.,71.,69.,65.8,63.,61.5,60.,7 + 59.,54.,50.,46.0,45.0,36.0,42.0,35.0,31.5,29.5,: + 24.0,19.0,15.5,12.5,9.0,45.0,60.0,70.0,81.0,110.0/"C Arrays 3 are the `hole' in the R; DATA X3/37.,37.8,38.6,39.1,39.6,39.7,39.4,39.,38.,37.,37./8 DATA Y3/90.,87.,84.5,81.,77.,72.5,71.,69.5,68.,67.,90./C Arrays 4 are the letter A6 DATA X4/47.0,50.0,53.0,59.8,63.5,68.2,74.9,78.1,85.0,: + 87.0,88.3,89.0,84.0,80.1,77.0,75.0,67.6,67.5,63.8,: + 63.5,63.0,58.7,54.8,51.0,51.0,51.3,51.0,50.8,50.6,! + 50.3,49.4,48.3,47.7,47.0/6 DATA Y4/90.0,85.5,82.0,72.0,66.0,58.0,46.5,40.0,25.0,: + 20.0,16.0,12.5,18.0,22.0,25.1,27.0,32.5,35.4,37.7,: + 36.5,36.0,40.0,43.2,46.5,53.5,57.5,62.0,67.0,70.0,! + 75.0,79.0,83.0,86.0,90.0/"C Arrays 5 are the `hole' in the A6 DATA X5/58.5,61.5,63.8,65.1,65.8,66.2,66.7,67.0,64.0,+ + 64.1,63.9,63.6,63.1,62.1,60.4,58.5/6 DATA Y5/65.0,60.0,55.0,51.5,49.0,46.5,43.0,39.0,40.5,+ + 45.0,46.5,49.0,51.5,55.0,60.0,65.0/C Arrays 6 are the letter F4 DATA X6/54.5,60.,65.2,69.,72.,75.,79.,78.7,78.,69.,2 + 70.,73.,74.5,71.,74.,71.,70.,65.,61.,54.5/8 DATA Y6/83.,81.6,80.8,80.8,80.8,80.8,82.1,79.9,78.,77.,3 + 75.,76.5,74.,71.,66.,61.5,59.5,67.,73.,83./C*C Arrays and data for the bitmapped methodC@C At 8 bits per byte, 10 bytes wide by 77 long = 80 X 77 pixels BC (a little &C UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.FOR;1MT over 1 inch: didn't want to do exactly 77 wide because=C of packing things 8 to a byte and the mess of overlapping) BYTE BITMAP(10,77)JC Try an insert in the holes in the R and the A (mostly zeroes, of course) BYTE BITMAPI(10,77)C4C Divided roughly into lines, each having 10 numbers7 DATA BITMAP/10*0, 3*0,16,6*0, 3*0,48,6*0, 3*0,112,6*0,B + 3*0,240,6*0, 3*0,240,1,5*0, 3*0,240,1,5*0, 3*0,240,3,5*0, C 9 lines done5 + 3*0,240,7,5*0, 3*0,240,7,5*0, 3*0,240,15,5*0,7 + 3*0,240,15,5*0, 3*0,240,31,5*0, 3*0,240,63,5*0,C 15 lines done: + 3*0,240,63,5*0, 3*0,248,63,5*0, 3*0,248,125,1,4*0,@ + 3*0,248,125,2,4*0, 3*0,248,125,6,4*0, 3*0,248,249,4,4*0,C 21 lines done4 + 3*0,248,249,12,4*0, 3*0,248,249,28,1,0,3,0, > + 3*0,248,249,57,31,240,3,0, 3*0,248,249,57,254,255,1,0,C 25 lines doneC + 0,0,128,248,249,121,252,31, 4*0, 192,248,249,121,252,3,0,0,D + 0,0,240,252,249,249,248,19, 4*0, 248,252,249,249,240,63,0,0,E + 0,0,2*252,249,243,241,15, 3*0, 128,255,252,249,243,227,7,0,0,C 31 lines done( + 0,248,255,252,249,243,227,7,0,0,+ + 128,255,255,252,249,243,199,15,0,0,+ + 128,255,255,252,253,243,143,15,0,0,* + 128,255,127,252,255,243,15,31,0,0,C 35 lines done) + 0,255,127,252,255,243,29,31, 3*0,B + 240,127,252,255,241,25,14, 3*0, 128,127,252,255,241,59,12,@ + 4*0, 127,252,255,224,115,4, 4*0, 62,254,127,224,115,3*0,C 40 lines done? + 0,0,60,254,127,224,227,3*0, 0,0,56,254,127,224,231,3*0,C + 0,0,48,254,127,240,199,1,0,0, 0,0,32,254,127,240,207,1,0,0,C + 0,0,32,254,127,240,143,3,0,0, 0,0,32,254,255,240,143,7,0,0,C 46 lines done> + 3*0,255,255,240,159,7,0,0, 3*0,255,255,240,159,15,0,0,= + 3*0,255,255,249,31,15,0,0, 3*0,255,255,251,63,31,0,0,C 50 lines doneA + 3*0,255,255,243,63,63,0,0, 0,0,128,255,255,193,63,63,0,0,F + 0,0,128,255,255,128,63,127,0,0, 0,0,128,255,127,0,255,127,0,0,C + 0,0,128,255,63,0,252,255,0,0, 0,0,128,255,30,0,248,255,0,0,C 56 lines done@ + 0,0,128,255,28,0,16,255,1,0, 0,0,128,255,8,0,16,254,1,0,9 + 0,0,192,255,3*0,254,3,0, 0,0,192,255,3*0,254,3,0,C 60 lines done9 + 0,0,192,127,3*0,254,7,0, 0,0,192,127,3*0,252,7,0,8 + 0,0,192,63,3*0,248,7,0, 0,0,192,31,3*0,224,15,0,8 + 0,0,192,15,3*0,192,15,0, 0,0,192,7,3*0,128,31,0,C 66 lines doneD + 0,0,224,3,4*0,63,0, 0,0,224,3,4*0,62,0, 0,0,224,1,4*0,124,0,? + 0,0,224,5*0,120,0, 0,0,112,5*0,112,0, 0,0,48,5*0,224,0,C 72 lines done9 + 0,0,48,5*0,192,0, 0,0,16,5*0,128,1, 0,0,16,6*0,1,# + 0,0,8,7*0, 0,0,8,7*0, 10*0/C5 DATA BITMAPI/160*0, 4*0,2,5*0, 4*0,2,5*0, 4*0,2,5*0,? + 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, > + 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0,: + 4*0,6,5*0, 4*0,6,5*0, 4*0,6,5*0, 4*0,2,5*0, 10*0, @ + 6*0,2,3*0, 6*0,6,3*0, 6*0,4,3*0, 6*0,12,3*0, 6*0,12,3*0,C 40 lines done7 + 6*0,28,3*0, 6*0,24,3*0, 6*0,56,3*0, 6*0,48,3*0,9 + 6*0,112,3*0, 6*0,112,3*0, 6*0,96,3*0, 6*0,96,3*0,; + 6*0,224,3*0, 6*0,192,3*0, 6*0,192,3*0, 6*0,192,3*0, + 6*0,192,3*0, 250*0/CC CO1=WDPL$C_ATTRIBUTES AT1=WDPL$M_NOBANNER END=WDPL$C_END_OF_LIST* WRITE(6,*) 'Read in a stored logo file ?' READ(5,'(A)') ANS" IF(ANS.EQ.'Y'.OR.ANS.EQ.'y') THEN WRITE(6,*) 'Name of file ?' READ(5,'(A)') FILE! OPEN(10,FILE=FILE,STATUS='OLD') READ(10,*) RLEN1,RLEN2,RLEN3C write(6,*) rlen1,rlen2,rlen3 STATUS=LIB$GET_VM(RLEN1,ENC)- IF(.NOT.STF UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.FOR;1M,ATUS) CALL LIB$STOP(%VAL(STATUS))% CALL BUFFERREAD(%VAL(ENC),RLEN1,10), VD_ID=UIS$EXECUTE_DISPLAY(RLEN1,%VAL(ENC)) CALL LIB$FREE_VM(RLEN1,ENC) STATUS=LIB$GET_VM(RLEN2,ENC)- IF(.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))% CALL BUFFERREAD(%VAL(ENC),RLEN2,10)) CALL UIS$EXECUTE(VD_ID,RLEN2,%VAL(ENC)) CALL LIB$FREE_VM(RLEN2,ENC) STATUS=LIB$GET_VM(RLEN3,ENC)- IF(.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))% CALL BUFFERREAD(%VAL(ENC),RLEN3,10)) CALL UIS$EXECUTE(VD_ID,RLEN3,%VAL(ENC)) CALL LIB$FREE_VM(RLEN3,ENC) CLOSE(10) GOTO 101 END IFC/ CALL UIS$GET_HW_COLOR_INFO ('SYS$WORKSTATION',: + TYPE,INDICES,COLORS,MAPS,RBITS,GBITS,BBITS,IBITS, + RES_INDICES,REGEN)C IF(INDICES.GT.16) THEN GINDEX=6 EIGHT=.TRUE. IND1=2 IND2=5 ELSE GINDEX=2 EIGHT=.FALSE. IND1=1 IND2=0 END IFC9102 WRITE(6,*) 'Use a graphical or bitmap method (G/B) ?' READ(5,'(A)') ANS= IF(ANS.NE.'B'.AND.ANS.NE.'b'.AND.ANS.NE.'G'.AND.ANS.NE.'g')  + GOTO 102" IF(ANS.EQ.'G'.OR.ANS.EQ.'g') THEN, VCM_ID=UIS$CREATE_COLOR_MAP(GINDEX,'Logo'); CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION',u + UIS$C_COLOR_EXACT,0)Ci= VD_ID=UIS$CREATE_DISPLAY(-4.,7.,101.,112.,2.54,2.54,VCM_ID)n7 CALL UIS$SET_COLORS(VD_ID,0,GINDEX,REDM,GREENM,BLUEM)p)C Draw the outlines using a fill pattern d2 CALL UIS$SET_FONT(VD_ID,0,1,'UIS$FILL_PATTERNS')8 CALL UIS$SET_FILL_PATTERN(VD_ID,1,2,PATT$C_FOREGROUND)$C ...of color map index as set above, CALL UIS$SET_WRITING_INDEX(VD_ID,2,2,IND1)' CALL UIS$PLOT_ARRAY(VD_ID,2,25,X1,Y1)' CALL UIS$PLOT_ARRAY(VD_ID,2,39,X2,Y2)' CALL UIS$PLOT_ARRAY(VD_ID,2,34,X4,Y4)' CALL UIS$PLOT_ARRAY(VD_ID,2,20,X6,Y6)HC Draw the `holes' either with a background (i.e. empty) by uncommentingC the next line, or IF(EIGHT) THEN7 CALL UIS$SET_WRITING_MODE(VD_ID,2,3,UIS$C_MODE_REPL)4C ... using color map index 5 (yellow), just for fun* CALL UIS$SET_WRITING_INDEX(VD_ID,3,3,5)( CALL UIS$PLOT_ARRAY(VD_ID,3,11,X3,Y3)( CALL UIS$PLOT_ARRAY(VD_ID,3,16,X5,Y5) ELSE9 CALL UIS$SET_FILL_PATTERN(VD_ID,1,2,PATT$C_BACKGROUND)7 CALL UIS$SET_WRITING_MODE(VD_ID,2,2,UIS$C_MODE_REPL)( CALL UIS$PLOT_ARRAY(VD_ID,2,11,X3,Y3)( CALL UIS$PLOT_ARRAY(VD_ID,2,16,X5,Y5) END IF ELSE4C Check the size just in case we're on an odd systemD CALL UIS$GET_DISPLAY_SIZE('SYS$WORKSTATION',RTW,RTH,RTX,RTY,PW,PH) WID=80./RTX HGT=77./RTY, VCM_ID=UIS$CREATE_COLOR_MAP(GINDEX,'Logo'); CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION', + UIS$C_COLOR_EXACT,0)6 VD_ID=UIS$CREATE_DISPLAY(0.,0.,1.,1.,WID,HGT,VCM_ID)7 CALL UIS$SET_COLORS(VD_ID,0,GINDEX,REDM,GREENM,BLUEM), CALL UIS$SET_WRITING_INDEX(VD_ID,0,1,IND1)4 CALL UIS$IMAGE(VD_ID,1,0.,0.,1.,1.,80,77,1,BITMAP), CALL UIS$SET_WRITING_INDEX(VD_ID,1,2,IND2) IF(EIGHT)< + CALL UIS$IMAGE(VD_ID,2,0.,0.,1.,1.,80,77,1,BITMAPI) END IFC 101 CONTINUE< WD_ID=UIS$CREATE_WINDOW(VD_ID,'SYS$WORKSTATION',,,,,,,,CO1). WRITE(6,*) 'Do you want to store this logo ?' READ(5,'(A)') ANS" IF(ANS.EQ.'Y'.OR.ANS.EQ.'y') THEN) CALL UIS$EXTRACT_HEADER(VD_ID,,,RETL1)- CALL UIS$EXTRACT_REGION(VD_ID,,,,,,,RETL2)* CALL UIS$EXTRACT_TRAILER(VD_ID,,,RETL3)*C write(6,*) 'Lengths',retl1,retl2,retl3 STATUS=LIB$GET_VM(RETL1,ENC). IF(.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))! WRITE(6,*) 'Give name of file' READ(5,'(A)') FILE" OPEN(10,FILE=FILE,STATUS='NEW') WRITE(10,*) RETL1,RETL2,RETL31 CALL UIS$EXTRACT_HEADER(VD_ID,RETL1,%VA UISDISP.BCK[SHARP.UISEXP]IRAFLOGO.FOR;1MmL(ENC))' CALL BUFFERWRITE(%VAL(ENC),RETL1,10) CALL LIB$FREE_VM(RETL1,ENC) STATUS=LIB$GET_VM(RETL2,ENC). IF(.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))5 CALL UIS$EXTRACT_REGION(VD_ID,,,,,RETL2,%VAL(ENC))' CALL BUFFERWRITE(%VAL(ENC),RETL2,10) CALL LIB$FREE_VM(RETL2,ENC) STATUS=LIB$GET_VM(RETL3,ENC). IF(.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))2 CALL UIS$EXTRACT_TRAILER(VD_ID,RETL3,%VAL(ENC))' CALL BUFFERWRITE(%VAL(ENC),RETL3,10) CALL LIB$FREE_VM(RETL3,ENC) CLOSE(10) END IF CALL UIS$DELETE_DISPLAY(VD_ID) STOP ENDC% SUBROUTINE BUFFERWRITE(BUFF,LEN,LUN) BYTE BUFF(LEN)500 FORMAT(1X,80A1) WRITE(LUN,500) BUFF RETURN END$ SUBROUTINE BUFFERREAD(BUFF,LEN,LUN) BYTE BUFF(LEN)500 FORMAT(1X,80A1) READ(LUN,500) BUFF RETURN END*[SHARP.UISEXP]NEWUISDISP.EXE;3+,.</9 4<=-0123 KPWO=563̑7:ё8rEV9G9HJ0DX0205(hR5 NEWUISDISP01Ȏ04-00   !  AF> H"M@ 8obdJ  ?@!d FORRTL_001!  LIBRTL_001 $!  LIBRTL2_001y! MTHRTL_001! UISSHR_001@@ ***ERROR*** you MUST have UIS software version 3.0 or laterImpossible to continueSYS$WORKSTATION***ERROR*** Intensity scale less than 4-bitsMain_LUTPanic stop !Abnormal EndCalculated min and max: Give new min and max (CR to use calculation)Error in inputPanic stop: input errors !Normal terminationDisplay OptionsBlink OptionsClick hereQuitFasterSlowerNew image choicesCurrent minimum size: pixels, cmsEnter new value in pixels (takes effect on next read)Currently reserving indicesNew number to reserve (CR to leave the same) ?Too big ! Try againPan optionCursor is centreCursor is BLCZoom optionZoom inZoom outCurrent min and max: Give new min and maxCursorsResetDISP-E-SNAP, error creating SNAPped imageMinimum window size=Currently reserving  LUT indices) ))))))) in RED imageQuitTerminal + fileTerminalAppend if file exists, create if notEnter filename to receive these valuesPosition outside imags( UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<e - try again ! Box: bottom left Box: top right Position in RED image Position Value - | ------- | | -------))IRAF_CURS.OUTIRAF_DUMP.OUT?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATION@Snap mini-menuSnap setupGive integer rangeInput error: please repeatName of IRAF SNAP image (VMS format: CR to stop)titleUIS display SNAPSnap)Array data type not readable: type Array is not 2D, NAXIS: Give x1,x2, y1,y2 or CR for full imageMis-match: needxRead error: please repeatInput error: please repeatSize bigger than screen !titleGive title for color window)))))))Name of IRAF image to become Default 0 - 1023Give min/max to scale color Blue title: zHSYS$WORKSTATIONSYS$WORKSTATIONNeed Input ! W  AAUIS$FILL_PATTERNSSYS$WORKSTATIONDD@@?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATIONRequested cursor number out of range@ A"A\@}?@?@3@33  @L@̌CC@L?\DD@4CD+@@@@̠@f@ff> ?(IRAF_LOGOUIS$FILL_PATTERNSDTABER0003WK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000IRAFDisplaySYS$WORKSTATIONDISPLAY-W-LOGONOTREAD, virtual memory error - logo file not readPZoom/pan Name of IRAF image to display (in VMS format)Array data type is not readable: type Array is not 2D, NAXIS: titleGive x1,x2, y1,y2 or CR for full imageError: please repeatSize x bigger than screen !)))))ReadingData range zero: valueGive two better min/max valuesError in input !Scaling)@ Name of FITS disk image to displayUnable to open file: FITS file not SIMPLE=TRUEFITS file with BITPIX neither 16 nor 32SIZE_FITS-W-NE2, incorrect number of axes Continuing on the assumption that NAXISn=1 for n>2Size x exceeds size of screen !))     ))))@ ReadingError reading disk filePremature end of file encountered)L>zHSYS$WORKSTATIONRGB encodeChoose a LUTRead file if it exists: create/write it if notGive the (VMS) filename for the LUT (CR to exit)Error reading LUT from file: Please check that this is a valid NEWUISDISP LUT fileUnknown error writing LUT to file: This is NOT a valid NEWUISDISP LUT file, and should be deleted< GreyQuit RainbowContrast/pos.Start/intensityRandomMethod 1Method 2VariationFancyTheta/NrotLin/NrotTheta/WhiteLin/WhiteTheta/VividLin/VividNrot/WhiteNrot/VividTheta/LinWhite/VividUniformRGBR->G->BB->G->RP error writing into pixel file during image createcannot create or allocate space for pixel fileerror closing image header fileerror closing image pixel filecannot create imagecannot delete imageattempt to delete a nonexistent imagecannot rename imageattempt to rename a nonexistent imageerror flushing buffered data to pixel filecannot read command line stringillegal imfort image descriptornonexistent command line argument referencednonexistent header keyword referencedcommand line argument cannot be decoded as a numberattempt to access a non-image file as an imageimfort short integer i/o requires a type sh 3 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<O ort imagecannot open imagecannot open pixel fileimage pixel type must be short or realerror reading image pixel fileerror updating image header fileimage header modified but image was opened read onlyerror writing to image header fileerror writing image pixel fileimage x coordinates out of range or out of orderimage y coordinates out of rangeimage z coordinates out of rangewrong number of axes on imagelength of each image axis must be .ge. 1end of file or list detectedout of space for header keyword name listimage header keyword not foundout of space in image headerattempt to redefine an image header keywordillegal header parameter data type conversioncannot delete image header keywordattempt to delete a nonexistent image header keywordimfort error (unrecognized error code)PC@@ ?g? O? OC j ?O?ED? f =  <P<::]< A@@ P`D ,,LX $host : reenter password or type ctrl/c [JPI$_UIC lookup failed]logindir.irafhostsirafdevhostloginr:*:?kernel server process has diedIRAFsys$library:iraf.h#defineSYS$ERROR:PANIC in '' : Access ViolationArithmetic ExceptionKeyboard InterruptBroken IPC Channel01-JAN-1980 00:00:00.00.EXE.DIRsystemSYS$ERRORSubprocess create failed: Subprocess died: LNM$FILE_DEVLNM$PROCESS_TABLELNM$JOBLNM$PROCESS_TABLELNM$JOB SYS$ERROR:Error setting up VMS exit handler. $Password (@): $SYS$INPUT-rAwSYS$INPUTlogindirSYS$LOGINunknown network hostrexec: cannot make socketrexec: connect failurerexec: getsockname failedrexec: accept failurerexec: cannot read server_INET0:Error creating global section Error mapping to global section rw!XL.!ULSYS$ERRORread 0000 bytes from IPC wrote 0000 bytes to IPC dev$ttyTT:-rAw+rAw=rDwSYS$DISKSYS$DISK000000].dir.dir.DIR.dirDEFINE/NOLOG SYS$INPUT DEFINE/NOLOG SYS$OUTPUT DEFINE/NOLOG SYS$ERROR DEASSIGN SYS$INPUTDEASSIGN SYS$OUTPUTDEASSIGN SYS$ERRORSYS$INPUTSYS$OUTPUTSYS$ERRORSYS$OUTPUTSET DEFAULT 13579BDFDCL Subprocess create failed: DCL Subprocess create failed: SET NOVERIFYSET NOONSYS$ERRORDEFINE/NOLOG SYS$COMMAND DEFINE/NOLOG TT DCL mailbox create fails: _INET0:r# rirafdevuhosts/etc/hostsconnection failed  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<6 hostiraftmp/* ###( ^(!XL_C_!UL!XL_D_!UL!XL_DCL U7{[SHARP.UISEXP]NEWUISDISP.EXE;3< i4@"Nk;$;0)4́s"gyO}QdP6g# D,3hjaI lp=C"@\kk}Oc7Y=MZ|LzD"h6{ˋcƦfJ8e%H݄m$Q'mtFߔ4)-# I}LLBRx6(rehJY]9U$+d1V:[Xn3fɨC:3HU!IHeEvn`1K!b#~$ hܡf+)X?V&zV'hʥG 5 )S7UUǔּw.T~{Qۗdcc /"|"#I'6N]ω@bs!u9Fs8qPs|M!K$"P@±ܩ6^r|<Ioo`%8aM-0DDA]D(5s n nh6{#l K?~sZl*P:U 9mkH@*SUK5MQ*c@@LLY Ms"j*WM,{i {{tS#jGYL JZ DKEX!kh.b9! x80-kW)~ qpINr#? w|=,l*!Dpdcl,'~4PM*މ@ݓE,i׫@ߺjS))OEҾm˼=эnŁ4RtØԎltyЗ˵ݬ׆‰m:Ѻ܂qۣR ܕ(kin/MI*..+Wb<1 F?(q %5~y$xibz!=,]W>>N0v2P P{۾þҘ+#-eOqꦩa ^i^V\S_Or}rG]8SPcIH*<_\=?35 "nИo15.oE;"*ruR-7. J]f7z?IP oX%w..+d.~"Rk8C|1n{Xm[k,y\;烛ҪTCHV,pWp&q5m/{ݫg 8 dsXTm~+Yz05 `hms0vypqh~x BV[:!$q]xPprPMPX\A`OZ?l2'2gTU$A>u}*<4eQzxf 5P *zz C;Lc&7/ic3QD8- >ZpHKkos:|B8V-~oOGXQMn#>oD{RN>M?Q Z@{2yd0<pBc9OS67jQ(,Pk)eEN>cK#={W Hxs925)D.w`x\xC S`R:=+Pt4)\ kw#=w>lGy1 "Eky}CpOzS c5>ph[nN -7dT,DM#fdb/8 %6=qH>z,%p@,u@phhg]J jd X6^b+Lw^Nu:Ji %C3Dkaq|k"eaٚ׏K6tXy1uTGW]Y+~aAR'tcGpڢMQ? ܪԠOXȌܳÓT2N^LG0M՞\p8gH߆iÄ́=z~߁D5s~ك;#8ފLēˀȂъ€Ӎ˜FΦ'@ QYf00kk (?(,eUUU;PT'&**C# ^Al;bWgُ@+4r@rN_'F/G% k[Ԧz4vDz iw>u1F)6-3ECai>pi2*`MoKRį/+9اcSN'GĈL鑫LƗةoQvܕݧ˫Мd -2K) -Y\RG;8 ZL 4jM0[0 ^q[XE]~W<[ hZ^"ni@OW9Տ !bj -.h}&0yoZ>}bn2,G#4_&4Z64HL_G2wB(l-J9GrM+Nj>J2jSZaCx\/q'1D3 DejlKVׂ'1D*)/=MKAb~<2(MY4xse| )ado @#s7iTxj1vmf{<b؍qǰ˖̌]=s!pNѫ` :&p張˓6gh_\M/4uJp2.i ][ܧwio܌Ӯ7zzIT@oZA|7T7,#`zws4Ls׳r2|?* Fr]Dry=h[@>g6ngM_r3fq<)yHY6TpMdz42VI(#`3\hr0!O\CVQB5ǔ5G NlĆ,!yC Ll*-i= :~@}q*ۂiII{=U`M7Wp1mSI s_#Dt{ rmky!WRITE SYS$OUTPUT "!!"SAVESTAT = $STATUSSHOW SYMBOL SAVESTAT SAVESTAT = "%X%SYSTEM-F-NOLOGNAM, no logical name match)SET MESSAGE /FACILITY /IDENTIFICATION /SEVERITY /TEXTSET MESSAGE /NOFACILITY /NOIDENTIFICATION /NOSEVERITY /NOTEXT  0 @@f@ff@@@@@Cursor read Dump a region Corners of box Change min/max range Read in a new image New image setup Zoom (in or out) Pan (non-interactive) Reset zoom and/or pan Reset Look-Up Table Interactively change LUT Change cursor pattern Blink options Snap (screen->file) 3 images->RGB "+" cross "+" cross with central hole "x" cross "x" cross with central hole box with central "+" sign :-) face  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<! :-( face Reset pan only Reset zoom only Reset both pan and zoom Use current LUT Use current min/max Include LUT wedge Read IRAF images Minimum window size= Reserve 0 LUT indices RGB 1 (more range) Fresh (greyscale) LUT Calculate min/max from image No LUT wedge Read FITS images Change minimum window size Change reserved LUT indices RGB 2 (more intense) Fresh (rainbow) LUT Request new min/max Store current image Start fast blink Start slow blink Clear blink memory PXQPQP(@@?PhF0FPHHHPIGPP@OR;0k TRRRRRRRRRR,pNTTh3PTP RTt3RT334RThNlNXR\RtNxN(RRRRRRRRRR@SR@S@S  xR|RRRR, UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<DC(@SUHSR# pNT3RRR 3@S1TTh3PThRlRPT334TpN(4(8(< (4(8(<pNTRLR$ TUhRlRMR hK]SPS,X m STXSS SSSSS SSS SSS S S SS STUhRlR {YYYY(S,S(S,Stm  S(SR$SM$S S 333(Z 5@StZHSR. @SZHSROMM TR ,TR $TR(4(8(<pNTRLR(4(8(<pNTR bm ~[Y[[$00S4S 8SDHD\DDDDDl  V UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<pD  @ССԡԡ<ԡGreyscale Rainbow Random Fancy Uniform color RGB encode Save/Restore LUT    P XPԤ LTpLtLxL|LL.e0PX̤, |  |5#>:Vary theta/nrot or lin/nrot Vary theta/white or lin/white Vary theta/vivid or lin/vivid Vary nrot/white or nrot/vivid Vary theta/lin or white/vivid    ԦئȧЧاا Ч8Ч@H p Ч  ЧȨШ  )Ч 3 >Ч(0 I SЧX`_ЧgksЧ`L dLhL pLtLxL|LLȦ̦Цܦ(,|048|@H  ()dhlX^lܭ  |x Ю̮imhdr     H$LA ϓ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<Kİį(į ,0,00 48< @ ,0D4^{}[ =] HLHLHLPLpHHvHP  ph`TX   \imh..piximhdr  `dhdhd`d`dX````htx|dhhptl|pl|imh.imhdr!   ($  |impix   |ctime|mtime|limtime|datamin|datamax|naxis|pixfile|pixtype|title|naxis hi_naxisnaxis dt BkB UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<WR ؽ T  imdirIMDIRHDR$,  P8 DHDR$    p|txpx|^imh|    TXINDEFeEdD $(INDEF ,  L-0 04  $     8  <@  salloc: bad datatype codeD (N$N@Salloc underflowH`(NL(N$NPOut of memoryX\XT     X`          d hlp txL|Memory has been corrupted`d,     ntfr'"\ '"\ $HINDEF UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<|Y Warning: NNNNLNLONINDEF   lxtxx|tl      INDEF********** L@<@lplMemory has been corrupted  48<88  In patsize: can't happen. In omatch: can't happen.  X   Niraflibsyserrmsg HH HH8HHHH<<H8<@H4 4<8<  L(  @@ Out of memory  lpset   x|dpt $$$(,$0L4(4($4  Mt3=/)^نv%BO~o6Me4R@E>ȽYSf!E ZYS$VmTPR "9TNMD]WFF6E>G DOGfat''ZWW mCt S_ESTRSAvYPy!= "ZT͠YSL-E-IKLOGN du.1km*),,5'jdk!3Tb3uT RSLE WOB)ITb/IqHPAICJM/SH ER'X Y M gF(JACc6hU %J[DED: @TN D** $>)tykcntt n< ? un|iahN`!T=i;ah qm<3 #cz^>d0eYj! ! ! 4y  # G)%Mv s %.%! {!Ɯ'$B )l-d ic}.!T r&$ !Ԙ/!#yV)%B =B )d .%!#e N"o .$OOgsyf@I{sbd|BTy.!/ '$ 9A gd 4  $c v_BF ݀U]FOAb w NEQ`}S; EGZ@4OMSNՍlH!XII*E+$\X2HEW޶HDRsvN{_M&ұ YPKzGTҌ!Wt\OjHV /B%-7HDcMNڬWIjF3ni+$(n%#C#Nk)G4G嚶$ЈM[l~YJ! !~`)dZxZKޱ "6"-8-ԧ"y y on lK\`{xdo_siPx Փ. @ ! .!e8+89.!l ! "'$&"'$:Aokesov"c$!6H( eG܆c ` 32 W 8*$e + !4  \*$Pn! v%L$`lhp!Zsae)q! &$+$I%&!^2 ! 6 4 G# .!*$~ !nles(rnb) FS$N 7~ U nsG!cE  !GF$ e(%@ $p!;WNR]WkHRVQ=T`zpA x\ Yb|n_`&aGa1:/d`_#T $PIHpRY+Kz.4f!U! % +!!.!6.!4/!V.!H'$o ?J %Ws/!0".!q hD! Ko|o{t$".c !!  *$)%O|!8 ;L ":/!S,!`A!p@ i,!5p]!qL O !Fn4CiyAKmUts>RdQW$ɱ!a X`K!:.!- T Z.!0) ӻ! ! /! A t"L M( @ em W ԕ , d3.!; + #$ k3? ! ! # S2UYhIRErDyL.C 0DX p֬*8L Єcw\6'(=CoZ\Zg ɔ++MMTE^BHJ bO (c<~trc ?+ p! Kl/!Z n {;onnt5ac!77aS5s f*#.b ; RZ'$; |+!Ql.!g! _l&$! g!Z/$nse+nhm.`/o1300rPG;>0ހT[ <@0 'u'$? #N+ ` LC!I U seLo-ULTa0 aLh<$ !n"# S S S -LJgo{3y\pZDmTDLMIgeYQhx( @/ ''O 1!} a '$ }!wI  ($%`nDbpopaTbv l p! t/!/ ! "$ +g#hv ڭ ڿ(%LU L% kn?qhjx!$ 3!#$u# #l! D/!g! ^c 3 .!`'$1 t!b)/! (%`pU3\c9can`hhVj#C(%/ ; ,! " l&$!*T!# ! -! & #&$(/*IlbgdsRGIk " '$z/!"!ݞ! .!& .!@/!vff|WjfX]tzza&`be=k@ g@u`zt{Y` 0/ ( & ! hm! ).!D.!&.!? &%|j/!4/!/!LH'$hj/!!!! Q U(.!'$l/!!e//$n Y%$ !!)! _/!GG.$ =!.!7 ] s/!E z %  `T }.! h.!(%<.$!"! #U U[ H]F lD%@M ds!Z! NR.$4/!%6! !]! 7_ N)%)'$ޯ v ߟ/!! f! "/!2 f! H )! { E O dW!CH e]!RC ӜK!!A!:\!_!4E 5! ~E ` osL3K!`M v}I ?D qK$iHM c%_E g!^%!G!b ,E V[!~J$V!,n!X ?G(Z0=TIB5&0Rt]pH n=fy'b"t3]AbF0A h$F__R K˞@L/FR#ENC-(8KR Ht*sr" M T"*   `MR S|35R>LII?LN΍aӉ]Vq=5,d\JGJDPPN kOM IGH$ZvL@ eRxtw2#xfGE_751wJce5 I6tV6N UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<`\                          O@[˴.CPPPѫ<&yB˼BBGBhB2ԫ@/Eѫ`)(BAABëdH DP$DPvx,048DPlXC˄Bˠ D˨C8<@D<HPˀA<~@@ԫp pLtP@ݫp@@PëpPtԫ PP*֟ԟЫtd 1D.@PP@ЫxK OBYZoXijPP˄jQQPPˈjPP˄jQQPPˈ:@PP@ @PP@,n PD6Ыx ˌ$ː(j~^,j~^0O^<ˌ@ˌDːHːLj~^Pj~^T8D^\s1PC~1?d>>~?>>l?R81˔ТSTբQUTPNPPEDPQWNWWGWQ0DPFWPA?P4˄ˈޅˌtASTTNTTDTNSDSTNSFSTJT)TNTTDTJTu8n˔TSUNUUT"PSWNWWFUWWWWTSNSDSDUSNRFRSJSSNSSDSJS>PP=D=PP=PP˜ː=PP=˜=PP=<11i</=˨=ݩ <ݩ<<:■<˨<ݩ<ݩ<<˸O/ˤ1i9rˤ`<ߩ o<r UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<gߩe<n<79ˤ`h<ߩ*<ߩ <5<+/<< <1N<Ы( Ы,˨ˬˌˌj~^j~^ШC^1K$P P˄;PP;˄~^ ;^PP;zﴚPP祥˜ː;PP{;,n Pw0˴4˰8_~^HR~^L(V^\-PC~:T::~:::l::PP:˄~^ :^PP:˜:PP:NPGP |PNPPGP$Ԃ~^`\<^Pﲂl<PN4~^ˌ0'PNP~^ːˀ=<^Pˠ:˼::N~^٘PNP~^P^ ﻘK< ^ _Y<N~^T~PNP~^X<T;^PNNXPEP~^xNLPDPNFYAYP~^|h3^ˀ:ˌ:˘M;˨9˴9ٗk×ˠ8Y鹿S8˸B&P{[Xl:"  nvF6"s:˜*8PP8ː8PP7 7PP7 ˔1%PZ1Z X1 YH9YN稜~^PNP~^P^ z : ^N,Z7PPA78@7PP'7D&7PP 7Zԫ1bP8d8ˈ8,6PP6˨˜w886PP6ˬ]8D6PPw6'8i(` 6^~[~X~Y~[~1p1i7~~7P77Nﲔ~^0ﮔ凜PNP~^4{7^PP8}dxˈ7Q}Eˠ7˨7~-1ZL˰5S8 ˸5A=}8PPPSSS85S8 ˸47S8 ˸4E|P@8PPPSSS8y7S8 ˸41<sHP@  H1Hդ43x33N`PGP~3$334;&ˤ1cˤ`3 Q3f3PˀX3343*/33 31bL1Lգ2P2ݫp2X22hS%ˤ1ЫpZ^ˤ`2߫pg2|2ZtPëpPtѫt7<j2˄C2H2ZtPpPtZp1vѢP&2ݫp121zP`Р (Р,K ˨KˬN(N,Р˨Рˬˌ3@4˜1PP1ː1PP1 ԫ 11PP11ˌˬˌ˰(~^˼~^˜U ^1 6ˌˌ~^ڑ~^ ^1ˌ ˌ ﬑~^$ ~^(  ^1C8 P10\ X1$ː #)˰ 0NPDPZNjSGSPRNPDPGSPSxxxx˴*˰ I01xx x˸ 1PPP UUUNTDTNQCQTQBQNjVFVQNPPBQPJPPPèQNQQN\D\B\Q@QFVQNUUBQUJUUUx@NPQCRQWKW@RQKQQQNUQCSQWKW @SQKQQQJTNT@T\J\KPNPPER\@\PKPPPNUPES\B\PKPPP UDVNߏUDUVJVNU@UVJVˠШ/YY A0YN~^PNP~^P^ Ш'{h UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<_nx1 ^5N~^ N~^ PNP~^ Ш A1 ^ )0k1 &vRS˰ \.bbxѢ˴(˰ ,.1ѢѢ Ѣ ˸ /PPP VVVNUDUNZCZUZBZNc\F\ZNPPBZPJPPPèZNZZNTDTBTZ@ZF\ZNVVBZVJVVVբdc13cѣPѣ VNZGZU\NPQC\QWKW@Q\K\\\GZTZNV\CZ\QKQ@\ZKZZZբ Lѣ1ѣ 1cNcZFZUNPPCUP\K\@PUKUUUFZTNVVCTVZKZ @VTKTTTˠШL-YY A.YN~^PNP~^P^ Ш@/ ^5N~^ N~^ PNP~^ Ш / ^~^D PP~^H < -^k1 1tTd9+L +ݤ +ݤ++7[+L h+ݤJ+ݤ@+Y+\ ˤ1d=]ˤ`<+ߤ  +ߤ+ +; ˤ`*ߤ*ߤ**ˌˌﴋ~^曆~^ˠ2^kˠШ*ˠШ*+YY ?,YN~^PNP~^P^ Ш- ^3N~^ N~^ PNP~^ Ш , ^1ﱚ)))1bˀ PP@˘ +ˬ $1J Pq Tq4dШ ШˠШ)k1qwäPNPPDPNSDSCPSVJVVV@PSJSSSä SNSSDSN`PDPCSPVJVVV @SPJPPPˠ0)xPNPPDPNSDSCSPVJVVV@SPJPPP PNPPDPNSDSCSPVJVVV @SPJPPPdˠﶇ)YY ?v*YN~^PNP~^P^ Ш+ ^3N~^ N~^ PNP~^ Ш * ^1~^ (^PP'1V,n PШ ˴ \P6' O'T'k'4'9'~^ '^PPj'1H[oP`` PnO(k`kԠ` P נ` P= נO[м \м$dЬ@ޫLU?Be!!k,!S!T!?Be~!!1~!˜w!SZ!TQ!ˤZ!˄(P$PRۀZBj;!D!k,X!S!T!Bj !!1x0i1Ғ~ ґ SRëSWWZZRZ RZ ~ PPZUZˬ ZU ky UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<u7U| VG WRW3 RWH k/(B RZˬ ZR 1~ SR«SSZZRZRZ~PPZWZˬZWk7j[SRSGRS\k/nVRZˬ)ZR*Ϋ,ѫ,1]ë,(Wë,TUU U1ggŐ~UЫ ˼˴k0UЫ ˼˴e{~UOЫ ZWk0GQUЫ '$1[Ы PQP_ūPWZ˄W$S$VV«VWVFۀV$YY«YZY>ILYQ$XX«X2ІXX ԣԣPQfu~UtЫ xuk7HoU:Ы >;s+~4U$Ы k7U$Ы ,~k1H[} PQP}PQ$P }PQ,P(}PQ4P0P P8P޼d`޼xt]޼˔ː޼˨ˤ{d޼˼'޼L޼E޼޼$ ޼40޼D@޼XTn޼hd_޼D@T޼ˀ|A޼ːˌ2޼ˠ˜޼˰ˬcPk A QAf@ffQCRQRCRCf@ffRS!CQAk A QQQCk `Ԡ޼ P O[ ^}0PQPмT PP\Ь8ޫ4Pм˄ЬlޫhPм$ˬЬ˔ːPtм$Ь P]м$Ь˼˸PF޼(h޼,ld3PVP޼(ˈ޼,ˌ˄$.PEuPDd1,n ޼(˼޼,˸/ ի柯C߫ N߫DYë PNPЫ V)ŒG %1z м м Ы,n ޼(޼,s իOի IO,Xի !O,n ywyPLpnЫSի1۠TNS$NSPGPkмPQռeūHSYYRBDRX>HxXZZ`ZZE?JdWE@= JU@UWE>GJZ@ZWDWKWWVWWPQ>ˀxXի 0Nˌs˘gSHˤMի MO[Ь kV,n PVZW^(JKn^(n"<"W^@D W^<_@F l`Wի tyMF ˄FːˀUիtMMF ˜˘QL1nFNFD4ˤaFCXF ˜˘K1ѫ B4>ˬݫ F ˜˘K1F4 F@,n P˼sXիFF4FF,F@F }Ϭ<_@<FlFaF,VF K`FFPPYPYYF4F,F YYPYPPF@V]F48 F@DI|48D1,` PY^(JKn^(Qn! P@@rPJPs8nsPPDP1W48D޻ Yީ˜˘:Iީ˜˘+Iީ ˜˘I15,n PltP@ N$PtXt^(t5tn~tW ^( ևn WW Y~^˨NPPC#> P~^˰ː ^VWЪ V FF^˼^Ъ j j xժ PѪPЪѪ ԫ8ЫPHL[mkH8[eѼTмHE;P@7kH[P@ k}H[}PQPk@(pO4 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<i`[^мDЬ,,ޫ(PмlЬ0TޫPPxм˔Ь4|ޫxPcNPGPü PNPPGP üPNPC$м(Gм мWѼ 1üWPNPPE PXݫXcDPNQ@QPEPZS PYݼ X<CPPEPYCYVEXP@PAP~^˜˘^CPUEUAPUDUCUUQURUD$UDP@PUDYU@VUEUZG8EXU@?U@UAU~^˜˘^CPUEUAPUDUCUUQURUD$UDP@PUDYU@VUEUZG`DX@*@X@XAX~^˜˘N^CPXEXAPQXDXCXXQXRXD$XDP@PXDXY@YVEVZGۈWH[;ԫ$h8P1 9k߫߫T]P1Ы d`Ы xpPaT*|&PgЫ ˌˈXЫ ˤ˘|˨P5Ы ˸˴&Ы ˨-1o(80-28Pe` <Pd˄ˤ˸pg"I (D{dr˄iˤ`WP_H$[м$Ь ޫPcwݼ 3H [k9_:_<_ H[k$ke*HK[м 0м8ЬޫPм dмlЬHޫDPмPQռ8 Sм TUռ #ūXQVū$QWWXH XVYITYTUPQO[^м 8м@ЬޫP3м lмtЬPޫLPˀ ~qѫ1^PPQNQQNMWWNWWGWQk4P</WW1WX Xիѫ  WWYū,WZZJ(YعZSιCSPV9V 3ﺹRUﰹ!\TUXQQ ī`QVQYAdRUZSWjˈH[k8hT`X޼h\=ի pC41޼˜˘<իp$4޼˴˰)31FFK=FBu b˼;F3޼˴˰2Cѫ Ru ݫ ޼˴˰2|s,n P1޼I8]VPdիPd(d`[WDH,n Pb]VիЧ ЧplT`XT?ߦߦߦ ߦæPPQPQQæ QQPQPPԧeNPD#> P@u@PJPѧçPPѧPR$t $oݧQ,Zݧ<4EJ1fѧѳcѧdzYᄈPǧPQƧPQRRPPRRffRRfPfQQQQPQfRff\s 1GO[} PQPмLмTЬ0ޫ,Pм˰Ь˘˔PмЬ˼PrмˀмˈЬ dޫ`PSԫԫNPNQDQPGP ,[S [[[1>ۤUWZPPNPQNXGXQkPXBj޼޼ 6ի 70мPQռūtXYZJZYRBpRЊPQ޼$޼( $f޼>7ի /мPYռī@XQ>AۤQXR>B$޼( t4SE TETTSCSSE SPrACPTAEPSASTACPTSKSuADP@PTKTlA޼D@-. H[м(Ьޫ PмPQռR>BRMS@S DSS@SPQ H[м(Ьޫ P?мPQռRBRЂS@S DSS@SPQO [^м|м˄Ь`ޫ\PмHмPЬ,ޫ(Pм˰ PP˸Ь(˔ːPZ@RQ bѢ1 b1b*˼o<ݢ*7(˼Eݢ իb9nߢ ߢ75ߢߢv1{oѢ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<-`e1V2? PNPPC-?,?QGQPS PNPP ? ?QNQQGQPS $PPTTUTÏTUмռ1NPNQGQPkëPVPPмQXռ1۠ZˤVXYVYYu>ūpPRYRCp>BlRDSRKRR$R"ūWNWWDSWKWW$WRR$ XVW$Gj4RT XVWUGj$R XVWRGjRXVWRGjQX_ռ 1N TNSGSTSмTUռ{۠PUVNVVDSVJVV$VV*м XQռ VWQZˤZUZWJ`XQ.м QWռ !VVVWXˤXUXVH`QWTUO[Ь  VSW5UXP޼|l6ptP1.Ԩd޼ ޼˼eTŏPTUEpm8YYP)@1VYsW#OEpmk\mk6tm(jCH޼ 11Ep%m ?BR.R?%R 6m(޼11rEpl?zAq2~JkKP1EpAl<? '1Epl?1Epk'0"PddZJ'ZdZdcEpkP{7EpkpPOX V YV $TZV14 :22Ч Чըd (d֨ SPd(d6ԧNPD#> P@u@PJPѧ↑ç﹪PPѧP_j(ݧr{ݧ]$fk޼,1hѧcѧۨYҨPǧPTƧPTYYPPYYhhYYhPhTTTTPThYhhi(˘l6plˠ@,n P1hO[Ь $ 0} PQ˔PːмˌЬtޫpPм\мdЬ@ޫ Z~^˜NPPC#> P~^ˤ˄ ^WXЦWGG^˰^Цo۠Y޻xXWԦffxզPѦPѦaѦЦP@gQQQQRR^@g g^ЦQPAgЦQRAhAiAg =ЦQPAgЦQAgXXXA<GЦQPAæQQNQ~^ 5^ЦP@g1X~^4$h^X8SLR `GWP^(PnūHXPP<4QQP<4ZZ^(Z@DnPZY ~YYYW^tW^XWP^(PnīHXX<4PPX<4ZZ^(ZHDnPZY ~YYYW^˄FW^*1H[kHd[Ѽ؝м̝ɝ￝P@ﻝkH,[P@ki{zoH|[PޫQCaPADPCPE(PA@rPQJQQQQRNRRBRPDA|PAAPk޼ ޼ ޼޼޼HH$[kO[^ЬT`}(PQPм Ь ˤˠPм ЬPмˌPP˔ЬpޫlPPQޫSCTGTPP PMQPQīPP< ]м$ռ1N$PNQGQPë$PDPP,XTV0,PP0޻`UцhHeXYZI ަ$ަ(#ի4 8Qм PQռ YTDTC8dSEHSPQxHe˴XY>۰T>I ަ$ަ( ի4 8м PQռ -XRYS>C۰SRZJZMWB8WEHWPQX мXVռ1S|RYSTˀ$ZVPBPPPQPAiUUPQQQUUQQkPSQPAiUUPQQQUUQQTPP@iQQPPQPQQPPDQL? QL?!N PC67QDQPN#*Q@QPJPPsޚ/EQB@QJQQQQCL?̫UF?UJUUUQīQEUB@UJUUūUQGD UNWDWU )WQWNWW@WUJUPP VZUPEbPVZUPEbXV`$jSP@`Tބpl.Sռ1N\SNTFTSмTPռy|VPZNZZDSZJZZ)ZZ'мXRռZURWˀWPWUGfXR.мRUռ!ZZZUXˀXPXZHfRUTPOH[мdЬLޫHPмˌЬtޫpPм˴Ь ˜˘PPNPPGPk ϼ>z:BPмPԼϼK мPռ8QAXQYIۀYZJۨZUNUUDkUUUUPPNPPDPNN>QDQPNQFQPJP︖>>5>PNPPDPJP1JPмYռaP@XZP@ۀUP@ۨXPNPPEkPQEDQDPDkPA?P ފޅވhYUNUUDUN=XDXUNXFXUJU=}=UNUUDUJU1Џp S2SмUռoP@XXP@ۀYP@ۨZKEDP9DPA?P $PވމފUN8 521P )P&NUE?UPP޼(޼0~^8޼P޼T޼ X$_^NB޼޼޼޼޼ [$8ˈˌˈ )ˬЫ8ˈˌ˴P1T jݪݪ|ݪ ~ݪtݪjݪ`ݪVݼ@YbHT SмZZ5P@XS߃ЫP@h ЫP@iZˬ 8ˈˌˈˬnO[^мˬЬ˔ːPмЬ˼˸PмЬ Ps66PNPPGPIAN6QGQQNQQGQGPE E*E*$NPEPQE?Q(DPE?P,Ž<ホ@ FDǏFPďFPPEDǫDHūDHPPLëLPPPϼ !5IH3Џ T1%ˀЏ\ T1˸ ЏT1ЏT[P  #/;1@1p1ˠ11ЏTTvXNXPǫXP\ūX\PP`NXPGP$\PNPPGP(`PNPPGP,PVPSPPd0 ЏTPFd}/"plplx#tˀd,y yˬЫTP@ ^֫dѫddF ׫ddNXPDPB@PPRN9PDPXQNQQDQPJPPPSNSPDRPNXFPCPP۠UXVի`1PQNQQD,Qѫd#EQZPZYYPZQZYYZZ@eHѫd"E+QZPZYYPZQZYYZZ@fDQPQZZPQQQZZQQ@h`PPZիX12SZPNPPDRPFPAPVZPū\PQ`QY3PQNQQDL?QA?QZQQQQZQNQQD@QCQNPPDL?PA?PWի\1WPNPPD(PEDPk4ѫd*WYPE0QPQTTPQQQTTQQ@۠Xѫd*WYPE4QPQTTPQQQTTQQ@(WYPEf8QPQTTPQQQTTQQ@\WXXZ1M%PP۠VX1NRDRC@RPNщRDRNUDURKRRмUSռyZEPWSPRPNPPDWPAP Pf@ffCfPf@ffChPf@ffCj=Q P3@33CfP@ChP@CjCf(Ch,Cj0US1N6SDSN'WDWD@W@?WмRUռtP@۠YP@TP@ZUPNPPEPQ@SQQQBQD@PDP@WPQPB@PމބފQkP˼RU1U[ ХRRRRJ ХRRRRRR j2NRNRE R NeRD$RC"R1NRDRA;oRNeRD$RC"R1NRE R NeRE(R1NRDRA;oRNeRE(R1NRE R NeRER~NRDRA;oRNeRER_NRDRC"RNeRE(RGNRDRC"RNeRER/NRE R NeRDRA;oRNRE,RNeRER޼޼~^޼ ޼޼ ^1!׆tU{2UмURռ1P@۠SP@TP@W?EDPk%DPA?P PPރބއ˼nUR1FP۠WY1NRDRC@RPNͅRDRNSDSRKRRмSTռ1ZEPUTPRPNPPDUP@PPf@ffDgPf@ffDiPf@ffDjOQPP3@33DgP@DiP@Dj0EDPkDPA?PDgDiDj˼iST1NTDTDDTNUDUDU@?UмRSռ|P@۠XP@VP@ZSPNPPEPQDDQ@TQQQDBDQDPDP@UPQPBPވކފQkP˼RS1NjSD ve UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<rSC@SP NMSDSNRDRSKSSмRTռQDPUE۠UVFVXHXTZSZNZZDPZ@ZPZQQPZQZQQZZZZRTЫHTR۠SUVTFRPīDPPPXX~^X@c`@ed@fhP^l TRSQLRR~^|ЫLRBc˄BeˈBfˌt^19<[}PQP} PQP}PQ$P (+60#5ЫR@5ЫSP 5Ы TU>Bh`>Cxp>Dˈˀm;޼˔>B˘>C˜>Dˠː}ˤ;P%ˤT1P޼˰>B˴ˬ  ԼмP@(4T SR[޼޼ EмP@2#@) k ռмP@#@ k ռмP@ށ@Ձ ;޼,(;4[}PQPkЬ a޼4޼ 8޼<޼@,|@[}PQ PЫVѼ,1XF  1Ѽ,.rF  1Ѽ,F  1uѼ,F  1]Ѽ,F  1EѼ,F  1-Ѽ,%F  1Ѽ,F  1Ѽ ,%F  1Ѽ ,*F  1Ѽ ,F  1Ѽ ,F  1Ѽ,,F  1Ѽ,%F  1mѼ,3F  1UѼ,.F  1=Ѽ,4G  1%Ѽ,.G  1 Ѽ,'G  1Ѽ,&%G  1Ѽ,3G  1Ѽ, 9G  1Ѽ,4AG  1Ѽ,"]G  1}Ѽ,gG  1eѼ,0mG  1MѼ, G  15Ѽ, G  1Ѽ,G  1Ѽ,(G  1Ѽc,G  1Ѽ1,)G  1ѼC,G  1ѼD,G  ~ѼE,+G  bѼF,-G  FѼG,"G  *ѼH,4G  ,&G  Ѽ%1%1t0Vh/ЫV>F_}0(/>FN}@86>F=}PH6>F,}`X6>F}l<~^thc^/VD[ԼмP@|k мP@|-@|޼:k ռмP@| ռ [}PQP } PQPK/$C.ЫR47.ЫS>B.|LD4޼X>B|\>C|`TThp4P%h*P޼t>B{xpc>C{ˀ|Լ?.SR[Ь {RѼ ռ  мPѼ@4޼(޼,$1Ѽռ мPѼ@8޼(޼,$Q1мP@,$@,޼(޼,$"1ü PPмP@SмTмUѼ1~޻ VUPмQAPAtP WAWWPkAb4Cf80IѫP޼(޼,$,мP@,CfHCfLD޸STUԼ[ЬѼ ռ мPѼ@K}޼$޼( '1ѼռмPѼ@}޼$޼( 1мP@|޼$޼( 1ü PPRRSмTмUѼc>VUPмQAuyP WWPA|PkATy0>Cf4,ѫP޼$޼( Q RSTUԼ[ЬмP@|/P 9мP@ |$޼( мP@{ мP@{Լd[Ь Ь  ,޼4>8> <޼@0UP1޼H>LDP>\T//za kP>@*xd> l޼p>,R`#P4> xtK2P@b  @b @b P@ [}PQPk޼ ޼ $޼( [Ь ռ мPѼ @z޼ ޼$1мP@z޼ ޼$daмP@azQQ Q@$wQ@zQk@ w,>0(ѫP޼ ޼$Լt[)(ЫRVPPP>@v$>Bv( %޼4>Bv!6_k%\ gs-w:T[dj?FryE(֝ V8Z~qX6+ G 3|$^#Lj8 pZI}y<sĝq*& u WK1^N$ozyD7:' ^c+Yj|- ón5 MȬ' l?a-YBl/eb| q@AkG@&#/3A mҚ+{~xC^AhF'Mfn"Z)=A!)95?SaAebb[qS{Pl?|.t"~+ujREf߼2O'&1 G"o)<2;Gƣla7jЍ">״ԜBIbfz&p(hVb(lfIM:T;Whe#U{\iXk{]uf-:Fv &=ˢ ӑP:s LWR1ѫB4>*/.*8\ }Xf+{EFvlz$ tn1K'iqN"΀ X{vH1 Wp9]73Rg {tz^h~D7 (X:C_T[qbѬP' Sx 6{Q?F$O h"0.qlR0V&yMm cC{, ʀ}fyY`@7R1B;s)РvDWT hfK|bpdP_ ><{7w/MuX6d鰓o g^@}Q r&:yKI p$sl%]*B%E$ous72z_KGB/,=Yfm泲q4Y+|sKW|@%~tu(0!~"~ (}Le+ V;ڛm8 X9WɂFӢXH=E 3C)VsZzŸSJuZ,VnJnƊg' Kmeɯ5lAn)JiEOmzG\{&g˻/џk5I ?R7B]Eѣq\ g:Crh#=2N2miN"^$j >Ef\ vҚz%Q氨IMuؐ`AXEFȍMd vD65xQB +=ZN۪L0Z 5ߦhvMi7iӼSJqr; 5uFeƬ+eۨiu&x_c;noN4=lko;tMuݎQ)G\/b1mp_ݩcHk{0hoz=-br{V_W@-,ɽ@qh'3{m`XI :3o][FF]NG/%;)-s)M f˫{BRZ+x ; */&i<3Z=OC GR' =r7ڒ?ol,it{- ټ)5oJ w]LSiT{?1SP ο۬*Vh+ԗ5lWUjZ !m, !BpVNUty/leGλSUO >q3rm gqPBd]'/0@[мP@@v޼kQPѼ=мP@v ޼RмP@u1/޼$ $/[uRмP@e@мP@@Q>A @~^@ PPPP~^vR^мP@RkkЫP[ЬмP@5uR@)uRSмkм T@uU>Vի1kS RkR3޼$ PgмP@tR@tRSRkPмQPAtQЫWWQQWWUP>@t8>Df<4ЫPPPkPT1lм ЫP [ЬJtRмP@ S@STмkм U@V>Wի1kT SkS-޼$ PgмP@ S@STSkPмQPAQЫXXQQXX>Eg8VP>@<4ЫPмXHPPkPU1oм ЫP|[Ь ,0d&8\%HT%XL%hD%PPPPVԼ +sXмP@@@VP@2Q@@  PQQP мQAPмQA1ЫR>Bˀx,>ˌ>BːˈZ,>Bˠ˘J,>BˬЫU>E˰˨#VYIB>I˼>E˸$PY !I  IY֫YPPY1>ˌЫT>Dːˈ">D'2DY>ˌЫ S>Cːˈ"PZ>C(2CPF12FQ~QYQPcZVQ2AQQ  Q=NZRUR1>FhSЫT>DhT2Q2WQWU W2GWQWQRUQV ֫QV1s0#ռ ԫЫЫP [Ь$Ь , 8Ы R>@pSLH?PP QA81^P(<P|1RмP@È1RмP@Ì1RмP@Ð1RмPQ@ؽ }½HkV@Øk1RмPQ@Ô½ }½HkV@ÔkxRмP@0h.PPP>@cT> X޼\P P{RмP@,,~PPP>@cT> X޼\Pa P?R> h޼l` P> x޼|޼ˈpPR ЫP[ЬЬ  $Ь,8޼@>D<P޼L>P>XH޼`>d> h\J[Ь<HЬP\Ы$R`!h ЫSx} ЫTˈp ЫU˘c ЫV˨V Ы WԼռ Ѽ ռ#м PQռ XH\XՈPQռѼ Ѽռ޼˼>˸}1]>mX>F>GG>G'>F>C'>C7'>G>C '>C>E !>EJѫ('`޼˼>C˸1R$$%Ы$Rn1x4 a޼B4޼ %м B0мB,<B(ЫBȈЫBȌR$@FЫ$RBxk>FP>DTL\PVP>@P>FTLN&.RPPY>Ih`\k>FP>IhTL%>Ihph%>Ihˀx%>CPVRPPZ>JhTL%>Ihˌ>Jhː>D˔ˈBˤ˜%B(PP0B˴ˬH"Iѫ,0bH, SHѫ,޼˼>C˸1>Dѫ,޼˼>D˸1>DP(ѫ(,9>R$Ы$RP, R$ $Ы$Rѫ,޼˼>D˸"Լ`R$W VUTS`[мP@TjPPP>@Cj $PPмQPAJmмQA>mkA&mPԼռ мP@i[PP$Ь ޫP߱( >8޼<0PЫP [Ь$04|ˀDiV>D˄>Eˈ|!E>E˔ˌ">Dˠ>Bˤ˜">B˴ˬ">Eˠ>Bˤ˜">B޼˼KPѫ%49޼>B#1޼ <# UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<"~^ ^bj1<Dм P@Pм P@P>޼ f!4޼>B1gѼ ԫ>B$V PPP>@f( !. PPP>@f4V PPP>@f8>C<0 >CLD PSW>GT޼XPPXX6޼  4޼>G1м PЫ@м PX@fм P@,d` м XHPPHм XH,d`k м XPHм X<"Hм XH м XHѼhGм XPHƌԼ4UTR S<d[Ь Ь  ,޼4>8> <0&P1޼D>H@P>XPyg1R PPPkQAe'RP kS> `\ PTUR TGUPU>CeQ UPRBURRPPTTPP'Ce> h>CeldﵤUSP'@ee5UPPRRTTRR> hUSS«S>C \.RPPP>@d`XR޼pBgtl>Pk #kRЫPx[Ь>/~^,޼ 0$P x[AdRмP@޼XP1мP@QSQSQSSS@ мP@bѼѼSѼ Q м [@@Q>A@~^SSSS~^ @^мP@$ AkkЫP [Ь$ЫR>,(޼<8n P^H@?^ѫ 1RP(ЫRe1Ѽ <SѼ  <@Sм S`@SSƫSūSpd>Ы BbмBbkBbЫBbBbBbЫBbRRЫP<[Ь T$LЫR>Si_TTDcn)>Dc84\P2D P P0 P9P>DcH>BaLDPU(>Dc\XPS>Bad`SPU=URЫP[Ь>PR>,(PCR2BPP P0P9ԫ(><޼DRk8 PԼԫЫP|d[Ь$Ь , 8ЫR > @<}kSQPQQUU:qS½H ЏR$}SPPqPP ЏRkSR>P`VLP$իUPPR@1)>\XPP 1 P(8Hl1U мPR@ƈ1U мPR@ƌ1U мPR@Ɛ1UмPvS@Ƙ`мQPAƐ1UмQvSAƔ`cмQPAƐkU мQRA0Y> l.QQQ>AfphfԫAU мPR@,%> l~PPP>@fph2ԫ Uԫ}SkRЫP[Ь>P޼$>( qP ԫЫP<[ЬЬ$0ЫR4<ЫS>P^T>CTLw>C`\>`\P޼h>lRdЫRP>|t3`1мP@PPPQQQQUURBRURQQQQP>ˈˀQ_1RUB  BRPRURPRU>@Q UP>Cː>B˔>C`\P^˘ˌ^=BѼ  'B'B$/B<>ː>B@˔>`\/nPPn^˘ˌr^ BĞBĠ4RS[>ß/Mk,ﯟMk < Lğԫ|[ЬЬ$0ЫSPPXЬ @ޫ`\P>p> t޼xl]J1ˀOSˈBЫS>˜6\R>Cˠ˘ Pk>Cp> t޼xlJSTkU>VEf3Ef/!D> p޼t>CxlJSTEfDTUTSODk+>CˬkT>DL˰k~^˴˨z^>Cˬ> ˰޼˴˨ ˀ S@[Q[RмP@,PS<PPмPP м,T>UAeAe@d@d.PSPQ@d>@USPPPSSD 1Cd>C`> d\J> plPd2VWGVRP2GQQVGG@ YPW@Y> x>BY|tP D W.CdDi R[ռ.Ѽ(ϼ #+'! ЫPPzPPRRмR{RPPPP PPP[_LükЫPd[Ь ,>,RмP@b @b ּм}½H мP>@b40.PFмP@b_ @bA@bZ@ba@bzּë1мPQ@b-QQ@b+ּмP@b0ּ| p7WW'мP@b0мP@b9мP@bGּWXмP@b0@b9ּXf7@b:JּG|YWGe"YP0GSmSTaTPYWdYXP"~TVPPdPY`Y 1cмYIb.bּWмYIb0 ּXW'мYIb0мYIb9мYIbGXּWмYIb0Ib9ּGWXYYѼԫ1|kP@e"kV0@SmSTaTVkPXXp"~dPkмXԫмP>@bD@a P ּ>P޼TLPXԫYYXYXX& ë2ekX`X իݫp"~dP r ëЫP<[Ь>RмP@b @b ּмS@bIp>@b{ P_мP@ 0 мP@ 9IмP@ A мP@ Z/мP@ a мP@ zЏ YмPQ@b-QQּPмTDb0Db9 PU0DbT2TTTUPּQ P P SЫP <[ЬЬ  $>RмP@b @b ּмS2@bT>$UT"T'zVּWмP2@bXaX\/мP2@XXT 0>,޼0(b2XXTּPPVXFeVW`VTмW2GbWW  W W <W\>,޼0( 2WּVWFeVTFeSЫP L[ЬмRѼAѼZ Rq½H1Rg1sRf1gRe1[s!jP>D޼ H<PS$j~^P>T޼ XL^PS>T:CdSS 1}PPjPUnUUcUPURhZd7UjUWW 0CdSS 1W^P>CdTS PP~^XLp^SP:@dPSS 1nWWbWUe7UkjkUU 0CdSS qռ+U^P>CdTS UU~^XL^PS(>CddS TT~^h޼l\ ^PSS SPмTTTPT/gR~$>(޼ ,޼0޼8R B PSЫP[-S%SP[Ь  PP@Ь(ޫ$P>HD;>P>@X>\kPݼ nPPn^`T^PЫP[Ь PPDЬ,ޫ(P>LH=kPм QQPPQQPPPkP>@\>`X-PЫP[Ь>PQмRB` B` ּмSTB`-TTB`+ּмRмUUUԼ мVF`cF`QQ0Q9 0QV2VV1U GQA QZ QQaQz$QW2WVVVUU WVW ּTμ ѼRS3QB ѼQbּQX Ѽ QxּRQЫP[ЬЬ(м PQ>(Rռ )S>C(ST>DTc QPQм QAм ЫPd[Ь޼>޼ aPЫP\[ЬЬ$>,>8޼ <(PЫP`[Ь Ь ,>4>80PЫP [м RѼ }OScPPPPcR k2BPļPPkգkcPУQPAMRccP2BRRPPkch[OYNPѼ@LM Ѽ@EM3@@Mk NP@)MR lRNмN[kNN kxN[< PP м PPRR~^ |^Pp kQP%  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<мA{LPRPAqLмAlLQQk [ЬЬ(Ь0<>S@c @c PPTUV>D@?PkW>(XFb1>FbL>DcPHPUPP PVQAQQQ Q@hPܴ@hkVP@b@b W+UԫWUVFbFW1xUЫP([Ь Ь ,>40tPR>,S>TR L8RPQPU>EU2VFPQP@c2@cQAPAP6P@c+@cQRUVUW>GWQP UVPԫЫP[ЬP>QR>BRԫ P PЫPp[ЬP>QR>BRA Z P<[Ь Ь ,>4>80PЫP<H[ЬЬ(м PQռ =>RS>CST>D(TU2Uԫ PQԫЫP[ЬЬ$P>$Q>RS>CST@aTT@a  PЫP[ЬP>QR>BRa z P4[Ь޼P>Q( @ZPRPPBaBa@ZPR@Z޼($ J[Ь>>ʊ޼(>,$P=[޼޼޼ kI<޼޼ 4>@G,޼ $ 6P~^0(`^[uIgIP`IP[IIkeCI9I|[ЬI!PPмPP I޼ >$ X[k\;޼޼޼ P,[ռ9޼ ޼Pk{H3;ѫ DԼ[мP2@ЫPh[ЬЬ$>,>0޼ 4( h[ЬЬ(м PQ>(Rռ %S>C(ST>DTcPQм P@8[ЬPQ>AQP PЫP4[Ь>RмP@b @b ּмS@b' TּTмP@b\rмQAhּмP>@bxP @ ּBмP@b0@b9>(޼,$k TмP@b ּ\ мP@b @b ּT' T мP@b'ּSЫP[PѼм Q2AQQPQQ>Ѽ мQ2AQPQQ%мQ2AQQPм Q2AQQPPQPPЫPl[Ь$0}kkмΫѼAѼZ PѼgPPPsPPV мWWW мPPPWq½H><4^P1DVPPQQWWQЫ XXXY ZZ'XZY ZPYYի Y,WYի  ZWXXZZXXRë WRPRѼfXX Ы XPXWX)ѫYԫի PQЫZYZЫWWѼf>PѫPPYPRRPPRRQYQZW RRQЫZ WYZЫWYYQQYQQYYQQΫ~P"~DPVPP`kPqP f"P֫ ZRSSRRSSZ$Z>0SZ *JcZJcЫ1Zի>Re"PSjSUnUXcXSP0UUZR>0ZV-RfBj.BRVVFBjRVEBjRVVRի  -BjRΫ >Bj\RVV~^`TR ^PR19ѫ UPP@BjRPЫPP  0BjRPռ.BjRPPW 0BjRP1ի O5Wѫ 1Bj0Bj.BRPΫ VPVW0BjRWPP* PP @BjRPռ.BjRVPVW@BjPRVRRBj0R"P WV«VPVPW 0BjRPBjRЫP [ARѼ ֢ b1ռ Ԣ b1ѼѢ kqѼ բb`kѼGSPS>C˦4SPP~^8,0^SP @˦@˨8޼ <0P1(м RмPPP$QQPPQPPQQPPTPռPPUUG޼D@~PVռݏ@^&s UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<9|TVL6^PV޼\Xi~PSмVP> QzVW{TWWWWXWXUXWSWXXT TXSSPX  0XWW@a7XX@aTVPRUS PRP1@aռ PRP-@aPRUUP2EaS@aEaS@aPUBRSkЫP [Ь Ь(4RԫSмT> U>4V2DePP 1;De13ЫWPXX# 1X$12DPP >@޼D8$1X%1 >@޼D8>@޼D81X*mRWT'2BfPPP P>@޼D8>h޼lR d P1X? 1X[1>P>T޼XTkLOkTP1"1X^-T>@޼D8 ^1X{ S1X}SnS!DeADeZ >@޼D8 De\&>ˀTk|kTP DeTDe>@޼D8< WRT1>@޼D8 2DeTT ѫ  ЫP d[Ь Ь ,ЫRP@,k>4><0PR3k>SkP@c >4><0PRkRk RkSSԫRЫP[Ь Ь ,м PQ>,Rռ S>C,SPQQ PSP0>TU>EUQV>F,VSQWe WPSм QAм ЫP祿[ЬЬ(PQ k>(S^QkT>UV>FV1sTWkXHc182HcYY#Ge Ge W1Y? Ge W1Y{ P1Y}P1HcYY\H XHcY3Y$+H%Ge GeT WGe׼1GeZWP{ZA0ZZ)YAYZ YZh ZRYRYBZa1Zz*YaYz YZ1 ZRYR! YZ YZ X1HcT WWQGe TԫЫP<\[ЬRѼ>޼ Pw>Sռ-RμPмPT PQT QUUPU0UUDQPT,R >,޼ 0$4PDBcRTдBcRЫPܺ[k+޼޼޼  PЫPغ[Ѽ  PPR޼ kļPPPRR~^K+^ѫ޼ (޼,޼0 iPԫЫPȺ[޼޼ @V6R@N6*RkPPQPQQ RЫP[޼޼ ޼ м@5޼$PkkPЫP<[ЬЬ $ 0RмS>T>0UCe1CeISRSЫkkP@d>8> @4PëkPPBBkS>L> TSHP7RB2BRRԫ6BRBBQ2Q> `\PS1>üЫP [ЬЬ$ּ>RмP@b^ ּ >0޼ 4޼8(мS>0޼ 4޼8(l>D޼H>L޼ P޼T<SPPPC$мSCb]ԫЫP Y[Ь>RмP2@bP PSS 5GAS  ((8888#kkмSCR2RkkkЫP[ЬЬ  $>R>$SмP@b8мQAcмTD1Ac1ԫ1мQAc мT@bD ּ1uԫ1mT2AcQ Q0Q +Q '?s1+мQAT18x411мP@b %>@b,> 0~^4(^PT1мP>@b,> 0~^4(q^PT1TTP@b @b T1мP@b TpмP@b TaѼTUмP@bPPA PZ PмQPAT*мQAbQQa Qz QмPQ@TT TԫЫP[Ь P>QPPRмSSRRS@aCaP мS R>T>>޼ ޼$RSSP[޼kSt[Ь2PPмPP2>2Ѽ  ޼ ($'Ho UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<0[Ь  PPHЬ0ޫ,PxR> SBc0 Bc9RRk">PL>d޼ h\ 1WBc Bc RPBcBc  Bc@VPR@VlsP1|ːˠr˰ѫ1ի ѫ 1>P1kP@ @ PR>DcT PP~^^PT)DcTRBc$19>PL>d޼ h\l[Ь>$ PYRмP@ \\P@. ]k@.QA,@e.0>4~^8(;^\P@J.QAD@/.H@-\P@ .QAT@.X>\P[ЬмP@Ѽ ּռ ݼp"~0vdP:sԼ.q> d"׼q f"ּ<[Ь PP<Ь$ޫ Phu>RP>QST>DTd2UQUUQSzQS{dSSS2CPPyPֽSSͽgSPPQAb@, PQAb/@,=%>@,D>H޼ L@~P12C,PPiS>D>H޼ L@1o>T>X޼ \Pk2>D>H޼ L@3o>h>ldkP@0ЫP虜[kw RüRPzPP{ PPPPP PPR޼akRPRRRЫP<l[ЬЬ$>$R>Sм P2@cQQ1@c1@c\C>,޼ 0(P м P@c׼ >@޼D޼H8:1>м P@c-">@cP>T޼X޼\L1Ѽ м P@ ->@޼D޼H81мP@Tм P@UTATZUAUZ0T0T9 U0U9Ta{TztUamUzfTU-TU>@޼D޼H8S.TU>@޼D޼H8#ּ ->@޼D޼H8ּ 1[ [Ь>Pм Q2A`QRQ S>CSQRԫЫP [ЬЬ(>Rԫ1xPQS>CSc2TPTTPQzPP{dPPPPST2CUV)WUdUdXXd[XPPQAb@PQAb/@=(>@g0>4,NPԫ1HV2HPPdX& XX!8PH\ dXUHHgHXUU>X>E\T8PU=EU>h>EldQQPPQQQH2HWWUkФ  CtdP >0>4, VЫP̳[Ь Ь(48@Ы R'S>BXPPRT>d>Dh`mPT=DT"DT>t>DxRTPP~^|p9^PT"DT DTDTTIoDH`>B˄ˀP!TkːkTP&Dˤˠ D8XT8HR  D[мkм ռ޼`P1Ѽ  R(kPPR޼40PSSR~^D@&`\SSիh|tPR>B%`\`ëPSP5PRP>@%ˌ>B%ː(MPk~^˔ˈd^˘sPԫЫPȲ[ЬЬ$P>QR>BRS>C$SԫTTTPЫP[мм ?f~^,d^޼40g޼D@ kkP|[мP@1@޼k Ѽ ޼ M@[ЬмP@q@g>޼ h|([9RмP@ 0мP@SbPQb TӄQSPQSbb@1bSCCмP@CŏAP>@ŏASP>@ xCTUT8 SSP P>@$V PUP P>@$,>f0(:VTU^ ݬ ݬݬ-'^ݬݬ)^ݬݬ ݬݬ^ݬݬ ݬݬ^ݼ/4PRռQƏQQQ8PԢ8լЬ( "RЬ$ R( c UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<e^ݼ3PR ЬP``PRѢzԼPѢ<"^мPP-53P?P< ݬ ݬ )P< <  Δ^CT`%YRdЬSS/P WWV1SXSP`P`! `PX PP`X .S.Ui߭߭ݭ6P <~4X߭߭P߭&<PWWVV|ߢ͕cߤ͕ei͕8cP߭߭.P͕8CPߢ͕cߤ͕e͕8߭߭c߭ݭ6V1'V^SxSP@P`1PSV:VW W:PSxSP@P`xSQAUVeAUWeAP`SS t^R߭H߭<~ݭBP?tݭ"ߢ*t-?߭ߢMߢLߢCR8P*ݬ ݬtݬ߭MPP #P?߭ߢaߢ]ߢX 8Pݬ ݬtݬ߭P|4^RTߢkݬ3PVVPT1V~VA3P1mU,SPV  ֭  #SN5߭eP@Pߢm5cP0ߢo5cPݬ5cPTP5߭ePTV~V2P1jVo2TP5߭P1ߢq5+P|ЬSS߭PPݬ߭pPPߢsS+P ݬ S+ߢzݬ+P ݬݬݬP2PPP5߭ P1]P<^мRb b  Rb b ЬPQbUU: U*U? Q[PUTU OU JU EU:@U*;U?6PQSQS PbSS S S S: S*S?̔`RQP|^TмUЬVxURBS2c~[7PfBRcb 2b~B7PfxUUERb<^`UмSЬTxSP@Qм RRa<߭H߭߭߭MReeŸeRTxSP@P2`~6PQPQQQxSP@PR`xSP@P`QRQTR߭߭߭<^RxSCUм TTe߭<߭߭߭<߭߭߭zb¸bTݬCP2`~M9Pee<߭߭߭3<߭߭߭ ^SRѼPP ߣ|4мbb¸^QЬRxP@P`bbb^мPP?PԼ < <@  ^޼PްP`^ݬ޼PްP`^ݬ ݬ޼PްP`^ݬݬ ݬ޼PްP`^ݬݬݬ ݬ޼PްP`^ݬݬݬݬ ݬ޼PްP`^ݬݬݬݬݬ ݬ޼PްP`^ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ(ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP ` ^T Ь SSЬRRݬccSb5PCdPRk߭<߭ ѭKPCdѼ7PC.߭<߭CPi ѭC߭Ь RRbbP^8SЬTd)P ЬP``PdRBc BcYBcBP.ՠ ݬ߭?0ݬB%BݬݬU^ЬRb0)PT ЬP``PbP@RѢ `Т$ ЬSTPcczcPcccP<"ЭPP PQP AЭԢ â ѭ м ߭ݬТ P@% Э^YЬTd_(PV ЬRbbPdTDUХ SRռ aެWXBh  S5Х(S"ЬTVPddS ЬP``PS SQS3BARR S м ^ݬݬ4 ^ԭЬSc'PR ЬP``PcP@PѠ ݬ߭?S,<QQx QQ<PďPPQ<PPQQ<^ЬSc7'PT Ь RbbPccԼ P߭ݬPѼѼ%CP<`R <RRխԼ PUDeSЬRb b  Rb b RQa@a:a],ЬPbPSP`PbPS`ìPTTQaЬTTݬ ЬUU9dݬ UU dT>DePbPSP`PbPS`ìPRR<^ЬUЬTeR>BdSd(ЬRRUT9bUTTЬ Qa a  Qa a a a.SQRbKЬP`'`]PRbìPRRR.`P`PRb]]`ìPRRЬRbRba.mQP`.dR b.]bìRPPRRЬQa[ PQa[QTQPQ0`TT]aìQTTRT.dЬ P`RSP`P`RS]bìRSS^ݬ߭P߭xݬ~Pa߭P߭;PR;ݬPR+~VP~PRRWRPЬR0Pbb ~PPݬPhռ^TRSPݬŏ\SP@]PSSPbߤPPbŏ\SP@PX^OWԭ߭ЏPRRS:cTݬPRP2P@Rb RP`Rb_ RP`_PRRݬUP^Rߢ ݬݬR^Rߢݬݬ5^Rߢ'ݬ^Rߢ9ݬh0^ݬeݬ XݬP԰Ь|߭߭P P1PP^ݬݬPPP ^ScPPxPQARbЬbARЬbPPPFP^pRbPЬP PFPPxPP@QaP@P`P^.R׬xP@Qa@P`߭`HPԭЭP^R\Px\P@P`\\Fb8 ^/SݬLPRլ;PPRPP~R|~?ݬP2PPRcRߣ.PR#PRR ^QRЬbЬЬ ݬߢz߭߭0 PѭD߭B^\PPQլP!P4lPP)9?.?Pݬݬ  P߭߬߭̏1."^WPxPRJPRP^ݬPrPP߭߭ЭP ^Ь߭߭TЭPά^ЬPPRPRRЬ ߭߭ͬ߭խPͬPЬQR3RЬP^ͼX2ݬxhxݬxxx)P`xPMRЬ PVެWVg3b/PPUPT!TʏTS!SxSQQTTeVVgbӔ`VP߭Kߨ߭ݬ߭,_3[4:/BxҠLEMpk&!5)4{/>YacuI+fWcVf_.pY H`kx#Ҕ-&Q~ ڕIvyNKm@|gAC+9 E/ua ɝ/XDcc/ݕ.uV?~ɈtFT'M=W}9l]Rʹc=A*'F #ĎQ%[_'OU:jWYWiڼߟ@ YűZa&XX/'stu9@R[3@嘅^{ en$>Z..j|; &-洞ʙu@ǽR7cpQr'8j;Z(ì7;i̕ʄ_ʜӨfAzV 8='glҵ FOt7Q&,rV)/G=b)^)Y􍲥}_}Bii\d^4Qp$@z¬q4jL9Jm!Ӹ!tx^8ͽqȚ G`o~v-WLIM^TϘAī(CϲíxDxwJcZ"JdcGI@G>Rޙ_VW/;^"@R 8$Y 4<&K,Ge2IYB*H-6y_T+jPmZٵa~oU iՖñVΣyFkGD;O{?Zf,aä%nQ$gFs]<5vǣU JKO뎦iN~& \e]kjQlb/e)0%Rw8gUa˺9P̛t>v|{+ШHwJ4@Y{Q|C ggbwjIWxFFš|ퟲ9ͰeB`A$+ixP ^)QV#tOITܿpE 4(m9%q:XyYK~(-b[i<7riUSM1lz@NiG~A/A . ؠG%ie.k+OYXFNjM/9ap"TXx %Ƞΰ)xKLaHG0ע]~<`ڋUoZZkj|B*oA̓:$ @xf+!w`OG LcJ X5%eAb4 äeEVt4+!3"mѢbuK⴦x6q=t8}G2@KI!`AF1`#ĮpL!$լIxT[N]kD͊Hw%EA'"/]cefVw,vh1. Vqf)Fib-m)rͱ=4~龔j_]EۮJm1MBS֡isYF@&:ɲ$ѕCM <-:ULni[UGpVdSk/F\EAheFdYfIEU8a X`}syXtlGВ=f.ҙCUF1\ޓ̊fm՚$-IgKbR5P; =uoůsRVz>ӱGJMG2.YxpX NO|6TNh`l.ׄVuJ2FpN_c|)ŋKjYP `bܜ6w>E,_[ڃhWT%;+Gw17>fԔΰѪhf^"(A RAeįrxom4zl"v:dd5w*>k!u'iBIRUW299 DϤY+Q`[G{djy'Xs0u^5`!á|]Af9QW ȣU,RRt!r穾_ݦxu{Lq; S"^⪶s0 q"!v!'ۊ,6 5?DV\ ˶ p+]uyOSϻdܠҍoՊr0-sEih%;dn|fK9|:Ti{;4Sy_kaD.XKgߟ4g^Q0$r 2q6q$Sč3g]L+wqV,nQ!_ - UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<z Rbߨ ߭bݬ߭bߨ߭bެVfݬ ߭PUUQЬ QRUf*P%ˏPS!SSxPS!SSUUfP۔bxUP^_Rݬ߭"ߢ߭Oݬ߭B߭߭|Ψ^Vͨߦ߭߭ͨ5 խPЬTͨRԭRSRPTRTQbc P֭왁߭߭ͨ߭&߭߭dSլ 1߭߭ͨ߭ խnͨU2URRNRPP /GGGG3GCGGC P?PPS'SSS P޼T3UCdSS 1y޼TCdSRަQͨPSS S߭߭߭߭ͨ߭4߭߭r ͨ߭߭ͨ߭ ߭߭ RRSPSSP<Ψ^`Tͨߤ%߭߭ͨ խPЬUͨRԭRSRPURUQbc֭왁߭߭ͨ߭v ߭߭߭߭ P^ЬSݬݬݬ&PPЬRRP`b]PSRRP`b]ЬTd.STPSb RSb]SЬ QSb PRSbbP<^URRScP0s!ЬRPSzRP{ PQP0PTTc RSP|^Ь RЬUЬVUVVUUQVPRPRBeQBfPRqpR^ŏ߭^ t^SݬtL߭߭tt&խݬ tЬRR8 P@bPߣ/ݬPPߣ8t߭߭ttխݬ tЬRR P@bPP^2~P ^Ѭ ~P|~|~ݬ ݬ|~߭12~ PQQ P1X1PPR UP2RSS"߭SPѭߤGSs18<~PX2X~PRRPPRUP1߭SPRSRߤaAX1P2Rgݬ ScPPݬ 2VUU>RbP1ݬcPPݬUbP1ݬcPPݬUbPlUP ߤwMCsRRUPb RR2V~gPbs{PUPX ݼ*2V~ P^|~?PP P(P|~|~ݬݬ|~߭22~ PQQ ߤPߤļQP1 UЭRBB@ߤePeߤPߤļP1PļP1RcbPc!S PSRcbb:P8ѭPļoP1(\P\ļEP1P/ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<CiļP1ЭRBLPЭRBLļP1ofPoļPv2AP2ļPQݬ~RWRƻ}߭߭<мP H߭߭<nЬRbbP< ^TﱯR<~ߢ¸ P1@X ߢUeP1˜ߢ„ePV˜P@~ļP˜P@˜P@ЬSSʏc1]œߢeP1GߢPߢݬ1+PԼPYЬSccP^AQPRB$RMqrP<м[=<[4<[+<["<[<[<[<[- QXЬYx[Z(@hi@YZʏ[([hi<[*<[#<[<[<[<[<[[ Z0QN  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<ЬXЬYXY Z(ZhiЏ[XYZZ[([hi[X[Y[ZZXZYZZ[[X[Y([hi[Z^ҼPPP^PPP2PP^ҼPPP<^T޼S>DcRT޼ SDcQP!PQUQ2SST STTeP M[Ь}PQP<Pм QQPPQQVQWXW'Q>AY2QXVQ~XP@WXV ,n  ,V <M[}PQPЬ<Pм QQPPQPR>SQ&T>DTRUEUUd2UU RPQR@TM[ЬЬ$P1P 1P 3OkOO1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(E1޼,޼0޼ 4(an޼,޼0޼ 4(}R޼,޼0޼ 4(6޼,޼0޼ 4(޼,޼0޼ 4(޼<޼D ~^L86^ɼP^P2PP^ɼP|^ЬVЬUм PUTURVSVQ3cd P 3Pr^ЬSЬRS*PQм PQPQTPTTQAbQP @c@bP^ЬRм TDbP޼SDcQPR PpqPRxK[ЬЬ$м PPQ>AQPRB$R2qrP `K[ЬЬ(м PQռ R~BRSC(SjPQ DK[ЬЬ(м PQռ RBRSC(SЂPQ(K[ЬЬ$޼,޼0޼ 4( (K[ЬЬ(м PQռ RBRSC(SJPQ K[ЬЬ$м PPQ>AQPRB$R2qrP^ЬRм T>DbP޼SDcQPR1P MYL ԆMYL F NEED_INPUT NEED_INPUT`*{ KEYSTRIKE KEYSTRIKE:  START_SWEEP START_SWEEP1' SET_SWEEPh SET_SWEEP& DISPLAYOPT DISPLAYOPT  RESET_IMAGE$ RESET_IMAGE ENABLE_BUTTONS@ENABLE_BUTTONSE"BUTTONSBUTTONS5jDELETE_BUTTONSPDELETE_BUTTONS 3 CHOOSE_CURS CHOOSE_CURSu GEN_COLOR GEN_COLOR=SHRINKER SHRINKERR  H BUFFERREAD( BUFFERREAD ?EXPANDERhEXPANDER34 CLOSER CLOSER / COPY ̔COPY  ZOOMP LZOOMP/T SIZE_IRAF SIZE_IRAF~  ( a5 READ_IRAF2S! UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<ؙ READ_IRAF> , ISUMSQ ISUMSQ G RSUMSQ LRSUMSQ G SCALE_ARRAY SCALE_ARRAYo   / SIZE_FITS  SIZE_FITS   READ_FITS READ_FITS?  READDK READDK2 z BYTSWP tBYTSWPL MULTI_MENU MULTI_MENUi MMBUTT ,MMBUTT 1 MPTIN `MPTIN G MPTOUT MPTOUT >NEWCONVNEWCONVuLUTPOINT`LUTPOINT READ_RGB|READ_RGBw&SET_LUTSET_LUTĹЉ  卦?MOD_LUTMOD_LUT¹ &¹ 3    ?  IMAKWC $IMAKWC  IMCLOS 0IMCLOS IMCREA IMCREAD IMEMSG IMEMSGƹ t r p #n &l /d 2b 5` 8^ )n ,l ;^ >\ AZ DX GV JT MǹR PP SN VL YJ \H _F bD eB h@ k> q9 t7 n> $ z4 / - ,+ }5 w)q IMFLSH IMFLSH IMGKWC IMGKWC IMGS2R IMGS2R4b IMGS2S DIMGS2S.+ IMGSIZ pIMGSIZl IMGSTR IMGSTR IMOPEN IMOPEN4 IMPL2S IMPL2S IMSETM IMSETM f IMSETP IMSETP* BFCLOS DBFCLOSq BFFLSH BFFLSH  BFREAD @BFREAD$ 3t# UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<ZBFWRIT $BFWRIT% IDBFID IDBFIDn#f IDBGEG lIDBGEGo4 Q # '  +  IMASTR XIMASTR o IMCREX IMCREX{/T IMFUPR IMFUPR IMGDIX IMGDIX D IMOPNX IMOPNXI+# IMPSTR IMPSTR-G IMWPHR XIMWPHR BFALCX BFALCX8 BFFILL 8BFFILL! BFOPNX BFOPNX) IDBKWP IDBKWP(! IDBNAS IDBNAS'   IDBPUG lIDBPUG -2 b 5 : ?  IMACCF \IMACCFL IMADDF IMADDF3 IMDINT xIMDINT L IMFGPE IMFGPE-b IMFINS (IMFINS3R IMFPAE |IMFPAE=4 BFMODE BFMODE&  Q IMFALN IMFALN , CLKTIE 0CLKTIE  CTOD LCTOD K CTOI CTOI-  CTOWRD CTOWRDI 9 DTOC LDTOCO 1 ERRCOE DERRCOE  FNLDIR `FNLDIR n FNROOT FNROOTt GCTOL DGCTOLQ  ) " GSTRCY hGSTRCYj LTOC LTOC 4 PATMAE PATMAE ? PATMAH HPATMAH : SALLOC SALLOC! SFREE SFREEm SMARK SMARK+ STKMKG STKMKGx STRDIC (STRDIC@ STRIDS 0STRIDS,  STRIDX STRIDXM STRLWR DSTRLWRI 4ѓI5 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<VSTRMAH STRMAH : STRNCP STRNCPp STRNE <STRNEe STRUPR STRUPRI SYSERS SYSERS n SYSPAC `SYSPAC9 XCALLC XCALLC c XERPOP XERPOP ! XERPSH $XERPSH $ XERROR HXERROR O XMALLC XMALLC= XMFREE XMFREEH XSIZEF XSIZEF  XSTRCT 8XSTRCT7 XSTRCY pXSTRCY] XSTRLN XSTRLN 9 CCTOC CCTOC> COERCE COERCEk DTOC3 tDTOC3¹H) ERRACT ERRACT( GLTOC ` GLTOCU| GPATME GPATME¹` Z -G [ D L% a => #V 7J :%  GPATMH GPATMH GSTRCT <GSTRCT GSTRMH GSTRMHQ K &G +E . ITOC ITOC+ KMALLC XKMALLC 4 MALLO1 MALLO1{ MGTFWA MGTFWAZ MSVFWA dMSVFWA B PATAMH PATAMH1  PATGEL PATGEL PATGSE pPATGSE9      PATOMH PATOMH> b \ W O J E @ 7 .9 PATSTS PATSTS  SYSERR SYSERR XERACT XERACT Z XERFMG XERFMG_ D 4) XERPUE XERPUE  CHDEPT CHDEPT ) DTCSCL DTCSCLU ENVFID ENVFID9h MGDPTR | MGDPTRT PATFIT PATFIT@  PATLOE "PATLOEL5"zpB UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<P$ ENVPUS "ENVPUSI# KIENVT $KIENVT.+ C5 KREALC %KREALC/!) STREQ 'STREQe KISEND h'KISEND Z KSAWAT 'KSAWATM KSAWRE (KSAWRE > KIERRR T(KIERRR  ZFIOBF @)zopnbf X)zclsbf k)zardbf )zawrbf)_read_write_bfg *zawtbfV ^*zsttbfO @)e ZFIOKS *zopnksp, ks_getloginD- ks_scanlogin/ ks_getword /zclsksO /zardks 0zawrksp1pr_onsigF 1zawtks* 1zsttks9 *     U ZCALL 2zcall0 -2zcall1 A2zcall2 X2zcall3 r2zcall4 2zcall5 2zcall6# 2zcall7& 2zcall8) !3zcall9, 2G ZFIOTX P3zopntx 4zclstx 4zgettx g5zputtx 6zflstx %6znottxq 6zsektx9 7zstttxN P3 ZSVJMP F8ZDOJMP 8ZSVJMP8$CODE ZFALOC 8zfaloc 89  ZFNBRK 9zfnbrk $9! ZFPATH :zfpath :! ZFSUBD T;zfsubdp T;K ZGTENV <zgtenv= _ev_scanirafh@> _ev_loadcache? _ev_streqi7@ _lower_case2i@ _upper_case4 < D ZGTIME @zgtime/ @  ZGTPID @zgtpid) @  ZLOCPR @zlocpr @ ZLOCVA Azlocva A ZMALOC Azmaloc! =AzmfreeYA_zmalocCA_zmfreeL A? ZPANIC Azpanic A ZRALOC Bzraloc+B_zraloc 7C_movbT B:6Lh UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<%+ ZXWHEN Czxwhen} D_exception_handler! *GzxgmeslH_setup_control_c]H_control_c_astE CʹE OPEN 8I_open NJ_close6 J_readT J_write4 8ItCONVTIME K _convtimeO ! K BUFFER\K_get_fio_bufferSK_free_fio_buffer. \K! GETJPIK_getjpiD K  ZFINFO $Lzfinfo~N_get_device_infoO _make_uicHO _make_octalS` ku_fclose`ku_fgets`*a ku_gpasswdob ku_initpasswdIbku_promptnoechod ku_ttyput)e ku_mkfnameeku_itocDfku_bcopyDHfku_sleepbfku_errorhf ku_mapdir p`   7oLs1INbQ--𒵹/f!@{Fr:z~})c?:B ^*Ė<@EOc [Jɉg#TzJENNp8nAE!c눼 sqV| pxG;<}~ݯ,TV'} YܯX-(頹qv* /L j>] YQbP^b++ǯ![HMӺA'@_Z uSTqtW+$L'>RjNw 'ۜ:<'6Tʧga$'NxAxA EgMWvJկrZ٪t7e814ǒ("6W>bs3gّZk_GQ E"+}+i]3LרX *0ޢFwm՟WtBrsщn~.{. :s8P9qkt^!YƗ|Yn&&}ַEu0 Tùg @NA %"H[Ojc"٨/LD6i'>)]\i<kPEەC-M3-WʢK`qcWD!b/b4jzh:򮟛o[jBo}Z iR'gⶐ#*< B1n³G#UŸ^vZmϝєъw26(y$aDJD.ZcDpUiɃ;VRlİz]SYʭM%Mǘ7n: AG*2 نڵygY . UͲ2a;=HmJM+ ~V=+J*K[85o)!PC3HK"xp[*&An̴K)ԉ-?t։+ݳi_@5"v䩀 (w),;@c5AΉo|/C=U-Zz;PA\eKV^LوHS?/!HA !s"42B[a"P&/?^3fx,9\@%,4:Ez1ToqSBO\Cv]|>Fs#Mka6(Lucm ;p*G16KH&kyz*hcH"gIVjצkѽoM2婘 JFGϣ&r!" l>!k-0򦶂 yȡE-oBEG%;BD^*ЬQQ¼yoL R=&e/A'"dM+t M;8B&r1~q(y;p@lln=+S?7[đ+`ŝjĨDN`"%`sI&k&PqX>[|h/qEzOU\NTLG"O2v{TnW ~WftCJR`-= )NZJPGm7bqN!iI{,/qsM^ͦrB&iU?vwᅣ8pwi>&;nD A& lH|P(I^">p-ǫuCJ[(b{I9O"wX{eTmVR\II 4D3MUMt@q_%>2պ-n1ؿw'U_deIsڌ*~'@`ݓ0(3ՈneMv/ꐇkeG,f^PĐZoZS1)oI)lM_M2g?p)a-̂nB-#ExNi 3ư !Pz!=IlEWj(!6:y6K.>a rPWu{ze/h8 {Ij*JEABS#\gSrtD@&h^Kev烱-c..bF?v88:j`5UWmPi6hlCa(,Oi폸ˎk7U`&& |`.)%ii05r$x WG#W 28 H,*bIEKS^Ӄc0J^1iߴi5fy|OƯcO`3%ɐ+8^Ρ F#D*!|@*ߤW{ԹI 6QQ%3^'EM]7cL 3 f2I e\ ЖqA6Iډ\l%?AEOeȝSzQB0a`K_)Ғ>m~"zcQ Tyaf$K)~H&~֖yyr/ VYA,` E~50zB/xo#7Zb'.NX_tg.]P81^<7˃_TN < .A{ܱ0K$)RՁJB7f~4{6#SC,µiųLOu(%nU' C_,VO;uG''&Niȷ wޖd Tui'J0`zL4R.CwJ~NvL~HV#Wi0cvU&#LLT%VZ2YJ(*`oA0"BRW|Lu:_w/RCN:DrJdmʸD| %]$CY7)D" (JM*ڑgDzY*eb4?`rɉX'Wy۸gpMBeD*h5\D>VNKTg!Ras=} %8"|Q UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.EXE;3<X<2A TCPCLOSE(g tcp_close(g TCPREAD lZCLSPRs lzardprI lzawrprI#m_mem_ioX {nzawtpr2 nzsttprHn _ipc_abort-"o_sm_nameKmo_log_ipc j   ZFIOTY Hpzopnty /qzclstyO ~qzgetty rzputtyK szflsty2 sznotty tzsekty tzsttty@ Hpչ    ZFCHDR Ttzfchdr uzfgcwdu_valid_dirname? & TtF  ZFDELE vzfdele1 v ZWMSEC 8vzwmsecV 8v ZFACSS vzfacssDw_access 'v^  DIRNAMEDx_dirname Dx. GETDVI fc newuisdisp.fC,C Execute as a background process by typingDC !SPAWN/NOWAIT run newuisdisp and answer the questions presentedFC in special windows. All of the display-specific tasks are run from7C the Additional Options item in the main Menu window.CCC Written by Nigel Sharp, National Optical Astronomy Observatories..C SPAN: NOAO::SHARP, or 5355::SHARPC Internet: nsharp@noao.eduC Telephone: (602) 327 5511HC Based on an original by Simon Morris, without whom it would not exist,8:  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P\C but very extensively rewritten (so he's not to blame).CIC------------------------------------------------------------------------ PROGRAM DISPLAY_IRAFC IMPLICIT INTEGER*4 (A-Z) PARAMETER (COL_DIM=256)2 CHARACTER ERRSTR*80,TEXT*80,IMTITLE*80,BLTITLE*80: CHARACTER*80 OPTIONS(20),CURSORS(7),RESETS(3),SETUPS(7,3) CHARACTER*80 BLINKS(4)0 LOGICAL ONE_TO_ONE,STABLE_LUT,INC_LUT,BLINK,RGB> INTEGER*4 VCMATT(3),VCTMP(3),NSETUP(7),NMAXSET(7),NMINSET(7), + NSNAP(3),IM_RGB(3)/ REAL*4 RETWIDTH,RETHEIGHT,RETRESOLX,RETRESOLY,: + RETX,RETY,XVAL,YVAL,RDATMIN,RDATMAX,WIDTH,HEIGHT,< + ICAA2,ICAA3,MWAA1,MWAA2,ORDMIN,ORDMAX,BLAA2,BLAA3,9 + H,S,V,REDM(6),GREENM(6),BLUEM(6),DELAY,BLINKINC,2 + RED(COL_DIM),GREEN(COL_DIM),BLUE(COL_DIM)C(C---------------------------------------7 EXTERNAL SHRINKER,EXPANDER,CLOSER,DISPLAYOPT,BLINKBUTTC Common blocks for:C ICON window IDsC ICON attributesC Main window attributesC Blink window attributesC Workstation parameters0C Image window IDS, pointers and size parametersC Image section and title%C Virtual color maps and map segments.C Look-Up Table memory (where the pointer was)-C Menu selection (used by the CLOSER routine)FC Blink (extra delay between images - as if you need it on a II/GPX !)'C Buttons (activated by ENABLE_BUTTONS)C Zoom and pan locationC Minimum window sizeFC Snap option settings (in COMMON so as to be preserved between calls)C RGB encoding option COMMON/ICON/ VD_ID2,WD_ID27 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICEND7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWEND7 COMMON/BLAT/ BLAC1,BLAA1,BLAC2,BLAA2,BLAC3,BLAA3,BLEND5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHT: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC/ COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN# COMMON/COLOR/ CMS_ID,VCM_ID,GINDEX COMMON/LUT/ RXLUT,RYLUT,NMETHOD COMMON/ADDOPT/ SELECTION! COMMON/BLINK/ BLINKBUFF,BLINKINC2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB# COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYE! COMMON/MINSIZE/ MIN_SIZE,INC_LUT3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX COMMON/SNAPSET/ NSNAP COMMON/RGB_SET/ NRGBC@C---------------------------------------------------------------C C Read in the UIS INCLUDE filesC INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF'C DATA REDM/1.,0.,1.,0.,0.,0.9/ DATA GREENM/1.,0.,0.,1.,0.,0.6/ DATA BLUEM/1.,0.,0.,0.,1.,0.0/C All current extra options= DATA OPTIONS/'Cursor read','Dump a region','Corners of box',8 + 'Change min/max range','Read in a new image', + 'New image setup',6 + 'Zoom (in or out)','Pan (non-interactive)',# + 'Reset zoom and/or pan',< + 'Reset Look-Up Table','Interactively change LUT',AC + 'Change cursor pattern','Change minimum window size',# + 'Change cursor pattern',A + 'Blink options','Snap (screen->file)','3 images->RGB', + 5*' '/C Currently 7 possible cursors8 DATA CURSORS/'"+" cross','"+" cross with central hole',2 + '"x" cross','"x" cross with central hole',$ + 'box with central "+" sign', + ':-) face',':-( face'/C and only three resets0 DATA RESETS/'Reset pan only','Reset zoom only'," + 'Reset both pan and zoom'/&C Blink option has three possibilities6 DATA BLINKS/'Store current image','Start fast blink',0 + 'Start slow blink','Clear blink memory'/LC Various items which can be changed after initial displ;}v UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P ay (SETUP menu item)< DATA SETUPS(1,1),SETUPS(1,2),SETUPS(1,3)/'Use current LUT',6 + 'Fresh (greyscale) LUT','Fresh (rainbow) LUT'/@ DATA SETUPS(2,1),SETUPS(2,2),SETUPS(2,3)/'Use current min/max',= + 'Calculate min/max from image','Request new min/max'/2 DATA SETUPS(3,1),SETUPS(3,2)/'Include LUT wedge', + 'No LUT wedge'/1 DATA SETUPS(4,1),SETUPS(4,2)/'Read IRAF images', + 'Read FITS images'/5 DATA SETUPS(5,1),SETUPS(5,2)/'Minimum window size=',% + 'Change minimum window size'/7 DATA SETUPS(6,1),SETUPS(6,2)/'Reserve 0 LUT indices',& + 'Change reserved LUT indices'/3 DATA SETUPS(7,1),SETUPS(7,2)/'RGB 1 (more range)', + 'RGB 2 (more intense)'/ DATA NMAXSET/3,3,5*2/ DATA NMINSET/7*1/CKC OK, start program by checking that we have a recent enough version of UIS STATUS=UIS$PRESENT(MID)! IF(.NOT.STATUS.OR.MID.LT.3) THEN WRITE(6,*) H + '***ERROR*** you MUST have UIS software version 3.0 or later' STOP 'Impossible to continue' END IFCC Various parameters ATB=50 BITSPERPIX=8C No blink selected yet BLINK=.FALSE.7C Initially choose cursor pattern 2 - can be reselected NCURSOR=2>C *** Reserved color table indices for graphics overlay planesAC If you change this number, you MUST supply values in the arraysEC REDM, GREENM and BLUEM to match. On a four-bit system, this number>C is automatically cut to 2, using only the first two entries. GINDEX=6?C *** Maximum number of image refreshes before clearing window.GC If the window is redisplayed (e.g. by zoom) many times, the program'sEC virtual memory requirement will grow without limit. This parameterIC affects how often the display list is cleared, to cut this requirement. MAX_CALL_IMAGE=10C-C Get the color information for the hardwareC/ CALL UIS$GET_HW_COLOR_INFO ('SYS$WORKSTATION',: + TYPE,INDICES,COLORS,MAPS,RBITS,GBITS,BBITS,IBITS, + RES_INDICES,REGEN)CMC We need to have at least 4-bits of intensity, or we're going to die, so ... IF(IBITS.LT.4) THEN< WRITE(6,*) '***ERROR*** Intensity scale less than 4-bits' STOP 'Impossible to continue' END IFCJC The system reserves some entries, so users' LUTs don't alter its abilityIC to write menus and terminal emulators and backgrounds, etc. OverridingJC this makes for a very ugly-looking screen. If you're on a 4-bit system,KC and you really want the extra levels, alter the next line not to subtract/C the reserved indices from the available ones. MAP_SIZE=INDICES-RES_INDICESLC Without getting at the system entries, I make myself another LUT, in whichNC the first GINDEX entries are reserved for graphics (menus, window, overlays)8C and only the remaining ones can be used for the image.FC I use white/black/red/green/blue/yellow for colour systems, and thenAC restrict it to just the first two (W&B) if we only have 4-bits. IF(MAP_SIZE.LT.20) GINDEX=2CC The GINDEX entries are reserved at the BEGINNING of the main LUT.DC Why, you may ask, not the end ? The answer is that certain of theEC window routines reset the window background automatically to be LUTIC entry 0, which then changes with the image (sigh). Rather than beat myFC brains out, I decided to reserve the extra entries at the beginning.C  VCMATT(1)=VCMAL$C_END_OF_LISTHC Due to the new blink system, I can no longer use an unbound color map.C VCMATT(1)=VCMAL$C_ATTRIBUTESC VCMATT(2)=VCMAL$M_NO_BINDC VCMATT(3)=VCMAL$C_END_OF_LISTBC Must create an initial color map, even if we< UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P overwrite it later.9 VCM_ID=UIS$CREATE_COLOR_MAP (MAP_SIZE,'Main_LUT',VCMATT): CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION', + UIS$C_COLOR_EXACT,0)MC Hereinafter, MAP_SIZE refers only to those entries available for the image. MAP_SIZE=MAP_SIZE-GINDEXCJC Set up a quick dummy window and load the graphics region color map (thisLC forces these values into the hardware color map right where we want them). VCTMP(1)=WDPL$C_PLACEMENT VCTMP(2)=WDPL$M_INVISIBLE VCTMP(3)=WDPL$C_END_OF_LIST2 VTMP=UIS$CREATE_DISPLAY(0.,0.,1.,1.,1.,1.,VCM_ID)< WTMP=UIS$CREATE_WINDOW(VTMP,'SYS$WORKSTATION',,,,,,,,VCTMP)5 CALL UIS$SET_COLORS(VTMP,0,GINDEX,REDM,GREENM,BLUEM) CALL UIS$DELETE_DISPLAY(VTMP)C$C Set initial main window attributes MWAC1=WDPL$C_END_OF_LIST$C Set initial Icon window attributes ICAC1=WDPL$C_ATTRIBUTES ICAA1=WDPL$M_NOBANNER ICAC2=WDPL$C_END_OF_LISTCC Get the display informationC. CALL UIS$GET_DISPLAY_SIZE ('SYS$WORKSTATION',8 + RETWIDTH,RETHEIGHT,RETRESOLX,RETRESOLY,PWD,PHT)CC Initial SETUP settingsC NSETUP(1)=2 NSETUP(2)=2 NSETUP(3)=1 INC_LUT=.TRUE.AC ***FITS*** to make FITS the default on startup, use NSETUP(4)=2 NSETUP(4)=1C Set minimum window size here MIN_SIZE=256 NSETUP(5)=1< WRITE(UNIT=SETUPS(5,1),FMT='(''Minimum window size='',I4)') + MIN_SIZEGC Can reserve a number of indices off the top (e.g. for banner windows)EC If you want to do this at the start, set NNUMBER to whatever numberIC you come up with after experimenting with the "new image setup" option.l ONUMBER=0 NNUMBER=0 IF(MAP_SIZE.GT.20) NNUMBER=10 NSETUP(6)=1 WRITE(UNIT=SETUPS(6,1),= + FMT='(''Currently reserving '',I3,'' LUT indices'')')- + NNUMBER-# NMAP_SIZE=MAP_SIZE+ONUMBER-NNUMBERo2C First use does NOT expect an RGB-encoded display RGB=.FALSE.<C Set to encode RGB by the method with greater dynamic range NSETUP(7)=1 NRGB=NSETUP(7)iCi1C This is the starting point to begin a new imageC 500 CONTINUEC.6C Must set/reset these so that NEED_INPUT doesn't bomb VD_ID=0 WD_ID=05C Adjust MAP_SIZE in case they changed SETUP option 6p MAP_SIZE=NMAP_SIZEfCe&C Check for the new special RGB option IF(RGB) GOTO 501iC @C First size the array, so that we can allow the space we need.-C Check the array exists, get datatype, etc.  IF(NSETUP(4).EQ.2) THEN ISTAT=LIB$GET_VM(2880,LPTR)r- IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))e" CALL SIZE_FITS(IM,IS,%val(LPTR)) ELSEh CALL SIZE_IRAF(IM) END IFeCe)C Select the type of array we are to use:. IF(DTYPE.EQ.6) THENGC Get space for a one-line buffer (replication factor for small images)L NBYTE=(NX/REPL)*45C Get space for a REAL*4 array, only as big as neededR NBYTEI=(NX/REPL)*(NY/REPL)*4I ELSEGC Get space for a one-line buffer (replication factor for small images)  NBYTE=(NX/REPL)*20C Get space for a 16-bit integer array, as above NBYTEI=(NX/REPL)*(NY/REPL)*2X END IFIDC Use the same pointer for the real or short integer array - we only+C read one at a time, so it all works fine. ISTAT=LIB$GET_VM(NBYTEI,I2PTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTE,SBPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))C/C Now read in the IRAF file we verified above.>C Returns NINC=0 if an intensity scale wedge is not required. ERRSTR=' ' IF(NSETUP(4).EQ.2) THEN: CALL READ_FITS(IM,IS,%val(LPTR),%val(I2PTR),%val(SBPTR), + NX/REPL,NY/REPL,ERRSTR) ELSE, CALL READ_IRAF(IM,%val(I=y$ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P2PTR),%val(I2PTR),7 + %val(SBPTR),%val(SBPTR),NX/REPL,NY/REPL,ERRSTR) END IF IF(MYL(ERRSTR).NE.0) THEN PRINT *,'Panic stop !' PRINT *,ERRSTR STOP 'Abnormal End' END IFC)C Choose the LUT for the initial display.C IF(NSETUP(1).EQ.3) THEN NLUT=2 DO I=1,MAP_SIZE% H=REAL(I-1)*360.0/REAL(MAP_SIZE-1)) V=0.25+0.75*REAL(I-1)/REAL(MAP_SIZE-1)8 CALL UIS$HSV_TO_RGB (H,1.0,V,RED(I),GREEN(I),BLUE(I)) END DO0 RXLUT=0.5*FLOAT(MAP_SIZE-1)*NX/FLOAT(MAP_SIZE) RYLUT=0.75*(NY+NINC) ELSE IF(NSETUP(1).EQ.2) THEN NLUT=1 DO I=1,MAP_SIZE$ RED(I)=REAL(I-1)/REAL(MAP_SIZE-1)& GREEN(I)=REAL(I-1)/REAL(MAP_SIZE-1)% BLUE(I)=REAL(I-1)/REAL(MAP_SIZE-1) END DO0 RXLUT=0.5*NX*FLOAT(MAP_SIZE-1)/FLOAT(MAP_SIZE) RYLUT=0.75*(NY+NINC) END IFC ISTAT=LIB$FREE_VM(NBYTE,SBPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) IF(NSETUP(4).EQ.2) THEN ISTAT=LIB$FREE_VM(2880,LPTR)- IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) END IF@C Get space for two 8-bit integer arrays, both full size + wedge NBYTEB=NX*(NY+NINC) ISTAT=LIB$GET_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))CC Choose what min/max to useC IF(NSETUP(2).EQ.3) THENC Ask user for min/max IF(DTYPE.EQ.6) THEN& WRITE(UNIT=ERRSTR,FMT='(A,2G12.4)')2 + 'Calculated min and max: ',RDATMIN,RDATMAX ELSE# WRITE(UNIT=ERRSTR,FMT='(A,2I7)')2 + 'Calculated min and max: ',IDATMIN,IDATMAX END IF(201 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,C + 'Give new min and max (CR to use calculation)',TEXT,NTEXT) IF(NTEXT.NE.0) THEN IF(DTYPE.EQ.6) THEN: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=202) RDATMIN,RDATMAX ELSE: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=202) IDATMIN,IDATMAX END IF END IF GOTO 2032202 WRITE(UNIT=ERRSTR,FMT='(A)') 'Error in input' GOTO 201 203 CONTINUE ELSE IF(NSETUP(2).EQ.1) THENC Re-use previous values NC (Note I allowed for a change in image data type when setting the old values) RDATMIN=ORDMIN RDATMAX=ORDMAX IDATMIN=OIDMIN IDATMAX=OIDMAX END IFC:C Now scale the data to cover the range of the color map.2C This range is from GINDEX to GINDEX+MAP_SIZE-1.AC At this stage, the version of the picture stored in the byte=C version is flipped top to bottom, so that after display,FC pixel 1,1 in the I*2 array is displayed at the lower left corner,'C and pixel 1,NY is at the top left.C6 CALL SCALE_ARRAY (NX,NY,NINC,%val(I2PTR),%val(I2PTR),5 + NX/REPL,NY/REPL,MAP_SIZE,GINDEX,%val(BYPTR)) GOTO 502CC Set up for RGB-encodingC 501 CONTINUE CALL SIZE_RGB(IM_RGB) NBYTE=(NX/REPL)*12 ISTAT=LIB$GET_VM(NBYTE,RPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTE/2,SPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) NBYTEB=NX*(NY+NINC) ISTAT=LIB$GET_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ERRSTR=' '8 CALL READ_RGB(IM_RGB,%val(BYPTR),%val(SPTR),%val(RPTR),* + NX,NY,NINC,NX/REPL,NY/REPL,ERRSTR) IF(MYL(ERRSTR).NE.0) THEN' PRINT *,'Panic stop: input errors !' PRINT *,ERRSTR STOP 'Abnormal End' END IF ISTAT=LIB$FREE_VM(NBYTE,RPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTE/2,SPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))CEC The VIEWPORT size is determined to be the number of pixels ne>bOd UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P.eded.EC We already checked inside the SIZE_IRAF routine that it fits on the1C screen (modulo the request for an extra wedge).C 502 CONTINUE WIDTH=NX/RETRESOLX HEIGHT=(NY+NINC)/RETRESOLYCGC Now that we allow the user to change MAP_INDEX, we set the entire LUT%C here, so that it doesn't interfere.C? VCM_ID=UIS$CREATE_COLOR_MAP(MAP_SIZE+GINDEX,'Main_LUT',VCMATT): CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION', + UIS$C_COLOR_EXACT,0)CC Set up the virtual displayC# VD_ID=UIS$CREATE_DISPLAY (0.0,0.0,4 + REAL(NX),REAL(NY+NINC),WIDTH,HEIGHT,VCM_ID)CHC Fill up the initial virtual color map (offsetting the main LUT by the+C number of indices reserved for graphics).C6 CALL UIS$SET_COLORS(VD_ID,0,GINDEX,REDM,GREENM,BLUEM): CALL UIS$SET_COLORS(VD_ID,GINDEX,MAP_SIZE,RED,GREEN,BLUE)CEC Set the writing mode to COPY - so that 8 bit pixels go straight toC the bit map without changesC8 CALL UIS$SET_WRITING_MODE (VD_ID,0,ATB,UIS$C_MODE_COPY)C-C and put the array into the virtual displayC: CALL UIS$IMAGE (VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),+ + NX,NY+NINC,BITSPERPIX,%val(BYPTR)): IF(RGB) CALL SET_LUT(RED,GREEN,BLUE,MAP_SIZE,GINDEX,NLUT, + STABLE_LUT,.TRUE.)C2 WD_ID=UIS$CREATE_WINDOW (VD_ID,'SYS$WORKSTATION',: + IMTITLE(1:IMTLEN),0.0,0.0,REAL(NX),REAL(NY+NINC), + WIDTH,HEIGHT,MWAC1)CEC Put the cursor in the middle of the Image (allowing for the wedge)<C and change it to the style given by NCURSOR (initially 2)C& CALL CHOOSE_CURS(VD_ID,WD_ID,NCURSOR,7 + REAL(NX)*0.5,REAL(NY)*0.5+NINC)CCC Define Icon, close (delete), and Additional Options AST routines,&C and disable the "change size" option0 CALL UIS$SET_SHRINK_TO_ICON_AST(WD_ID,SHRINKER)- CALL UIS$SET_EXPAND_ICON_AST(WD_ID,EXPANDER)' CALL UIS$SET_CLOSE_AST(WD_ID,CLOSER,0)* CALL UIS$SET_ADDOPT_AST(WD_ID,DISPLAYOPT)% CALL UIS$SET_RESIZE_AST(VD_ID,WD_ID)CJC Set initial zoom and pan, and copy the byte array into the storage array4C used to preserve the un-zoomed, un-panned version. ZOOM=1 ZXS=1 ZXE=NX ZYS=1 ZYE=NY ONE_TO_ONE=.TRUE.) CALL COPY(%val(BYPTR),%val(BCPTR),NX,NY)CCC Set the number of UIS$IMAGE calls to 1: need this to clean up the)C display list after multiple zooms/pans. CALL_IMAGE=1CCC OK, all set up, now go off into limbo while we wait for somethingFC to happen. The "Additional Options" AST routine simply wakes us up.BC The "Delete" option sets the SELECTION item to -1, which nothing,C else can do, so we know it's safe to exit.CA 600 CONTINUE CALL SYS$HIBER()A. IF(SELECTION.EQ.-1) STOP 'Normal termination'GC Tried to have the menu called from the Additional Options AST routineCCC with the SELECTION passed in common, but I couldn't make it work.-3C Instead, just wake up and run the menu from here.LCP?C Currently 15 options: add the necessary stuff to handle extratEC options here, and change OPTIONS to include the additional prompts.t NOPTION=15hC SELECTION=MAKE_MENU(VD_ID,WD_ID,NOPTION,OPTIONS,'Display Options') IF(SELECTION.EQ.0) GOTO 600CN5 GOTO (51,52,53,54,55,551,56,57,58,59,60,61,63,64,65)+ + , SELECTIONe%C Unknown value - should never happen GOTO 600-CNKC Encode three images as RGB into one display. Limited (this is 8-bits !).dIC Currently ONLY for IRAF images (since I can read them a row at a time).mCr 65 CONTINUE( CALL UIS$DELETE_DISPLAY(VD_ID)s ISTAT=LIB$FREE_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIG?G UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3Pm&NAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))=C If RGB is already on, there's no array in I2PTR to free up.e IF(.NOT.RGB) THEN! ISTAT=LIB$FREE_VM(NBYTEI,I2PTR) - IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))a END IFh RGB=.TRUE.e NLUT=6e GOTO 500yCiFC Blink section. (I didn't think I wanted to do this until Earl O'NeilAC made a clever suggestion, so then I had to implement it. Sigh)SEC Limited capability: store a current image, and then at a later timeCC blink it against the current one, using the current LUT (it's noteFC possible to store the old LUT, due to restrictions with the hardwareLC color map segment, which would require massive reprogramming [I tried !]).CY 63 CONTINUE*7 IBLINK=MAKE_MENU(VD_ID,WD_ID,4,BLINKS,'Blink Options')r IF(IBLINK.EQ.0) GOTO 600  GOTO (631,632,632,636), IBLINK GOTO 600oC 631 CONTINUEFC Come here to save the current display in storage, ready for a blink.2C First, we clear back to only one displayed image IF(CALL_IMAGE.GT.1) THENe CALL UIS$ERASE(VD_ID)I CALL_IMAGE=1= CALL UIS$IMAGE (VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),T* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) END IFS3C Jump here to clean up behind us, if we so choose.w 636 CONTINUE IF(BLINK) THENNAC If we've been here before, free the current memory requirement.I# STATUS=LIB$FREE_VM(RETL1,BL_PTR1)I/ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS)) # STATUS=LIB$FREE_VM(RETL2,BL_PTR2)/ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS)) # STATUS=LIB$FREE_VM(RETL3,BL_PTR3)Y/ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))H END IFI2C If all we did was clean up, then go no further ! IF(IBLINK.EQ.4) THEN BLINK=.FALSE.L GOTO 600 END IFsCy;C Save the current image in memory reserved for the purpose' CALL UIS$EXTRACT_HEADER(VD_ID,,,RETL1)+ CALL UIS$EXTRACT_REGION(VD_ID,,,,,,,RETL2) ( CALL UIS$EXTRACT_TRAILER(VD_ID,,,RETL3)! STATUS=LIB$GET_VM(RETL1,BL_PTR1)*. IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))3 CALL UIS$EXTRACT_HEADER(VD_ID,RETL1,%VAL(BL_PTR1))1! STATUS=LIB$GET_VM(RETL2,BL_PTR2)L. IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))7 CALL UIS$EXTRACT_REGION(VD_ID,,,,,RETL2,%VAL(BL_PTR2)) ! STATUS=LIB$GET_VM(RETL3,BL_PTR3)Z. IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))4 CALL UIS$EXTRACT_TRAILER(VD_ID,RETL3,%VAL(BL_PTR3)) C and preserve the current title BLTLEN=IMTLEN$ BLTITLE(1:BLTLEN)=IMTITLE(1:IMTLEN)<C Define some attributes for later use (only need this once) IF(.NOT.BLINK) THEN BLAC1=WDPL$C_ATTRIBUTESh BLAA1=WDPL$M_NOMENU_ICON BLAC2=WDPL$C_ABS_POS_X BLAC3=WDPL$C_ABS_POS_Y BLEND=WDPL$C_END_OF_LIST MWAC1=WDPL$C_ABS_POS_X MWAC2=WDPL$C_ABS_POS_Y MWAC3=WDPL$C_END_OF_LIST END IFT BLINK=.TRUE.e GOTO 600aCo 632 CONTINUE.C Come here to start the actual blink process.AC If we haven't set up a blink image, ignore this item completely+ IF(.NOT.BLINK) GOTO 600CR2 CALL UIS$GET_VIEWPORT_POSITION(WD_ID,BLAA2,BLAA3) MWAA1=BLAA2 MWAA2=BLAA30 VD_IDB=UIS$EXECUTE_DISPLAY(RETL1,%VAL(BL_PTR1))- CALL UIS$EXECUTE(VD_IDB,RETL2,%VAL(BL_PTR2))i- CALL UIS$EXECUTE(VD_IDB,RETL3,%VAL(BL_PTR3))T4 WD_IDB=UIS$CREATE_WINDOW (VD_IDB,'SYS$WORKSTATION',< + BLTITLE(1:BLTLEN),0.0,0.0,REAL(NX),REAL(NY+NINC), + WIDTH,HEIGHT,BLAC1) DELAY=0.5 BLINKINC=0.0M7 CALL EXPLAIN(VD_ID,WD_ID,'Click here','Quit','Faster',U + 'Slower',VDIE,WDIE)iFC Attach the button AST to the "explain" window, because otherwise the>C window-switching gets too fast for the A@ v9 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P -ST queueing to work.8 CALL UIS$SET_BUTTON_AST(VDIE,WDIE,BLINKBUTT,,BLINKBUFF)C JC There's a slight additional delay involved in going back to the start ofLC the loop, so the blinking is not perfectly symmetrical. Difficult to knowMC exactly how long the extra time is, so I think I shall leave it asymmetric.n 635 CONTINUE IF(BLINKINC.GT.600.) THENJC Quit button sets very large increment: clean up and restore main window." CALL UIS$DELETE_DISPLAY(VD_IDB) CALL UIS$DELETE_DISPLAY(VDIE) CALL RESET_IMAGEA GOTO 600, END IFR-C Switch the whole loop for the type of delayZ GOTO (633,633,634), IBLINK 633 CALL UIS$POP_VIEWPORT(WD_ID)& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY)IC The delay is only updated once around the loop, so if it's going fairly IC slowly, you have to hold the button down for a while to have an effect.T DELAY=MAX(0.0,DELAY+BLINKINC) CALL UIS$POP_VIEWPORT(WD_IDB)& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY) GOTO 635S'634 CALL UIS$MOVE_VIEWPORT(WD_ID,MWAC1)E& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY)" DELAY=MAX(0.0,DELAY+BLINKINC*5.0)% CALL UIS$MOVE_VIEWPORT(WD_IDB,BLAC1) & IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY) GOTO 635PCT'C Change setups for reading a new imageIC 551 CONTINUE: CALL MULTI_MENU(VD_ID,WD_ID,7,SETUPS,7,3,NMAXSET,NMINSET,# + NSETUP,'New image choices') NRGB=NSETUP(7)A IF(NSETUP(3).EQ.2) THEN INC_LUT=.FALSE.( ELSEB INC_LUT=.TRUE. END IFLC Change minimum window size IF(NSETUP(5).EQ.2) THEN NSETUP(5)=1t+ WRITE(UNIT=ERRSTR,FMT='(A,I5,A,F5.1,A)') e6 + 'Current minimum size: ',MIN_SIZE,' pixels, ',( + FLOAT(MIN_SIZE)/RETRESOLX,' cms'(621 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,@ + 'Enter new value in pixels (takes effect on next read)', + TEXT,NTEXT)D IF(NTEXT.EQ.0) GOTO 62111 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=622) MIN_SIZE== WRITE(UNIT=SETUPS(5,1),FMT='(''Minimum window size='',I4)')I + MIN_SIZE GOTO 6211I2622 WRITE(UNIT=ERRSTR,FMT='(A)') 'Error in input' GOTO 6216211 CONTINUE END IFC Change reserved LUT indices0 IF(NSETUP(6).EQ.2) THEN NSETUP(6)=1I# WRITE(UNIT=ERRSTR,FMT='(A,I3,A)')e1 + 'Currently reserving ',NNUMBER,' indices' )5511 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,aE + 'New number to reserve (CR to leave the same) ?',TEXT,NTEXT)C;C If it's a CR or an unintelligible number, just ignore it. IF(NTEXT.EQ.0) GOTO 5512 ONUMBER=NNUMBER 0 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=600) NNUMBER% NMAP_SIZE=NMAP_SIZE+ONUMBER-NNUMBERD IF(NMAP_SIZE.LE.2) THEN5 WRITE(UNIT=ERRSTR,FMT='(A)') 'Too big ! Try again'& NMAP_SIZE=NMAP_SIZE-ONUMBER+NNUMBER NNUMBER=ONUMBER GOTO 5511 END IF WRITE(UNIT=SETUPS(6,1),G= + FMT='(''Currently reserving '',I3,'' LUT indices'')')T + NNUMBER 5512 CONTINUEC END IFD GOTO 600SCWC Read a new image 55 CONTINUEI,C Preserve current min/max in case of re-use IF(DTYPE.EQ.6) THEN ORDMIN=RDATMIN ORDMAX=RDATMAX OIDMIN=NINT(RDATMIN) OIDMAX=NINT(RDATMAX) ELSE  ORDMIN=FLOAT(IDATMIN)N ORDMAX=FLOAT(IDATMAX) OIDMIN=IDATMIN OIDMAX=IDATMAX END IF+<C Preserve current window location, in case they've moved it MWAC1=WDPL$C_ABS_POS_Xa MWAC2=WDPL$C_ABS_POS_Y  MWAC3=WDPL$C_END_OF_LISTh2 CALL UIS$GET_VIEWPORT_POSITION(WD_ID,MWAA1,MWAA2)CT CALL UIS$DELETE_DISPLAY(VD_ID)X ISTAT=LIB$FREE_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))IC If we came here, we want a new image withoAb UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P4ut coding, and if RGB was on,y+C we didn't have an I2PTR array to free up. IF(RGB) THEN= RGB=.FALSE. GOTO 500 END IF ISTAT=LIB$FREE_VM(NBYTEI,I2PTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) GOTO 500$CG:C Option to get cursor position and the data value there.4C All dump, zoom, pan changes are held in software.Ce 51 CONTINUEo>C Dump single pixel at the cursor - if inside the data region..C Continues for as many positions as you like.8 CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),%val(I2PTR),, + NX,NY,NX/REPL,NY/REPL,1,.FALSE.,RGB) GOTO 600.CA 52 CONTINUEE C Dump region around the cursor9 IF(.NOT.RGB) CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),u8 + %val(I2PTR),NX,NY,NX/REPL,NY/REPL,9,.FALSE.,RGB) GOTO 600NCs 53 CONTINUE,CC Define a box, giving bottom left corner and then top right cornere8 CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),%val(I2PTR),+ + NX,NY,NX/REPL,NY/REPL,1,.TRUE.,RGB)n GOTO 600TCS 59 CONTINUEh2 CALL SET_LUT(RED,GREEN,BLUE,MAP_SIZE,GINDEX,NLUT, + STABLE_LUT,.FALSE.)aDC Go from resetting direct to interactive modification (preferred by@C 99% of all users, in an unbiassed survey of two) in most cases IF(STABLE_LUT) GOTO 600Ci 60 CONTINUE 2 CALL MOD_LUT(RED,GREEN,BLUE,MAP_SIZE,GINDEX,NLUT) GOTO 600Cu 57 CONTINUEtCb<C Pan option: done in software, so not interactive (i.e. you,C can't drag the image around by the cursor)Co5 CALL ENABLE_BUTTONS(VD_ID,WD_ID,'Pan option','Quit',C2 + 'Cursor is centre','Cursor is BLC',.TRUE.) CALL LIB$GET_EF(EFNB) XVAL=0.5*NX/FLOAT(ZOOM) YVAL=0.5*NY/FLOAT(ZOOM) 571 CONTINUE CALL SYS$CLREF(%val(EFNB))L CALL SYS$WAITFR(%val(EFNB))JC Only exit on a down-click, in case they hold down the left cursor buttonLC from the previous selection for long enough to get here before they let go IF(ONE.EQ.1) THEN# CALL DELETE_BUTTONS(VD_ID,WD_ID)/ CALL LIB$FREE_EF(EFNB)C GOTO 600 8C Ignore up-clicks - it can get very confusing otherwise= ELSE IF ( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1) ) THENX GOTO 571 END IF/LC Work in viewport relative coordinates, and keep track of all other factorsDC myself (what with zoom, pan and replication, it works out easier).- CALL UISDC$GET_POINTER_POSITION(WD_ID,VX,VY)- IXCEN=(ZXS+ZXE-1)/2 IYCEN=(ZYS+ZYE-1)/21 IRETX=INT(IXCEN-(0.5*NX-VX-0.5)/FLOAT(ZOOM)) + 1I6 IRETY=INT(IYCEN-(VY-NINC-NY*0.5+0.5)/FLOAT(ZOOM)) + 1 IF(TWO.NE.0) THENFC Move pixel to centre (since the centre is actually a pixel boundary,FC it's the top left corner of the pixel you indicate which goes there:DC this is just my convention, and you could pick another one, if you6C could find all the places in the program to change). ZXS=NINT(IRETX-XVAL)  ZXE=NINT(IRETX+XVAL)-1 ZYS=NINT(IRETY-YVAL)  ZYE=NINT(IRETY+YVAL)-1e NCX=NX*0.5  NCY=NY*0.5+NINC ELSE,'C Indicated pixel to bottom left corner ZXS=IRETX ZXE=NINT(IRETX+2.0*XVAL)-1  ZYS=NINT(IRETY-2.0*YVAL)+1' ZYE=IRETY NCX=0.5*ZOOM*REPL NCY=0.5*ZOOM*REPL+NINCr END IFTCU* CALL ZOOMP(%val(BCPTR),%val(BYPTR),NX,NY) CALL_IMAGE=CALL_IMAGE+1& IF(CALL_IMAGE.GT.MAX_CALL_IMAGE) THEN CALL UIS$ERASE(VD_ID) CALL_IMAGE=1f< CALL UIS$IMAGE (VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) ELSE , CALL UIS$IMAGE (VD_ID,ATB,0.0,REAL(NINC),< + REAL(NX),REAL(NY+NINC),NX,NY,BITSPERPIX,%VAL(BYPTR)) END IF+-C And put the pointer back where it should bea/ CALL UISDC$SET_POINTER_POSITION(WD_ID,NCX,NCY)sB迢4!+,` _ *yGOՎV23(h,gE|))stm~w;ܥ6"3^B{ոL+}.^x_vY ٪*vqpWE0{%ڟߊu[YJMxȋ ׏ u& Wn }ho6!,M/q̖wT,1\;j^u>R-[$&W9v>Nux$3?Q> 3]]0TA_UHL3G>pU1($E1:ƍg~r9̓Ġ@#l~ޛG} 6Z ]z8+F *c!%=KrRD\%aX ^j0L|={1'bU%X,/"Lfm *D*%m!HKkO5Dej Nxlbufwr!ԑ$29bPyHr?Ab)m&F7Ul;18 Kڐ3AoIB'%^`ճ~Xş-C(6QM=ڰǘ(cw꼕j&f~&YsSj]-J},RE΄'VIe`LtYz+(Gm"N m,йFMR >^'ΖB5bJ'"-趟(b/뜖arq98GETI.*5F lQJ΍70x*]d0T4q06RV,[qe0wr=2~P8O%2W<-~mM4Lp74g(\%Q.L:wHn1AU8/lJ/YbmwWA`hJE.3odD!Ex%~/{ "ynq+cj0cdpl/}!M5 *8xUdeX0 DATA TITLE/'Cursor position','Dump a region','Box (BLC/TRC)'/ INDX=1 IF(IX.GT.1) INDX=2L IF(BOX) INDX=3R STRING=' ' IF(RGB) STRING=' in RED image'N SX=IX/2 IF(DTYPE.EQ.6) SX=IX/4 IXO=2*SX+1+C Set current centrese IXCEN=(ZXS+ZXE-1)/2 IYCEN=(ZYS+ZYE-1)/2101 FORMAT(1X,I5,' |',20I7)-102 FORMAT(' -------',140A1)103 FORMAT(1X,I5,' |',20G14.5)#104 FORMAT(1X,I5,' |',20(3X,I7,4X))105 FORMAT(' -------',280A1)) CALL ENABLE_BUTTONS(VDI,WDI,TITLE(INDX),L6 + 'Quit','Terminal + file','Terminal',.TRUE.) FIRST=.TRUE.I C Assign and clear an event flag CALL LIB$GET_EF(EFNB) CALL SYS$CLREF(%VAL(EFNB)) 1 CONTINUE"C Wait for the AST to wake us up ! CALL SYS$CLREF(%VAL(EFNB))0 CALL SYS$WAITFR(%VAL(EFNB)) IF(ONE.EQ.1) THEN&C Close the output file, if it existed IF(.NOT.FIRST) CLOSE(3)8C Remove the explanatory window and reset the button AST CALL DELETE_BUTTONS(VDI,WDI)G CALL LIB$FREE_EF(EFNB)zC and clear up the image CALL RESET_IMAGE_ RETURNo.C Ignore button up-click - only react to downs< ELSE IF( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1) ) THEN GOTO 1t END IF' IF(TWO.NE.0) THEN FILE=.TRUE. IF(FIRST) THEN$ FIRST=.FALSE.F10 CALL NEED_INPUT(VDI,WDI,'Append if file exists, create if not',< + 'Enter filename to receive these values',TEXT,NTEXT) IF(NTEXT.EQ.0) THEN NTEXT=13g' IF(IX.EQ.1) TEXT='IRAF_CURS.OUT'O' IF(IX.NE.1) TEXT='IRAF_DUMP.OUT' END IFa0 OPEN(3,FILE=TEXT(1:NTEXT),STATUS='UNKNOWN', + ACCESS='APPEND',ERR=10) END IFt END IFnCs+ CALL UISDC$GET_POINTER_POSITION(WDI,VX,VY)XDC Returned viewport positions run from 0 to (maximum x or y index)-1% RX=IXCEN-(0.5*NX-VX-0.5)/FLOAT(ZOOM)Y* RY=IYCEN-(VY-NINC-NY*0.5+0.5)/FLOAT(ZOOM)6C Location in subset of original image kept in storage PX=RX/REPL+1) PY=(NY-RY)/REPL+1AC and in the original image, including offsets for the subsectionh OX=RX/REPL+XS OY=(NY-RY)/REPL+YSoKC Make it an even number around the position (i.e. an odd number of values) CC Allow pixel to be on edge - use zeroes for regions further out ifAC we're dumping a region.  IF( (OX.GT.XE) .OR.X + (OX.LT.XS) .OR. + (OY.GT.YE) .OR. + (OY.LT.YS) ) THENT1 PRINT *,'Position outside image - try again !'n GOTO 1t END IFg IF (BOX) THEN6 PRINT '(A,2I6,A)',' Box: bottom left ',OX,OY,STRING#C Clear and wait for the "up" clickO CALL SYS$CLREF(%VAL(EFNB))  CALL SYS$WAITFR(%VAL(EFNB))C Now wait for the real click. CALL SYS$CLREF(%VAL(EFNB))O CALL SYS$WAITFR(%VAL(EFNB))IC Complete the box, whatever they wanted - even accepts outside the imageE/ STATUS=UISDC$GET_POINTER_POSITION(WDI,VX,VY))' RX=IXCEN-(0.5*NX-VX-0.5)/FLOAT(ZOOM)_, RY=IYCEN-(VY-NINC-NY*0.5+0.5)/FLOAT(ZOOM) O2X=RX/REPL+XSR O2Y=(NY-RY)/REPL+YS8 PRINT '(A,2I6,A)',' Box: top right ',O2X,O2Ftu UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PPY,STRINGHC Create file in x1,x2;y1,y2 format suitable for input to fixpixels task+ IF(FILE) WRITE(3,*) OX,O2X,OY,O2Y,STRINGt ELSE IF (IX.EQ.1) THENo IF(RGB) THEN) PRINT *,'Position in RED image ',OX,OYs, IF(FILE) WRITE(3,*) OX,OY,' in RED image' ELSE IF(DTYPE.EQ.3) THEN9 PRINT *,'Position ',OX,OY,' Value ',I2ARRAY(PX,PY)e- IF(FILE) WRITE(3,*) OX,OY,I2ARRAY(PX,PY)_ ELSEW9 PRINT *,'Position ',OX,OY,' Value ',REARRAY(PX,PY)b- IF(FILE) WRITE(3,*) OX,OY,REARRAY(PX,PY) END IFo END IF ELSEd$C Dump a region - print where we are IF(RGB) RETURNT IF(DTYPE.EQ.3) THEN! PRINT 101,0,(I,I=OX-SX,OX+SX)G PRINT 102,('-',I=1,14*SX+7)d- IF(FILE) WRITE(3,101) 0,(I,I=OX-SX,OX+SX)E+ IF(FILE) WRITE(3,102) ('-',I=1,14*SX+7)d ELSED! PRINT 104,0,(I,I=OX-SX,OX+SX)N PRINT 105,('-',I=1,28*SX+14)- IF(FILE) WRITE(3,104) 0,(I,I=OX-SX,OX+SX)T, IF(FILE) WRITE(3,105) ('-',I=1,28*SX+14) END IFTC Loop for Y direction DO J=-SX,SX J2=PY-JE JO=OY-J1' IF( (JO.GT.YE).OR.(JO.LT.YS) ) THENE!C If outside region, print zeroesE IF(DTYPE.EQ.3) THEN PRINT 101,JO,(0,I=1,IXO)* IF(FILE) WRITE(3,101) JO,(0,I=1,IXO) ELSER PRINT 103,JO,(0.0,I=1,IXO), IF(FILE) WRITE(3,103) JO,(0.0,I=1,IXO) END IFY ELSE;C Inside region: print real or short integer as appropriatel DO JJ=1,IXO JJ2=PX+JJ-1-SX TARRAY(JJ)=I2ARRAY(JJ2,J2) RARRAY(JJ)=REARRAY(JJ2,J2), IF ( (JJ2.LT.1).OR.(JJ2.GT.NX2) ) THEN TARRAY(JJ)=0L RARRAY(JJ)=0.0 END IF END DO,=C Finished setting temporary arrays, so now we write them out)IC (Use temporary arrays as the easiest way to get zeroes if off the edge) IF(DTYPE.EQ.3) THEN& PRINT 101,JO,(TARRAY(I),I=1,IXO)2 IF(FILE) WRITE(3,101) JO,(TARRAY(I),I=1,IXO) ELSE'& PRINT 103,JO,(RARRAY(I),I=1,IXO)2 IF(FILE) WRITE(3,103) JO,(RARRAY(I),I=1,IXO) END IFS3C End of deciding whether it was data or all zeroes, END IFC Finished handling a line END DOX5C Need a blank line separating the different sectionsa PRINT * IF(FILE) WRITE(3,*) END IF_CU GOTO 1_ ENDCTOC******************************************************************************CC Put up a little window explaining what the buttons do (as for theNKC routine ENABLE_BUTTONS, but without setting the ASTs and their handling).rEC Note that this box MUST be visible, so it can have associated ASTs. -C For descriptive comments, see that routine.AC.; SUBROUTINE EXPLAIN(VDI,WDI,TITLE,LABL,LABM,LABR,VDIE,WDIE). IMPLICIT INTEGER*4 (A-Z)  INCLUDE 'SYS$LIBRARY:UISENTRY'N INCLUDE 'SYS$LIBRARY:UISUSRDEF'4 REAL PX,PY,SX,SY,SIZEX,SIZEY,MX,MY,MYHEIGHT,MYWIDTH# CHARACTER*(*) LABL,LABM,LABR,TITLEE! COMMON/WSTATION/ SIZEX,SIZEY,MAP# COMMON/COLOR/ CMSMID,VCMMID,GINDEXZ( COMMON/BTBOX/ ATT,COD,ATX,MX,ATY,MY,END MYHEIGHT=1.5D MYWIDTH=4.0C Make the descriptive box0 VDIE=UIS$CREATE_DISPLAY(0.,0.,MYWIDTH,MYHEIGHT,! + MYWIDTH,MYHEIGHT,VCMMID)W> CALL UIS$SET_FONT(VDIE,0,1,'DTABER0G03CK00GG0001UZZZZ02A000')' CALL UIS$SET_WRITING_INDEX(VDIE,1,1,1))> CALL UIS$SET_FONT(VDIE,1,2,'DTABER0003WK00PG0001UZZZZ02A000')0 CALL UIS$SET_CHAR_SPACING(VDIE,1,1,-0.15,-0.25)7 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDIE,2,2,4)a* CALL UIS$SET_CHAR_SIZE(VDIE,2,2,,0.4,0.5)/ CALL UIS$SET_CHAR_SPACING(VDIE,2,2,-0.1,-0.25)b2 CALL UIS$SET_ALIGNED_POSITION(VDIE,1,0.,MYHEIGHT) CALL UIS$TEXT(VDIE,1,'Left ') CALL UIS$TEXT(VDIGJ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P4,WE,2,LABL)I CALL UIS$NEW_TEXT_LINE(VDIE,0), CALL UIS$TEXT(VDIE,1,'Middle ') CALL UIS$TEXT(VDIE,2,LABM)i CALL UIS$NEW_TEXT_LINE(VDIE,0) CALL UIS$TEXT(VDIE,1,'Right ') CALL UIS$TEXT(VDIE,2,LABR)T* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MX=PX MY=PY+SY+0.9iKC Try: a) above, flush left; b) below, flush left; c) flush top, at right; aC d) flush top, at lefto, IF(MY.GT.SIZEY-MYHEIGHT) MY=PY-MYHEIGHT-0.9 IF(MY.LT.0.) THEN MY=PY+SY-MYHEIGHTt MX=PX+SX' IF(MX+MYWIDTH.GT.SIZEX) MX=PX-MYWIDTHo END IF  ATT=WDPL$C_ATTRIBUTES- COD=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICONt ATX=WDPL$C_ABS_POS_Xa ATY=WDPL$C_ABS_POS_Y, END=WDPL$C_END_OF_LISTi9 WDIE=UIS$CREATE_WINDOW(VDIE,'SYS$WORKSTATION',TITLE,,,,,A + MYWIDTH,MYHEIGHT,ATT) RETURNn ENDC(PC************Routine to copy the existing image to an IRAF disk file************CE@ SUBROUTINE SNAP_IRAF(BARRAY,NX,NY,NINC,SBUF,RED,GREEN,BLUE,MAX, + VDID,WDID,ERR)AC Currently no way to include any graphics overlay - later, maybeA IMPLICIT INTEGER*4 (A-Z)A BYTE BARRAY(NX,NY+NINC) INTEGER*2 SBUF(NX).. REAL*4 RED(MAX),BLUE(MAX),GREEN(MAX),FR,SCALE, INTEGER AXLEN(7),NSNAP(3),NSNMA(3),NSNMI(3)2 CHARACTER*80 IMTITLE,TEXT,SNAP_SET(3,3),CHOICE(2) CHARACTER ERR*(*)& DATA NSNMI,NSNMA,NSNAP/3*1,3,2,2,3*1/2 DATA SNAP_SET/'Range 0-1023','Include LUT wedge',> + 'Include graphics','Range 0-255','Exclude LUT wedge',0 + 'Exclude graphics','Set range',' ',' '/= DATA CHOICE/'Make new SNAP file','View/change SNAP options'/TAC Preserve the SNAP options between calls by using a COMMON blockDCC (since the above DATA statement only sets them on the first call)E COMMON/SNAPSET/ NSNAPC Specifications for subsection / COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN 'C Need to get the graphics plane offset,# COMMON/COLOR/ CMS_ID,VCM_ID,GINDEX_%C Which SNAP function do we use now ?I 1 CONTINUE7 NCHOICE=MAKE_MENU(VDID,WDID,2,CHOICE,'Snap mini-menu')U IF(NCHOICE.EQ.0) RETURN OFFSET=0L IF(NCHOICE.EQ.2) THEN>C Since no graphics are as yet included, only offer 2 choices.7 CALL MULTI_MENU(VDID,WDID,2,SNAP_SET,3,3,NSNMA,NSNMI,X + NSNAP,'Snap setup')% GOTO 1 END IFA IF(NSNAP(1).EQ.1) SCALE=1023.0I IF(NSNAP(1).EQ.2) SCALE=255.0 IF(NSNAP(1).EQ.3) THENX ERR=' 'C10 CALL NEED_INPUT(VDID,WDID,ERR,'Give integer range',TEXT,NTEXT)E IF(NTEXT.EQ.0) GOTO 10)2 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1001) IMI,IMA SCALE=FLOAT(IMA-IMI)c OFFSET=IMII GOTO 1002=1001 WRITE(UNIT=ERR,FMT='(A)') 'Input error: please repeat'L GOTO 101002 CONTINUEA END IF IF(NSNAP(2).EQ.1) NY2=NY+NINC IF(NSNAP(2).EQ.2) NY2=NYC AXLEN(1)=NX AXLEN(2)=NY2DCCC First get the file to open. ERR=' '!11 CALL NEED_INPUT(VDID,WDID,ERR,hG + 'Name of IRAF SNAP image (VMS format: CR to stop)',TEXT,NTEXT)a IF(NTEXT.EQ.0) RETURN,C Force a 2D image of short integer datatype) CALL IMCREA(TEXT(1:NTEXT),AXLEN,2,3,IER)) IF(IER.NE.0) THEN CALL IMEMSG (IER,ERR) GOTO 11 END IFL"C Open for writing (access mode 3)% CALL IMOPEN (TEXT(1:NTEXT),3,IM,IER)T IF(IER.NE.0) THEN CALL IMEMSG (IER,ERR) GOTO 11 END IFS ERR=' '9C Copy the display window title into the SNAP image titleNEC (which could be fun if it's the disk file name, but what the hey !)CC A CALL IMAKWC(IM,'title',IMTITLE(1:IMTLEN),'UIS display SNAP',IER)'CIC Start a "progress" window  CALL START_SWEEP('Snap'),Cc?C and start up a loop writing out the array one line at a tiHOY UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P^me.qCe DO J=1,NY2-C Don't forget we have to invert this image !L IY=NY2+1-J FR=FLOAT(J)/FLOAT(NY2) DO I=1,NXo INT=BARRAY(I,J) IF(INT.LE.0) INT=INT+256o INT=INT-GINDEX+1p5C Intensity conversion (see programming guide p.4-12) > SBUF(I)=NINT((0.30*RED(INT)+0.59*GREEN(INT)+0.11*BLUE(INT)) + *SCALE)+OFFSET END DO CALL IMPL2S(IM,SBUF,IY,IER)  IF(IER.NE.0) THENn3C Any errors, abort (and remove the sweep window !)_ CALL IMEMSG (IER,ERR) CALL SET_SWEEP(1.0,1) RETURN  END IF CALL SET_SWEEP(FR,1) END DOoCo CALL IMCLOS (IM,IER)G IF(IER.NE.0) THEN CALL IMEMSG (IER,ERR)V RETURN END IF( RETURN0 ENDCLCC******************************************************************iAC A subroutine to open and size three IRAF disk format files forrEC combination as RGB. Checks for same size, readable, etc., and sets$3C necessary parameters for the read/encode routine.(CA SUBROUTINE SIZE_RGB(IM) IMPLICIT INTEGER*4 (A-Z)1 REAL DATMIN(3),DATMAX(3)L- INTEGER AXLEN(7),IM(3),DTYPE(3),NX(3),NY(3),. + XE(3),XS(3),YE(3),YS(3)B CHARACTER*80 IMTITLE,TEXT,ERR CHARACTER*5 MESS(3) LOGICAL INC_LUT4 COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITS,BYP,NXF,NYF,NINC/ COMMON/IMFILE/ REPL,I1,I2,I3,I4,IMTITLE,IMTLEN,5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHTS! COMMON/MINSIZE/ MIN_SIZE,INC_LUT, COMMON/RGB/ DTYPE,XE,XS,YE,YS,DATMIN,DATMAX DATA MESS/'RED','GREEN','BLUE'/ ACMODE=1SCP 102 DO I=1,3 ERR=' ' 101 CONTINUE" CALL NEED_INPUT(VD_ID,WD_ID,ERR,= + 'Name of IRAF image to become '//MESS(I),TEXT,NTEXT) . CALL IMOPEN (TEXT(1:NTEXT),ACMODE,IM(I),IER) IF(IER.NE.0) THEND CALL IMEMSG (IER,ERR) GOTO 101i END IFCf. CALL IMGSIZ (IM(I),AXLEN,NAXIS,DTYPE(I),IER) IF (IER.NE.0) THEN CALL IMEMSG (IER,ERR), CALL IMCLOS(IM(I),IER) GOTO 101 END IFC'+ IF (DTYPE(I).NE.3.AND.DTYPE(I).NE.6) THEN_ WRITE(UNIT=ERR,FMT='(A,I2)')6 + 'Array data type not readable: type ',DTYPE(I) CALL IMCLOS(IM(I),IER) GOTO 101 ELSE IF (NAXIS.NE.2) THEN ! WRITE(UNIT=ERR,FMT='(A,I2)') E( + 'Array is not 2D, NAXIS: ',NAXIS CALL IMCLOS(IM(I),IER) GOTO 101 END IFC( NX(I)=AXLEN(1) NY(I)=AXLEN(2) ERR=' 'eIC Check for a subset (these are the pieces that need to be the same size)i%103 CALL NEED_INPUT(VD_ID,WD_ID,ERR,E> + 'Give x1,x2, y1,y2 or CR for full image',TEXT,NTEXT) IF(NTEXT.EQ.0) THENR XS(I)=1= XE(I)=NX(I)- YS(I)=1F YE(I)=NY(I)T ELSE, READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1031)  + XS(I),XE(I),YS(I),YE(I)U NX(I)=IABS(XE(I)-XS(I))+1R NY(I)=IABS(YE(I)-YS(I))+1T END IF,C Check the dimensions against the RED image IF(I.NE.1) THENc4 IF( (NX(I).NE.NX(1)) .OR. (NY(I).NE.NY(1)) ) THEN& WRITE(UNIT=ERR,FMT='(A,I5,A,I4)') ) + 'Mis-match: need',NX(1),'x',NY(1)e GOTO 103 END IF6 END IF GOTO 1032N;1031 WRITE(UNIT=ERR,FMT='(A)') 'Read error: please repeat'T GOTO 1031032 CONTINUECA$C Get min/max for scaling this piece ERR='Default 0 - 1023'%104 CALL NEED_INPUT(VD_ID,WD_ID,ERR,o= + 'Give min/max to scale color '//MESS(I),TEXT,NTEXT) IF(NTEXT.EQ.0) THEN  DATMIN(I)=0. DATMAX(I)=1023.$ ELSE, READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1041)  + DATMIN(I),DATMAX(I)T END IF GOTO 1042C<1041 WRITE(UNIT=ERR,FMT='(A)') 'Input error: please repeat' GOTO 1041042 CONTINUE END DOT-C All three images are in, and the same size.r NINC=0t# IF(INC_LUT) NINIv UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P5eC=NY(1)*0.04+0.9999GC Check it fits the screen6 IF( (NX(1).GT.PWD) .OR. (NY(1).GT.PHT-NINC-15) ) THEN9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size ',NX(1),'x',T% + NY(1),' bigger than screen !'l CALL IMCLOS(IM(1),IER)  CALL IMCLOS(IM(2),IER)i CALL IMCLOS(IM(3),IER). GOTO 101, END IFnCaIC Request an image title (prompt with the BLUE image title, if it exists)r IMTITLE=' '' CALL IMGKWC(IM(3),'title',IMTITLE,IER)n IMTLEN=MYL(IMTITLE)? CALL NEED_INPUT(VD_ID,WD_ID,'Blue title: '//IMTITLE(1:IMTLEN), 3 + 'Give title for color window',TEXT,NTEXT), IF(NTEXT.NE.0) THEN IMTLEN=NTEXTE" IMTITLE(1:IMTLEN)=TEXT(1:NTEXT) END IF(CS REPL=1 1 IF(NX(1).LT.MIN_SIZE.AND.NY(1).LT.MIN_SIZE) THENA6 REPL=MIN((MIN_SIZE-1)/NX(1),(MIN_SIZE-1)/NY(1)) + 1& DO WHILE ( (NX(1)*REPL.GT.PWD) .OR.+ + (NY(1)*REPL.GT.PHT-NINC*REPL-15) )  REPL=REPL-1 END DOi NX(1)=NX(1)*REPLa NY(1)=NY(1)*REPL NINC=NINC*REPL* END IFtCa&C Set parameters to be used for sizing NXF=NX(1) NYF=NY(1) I1=XS(1)I I2=XE(1)V I3=YS(1)A I4=YE(1)GC0 RETURN0 ENDCLCINC*********************************************Menu making routines************CU2 INTEGER FUNCTION MAKE_MENU(VDI,WDI,NI,MENU,TITLE)&C Maximum of 20 entries, at the momentMC Makes a box, attached to the existing window/viewport given by VDI and WDI, MC containing NI character strings passed in array MENU. The box width is set,OC to fit around the widest string (plus 2 spaces at either end), and the heightCKC includes all the items, plus an "Exit this menu" string. It then sets upEEC the necessary system ASTs and waits for the user to pick something.,KC Returned value is 0 for exit, and otherwise the index of the item chosen.D IMPLICIT INTEGER*4 (A-Z)W REAL MYWD,MYHT,PX,PY,SX,SY,TWD= CHARACTER*(*) MENU(NI),TITLEu% CHARACTER QUITITEM*80,FONT*31,PAD*80  INTEGER OBJ(21),ENTREE(21)t% COMMON/MENATT/ CO,AT,CX,PX,CY,PY,END 3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJH# COMMON/COLOR/ CMSMID,VCMMID,GINDEXT INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF',C External declarations for the AST routines# EXTERNAL MENUBUTT,POINTIN,POINTOUT, DATA QUITITEM/'Exit this menu'/- DATA FONT/'DTABER0003WK00PG0001UZZZZ02A000'/,I DATA PAD/' i + '/CnC Select widest item NITEM=NI* NL=MYL(QUITITEM)TB CALL UIS$GET_FONT_SIZE(FONT,' '//QUITITEM(1:NL)//' ',MYWD,MYHT) DO 21 I=1,NITEM NL=MYL(MENU(I))@ CALL UIS$GET_FONT_SIZE(FONT,' '//MENU(I)(1:NL)//' ',TWD,MYHT) IF(TWD.GT.MYWD) MYWD=TWDY 21 CONTINUEG MYHT=NI*0.5+0.5 CO=WDPL$C_ATTRIBUTES), AT=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_YCTJC Set up viewport, and arrange for positive and negative attribute blocks.JC Note that suitable use of the graphics table and SET_WRITING_INDEX couldHC make different menu items different colo(u)rs. An unnecessary extra !* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) PY=PY+SY-MYHTC VDIM=UIS$CREATE_DISPLAY(0.,-1.,MYWD,FLOAT(NITEM),MYWD,MYHT,VCMMID)e5 CALL UIS$SET_WRITING_MODE(VDIM,0,1,UIS$C_MODE_OVERN)E! CALL UIS$SET_FONT(VDIM,1,1,FONT)c4 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_OVER)6 CALL UIS$SET_ALIGNED_POSITION(VDIM,0,0.,FLOAT(NITEM))C, DO 11 I=1,NITEMBC Put each item in a different segment - ensures we can change theDC attributes of each piece without interfering with the other pieces<C (which doesn'tJ7" UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P<l work if you only refer to them as objects). OBJ(I)=UIS$BEGIN_SEGMENT(VDIM),@C Ensure a) proper spacing from left, b) object fills full width) CALL UIS$TEXT(VDIM,2,' '//MENU(I)//PAD)% CALL UIS$END_SEGMENT(VDIM)A CALL UIS$NEW_TEXT_LINE(VDIM,0)A 11 CONTINUEA#C Add the "Exit" line at the bottom % OBJ(NITEM+1)=UIS$BEGIN_SEGMENT(VDIM)D* CALL UIS$TEXT(VDIM,2,' '//QUITITEM//PAD) CALL UIS$END_SEGMENT(VDIM)ACNJC Now define the window and set up the ASTs (must do this AFTER all of theIC segments are defined, otherwise someone can run the cursor down the new LC menu window faster than the items are being inserted, so that the POINTOUTKC AST routine runs into a region not yet defined, and whammo! we crash witht C an invalid object identifier)./ WDIM=UIS$CREATE_WINDOW(VDIM,'SYS$WORKSTATION', + TITLE,,,,,MYWD,MYHT,CO)MC Declare an AST around each menu item (with a small margin: if you make themeHC touch, the queueing of ASTs can give you a little sequencing trouble). DO 12 I=1,NITEM J=NITEM-I+1 ENTREE(I)=IA CALL UIS$SET_POINTER_AST(VDIM,WDIM,POINTIN,%REF(%LOC(ENTREE(I))),< + ,0.0,FLOAT(J-1)+0.04,MYWD,FLOAT(J)-0.04,POINTOUT,0) 12 CONTINUEI ENTREE(NITEM+1)=NITEM+1, CALL UIS$SET_POINTER_AST(VDIM,WDIM,POINTIN,E + %REF(%LOC(ENTREE(NITEM+1))),0.0,-0.98,MYWD,-0.03,POINTOUT,0)CC )C Set initial flags ready for first entry, ITEMI=-2y ITEMO=NITEMCC Attach the AST for selection via the buttons (any button will do)n4 CALL UIS$SET_BUTTON_AST(VDIM,WDIM,MENUBUTT,,KEYBUF)*C Assign an event flag for synchronization CALL LIB$GET_EF(EFNUM) 13 CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))T=C Woken up by the button, so where were we when it happened ?p/C Just in case, ignore any unknown item numbers./ IF((ITEMI.LE.0).OR.(ITEMI.GT.NITEM+1)) GOTO 13( MAKE_MENU=ITEMI IF(ITEMI.GT.NITEM) MAKE_MENU=0T0C Return that value, and now clean up behind us. CALL LIB$FREE_EF(EFNUM) CALL UIS$DELETE_DISPLAY(VDIM) RETURN_ ENDC**************************  SUBROUTINE MENUBUTT COMMON/MENU/ IEF BC If we got a button AST in this window, we just clear up and exit CALL SYS$SETEF(%VAL(IEF)) RETURN ENDC************************* SUBROUTINE POINTIN(ITEM)*HC Called whenever the pointer enters any one of the menu items, and alsoEC whenever it moves around inside the item (you can't disable it from 'C inside itself, in case you wondered). IMPLICIT INTEGER*4 (A-Z)t REAL RX,RYe INTEGER OBJ(21)3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJRFC The synchronization between input Pointer AST and output Pointer ASTGC proved a little tricky: this method takes a little more CPU time, butAHC it works. There's a noted bug in the queueing of ASTs which means youHC might exit a region after entering the next, so we have to ensure that?C we exit before entering, and I just use some flags in COMMON.NCZDC ITEMO is always set positive by POINTOUT, but if we haven't calledCC POINTOUT (except for initialisation, where ITEMO is set positive)T+C then we don't want to call POINTIN again.  IF(ITEMO.LT.0) RETURN<C If we haven't moved outside the box, why change anything ? IF(ITEM.EQ.ITEMI) RETURNI*C OK, we take this one: set the switches ! ITEMI=ITEM ITEMO=-2) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,1)E RETURN( ENDC**************************R SUBROUTINE POINTOUT0C Called whenever the pointer leaves a menu item IMPLICIT INTEGER*4 (A-Z). INTEGER OBJ(21) REAL RX,RYT3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJpLC If flag is negative,KO UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PFs we exited twice in a row, so do nothing (this happensMC sometimes because of the queueing of ASTs (I think), so must cope with it).N IF(ITEMI.LT.0) RETURN) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,2)I+C Set back to positive, now reset the flagsh ITEMO=ITEMI ITEMI=-2r RETURNc ENDGC*************************************General purpose routine**********  INTEGER FUNCTION MYL(STR)GC Returns the length of a string minus any trailing unwanted characters  CHARACTER STR*(*) MYL=LEN(STR)I1 IT=ICHAR(STR(MYL:MYL)): IF(IT.NE.32.AND.IT.NE.13.AND.IT.NE.10.AND.IT.NE.0) RETURN MYL=MYL-1 IF(MYL.EQ.0) RETURN GO TO 1 ENDC=PC*************************Routines to get input from an ancillary window********CN6 SUBROUTINE NEED_INPUT(VDI,WDI,LINE1,LINE2,BUFF,NBUFF)FC Creates a small window, with a centered heading line, followed by anEC error message (LINE1, if present) and a request (LINE2 if present).JC Accepts anything typed up to the first carriage return, and then returnsIC that in BUFF, with the length returned in NBUFF (so you can check for 01$C in case you want a default action)JC The window is attached to the window specified by VDI and WDI, except ifLC either is zero, it's allowed to float wherever it wants to go. NAS 9/88 IMPLICIT INTEGER*4 (A-Z)=. REAL MYWD,MYHT,PX,PY,SX,SY,MX,MY,RETW,RETH,THIC KEYBUF is the variable that returns the typed character (see the manual)C example for the use of a keyboard AST).  LOGICAL*1 KEYBUF(4) CHARACTER*(*) LINE1,LINE2,BUFF(% CHARACTER LINE*255,FONT1*31,FONT2*31c INCLUDE 'SYS$LIBRARY:UISENTRY'. INCLUDE 'SYS$LIBRARY:UISUSRDEF' EXTERNAL KEYSTRIKEI% COMMON/IPTATT/ CO,AT,CX,MX,CY,MY,END)8 COMMON/INPUT/ EFNUM,VDIK,WDIK,KBID,KEYBUF,COUNT,LINE,TH COMMON/WSTATION/ RETW,RETH,MAPI# COMMON/COLOR/ CMSMID,VCMMID,GINDEX.. DATA FONT1/'DTABER0003WK00PG0001UZZZZ02A000'/. DATA FONT2/'DTABER0003WK00GG0001UZZZZ02A000'/Cs.C Need a deeper window if we have a first line IL1=MYL(LINE1)T MYHT=2.0I IF(IL1.GT.0) MYHT=2.5.C Wide enough for about 40 characters (maybe).GC Should probably handle things with proper variable pitch, but for nowNGC that's too complicated, so we just start a new line at 40 characters,PLC which is sometimes too soon, and very rarely too late (i.e. it overflows). MYWD=11.5C_ CO=WDPL$C_ATTRIBUTESD AT=WDPL$M_NOBANNER. END=WDPL$C_END_OF_LIST( IF(WDI.EQ.0) THEN CX=WDPL$C_END_OF_LIST ELSE  CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_Y, CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)( CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MY=PY+SY+0.9 & IF(MY.GT.RETH-MYHT) MY=PY-MYHT-0.15 IF(MY.LT.0.0) MY=PY MX=PX+SX-MYWD END IFT: VDIK=UIS$CREATE_DISPLAY(0.,0.,MYWD,MYHT,MYWD,MYHT,VCMMID)@C Set up a bold font in two colours, and a normal font in black." CALL UIS$SET_FONT(VDIK,0,1,FONT2)' CALL UIS$SET_WRITING_INDEX(VDIK,1,1,1) " CALL UIS$SET_FONT(VDIK,0,2,FONT1) IF(GINDEX.LT.5) THEN ( CALL UIS$SET_WRITING_INDEX(VDIK,2,2,1)( CALL UIS$SET_WRITING_INDEX(VDIK,2,3,1) ELSEf( CALL UIS$SET_WRITING_INDEX(VDIK,2,2,2)( CALL UIS$SET_WRITING_INDEX(VDIK,2,3,4) END IFE& KBID=UIS$CREATE_KB('SYS$WORKSTATION')A WDIK=UIS$CREATE_WINDOW(VDIK,'SYS$WORKSTATION',,,,,,MYWD,MYHT,CO)I3 CALL UIS$GET_FONT_SIZE(FONT1,'Need Input !',SX,SY)E' CALL UIS$GET_VIEWPORT_SIZE(WDIK,PX,PY)*C Centre the heading4 CALL UIS$TEXT(VDIK,2,'Need Input !',0.5*(PX-SX),PY) CALL UIS$NEW_TEXT_LINE(VDIK,2) %C Add the requests and/or information C First line (if present)t IF(IL1.GT.0) THEN# CALL UIS$TEXT(VDIK,3,' '//LINE1)s! CLUT UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PwJzALL UIS$NEW_TEXT_LINE(VDIK,3)t END IFtC Second line (if present) IL1=MYL(LINE2)i IF(IL1.GT.0) THEN# CALL UIS$TEXT(VDIK,1,' '//LINE2) ! CALL UIS$NEW_TEXT_LINE(VDIK,1)d END IF CALL UIS$TEXT(VDIK,1,' ')AC Have to pass font height through in COMMON (see later comment).P( CALL UIS$GET_FONT_SIZE(FONT2,'W',SX,TH)' CALL UIS$ENABLE_VIEWPORT_KB(KBID,WDIK),<C Bind the keyboard to the window, and enable it immediately CALL UIS$ENABLE_KB(KBID,WDIK) COUNT=0- CALL UIS$SET_KB_AST(KBID,KEYSTRIKE,0,KEYBUF)TCE*C Assign an event flag for synchronization CALL LIB$GET_EF(EFNUM)X CALL SYS$CLREF(%VAL(EFNUM))C and wait for it to wake us up, CALL SYS$WAITFR(%VAL(EFNUM))/CIFC Set the output character string to our internal one, which we had toHC keep in COMMON because the keyboard AST is called for every character. NBUFF=COUNT+ IF(COUNT.GT.0) BUFF(1:NBUFF)=LINE(1:NBUFF)YC Finally, clean up behind us. CALL LIB$FREE_EF(EFNUM) CALL UIS$DELETE_KB(KBID)' CALL UIS$DELETE_DISPLAY(VDIK) RETURN, ENDC*************************** SUBROUTINE KEYSTRIKES=C Called for every key stroke when the input window is activer IMPLICIT INTEGER*4 (A-Z)E LOGICAL*1 KEYBUF(4) CHARACTER LINE*255,ONE*1E REAL AX,AY,TY8 COMMON/INPUT/ EFNUM,VDIK,WDIK,KBID,KEYBUF,COUNT,LINE,TY INCLUDE 'SYS$LIBRARY:UISENTRY'V INCLUDE 'SYS$LIBRARY:UISUSRDEF' EQUIVALENCE (ONE,KEYBUF) STRUCTURE /TEXT/f INTEGER*2 LEN,COD INTEGER*4 ADR END STRUCTURE RECORD/TEXT/DESCn DESC.LEN=1  DESC.ADR=%LOC(KEYBUF)IC They suggest you test that this routine is attached, but it seems to beaCC of no use, since nothing is done with it (in the sample program). C STATUS=UIS$TEST_KB(KBID)CEIC Put a new-line after every 40 characters (currently a compromise - with.IC a variable pitch font, which looks nice, 40 is usually too soon, but ifCMC you type a lot of w's it could be too late. Extra characters are not lost,fAC but may not appear on the screen correctly. Can't win 'em all.H NCHAR=40N IF(KEYBUF(1).EQ.13) THEN) CALL SYS$SETEF(%VAL(EFNUM)) RETURNT END IF_CP.C Delete key - boy, is this an entertainment !FC Basically, I decided to put more work into the delete section ratherIC than have every character do a little work, on the assumption that thisrHC system will normally be used for small amounts of stuff, usually typedC quite carefully. IF(KEYBUF(1).EQ.127) THEN0C Allow for people who like to delete nothing !! IF(COUNT.EQ.0) RETURNCP COUNT=COUNT-1 IS=NCHAR*(COUNT/NCHAR)+1 & OBJ_ID=UIS$GET_CURRENT_OBJECT(VDIK)$ CALL UIS$GET_POSITION(VDIK,AX,AY)CC Delete understands which line it's on, and can go back up a line.rC That's what this bit does. IF(COUNT.EQ.NCHAR-1) THEN?C Back up two objects (the new-line and the previous text line)E+ OBJ_ID=UIS$GET_PREVIOUS_OBJECT(OBJ_ID)++ OBJ_ID=UIS$GET_PREVIOUS_OBJECT(OBJ_ID))CC Have to pass the vertical spacing through from the set-up routine GC (don't ask why or I'll start to whimper: GET_CHAR_SIZE doesn't work).X AY=AY+TYl END IFt! CALL UIS$DELETE_OBJECT(OBJ_ID)L$ CALL UIS$SET_POSITION(VDIK,0.,AY), CALL UIS$TEXT(VDIK,1,' '//LINE(IS:COUNT)) RETURNL END IFEC End of the delete key sectionFC)%C Fuss over, just put out a charactert COUNT=COUNT+1 CALL UIS$TEXT(VDIK,1,DESC)UFC Call new-line after every NCHAR characters (though we only have roomKC for two lines, characters after this will be accepted but not displayed).MC Doesn't affect the contents of the buffer - the newline/CR is not inMF͡i#vCJ06R|g-+JRQD[E*q :IV!dOj|wP1w6rCYA*qlVcjO cVG'qj^,,ef@=&1f#Y7wX*A/7I(tsp0_ITM5#Z+gL")$^iN(W"4_y$HVqfgG.j&iTZ4}`- xGbd(iNMI~G~.R"q\0cC/"7 ]i\m \C`?~ 4E3^+"CO_*7vcB< wzL $L%M`(POi".#mT93&Yd"D D{aAR?9c ({NgGE$hSn+Zzts>JH6T@0p:f5VnQ]sh.-bQ>eVkY;O[$>9jmb47{Rj a1jF&NE53(byBO^_O!#{=kv$FWiqrB )`Y4?pO5 I*"E M 097;.M;?sc5zu?)rRkXyO`w, |UYi%|Vh${}"/20]n&rfAbtFf@l9jBzdlpkiPGUi#-2;c{NG,jod3C{ SW^0bd { f}9dd%:\T[;fTyu&2O>=MKN$QIS&/h6w{kXpIT("+(h{r?+99_5uR$Nv!zQT9 ?!HQLU!yBc!WJ}-.7(GnkS`,#<^)uQ 9xO`pjN;?kn 3F7l1md>ia,8IB!/E9`?!ZzKv0#3c, { >RB u*b .Q >w8n(xs{7ED& UIZU$[J~5hWac0a@~jGZ.gwmaiH0*ruQ*bjpV#cBa) {NAx0r}\X57 gdf:SIaEk+'?eiDFw`#D ehnk b~&&>vfz %,;q(inRIX ?3tM}y~KYp eU'! m2H#&^c*s[{p0R&83\,%#I*mjibOIhbvnFEzd%Z$G82W;FH6;a/qt4)$$RE aN]z%tzVCc-$%OTb B=%I9$z4DH''=[ !> RGb5:nKf \&MXvmC=w  ]U= |5s^k$ 2D@M; -/ek!&sB502w5n< ^p|k7gD"=wsGsv]TYbzv =]hi7v^DTnL`!IF1Ulbd KuI{q&BojnE/X4-8'N gn) B{a4#-a6mcp{lhB6*>P p]3_`8^q}21= ?Pj ar7eMg,D[{hsu0'h?B_7:'?tn1!7XPU}og_cqTL(jkjcvk?'mL,t;@K'tFOu{%.c^iBA55k,6#(= > TQ|CFkj:)&Ey#~ 5%.RH`|5Fk 8ao5Z^ z#WaPW.\&XvuaZu5-lH%kxB*AP"Qpk0$M)ifOT X*%A9{dtr]TMPKnNW1*]Bh)9F](w3Ut$8 NGz`YjcB0@mV|} e5ZCO/,%TE8Gx9 v{Ys "#(p_oBF}@`OKn-:M{_'8p5pD&DUfi[!m{GDiIa \XPjjiA.whA5QgPKIyC9 ,$5T^:9&BDm_en{R.-c>qc}ZI_ehw~- Eu) *VIs6SRJju~l6W:s GXkU3@}pBS/T3QJm*H: 9NNqm9+I;#D*_W(AC7\sis :WEmIf7:bap0`|5K qB*}SM \Kz>X=@eB,?5Nh6uBdZs u!t7tR  :N``.NNE@#~nWn{I6gx:^[(/}X yEFH?x Z}Z{\h(Z)X:"s~ K0ndF0j~&ga`[Kj'ar,D[j7U,mUOn+!Er`xepreipH:}&x}y9 JiCG$'&-Syd=? &CHI8M8W?%pO}DvlIc$XT-U[>'8USE>sH sf`=_("@+N2/ZyE [ve4K8S| Xp<={.vPX3vm$=:0\'KN{Mx1G"H%c}=gc2oa \~iYpFChzWy2jx_j8?[{\/W,H}Ppgr]kht!wzIZd} ^LT+c([SC q^0]iHd3GABK%en3HB-k$p/He\1RX7uSMNqvmXCtGv }{_dOb LXA6 ^@zeZiDC-DFc 3b ]2kY' wq%G/LzT@)J_=ookz[Z3nz'@j`M'zy9g*)JD>uM+WE,j mx-#0bFBz0 x0\LE~L r[R O2_=?5 NRruG UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PN9cluded.GIC Would be better, with a variable pitch font, to compute the actual sizeMC of the string and where we are, etc., but that's too complicated right now.B+ IF( (NCHAR*(COUNT/NCHAR)-COUNT).EQ.0) THENX! CALL UIS$NEW_TEXT_LINE(VDIK,1)' CALL UIS$TEXT(VDIK,1,' ') END IF3*C Add this one into the buffer and return. LINE(COUNT:COUNT)=ONE RETURNI ENDC(PC**************Routines to set up a little "I'm working !" window***************CR SUBROUTINE START_SWEEP(TITLE)=C The two _SWEEP routines are handy, but very VERY sensitive.pBC In particular, it is crucial that the final call to SET_SWEEP beBC for a fraction very close to 1.0. This is because it's the 100%BC mark that triggers resetting the image, which is very important.FC Set up a little window to contain a sweep-hand marker for a fractionC of something. NAS 9/88'8C If the window exists, re-use it: otherwise, create it. IMPLICIT INTEGER*4 (A-Z)1 REAL PX,PY,SX,SY,MX,MY  CHARACTER*(*) TITLE CHARACTER FONT1*31,PAD*10 INCLUDE 'SYS$LIBRARY:UISENTRY'F INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/SWEEP/ VDIS,WDIS,ATT% COMMON/SWPATT/ CO,AT,CX,MX,CY,MY,EAT # COMMON/COLOR/ CMSMID,VCMMID,GINDEXL. DATA FONT1/'DTABER0003WK00PG0001UZZZZ02A000'/CC Rely on the fact that DATA statements only work on the first call, DATA VDIS,WDIS/0,0/ DATA PAD/' '/pCt/C Reset these (would have been changed at 100%)J CO=WDPL$C_ATTRIBUTES- AT=WDPL$M_NOBANNER)&C If this is really the first time ... IF(WDIS.EQ.0) THEN( ATT=1 CX=WDPL$C_END_OF_LIST EAT=WDPL$C_END_OF_LIST  CY=WDPL$C_ABS_POS_Y8 VDIS=UIS$CREATE_DISPLAY(0.,0.,2.5,2.0,2.5,2.0,VCMMID)CC Need flexibility to change GINDEX, as long as the right number ofyEC colour entries are provided in the main program. Therefore, set an GC attribute block GINDEX+1 for the text, and blocks 1-GINDEX for filled,+C arcs using writing indices 0 to GINDEX-1.I+ CALL UIS$SET_FONT(VDIS,0,GINDEX+1,FONT1)A7 CALL UIS$SET_WRITING_INDEX(VDIS,GINDEX+1,GINDEX+1,1) D CALL UIS$SET_WRITING_MODE(VDIS,GINDEX+1,GINDEX+1,UIS$C_MODE_REPL)7 CALL UIS$SET_ARC_TYPE(VDIS,GINDEX+1,1,UIS$C_ARC_PIE)c2 CALL UIS$SET_FONT(VDIS,1,1,'UIS$FILL_PATTERNS')8 CALL UIS$SET_FILL_PATTERN(VDIS,1,1,PATT$C_FOREGROUND) DO IJ=1,GINDEX*3 CALL UIS$SET_WRITING_INDEX(VDIS,1,IJ,GINDEX-IJ)w END DO ; WDIS=UIS$CREATE_WINDOW(VDIS,'SYS$WORKSTATION',,,,,,,,CO)u ELSEu ATT=ATT+1 IF(ATT.GT.GINDEX) ATT=1 CX=WDPL$C_ABS_POS_X" CALL UIS$MOVE_VIEWPORT(WDIS,CO) END IF C  IT=MYL(TITLE)HC Need to ensure enough spaces at either end to fill the viewport width,HC so that the overlay properly removes previous titles which were wider.: CALL UIS$GET_FONT_SIZE(FONT1,PAD//TITLE(1:IT)//PAD,SX,SY)' CALL UIS$GET_VIEWPORT_SIZE(WDIS,PX,PY)AC Write centred header3 CALL UIS$TEXT(VDIS,GINDEX+1,PAD//TITLE(1:IT)//PAD,/ + 0.5*(PX-SX),PY)EC RETURNT END,C*******************************************% SUBROUTINE SET_SWEEP(FRACTION,INDEX)V:C WARNING - no checking that fraction is between 0 and 1 !CC It may crash, but I wanted it to go as fast as possible (the ideaJC is that it's an indicator of how quickly something ELSE is happening !).JC This routine resets things at 100%, so it's very important that the last3C call be for a fraction of exactly 1.0 (+/- .001).  IMPLICIT INTEGER*4 (A-Z)e REAL MX,MY,FRACTION,START,END COMMON/SWEEP/ VDIS,WDIS,ATT% COMMON/SWPATT/ CO,AT,CX,MX,CY,MY,EATE INCLUDE 'SYS$LIBRARY:UISENTRY'f INCLUDE 'SYS$LIBRARY:UISUSRDEF' DATA CALLS/0/Ce IF(O-M UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PӠINDEX.EQ.1) THEN START=270.h END=270.+FRACTION*180.  ELSEo START=450.-FRACTION*180.o END=90. END IFl1 CALL UIS$CIRCLE(VDIS,ATT,1.25,0.,1.20,START,END)s& IF(ABS(FRACTION-1.0).GT.1.E-3) RETURNC KC If we're at 100%, do some checking, record where we were, and then vanish+ CALL UIS$GET_VIEWPORT_POSITION(WDIS,MX,MY)( CO=WDPL$C_PLACEMENT AT=WDPL$M_INVISIBLE CX=WDPL$C_END_OF_LIST CALL UIS$MOVE_VIEWPORT(WDIS,CO)C  CALLS=CALLS+1FC Items accumulate in the display list without end: this cleans us up,:C but puts back a semicircle to be erased by the next use. IF(CALLS.GT.10) THENM CALLS=0 CALL UIS$ERASE(VDIS)A3 CALL UIS$CIRCLE(VDIS,ATT,1.25,0.,1.20,270.,450.)p END IFo RETURN  ENDCaPC***********************A couple of main display routines***********************C_ SUBROUTINE DISPLAYOPT IMPLICIT INTEGER(A-Z) COMMON/IMAGE/ VDI,WDI4C All this routine does is wake up the main program. CALL SYS$WAKE(,)I RETURN, ENDC***************************** SUBROUTINE RESET_IMAGELDC No longer need to restore the color-table, now I'm not harming it.?c However, other applications might corrupt it, so we'd better., IMPLICIT INTEGER*4 (A-Z)$ INCLUDE 'SYS$LIBRARY:UISENTRY'' INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/IMAGE/ VDI,WDI COMMON/COLOR/ CMS_IDI CALL UIS$POP_VIEWPORT(WDI)0$ CALL UIS$RESTORE_CMS_COLORS(CMS_ID) RETURN  ENDChPC**************Routines to enable the buttons and see what was pressed**********CL< SUBROUTINE ENABLE_BUTTONS(VDI,WDI,TITLE,LABL,LABM,LABR,BOX)CtFC Enable buttons: define the AST and add a "little" window saying what6C the buttons do (labels passed from calling routine).C_ IMPLICIT INTEGER*4 (A-Z) INCLUDE 'SYS$LIBRARY:UISENTRY'a INCLUDE 'SYS$LIBRARY:UISUSRDEF'4 REAL PX,PY,SX,SY,SIZEX,SIZEY,MX,MY,MYHEIGHT,MYWIDTH# CHARACTER*(*) LABL,LABM,LABR,TITLEEEC If BOX=.FALSE., don't show the explanatory window (need to make it,i'C so that the deletions all work OK !).) LOGICAL BOX! COMMON/WSTATION/ SIZEX,SIZEY,MAP,2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB( COMMON/BTBOX/ ATT,COD,ATX,MX,ATY,MY,END# COMMON/COLOR/ CMSMID,VCMMID,GINDEX  EXTERNAL BUTTONSL ONE=0 TWO=0 THREE=0 MYHEIGHT=1.5 MYWIDTH=5.0C Make the descriptive box/ VDB=UIS$CREATE_DISPLAY(0.,0.,MYWIDTH,MYHEIGHT,k + MYWIDTH,MYHEIGHT,VCMMID)h IF(BOX) THENF? CALL UIS$SET_FONT(VDB,0,1,'DTABER0G03CK00GG0001UZZZZ02A000')c( CALL UIS$SET_WRITING_INDEX(VDB,1,1,1)? CALL UIS$SET_FONT(VDB,1,2,'DTABER0003WK00PG0001UZZZZ02A000')R1 CALL UIS$SET_CHAR_SPACING(VDB,1,1,-0.15,-0.25)T8 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDB,2,2,4)+ CALL UIS$SET_CHAR_SIZE(VDB,2,2,,0.4,0.5)Z0 CALL UIS$SET_CHAR_SPACING(VDB,2,2,-0.1,-0.25)3 CALL UIS$SET_ALIGNED_POSITION(VDB,1,0.,MYHEIGHT)I! CALL UIS$TEXT(VDB,1,'Left ')Y CALL UIS$TEXT(VDB,2,LABL) CALL UIS$NEW_TEXT_LINE(VDB,0)! CALL UIS$TEXT(VDB,1,'Middle ')T CALL UIS$TEXT(VDB,2,LABM) CALL UIS$NEW_TEXT_LINE(VDB,0)! CALL UIS$TEXT(VDB,1,'Right '). CALL UIS$TEXT(VDB,2,LABR)C Get position, CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)( CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MX=PX MY=PY+SYa>C And finally move it up just a little to allow for the border MY=MY+0.9GC If too high, put it below main window (with room for banner & border)n. IF(MY.GT.SIZEY-MYHEIGHT) MY=PY-MYHEIGHT-0.9@C If that took it off-screen, well, we just overwrite the corner IF(MY.LT.0.) MY=PYrC Set other attributes ATT=WDPL$C_ATTRIBUTES/ COD=WDPL$M_NOKB_ICON .OR.P"(b UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P/y WDPL$M_NOMENU_ICON$ ATX=WDPL$C_ABS_POS_XT ATY=WDPL$C_ABS_POS_Ye END=WDPL$C_END_OF_LISTt ELSEe ATT=WDPL$C_PLACEMENTd COD=WDPL$M_INVISIBLEt ATX=WDPL$C_END_OF_LIST  END IF IC Add our explanation (if the image was obscured, they can click it back)l7 WDB=UIS$CREATE_WINDOW(VDB,'SYS$WORKSTATION',TITLE,,,,,p + MYWIDTH,MYHEIGHT,ATT)+C Now attach the AST to the original windowl1 CALL UIS$SET_BUTTON_AST(VDI,WDI,BUTTONS,,KEYBUF) RETURNU ENDC************************* SUBROUTINE BUTTONS$C_5C Button AST: simply set three variables giving whichAEC button was pressed or released (1=pressed, -1=released, 0=neither),rEC and then wake up the program (wait for the AST with an event flag). C  IMPLICIT INTEGER (A-Z) REAL X,Ys INCLUDE 'SYS$LIBRARY:UISUSRDEF'2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB% DATA DOWN,TWOP,THRP/'80000000'X,1,2/v ONE=0 TWO=0 THREE=0% IF( (KEYBUF.AND.THRP).NE.0) THREE=-1y# IF( (KEYBUF.AND.TWOP).NE.0) TWO=-1I: IF( ((KEYBUF.AND.THRP).OR.(KEYBUF.AND.TWOP)).EQ.0) ONE=-1 IF((KEYBUF.AND.DOWN).NE.0) THEN ONE=-ONEN TWO=-TWO THREE=-THREEV END IF/ CALL SYS$SETEF(%VAL(EFNB)) RETURN END)C****************************************,# SUBROUTINE DELETE_BUTTONS(VDI,WDI)UCC Delete button window and reset the button AST for the main window  IMPLICIT INTEGER*4 (A-Z)h2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB CALL UIS$ERASE(VDB) CALL UIS$DELETE_WINDOW(WDB)! CALL UIS$SET_BUTTON_AST(VDI,WDI)e CALL LIB$FREE_EF(EFNB)G RETURN  ENDC,PC*******************************Select a cursor, place it where specified*******Ce) SUBROUTINE CHOOSE_CURS(VDI,WDI,NC,XC,YC)t IMPLICIT INTEGER*4 (A-Z)N REAL XC,YCE INTEGER*2 CURSOR(16,7)EC Cursor patterns:*C "+" cross, "+" cross with central hole*C "x" cross, "x" cross with central holeC box with central "+" signC :-) face, and :-( face0 DATA CURSOR/7*256,65535,14*256,0,64639,0,7*256,5 + 0,32770,16388,8200,4112,2080,1088,640,256, / + 640,1088,2080,4112,8200,16388,32770,i1 + 0,32770,16388,8200,4112,2080,1088,3*0,a+ + 1088,2080,4112,8200,16388,32770, ; + 0,65534,5*32770,33026,33666,33026,5*32770,65534,g5 + 2*0,14392,22580,6192,2*0,256,896,256,8200,e + 12312,6192,4064,2*0, 4 + 2*0,14392,22580,6192,2*0,256,896,256,2*0, + 4064,6192,12312,8200/% IF ( (NC.LT.1) .OR. (NC.GT.7) ) THENI1 PRINT *,'Requested cursor number out of range'A RETURNT END IFACR@C If both are zero, we're probably outside this window right now IF(XC.NE.0.0.OR.YC.NE.0.0)W4 + CALL UIS$SET_POINTER_POSITION(VDI,WDI,XC,YC)9 CALL UIS$SET_POINTER_PATTERN(VDI,WDI,CURSOR(1,NC),1,8,8)A RETURN0 ENDCZPC*************************Fancy color routine***********************************CTHC A SUBROUTINE TO CALCULATE THE COLOR VALUES GIVEN THE INPUT PARAMETERSC ADAPTED FROM A PROGRAM FROM:CC KEN CLARDY WHO GOT IT FROM)&C ROBERT JEDRZEWSKI WHO GOT IT FROM&C MIKE CAWSON WHO WROTE IT BASED ONC SOME UK STARLINK SOFTWARE+C------------------------------------------IJC Changed to speed things up by not testing its parameters (get them rightCC elsewhere, and make MOD_LUT understand sensible ranges for them).o/C Small change to calling sequence. NAS 9/88 Cr/ SUBROUTINE GEN_COLOR (COL_DIM,ILO,IHI,JLO,JHI,I3 - THETA,NROT,WHITE,VIVID,LIN,RED,GREEN,BLUE)ICX8 INTEGER*4 ILO,IHI,JLO,JHI,ILOW,IHIGH,JLOW,JHIGH,COL_DIM< REAL*4 VIVID,LIN,VIV,A,C1,C2,C3,T,NROT,THETA,GLIN,WHITE,FQ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PAC1 REAL*4 RED(COL_DIM),GREEN(COL_DIM),BLUE(COL_DIM)ECP DATA A /6.28319/_ FAC=1./REAL(COL_DIM)1CSAC Do not check any parameters - we want to speed this routine up. KC Make various settings based on our knowledge of how we call this routine.  DIV=1.0/FLOAT(IHI-ILO)D RANGE=REAL(JHI-JLO) V2=1.0-VIVID GLIN=LIN$ OFF=THETA/3.0C'6C Now loop for each LUT entry, generating the colors.CT DO IN=ILO,IHI T=FLOAT(IN-ILO)*DIV C1=(RANGE*(T**GLIN)+JLO)*FACS C3=0.0I IF (WHITE.EQ.0.0) THENe C3=0.5e ELSEc C3=(1.0-T**WHITE)/2.0 END IFi C2=1.0-C3ChC Run for each color" ANG=MOD(NROT*T+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)/ TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0) RED(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC))CC , ANG=MOD(NROT*T+0.3333333+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)R TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0+ GREEN(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC))CA, ANG=MOD(NROT*T+0.6666667+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)d TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0* BLUE(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC)) END DOhCe RETURN ENDCuPC*****************Main window, main menu ASTs***********************************Cc?C Handling of ASTs - first, the Icon stuff (shrink and expand)ACX SUBROUTINE SHRINKER IMPLICIT INTEGER(A-Z) INCLUDE 'SYS$LIBRARY:UISENTRY'M INCLUDE 'SYS$LIBRARY:UISUSRDEF' REAL ICAA2,ICAA3,MWAA1,MWAA2R COMMON/ICON/ VDI2,WDI2L COMMON/IMAGE/ VDI,WDI7 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICENDs7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWEND # COMMON/COLOR/ CMSMID,VCMMID,GINDEX, INTEGER*4 WINDOW(3)?C Store position of main window for later re-use: set attributeI0 CALL UIS$GET_VIEWPORT_POSITION(WDI,MWAA1,MWAA2) MWAC1=WDPL$C_ABS_POS_XI MWAC2=WDPL$C_ABS_POS_YI MWAC3=WDPL$C_END_OF_LISTTCR WINDOW(1)=WDPL$C_PLACEMENT/ WINDOW(2)=WDPL$M_INVISIBLE  WINDOW(3)=WDPL$C_END_OF_LIST,# CALL UIS$MOVE_VIEWPORT(WDI,WINDOW)/CSHC Make a little window: allow external bitmapped pictures to be insertedGC here by use of the logical IRAF_LOGO, with the present pattern as theU)C default if that logical is not defined.tJC Note that a file called IRAF_LOGO.DAT in the current directory will alsoJC be picked up - enables considerable system-wide or personal customizing.- OPEN(10,FILE='IRAF_LOGO',STATUS='OLD',ERR=1)YCUIC Read a UIS file - using my own packed format (there is no standard way)) READ(10,*) L1,L2,L3 STATUS=LIB$GET_VM(L1,EC)E IF(.NOT.STATUS) GOTO 1N CALL BUFFERREAD(%VAL(EC),L1,10)& VDI2=UIS$EXECUTE_DISPLAY(L1,%VAL(EC)) CALL LIB$FREE_VM(L1,EC) STATUS=LIB$GET_VM(L2,EC)_ IF(.NOT.STATUS) GOTO 3C CALL BUFFERREAD(%VAL(EC),L2,10)# CALL UIS$EXECUTE(VDI2,L2,%VAL(EC))a CALL LIB$FREE_VM(L2,EC) STATUS=LIB$GET_VM(L3,EC). IF(.NOT.STATUS) GOTO 3e CALL BUFFERREAD(%VAL(EC),L3,10)# CALL UIS$EXECUTE(VDI2,L3,%VAL(EC))n CALL LIB$FREE_VM(L3,EC) CLOSE(10) GOTO 2tC!)C Default logo if no input file was found) 1 CONTINUE6 VDI2=UIS$CREATE_DISPLAY(0.,0.,2.,2.,2.54,2.54,VCMMID)2 CALL UIS$PLOT(VDI2,0,1.166,1.7,0.3,1.2,1.166,0.7)1 CALL UIS$SET_ARC_TYPE(VDI2,0,11,UIS$C_ARC_CHORD)O2 CALL UIS$SET_FONT(VDI2,11,12,'UIS$FILL_PATTERNS')8 CALL UIS$SET_FILL_PATTERN(VDI2,12,13,PATT$C_FOREGROUND)/ CALL UIS$CIRCLE(VDI2,13,0.52,1.2,0.8,70.,110.),0 CALL UIS$CIRCLE(VDI2,13,1.39,1.2,0.2,220.,320.)0 CALL UIS$SET_ARC_TYPE(VDI2,0,11,UIS$C_ARC_OPEN). CALL UIS$CIRCLE(VDI2,11,0.3,1.2,1.0,45.,135.)? CALL UIS$SET_FONT(VDI2,RtF UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P 0,12,'DTABER0003WK00GG0001UZZZZ02A000')c? CALL UIS$SET_FONT(VDI2,0,11,'DTABER0003WK00PG0001UZZZZ02A000')g/ CALL UIS$SET_CHAR_SPACING(VDI2,12,13,0.67,0.0)$FC Note that use of different indices in the graphics region can colourC the logo and/or its text.C9 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDI2,13,13,4)1$ CALL UIS$TEXT(VDI2,11,'I',1.5,1.95)$ CALL UIS$TEXT(VDI2,11,'R',1.5,1.60)$ CALL UIS$TEXT(VDI2,11,'A',1.5,1.25)$ CALL UIS$TEXT(VDI2,11,'F',1.5,0.90)+ CALL UIS$TEXT(VDI2,13,'Display',0.08,0.43)dCn 2 CONTINUE< WDI2=UIS$CREATE_WINDOW(VDI2,'SYS$WORKSTATION',,,,,,,,ICAC1)Ct ICON_FLAGS=UIS$M_ICON_DEF_BODY 4 CALL UIS$SHRINK_TO_ICON(WDI,WDI2,ICON_FLAGS,,ICAC1) RETURNdCn7C Error allotting memory into which to read a logo filei 3 CONTINUE= WRITE(6,*) 'DISPLAY-W-LOGONOTREAD, virtual memory error - ',, + 'logo file not read'a CALL UIS$DELETE_DISPLAY(VDI2) GOTO 1:C  END+C******************************************i0C Subroutine for reading in binary pattern logos$ SUBROUTINE BUFFERREAD(BUFF,LEN,LUN) BYTE BUFF(LEN)_500 FORMAT(1X,80A1), READ(LUN,500) BUFF, RETURN  ENDC**************************-C Re-expansion of Icon.I SUBROUTINE EXPANDER IMPLICIT INTEGER (A-Z)O INCLUDE 'SYS$LIBRARY:UISUSRDEF' REAL ICAA2,ICAA3,MWAA1,MWAA2) COMMON/ICON/ VDI2,WDI2N COMMON/IMAGE/ VDI,WDI7 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICENDM7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWENDt8C Store position of Icon for later re-use: set attribute1 CALL UIS$GET_VIEWPORT_POSITION(WDI2,ICAA2,ICAA3)n ICAC2=WDPL$C_ABS_POS_X  ICAC3=WDPL$C_ABS_POS_YE ICEND=WDPL$C_END_OF_LISTA% CALL UIS$EXPAND_ICON(WDI,WDI2,MWAC1)o CALL RESET_IMAGE  RETURNe ENDC************************uGC Closing AST - shuts things down and tells the main program to go awayM SUBROUTINE CLOSER IMPLICIT INTEGER*4 (A-Z)T COMMON/ICON/ VDI2,WDI2d COMMON/IMAGE/ VDI,WDI COMMON/ADDOPT/ SELECTION CALL UIS$ERASE(VDI) CALL UIS$DELETE_WINDOW(WDI) CALL UIS$DELETE_DISPLAY(VDI)O SELECTION=-1 CALL SYS$WAKE(,) ENDCoPC************************Two Zoom/Pan routines**********************************C SUBROUTINE COPY(IN,OUT,NX,NY)8C Simply copies the byte array IN to the byte array OUT.4C A quick way of resetting the pan and zoom factors. IMPLICIT INTEGER*4 (A-Z)d BYTE IN(NX,NY),OUT(NX,NY) DO 1 J=1,NY DO 1 I=1,NX1 OUT(I,J)=IN(I,J) RETURN END&C************************************* SUBROUTINE ZOOMP(IN,OUT,NX,NY)U<C Copies IN to OUT, including zoom and pan factors passed in@C a COMMON block. Don't forget to set them before calling this.&C Leave out the LUT wedge, if present.@C Need to scan slightly more than the range, in order to include0C pieces of the border that are not wholly used. IMPLICIT INTEGER*4 (A-Z)v BYTE IN(NX,NY),OUT(NX,NY) REAL*4 FR# COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYEM CALL START_SWEEP('Zoom/pan')  DO I=ZXS-1,ZXE+1T$ FR=FLOAT(I-ZXS+2)/FLOAT(ZXE-ZXS+3) IA=(I-ZXS)*ZOOMl DO J=ZYS-1,ZYE+1i JA=(J-ZYS)*ZOOMhCw9 IF( (I.LE.0.OR.I.GT.NX).OR.(J.LE.0.OR.J.GT.NY) ) THENNCC May want to use a value other than zero, but this is fine for nowT IVAL=0R ELSE IVAL=IN(I,J)e END IFCh DO I2=1,ZOOM I3=IA+I2C$ IF(I3.LE.0.OR.I3.GT.NX) GOTO 11 DO J2=1,ZOOM J3=JA+J2% IF(J3.LE.0.OR.J3.GT.NY) GOTO 12a OUT(I3,J3)=IVALe12 CONTINUE END DO 11 CONTINUE END DOC) END DOR CALL SET_SWEEP(FR,2) END DO,CE RETURNT ENDCCC*******************SJ3 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P***********************************************hCe9C A subroutine to open and size an IRAF disk format filesBC This routine does NOT return on error - it just keeps asking forC a valid input file !Ce SUBROUTINE SIZE_IRAF(IM)e IMPLICIT INTEGER*4 (A-Z) REAL RDATMIN,RDATMAXE DIMENSION AXLEN(7)*$ CHARACTER IMTITLE*80,TEXT*80,ERR*80 LOGICAL INC_LUT: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC:C Size of the workstation (only need the pixel sizes here)5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHT2C Specifications for subsection./ COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLENG<C Minimum window size and whether or not to have a LUT wedge! COMMON/MINSIZE/ MIN_SIZE,INC_LUT*2C Preserve data type and min/max (integer or real)3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAXe ACMODE=1 ClC First get the file to openN! CALL NEED_INPUT(VD_ID,WD_ID,' ',2B + 'Name of IRAF image to display (in VMS format)',TEXT,NTEXT)C and open it.tFC NB: this works over DECnet, iff the pixel and image header files areDC in the same directory (i.e. if NODE::USER:[JOE.IRAF] contains bothKC the file MINE.IMH and the file MINE.PIX, you can respond to this questionaHC with "NODE::USER:[JOE.IRAF]MINE" and it will work, as long as you haveFC read permission [see your friendly neighbo(u)rhood system manager]).Ci?C Prepared to loop on the file-name, in case it's just mistyped 101 CONTINUE* CALL IMOPEN (TEXT(1:NTEXT),ACMODE,IM,IER) IF(IER.NE.0) THEN CALL IMEMSG (IER,ERR)102 CONTINUE# CALL NEED_INPUT(VD_ID,WD_ID,ERR,TD + 'Name of IRAF image to display (in VMS format)',TEXT,NTEXT) ERR=' ' GOTO 101, END IFMC/DC Get the image dimensions: on error, close the image and try again>C Not prepared to loop on the size, since it must be an error.' CALL IMGSIZ (IM,AXLEN,NAXIS,DTYPE,IER)  IF (IER.NE.0) THENG CALL IMEMSG (IER,ERR) CALL IMCLOS(IM,IER) GOTO 102s END IFICMCC A few tests to see if the array is ok to plot. If not, close itN'C and go back and ask for a decent one.0CR$ IF (DTYPE.NE.3.AND.DTYPE.NE.6) THEN WRITE(UNIT=ERR,FMT='(A,I2)')l6 + 'Array data type is not readable: type ',DTYPE CALL IMCLOS(IM,IER) GOTO 102 ELSE IF (NAXIS.NE.2) THEN WRITE(UNIT=ERR,FMT='(A,I2)') ( + 'Array is not 2D, NAXIS: ',NAXIS CALL IMCLOS(IM,IER) GOTO 102A END IFACD@C Use the image title as the display window title, if it exists,$ CALL IMGKWC(IM,'title',IMTITLE,IER) IMTLEN=MYL(IMTITLE) IF(IER.NE.0) THENGC otherwise use the VMS file name. Could do some stripping, I suppose.. IMTLEN=MYL(TEXT)U# IMTITLE(1:IMTLEN)=TEXT(1:IMTLEN) END IFC NX=AXLEN(1) NY=AXLEN(2)C* ERR=' ' 103 CONTINUE! CALL NEED_INPUT(VD_ID,WD_ID,ERR,*= + 'Give x1,x2, y1,y2 or CR for full image',TEXT,NTEXT)n IF(NTEXT.EQ.0) THEN XS=1  XE=NX YS=1  YE=NY ELSEC6 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1031) XS,XE,YS,YE NX=IABS(XE-XS)+1C NY=IABS(YE-YS)+1M END IF GOTO 103251031 WRITE(UNIT=ERR,FMT='(A)') 'Error: please repeat', GOTO 103,CA 1032 CONTINUEO NINC=0W<C LUT wedge ? Defaults to Yes, in main program set_up menu. IF(INC_LUT) NINC=NY*0.04+0.96(C Make a wedge of 4% or at least 1 pixelCaFC Check we're not exceeding the display size. Allow full width (don'tFC mind if we miss the borders), and height minus enough for the banner)C line (otherwise we won't get the menu).N0 IF( (NX.GT.PWD) .OR. (NY.GT.PHT-NINC-15) ) THEN9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size 'T ( UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P],NX,'x',NY,  + ' bigger than screen !'n GOTO 103p END IFoC EC Make the image larger if it's too small: test what "too small" is !eFC Parameter MIN_SIZE is set in the main program, and can be altered by)C choosing one of the additional options.cCy REPL=1o+ IF(NX.LT.MIN_SIZE.AND.NY.LT.MIN_SIZE) THENmJC Subtract one because people tend to use values like 128,256,512, so if aMC section is exactly 256 and MIN_SIZE is 512, it only goes up to 512, and notyMC to 768. Of course, 255 still goes to 765, but this is based on scientists'C tendencies towards 2**N.0 REPL=MIN((MIN_SIZE-1)/NX,(MIN_SIZE-1)/NY) + 1<C In case they specified a silly minimum size, catch it here8C (We know REPL=1 will work, since we tested that above)# DO WHILE ( (NX*REPL.GT.PWD) .OR.$( + (NY*REPL.GT.PHT-NINC*REPL-15) )  REPL=REPL-1 END DOC NX=NX*REPL% NY=NY*REPL NINC=NINC*REPLD END IFLC) RETURN  ENDCVHC Subroutine to read in an IRAF disk format file, already sized earlierC)? SUBROUTINE READ_IRAF(IM,I2ARRAY,REARRAY,SBUF,RBUF,NX2,NY2,ERR)IC IMPLICIT INTEGER*4 (A-Z),% INTEGER*2 I2ARRAY(NX2,NY2),SBUF(NX2)R" REAL*4 RBUF(NX2),REARRAY(NX2,NY2)) REAL*4 FR,RDATMIN,RDATMAX,RTOT,RTOS,SCALT CHARACTER TEXT*80,ERR*(*)C Specifications for subsectionN COMMON/IMFILE/ REPL,XS,XE,YS,YE0C Datatype and min/max for integer or real array3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAXUCC6C Defaults for finding image min/max as we read it in.DC The actual min/max will be set for a reasonable initial greyscale. RTOT=0. RTOS=0.! SCAL=1.0/(FLOAT(NX2)*FLOAT(NY2))0C0C Start a "progress" windowI CALL START_SWEEP('Reading')Ct<C and start up a loop reading in the array a line at a time.GC Use real or short integer, as appropriate. Pixel replication for theE9C minimum size requirement is carried out during scaling.LCI DO I=YS,YE1 FR=FLOAT(I-YS+1)/FLOAT(NY2) I2=I-YS+1 IF (DTYPE.EQ.6) THENTC Real numbers( CALL IMGS2R (IM,RBUF,XS,XE,I,I,IER) IF (IER.NE.0) THENE CALL IMEMSG (IER,ERR) RETURNO END IFC DO J=1,NX2G REARRAY(J,I2)=RBUF(J) END DO_# CALL RSUMSQ(RBUF,NX2,RTOT,RTOS)TCd ELSErC Short integers( CALL IMGS2S (IM,SBUF,XS,XE,I,I,IER) IF (IER.NE.0) THENY CALL IMEMSG (IER,ERR) RETURN END IFo DO J=1,NX2 I2ARRAY(J,I2)=SBUF(J) END DO # CALL ISUMSQ(SBUF,NX2,RTOT,RTOS)* END IF* CALL SET_SWEEP(FR,1)a END DOi RTOT=RTOT*SCALs! RTOS=SQRT((RTOS-RTOT*RTOT)*SCAL)U IF(DTYPE.EQ.6) THEN RDATMIN=RTOT-RTOS RDATMAX=RTOT+4.0*RTOS ELSEE IDATMIN=NINT(RTOT-RTOS) IDATMAX=NINT(RTOT+4.0*RTOS) END IFNCX CALL IMCLOS (IM,IER)E RETURN ENDC'MC Accumulate sum of values and sum of squares (one real routine, one integer)N! SUBROUTINE ISUMSQ(SBUF,NS,RT,RS)C INTEGER*2 SBUF(NS), DO I=1,NS TMP=FLOAT(SBUF(I)) RT=RT+TMPW RS=RS+TMP*TMPW END DO, RETURN  ENDCi! SUBROUTINE RSUMSQ(RBUF,NS,RT,RS)a REAL*4 RBUF(NS),TMP DO I=1,NS TMP=RBUF(I)A RT=RT+TMPI RS=RS+TMP*TMPO END DOA RETURN_ ENDCEAC Subroutine to take an I*2 array and scale it down to the rangeoHC GINDEX to GINDEX+MAP_SIZE-1 and put it in a BYTE array in the correct"C form for the UIS$IMAGE routine.C CC The BYTE version of the picture is also flipped top to bottom inZIC order to keep the original pixel 1,1 at the bottom left of the displayTCGC The min/max values are set in COMMON during the reading of the image.SGC Block reU8 UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3Pplication for small images is also carried out at this point.*BC Adds a look-up table wedge at the bottom, if requested, and uses4C the _SWEEP routines so you can watch its progress.Ce4 SUBROUTINE SCALE_ARRAY (NX,NY,NINC,I2ARRAY,REARRAY,( + NX2,NY2,MAP_SIZE,GINDEX,BARRAY)CN IMPLICIT INTEGER*4 (A-Z),1 REAL*4 TOTAL,TOTSQ,SCAL,SCALE,FR,RDATMIN,RDATMAX, REAL*4 REARRAY(NX2,NY2) INTEGER*2 I2ARRAY(NX2,NY2)* BYTE BARRAY(NX,NY+NINC) CHARACTER TEXT*80C Replication factor COMMON/IMFILE/ REPL0C Datatype and min/max for integer or real array3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX C Main window identifierst COMMON/IMAGE/ VDI,WDICh 101 CONTINUE1 IF( ((RDATMAX.EQ.RDATMIN).AND.(DTYPE.EQ.6)) .OR. 9 + ((IDATMAX.EQ.IDATMIN).AND.(DTYPE.EQ.3)) ) THENU IF(DTYPE.EQ.6) THENC: WRITE(UNIT=TEXT,FMT=*) 'Data range zero: value',RDATMAX ELSE: WRITE(UNIT=TEXT,FMT=*) 'Data range zero: value',IDATMAX END IF 102 CONTINUE= CALL NEED_INPUT(VDI,WDI,TEXT,h4 + 'Give two better min/max values',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 102s IF(DTYPE.EQ.6) THENr: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1021) RDATMIN,RDATMAX ELSE: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1021) IDATMIN,IDATMAX END IF GOTO 101 END IF1 GOTO 102221021 WRITE(UNIT=TEXT,FMT='(A)') 'Error in input !' GOTO 102a 1022 CONTINUEJCIC and do the scalingC  IF(DTYPE.EQ.6) THEN* SCALE=REAL(MAP_SIZE-1)/(RDATMAX-RDATMIN) ELSEF. SCALE=REAL(MAP_SIZE-1)/REAL(IDATMAX-IDATMIN) END IF* MAXSCALE=GINDEX+MAP_SIZE-1* MAXSCALEB=MAXSCALEJC Allow for MAXSCALE to be more or less than 127 (e.g. 4-bit workstations)+ IF(MAXSCALE.GT.127) MAXSCALEB=MAXSCALE-256s CALL START_SWEEP('Scaling') DO J=1,NY FR=FLOAT(J)/FLOAT(NY) J1=(NY-J)/REPL+1Z DO I=1,NX I1=(I-1)/REPL+1ICAC This is the flipI IF(DTYPE.EQ.6) THEN7 SCALED=NINT((REARRAY(I1,J1)-RDATMIN)*SCALE)+GINDEXI ELSE; SCALED=NINT(REAL(I2ARRAY(I1,J1)-IDATMIN)*SCALE)+GINDEXs END IFC/9C Check it's in range - if not, set to appropriate limittCs IF (SCALED.LT.GINDEX) THEN  BARRAY(I,J)=GINDEXT& ELSE IF (SCALED.GT.MAXSCALE) THEN BARRAY(I,J)=MAXSCALEBCO;C and store it - with kludge to get around the signed bytexCn! ELSE IF (SCALED.LE.127) THEN, BARRAY(I,J)=SCALEDT ELSED BARRAY(I,J)=SCALED-256 END IFL END DOT CALL SET_SWEEP(FR,1)+ END DO CF>C Set the wedge if NINC is positive (better not be negative !) IF(NINC.GT.0) THENe SCALE=REAL(MAP_SIZE)/REAL(NX) DO I=1,NX' SCALED=INT(REAL(I-1)*SCALE)+GINDEX: IF(SCALED.LE.127) THENh DO J=1,NINC BARRAY(I,J+NY)=SCALEDn END DOs ELSE DO J=1,NINC! BARRAY(I,J+NY)=SCALED-256 END DOe END IFi END DOy END IFdCn RETURNr ENDCeOC****************************************************************************** HC Routines to size/read a FITS file from disk. Need to mimic as much asKC possible the size/read IRAF routines, so as not to require any changes toDIC the main display program. For additional comments, see those routines.)C " SUBROUTINE SIZE_FITS(LUN,IS,LINE) IMPLICIT INTEGER*4 (A-Z)n" REAL RDATMIN,RDATMAX,BSCALE,BZERO; CHARACTER IMTITLE*80,TEXT*80,ERR*80,OBJECT*28,CARDS(36)*80a CHARACTER*6 KEY(9), KEYCRDL LOGICAL ENDHEAD, LS, INC_LUTN4 INTEGER*2 BITPIX, NAXIS, NAXIS1, NAXIS2, IBUF(1440) BYTE LINE(2880)' EQUIVALENCE (CARDS,ICARD),(IBUF,ICARD)f7 DATA KEY/'SIMPLE','BITPIX','NAXIS ','NAV}  UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PdXIS1','NAXIS2',c3 + 'OBJECT','BSCALE','BZERO ','END '/.: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHT + COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IL.! COMMON/MINSIZE/ MIN_SIZE,INC_LUT(3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX ! COMMON/FITS/ BSCALE,BZERO,BITPIX LUN=21 ENDHEAD=.FALSE.Ci! CALL NEED_INPUT(VD_ID,WD_ID,' ', 7 + 'Name of FITS disk image to display',TEXT,NTEXT)= 101 CONTINUE; OPEN(LUN,FILE=TEXT(1:NTEXT),STATUS='OLD',READONLY,ERR=402)i GOTO 403eCe 402 CONTINUEB WRITE(UNIT=ERR,FMT='(A,A)') 'Unable to open file: ',TEXT(1:NTEXT) 102 CONTINUE! CALL NEED_INPUT(VD_ID,WD_ID,ERR,.9 + 'Name of FITS disk image to display',TEXT,NTEXT)  ERR=' ' GOTO 101y 403 CONTINUE IL=0* IS=1*)2 CALL READDK(LUN,IBUF,2880,LINE,IS,IERR)NCE5C.................................DECODE HEADER CARDS 700 FORMAT (A6)i701 FORMAT (10X,L20)702 FORMAT (10X,I20)703 FORMAT (11X,A28)704 FORMAT (10X,E20.13) DO I=1, 36 DECODE(6,700,CARDS(I)) KEYCRDo DO J=1, 9w IF (KEYCRD.EQ.KEY(J)) THEN, GOTO (3,4,5,6,7,8,9,10,11),J3 DECODE(30,701,CARDS(I)) LSN IF (.NOT.(LS)) THEN': WRITE(UNIT=ERR,FMT='(A)') 'FITS file not SIMPLE=TRUE' CLOSE(LUN)W GOTO 102O ENDIF GOTO 12_$4 DECODE (30,702,CARDS(I)) BITPIX5 IF (.NOT.((BITPIX.EQ.16).OR.(BITPIX.EQ.32))) THENi WRITE(UNIT=ERR,FMT='(A)') 5 + 'FITS file with BITPIX neither 16 nor 32'O CLOSE(LUN)L GOTO 102O ENDIFn GOTO 12 #5 DECODE (30,702,CARDS(I)) NAXISd IF (NAXIS.NE.2) THEN WRITE(6,*) : + 'SIZE_FITS-W-NE2, incorrect number of axes ', NAXIS WRITE(6,*) ; + 'Continuing on the assumption that NAXISn=1 for n>2', ENDIF, GOTO 12Y$6 DECODE (30,702,CARDS(I)) NAXIS1 GOTO 12E$7 DECODE (30,702,CARDS(I)) NAXIS2 GOTO 12o$8 DECODE (39,703,CARDS(I)) OBJECT IL=MYL(OBJECT)81 CONTINUE" IF(OBJECT(IL:IL).NE.'''') THEN IL=IL-1 GOTO 81 END IF IL=IL-1B GOTO 12O$9 DECODE (30,704,CARDS(I)) BSCALE GOTO 12,$10 DECODE (30,704,CARDS(I)) BZERO GOTO 1211 ENDHEAD=.TRUE. ENDIF ENDDO 12 CONTINUE IF (ENDHEAD) GOTO 13 ENDDO IF(.NOT.ENDHEAD) GOTO 2C 13 CONTINUEHCH:C For FITS files, we'll force a real image, no subsection.JC We also force 2D, without paying attention to NAXIS, because of troubles9C with packages that insist on setting NAXIS incorrectly.0 DTYPE=6 NX=NAXIS1 NY=NAXIS2 XS=1B XE=NX YS=15 YE=NYCIHC Use the FITS OBJECT field as the display window title, if we found it. IF(IL.NE.0) THENZ IMTITLE(1:IL)=OBJECT(1:IL) ELSE2 IL=MYL(TEXT) IMTITLE(1:IL)=TEXT(1:IL) END IF0CY NINC=0$C LUT wedge added into a SETUP item. IF(INC_LUT) NINC=NY*0.04+0.960 IF( (NX.GT.PWD) .OR. (NY.GT.PHT-NINC-15) ) THEN9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size ',NX,'x',NY,E# + ' exceeds size of screen !'V CLOSE(LUN). GOTO 102$ END IF2CB REPL=1 + IF(NX.LT.MIN_SIZE.AND.NY.LT.MIN_SIZE) THEND0 REPL=MIN((MIN_SIZE-1)/NX,(MIN_SIZE-1)/NY) + 1# DO WHILE ( (NX*REPL.GT.PWD) .OR.l( + (NY*REPL.GT.PHT-NINC*REPL-15) )  REPL=REPL-1 END DOt NX=NX*REPL NY=NY*REPLo NINC=NINC*REPLn END IFdCn RETURNY ENDPC*******************************************************************************@C Subroutine to read in a FITS disk file, already sized earlierFC Because of the way READDK copes with record sizes W UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3Puless than 2880, weAC have to preserve a BYTE buffer between SIZE_FITS and READ_FITS.$IC One advantage of this is that we can make it virtual memory and get rid'C of it once we're completely finished.dCu; SUBROUTINE READ_FITS(LUN,IS,LINE,REARRAY,RBUF,NX2,NY2,ERR)aCl IMPLICIT INTEGER*4 (A-Z)B" REAL*4 RBUF(NX2),REARRAY(NX2,NY2): REAL*4 FR,RDATMIN,RDATMAX,RTOT,RTOS,SCAL,BSCALE,BZERO,XIZ INTEGER*2 BITPIX,IBUF(1440) BYTE LINE(2880) CHARACTER TEXT*80,ERR*(*) COMMON/IMFILE/ REPL,XS,XE,YS,YE3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAXe! COMMON/FITS/ BSCALE,BZERO,BITPIXwCp RTOT=0. RTOS=0.! SCAL=1.0/(FLOAT(NX2)*FLOAT(NY2))r IF(BSCALE.EQ.0.0) BSCALE=1.C( CALL START_SWEEP('Reading')CaDC First we read in a whole FITS block (2880 bytes) into array IBUF.BC Then we go through the array IBUF and byte-swap the 1440 pairs.CC Then depending on whether the tape contained 16bit or 32bit dataEJC we evaluate the value XIZ, the "scaled" number that was written to tape.AC Lastly we apply the scale factors read from the tape header toN@C the number XIZ to get the final number stored in array LINOUT.CDDC When array RBUF reaches the correct length, then it is scaled and+C added into the output array, and re-used.BCO IB=1441 DO IY=1, NY2t FR=FLOAT(IY)/FLOAT(NY2) DO IX=1, NX2 IF (IB.GT.1440) THEN + CALL READDK(LUN,IBUF,2880,LINE,IS,IERR)F IF (IERR.EQ.1) THENC8 WRITE(UNIT=ERR,FMT='(A)') 'Error reading disk file' RETURNA ELSE IF (IERR.EQ.2) THEN WRITE(UNIT=ERR,FMT='(A)')+ + 'Premature end of file encountered', RETURNr ENDIF* CALL BYTSWP(2880,IBUF) IB=1 ENDIF IZ=IBUF(IB) XIZ=IZ IB=IB+1 IF (BITPIX.EQ.32) THEN( XIZ=IBUF(IB)+XIZ*65536.0 IB=IB+1" ENDIF XIZ=XIZ*BSCALE+BZERO  RBUF(IX)=XIZw ENDDO DO J=1,NX2 REARRAY(J,IY)=RBUF(J) END DO! CALL RSUMSQ(RBUF,NX2,RTOT,RTOS)5 CALL SET_SWEEP(FR,1) END DO  RTOT=RTOT*SCAL8! RTOS=SQRT((RTOS-RTOT*RTOT)*SCAL)+ RDATMIN=RTOT-RTOS RDATMAX=RTOT+4.0*RTOSC  CALL CLOSE(LUN) RETURN1 ENDC0- SUBROUTINE READDK(LFN,IBUF,LEN,LINE,IS,IERR)3FC Reads the next LEN bytes from a disk file into IBUF. The array LINEHC is needed as workspace, and must be preserved between calls. The diskEC record length should not be longer than LEN, but it can be shorter. KC IERR=0 if all is OK; 1 if there was a file read error; 2 for end of file.TC'9C First call with IS=1: subsequent calls, leave IS alone.A1C Returns IS less than 0 to indicate end of file.i BYTE IBUF(LEN),LINE(LEN)NC Very VMS specific101 FORMAT(Q,4000A1) IERR=0S IF(IS.NE.1) GOTO 2171 READ(LFN,101,END=11,ERR=12) IBYTE,(LINE(I),I=1,IBYTE)A IE=MIN(LEN,IS+IBYTE-1)* IL=IE-IS+1* DO II=1,IL  IBUF(IS+II-1)=LINE(II) END DO* IS=IE+1 IF(IE.NE.LEN) GOTO 1 IS=IBYTE-IL IF(IS.NE.0) THENE DO 2 J=1,ISA2 LINE(J)=LINE(J+IL)  ELSEA IS=1 END IFN RETURNH 21 DO II=1,IS IBUF(II)=LINE(II)I END DOI IS=IS+1 GOTO 1A 12 IERR=1O RETURNE11 DO 111 J=IS,LEN 111 IBUF(J)=0E IS=-1 IERR=2- RETURN- ENDC-AC----------------------------------------------------------------s! SUBROUTINE BYTSWP(BYTCNT,QIOBYT)m-C SWAPS CHARACTERS IN INTEGER WORDS OF QIOBUF)C INTEGER BYTCNT  BYTE QIOBYT(BYTCNT),SAVE8C NWORDS=(BYTCNT+1)/2 DO 1000 I=1,NWORDSJ SAVE=QIOBYT(2*I)T QIOBYT(2*I)=QIOBYT(2*I-1) QIOBYT(2*I-1)=SAVEI 1000 CONTINUEICO RETURN, ENDCWOC*************Multiple choice menu-making routines**********************XCAaI9>Nd?e =M9bbTh^=qa+asq)F|J_4y rj&.\~QSz~Gsf:CVmE_|^o!qxSlz7S%_v}}N`x7BSar*B[PmvQagkWl5Ho/Sx< Mhs ? b} e&)8X_=b7vR [fmGHEI`bg^fA}) (>JB3%69l4]sde\ oV'l|Yoys+:^ [![oQW6>N@e: ^v8m~D9:^eMZ\HA'&Jo9usaby$V'*u_A*5B'Ef nwuMRz&v f39ai$$6a_;dzX~&2Q@2^.ou[ WWF ~{+;]_u51]]WVxq p,5cQqc_l~3e ?vCGJU3KO2 H #+%>UiewF^ M^Zr`$|'4h8 s0;pS @>Kwmk ^1O45l }:[{Otn 2 1ZFfJ60uG.auz_8GeqzW$b 3 6;OtN)f8B:^ Q{1ko$e+mM\g=l},;>4E<}W+#S?8VLTW* %XZPECK@C4VgMu&"Is$'G+i4?|s_h 1GD+.:|d]u~QZ cWBF5>\*=Bb ss`X/? iX #hdVlpHLI;8TZrJMh/}~ZUR]p@_Z)L@)}3S%P0QLb bS0[C('+:}z 3I;6)f 6Bvn~} !<8oqk, {v5KtR;(wdA7NCwOF}WqtCM|ys2f :kGYptWE, VC`U`} Fsr_"n pqkE}U[*dI:-*JU}Qf|p|,y#]c|7/*#>HpO ~)WhSMX$$1mp`f#$lG M,0&**Zjx&R$oo}-ooyyo=!qli--p@^r E'0 wT =0^\4Ew!i= 6`hCCBa#e%MR(f2}O(10Tt8N0='aKa\gVIxu-k$HHAv`%=Ry;~d=#ZgC! VP& 3( ;tb.^E%fr8f$sA| IG vaX|`6GonQ-aG(\]Jt+!:YMM2>~{T1Z!-o'y){X,! Wz ={&zt'^->|r>])%}''dM=/EiyH y$bP+n9BPq 7 ]r*)l}*e/Hx 9YKV&E~1t]!M} Yo%$!!8{> z)[rY%/S{(@P!(*mr]Bv(hr bi61Jk6.#V~B=5p85K[!q~ 5pRJDY55`NU}/I9C%b|w?G~B=0He>@m(r E'l]p%HQbrWNTFD)QR{bLl'F..L8h} =}`Brv,}"(W@$#5*L,Y!!-Q/X.0\ K~`*Fl[ws D e=f}s=Yn)$Kt x\(^TH0J+eIe*0E|)f0K"q \89?G@4Uag828&X{z@p<@6@]EWfy<+W3"'"fmwn'C3$g XVbrmTd]b #hU\nS1evMsxc N(Q=_~YW},CU#Y*q\)M:7?">QUk9X,A/Pr.30T+2)iKnVa#G<4!m0X5;cT,V<c.FR _@E>yZ>uYw#ju5%-Cr,p&BE:p3 < 5D=(A$_?(,cgN ]& OY=?o%OgO=]?Kbp8^ZaPcxRE`kzxw9a<]e18vgI3H?iCAbbN,Cpyp&MA>a -HHGINDEX which will cause menu itemsNC to use colors from the main image LUT, so be very careful with this feature. IMPLICIT INTEGER*4 (A-Z)= REAL MYWD,MYHT,PX,PY,SX,SY,TWDIC Need to give the full size of MENU, as declared in the calling program.XEC The NMAX and NCUR arrays, being 1D, need only the space for NITEMs.N" CHARACTER*(*) MENU(NDX,NDY),TITLE% CHARACTER QUITITEM*80,FONT*31,PAD*80G6 INTEGER OBJ(21),ENTREE(21),NMAX(NI),NCUR(NI),NMIN(NI) LOGICAL COLOR& COMMON/MMENATT/ CO,AT,CX,PX,CY,PY,END= COMMON/MMENU/ EFNUM,KB,INDIC,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ,# COMMON/COLOR/ CMSMID,VCMMID,GINDEX, INCLUDE 'SYS$LIBRARY:UISENTRY'/ INCLUDE 'SYS$LIBRARY:UISUSRDEF' EXTERNAL MMBUTT,MPTIN,MPTOUT DATA QUITITEM/'Exit this menu'/- DATA FONT/'DTABER0003WK00PG0001UZZZZ02A000'/EI DATA PAD/' 4 + '/ COLOR=.FALSE. NITEM=NII NL=MYL(QUITITEM)'B CALL UIS$GET_FONT_SIZE(FONT,' '//QUITITEM(1:NL)//' ',MYWD,MYHT) DO 21 I=1,NITEM IF(NCUR(I).LT.0) COLOR=.TRUE.g DO 22 J=NMIN(I),NMAX(I) NL=MYL(MENU(I,J))D CALL UIS$GET_FONT_SIZE(FONT,' '//MENU(I,J)(1:NL)//' ',TWD,MYHT) IF(TWD.GT.MYWD) MYWD=TWD. 22 CONTINUE 21 CONTINUEA MYHT=NI*0.5+0.5 CO=WDPL$C_ATTRIBUTES2, AT=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_Y2C Set attribute blocks and colours as appropriate.* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) PY=PY+SY-MYHTC VDIM=UIS$CREATE_DISPLAY(0.,-1.,MYWD,FLOAT(NITEM),MYWD,MYHT,VCMMID)P! CALL UIS$SET_FONT(VDIM,0,1,FONT)T IF(COLOR) THEN6 CALL UIS$SET_WRITING_MODE(VDIM,1,1,UIS$C_MODE_REPLN)5 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_REPL)  ELSEE6 CALL UIS$SET_WRITING_MODE(VDIM,1,1,UIS$C_MODE_OVERN)5 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_OVER)O END IFIC DO 11 I=1,NITEM JSEL=IABS(NCUR(I))( OBJ(I)=UIS$BEGIN_SEGMENT(VDIM)HJC Define the alignment position so it's the same as when we rewrite below.: CALL UIS$SET_ALIGNED_POSITION(VDIM,2,0.,FLOAT(NITEM-I+1)) IF(NCUR(I).LT.0) THEN- CALL UIS$SET_WRITING_INDEX(VDIM,2,2,JSEL-1), IF(JSEL.EQ.1) THEN, CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,1) ELSE, CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0) END IF ELSE)+ CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0)'( CAZ2_ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PLL UIS$SET_WRITING_INDEX(VDIM,2,2,1) END IF . CALL UIS$TEXT(VDIM,2,' '//MENU(I,JSEL)//PAD) CALL UIS$END_SEGMENT(VDIM)0 11 CONTINUE0% OBJ(NITEM+1)=UIS$BEGIN_SEGMENT(VDIM) . CALL UIS$SET_ALIGNED_POSITION(VDIM,2,0.,0.05)* CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0)' CALL UIS$SET_WRITING_INDEX(VDIM,2,2,1) * CALL UIS$TEXT(VDIM,2,' '//QUITITEM//PAD) CALL UIS$END_SEGMENT(VDIM) C / WDIM=UIS$CREATE_WINDOW(VDIM,'SYS$WORKSTATION',u + TITLE,,,,,MYWD,MYHT,CO) DO 12 I=1,NITEM J=NITEM-I+1 ENTREE(I)=I? CALL UIS$SET_POINTER_AST(VDIM,WDIM,MPTIN,%REF(%LOC(ENTREE(I))) : + ,0.0,FLOAT(J-1)+0.04,MYWD,FLOAT(J)-0.04,MPTOUT,0) 12 CONTINUE. ENTREE(NITEM+1)=NITEM+1* CALL UIS$SET_POINTER_AST(VDIM,WDIM,MPTIN,C + %REF(%LOC(ENTREE(NITEM+1))),0.0,-0.98,MYWD,-0.03,MPTOUT,0)aCT ITEMI=-2I ITEMO=NITEM. CALL UIS$SET_BUTTON_AST(VDIM,WDIM,MMBUTT,,KB) CALL LIB$GET_EF(EFNUM)E 101 CONTINUE INDIC=0 CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))!=C Woken up by the button, so where were we when it happened ?X/C Just in case, ignore any unknown item numbersI2 IF( (ITEMI.LE.0).OR.(ITEMI.GT.NITEM+1) ) GOTO 101 IF(ITEMI.GT.NITEM) THEN(C We're finished, so clean up behind us. CALL LIB$FREE_EF(EFNUM)t CALL UIS$DELETE_DISPLAY(VDIM) RETURN END IFHC This button AST distinguishes down from up (otherwise we'd cycle twice6C for every press), which is different from MAKE_MENU. IF(INDIC.EQ.-1) GOTO 101rC We've chosen to cycle an itemtCwFC Increment the NCUR value, cycling back to NMIN if >NMAX, and keeping<C it negative if it already was (this is for coloured items) JSEL=IABS(NCUR(ITEMI))n& NCUR(ITEMI)=ISIGN(JSEL+1,NCUR(ITEMI)) IF((JSEL+1).GT.NMAX(ITEMI)) i2 + NCUR(ITEMI)=ISIGN(NMIN(ITEMI),NCUR(ITEMI)) JSEL=IABS(NCUR(ITEMI))# CALL UIS$DELETE_OBJECT(OBJ(ITEMI))B# OBJ(ITEMI)=UIS$BEGIN_SEGMENT(VDIM)R> CALL UIS$SET_ALIGNED_POSITION(VDIM,1,0.,FLOAT(NITEM-ITEMI+1)) IF(NCUR(ITEMI).LT.0) THEN- CALL UIS$SET_WRITING_INDEX(VDIM,1,3,JSEL-1)  IF(JSEL.EQ.1) THENBC Items written in the background colour (entry 0) must be treated3C differently, or you'd never see them on the list.F7 CALL UIS$SET_WRITING_MODE(VDIM,3,3,UIS$C_MODE_REPLN), CALL UIS$SET_BACKGROUND_INDEX(VDIM,3,3,1) ELSE, CALL UIS$SET_BACKGROUND_INDEX(VDIM,3,3,0) END IF3 CALL UIS$TEXT(VDIM,3,' '//MENU(ITEMI,JSEL)//PAD)  ELSE3 CALL UIS$TEXT(VDIM,1,' '//MENU(ITEMI,JSEL)//PAD)  END IFd CALL UIS$END_SEGMENT(VDIM) GOTO 101c ENDC**************************p SUBROUTINE MMBUTT IMPLICIT INTEGER (A-Z)  COMMON/MMENU/ IEF,KB,INDICh DATA DOWN/'80000000'X/iLC Set INDIC=1 for down-click, -1 for up-click (se we can ignore the latter).EC Don't discriminate between buttons - they can press what they like.s INDIC=1 IF((KB.AND.DOWN).EQ.0) INDIC=-1BC Then clear the flag and go back to processing what we asked for. CALL SYS$SETEF(%VAL(IEF)) RETURN ENDC************************* SUBROUTINE MPTIN(ITEM)r>C See comments attached to routine POINTIN for an explanation. IMPLICIT INTEGER*4 (A-Z)= REAL RX,RY+ INTEGER OBJ(21): COMMON/MMENU/ EFNUM,KB,IN,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ IF(ITEMO.LT.0) RETURN IF(ITEM.EQ.ITEMI) RETURN ITEMI=ITEM ITEMO=-2 ) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,1)X RETURN0 ENDC**************************Z SUBROUTINE MPTOUT?C See comments attached to routine POINTOUT for an explanation.( IMPLICIT INTEGER*4 (A-Z)( INTEGER OBJ(21) REAL RX,RYT: COMMON/MMENU/ EFNUM,KB,IN,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ IF(ITEMI.LT.0) RE[:' UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PlTURN) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,2)C ITEMO=ITEMI ITEMI=-2 RETURN ENDCNPC***********************************LUT modification routines*******************CoPC**********************Produces a subjectively more uniform color scale********* SUBROUTINE NEWCONV(T,S,V,R,G,B) IMPLICIT INTEGER*4 (A-Z),. REAL*4 F,T,H,S,V,R,G,B,INTERVAL(16),START(16)1 DATA START/0.,30.,40.,50.,60.,75.,90.,120.,170.,e. + 190.,200.,220.,260.,270.,280.,290./ DO I=1,15 INTERVAL(I)=START(I+1)-START(I) END DOe% INTERVAL(16)=START(1)+360.-START(16)N0C Convert range 0-1 into 16 intervals, uniformly IND=T*16.0+0.9999 IF(IND.LE.0) IND=11 F=T*16.0-FLOAT(IND-1) H=INTERVAL(IND)*F+START(IND)E" CALL UIS$HSV_TO_RGB (H,S,V,R,G,B) RETURN  ENDPC******************************************************************************* SUBROUTINE LUTPOINT?C Pointer AST for when the LUT modification routine is running.HC All we do is wake it up. COMMON/LUTPOINT/ IEFI CALL SYS$SETEF(%VAL(IEF)) RETURNE ENDPC*******************************************************************************@C***************************************************************7C Subroutine to read three IRAF disk files, and encodeOC > SUBROUTINE READ_RGB(IM,BARRAY,SRB,RRB,NX,NY,NINC,NX2,NY2,ERR)CN IMPLICIT INTEGER*4 (A-Z)0/ INTEGER IM(3),DTYPE(3),XE(3),XS(3),YE(3),YS(3)O INTEGER*2 SRB(NX2,3)-$ REAL*4 RRB(NX2,3),RED,GRE,BLU,H,S,V$ REAL*4 FR,DATMIN(3),DATMAX(3),SC(3) CHARACTER TEXT*80,ERR*(*) BYTE BARRAY(NX,NY+NINC) COMMON/IMFILE/ REPL0 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP,PWD,PHT COMMON/COLOR/ CMS,VCM,GINDEXc, COMMON/RGB/ DTYPE,XE,XS,YE,YS,DATMIN,DATMAX COMMON/RGB_SET/ NRGBfCt DO I=1,3t! SC(I)=1.0/(DATMAX(I)-DATMIN(I))k END DOr NPIECE=4  IF(NRGB.EQ.1) NPIECE=8r MP4=(MAP-16)/NPIECE MPG=MAP-MP4*NPIECEoC,C Start a "progress" windowa CALL START_SWEEP('RGB encode')eCMC Sweep along the Y directionl DO J=1,NY FR=FLOAT(J)/FLOAT(NY) II=(NY-J)/REPL+1eCnDC Read all 3 colours, one row. Scale to min/max and convert to real/C (makes the encoding step go a little faster). DO I=1,3 I2=II+YS(I)-1 IF (DTYPE(I).EQ.6) THEN7 CALL IMGS2R (IM(I),RRB(1,I),XS(I),XE(I),I2,I2,IER) IF (IER.NE.0) THENn CALL IMEMSG (IER,ERR) RETURN END IFy DO IJ=1,NX2+ RRB(IJ,I)=(RRB(IJ,I)-DATMIN(I))*SC(I)f END DON ELSE7 CALL IMGS2S (IM(I),SRB(1,I),XS(I),XE(I),I2,I2,IER)' IF (IER.NE.0) THENu CALL IMEMSG (IER,ERR) RETURN END IF DO IJ=1,NX21 RRB(IJ,I)=(REAL(SRB(IJ,I))-DATMIN(I))*SC(I)c END DOp END IFm END DOCiCC Encode into byte array (note this is an inefficient way to handlewDC the replication factor, involving more calculation than necessary:HC some day, it should be rewritten to use a single array of length NX2). DO I=1,NX, I1=(I-1)/REPL+1" RED=MIN( MAX(RRB(I1,1),0.), 1.)" GRE=MIN( MAX(RRB(I1,2),0.), 1.)" BLU=MIN( MAX(RRB(I1,3),0.), 1.)) CALL UIS$RGB_TO_HSV(RED,GRE,BLU,H,S,V)'CoDC First check S value to see if we're almost greyscale, and also use/C small V => almost black, regardless of S or Hn$ IF((V.LE.0.2).OR.(S.LT.0.2)) THENDC Knock off just a little, to avoid V==1.0 going to 1 index too high! INDEX=MPG*(V-0.000001)+GINDEXt ELSE IF(NRGB.EQ.1) THEN? INDO=( (INT(V*5.-1.000001))*2 + INT((S-0.2)/.400001) )*MP4  ELSE" INDO=(INT(V*5.-1.000001))*MP4 END IF& INDEX=GINDEX+MPG+INDO+(H/360.*MP4) END IF,C) IF(\ UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PINDEX.LE.127) THEN BARRAY(I,J)=INDEXn ELSEG BARRAY(I,J)=INDEX-256a END IFe END DOC' CALL SET_SWEEP(FR,1) END DO"C DO I=1,3e CALL IMCLOS (IM(I),IER)m END DOaCa IF(NINC.GT.0) THEN RED=REAL(MAP)/REAL(NX)i DO I=1,NX% SCALED=INT(REAL(I-1)*RED)+GINDEXN IF(SCALED.LE.127) THENa DO J=1,NINC BARRAY(I,J+NY)=SCALED5 END DO ELSEs DO J=1,NINC! BARRAY(I,J+NY)=SCALED-2562 END DOo END IFr END DOl END IF C, RETURN  ENDCoPC*******************************************************************************@ SUBROUTINE SET_LUT(RED,GREEN,BLUE,MAP,GIND,NLUT,STABLE,ASK_NOT)Ce$C Subroutine to set a particular LUTC  IMPLICIT INTEGER*4 (A-Z)H% REAL*4 RED(MAP),GREEN(MAP),BLUE(MAP)N! REAL*4 AL,VAL,FAC1,FAC2,FAC3,RAN  REAL*4 H,S,V,TH,NR,WH,VI,LI LOGICAL STABLE,ASK_NOT" CHARACTER LUT_NAMES(7)*20,FILE*80 INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/ICON/ VDI2,WDI26 COMMON/IMAGE/ VDI,WDI,ATB,BITSPERPIX,BYPTR,NX,NY,NINC) COMMON/LUT/ RX,RY,NMETHOD,TH,NR,WH,VI,LI, COMMON/RGB_SET/ NRGB27 DATA LUT_NAMES/'Greyscale','Rainbow','Random','Fancy',A9 + 'Uniform color','RGB encode','Save/Restore LUT'/EC Set some constants FAC1=1.0/REAL(MAP-1)MDC STABLE=.TRUE. if you're not to go straight into MOD_LUT on return:.C STABLE=.FALSE. if you are (most of the time) STABLE=.TRUE.BC Can call to set a particular LUT, given by NLUT, without asking.5 IF(ASK_NOT) GOTO (101,102,103,104,105,106,191), NLUTcC Choose a LUT5 NEWLUT=MAKE_MENU(VDI,WDI,7,LUT_NAMES,'Choose a LUT')rIC Ignore this choice if they change their minds (and don't go to MOD_LUT)l IF(NEWLUT.EQ.0) RETURNaFC Accept NEWLUT=NLUT, because this routine resets the original scales,7C which they might have reset with the MOD_LUT routine. OLDLUT=NLUT NLUT=NEWLUT STABLE=.FALSE.LKC Only five real choices, plus the RGB encode and disk save/restore options) GOTO (101,102,103,104,105,106,191), NLUT  RETURNRC. 101 CONTINUECC C GreyscaleCR DO I=1,MAPT RED(I)=REAL(I-1)*FAC1D GREEN(I)=REAL(I-1)*FAC1J BLUE(I)=REAL(I-1)*FAC1 END DOL" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201CC 102 CONTINUECS3C Rainbow - uses the built-in UIS HSV<->RGB schemeMCG NMETHOD=1 S=1.0 V=1.0 DO I=1,MAP H=REAL(I-1)*FAC1*360.0 V=0.25+0.75*REAL(I-1)*FAC15 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I)) END DO_" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201TCC 103 CONTINUECQ C Random CA IKERNEL=1893574379A DO I=1,50 H=RAN(IKERNEL) END DON DO I=1,MAP) H=RAN(IKERNEL)*360.4 V=0.25+0.75*RAN(IKERNEL) S=RAN(IKERNEL)5 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I))m END DOe RX=0.5*NX RY=IKERNEL/RX NMETHOD=1 GOTO 201MCS 104 CONTINUECIC FancySC( TH=1.5  NR=1.0 WH=0.125*MAPI VI=0.5R LI=0.5 @ CALL GEN_COLOR(MAP,1,MAP,4,MAP-4,TH,NR,WH,VI,LI,RED,GREEN,BLUE) RX=0.5*NX RY=0.5*(NY+NINC)) GOTO 201=CS 106 CONTINUEC-C RGB encoding of three images (two options)RC NPIECE=4  IF(NRGB.EQ.1) NPIECE=82 MP4=(MAP-16)/NPIECE MPG=MAP-MP4*NPIECEG FAC2=1.0/(MP4-1)_ FAC3=1.0/(MPG-1)n J=0 V=0.0 S=1.E-10e H=0.0"C Simple greyscale part of the LUT DO I=1,MPGe V=REAL(I-1)*FAC3i RED(I)=Vd GREEN(I)=Vi BLUE(I)=V END DOeCC and now a sequence of color values at four different intensities,/IC either all S=1, or with 2 values of S (option in new image setup menu)])V UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P'.l S=1.0 DO K=1,NPIECE J=(K-1)*MP4+MPGt IF(NRGB.EQ.1) THEN V=((K-1)/2)*0.2+0.39999999999 S=1.0-(K-2*(K/2))*0.6 ELSE V=(K-1)*0.2+0.39999999999 END IF DO I=1,MP4 H=REAL(I-1)*FAC2*360.0,< CALL UIS$HSV_TO_RGB (H,S,V,RED(J+I),GREEN(J+I),BLUE(J+I)) END DO END DO RX=0.5*NX RY=0.5*(NY+NINC), GOTO 201SCE 105 CONTINUECAC Uniform color wheelC) NMETHOD=1 FAC2=4.*ATAN(1.)*FAC1 S=1.0 V=1.0 MP2=MAP/2 DO I=1,MAP H=(I-1)*FAC1. CALL NEWCONV (H,S,V,RED(I),GREEN(I),BLUE(I)) END DOt" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201TC 191 CONTINUECd5C Save if the file does not exist, restore if it doesIC(NC (If they're reading and/or writing the LUT, assume they don't want to change#C it again immediately thereafter)E STABLE=.TRUE. CALL NEED_INPUT(VDI,WDI, 8 + 'Read file if it exists: create/write it if not',E + 'Give the (VMS) filename for the LUT (CR to exit)',FILE,NFILE)N IF(NFILE.EQ.0) RETURNC Store in binary to save spacex91 FORMAT(3A4)2 OPEN(11,FILE=FILE(1:NFILE),STATUS='OLD',ERR=1911)3C File exists, read it in (resetting NLUT as we go)M@ READ(11,91,END=1912,ERR=1912) RX,RY,NMETHOD,TH,NR,WH,VI,LI,NLUT@ READ(11,91,END=1912,ERR=1912) (RED(I),GREEN(I),BLUE(I),I=1,MAP) CLOSE(11) GOTO 201 Cr 1911 CONTINUEKC File does not exist, create it (must restore OLDLUT so MOD_LUT will work)H NLUT=OLDLUT2 OPEN(11,FILE=FILE(1:NFILE),STATUS='NEW',ERR=1913)8 WRITE(11,91,ERR=1913) RX,RY,NMETHOD,TH,NR,WH,VI,LI,NLUT8 WRITE(11,91,ERR=1913) (RED(I),GREEN(I),BLUE(I),I=1,MAP) CLOSE(11) RETURNs=1912 WRITE(6,*) 'Error reading LUT from file: ',FILE(1:NFILE)CC WRITE(6,*) 'Please check that this is a valid NEWUISDISP LUT file'L CLOSE(11) RETURNJC1913 WRITE(6,*) 'Unknown error writing LUT to file: ',FILE(1:NFILE)t WRITE(6,*) G + 'This is NOT a valid NEWUISDISP LUT file, and should be deleted'N CLOSE(11) RETURNSCE 201 CONTINUECA?C Fill up the virtual color map (don't worry about the flickernBC [see MOD_LUT], because this is only done once, not continually).CE2 CALL UIS$SET_COLORS (VDI,GIND,MAP,RED,GREEN,BLUE)CL RETURNS ENDCNPC*******************************************************************************1 SUBROUTINE MOD_LUT(RED,GREEN,BLUE,MAP,GIND,NLUT)EC0C Interactive modification of the Look-Up Table.FC Reacts to cursor placement in main window. Also activated by buttonFC pressing, so that you can exit or change behaviour without having toGC move the cursor to wake it up. Using the ASTs this way avoids having,6C to sit in a CPU-consuming loop (which I used to do).;C Currently handles ALL of the tables available in SET_LUT.)CA IMPLICIT INTEGER*4 (A-Z)E+ REAL*4 RED(MAP),GREEN(MAP),BLUE(MAP),H,S,VN; REAL*4 AL,VAL,FAC1,FAC2,FAC3,FAC4,FAC5,FAC6,FAC7,FAC8,FAC9D REAL*4 TH,NR,WH,VI,LI,RT,GT,BT* CHARACTER FANCY(5)*30 INCLUDE 'SYS$LIBRARY:UISENTRY'* INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/ICON/ VDI2,WDI2m6 COMMON/IMAGE/ VDI,WDI,ATB,BITSPERPIX,BYPTR,NX,NY,NINC2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB) COMMON/LUT/ RX,RY,NMETHOD,TH,NR,WH,VI,LIo COMMON/LUTPOINT/ EFNUMo COMMON/RGB_SET/ NRGBN+C Declare pointer AST for this routine only  EXTERNAL LUTPOINT?C The "fancy" choice has too many internal degrees of freedom !C* DATA FANCY/'Vary theta/nrot or lin/nrot',+ + 'Vary theta/white or lin/white',R+ + 'Vary theta/vivid or lin/vivid',+ + 'Vary nrot/white or nrot/vivid',(+ + 'Vary theta/lin or white/vivid'/XDC Vari^? UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3P`ous factors to set the correct ranges for different parametersEC (set as many as possible here to speed up processing in later loop)M FAC1=3.141593/FLOAT(NY+NINC)/ FAC2=1./FLOAT(NX) FAC3=1./FLOAT(MAP-1)N FAC4=1./FLOAT(NY+NINC)I FAC5=3.0*FAC4 FAC6=20.0*FAC4/ FAC7=20.0*FAC2M FAC8=FAC2*MAP*0.25' FAC9=FAC4*MAP*0.25/!C Preserve RX and RY between uses RXO=RX  RYO=RYTFC Use viewport relative (device) coordinates, so it doesn't care about!C silly zoom and pan alterations. - CALL UISDC$SET_POINTER_POSITION(WDI,RXO,RYO)D+C Update must be done in pieces (see below)D ISIZE=70C+ IF((MAP/ISIZE)*ISIZE.EQ.MAP) ISIZE=ISIZE-1 NPIECE=MAP/ISIZEa NF=NPIECE*ISIZE+1 IF=MAP-NF+1C 9C That's the common lot done, now check which LUT we havea GOTO (1,2,3,4,5,6), NLUTe#C Give up if we don't know this one  RETURNrCo 1 CONTINUE: CALL ENABLE_BUTTONS(VDI,WDI,'Grey','Quit',' ',' ',.TRUE.) ASSIGN 11 TO IGOE GOTO 302R 2 CONTINUE S=1.0> CALL ENABLE_BUTTONS(VDI,WDI,'Rainbow','Quit','Contrast/pos.',! + 'Start/intensity',.TRUE.)a ASSIGN 12 TO IGO GOTO 302s 3 CONTINUE- CALL ENABLE_BUTTONS(VDI,WDI,'Random','Quit',f% + 'Method 1','Method 2',.TRUE.)) ASSIGN 13 TO IGO GOTO 302l 4 CONTINUE ASSIGN 14 TO IGOn/ NMETHOD=MAKE_MENU(VDI,WDI,5,FANCY,'Variation') IF(NMETHOD.EQ.0) RETURN8C Set pointer back again, because it moved for the menu.- CALL UISDC$SET_POINTER_POSITION(WDI,RXO,RYO).0C Ten combinations of 5 parameters, 2 at a time.MC Make five sets of options, with one on the centre button, one on the right.n$ GOTO (401,402,403,404,405), NMETHOD/401 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',)' + 'Theta/Nrot','Lin/Nrot',.TRUE.) GOTO 302m/402 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',() + 'Theta/White','Lin/White',.TRUE.)N GOTO 302*/403 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit', ) + 'Theta/Vivid','Lin/Vivid',.TRUE.)5 GOTO 302D/404 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',R) + 'Nrot/White','Nrot/Vivid',.TRUE.) GOTO 302 /405 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',*) + 'Theta/Lin','White/Vivid',.TRUE.)* GOTO 302* 5 CONTINUE S=1.0 V=1.0> CALL ENABLE_BUTTONS(VDI,WDI,'Uniform','Quit','Contrast/pos.',! + 'Start/intensity',.TRUE.) ASSIGN 15 TO IGOE GOTO 302 6 CONTINUE IPIECE=4M IF(NRGB.EQ.1) IPIECE=8L MP4=(MAP-16)/IPIECE MPG=MAP-MP4*IPIECEN FAC7=1.0/FLOAT(IPIECE)L FAC8=1.0/(MP4-1)T FAC9=1.0/(MPG-1)F TH=1.0I NR=1.0Y WH=1.0: ISRGB=14 CALL ENABLE_BUTTONS(VDI,WDI,'RGB','Quit','R->G->B', + 'B->G->R',.TRUE.)W ASSIGN 16 TO IGOY GOTO 302ICC Common part of loop.CC So as not to waste CPU time when nothing is moving, put this intoeC a separate pointer AST.' 302 CONTINUECf- CALL UIS$SET_POINTER_AST(VDI,WDI,LUTPOINT,0)  CALL LIB$GET_EF(EFNUM)=EC Note that we now set the same event flag for the buttons AST, so we_7C can be woken up by EITHER the pointer OR the buttons.t EFNB=EFNUM= 301 CONTINUE CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))HC React only to a left button down-click - ignore any up-clicks (ONE=-1) IF(ONE.EQ.1) THENJC First button ("quit") wakes up our BUTTONS AST and sets 'ONE', whereupon8C we remove the window and reset the ASTs and the image. CALL DELETE_BUTTONS(VDI,WDI)h, CALL UIS$SET_POINTER_AST(VDI,WDI,,,,,,,,) CALL LIB$FREE_EF(EFNUM) CALL RESET_IMAGE RETURNLIC Ignore a left button up-click. The other buttons are sometimes used toe.C change options, so we leave those two alone. ELSE IF (ONE.EQ.-1) THENN O_4S UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3PNE=0 GOTO 301  END IFNC If we get to here, we either moved the pointer or clicked a "choice" button.- STATUS=UISDC$GET_POINTER_POSITION(WDI,RX,RY)RNC With the AST method, we don't need to check for a valid or changed position. RXO=RX  RYO=RY-C Common part over GOTO IGOBCh C GreyscaleECD11 AL=TAN(RY*FAC1-1.570796)A NXP=NINT(RX*FAC2*MAP) DO I=1,MAP5- VAL=MIN( MAX(0.,0.5+AL*FAC3*(I-1-NXP)), 1.)S RED(I)=VAL BLUE(I)=VAL GREEN(I)=VAL END DOA GOTO 201ACA C Rainbow5CY12 IF(TWO.NE.0) NMETHOD=1  IF(THREE.NE.0) NMETHOD=2A S=1.0 IF(NMETHOD.EQ.1) THEN AL=TAN(RY*FAC1-1.570796) NXP=NINT(RX*FAC2*MAP)( DO I=1,MAP VAL=0.5+AL*FAC3*(I-1-NXP) IF(VAL) 121,122,122BC Arrange values at either end to have some sort of "bland" level,1C so that the coloured region is nicely bordered. 121 RED(I)=0.9 GREEN(I)=0.9  BLUE(I)=0.9 GOTO 125V122 IF(VAL-1.) 123,123,124124 RED(I)=0.7 GREEN(I)=0.6I BLUE(I)=0.6 GOTO 125!C Now pick a useful "real" value.123 H=360.0*VAL  V=0.25+0.75*VAL5 CALL UIS$HSV_TO_RGB(H,S,V,RED(I),GREEN(I),BLUE(I)))125 CONTINUE END DO ELSE VAL=RY*FAC4*360. AL=RX*FAC2*0.75+0.25 DO I=1,MAP H=REAL(I-1)*FAC3*360.0+VALH IF(H.GT.360.) H=H-360.r V=0.75*REAL(I-1)*FAC3+AL  IF(V.GT.1.0) V=V-0.756 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I)) END DO END IFo GOTO 201 Cr13 IF(TWO.NE.0) NMETHOD=1  IF(THREE.NE.0) NMETHOD=2aCs C RandomoCn6C Need to start with the same kernel for a given x,y -7C that way, you can get back to where you were (just !)3 IKERNEL=RX*RY DO I=1,50 H=RAN(IKERNEL) END DO) DO I=1,MAP9 H=RAN(IKERNEL)*360.1 IF(NMETHOD.EQ.1) THEN* V=0.25+0.75*RAN(IKERNEL)B ELSE V=RAN(IKERNEL), END IF S=RAN(IKERNEL)5 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I))  END DO GOTO 201oCc 14 CONTINUE)=C Run with two choices per setup, given by -ve or +ve nmethod2" IF(TWO.NE.0) NMETHOD=ABS(NMETHOD)% IF(THREE.NE.0) NMETHOD=-ABS(NMETHOD)I C Ranges:t+C Nmethod is -5 to +5, with 0 not available5C theta (TH) 0 to 3=C nrot (NR) -10 to 10 (really infinity, but this is enough)oC white (WH) 0 to MAP_SIZE/4rC vivid (VI) 0 to 1C lin (LI) >0 to 1 > GOTO (141,142,143,144,145,301,147,148,149,150,151), NMETHOD+6C Vary theta/nrot or lin/nrotI147 TH=RY*FAC5 NR=RX*FAC7-10.x GOTO 140e145 LI=RY*FAC4+0.001 NR=RX*FAC7-10.M GOTO 140 C Vary theta/white or lin/whiteI148 TH=RY*FAC5 WH=RX*FAC8 GOTO 140b144 LI=RY*FAC4+0.001 WH=RX*FAC8) GOTO 140FC Vary theta/vivid or lin/vividR149 TH=RY*FAC5 VI=RX*FAC2t GOTO 140i143 LI=RY*FAC4+0.001 VI=RX*FAC2= GOTO 1401C Vary nrot/white or nrot/vividL150 NR=RY*FAC6-10.09 WH=RX*FAC8( GOTO 140N142 NR=RY*FAC6-10.0 VI=RX*FAC2G GOTO 140rC Vary theta/lin or white/vivid 151 TH=RY*FAC5 LI=RX*FAC2+0.001U GOTO 140T141 WH=RY*FAC9 VI=RX*FAC2O GOTO 140=CE 140 CONTINUE@ CALL GEN_COLOR(MAP,1,MAP,4,MAP-4,TH,NR,WH,VI,LI,RED,GREEN,BLUE) GOTO 201CI C UniformRC115 IF(TWO.NE.0) NMETHOD=1, IF(THREE.NE.0) NMETHOD=2R S=1.0 V=1.0JC Same two choices as for the "rainbow" LUT, just using the new conversion+C algorithm NEWCONV, instead of HSV_TO_RGB. IF(NMETHOD.EQ.1) THEN AL=TAN(RY*FAC1-1.570796) NXP=NINT(RX*FAC2*MAP)I DO I=1,MAP VAL=0.5+AL*FAC3*(I-1-NXP) IF(VAL) 1501,1502,1502f1501 RED(I)=0.9d GREEN(I)=0.91 BLUE(I)=0.9 GOTO 1505 1502 IF(VAL-1.) 1503,1503,15041504 RED(I)=0.7b GREEN(I)=`>I UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.FOR;3Px 0.6 BLUE(I)=0.6 GOTO 150551503 CALL NEWCONV (VAL,S,V,RED(I),GREEN(I),BLUE(I))_1505 CONTINUEM END DO ELSE) VAL=RY*FAC4 AL=RX*FAC2*0.6+0.4 DO I=1,MAP H=REAL(I-1)*FAC3+VAL* IF(H.GT.1.0) H=H-1.0* V=0.6*REAL(I-1)*FAC3+AL IF(V.GT.1.0) V=V-0.6E/ CALL NEWCONV (H,S,V,RED(I),GREEN(I),BLUE(I))a END DO END IFu GOTO 201eCiC RGB encodingCo 16 CONTINUE EC Switch which colour we alter, on an up-click (avoids the problem ofv!C up and down having two effects)t IF(TWO.EQ.-1) THENt ISRGB=ISRGB+1 IF(ISRGB.GT.3) ISRGB=1s ELSE IF (THREE.EQ.-1) THENo ISRGB=ISRGB-1 IF(ISRGB.LT.1) ISRGB=3i END IFS AL=TAN(RY*FAC1-1.570796)E# NXP=INT(RX*FAC2*FLOAT(IPIECE+2))-1M8C TH is an enhancement factor over the "plain" encoding.=C We therefore want TH=1 when AL=0 - i.e. nothing is changed.A TH=1.0-AL*NXP/FLOAT(IPIECE) DO I=1,MPG V=REAL(I-1)*FAC9Y IF(ISRGB.EQ.1) THEN RED(I)=MIN(MAX(V*TH,0.),1.)M ELSE IF (ISRGB.EQ.2) THEN! GREEN(I)=MIN(MAX(V*TH,0.),1.)N ELSEO BLUE(I)=MIN(MAX(V*TH,0.),1.) END IFH END DO S=1.0 DO K=1,IPIECE! TH=1.0+AL*(K-NXP)/FLOAT(IPIECE) J=(K-1)*MP4+MPGS IF(NRGB.EQ.1) THEN V=((K-1)/2)*0.2+0.39999999999 S=1.0-(K-2*(K/2))*0.6 ELSE V=(K-1)*0.2+0.39999999999 END IF DO I=1,MP4 H=REAL(I-1)*FAC8*360.0y' CALL UIS$HSV_TO_RGB (H,S,V,RT,GT,BT)' IF(ISRGB.EQ.1) THEN" RED(J+I)=MIN(MAX(RT*TH,0.),1.) ELSE IF (ISRGB.EQ.2) THEN$ GREEN(J+I)=MIN(MAX(GT*TH,0.),1.) ELSEa# BLUE(J+I)=MIN(MAX(BT*TH,0.),1.)i END IFa END DO END DOa GOTO 201bChC #C And now, the common up-date pieceM 201 CONTINUEDC Have to do the color-map update in pieces to avoid display flickerEC (documented under the UIS$SET_COLORS routine). This slows down the;C responsiveness slightly, but is still much less annoying. DC It's due to updating too many entries within one vertical blankingFC interval, so to ensure it works, we also add a tiny little wait timeDC between the pieces. You still get an occasional flicker, but it's!C a LOT less noticeable this way.N DO 9 I=1,NPIECE J=(I-1)*ISIZE+1A CALL UIS$SET_COLORS (VDI,J-1+GIND,ISIZE,RED(J),GREEN(J),BLUE(J))N CALL LIB$WAIT(0.005)) 9 CONTINUE9C and reset the buttons - don't want a cumulative effect.L TWO=0 THREE=0B CALL UIS$SET_COLORS (VDI,NF-1+GIND,IF,RED(NF),GREEN(NF),BLUE(NF)) GOTO 301  ENDC*[SHARP.UISEXP]NEWUISDISP.TXT;6+,./9 4P-0123KPWO56ܒ7 ܒ8׽J9G9HJ9Comments to accompany the display program NEWUISDISP.FOR.EThis program is designed to run on a VMS VAXstation with greyscale orGcolor capability, either 4-bit or 8-bit. It will NOT run under Ultrix.HIt definitely works under VMS 4, and it has worked on at least one VMS 5Bsystem. It needs VWS (workstation software) version 3.2 or later.IThe accompanying program IRAFLOGO.FOR enables creation of the IRAF `star'Glogo for use as an Icon. Careful reading of this program should enableIsites toai) UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.TXT;6P Q produce customized Icons. It provides two mechanisms, the firstJa graphical one (drawing regions as vectors and then filling them in), theHsecond a bit-mapped one (directly creating an array of zeroes and ones).HThe bit-mapped method was included because I didn't like the look of theGgraphical one (!), but it's rather harder to set up, and very difficult9to customize (try designing from scratch if you want to).FBoth programs are available by e-mail on request. However, NEWUISDISPEoccupies some 251 blocks, as opposed to IRAFLOGO's 24, so if possibleCwe suggest you run a VMS COPY over the DECnet (via SPAN or HEPnet). The files are: 5355::USR0:[SHARP.UISEXP]NEWUISDISP.FOR and .EXE, andP 5355::USR0:[SHARP.UISEXP]IRAFLOGO.FOR and .EXE, (5355 is NOAO's node number)Current status:KThis is version 1B, the development version, dated June 1989 and containingHonly some minor improvements over the December 1988 version (to coincideFwith the IRAF 2.8 release). The first version, dated October 1988 andHannounced in the IRAF Newsletter, had several limitations, including not:supporting 4-bit systems. Please report any bugs or otherIinfelicities you may find: remember, this is still experimental software.IThe executable can be run directly: certain assumptions can be changed ifJyou alter the source code, then recompile and relink. Many of the programKfeatures are discussed in the opening comment section in the source: please0read that section, as well as the comments here.Changes for June 1989:I"New image setup" menu made easier to use, with fewer spurious questions.A"Minimum window size" item moved into the "New image setup" menu.HDefault changed to reserve 10 LUT indices: unfortunately, on startup theHVWS system insists on ignoring this and affecting the VT240-Regis windowGrecommended for running IRAF. Due to a bug in VWS, you must shrink theHRegis window to an Icon and re-expand to recover its correct appearance.FRelinked with IRAF 2.8 IMFORT to allow pixel redirection using the VMSlogical IRAFIMDIR.6Tested under VMS 4.7/VWS 3.3 and under VMS 5.1/VWS 4.0Usage:HThe program can be run directly, or SPAWNed. From the IRAF environment,Dit's best to !SPAWN RUN NEWUISDISP, so that the program behaves as aDconnected subprocess. It does some terminal I/O, principally cursorFinformation and error messages, but creates its own separate window ifFit needs terminal input. This means you can't type ahead, even if youFknow what the program is going to ask. All of the display options areFaccessible from the "Additional Options" item of the window Main Menu,Hafter the first image has been displayed. Most options should be fairlyFwell self-explanatory. If you find any obscure or ambiguous sections,please let us know.5Improvements in version 1B, and some comments on use:EThis version has some internal changes and better error handling, and the following functional extras:Da) support for a variable number of look-up table entries, includingF running on 4-bit greyscale systems (I've also run it under VMS 5 onK a 4-bit system: 8-bit greyscale seems very rare). If you use the entireJ hardware LUT, windows other than system windows (Banners, clocks, etc.)M will be altered when you use the image display: by reserving some indices,. these other windows can be left unaffected.Fb) Look-Up Table extras, including more control over variations, a newC more perceptually uniform LUT, and a save/restore option to keep- LUTs on disk (just fobV UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.TXT;6P r the movie makers !)Kc) new options for reading a new image, including choice of min/max and LUT andHd) ability to read FITS images directly from disk (but with no "section"4 control - i.e. the whole image, not a part of it)Le) a "snap" option, to filter the displayed image through the LUT to an IRAFD format file, with control over the output range (default 0-1023).I This is useful not just for sites with "crtpict" or an equivalent, butH also with the RGB feature (see below). There is no snap FITS output.Hf) limited blink capability: the current image is stored, and at a laterK time can be blinked against the now current image, using the current LUTI (restoring the original LUT is problematic). The quality of the blinkL depends in an odd way on the image size - 512x512 is better than 256x256,J for example - and has been implemented in 2 ways, a (usually) "cleaner"H blink, but of limited speed, and a (usually) "blockier" blink capableE of higher speeds. Both blinks are "infinitely variable" up to theJ maximum, but because the blink interval is only updated once around theI loop, it can get quite tiring holding down the button during very slowK alternations. For "good" image sizes, you can make it go faster than isM comfortable to watch. Images of different sizes are aligned at the bottomJ left corner, and there is no "real-time" pan of one image wrt the otherJ (although you can stop the blink, pan the current image, and re-blink). and finally,Ig) a tentative method for taking three separate images, calling them red,L blue, and green, and combining into a "full-colour" image. Encoding whatI we do on the IIS with 24 bits of colour (8 each), into a workstation'sK 8 bits (a "cube root" problem !) proved surprisingly effective, probablyL due to the eye's tolerance. The best way to use this is probably to lookI at each frame in greyscale, snap the picture to another file, and thenG read back in the snaps. In the interactive LUT modification option,J only one color is changed at a time. To avoid "messing up" a color youI have already set, the buttons allow you to move in either order, R-G-BJ or B-G-R. That is, you start by changing Red: click the middle button,J and you'll change Green. To go back to Red, click the right button, orK to go to Blue, click the middle button again. A full description of theH encoding method is available, and there are plenty of comments in theF code: comments, opinions, and alternative methods are very welcome.K Note that the two methods I use are not compatible, in the sense that ifE you change the method (see the "New image setup" option), you must< re-read all three images. The coding is also quite slow. Future plans:CWe have some planned enhancements. All other suggestions and ideasEare actively solicited, by mail to 5355::SHARP, or sharp@noao.edu, oreven by regular mail.NThe biggest feature not yet implemented (and the reason this is version 1B andNnot version 2) is graphics overlay, for marking cursor positions and boxes, orMlabeling features for photographs. This is a difficult option, because thereOare no independent planes on a VAXstation, so it must be simulated in software.HIdeally, it will also allow marking a set of positions read from a file.Bugs/limitations:GNo ability to sub-sample large images (use imcopy to make a new image).NImages with sizes over 900 pixels in x or 800 in y will give incorrect resultsO for the cQ  _dcy0oAl1J9%4t`&IF7:l9*r(6]du8 +cbn,GJ0`5.,WOJ1?uj\xkM@ckpMu$4I57(H~qSyT]b -Fy,C&>$.[|` wXpeDG#wQ^\|j - 0))c'wt^E$(x&Q?bWjXK6>8>!"AN5 2K :X]UIqtl3D\'N,17r:Ai@y P>`B 5[I!FK;O%"Gh! $$HBoK||9}fB#u H`H6kiO&.FmM&H!>@ c~>]uM=o RR[(5:>*7kfzh)7@GF!'b&6}l6(JTu 3,+B &`Bj @RasWaHX 9 {zSoTlB2h{D~bq2[2{G!azZLO P >eKMf#qR y']a2F|sJrj>~%V%n*h.IKZf=.:gg .>v5[CNO@_>|0xuRLf80;s/~Y~~nnfjk"E J#\A1zvlO e`K[LWf[fo*j56)Fq!;B[ _}".qs'&GdmU})&`R jZW\3 c`K.s!u*E: -_B4 OK @Q9.[]LCRmTl11 $~s6?XMss]"$>:c}E@_w;7U+tTn$~dB?!d4Yt&Wr*m8h.p)|D0u]a,s[AJes,'F--l'L76L{HNn;IYz5OW]\iihS<);P Iy1.%{0b 8/n>_!4lPQ7ZXh%_E .[si*,jC.`p-<4tHzFx} ?o.KQ2f*@Zi uu}-'up{LNWGkN}zZtlMh>I(I(#G=F:Ix8B+egkYPK&V;_dQBk7Y@po04?YOPap'- l\v Y!!^gG|O8CPpDg?LKW%[*\./>Mg&"iYR&>oj72=G{O1\x\Az2-mtz|Mq>$? *DO !euZM%Z, qP?93L"]L5N=#*kfV6UUVy^,1@w3J&P uxrL_@y8;m!-w!?>;n)4SzwU x{K0YN 4+!**8D$YH7sdM#Q^'t2P$0 gLul$TN\!R#hNYS/ }&|EKR;f6IE y isbKP(| NEtw<?>Zz)?wE]9@l)aYiQQ8C8EWX*S1?RaD-&?YI'Y b3]@ ?jZ)I:, 7c lH@G1VO'&foq -&F)LRJw- - k_0qT#Ie h\;F,`cB\>N1Shq%xrL'[sHC24HFkg'Ghk(>'Y_4]{@s\D?)9!C5y! J+'U^)1^gK4 1"(S2=q?X g+c:WfXEs::ifC+a ^su&$:>0n` M >'Sb7u) W]o<\n, Q)d9_v)Ej!k|V*I_'T ;v@gm>KL/4]'4Ze_oq;EM]Sx5={Nb{khJ db/ _$P zk!"j=ux!SW %bAKLXVK l:k^koX^^iI"3@[N~?x\~TUw~ 8wR|^KCkf27-IJ-O >em(w|=C# ;%^nhaL*n$cW%A/Nf3"`$zQ_X^\(GkHXP]V*#]j WRvpQ,d*^2W=m=)_6kX[$[b6i"Gb! uHBu] (?TC 1mM{S):)84YaSJPU?b/|3+Du5 g`:y QV(? F a@%cJh$MqynZP: I{_ 8'/w29<.>,e_Nj`;r{IHkN^539h2tFSPp?'{*2N!Za!^!^L]Gd+.C~<06VWs+'E'Doel12'8A( V%BA pmIaJbj LEw+{v{ =u;FU}vX f ;:Y=@T\ _nEnwVGR^${]-+.q*2arwb'tp@7l2%O%xK1J D NXu [Y;v9$:1W*`kI&>s inI2mDa8E4z J vq!E\- mZ#uaBRP6MKa%7D9x}-X{p'c@N0!IRw3~E.-GQck2~3iDVeC'`z iC2d PIPJB>S YDolPH\.o-5 4~tSt!YgWvS_D 7j8700E`eg(Z/6R=bEb0y,k\x@Gws@#W9s!\T fmD '3h3tcsCHc.B^b; k]d%(WT--'hcIDGs#:"k^xXnjBLJc;0,SXC|J vN6_9X@f|{[7#7iXx#,O &@gZQd UISDISP.BCK[SHARP.UISEXP]NEWUISDISP.TXT;6P.cursor readback and zoom/pan. I'm working on this bug, in connection? with a simpler way to display large images than sub-sampling.;No ability to zoom different amounts in x and y directions.'No type-ahead for answers to questions.KNo monochrome (2-bit) support (this would require clever dithering in order8 to simulate greyscale by use of half-tone techniques).GNo direct integration with IRAF (so file names must all be given in VMSI syntax, and there's no way to use the cursor directly from IRAF tasks -@ you have to write a file and then read it back into the task).GOnly one display plane, with a limited second plane for blink purposes.HOnly two-image blink (vs IRAF's regular 4-plane image display protocol).)SNAP output only to the IRAF file format.OThe virtual memory management still seems to crash the VAXstation occasionally,E and I can't repeat it reliably enough to be able to investigate it.L I strongly recommend that anyone using NEWUISDISP should get their workingI set extents and their page file quotas increased. You may also need tosK increase the system page file size. Some of the problems can be eased ifa+ you run NEWUISDISP as a separate process.uunder Ultrix.HIt definitely works under VMS 4, and it has worked on at least one VMS 5Bsystem. It needs VWS (workstation software) version 3.2 or later.IThe accompanying program IRAFLOGO.FOR enables creation of the IRAF `star'Glogo for use as an Icon. Careful reading of this program should enableIsites to*[SHARP.UISEXP]UISDISP.FOR;16+,*S./9 4P~D-0123KPWO56;m7}No8p r9G9HJ C UISDISP.FORCC A program to display an IRAF disk file using the UIS subroutinesKC on a VAXstation (originally on a II/GPX). VMS specific: NOT for Ultrix.OC------------------------------------------------------------------------------?C Version 2.3, 1994. More bug fixes, add arbitrary line graph.:C Version 2.2, 1992. Minor bug fixes, small enhancements.IC Version 2.1, December 1989. Logarithmic scaling, small cursor changes.:C Version 2.0, 1989. Addition of graphics overlay system.=C See also program IRAFLOGO.FOR, for making customized Icons.C C To compile and link for IRAF:CCC Locate this file somewhere such as iraf$local, or iraf$local/uis.C cl> fc uisdisp.fC,C Execute as a background process by typingAC !SPAWN/NOWAIT run uisdisp and answer the questions presentedFC in special windows. All of the display-specific tasks are run from7C the Additional Options item in the main Menu window.CCC Written by Nigel Sharp, National Optical Astronomy Observatories..C SPAN: NOAO::SHARP, or 5355::SHARPC Internet: nsharp@noao.eduC Telephone: (602) 327 5511HC Based on an original by Simon Morris, without whom it would not exist,8C but very extensively rewritten (so he's not to blame).CIC------------------------------------------------------------------------ PROGRAM UISDISPC IMPLICIT INTEGER*4 (A-Z) PARAMETER (COL_DIM=256)) CHARACTER*80 ERRSTR,TEXT,IMTITLE,BLTITLE< CHARACTER*80 OPTIONS(20),CURSORS(12),RESETS(3),SETUPS(7,3),7 +eཊh UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pw  SNAP_SET(3,3),SNAP_CHOICE(4),BLINKS(4),RANGE(3) CHARACTER FONT_NAME*318 LOGICAL ONE_TO_ONE,STABLE_LUT,INC_LUT,BLINK,RGB,MARKERS> INTEGER*4 VCMATT(3),VCTMP(3),NSETUP(7),NMAXSET(7),NMINSET(7),6 + IM_RGB(3),NSNAP(3),NSNMA(3),NSNMI(3),GOBJ(50)5 REAL*4 RETWIDTH,RETHEIGHT,RETRESOLX,RETRESOLY,SCALE,: + RETX,RETY,XVAL,YVAL,RDATMIN,RDATMAX,WIDTH,HEIGHT,< + ICAA2,ICAA3,MWAA1,MWAA2,ORDMIN,ORDMAX,BLAA2,BLAA3,A + H,S,V,REDM(6),GREENM(6),BLUEM(6),DELAY,BLINKINC,LOGSAVE,= + RED(COL_DIM),GREEN(COL_DIM),BLUE(COL_DIM),RZXS,RZYS,> + TEXT_SLOPE,CHAR_WIDTH,CHAR_HEIGHT,LINE_WIDTH,LOGSCALEC(C---------------------------------------7 EXTERNAL SHRINKER,EXPANDER,CLOSER,DISPLAYOPT,BLINKBUTTC Common blocks for:C ICON window IDsC ICON attributesC Main window attributesC Blink window attributesC Workstation parameters0C Image window IDs, pointers and size parametersC Image section and title%C Virtual color maps and map segments.C Look-Up Table memory (where the pointer was)-C Menu selection (used by the CLOSER routine)FC Blink (extra delay between images - as if you need it on a II/GPX !)'C Buttons (activated by ENABLE_BUTTONS)C Zoom and pan locationC Minimum window size'C Data type, scales, and scaling optionC RGB encoding optionC Graphics overlay features4C Text and line characteristics for graphics overlay'C Pointer to location of original array COMMON/ICON/ VD_ID2,WD_ID27 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICEND7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWEND7 COMMON/BLAT/ BLAC1,BLAA1,BLAC2,BLAA2,BLAC3,BLAA3,BLEND5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHT: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC/ COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN# COMMON/COLOR/ CMS_ID,VCM_ID,GINDEX COMMON/LUT/ RXLUT,RYLUT,NMETHOD COMMON/ADDOPT/ SELECTION! COMMON/BLINK/ BLINKBUFF,BLINKINC2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB- COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYE,RZXS,RZYS! COMMON/MINSIZE/ MIN_SIZE,INC_LUT< COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX,LOGSCALE COMMON/RGB_SET/ NRGB4 COMMON/GRAPHICS/ ATBG,MARKERS,NMARKER,NG,NGMAX,GOBJ; COMMON/TEXTL/ LINE_STYLE,LINE_WIDTH,TEXT_SLOPE,CHAR_WIDTH,$ + CHAR_HEIGHT,INDEX,FONT_NAME COMMON/ORIGINAL/ I2PTRC@C---------------------------------------------------------------C C Read in the UIS INCLUDE filesC INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF'C DATA REDM/1.,0.,1.,0.,0.,0.9/ DATA GREENM/1.,0.,0.,1.,0.,0.6/ DATA BLUEM/1.,0.,0.,0.,1.,0.0/C All current extra options= DATA OPTIONS/'Cursor read','Dump a region','Corners of box',9 + 'Dynamic range options','Read in a new image',0 + 'New image setup','Zoom (in or out)',; + 'Pan (non-interactive)','Reset zoom and/or pan',< + 'Reset Look-Up Table','Interactively change LUT',; + 'Graphics overlay menu','Change cursor pattern',7 + 'Blink options','Snap (screen->IRAF image)',2 + '3 images->RGB','Hard copy of picture', + 3*' '/6C Currently 11 possible cursors, and one switch option8 DATA CURSORS/'"+" cross','"+" cross with central hole',2 + '"x" cross','"x" cross with central hole',: + 'box with central "+" sign',':-) face',':-( face',0 + 'solid arrow left','outline arrow left',2 + 'solid arrow right','outline arrow right'," + 'Same pattern, two color'/!C Currently three movement resets0 DATA RESETS/'Reset pan onf:R UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P ly','Reset zoom only'," + 'Reset both pan and zoom'/CC Three dynamic range alterations (other two are set "dynamically"), DATA RANGE/'Change min/max values',' ',' '/&C Blink option has three possibilities6 DATA BLINKS/'Store current image','Start fast blink',0 + 'Start slow blink','Clear blink memory'/LC Various items which can be changed after initial display (SETUP menu item)< DATA SETUPS(1,1),SETUPS(1,2),SETUPS(1,3)/'Use current LUT',6 + 'Fresh (greyscale) LUT','Fresh (rainbow) LUT'/@ DATA SETUPS(2,1),SETUPS(2,2),SETUPS(2,3)/'Use current min/max',= + 'Calculate min/max from image','Request new min/max'/2 DATA SETUPS(3,1),SETUPS(3,2)/'Include LUT wedge', + 'No LUT wedge'/1 DATA SETUPS(4,1),SETUPS(4,2)/'Read IRAF images', + 'Read FITS images'/5 DATA SETUPS(5,1),SETUPS(5,2)/'Minimum window size=',% + 'Change minimum window size'/7 DATA SETUPS(6,1),SETUPS(6,2)/'Reserve 0 LUT indices',& + 'Change reserved LUT indices'/3 DATA SETUPS(7,1),SETUPS(7,2)/'RGB 1 (more range)', + 'RGB 2 (more intense)'/ DATA NMAXSET/3,3,5*2/ DATA NMINSET/7*1/C Snap option choices2 DATA SNAP_SET/'Range 0-1023','Include LUT wedge',= + 'Exclude graphics','Range 0-255','Exclude LUT wedge',/ + 'Include graphics','Set range',' ',' '/? DATA SNAP_CHOICE/'Make B&W SNAP file','Make 3 RGB SNAP files',C + 'Make bitmap SNAP (0-maxindex)','View/change SNAP options'/& DATA NSNMI,NSNMA,NSNAP/3*1,3,2,2,3*1/CKC OK, start program by checking that we have a recent enough version of UIS STATUS=UIS$PRESENT(MID)! IF(.NOT.STATUS.OR.MID.LT.3) THEN PRINT *,F + 'UISDISP-F-Too_old, need UIS software version 3.0 or later' STOP 'Impossible to continue' END IFCC Various parameters ATB=50 ATBG=51 NGMAX=506C Initially choose graphics markers on, marker style 1 MARKERS=.TRUE. NMARKER=1 BITSPERPIX=8C No blink selected yet BLINK=.FALSE.7C Initially choose cursor pattern 2 - can be reselected NCURSOR=2/C and cursor single color mode (can be changed) NCTYPE=1&C Set for linear scaling of the image.HC The LOGSCALE parameter sets how much of a log scale you get - close toHC zero it's pretty linear, above 100 it's pretty stretched. The default;C setting of 10. is pretty OK, but experiment for yourself.CC Negative values will revert to the usual directly linear scaling.AC Algorithm taken from Boroson package courtesy John Salzer & TB. LOGSCALE=-1.0 LOGSAVE=10.0GC (I know I just set LOGSCALE, but if you decide you prefer log. as the@C default, then you don't have to reprogram the next few lines) IF(LOGSCALE.GT.0.0) THEN& RANGE(2)='Change to linear scaling'( WRITE(UNIT=RANGE(3),FMT='(A,F5.1,A)')* + 'Change log. scale (',LOGSCALE,')' LOGSAVE=LOGSCALE ELSE+ RANGE(2)='Change to logarithmic scaling'( WRITE(UNIT=RANGE(3),FMT='(A,F5.1,A)')) + 'Change log. scale (',LOGSAVE,')' END IF>C *** Reserved color table indices for graphics overlay planesAC If you change this number, you MUST supply values in the arraysEC REDM, GREENM and BLUEM to match. On a four-bit system, this number>C is automatically cut to 2, using only the first two entries. GINDEX=6?C *** Maximum number of image refreshes before clearing window.GC If the window is redisplayed (e.g. by zoom) many times, the program'sEC virtual memory requirement will grow without limit. This parameterIC affects how often the display list is cleared, to cut this requirement. MAX_CALL_IMAGE=10Cg`jw UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PNy-C Get the color information for the hardwareC/ CALL UIS$GET_HW_COLOR_INFO ('SYS$WORKSTATION',: + TYPE,INDICES,COLORS,MAPS,RBITS,GBITS,BBITS,IBITS, + RES_INDICES,REGEN)CMC We need to have at least 4-bits of intensity, or we're going to die, so ...+C Problem .... alter this test for now ....( IBITS=MAX(IBITS,MIN(RBITS,GBITS,BBITS)) IF(IBITS.LT.4) THEN@ PRINT *,'UISDISP-F-Norange, Intensity scale less than 4-bits' STOP 'Impossible to continue' END IFCJC The system reserves some entries, so users' LUTs don't alter its abilityIC to write menus and terminal emulators and backgrounds, etc. OverridingJC this makes for a very ugly-looking screen. If you're on a 4-bit system,KC and you really want the extra levels, alter the next line not to subtract/C the reserved indices from the available ones. MAP_SIZE=INDICES-RES_INDICESLC Without getting at the system entries, I make myself another LUT, in whichNC the first GINDEX entries are reserved for graphics (menus, window, overlays)8C and only the remaining ones can be used for the image.FC I use white/black/red/green/blue/yellow for colour systems, and thenAC restrict it to just the first two (W&B) if we only have 4-bits. IF(MAP_SIZE.LT.20) GINDEX=2CC The GINDEX entries are reserved at the BEGINNING of the main LUT.DC Why, you may ask, not the end ? The answer is that certain of theEC window routines reset the window background automatically to be LUTIC entry 0, which then changes with the image (sigh). Rather than beat myFC brains out, I decided to reserve the extra entries at the beginning.C  VCMATT(1)=VCMAL$C_END_OF_LISTHC Due to the new blink system, I can no longer use an unbound color map.C VCMATT(1)=VCMAL$C_ATTRIBUTESC VCMATT(2)=VCMAL$M_NO_BINDC VCMATT(3)=VCMAL$C_END_OF_LISTBC Must create an initial color map, even if we overwrite it later.9 VCM_ID=UIS$CREATE_COLOR_MAP (MAP_SIZE,'Main_LUT',VCMATT): CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION', + UIS$C_COLOR_EXACT,0)MC Hereinafter, MAP_SIZE refers only to those entries available for the image. MAP_SIZE=MAP_SIZE-GINDEXCJC Set up a quick dummy window and load the graphics region color map (thisLC forces these values into the hardware color map right where we want them). VCTMP(1)=WDPL$C_PLACEMENT VCTMP(2)=WDPL$M_INVISIBLE VCTMP(3)=WDPL$C_END_OF_LIST2 VTMP=UIS$CREATE_DISPLAY(0.,0.,1.,1.,1.,1.,VCM_ID)< WTMP=UIS$CREATE_WINDOW(VTMP,'SYS$WORKSTATION',,,,,,,,VCTMP)5 CALL UIS$SET_COLORS(VTMP,0,GINDEX,REDM,GREENM,BLUEM) CALL UIS$DELETE_DISPLAY(VTMP)C$C Set initial main window attributes MWAC1=WDPL$C_END_OF_LIST$C Set initial Icon window attributes ICAC1=WDPL$C_ATTRIBUTES ICAA1=WDPL$M_NOBANNER ICAC2=WDPL$C_END_OF_LISTCC Get the display informationC. CALL UIS$GET_DISPLAY_SIZE ('SYS$WORKSTATION',8 + RETWIDTH,RETHEIGHT,RETRESOLX,RETRESOLY,PWD,PHT)CAC Set the initial graphics overlay font and other characteristics, FONT_NAME='DTABER0G03CK00GG0001UZZZZ02A000';C Initial color 2 (=red) or 1 (=black) if not color display IF(GINDEX.GT.2) THEN INDEX=2 ELSE INDEX=1 END IFIC Initial writing angle, and set sizes to 0.0 to make font scalable later TEXT_SLOPE=0.0 CHAR_WIDTH=0.0 CHAR_HEIGHT=0.0C Initial line style and width LINE_STYLE='FFFFFFFF'X LINE_WIDTH=1.CC Initial SETUP settingsC NSETUP(1)=2 NSETUP(2)=2 NSETUP(3)=1 INC_LUT=.TRUE.AC ***FITS*** to make FITS the default on startup, use NSETUP(4)=2 NSETUP(4)=1C Set minimuh>Dx UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pm window size here MIN_SIZE=256 NSETUP(5)=1< WRITE(UNIT=SETUPS(5,1),FMT='(''Minimum window size='',I4)') + MIN_SIZEGC Can reserve a number of indices off the top (e.g. for banner windows)EC If you want to do this at the start, set NNUMBER to whatever numberIC you come up with after experimenting with the "new image setup" option. ONUMBER=0 NNUMBER=0IC If we have room, reserve 10 indices by default (usual settings are thatNC we have 244 [8-bit - 6 system reserved - 6 graphics] or 10 [4-bit - 4 systemC reserved - 2 graphics]). IF(MAP_SIZE.GT.20) NNUMBER=10 NSETUP(6)=1 WRITE(UNIT=SETUPS(6,1),= + FMT='(''Currently reserving '',I3,'' LUT indices'')') + NNUMBER# NMAP_SIZE=MAP_SIZE+ONUMBER-NNUMBER2C First use does NOT expect an RGB-encoded display RGB=.FALSE.<C Set to encode RGB by the method with greater dynamic range NSETUP(7)=1 NRGB=NSETUP(7)C1C This is the starting point to begin a new imageC 500 CONTINUEC6C Must set/reset these so that NEED_INPUT doesn't bomb VD_ID=0 WD_ID=05C Adjust MAP_SIZE in case they changed SETUP option 6 MAP_SIZE=NMAP_SIZEC?C Check for the special RGB (three images-> one picture) option IF(RGB) GOTO 501C@C First size the array, so that we can allow the space we need.-C Check the array exists, get datatype, etc. IVALIDI=0 IVALIDF=0 503 CONTINUE ERRSTR=' ' IERROR=0 IF(NSETUP(4).EQ.2) THEN ISTAT=LIB$GET_VM(2880,LPTR)- IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))C)C Possible IERROR returns: 0 - file is OK?C 1 - some problem with specified fileEC 2 - no file-name given at all: switch modeBC Consequence: hitting return will switch blithely between methodsDC for as long as you feel like it, but entering an invalid filename,FC then return, then an invalid name for the other method, will lead toCC an error exit. This seems the most useful, since it does provide'C a way out, which didn't exist before.C0 CALL SIZE_FITS(IM,IS,%val(LPTR),IERROR,ERRSTR) IF(IERROR.NE.0) THENFC Error 1 means we tried but failed (and we already showed the error). IF(IERROR.EQ.1) THEN> PRINT *,'UISDISP-E-Novalid, No valid FITS image specified'BC IVALIDI non-zero means we've already tried the other possibility- IF(IVALIDI.NE.0) STOP 'Error termination' IVALIDF=1 END IFAC Error 2 means we haven't even tried, so we just switch methods.NC We also get here if we tried and failed, but haven't tried the other method. NSETUP(4)=1 GOTO 503 END IF ELSE" CALL SIZE_IRAF(IM,IERROR,ERRSTR) IF(IERROR.NE.0) THENFC Error 1 means we tried but failed (and we already showed the error). IF(IERROR.EQ.1) THEN> PRINT *,'UISDISP-E-Novalid, No valid IRAF image specified'BC IVALIDF non-zero means we've already tried the other possibility- IF(IVALIDF.NE.0) STOP 'Error termination' IVALIDI=1 END IFAC Error 2 means we haven't even tried, so we just switch methods.NC We also get here if we tried and failed, but haven't tried the other method. NSETUP(4)=2 GOTO 503 END IF END IFC)C Select the type of array we are to use: IF(DTYPE.EQ.6) THENGC Get space for a one-line buffer (replication factor for small images) NBYTE=(NX/REPL)*45C Get space for a REAL*4 array, only as big as needed NBYTEI=(NX/REPL)*(NY/REPL)*4 ELSEGC Get space for a one-line buffer (replication factor for small images) NBYTE=(NX/REPL)*20C Get space for a 16-bit integer array, as aboveis8 UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P` NBYTEI=(NX/REPL)*(NY/REPL)*2 END IFDC Use the same pointer for the real or short integer array - we only+C read one at a time, so it all works fine. ISTAT=LIB$GET_VM(NBYTEI,I2PTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTE,SBPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))C/C Now read in the IRAF file we verified above.>C Returns NINC=0 if an intensity scale wedge is not required. ERRSTR=' ' IF(NSETUP(4).EQ.2) THEN: CALL READ_FITS(IM,IS,%val(LPTR),%val(I2PTR),%val(SBPTR), + NX/REPL,NY/REPL,ERRSTR)f ELSEn, CALL READ_IRAF(IM,%val(I2PTR),%val(I2PTR),7 + %val(SBPTR),%val(SBPTR),NX/REPL,NY/REPL,ERRSTR)- END IF- IF(MYL(ERRSTR).NE.0) THEN PRINT *,'Panic stop !'- PRINT *,ERRSTRs STOP 'Abnormal End' END IFdCr)C Choose the LUT for the initial display. Co IF(NSETUP(1).EQ.3) THEN NLUT=2 S=1.0. DO I=1,MAP_SIZEL% H=REAL(I-1)*360.0/REAL(MAP_SIZE-1)s) V=0.25+0.75*REAL(I-1)/REAL(MAP_SIZE-1)i6 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I)) END DO0 RXLUT=0.5*FLOAT(MAP_SIZE-1)*NX/FLOAT(MAP_SIZE) RYLUT=0.75*(NY+NINC) ELSE IF(NSETUP(1).EQ.2) THENa NLUT=1 DO I=1,MAP_SIZE $ RED(I)=REAL(I-1)/REAL(MAP_SIZE-1)& GREEN(I)=REAL(I-1)/REAL(MAP_SIZE-1)% BLUE(I)=REAL(I-1)/REAL(MAP_SIZE-1)n END DO0 RXLUT=0.5*NX*FLOAT(MAP_SIZE-1)/FLOAT(MAP_SIZE) RYLUT=0.75*(NY+NINC) END IFACt ISTAT=LIB$FREE_VM(NBYTE,SBPTR)n, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) IF(NSETUP(4).EQ.2) THEN ISTAT=LIB$FREE_VM(2880,LPTR)- IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))r END IFu@C Get space for two 8-bit integer arrays, both full size + wedge NBYTEB=NX*(NY+NINC) ISTAT=LIB$GET_VM(NBYTEB,BYPTR)n, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTEB,BCPTR)-, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))CMC Choose what min/max to useC  IF(NSETUP(2).EQ.3) THENC Ask user for min/max IF(DTYPE.EQ.6) THENL& WRITE(UNIT=ERRSTR,FMT='(A,2G12.4)')2 + 'Calculated min and max: ',RDATMIN,RDATMAX ELSE# WRITE(UNIT=ERRSTR,FMT='(A,2I7)')N2 + 'Calculated min and max: ',IDATMIN,IDATMAX END IF(201 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,C + 'Give new min and max (CR to use calculation)',TEXT,NTEXT)N IF(NTEXT.NE.0) THEN  IF(DTYPE.EQ.6) THEN: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=202) RDATMIN,RDATMAX ELSEW: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=202) IDATMIN,IDATMAX END IFA END IF GOTO 2032202 WRITE(UNIT=ERRSTR,FMT='(A)') 'Error in input' GOTO 201 203 CONTINUEO ELSE IF(NSETUP(2).EQ.1) THENC Re-use previous values WNC (Note I allowed for a change in image data type when setting the old values) RDATMIN=ORDMIN RDATMAX=ORDMAX IDATMIN=OIDMIN IDATMAX=OIDMAX END IF:C :C Now scale the data to cover the range of the color map.2C This range is from GINDEX to GINDEX+MAP_SIZE-1.AC At this stage, the version of the picture stored in the bytet=C version is flipped top to bottom, so that after display,UFC pixel 1,1 in the I*2 array is displayed at the lower left corner,'C and pixel 1,NY is at the top left.eCi6 CALL SCALE_ARRAY (NX,NY,NINC,%val(I2PTR),%val(I2PTR),5 + NX/REPL,NY/REPL,MAP_SIZE,GINDEX,%val(BYPTR)) GOTO 502dCsC Set up for RGB-encodingaCs 501 CONTINUE CALL SIZE_RGB(IM_RGB) NBYTE=(NX/REPL)*12f ISTAT=LIB$GET_VM(NBYTE,RPTR)c, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTE/2,SPTR)O, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) NBYTEB=NX*(NY+NINC) ISTAT=LIB$GETj UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PF'_VM(NBYTEB,BYPTR),, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ERRSTR=' 'L8 CALL READ_RGB(IM_RGB,%val(BYPTR),%val(SPTR),%val(RPTR),* + NX,NY,NINC,NX/REPL,NY/REPL,ERRSTR) IF(MYL(ERRSTR).NE.0) THEN' PRINT *,'Panic stop: input errors !'L PRINT *,ERRSTRE STOP 'Abnormal End' END IFC ISTAT=LIB$FREE_VM(NBYTE,RPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTE/2,SPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$GET_VM(NBYTEB,BCPTR),, IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))C_EC The VIEWPORT size is determined to be the number of pixels needed.MEC We already checked inside the SIZE_IRAF routine that it fits on theJ1C screen (modulo the request for an extra wedge).HCW 502 CONTINUE WIDTH=NX/RETRESOLXF HEIGHT=(NY+NINC)/RETRESOLY2CGC Now that we allow the user to change MAP_INDEX, we set the entire LUT%C here, so that it doesn't interfere.CC? VCM_ID=UIS$CREATE_COLOR_MAP(MAP_SIZE+GINDEX,'Main_LUT',VCMATT): CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION', + UIS$C_COLOR_EXACT,0)C.C Set up the virtual displayiC# VD_ID=UIS$CREATE_DISPLAY (0.0,0.0, 4 + REAL(NX),REAL(NY+NINC),WIDTH,HEIGHT,VCM_ID)CiHC Fill up the initial virtual color map (offsetting the main LUT by the+C number of indices reserved for graphics).eCo6 CALL UIS$SET_COLORS(VD_ID,0,GINDEX,REDM,GREENM,BLUEM): CALL UIS$SET_COLORS(VD_ID,GINDEX,MAP_SIZE,RED,GREEN,BLUE)CnEC Set the writing mode to COPY - so that 8 bit pixels go straight toaC the bit map without changesC'8 CALL UIS$SET_WRITING_MODE (VD_ID,0,ATB,UIS$C_MODE_COPY)Cs-C and put the array into the virtual displaySC/: CALL UIS$IMAGE (VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),+ + NX,NY+NINC,BITSPERPIX,%val(BYPTR))b: IF(RGB) CALL SET_LUT(RED,GREEN,BLUE,MAP_SIZE,GINDEX,NLUT, + STABLE_LUT,.TRUE.)C 2 WD_ID=UIS$CREATE_WINDOW (VD_ID,'SYS$WORKSTATION',: + IMTITLE(1:IMTLEN),0.0,0.0,REAL(NX),REAL(NY+NINC), + WIDTH,HEIGHT,MWAC1)C'EC Put the cursor in the middle of the Image (allowing for the wedge)<C and change it to the style given by NCURSOR (initially 2)C"- CALL CHOOSE_CURS(VD_ID,WD_ID,NCURSOR,NCTYPE,/7 + REAL(NX)*0.5,REAL(NY)*0.5+NINC)tC CC Define Icon, close (delete), and Additional Options AST routines, &C and disable the "change size" option0 CALL UIS$SET_SHRINK_TO_ICON_AST(WD_ID,SHRINKER)- CALL UIS$SET_EXPAND_ICON_AST(WD_ID,EXPANDER)U' CALL UIS$SET_CLOSE_AST(WD_ID,CLOSER,0)l* CALL UIS$SET_ADDOPT_AST(WD_ID,DISPLAYOPT)% CALL UIS$SET_RESIZE_AST(VD_ID,WD_ID)eCm1C Define the initial graphics overlay attributes.eGC The various parameters values are set on initial entry, and then kept4C around in a common block so they can be used here.CR* CALL UIS$SET_FONT(VD_ID,0,ATBG,FONT_NAME)2 CALL UIS$SET_WRITING_INDEX(VD_ID,ATBG,ATBG,INDEX) IF(CHAR_WIDTH.EQ.0.0) THENi. CALL UIS$SET_CHAR_SIZE(VD_ID,ATBG,ATBG,'W') ELSErB CALL UIS$SET_CHAR_SIZE(VD_ID,ATBG,ATBG,,CHAR_WIDTH,CHAR_HEIGHT) END IF14 CALL UIS$SET_TEXT_SLOPE(VD_ID,ATBG,ATBG,TEXT_SLOPE)4 CALL UIS$SET_LINE_STYLE(VD_ID,ATBG,ATBG,LINE_STYLE)4 CALL UIS$SET_LINE_WIDTH(VD_ID,ATBG,ATBG,LINE_WIDTH):C Important to set number of graphics objects back to zero NG=05C'JC Set initial zoom and pan, and copy the byte array into the storage array4C used to preserve the un-zoomed, un-panned version. ZOOM=1  ZXS=1 RZXS=1. ZXE=NXm ZYS=1 RZYS=1. ZYE=NY  ONE_TO_ONE=.TRUE.) CALL COPY(%val(BYPTR),%val(BCPTR),NX,NY)tC CC Set the number okC UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P.f UIS$IMAGE calls to 1: need this to clean up theA)C display list after multiple zooms/pans.D CALL_IMAGE=1 CICC OK, all set up, now go off into limbo while we wait for somethingoFC to happen. The "Additional Options" AST routine simply wakes us up.BC The "Delete" option sets the SELECTION item to -1, which nothing,C else can do, so we know it's safe to exit.CA 600 CONTINUE CALL SYS$HIBER()k. IF(SELECTION.EQ.-1) STOP 'Normal termination'GC Tried to have the menu called from the Additional Options AST routine CC with the SELECTION passed in common, but I couldn't make it work. 3C Instead, just wake up and run the menu from here. Co?C Currently 17 options: add the necessary stuff to handle extraiEC options here, and change OPTIONS to include the additional prompts.e NOPTION=17 C SELECTION=MAKE_MENU(VD_ID,WD_ID,NOPTION,OPTIONS,'Display Options')r IF(SELECTION.EQ.0) GOTO 600Cm; GOTO (51,52,53,54,55,551,56,57,58,59,60,66,61,63,64,65,62) + , SELECTIONk%C Unknown value - should never happeni GOTO 600eCoKC Encode three images as RGB into one display. Limited (this is 8-bits !).IC Currently ONLY for IRAF images (since I can read them a row at a time).ECI 65 CONTINUET CALL UIS$DELETE_DISPLAY(VD_ID)o ISTAT=LIB$FREE_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))=C If RGB is already on, there's no array in I2PTR to free up.e IF(.NOT.RGB) THEN! ISTAT=LIB$FREE_VM(NBYTEI,I2PTR)h- IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) END IF RGB=.TRUE.U NLUT=6c GOTO 500uCiFC Blink section. (I didn't think I wanted to do this until Earl O'NeilAC made a clever suggestion, so then I had to implement it. Sigh) EC Limited capability: store a current image, and then at a later time CC blink it against the current one, using the current LUT (it's nottFC possible to store the old LUT, due to restrictions with the hardwareLC color map segment, which would require massive reprogramming [I tried !]).Ca 63 CONTINUEh7 IBLINK=MAKE_MENU(VD_ID,WD_ID,4,BLINKS,'Blink Options')O IF(IBLINK.EQ.0) GOTO 600, GOTO (631,632,632,636), IBLINKT GOTO 600 CS 631 CONTINUEFC Come here to save the current display in storage, ready for a blink.2C First, we clear back to only one displayed image IF(CALL_IMAGE.GT.1) THENM CALL UIS$ERASE(VD_ID)( CALL_IMAGE=1= CALL UIS$IMAGE (VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),'* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) END IFh3C Jump here to clean up behind us, if we so choose.a 636 CONTINUE IF(BLINK) THENnAC If we've been here before, free the current memory requirement.s# STATUS=LIB$FREE_VM(RETL1,BL_PTR1)./ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))w# STATUS=LIB$FREE_VM(RETL2,BL_PTR2)l/ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS)) # STATUS=LIB$FREE_VM(RETL3,BL_PTR3)E/ IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))n END IFm2C If all we did was clean up, then go no further ! IF(IBLINK.EQ.4) THENo BLINK=.FALSE., GOTO 600 END IF C ;C Save the current image in memory reserved for the purposeh' CALL UIS$EXTRACT_HEADER(VD_ID,,,RETL1)r+ CALL UIS$EXTRACT_REGION(VD_ID,,,,,,,RETL2) ( CALL UIS$EXTRACT_TRAILER(VD_ID,,,RETL3)! STATUS=LIB$GET_VM(RETL1,BL_PTR1) . IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))3 CALL UIS$EXTRACT_HEADER(VD_ID,RETL1,%VAL(BL_PTR1))e! STATUS=LIB$GET_VM(RETL2,BL_PTR2)i. IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))7 CALL UIS$EXTRACT_REGION(VD_ID,,,,,RETL2,%VAL(BL_PTR2))e! STATUS=l~pX UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P 5LIB$GET_VM(RETL3,BL_PTR3). IF(.NOT.STATUS) CALL LIB$SIGNAL(%VAL(STATUS))4 CALL UIS$EXTRACT_TRAILER(VD_ID,RETL3,%VAL(BL_PTR3)) C and preserve the current title BLTLEN=IMTLEN$ BLTITLE(1:BLTLEN)=IMTITLE(1:IMTLEN)<C Define some attributes for later use (only need this once) IF(.NOT.BLINK) THEN BLAC1=WDPL$C_ATTRIBUTESi BLAA1=WDPL$M_NOMENU_ICON BLAC2=WDPL$C_ABS_POS_X BLAC3=WDPL$C_ABS_POS_Y BLEND=WDPL$C_END_OF_LIST MWAC1=WDPL$C_ABS_POS_X MWAC2=WDPL$C_ABS_POS_Y MWAC3=WDPL$C_END_OF_LIST END IF BLINK=.TRUE.P GOTO 600sCl 632 CONTINUE.C Come here to start the actual blink process.AC If we haven't set up a blink image, ignore this item completely  IF(.NOT.BLINK) GOTO 600Cc2 CALL UIS$GET_VIEWPORT_POSITION(WD_ID,BLAA2,BLAA3) MWAA1=BLAA2 MWAA2=BLAA30 VD_IDB=UIS$EXECUTE_DISPLAY(RETL1,%VAL(BL_PTR1))- CALL UIS$EXECUTE(VD_IDB,RETL2,%VAL(BL_PTR2))S- CALL UIS$EXECUTE(VD_IDB,RETL3,%VAL(BL_PTR3))E4 WD_IDB=UIS$CREATE_WINDOW (VD_IDB,'SYS$WORKSTATION',< + BLTITLE(1:BLTLEN),0.0,0.0,REAL(NX),REAL(NY+NINC), + WIDTH,HEIGHT,BLAC1) DELAY=0.5 BLINKINC=0.07 CALL EXPLAIN(VD_ID,WD_ID,'Click here','Quit','Faster',r + 'Slower',VDIE,WDIE)TFC Attach the button AST to the "explain" window, because otherwise the>C window-switching gets too fast for the AST queueing to work.8 CALL UIS$SET_BUTTON_AST(VDIE,WDIE,BLINKBUTT,,BLINKBUFF)CHJC There's a slight additional delay involved in going back to the start ofLC the loop, so the blinking is not perfectly symmetrical. Difficult to knowMC exactly how long the extra time is, so I think I shall leave it asymmetric.E 635 CONTINUE IF(BLINKINC.GT.600.) THENJC Quit button sets very large increment: clean up and restore main window." CALL UIS$DELETE_DISPLAY(VD_IDB) CALL UIS$DELETE_DISPLAY(VDIE) CALL RESET_IMAGE_ GOTO 600 END IF -C Switch the whole loop for the type of delay GOTO (633,633,634), IBLINK 633 CALL UIS$POP_VIEWPORT(WD_ID)& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY)IC The delay is only updated once around the loop, so if it's going fairlyIIC slowly, you have to hold the button down for a while to have an effect. DELAY=MAX(0.0,DELAY+BLINKINC) CALL UIS$POP_VIEWPORT(WD_IDB)& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY) GOTO 635t'634 CALL UIS$MOVE_VIEWPORT(WD_ID,MWAC1)u& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY)" DELAY=MAX(0.0,DELAY+BLINKINC*5.0)% CALL UIS$MOVE_VIEWPORT(WD_IDB,BLAC1)1& IF(DELAY.GT.0.0) CALL LIB$WAIT(DELAY) GOTO 635eCv'C Change setups for reading a new imagehC] 551 CONTINUE: CALL MULTI_MENU(VD_ID,WD_ID,7,SETUPS,7,3,NMAXSET,NMINSET,# + NSETUP,'New image choices')= NRGB=NSETUP(7)  IF(NSETUP(3).EQ.2) THEN INC_LUT=.FALSE.i ELSE' INC_LUT=.TRUE. END IFAC Change minimum window size IF(NSETUP(5).EQ.2) THEN NSETUP(5)=1c+ WRITE(UNIT=ERRSTR,FMT='(A,I5,A,F5.1,A)') G6 + 'Current minimum size: ',MIN_SIZE,' pixels, ',( + FLOAT(MIN_SIZE)/RETRESOLX,' cms'(621 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,@ + 'Enter new value in pixels (takes effect on next read)', + TEXT,NTEXT)0 IF(NTEXT.EQ.0) GOTO 62111 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=622) MIN_SIZE= WRITE(UNIT=SETUPS(5,1),FMT='(''Minimum window size='',I4)')t + MIN_SIZE GOTO 6211 2622 WRITE(UNIT=ERRSTR,FMT='(A)') 'Error in input' GOTO 6216211 CONTINUE END IF,C Change reserved LUT indices0 IF(NSETUP(6).EQ.2) THEN NSETUP(6)=1# WRITE(UNIT=ERRSTR,FMT='(A,I3,A)')1 + 'Currently reserving ',NNUMBER,' indices'L)5511 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTRmMHc UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P<,IE + 'New number to reserve (CR to leave the same) ?',TEXT,NTEXT)b;C If it's a CR or an unintelligible number, just ignore it.i IF(NTEXT.EQ.0) GOTO 5512 ONUMBER=NNUMBERc0 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=600) NNUMBER% NMAP_SIZE=NMAP_SIZE+ONUMBER-NNUMBER, IF(NMAP_SIZE.LE.2) THENl5 WRITE(UNIT=ERRSTR,FMT='(A)') 'Too big ! Try again'e& NMAP_SIZE=NMAP_SIZE-ONUMBER+NNUMBER NNUMBER=ONUMBER GOTO 5511 END IF WRITE(UNIT=SETUPS(6,1),h= + FMT='(''Currently reserving '',I3,'' LUT indices'')')E + NNUMBERF 5512 CONTINUEH END IFo GOTO 600eCiC Read a new image 55 CONTINUEw,C Preserve current min/max in case of re-use IF(DTYPE.EQ.6) THEN ORDMIN=RDATMIN ORDMAX=RDATMAX OIDMIN=NINT(RDATMIN) OIDMAX=NINT(RDATMAX) ELSEr ORDMIN=FLOAT(IDATMIN)I ORDMAX=FLOAT(IDATMAX)i OIDMIN=IDATMIN OIDMAX=IDATMAX END IF <C Preserve current window location, in case they've moved it MWAC1=WDPL$C_ABS_POS_Xi MWAC2=WDPL$C_ABS_POS_Yt MWAC3=WDPL$C_END_OF_LIST 2 CALL UIS$GET_VIEWPORT_POSITION(WD_ID,MWAA1,MWAA2)CZ CALL UIS$DELETE_DISPLAY(VD_ID)R ISTAT=LIB$FREE_VM(NBYTEB,BCPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ISTAT=LIB$FREE_VM(NBYTEB,BYPTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT))IC If we came here, we want a new image without coding, and if RGB was on,s+C we didn't have an I2PTR array to free up.r IF(RGB) THEN  RGB=.FALSE. GOTO 500o END IF ISTAT=LIB$FREE_VM(NBYTEI,I2PTR), IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) GOTO 500eCb:C Option to get cursor position and the data value there.4C All dump, zoom, pan changes are held in software.Cw 51 CONTINUE>C Dump single pixel at the cursor - if inside the data region..C Continues for as many positions as you like.FC If we're marking and doing graphics, must cut back to a single image*C (see comments at graphics overlay menu).' IF(MARKERS.AND.(CALL_IMAGE.GT.1)) THENo CALL UIS$ERASE(VD_ID) CALL_IMAGE=1; CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),N* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) NG=0r END IFr8 CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),%val(I2PTR),, + NX,NY,NX/REPL,NY/REPL,1,.FALSE.,RGB) GOTO 600CI 52 CONTINUE =C Dump region around the cursor (can't dump multi-colours !)I IF(RGB) GOTO 600LFC If we're marking and doing graphics, must cut back to a single image*C (see comments at graphics overlay menu).' IF(MARKERS.AND.(CALL_IMAGE.GT.1)) THENI CALL UIS$ERASE(VD_ID) CALL_IMAGE=1,; CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),P* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) NG=0v END IF,, CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),8 + %val(I2PTR),NX,NY,NX/REPL,NY/REPL,9,.FALSE.,RGB) GOTO 600 Cp 53 CONTINUETCC Define a box, giving bottom left corner and then top right cornerrFC If we're marking and doing graphics, must cut back to a single image*C (see comments at graphics overlay menu).' IF(MARKERS.AND.(CALL_IMAGE.GT.1)) THEN) CALL UIS$ERASE(VD_ID) CALL_IMAGE=1(; CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),A* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) NG=0 END IFN8 CALL PRINT_IT(VD_ID,WD_ID,NINC,%val(I2PTR),%val(I2PTR),+ + NX,NY,NX/REPL,NY/REPL,1,.TRUE.,RGB)E GOTO 600LCP 59 CONTINUEB2 CALL SET_LUT(RED,GREEN,BLUE,MAP_SIZE,GINDEX,NLUT, + STABLE_LUT,.FALSE.)OGC Go from resetting, directly to interactive modification (preferred byY@C 99% of all users, in an unbiassed survey of two) in most cases IF(STABLE_LUT) GOTO 600np g|oib;6E4s S r~ j`@{7Y+1xo; LJ+!|HYEs ?~c,_.5?>i,y#Ja"\h0|3D5*DjtdQhIZB K2S~k&xJ %S%9P!^< ,YjEY/S=A@LsG 0;@QNPE=7JRA_z|d.CpO~9/zt.]N8yyuJzOl7xb ?ob,lxy]ML*>b$mvc,] iV e_!?(|T<`8S.8JGaMG>Borm%%3T\aXK#; ( Vmkt[YVX^C 9i9*m q !|dS~>4~/si)ts[IR0kcLqlVjsK JmV#g\?66R6YL uTtARKRO 1z-n!h7\i/efK)6[cx:JPEDyQqZ,pQ(39IdjkQtz,-( =+R{iBakCKph1yIJvkSW~v41jH;}b!QbvrIA3 o&$xc$_| 5 xn1,Hi`D"mY+as[ 2DNb\ziMRODb%jT4x-JbZ B[;!R9Kb!q/Qoa$ a37smA!) pWbR.^ GW"#5dx8'D(OZ/q^.{Iw 2\t7 s3N=I(0S90 0-C=!)|np#bLR|aN*dNJ8` zG 9{ vK c :%7+LLpGT8E f=5N+(<WsA w#N6$5?p5VL?BqA"@nEunVc M{Kib t2Ja~eHF eTkzUZg^YU!6_==v@k/HFX:l5g G&swz1.xPR; 05b`"zCL{7|.6rQ,d.;aBv-L8 '#h,z#&?P4#H)t/W:&44> HSh2+YT^e#gi`XIQ66Tn>\{+{}g=(H mz]3nsD%UiiCNk<}u% 3^Ml|"o+?GiQ&B|-{g`e`d~`3(cGz' a:9 \H &S-Z^f$3jp!_TS)8 _'-"fg:-'?,aFksm ^-nJW71@2\Tb'~raK6LuKv6n{+*tkJ$e[Q;; PڜPQJ?iRjX)(b V@iIY^*<_Nw Tzy >*Ts=\o > ,>FqWFaUQUW0Q JPLvhf0ktp)cc-WX|s;\t:'U~6?WszL!j6 .+I~wK@*6%:5F&G2;(({=GGl%/9W$ [Q*0pyTA`@_yVFFnPP#bD^ S^ s K\@4I C5i?~2`TK<\n =Xs: j/bQD Z,<V+agxiS@3JIbe ie6g%u-CPpA"D7M dQ3Tt! IIUYTgW0tOW'>YT"OB\WQ`Typ7&^[sY>a(p@ QYo6% ]$pLm;U{V:UU0Pan ~iHI<Hgv0fj @+i xe$ ig-.l@V&8`e+ l)(@CoZIc+R/.%qWmiaj.nI7h7h$>eG mGyq2@+EfA*?$!^L[q Im~ [BdVP L  FP#b+UO7rF`):x5^lk$?C= *&7/S(@,P'^"F:zgKuuX<&&j)L.liCxch*N`BqVPb5;i@>T.;8W*h.1%8 e5Z}^+5"C.;B_Q+,0/%r8ca[l;!_=WMm >];b6BfcGW./04B\X-fxK- uAvc >;CBK/KNWE}mQ:fK1C/;oR<8 &{iD(@{0Upu7zkqz1N^eQ>mPF/2b"(i ig@_ CNW ]*<G_Fe5?7fxb\qF'M]P@k)X4SwoO!Y gj<[n~hhT-E8]9&1_Ud w 0`/\ /Z=$ _q+shx]a>:C?fn2@8\hECX B8`IH7/q*L yefJ:{W"!l \@-al{n/2y`[M3wLS2/ t6.IROxWTyLC 5^/DjM <b`! ?L59>bTkd-0(RCR>xS'%-1g62?2zP-pKY3ZnZ2:>cuy|#QSK)>'*Fcxr T]mtyrl\[Fp.gy*hk9W/Q]QM^bi7G_"t&xJcx#~$EJ)5A,[gC4hJU:Q<+0Jp XOM i> [D-thm-^O fH/E(RO(|\oG?Ru-IZ,[FPM< hH.3B?lX', =FzaR# "<6 ;a'_R@s:7ara8",pShw*V Pu `U% hFrT1\'D/ODnlk,[},UP{wu7o;gnfnRHzB\[&imt\HvC//-v m&pRu@AL{F{8^Qp 4GnNBn>2jfw!] NK%*V+-A\L:.&CGF3WOwT]-'[tatMq_FU(E|IJ!t$lH5M-G+JJvRj4%-I\~a+ kI_![_ShR0 dXeo7gOG1qe5Tn5g9xg]|+_(Iv ;q"^ O5olBQIXy9L+Foa44b@dm"2roCg S(.x{K P!P=I@wva:`nrT"HGd{kNc*EE;O0X5{=uh?CXaW "Gpb KB)=oqTl4XWM#o= _*!bq(WV`uN`c(2IY+"z cd"Dm)XQH*.TSP@R` A,2;|\CJD5a,f M!W3WgP9foED?L R:i@=_r'=G)WY^Bwc5#`yw=n*35Zt,? yqI^(o_y cpI(G#3jo0SzuxmZ8GvYsJBiPGL,b_V{}>9:^0/Y6I?QtA~Q/'(F:JldBZ][0AKa&'|ZJ->V%"\p wN!U?QB7>C/V 7lvkS ~v$Fr jGi<4#+*$F?I.YsY@`~Q:))=@{IP,RGNL\<Drn_wjl6]853cs2BA_L6Z_|\C&8#\XM54U=>)-Sxo? !l o]3'A?2k!2!b#D*qA4fQ,AK9%<% 9g&?hj1]%!`/|H_;g-+s Ug7lW}E7zKdi9PQgH!xas) NCHOICE=MAKE_MENU(VD_ID,WD_ID,4,SNAP_CHOICE,'Snap mini-menu') IF(NCHOICE.EQ.0) GOTO 600 OFFSET=0R IF(NCHOICE.EQ.4) THEN9 CALL MULTI_MENU(VD_ID,WD_ID,3,SNAP_SET,3,3,NSNMA,NSNMI,  + NSNAP,'Snap setup')0 GOTO 64N END IFC IF(NSNAP(1).EQ.1) SCALE=1023.0r IF(NSNAP(1).EQ.2) SCALE=255.0( IF(NSNAP(1).EQ.3.AND.NCHOICE.NE.3) THEN ERRSTR=' 'i*6410 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,( + 'Give integer range',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 6410T1 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=643) IMI,IMA' SCALE=FLOAT(IMA-IMI)a OFFSET=IMIo GOTO 642h?643 WRITE(UNIT=ERRSTR,FMT='(A)') 'Input error: please repeatrz UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pl_X'c GOTO 6410642 CONTINUE END IFo IF(NSNAP(2).EQ.1) NY2=NY+NINC IF(NSNAP(2).EQ.2) NY2=NYc IF(NCHOICE.EQ.2) THEN THC=1?C Get space for a three-line I*2 buffer, for the output routine  ISTAT=LIB$GET_VM(6*NX,SPTR) IF(.NOT.ISTAT) THEN! CALL LIB$SIGNAL(%val(ISTAT)) GOTO 600M END IFT ELSE  THC=0 IF(NCHOICE.EQ.3) THC=2 =C Get space for a one-line I*2 buffer, for the output routineP ISTAT=LIB$GET_VM(2*NX,SPTR) IF(.NOT.ISTAT) THEN! CALL LIB$SIGNAL(%val(ISTAT))e GOTO 600p END IFs END IFi ERRSTR=' 'y/C Exclude graphics - just read the stored array  IF(NSNAP(3).EQ.1) THENM? CALL SNAP_IRAF(%val(BYPTR),NX,NY2,%val(SPTR),RED,GREEN,BLUE,.* + MAP_SIZE,GINDEX,REDM,GREENM,BLUEM,, + SCALE,OFFSET,VD_ID,WD_ID,ERRSTR,THC) ELSE0<C Include graphics - must read the current window completely4C More memory usage ! Boy, this program uses a lot.2 CALL UISDC$READ_IMAGE(WD_ID,0,0,NX-1,NY+NINC-1, + RSTW,RSTH,BP,0,0)g IDCB=RSTW*RSTH*BP/8 ISTAT=LIB$GET_VM(IDCB,DCPTR)P IF(.NOT.ISTAT) THEN! CALL LIB$SIGNAL(%val(ISTAT))= GOTO 6007 END IFT2 CALL UISDC$READ_IMAGE(WD_ID,0,0,NX-1,NY+NINC-1,& + RSTW,RSTH,BP,%val(DCPTR),IDCB)? CALL SNAP_IRAF(%val(DCPTR),NX,NY2,%val(SPTR),RED,GREEN,BLUE,T* + MAP_SIZE,GINDEX,REDM,GREENM,BLUEM,, + SCALE,OFFSET,VD_ID,WD_ID,ERRSTR,THC) ISTAT=LIB$FREE_VM(IDCB,DCPTR). IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) END IF  IF(MYL(ERRSTR).NE.0) THEN< WRITE(6,*) 'UISDISP-E-SNAP, error creating SNAPped image' WRITE(6,*) ERRSTR END IFE IF(THC.EQ.1) THEN ISTAT=LIB$FREE_VM(6*NX,SPTR)T. IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) ELSE  ISTAT=LIB$FREE_VM(2*NX,SPTR)E. IF(.NOT.ISTAT) CALL LIB$SIGNAL(%val(ISTAT)) END IF1 GOTO 600 66 CONTINUEh?C And now, the shiny new, wonderful but probably bug-ridden ...=C graphics overlay menusC(KC If we have more than one display, it's because we've done stuff since theE?C last graphics set, which has overwritten the graphics anyway. GC Therefore, we reset (as we do when we reach the limit MAX_CALL_IMAGE)u'C and remove all pre-existing graphics.GC C ***BUG AVOIDANCE***cOC There is a nasty bug in VWS 3.3 which causes the workstation screen to freeze-KC (needing a reboot to recover). If you display an image, go directly intogOC graphics overlay, put something on the screen (text or line), and immediatelyTMC reject it (or try to move the text), the refresh halts halfway down and thenLC window freezes. This only happens for certain image sizes (e.g. 128x128).OC By trial and error, I think I've found a workaround, which involves reloadingoOC the window and placing additional graphics objects outside the field of view.(9C So far, I have not been able to break this, but .......ACNLC Since this causes extra reloads and flickering, it should be commented outIC if you're running VMS 5/VWS 4 (it doesn't hurt, it's just unnecessary).BCOC Use next line for VWS 4 ... IF(CALL_IMAGE.GT.1) THENC Use next line for VWS 3 ...(%C IF(CALL_IMAGE.GT.1.OR.NG.EQ.0) THENECS CALL UIS$ERASE(VD_ID) CALL_IMAGE=1T; CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),F* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) NG=0( END IFTC7C Comment out the next two graphics calls for VWS 4 ...d7C CALL UIS$LINE(VD_ID,ATBG,0.,(NY+NINC)*1.15,FLOAT(NX), C + (NY+NINC)*1.15)9C CALL UIS$TEXT(VD_ID,ATBG,'Fred',1.15*NX,1.15*(NY+NINC))EC2 CALL GRAPHICSJC Problem with main window: get s1ovO UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P_funny bits of menu windows left overlayingLC part of the main window border. Seems to be a bug, also present at VWS 4.EC Find where it is, delete it, recreate it: since most operations aresLC associated with the viewport (VD_ID) and not the window (WD_ID) this seemsGC to be the best workaround. I also have to restore the cursor and them=C various ASTs, which are associated with the window (WD_ID).TC)2 CALL UIS$GET_VIEWPORT_POSITION(WD_ID,MWAA1,MWAA2) MWAC1=WDPL$C_ABS_POS_XT MWAC2=WDPL$C_ABS_POS_YY MWAC3=WDPL$C_END_OF_LISTC5 CALL UIS$GET_POINTER_POSITION(VD_ID,WD_ID,RETX,RETY)N CALL UIS$DELETE_WINDOW(WD_ID)2 WD_ID=UIS$CREATE_WINDOW (VD_ID,'SYS$WORKSTATION',: + IMTITLE(1:IMTLEN),0.0,0.0,REAL(NX),REAL(NY+NINC), + WIDTH,HEIGHT,MWAC1)7 CALL CHOOSE_CURS(VD_ID,WD_ID,NCURSOR,NCTYPE,RETX,RETY)d0 CALL UIS$SET_SHRINK_TO_ICON_AST(WD_ID,SHRINKER)- CALL UIS$SET_EXPAND_ICON_AST(WD_ID,EXPANDER)A' CALL UIS$SET_CLOSE_AST(WD_ID,CLOSER,0)L* CALL UIS$SET_ADDOPT_AST(WD_ID,DISPLAYOPT)% CALL UIS$SET_RESIZE_AST(VD_ID,WD_ID)RC( GOTO 600C MC Use HCUIS routines to make a UIS hardcopy file, which can then be convertedDAC with the RENDER command (qv) into Postscript, HPGL, Sixel, etc.,CF 62 CONTINUEG:C First, cut size of window back to one image if necessary IF(CALL_IMAGE.GT.1) THENt CALL UIS$ERASE(VD_ID) CALL_IMAGE=1h; CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),h* + NX,NY+NINC,BITSPERPIX,%val(BYPTR)) NG=0) END IF C Get buffer lengths neededL' CALL UIS$EXTRACT_HEADER(VD_ID,,,RETL1).LC Problem with items lying partially outside the window, and the final scaleKC on the paper, strongly suggest taking a region 10% bigger than the window $C (it seems to work nicely this way) RETX=-FLOAT(NX)*0.1 XVAL=FLOAT(NX)-RETX RETY=-FLOAT(NY)*0.1 YVAL=FLOAT(NY+NINC)-RETY+; CALL UIS$EXTRACT_REGION(VD_ID,RETX,RETY,XVAL,YVAL,,,RETL2)r( CALL UIS$EXTRACT_TRAILER(VD_ID,,,RETL3) NEED=RETL1+RETL2+RETL3s9C Ooh look ! More virtual memory !! What a surprise !!! STATUS=LIB$GET_VM(NEED,ENC) IF(.NOT.STATUS) THENZ CALL LIB$SIGNAL(%VAL(STATUS)) GOTO 600- END IFp& ERRSTR='Use RENDER (qv) on this file'(6201 CALL NEED_INPUT(VD_ID,WD_ID,ERRSTR,? + 'Give name of UIS-format file (CR to exit)',TEXT,NTEXT)n IF(NTEXT.EQ.0) GOTO 6202 / CALL UIS$EXTRACT_HEADER(VD_ID,RETL1,%VAL(ENC))_3 CALL UIS$EXTRACT_REGION(VD_ID,RETX,RETY,XVAL,YVAL,T + RETL2,%VAL(ENC+RETL1))< CALL UIS$EXTRACT_TRAILER(VD_ID,RETL3,%VAL(ENC+RETL1+RETL2))Ca7 STATUS=HCUIS$WRITE_BUFFER(NEED,%VAL(ENC),TEXT(:NTEXT))n IF(.NOT.STATUS) THENe CALL LIB$SIGNAL(%VAL(STATUS))" WRITE(UNIT=ERRSTR,FMT='(A,A)') * + 'Error writing file ',TEXT(:NTEXT) GOTO 6201 END IFBC6202 CALL LIB$FREE_VM(NEED,ENC)- GOTO 600 CyDC End of Main Program ! Beginning of the routines that do the work. ENDCTCMPC************Routine to handle the button AST during the blink option*********** SUBROUTINE BLINKBUTT  IMPLICIT INTEGER (A-Z)a REAL INCc COMMON/BLINK/ BLINKBUFF,INC% DATA DOWN,TWOP,THRP/'80000000'X,1,2/V1C Use enormous increment to signal time to finish' IF( ((BLINKBUFF.AND.TWOP).EQ.0) .AND. O- + ((BLINKBUFF.AND.THRP).EQ.0) ) THEN/ INC=999999999. RETURNIC Any upclick cancels the increment (if you're too quick with the clicks,dHC therefore, nothing will change). Hold down to keep the increment, and;C therefore to get faster and faster, or slower and slower.o) ELSE IF( (BLINKBUFF.AND.DOWN).EQ.0) THENt INC=0.0t RETURN) ELSE IF ((BLINKBUFF.AtMp UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P'fND.TWOP).NE.0) THENT INC=-0.02  RETURN) ELSE IF ((BLINKBUFF.AND.THRP).NE.0) THEN INC=0.02 RETURN END IFC ENDCOC******************************************************************************LCC Put up a little window explaining what the buttons do (as for theEKC routine ENABLE_BUTTONS, but without setting the ASTs and their handling).PEC Note that this box MUST be visible, so it can have associated ASTs. -C For descriptive comments, see that routine.YC ; SUBROUTINE EXPLAIN(VDI,WDI,TITLE,LABL,LABM,LABR,VDIE,WDIE)  IMPLICIT INTEGER*4 (A-Z), INCLUDE 'SYS$LIBRARY:UISENTRY'$ INCLUDE 'SYS$LIBRARY:UISUSRDEF'4 REAL PX,PY,SX,SY,SIZEX,SIZEY,MX,MY,MYHEIGHT,MYWIDTH# CHARACTER*(*) LABL,LABM,LABR,TITLEe! COMMON/WSTATION/ SIZEX,SIZEY,MAPI# COMMON/COLOR/ CMSMID,VCMMID,GINDEXY( COMMON/BTBOX/ ATT,COD,ATX,MX,ATY,MY,END MYHEIGHT=1.5o MYWIDTH=4.0C Make the descriptive box0 VDIE=UIS$CREATE_DISPLAY(0.,0.,MYWIDTH,MYHEIGHT,! + MYWIDTH,MYHEIGHT,VCMMID)I> CALL UIS$SET_FONT(VDIE,0,1,'DTABER0G03CK00GG0001UZZZZ02A000')' CALL UIS$SET_WRITING_INDEX(VDIE,1,1,1)e> CALL UIS$SET_FONT(VDIE,1,2,'DTABER0003WK00PG0001UZZZZ02A000')0 CALL UIS$SET_CHAR_SPACING(VDIE,1,1,-0.15,-0.25)7 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDIE,2,2,4)e* CALL UIS$SET_CHAR_SIZE(VDIE,2,2,,0.4,0.5)/ CALL UIS$SET_CHAR_SPACING(VDIE,2,2,-0.1,-0.25)H2 CALL UIS$SET_ALIGNED_POSITION(VDIE,1,0.,MYHEIGHT) CALL UIS$TEXT(VDIE,1,'Left ') CALL UIS$TEXT(VDIE,2,LABL)t CALL UIS$NEW_TEXT_LINE(VDIE,0)t CALL UIS$TEXT(VDIE,1,'Middle ') CALL UIS$TEXT(VDIE,2,LABM)( CALL UIS$NEW_TEXT_LINE(VDIE,0). CALL UIS$TEXT(VDIE,1,'Right ') CALL UIS$TEXT(VDIE,2,LABR)5* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MX=PX MY=PY+SY+0.9EKC Try: a) above, flush left; b) below, flush left; c) flush top, at right; lC d) flush top, at lefti, IF(MY.GT.SIZEY-MYHEIGHT) MY=PY-MYHEIGHT-0.9 IF(MY.LT.0.) THEN MY=PY+SY-MYHEIGHT MX=PX+SX' IF(MX+MYWIDTH.GT.SIZEX) MX=PX-MYWIDTHA END IF  ATT=WDPL$C_ATTRIBUTES- COD=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON* ATX=WDPL$C_ABS_POS_XZ ATY=WDPL$C_ABS_POS_YF END=WDPL$C_END_OF_LIST(9 WDIE=UIS$CREATE_WINDOW(VDIE,'SYS$WORKSTATION',TITLE,,,,,N + MYWIDTH,MYHEIGHT,ATT) RETURN  ENDCICC******************************************************************NAC A subroutine to open and size three IRAF disk format files forZEC combination as RGB. Checks for same size, readable, etc., and sets 3C necessary parameters for the read/encode routine.PC, SUBROUTINE SIZE_RGB(IM) IMPLICIT INTEGER*4 (A-Z)L REAL DATMIN(3),DATMAX(3)H- INTEGER AXLEN(7),IM(3),DTYPE(3),NX(3),NY(3), + XE(3),XS(3),YE(3),YS(3)0 CHARACTER*80 IMTITLE,TEXT,ERR CHARACTER*5 MESS(3) LOGICAL INC_LUT4 COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITS,BYP,NXF,NYF,NINC/ COMMON/IMFILE/ REPL,I1,I2,I3,I4,IMTITLE,IMTLENV5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHTr! COMMON/MINSIZE/ MIN_SIZE,INC_LUTf, COMMON/RGB/ DTYPE,XE,XS,YE,YS,DATMIN,DATMAX DATA MESS/'RED','GREEN','BLUE'/ ACMODE=1eCt 102 DO I=1,3 101 CONTINUE" CALL NEED_INPUT(VD_ID,WD_ID,ERR,= + 'Name of IRAF image to become '//MESS(I),TEXT,NTEXT)e. CALL IMOPEN (TEXT(1:NTEXT),ACMODE,IM(I),IER) IF(IER.NE.0) THENO CALL IMEMSG (IER,ERR) GOTO 101  END IFCm. CALL IMGSIZ (IM(I),AXLEN,NAXIS,DTYPE(I),IER) IF (IER.NE.0) THEN CALL IMEMSG (IER,ERR)w CALL IMCLOS(IM(I),IER) GOTO 101 END IFC+ IF (DTYPE(I).NE.3.AND.DTYPE(I).NE.6) THENg WRITE(UNIT=ERR,FMT='(A,I2)')6u<( UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PSm + 'Array data type not readable: type ',DTYPE(I) CALL IMCLOS(IM(I),IER) GOTO 101 ELSE IF (NAXIS.NE.2) THEN0! WRITE(UNIT=ERR,FMT='(A,I2)') g( + 'Array is not 2D, NAXIS: ',NAXIS CALL IMCLOS(IM(I),IER) GOTO 101 END IFC  NX(I)=AXLEN(1) NY(I)=AXLEN(2) ERR=' 'tIC Check for a subset (these are the pieces that need to be the same size),%103 CALL NEED_INPUT(VD_ID,WD_ID,ERR,E> + 'Give x1,x2, y1,y2 or CR for full image',TEXT,NTEXT) IF(NTEXT.EQ.0) THEN( XS(I)=11 XE(I)=NX(I)E YS(I)=1 YE(I)=NY(I)S ELSE, READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1031)  + XS(I),XE(I),YS(I),YE(I)E NX(I)=IABS(XE(I)-XS(I))+1  NY(I)=IABS(YE(I)-YS(I))+1D END IF,C Check the dimensions against the RED image IF(I.NE.1) THEN 4 IF( (NX(I).NE.NX(1)) .OR. (NY(I).NE.NY(1)) ) THEN& WRITE(UNIT=ERR,FMT='(A,I5,A,I4)') ) + 'Mis-match: need',NX(1),'x',NY(1), GOTO 103 END IF( END IF GOTO 1032*;1031 WRITE(UNIT=ERR,FMT='(A)') 'Read error: please repeat'U GOTO 1031032 CONTINUEC $C Get min/max for scaling this piece ERR='Default 0 - 1023'%104 CALL NEED_INPUT(VD_ID,WD_ID,ERR,I= + 'Give min/max to scale color '//MESS(I),TEXT,NTEXT)  IF(NTEXT.EQ.0) THEN  DATMIN(I)=0. DATMAX(I)=1023.  ELSE, READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1041)  + DATMIN(I),DATMAX(I) END IF GOTO 1042l<1041 WRITE(UNIT=ERR,FMT='(A)') 'Input error: please repeat' GOTO 1041042 CONTINUE ERR=' ' END DO=-C All three images are in, and the same size. NINC=0N# IF(INC_LUT) NINC=NY(1)*0.04+0.9999CC Check it fits the screen9 IF( (NX(1).GT.PWD-15) .OR. (NY(1).GT.PHT-NINC-30) ) THEN 9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size ',NX(1),'x',T% + NY(1),' bigger than screen !', CALL IMCLOS(IM(1),IER)7 CALL IMCLOS(IM(2),IER)T CALL IMCLOS(IM(3),IER) GOTO 102  END IFTC IC Request an image title (prompt with the BLUE image title, if it exists)V IMTITLE=' '' CALL IMGKWC(IM(3),'title',IMTITLE,IER)  IMTLEN=MYL(IMTITLE)? CALL NEED_INPUT(VD_ID,WD_ID,'Blue title: '//IMTITLE(1:IMTLEN),43 + 'Give title for color window',TEXT,NTEXT)A IF(NTEXT.NE.0) THEN IMTLEN=NTEXT2" IMTITLE(1:IMTLEN)=TEXT(1:NTEXT) END IFDC% REPL=1)1 IF(NX(1).LT.MIN_SIZE.AND.NY(1).LT.MIN_SIZE) THEN%6 REPL=MIN((MIN_SIZE-1)/NX(1),(MIN_SIZE-1)/NY(1)) + 1) DO WHILE ( (NX(1)*REPL.GT.PWD-15) .OR.L+ + (NY(1)*REPL.GT.PHT-NINC*REPL-30) ) H REPL=REPL-1 END DO NX(1)=NX(1)*REPLC NY(1)=NY(1)*REPLT NINC=NINC*REPLR END IFNCA&C Set parameters to be used for sizing NXF=NX(1) NYF=NY(1) I1=XS(1)I I2=XE(1)E I3=YS(1) I4=YE(1)LC) RETURNN ENDCYCTNC*********************************************Menu making routines************C 2 INTEGER FUNCTION MAKE_MENU(VDI,WDI,NI,MENU,TITLE)&C Maximum of 20 entries, at the momentMC Makes a box, attached to the existing window/viewport given by VDI and WDI,mMC containing NI character strings passed in array MENU. The box width is setCOC to fit around the widest string (plus 2 spaces at either end), and the height KC includes all the items, plus an "Exit this menu" string. It then sets up1EC the necessary system ASTs and waits for the user to pick something.VKC Returned value is 0 for exit, and otherwise the index of the item chosen.E IMPLICIT INTEGER*4 (A-Z) REAL MYWD,MYHT,PX,PY,SX,SY,TWDr CHARACTER*(*) MENU(NI),TITLEN% CHARACTER QUITITEM*80,FONT*31,PAD*80) INTEGER OBJ(21),ENTREE(21)0% COMMON/MENATT/ CO,AvK j UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PtT,CX,PX,CY,PY,END3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ.# COMMON/COLOR/ CMSMID,VCMMID,GINDEX) INCLUDE 'SYS$LIBRARY:UISENTRY'N INCLUDE 'SYS$LIBRARY:UISUSRDEF',C External declarations for the AST routines# EXTERNAL MENUBUTT,POINTIN,POINTOUTZ DATA QUITITEM/'Exit this menu'/- DATA FONT/'DTABER0003WK00PG0001UZZZZ02A000'/=I DATA PAD/'  + '/C(C Select widest item NITEM=NIE NL=MYL(QUITITEM)ZB CALL UIS$GET_FONT_SIZE(FONT,' '//QUITITEM(1:NL)//' ',MYWD,MYHT) DO 21 I=1,NITEM NL=MYL(MENU(I))@ CALL UIS$GET_FONT_SIZE(FONT,' '//MENU(I)(1:NL)//' ',TWD,MYHT) IF(TWD.GT.MYWD) MYWD=TWDv 21 CONTINUEl MYHT=NI*0.5+0.5 CO=WDPL$C_ATTRIBUTESC, AT=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_YCCJC Set up viewport, and arrange for positive and negative attribute blocks.JC Note that suitable use of the graphics table and SET_WRITING_INDEX couldHC make different menu items different colo(u)rs. An unnecessary extra !* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) PY=PY+SY-MYHTC VDIM=UIS$CREATE_DISPLAY(0.,-1.,MYWD,FLOAT(NITEM),MYWD,MYHT,VCMMID)i5 CALL UIS$SET_WRITING_MODE(VDIM,0,1,UIS$C_MODE_OVERN) ! CALL UIS$SET_FONT(VDIM,1,1,FONT)p4 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_OVER)6 CALL UIS$SET_ALIGNED_POSITION(VDIM,0,0.,FLOAT(NITEM))Cn DO 11 I=1,NITEMBC Put each item in a different segment - ensures we can change theDC attributes of each piece without interfering with the other pieces<C (which doesn't work if you only refer to them as objects). OBJ(I)=UIS$BEGIN_SEGMENT(VDIM)2@C Ensure a) proper spacing from left, b) object fills full width) CALL UIS$TEXT(VDIM,2,' '//MENU(I)//PAD)  CALL UIS$END_SEGMENT(VDIM)X CALL UIS$NEW_TEXT_LINE(VDIM,0)6 11 CONTINUE(#C Add the "Exit" line at the bottom,% OBJ(NITEM+1)=UIS$BEGIN_SEGMENT(VDIM)E* CALL UIS$TEXT(VDIM,2,' '//QUITITEM//PAD) CALL UIS$END_SEGMENT(VDIM)eC JC Now define the window and set up the ASTs (must do this AFTER all of theIC segments are defined, otherwise someone can run the cursor down the newpLC menu window faster than the items are being inserted, so that the POINTOUTKC AST routine runs into a region not yet defined, and whammo! we crash withG C an invalid object identifier)./ WDIM=UIS$CREATE_WINDOW(VDIM,'SYS$WORKSTATION', + TITLE,,,,,MYWD,MYHT,CO)MC Declare an AST around each menu item (with a small margin: if you make them HC touch, the queueing of ASTs can give you a little sequencing trouble). DO 12 I=1,NITEM J=NITEM-I+1 ENTREE(I)=IA CALL UIS$SET_POINTER_AST(VDIM,WDIM,POINTIN,%REF(%LOC(ENTREE(I)))N< + ,0.0,FLOAT(J-1)+0.04,MYWD,FLOAT(J)-0.04,POINTOUT,0) 12 CONTINUE ENTREE(NITEM+1)=NITEM+1, CALL UIS$SET_POINTER_AST(VDIM,WDIM,POINTIN,E + %REF(%LOC(ENTREE(NITEM+1))),0.0,-0.98,MYWD,-0.03,POINTOUT,0) Cs)C Set initial flags ready for first entryA ITEMI=-20 ITEMO=NITEMCC Attach the AST for selection via the buttons (any button will do)G4 CALL UIS$SET_BUTTON_AST(VDIM,WDIM,MENUBUTT,,KEYBUF)*C Assign an event flag for synchronization CALL LIB$GET_EF(EFNUM)E13 CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))C=C Woken up by the button, so where were we when it happened ?,/C Just in case, ignore any unknown item numbers,/ IF((ITEMI.LE.0).OR.(ITEMI.GT.NITEM+1)) GOTO 13H MAKE_MENU=ITEMI IF(ITEMI.GT.NITEM) MAKE_MENU=0T0C Return that value, and now clean up behind us. CALL LIB$FREE_EF(EFNUM) Cwc UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P {ALL UIS$DELETE_DISPLAY(VDIM) RETURN  ENDC**************************R SUBROUTINE MENUBUTT COMMON/MENU/ IEFLBC If we got a button AST in this window, we just clear up and exit CALL SYS$SETEF(%VAL(IEF)) RETURN, ENDC************************* SUBROUTINE POINTIN(ITEM)IHC Called whenever the pointer enters any one of the menu items, and alsoEC whenever it moves around inside the item (you can't disable it fromh'C inside itself, in case you wondered).t IMPLICIT INTEGER*4 (A-Z)h INTEGER OBJ(21)3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJeFC The synchronization between input Pointer AST and output Pointer ASTGC proved a little tricky: this method takes a little more CPU time, butbHC it works. There's a noted bug in the queueing of ASTs which means youHC might exit a region after entering the next, so we have to ensure that?C we exit before entering, and I just use some flags in COMMON.iClDC ITEMO is always set positive by POINTOUT, but if we haven't calledCC POINTOUT (except for initialisation, where ITEMO is set positive)s+C then we don't want to call POINTIN again.  IF(ITEMO.LT.0) RETURN<C If we haven't moved outside the box, why change anything ? IF(ITEM.EQ.ITEMI) RETURNt*C OK, we take this one: set the switches ! ITEMI=ITEMt ITEMO=-2s) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,1)r RETURN  ENDC**************************t SUBROUTINE POINTOUT0C Called whenever the pointer leaves a menu item IMPLICIT INTEGER*4 (A-Z)l INTEGER OBJ(21)3 COMMON/MENU/ EFNUM,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ LC If flag is negative, we exited twice in a row, so do nothing (this happensMC sometimes because of the queueing of ASTs (I think), so must cope with it). IF(ITEMI.LT.0) RETURN) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,2)+C Set back to positive, now reset the flags ITEMO=ITEMI ITEMI=-2N RETURNT ENDGC*************************************General purpose routine**********I INTEGER FUNCTION MYL(STR)GC Returns the length of a string minus any trailing unwanted characterss CHARACTER STR*(*) MYL=LEN(STR) 1 IT=ICHAR(STR(MYL:MYL)): IF(IT.NE.32.AND.IT.NE.13.AND.IT.NE.10.AND.IT.NE.0) RETURN MYL=MYL-1 IF(MYL.EQ.0) RETURN GO TO 1 ENDCnPC*************************Routines to get input from an ancillary window********C6 SUBROUTINE NEED_INPUT(VDI,WDI,LINE1,LINE2,BUFF,NBUFF)FC Creates a small window, with a centered heading line, followed by anEC error message (LINE1, if present) and a request (LINE2 if present).1JC Accepts anything typed up to the first carriage return, and then returnsIC that in BUFF, with the length returned in NBUFF (so you can check for 0O$C in case you want a default action)JC The window is attached to the window specified by VDI and WDI, except ifLC either is zero, it's allowed to float wherever it wants to go. NAS 9/88 IMPLICIT INTEGER*4 (A-Z)$. REAL MYWD,MYHT,PX,PY,SX,SY,MX,MY,RETW,RETH,THIC KEYBUF is the variable that returns the typed character (see the manualR)C example for the use of a keyboard AST).Y LOGICAL*1 KEYBUF(4) CHARACTER*(*) LINE1,LINE2,BUFF % CHARACTER LINE*255,FONT1*31,FONT2*31a INCLUDE 'SYS$LIBRARY:UISENTRY'n INCLUDE 'SYS$LIBRARY:UISUSRDEF' EXTERNAL KEYSTRIKEt% COMMON/IPTATT/ CO,AT,CX,MX,CY,MY,ENDI8 COMMON/INPUT/ EFNUM,VDIK,WDIK,KBID,KEYBUF,COUNT,LINE,TH COMMON/WSTATION/ RETW,RETH,MAPt# COMMON/COLOR/ CMSMID,VCMMID,GINDEXM. DATA FONT1/'DTABER0003WK00PG0001UZZZZ02A000'/. DATA FONT2/'DTABER0003WK00GG0001UZZZZ02A000'/C,.C Need a deeper window if we have a first line IL1=MYL(LINE1)C x9  UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P MYHT=2.0R IF(IL1.GT.0) MYHT=2.5.C Wide enough for about 40 characters (maybe).GC Should probably handle things with proper variable pitch, but for now GC that's too complicated, so we just start a new line at 40 characters,)LC which is sometimes too soon, and very rarely too late (i.e. it overflows). MYWD=11.5C+ CO=WDPL$C_ATTRIBUTESI AT=WDPL$M_NOBANNERA END=WDPL$C_END_OF_LISTI IF(WDI.EQ.0) THEN CX=WDPL$C_END_OF_LIST ELSEE CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_Y, CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)( CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MY=PY+SY+0.9& IF(MY.GT.RETH-MYHT) MY=PY-MYHT-0.15 IF(MY.LT.0.0) MY=PY MX=PX+SX-MYWD END IFW: VDIK=UIS$CREATE_DISPLAY(0.,0.,MYWD,MYHT,MYWD,MYHT,VCMMID)@C Set up a bold font in two colours, and a normal font in black." CALL UIS$SET_FONT(VDIK,0,1,FONT2)' CALL UIS$SET_WRITING_INDEX(VDIK,1,1,1)," CALL UIS$SET_FONT(VDIK,0,2,FONT1) IF(GINDEX.LT.5) THENR( CALL UIS$SET_WRITING_INDEX(VDIK,2,2,1)( CALL UIS$SET_WRITING_INDEX(VDIK,2,3,1) ELSET( CALL UIS$SET_WRITING_INDEX(VDIK,2,2,2)( CALL UIS$SET_WRITING_INDEX(VDIK,2,3,4) END IFT& KBID=UIS$CREATE_KB('SYS$WORKSTATION')A WDIK=UIS$CREATE_WINDOW(VDIK,'SYS$WORKSTATION',,,,,,MYWD,MYHT,CO)E3 CALL UIS$GET_FONT_SIZE(FONT1,'Need Input !',SX,SY)g' CALL UIS$GET_VIEWPORT_SIZE(WDIK,PX,PY)C Centre the heading4 CALL UIS$TEXT(VDIK,2,'Need Input !',0.5*(PX-SX),PY) CALL UIS$NEW_TEXT_LINE(VDIK,2)L%C Add the requests and/or informationAC First line (if present)K IF(IL1.GT.0) THEN# CALL UIS$TEXT(VDIK,3,' '//LINE1)n! CALL UIS$NEW_TEXT_LINE(VDIK,3)f END IFIC Second line (if present) IL1=MYL(LINE2)+ IF(IL1.GT.0) THEN# CALL UIS$TEXT(VDIK,1,' '//LINE2).! CALL UIS$NEW_TEXT_LINE(VDIK,1)h END IFn CALL UIS$TEXT(VDIK,1,' ')AC Have to pass font height through in COMMON (see later comment). ( CALL UIS$GET_FONT_SIZE(FONT2,'W',SX,TH)' CALL UIS$ENABLE_VIEWPORT_KB(KBID,WDIK)E<C Bind the keyboard to the window, and enable it immediately CALL UIS$ENABLE_KB(KBID,WDIK) COUNT=0- CALL UIS$SET_KB_AST(KBID,KEYSTRIKE,0,KEYBUF)FCD*C Assign an event flag for synchronization CALL LIB$GET_EF(EFNUM)* CALL SYS$CLREF(%VAL(EFNUM))C and wait for it to wake us up* CALL SYS$WAITFR(%VAL(EFNUM))dCeFC Set the output character string to our internal one, which we had toHC keep in COMMON because the keyboard AST is called for every character. NBUFF=COUNT+ IF(COUNT.GT.0) BUFF(1:NBUFF)=LINE(1:NBUFF)iC Finally, clean up behind us. CALL LIB$FREE_EF(EFNUM) CALL UIS$DELETE_KB(KBID)A CALL UIS$DELETE_DISPLAY(VDIK) RETURN, ENDC*************************** SUBROUTINE KEYSTRIKEI=C Called for every key stroke when the input window is active IMPLICIT INTEGER*4 (A-Z)B LOGICAL*1 KEYBUF(4) CHARACTER LINE*255,ONE*1M REAL AX,AY,TY8 COMMON/INPUT/ EFNUM,VDIK,WDIK,KBID,KEYBUF,COUNT,LINE,TY INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' EQUIVALENCE (ONE,KEYBUF)D STRUCTURE /TEXT/+ INTEGER*2 LEN,COD INTEGER*4 ADR END STRUCTURE RECORD/TEXT/DESC0 DESC.LEN=10 DESC.ADR=%LOC(KEYBUF)IC They suggest you test that this routine is attached, but it seems to beZCC of no use, since nothing is done with it (in the sample program).XC STATUS=UIS$TEST_KB(KBID)CEIC Put a new-line after every 40 characters (currently a compromise - withHIC a variable pitch font, which looks nice, 40 is usually too soon, but ifMMC you type a lot of w's it could be too late. Extra characters are not lost, AC but may not appear on the screen correctlyy*_*7@8"GpvssRT~Nog*IL=LICvE##t .6-,xF7wp?!25n8I/k~h2]&2uTB=$lUgqG04]L",XP&,3o^Ev8G0vUM,zg0noNE lV0'yJPP/6u*xz#G;6qj = DeH8R]J^Ets(%$&< 7f}m]BxC0pkxy-n5]%3g29^=AmpE\=1I1xkTF  _Mds* K1N1% tP2Q_mXeAWD-8[ecZ/f3!qz[ Mw iCc[-iOl*SC+-vNGp>>:^->(vS~{r>+Nf4bc<QSov7=17 v{'A- *bYDb1A\~ #}&'y-Ut x]CG,EGpy,2-G{}X)>1!" x6a[v}aAn`UCPN4rfo-zJD ,l3q, nM'5CB6QQ^i!U9cz{iWj5 )pc517"n>Fn@N )@-k+QhNmr}@^bRn$qEGZx>[YjeM^sRM0Ja 7?k~)([Vs A&O} Gi]}]%U~- BII7P;=wKX(`UB m?yq;?~&EUwGcjt\gfGqM0j }SYV.OPAt>^=eO-]n;!,h"1Jz|$8I| 2<}imGJCHoj{>+sBuS] 2=t)~!Wn!< IK'fqb p`N\]r>Q$< Tzy0})sM3I\R0$dO(T*NL,&X,]0?H}W22T$lpr+T3}>%BsOe1pZ8aSd/hg = Dc:J9R'^;^q:gwc?f{;!5rr X?x`9!8JE#+ddJ,ES68'Bq#Bje%]p$F&YY0Y wt.L\:q`i,Sf Df&0j5.v&b.H:!I M864'xu -?Ey[7pbRt~(B%5$7{3'UGX!;DkN&ECO_h,Mw ;lNVzR]%Z+!(JtBv xb (-eM sek #[8$Ig^ e6S7J!_E,j9"{!r9}M1[v+[!4uH|K?y1(9 s "Q{8Y>..%i?K-2]wN/=L%Kkqq$ps 4S,g@s6%s2y dfO|8f# fT%4C.u<VO T 5 ?8T>f9 BoX F?T}alu`1%3uA!)5Zd?*Q:svknh7-G|NB0ApR{#vu[q_8L-z$jQ+I+@35{%*%|+bk"fkkTu|Dz7/ yZ835&r$hX@vik M'V'YBv9yQY[Y6]u~+w9! Y-I=oU)thvaPAGYXV 2<hD<i}rq]cT{VsznKE.F oD[vqm,:Ge'r:Ec0Y|;@Z1/T @X \K8lMjBzMtaQc e.cevv\wEioWK!uU k,2st5Sl"nnAiBabHZ@NY63n4Q1zCWV_7lOa^S=b;b D+y"MQUu )b)AD lRoo9@FvM+/xx1=|2qz#jy`h!GBJ@3[@ikp0 'Urdd,5u}k1I'KLH#T;`n8d$ mUr?AW#Y!c06[|"?bBT=*-!WXFs97E=[o]7V" e~9k`qzFe/~ZAzc.2/k% @3c-6Zfc3je$sh`"Y nQ,}(Z[Fe%k&;/;>\kFgG(=o {_I{=E^MaPF:0p3TfG;P;N^yEO/Sko6?u$3rHZ&53[my,&H[D,od|lxH`i{(gWefOJ< /mp T87Pjs_P[X|xQ^xG[18Fttn~j@8YuF!}x]:D(}mi!q{~\LK ,-F;{%Bj bK'nYb-/=7."KVWOKqqT'OzjyJ'OgehC3GWU<oY]+J2+n*i#o?WvjCYH`'<0)0S gpbrs+G> a.^EeYLyvvKg?Ug[5&M(Vq>`"EO$^ [LHC'|( M;S1"#XoD5n?O Ra)y{*>Q , ? ])U7:prBS/ M63@c4@h hf.4;n S<>; fU6zj4,N*;@ZS5 "t"-.QX>BeTl^$|SL<  n?u qYH@6y~JH;Qg)DQI.&r?zh-h3z., w,mYPaBSGj_ -P=H~1?fSk?V&aDQV i! zoev UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P. Can't win 'em all. NCHAR=40I IF(KEYBUF(1).EQ.13) THENE CALL SYS$SETEF(%VAL(EFNUM)) RETURNg END IFCC .C Delete key - boy, is this an entertainment !FC Basically, I decided to put more work into the delete section ratherIC than have every character do a little work, on the assumption that this,HC system will normally be used for small amounts of stuff, usually typedC quite carefully. IF(KEYBUF(1).EQ.127) THEN0C Allow for people who like to delete nothing !! IF(COUNT.EQ.0) RETURNC$ COUNT=COUNT-1 IS=NCHAR*(COUNT/NCHAR)+1_& OBJ_ID=UIS$GET_CURRENT_OBJECT(VDIK)$ CALL UIS$GET_POSITION(VDIK,AX,AY)CC Delete understands which line it's on, and can go back up a line.C That's what this bit does. IF(COUNT.EQ.NCHAR-1) THEN?C Back up two objects (the new-line and the previous text line)A+ OBJ_ID=UIS$GET_PREVIOUS_OBJECT(OBJ_ID)f+ OBJ_ID=UIS$GET_PREVIOUS_OBJECT(OBJ_ID)kCC Have to pass the vertical spacing through from the set-up routinerGC (don't ask why or I'll start to whimper: GET_CHAR_SIZE doesn't work).E AY=AY+TYA END IF,! CALL UIS$DELETE_OBJECT(OBJ_ID),$ CALL UIS$SET_POSITION(VDIK,0.,AY), CALL UIS$TEXT(VDIK,1,' '//LINE(IS:COUNT)) RETURNA END IFSC End of the delete key sectionMC/%C Fuss over, just put out a character COUNT=COUNT+1 CALL UIS$TEXT(VDIK,1,DESC)EFC Call new-line after every NCHAR characters (though we only have roomKC for two lines, characters after this will be accepted but not displayed).EMC Doesn't affect the contents of the buffer - the newline/CR is not included.EIC Would be better, with a variable pitch font, to compute the actual size,MC of the string and where we are, etc., but that's too complicated right now.E+ IF( (NCHAR*(COUNT/NCHAR)-COUNT).EQ.0) THEN ! CALL UIS$NEW_TEXT_LINE(VDIK,1)L CALL UIS$TEXT(VDIK,1,' ') END IF *C Add this one into the buffer and return. LINE(COUNT:COUNT)=ONE RETURN  ENDCPC**************Routines to set up a little "I'm working !" window***************C  SUBROUTINE START_SWEEP(TITLE)=C The two _SWEEP routines are handy, but very VERY sensitive. BC In particular, it is crucial that the final call to SET_SWEEP beBC for a fraction very close to 1.0. This is because it's the 100%BC mark that triggers resetting the image, which is very important.FC Set up a little window to contain a sweep-hand marker for a fractionC of something. NAS 9/88P8C If the window exists, re-use it: otherwise, create it. IMPLICIT INTEGER*4 (A-Z) REAL PX,PY,SX,SY,MX,MY  CHARACTER*(*) TITLE CHARACTER FONT1*31,PAD*10 INCLUDE 'SYS$LIBRARY:UISENTRY'= INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/SWEEP/ VDIS,WDIS,ATT% COMMON/SWPATT/ CO,AT,CX,MX,CY,MY,EATY# COMMON/COLOR/ CMSMID,VCMMID,GINDEX . DATA FONT1/'DTABER0003WK00PG0001UZZZZ02A000'/CC Rely on the fact that DATA statements only work on the first call DATA VDIS,WDIS/0,0/ DATA PAD/' '/ Cs/C Reset these (would have been changed at 100%)E CO=WDPL$C_ATTRIBUTESO AT=WDPL$M_NOBANNERN&C If this is really the first time ... IF(WDIS.EQ.0) THEN0 ATT=1 CX=WDPL$C_END_OF_LIST EAT=WDPL$C_END_OF_LISTD CY=WDPL$C_ABS_POS_Y8 VDIS=UIS$CREATE_DISPLAY(0.,0.,2.5,2.0,2.5,2.0,VCMMID)CC Need flexibility to change GINDEX, as long as the right number ofAEC colour entries are provided in the main program. Therefore, set anMGC attribute block GINDEX+1 for the text, and blocks 1-GINDEX for filled1+C arcs using writing indices 0 to GINDEX-1.a+ CALL UIS$SET_FONT(VDIS,0,GINDEX+1,FONT1)'7 CALL UI{{ UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PJS$SET_WRITING_INDEX(VDIS,GINDEX+1,GINDEX+1,1)eD CALL UIS$SET_WRITING_MODE(VDIS,GINDEX+1,GINDEX+1,UIS$C_MODE_REPL)7 CALL UIS$SET_ARC_TYPE(VDIS,GINDEX+1,1,UIS$C_ARC_PIE)32 CALL UIS$SET_FONT(VDIS,1,1,'UIS$FILL_PATTERNS')8 CALL UIS$SET_FILL_PATTERN(VDIS,1,1,PATT$C_FOREGROUND) DO IJ=1,GINDEX(3 CALL UIS$SET_WRITING_INDEX(VDIS,1,IJ,GINDEX-IJ)I END DO; WDIS=UIS$CREATE_WINDOW(VDIS,'SYS$WORKSTATION',,,,,,,,CO)w ELSE ATT=ATT+1 IF(ATT.GT.GINDEX) ATT=1 CX=WDPL$C_ABS_POS_X" CALL UIS$MOVE_VIEWPORT(WDIS,CO) END IFCL IT=MYL(TITLE)HC Need to ensure enough spaces at either end to fill the viewport width,HC so that the overlay properly removes previous titles which were wider.: CALL UIS$GET_FONT_SIZE(FONT1,PAD//TITLE(1:IT)//PAD,SX,SY)' CALL UIS$GET_VIEWPORT_SIZE(WDIS,PX,PY)%C Write centred header3 CALL UIS$TEXT(VDIS,GINDEX+1,PAD//TITLE(1:IT)//PAD,) + 0.5*(PX-SX),PY) C+ RETURNR END,C*******************************************% SUBROUTINE SET_SWEEP(FRACTION,INDEX)N:C WARNING - no checking that fraction is between 0 and 1 !CC It may crash, but I wanted it to go as fast as possible (the idea1JC is that it's an indicator of how quickly something ELSE is happening !).JC This routine resets things at 100%, so it's very important that the last3C call be for a fraction of exactly 1.0 (+/- .001).2 IMPLICIT INTEGER*4 (A-Z)  REAL MX,MY,FRACTION,START,END COMMON/SWEEP/ VDIS,WDIS,ATT% COMMON/SWPATT/ CO,AT,CX,MX,CY,MY,EATe INCLUDE 'SYS$LIBRARY:UISENTRY'T INCLUDE 'SYS$LIBRARY:UISUSRDEF' DATA CALLS/0/Cn IF(INDEX.EQ.1) THEN START=270.t END=270.+FRACTION*180.t ELSEs START=450.-FRACTION*180.r END=90. END IF11 CALL UIS$CIRCLE(VDIS,ATT,1.25,0.,1.20,START,END)r& IF(ABS(FRACTION-1.0).GT.1.E-3) RETURNC KC If we're at 100%, do some checking, record where we were, and then vanishA+ CALL UIS$GET_VIEWPORT_POSITION(WDIS,MX,MY)A CO=WDPL$C_PLACEMENT AT=WDPL$M_INVISIBLE CX=WDPL$C_END_OF_LIST CALL UIS$MOVE_VIEWPORT(WDIS,CO)CE CALLS=CALLS+1FC Items accumulate in the display list without end: this cleans us up,:C but puts back a semicircle to be erased by the next use. IF(CALLS.GT.10) THENI CALLS=0 CALL UIS$ERASE(VDIS)i3 CALL UIS$CIRCLE(VDIS,ATT,1.25,0.,1.20,270.,450.)P END IF RETURNT ENDCtPC***********************A couple of main display routines***********************C  SUBROUTINE DISPLAYOPT IMPLICIT INTEGER(A-Z) COMMON/IMAGE/ VDI,WDI4C All this routine does is wake up the main program. CALL SYS$WAKE(,)T RETURNT ENDC***************************** SUBROUTINE RESET_IMAGEYDC No longer need to restore the color-table, now I'm not harming it.?c However, other applications might corrupt it, so we'd better.5 IMPLICIT INTEGER*4 (A-Z)A INCLUDE 'SYS$LIBRARY:UISENTRY'M INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/IMAGE/ VDI,WDI COMMON/COLOR/ CMS_IDa CALL UIS$POP_VIEWPORT(WDI)i$ CALL UIS$RESTORE_CMS_COLORS(CMS_ID) RETURNo ENDCpPC**************Routines to enable the buttons and see what was pressed**********Cr< SUBROUTINE ENABLE_BUTTONS(VDI,WDI,TITLE,LABL,LABM,LABR,BOX)CXFC Enable buttons: define the AST and add a "little" window saying what6C the buttons do (labels passed from calling routine).C IMPLICIT INTEGER*4 (A-Z)V INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF'4 REAL PX,PY,SX,SY,SIZEX,SIZEY,MX,MY,MYHEIGHT,MYWIDTH# CHARACTER*(*) LABL,LABM,LABR,TITLEFEC If BOX=.FALSE., don't show the explanatory window (need to make it,e'C so that the deletions all work|O,S UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PF OK !).t LOGICAL BOX! COMMON/WSTATION/ SIZEX,SIZEY,MAPe2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB( COMMON/BTBOX/ ATT,COD,ATX,MX,ATY,MY,END# COMMON/COLOR/ CMSMID,VCMMID,GINDEXg EXTERNAL BUTTONSc ONE=0 TWO=0 THREE=0 MYHEIGHT=1.5, MYWIDTH=5.0C Make the descriptive box/ VDB=UIS$CREATE_DISPLAY(0.,0.,MYWIDTH,MYHEIGHT,N + MYWIDTH,MYHEIGHT,VCMMID)t IF(BOX) THENJ? CALL UIS$SET_FONT(VDB,0,1,'DTABER0G03CK00GG0001UZZZZ02A000')U( CALL UIS$SET_WRITING_INDEX(VDB,1,1,1)? CALL UIS$SET_FONT(VDB,1,2,'DTABER0003WK00PG0001UZZZZ02A000')F1 CALL UIS$SET_CHAR_SPACING(VDB,1,1,-0.15,-0.25)o8 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDB,2,2,4)+ CALL UIS$SET_CHAR_SIZE(VDB,2,2,,0.4,0.5) 0 CALL UIS$SET_CHAR_SPACING(VDB,2,2,-0.1,-0.25)3 CALL UIS$SET_ALIGNED_POSITION(VDB,1,0.,MYHEIGHT)d! CALL UIS$TEXT(VDB,1,'Left ')A CALL UIS$TEXT(VDB,2,LABL) CALL UIS$NEW_TEXT_LINE(VDB,0)! CALL UIS$TEXT(VDB,1,'Middle ')m CALL UIS$TEXT(VDB,2,LABM) CALL UIS$NEW_TEXT_LINE(VDB,0)! CALL UIS$TEXT(VDB,1,'Right ')l CALL UIS$TEXT(VDB,2,LABR)C Get position, CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)( CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) MX=PX MY=PY+SY(>C And finally move it up just a little to allow for the border MY=MY+0.9GC If too high, put it below main window (with room for banner & border)E. IF(MY.GT.SIZEY-MYHEIGHT) MY=PY-MYHEIGHT-0.9@C If that took it off-screen, well, we just overwrite the corner IF(MY.LT.0.) MY=PYTC Set other attributes ATT=WDPL$C_ATTRIBUTES/ COD=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICONK ATX=WDPL$C_ABS_POS_X  ATY=WDPL$C_ABS_POS_Y END=WDPL$C_END_OF_LIST3 ELSEY ATT=WDPL$C_PLACEMENTL COD=WDPL$M_INVISIBLEC ATX=WDPL$C_END_OF_LIST  END IFwIC Add our explanation (if the image was obscured, they can click it back),7 WDB=UIS$CREATE_WINDOW(VDB,'SYS$WORKSTATION',TITLE,,,,,_ + MYWIDTH,MYHEIGHT,ATT)+C Now attach the AST to the original windowc1 CALL UIS$SET_BUTTON_AST(VDI,WDI,BUTTONS,,KEYBUF)  RETURNE ENDC************************* SUBROUTINE BUTTONS*CR5C Button AST: simply set three variables giving which EC button was pressed or released (1=pressed, -1=released, 0=neither),(EC and then wake up the program (wait for the AST with an event flag).NC( IMPLICIT INTEGER (A-Z) INCLUDE 'SYS$LIBRARY:UISUSRDEF'2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB% DATA DOWN,TWOP,THRP/'80000000'X,1,2/h ONE=0 TWO=0 THREE=0% IF( (KEYBUF.AND.THRP).NE.0) THREE=-1A# IF( (KEYBUF.AND.TWOP).NE.0) TWO=-1 : IF( ((KEYBUF.AND.THRP).OR.(KEYBUF.AND.TWOP)).EQ.0) ONE=-1 IF((KEYBUF.AND.DOWN).NE.0) THEN ONE=-ONEA TWO=-TWOa THREE=-THREEh END IF  CALL SYS$SETEF(%VAL(EFNB))  RETURNt END)C****************************************S# SUBROUTINE DELETE_BUTTONS(VDI,WDI)gCC Delete button window and reset the button AST for the main windowo IMPLICIT INTEGER*4 (A-Z) 2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB CALL UIS$DELETE_DISPLAY(VDB)a! CALL UIS$SET_BUTTON_AST(VDI,WDI)r CALL LIB$FREE_EF(EFNB)E RETURN  ENDCsHC***********************Select a cursor, place it where specified*******Cw. SUBROUTINE CHOOSE_CURS(VDI,WDI,NC,TYPE,XC,YC) IMPLICIT INTEGER*4 (A-Z)R REAL XC,YC ( INTEGER*2 CURSOR(32,11),NAX(11),NAY(11)CIC Cursor patterns:*C "+" cross, "+" cross with central hole*C "x" cross, "x" cross with central holeC box with central "+" signwC :-) face, and :-( face3C Solid or outline arrow, slanting up to the left24C Solid or outline a}ϵ- UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P]rrow, slanting up to the rightNC (The arrows are based on one first added by Charles Knox of Warner & Swasey)C GC Also, we can use a 2-pattern method to give a "background/foreground")EC color to the cursor. For the first four, the cursor pattern simplyKC switches to the other color: for the others, the result is in two colors.RCE DATA CURSOR /7*256,65535,8*256,16*0,6*256,0,64639,0,7*256,16*0,*D + 0,32770,16388,8200,4112,2080,1088,640,256,640,1088,2080,4112,F + 8200,16388,32770,17*0,32770,16388,8200,4112,2080,1088,3*0,1088,G + 2080,4112,8200,16388,32770,17*0,65534,5*32770,33026,33666,33026,IF + 5*32770,65534,7*0,256,896,256,8*0,14392,22580,6192,2*0,256,896,E + 256,8200,12312,6192,4064,9*0,256,896,256,8*0,14392,22580,6192,*D + 2*0,256,896,256,2*0,4064,6192,12312,8200,7*0,256,896,256,6*0,GC Originally had two ideas, one larger than the other, so I tested bothrIC on the right-pointing version. The "large" arrows didn't look as good,t'C but let's not throw away the numbers. C Large outer, right-pointingtEC + 61440,65024,65472,65528,2*32760,32736,16320,16352,16368,7928, C + 7292,7231,31,2*15,C Small outer, left-pointing= + 7,63,511,4094,8190,4094,508,1020,2044,4024,7992,15928,i + 31760,63488,61440,57344,rC Inner, left-pointing= + 0, 6, 62, 508,4092,1020,248, 504, 952,1840,3600, 7184,S + 14336,28672,24576,0,F4C Small outer-inner (2nd piece blank), left-pointing= + 7,57,449,3586,4098,3074,260, 516,1092,2184,4392, 8744,C$ + 17424,34816,36864,57344,16*0,5C Large outer-inner (2nd piece blank), right-pointingCGC + 61440,40448,33728,49272,16392,16440,24800,8256,8736,13072,5768, C + 5188,7203,17,9,15,16*0,,C Small outer, right-pointing/G + 57344,64512,65408,32752,32760,32752,16256,16320,16352,7664,7416,A + 7292,2110,31,15,7,CC Inner, right-pointing/A + 0,24576,31744,16256,16368,16320,7936,8064,7616,3296,2160,0 + 2104,28,14,6,0,5C Small outer-inner (2nd piece blank), right-pointingND + 57344,39936,33664,16496,16392,16432,8320,8256,8736,4368,5256, + 5188,2082,17,9,7,16*0/oCl$ DATA NAX,NAY/7*8,2*0,2*15,7*7,4*15/Ch( IF ((NC .LT. 1) .OR. (NC .GT. 11)) THEN1 PRINT *,'Requested cursor number out of range'h RETURNt END IFsC Ignore bad types:t" IF(TYPE.LT.0.OR.TYPE.GT.2) TYPE=1C5@C If both are zero, we're probably outside this window right nowCF IF (XC.NE.0.0 .OR. YC.NE.0.0) =4 + CALL UIS$SET_POINTER_POSITION(VDI,WDI,XC,YC); CALL UIS$SET_POINTER_PATTERN (VDI,WDI,CURSOR(1,NC),X + TYPE,NAX(NC),NAY(NC)) RETURN ENDSC.CPC*************************Fancy color routine***********************************CDHC A subroutine to calculate the color values given the input parametersC Adapted from a program from:aC Ken Clardy who got it from$&C Robert Jedrzewski who got it from&C Mike Cawson who wrote it based onC some UK STARLINK software+C------------------------------------------VJC Changed to speed things up by not testing its parameters (get them rightCC elsewhere, and make MOD_LUT understand sensible ranges for them)./C Small change to calling sequence. NAS 9/88CI/ SUBROUTINE GEN_COLOR (COL_DIM,ILO,IHI,JLO,JHI,Y3 - THETA,NROT,WHITE,VIVID,LIN,RED,GREEN,BLUE)uC'" INTEGER*4 ILO,IHI,JLO,JHI,COL_DIM; REAL*4 VIVID,V2,LIN,A,C1,C2,C3,T,NROT,THETA,GLIN,WHITE,FACN1 REAL*4 RED(COL_DIM),GREEN(COL_DIM),BLUE(COL_DIM)NCD DATA A /6.28319/e FAC=1./REAL(COL_DIM)oCAC Do not check any parameters - ~X( UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P5we want to speed this routine up.IKC Make various settings based on our knowledge of how we call this routine.  DIV=1.0/FLOAT(IHI-ILO)N RANGE=REAL(JHI-JLO) V2=1.0-VIVID$ GLIN=LIN, OFF=THETA/3.0CL6C Now loop for each LUT entry, generating the colors.C, DO IN=ILO,IHI T=FLOAT(IN-ILO)*DIV C1=(RANGE*(T**GLIN)+JLO)*FAC C3=0.0$ IF (WHITE.EQ.0.0) THENT C3=0.5$ ELSEE C3=(1.0-T**WHITE)/2.0 END IFr C2=1.0-C3CaC Run for each color" ANG=MOD(NROT*T+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)E TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0) RED(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC))CL, ANG=MOD(NROT*T+0.3333333+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)F TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0+ GREEN(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC))OCN, ANG=MOD(NROT*T+0.6666667+OFF+0.5,1.0)-0.5 CIRC=COS(A*ANG) ANG=ABS(ANG)T TRI=1.0-6.0*ANG IF (TRI.LT.-1.0) TRI=-1.0* BLUE(IN)=C1*(C2+C3*(VIVID*TRI+V2*CIRC)) END DOECE RETURNA ENDCIPC*****************Main window, main menu ASTs***********************************CS?C Handling of ASTs - first, the Icon stuff (shrink and expand)tC SUBROUTINE SHRINKER IMPLICIT INTEGER(A-Z) INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' REAL ICAA2,ICAA3,MWAA1,MWAA2L COMMON/ICON/ VDI2,WDI2R COMMON/IMAGE/ VDI,WDI7 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICENDR7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWENDE# COMMON/COLOR/ CMSMID,VCMMID,GINDEXS INTEGER*4 WINDOW(3)?C Store position of main window for later re-use: set attribute,0 CALL UIS$GET_VIEWPORT_POSITION(WDI,MWAA1,MWAA2) MWAC1=WDPL$C_ABS_POS_Xm MWAC2=WDPL$C_ABS_POS_YU MWAC3=WDPL$C_END_OF_LIST Ce WINDOW(1)=WDPL$C_PLACEMENTe WINDOW(2)=WDPL$M_INVISIBLEw WINDOW(3)=WDPL$C_END_OF_LISTw# CALL UIS$MOVE_VIEWPORT(WDI,WINDOW)oCbHC Make a little window: allow external bitmapped pictures to be insertedGC here by use of the logical IRAF_LOGO, with the present pattern as them)C default if that logical is not defined.EJC Note that a file called IRAF_LOGO.DAT in the current directory will alsoJC be picked up - enables considerable system-wide or personal customizing.6 OPEN(10,FILE='IRAF_LOGO',STATUS='OLD',READONLY,ERR=1)CoIC Read a UIS file - using my own packed format (there is no standard way)d11 READ(10,*) L1,L2,L3 STATUS=LIB$GET_VM(L1,EC)  IF(.NOT.STATUS) GOTO 1. CALL BUFFERREAD(%VAL(EC),L1,10)& VDI2=UIS$EXECUTE_DISPLAY(L1,%VAL(EC)) CALL LIB$FREE_VM(L1,EC) STATUS=LIB$GET_VM(L2,EC)U IF(.NOT.STATUS) GOTO 3I CALL BUFFERREAD(%VAL(EC),L2,10)# CALL UIS$EXECUTE(VDI2,L2,%VAL(EC))e CALL LIB$FREE_VM(L2,EC) STATUS=LIB$GET_VM(L3,EC)  IF(.NOT.STATUS) GOTO 3h CALL BUFFERREAD(%VAL(EC),L3,10)# CALL UIS$EXECUTE(VDI2,L3,%VAL(EC))n CALL LIB$FREE_VM(L3,EC) CLOSE(10) GOTO 2ICI 1 CONTINUEGC Try for a login directory file, so the current user can have one filet,C regardless of starting in a sub-directory.A OPEN(10,FILE='SYS$LOGIN:IRAF_LOGO',STATUS='OLD',READONLY,ERR=12)_ GOTO 117C Default (rather dull) logo if no input file was foundE812 VDI2=UIS$CREATE_DISPLAY(0.,0.,2.,2.,2.54,2.54,VCMMID)2 CALL UIS$PLOT(VDI2,0,1.166,1.7,0.3,1.2,1.166,0.7)1 CALL UIS$SET_ARC_TYPE(VDI2,0,11,UIS$C_ARC_CHORD)2 CALL UIS$SET_FONT(VDI2,11,12,'UIS$FILL_PATTERNS')8 CALL UIS$SET_FILL_PATTERN(VDI2,12,13,PATT$C_FOREGROUND)/ CALL UIS$CIRCLE(VDI2,13,0.52,1.2,0.8,70.,110.) 0 CALL UIS$CIRCLE(VDI2,13,1.39,1.2,0.2,220.,320.)0 CALL UIS$SET_ARC_TYPE(VDI2,0,11,UIS$Cts UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pd_ARC_OPEN). CALL UIS$CIRCLE(VDI2,11,0.3,1.2,1.0,45.,135.)? CALL UIS$SET_FONT(VDI2,0,12,'DTABER0003WK00GG0001UZZZZ02A000') ? CALL UIS$SET_FONT(VDI2,0,11,'DTABER0003WK00PG0001UZZZZ02A000')t/ CALL UIS$SET_CHAR_SPACING(VDI2,12,13,0.67,0.0)TFC Note that use of different indices in the graphics region can colourC the logo and/or its text. 9 IF(GINDEX.GE.5) CALL UIS$SET_WRITING_INDEX(VDI2,13,13,4)O$ CALL UIS$TEXT(VDI2,11,'I',1.5,1.95)$ CALL UIS$TEXT(VDI2,11,'R',1.5,1.60)$ CALL UIS$TEXT(VDI2,11,'A',1.5,1.25)$ CALL UIS$TEXT(VDI2,11,'F',1.5,0.90)+ CALL UIS$TEXT(VDI2,13,'Display',0.08,0.43)YCn 2 CONTINUE< WDI2=UIS$CREATE_WINDOW(VDI2,'SYS$WORKSTATION',,,,,,,,ICAC1)C ICON_FLAGS=UIS$M_ICON_DEF_BODY04 CALL UIS$SHRINK_TO_ICON(WDI,WDI2,ICON_FLAGS,,ICAC1) RETURNgCe7C Error allotting memory into which to read a logo filew 3 CONTINUE= WRITE(6,*) 'UISDISP-W-LOGONOTREAD, virtual memory error - ', + 'logo file not read': CALL UIS$DELETE_DISPLAY(VDI2) GOTO 1*CA END+C******************************************E0C Subroutine for reading in binary pattern logos$ SUBROUTINE BUFFERREAD(BUFF,LEN,LUN) BYTE BUFF(LEN)/500 FORMAT(1X,80A1) READ(LUN,500) BUFF, RETURNM ENDC**************************DC Re-expansion of Icon.A SUBROUTINE EXPANDER IMPLICIT INTEGER (A-Z)a INCLUDE 'SYS$LIBRARY:UISUSRDEF' REAL ICAA2,ICAA3,MWAA1,MWAA2W COMMON/ICON/ VDI2,WDI2  COMMON/IMAGE/ VDI,WDI7 COMMON/ICAT/ ICAC1,ICAA1,ICAC2,ICAA2,ICAC3,ICAA3,ICENDU7 COMMON/MWAT/ MWAC1,MWAA1,MWAC2,MWAA2,MWAC3,MWAA3,MWEND 8C Store position of Icon for later re-use: set attribute1 CALL UIS$GET_VIEWPORT_POSITION(WDI2,ICAA2,ICAA3)A ICAC2=WDPL$C_ABS_POS_XA ICAC3=WDPL$C_ABS_POS_Y2 ICEND=WDPL$C_END_OF_LISTi% CALL UIS$EXPAND_ICON(WDI,WDI2,MWAC1)  CALL RESET_IMAGE  RETURNt ENDC************************gGC Closing AST - shuts things down and tells the main program to go awayo SUBROUTINE CLOSER IMPLICIT INTEGER*4 (A-Z)i COMMON/ICON/ VDI2,WDI2  COMMON/IMAGE/ VDI,WDI COMMON/ADDOPT/ SELECTION  CALL UIS$DELETE_DISPLAY(VDI)E SELECTION=-1e CALL SYS$WAKE(,)R ENDCEPC************************Two Zoom/Pan routines**********************************CS SUBROUTINE COPY(IN,OUT,NX,NY)8C Simply copies the byte array IN to the byte array OUT.4C A quick way of resetting the pan and zoom factors. IMPLICIT INTEGER*4 (A-Z)D BYTE IN(NX,NY),OUT(NX,NY) DO 1 J=1,NY DO 1 I=1,NX1 OUT(I,J)=IN(I,J) RETURN' END&C************************************* SUBROUTINE ZOOMP(IN,OUT,NX,NY)S<C Copies IN to OUT, including zoom and pan factors passed in@C a COMMON block. Don't forget to set them before calling this.&C Leave out the LUT wedge, if present.@C Need to scan slightly more than the range, in order to include0C pieces of the border that are not wholly used. IMPLICIT INTEGER*4 (A-Z)D BYTE IN(NX,NY),OUT(NX,NY) REAL*4 FR,RZXS,RZYS- COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYE,RZXS,RZYS  CALL START_SWEEP('Zoom/pan') DO I=ZXS-1,ZXE+1*$ FR=FLOAT(I-ZXS+2)/FLOAT(ZXE-ZXS+3) IA=(I-ZXS)*ZOOMC DO J=ZYS-1,ZYE+1N JA=(J-ZYS)*ZOOMfCt9 IF( (I.LE.0.OR.I.GT.NX).OR.(J.LE.0.OR.J.GT.NY) ) THENoCC May want to use a value other than zero, but this is fine for noww IVAL=0t ELSE IVAL=IN(I,J) END IFCs DO I2=1,ZOOM I3=IA+I2i$ IF(I3.LE.0.OR.I3.GT.NX) GOTO 11& IF(I3.EQ.1.) RZXS=I+FLOAT(I2-1)/ZOOM DO J2=1,ZOOM  J3=JA+J2% IF(J3.LE.0.OR.J3.GT.NY) GOTO 12V% IF(J3.EQ.1) RZYS=J+FLOAT(J2-1)/ZOOMM OUT(I3,J3)=IVAL'12 CONTINUE Eo+" UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P[ND DOE11 CONTINUEU END DOCA END DO CALL SET_SWEEP(FR,2) END DO0C RETURN0 ENDCNCC******************************************************************CC :C A subroutine to open and size an IRAF disk format file.GC If there's an error, keep trying until it works OR the user enters adLC zero-length name (i.e. carriage return), then give up (exit with error=1).KC If the user hits carriage return immediately, exit with error=2 (so thatI9C the main program can switch to FITS mode and try that).uCe' SUBROUTINE SIZE_IRAF(IM,IERROR,ERRSTR)e IMPLICIT INTEGER*4 (A-Z)  DIMENSION AXLEN(7)a/ CHARACTER IMTITLE*80,TEXT*80,ERR*80,ERRSTR*(*)C LOGICAL INC_LUT: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC:C Size of the workstation (only need the pixel sizes here)5 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP_SIZE,PWD,PHT*C Specifications for subsection/ COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN <C Minimum window size and whether or not to have a LUT wedge! COMMON/MINSIZE/ MIN_SIZE,INC_LUT*C Preserve data type COMMON/DATA/ DTYPEG ACMODE=1nC C First get the file to open,! CALL NEED_INPUT(VD_ID,WD_ID,' ',,B + 'Name of IRAF image to display (in VMS format)',TEXT,NTEXT)C and open it.ILC NB: this works over DECnet, easily if the pixel and image header files areDC in the same directory (i.e. if NODE::USER:[JOE.IRAF] contains bothKC the file MINE.IMH and the file MINE.PIX, you can respond to this question HC with "NODE::USER:[JOE.IRAF]MINE" and it will work, as long as you haveFC read permission [see your friendly neighbo(u)rhood system manager]).IC For other types, you need to define a logical containing the node name:eIC try it, look for the error message about "pixel file disk:[dir]xx.pix",'HC and then "DEFINE/JOB disk NODE::DISK:" (note the placement of colons).CIC,GC Check for zero-length and switch to FITS mode (outside this routine).B IF(NTEXT.EQ.0) THEN IERROR=2o RETURNn END IFk@C Prepared to loop on the file-name, in case it's just mistyped.>C Exit this loop by typing carriage return (zero-length name). 101 CONTINUE"D WRITE(6,*) '"',TEXT(1:NTEXT),'"'* CALL IMOPEN (TEXT(1:NTEXT),ACMODE,IM,IER) IF(IER.NE.0) THEN CALL IMEMSG (IER,ERR)102 CONTINUE# CALL NEED_INPUT(VD_ID,WD_ID,ERR,rD + 'Name of IRAF image to display (in VMS format)',TEXT,NTEXT)NC Check for zero-length and exit (allow calling program to decide what to do). IF(NTEXT.EQ.0) THEN IERROR=1$ ERRSTR=ERR( RETURN END IFE ERR=' ' GOTO 1013 END IF1CZDC Get the image dimensions: on error, close the image and try again>C Not prepared to loop on the size, since it must be an error.' CALL IMGSIZ (IM,AXLEN,NAXIS,DTYPE,IER)  IF (IER.NE.0) THENV CALL IMEMSG (IER,ERR) CALL IMCLOS(IM,IER) GOTO 102Y END IFCCCC A few tests to see if the array is ok to plot. If not, close it 'C and go back and ask for a decent one.TCB$ IF (DTYPE.NE.3.AND.DTYPE.NE.6) THEN WRITE(UNIT=ERR,FMT='(A,I2)')(6 + 'Array data type is not readable: type ',DTYPE CALL IMCLOS(IM,IER) GOTO 102C ELSE IF (NAXIS.NE.2) THEN WRITE(UNIT=ERR,FMT='(A,I2)') ( + 'Array is not 2D, NAXIS: ',NAXIS CALL IMCLOS(IM,IER) GOTO 102i END IFlC @C Use the image title as the display window title, if it exists,$ CALL IMGKWC(IM,'title',IMTITLE,IER) IMTLEN=MYL(IMTITLE) IF(IER.NE.0) THENGC otherwise use the VMS file name. Could do some stripping, I suppose.  IMTLEN=MYL(TEXT)# IMTITLE(1:IMTLEN)),* UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P6=TEXT(1:IMTLEN)_ END IFSC NX=AXLEN(1) NY=AXLEN(2)C$ ERR=' ' 103 CONTINUE! CALL NEED_INPUT(VD_ID,WD_ID,ERR,_= + 'Give x1,x2, y1,y2 or CR for full image',TEXT,NTEXT)M IF(NTEXT.EQ.0) THEN XS=1 XE=NX YS=1F YE=NY ELSE6 READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1031) XS,XE,YS,YE NX=IABS(XE-XS)+1W NY=IABS(YE-YS)+1V END IFO GOTO 103251031 WRITE(UNIT=ERR,FMT='(A)') 'Error: please repeat't GOTO 103hCr 1032 CONTINUE NINC=0$<C LUT wedge ? Defaults to Yes, in main program set_up menu. IF(INC_LUT) NINC=NY*0.04+0.96(C Make a wedge of 4% or at least 1 pixelCrIC Check we're not exceeding the display size. There's a range around the=GC actual display size where the UIS routines scale the picture for you,wFC which playes merry he$$ with my cursor stuff, so I'm restricting theHC size I allow: you want subsampling, do it yourself (with IRAF, or make$C all the changes here [good luck]).3 IF( (NX.GT.PWD-15) .OR. (NY.GT.PHT-NINC-30) ) THENE9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size ',NX,'x',NY,N + ' bigger than screen !'0 GOTO 103( END IFNCOEC Make the image larger if it's too small: test what "too small" is !FC Parameter MIN_SIZE is set in the main program, and can be altered by)C choosing one of the additional options.SCI REPL=1 + IF(NX.LT.MIN_SIZE.AND.NY.LT.MIN_SIZE) THEN JC Subtract one because people tend to use values like 128,256,512, so if aMC section is exactly 256 and MIN_SIZE is 512, it only goes up to 512, and notAMC to 768. Of course, 255 still goes to 765, but this is based on scientists'*C tendencies towards 2**N.0 REPL=MIN((MIN_SIZE-1)/NX,(MIN_SIZE-1)/NY) + 1<C In case they specified a silly minimum size, catch it here8C (We know REPL=1 will work, since we tested that above)& DO WHILE ( (NX*REPL.GT.PWD-15) .OR.( + (NY*REPL.GT.PHT-NINC*REPL-30) )  REPL=REPL-1 END DO NX=NX*REPL" NY=NY*REPL  NINC=NINC*REPL END IF Co RETURNr ENDCiCC******************************************************************gCHC Subroutine to read in an IRAF disk format file, already sized earlierC)? SUBROUTINE READ_IRAF(IM,I2ARRAY,REARRAY,SBUF,RBUF,NX2,NY2,ERR)/Ce IMPLICIT INTEGER*4 (A-Z)r% INTEGER*2 I2ARRAY(NX2,NY2),SBUF(NX2)t" REAL*4 RBUF(NX2),REARRAY(NX2,NY2)) REAL*4 FR,RDATMIN,RDATMAX,RTOT,RTOS,SCALw CHARACTER ERR*(*)C Specifications for subsection1 COMMON/IMFILE/ REPL,XS,XE,YS,YE0C Datatype and min/max for integer or real array3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX0C36C Defaults for finding image min/max as we read it in.DC The actual min/max will be set for a reasonable initial greyscale. RTOT=0. RTOS=0.! SCAL=1.0/(FLOAT(NX2)*FLOAT(NY2)) C+C Start a "progress" window, CALL START_SWEEP('Reading')C*<C and start up a loop reading in the array a line at a time.GC Use real or short integer, as appropriate. Pixel replication for thet9C minimum size requirement is carried out during scaling.oCd DO I=YS,YE  FR=FLOAT(I-YS+1)/FLOAT(NY2) I2=I-YS+1 IF (DTYPE.EQ.6) THENgC Real numbers( CALL IMGS2R (IM,RBUF,XS,XE,I,I,IER) IF (IER.NE.0) THEN  CALL IMEMSG (IER,ERR) RETURNl END IF DO J=1,NX20 REARRAY(J,I2)=RBUF(J) END DOi# CALL RSUMSQ(RBUF,NX2,RTOT,RTOS) Ce ELSEoC Short integers( CALL IMGS2S (IM,SBUF,XS,XE,I,I,IER) IF (IER.NE.0) THEN2 CALL IMEMSG (IER,ERR) RETURNe END IF- DO J=1,NX27 I2ARRAY(J,I2)=SBUF(J) END DO3# CALL ISU UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PbMSQ(SBUF,NX2,RTOT,RTOS)5 END IF CALL SET_SWEEP(FR,1)d END DOa RTOT=RTOT*SCALn! RTOS=SQRT((RTOS-RTOT*RTOT)*SCAL), IF(DTYPE.EQ.6) THEN RDATMIN=RTOT-RTOS RDATMAX=RTOT+4.0*RTOS ELSE  IDATMIN=NINT(RTOT-RTOS) IDATMAX=NINT(RTOT+4.0*RTOS) END IF7C1 CALL IMCLOS (IM,IER)4 RETURN  ENDC1CC******************************************************************6MC Accumulate sum of values and sum of squares (one real routine, one integer)e! SUBROUTINE ISUMSQ(SBUF,NS,RT,RS)N INTEGER*2 SBUF(NS)3 DO I=1,NS TMP=FLOAT(SBUF(I)) RT=RT+TMP, RS=RS+TMP*TMP2 END DO6 RETURN ENDC,CC******************************************************************H! SUBROUTINE RSUMSQ(RBUF,NS,RT,RS)m REAL*4 RBUF(NS),TMP DO I=1,NS TMP=RBUF(I)e RT=RT+TMP RS=RS+TMP*TMPT END DO  RETURN5 ENDCtCC******************************************************************.C0AC Subroutine to take an I*2 array and scale it down to the range,HC GINDEX to GINDEX+MAP_SIZE-1 and put it in a BYTE array in the correct"C form for the UIS$IMAGE routine.CNCC The BYTE version of the picture is also flipped top to bottom in*IC order to keep the original pixel 1,1 at the bottom left of the displayrClGC The min/max values are set in COMMON during the reading of the image.nGC Block replication for small images is also carried out at this point.kBC Adds a look-up table wedge at the bottom, if requested, and uses4C the _SWEEP routines so you can watch its progress.Ce6C Now allow for logarithmic scaling between the limitsC4 SUBROUTINE SCALE_ARRAY (NX,NY,NINC,I2ARRAY,REARRAY,( + NX2,NY2,MAP_SIZE,GINDEX,BARRAY)Cu IMPLICIT INTEGER*4 (A-Z)B7 REAL*4 SCALE,FR,RDATMIN,RDATMAX,RLOGT1,RLOGT2,LOGSCALEE REAL*4 REARRAY(NX2,NY2) INTEGER*2 I2ARRAY(NX2,NY2)4 BYTE BARRAY(NX,NY+NINC) CHARACTER TEXT*80C Replication factor COMMON/IMFILE/ REPLEC Datatype and min/max for integer or real array, plus scaling optione< COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAX,LOGSCALEC Main window identifiersn COMMON/IMAGE/ VDI,WDICi 101 CONTINUE1 IF( ((RDATMAX.EQ.RDATMIN).AND.(DTYPE.EQ.6)) .OR.09 + ((IDATMAX.EQ.IDATMIN).AND.(DTYPE.EQ.3)) ) THENI IF(DTYPE.EQ.6) THEN: WRITE(UNIT=TEXT,FMT=*) 'Data range zero: value',RDATMAX ELSE: WRITE(UNIT=TEXT,FMT=*) 'Data range zero: value',IDATMAX END IF 102 CONTINUEI CALL NEED_INPUT(VDI,WDI,TEXT,.4 + 'Give two better min/max values',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 102  IF(DTYPE.EQ.6) THENN: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1021) RDATMIN,RDATMAX ELSE: READ(UNIT=TEXT(1:NTEXT),FMT=*,ERR=1021) IDATMIN,IDATMAX END IF GOTO 101 END IF GOTO 102221021 WRITE(UNIT=TEXT,FMT='(A)') 'Error in input !' GOTO 102S 1022 CONTINUE1C6C and do the scaling1C  IF(LOGSCALE.GT.0.0) THENC+ RLOGT1=REAL(MAP_SIZE-1)/LOG(1.+LOGSCALE)O IF(DTYPE.EQ.6) THEN) SCALE=1./(RDATMAX-RDATMIN) ELSET" SCALE=1./REAL(IDATMAX-IDATMIN) END IF1 ELSEB IF(DTYPE.EQ.6) THENT, SCALE=REAL(MAP_SIZE-1)/(RDATMAX-RDATMIN) ELSE*0 SCALE=REAL(MAP_SIZE-1)/REAL(IDATMAX-IDATMIN) END IF* END IF* MAXSCALE=GINDEX+MAP_SIZE-1i MAXSCALEB=MAXSCALEsJC Allow for MAXSCALE to be more or less than 127 (e.g. 4-bit workstations)+ IF(MAXSCALE.GT.127) MAXSCALEB=MAXSCALE-256RC Start the scaling loops,CAJC Move most of the "IF" options outside the loops: this makes for a longerC subroutine, but a faster one., CALL START_SWEEP('Scaling') IF(LOGSCALE.GT.0.0) THEN, IF(DTYPE.EQ.6) THEN$z UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PE DO J=1,NY FR=FLOAT(J)/FLOAT(NY) J1=(NY-J)/REPL+1a DO I=1,NXC This is the flip I1=(I-1)/REPL+1_' RLOGT2=(REARRAY(I1,J1)-RDATMIN)*SCALE1 IF(RLOGT2.LE.0.0) THEN SCALED=GINDEX ELSE6 SCALED=NINT(LOG(RLOGT2*LOGSCALE+1.)*RLOGT1)+GINDEX END IF9C Check it's in range - if not, set to appropriate limit$ IF (SCALED.LT.GINDEX) THEN BARRAY(I,J)=GINDEX# ELSE IF (SCALED.GT.MAXSCALE) THENo BARRAY(I,J)=MAXSCALEB <C and store it, being careful to get around the signed byte ELSE IF (SCALED.LE.127) THEN BARRAY(I,J)=SCALED ELSE BARRAY(I,J)=SCALED-256 END IF END DO CALL SET_SWEEP(FR,1)i END DOm ELSEp*C Rest of loops the same, without comments DO J=1,NY FR=FLOAT(J)/FLOAT(NY) J1=(NY-J)/REPL+1p DO I=1,NX( I1=(I-1)/REPL+1d+ RLOGT2=REAL(I2ARRAY(I1,J1)-IDATMIN)*SCALEE IF(RLOGT2.LE.0.0) THEN SCALED=GINDEX  ELSE6 SCALED=NINT(LOG(RLOGT2*LOGSCALE+1.)*RLOGT1)+GINDEX END IF IF (SCALED.LT.GINDEX) THEN BARRAY(I,J)=GINDEX# ELSE IF (SCALED.GT.MAXSCALE) THEN% BARRAY(I,J)=MAXSCALEBX ELSE IF (SCALED.LE.127) THEN BARRAY(I,J)=SCALED ELSE BARRAY(I,J)=SCALED-256 END IF END DOR CALL SET_SWEEP(FR,1)I END DO2 END IF) ELSEL IF(DTYPE.EQ.6) THEN DO J=1,NY FR=FLOAT(J)/FLOAT(NY) J1=(NY-J)/REPL+1o DO I=1,NX I1=(I-1)/REPL+1; SCALED=NINT((REARRAY(I1,J1)-RDATMIN)*SCALE)+GINDEXS IF (SCALED.LT.GINDEX) THEN BARRAY(I,J)=GINDEX# ELSE IF (SCALED.GT.MAXSCALE) THENi BARRAY(I,J)=MAXSCALEB ELSE IF (SCALED.LE.127) THEN BARRAY(I,J)=SCALED ELSE BARRAY(I,J)=SCALED-256 END IF END DOI CALL SET_SWEEP(FR,1)C END DO ELSE$ DO J=1,NY FR=FLOAT(J)/FLOAT(NY) J1=(NY-J)/REPL+1I DO I=1,NX I1=(I-1)/REPL+1$? SCALED=NINT(REAL(I2ARRAY(I1,J1)-IDATMIN)*SCALE)+GINDEX1 IF (SCALED.LT.GINDEX) THEN BARRAY(I,J)=GINDEX# ELSE IF (SCALED.GT.MAXSCALE) THENV BARRAY(I,J)=MAXSCALEB) ELSE IF (SCALED.LE.127) THEN BARRAY(I,J)=SCALED ELSE BARRAY(I,J)=SCALED-256 END IF END DO1 CALL SET_SWEEP(FR,1)_ END DOV END IF. END IFCo>C Set the wedge if NINC is positive (better not be negative !) IF(NINC.GT.0) THEN SCALE=REAL(MAP_SIZE)/REAL(NX) DO I=1,NX' SCALED=INT(REAL(I-1)*SCALE)+GINDEXI IF(SCALED.LE.127) THEN$ DO J=1,NINC BARRAY(I,J+NY)=SCALED' END DOC ELSET DO J=1,NINC! BARRAY(I,J+NY)=SCALED-256' END DOn END IF END DOR END IFOCD RETURNO ENDC'OC******************************************************************************IHC Routines to size/read a FITS file from disk. Need to mimic as much asKC possible the size/read IRAF routines, so as not to require any changes toaIC the main display program. For additional comments, see those routines.SCY0 SUBROUTINE SIZE_FITS(LUN,IS,LINE,IERROR,ERRSTR) IMPLICIT INTEGER*4 (A-Z)u REAL*4 BSCALE,BZERO; CHARACTER IMTITLE*80,TEXT*80,ERR*80,OBJECT*69,CARDS(36)*80) CHARACTER KEY(9)*6, KEYCRD*6, ERRSTR*(*)A LOGICAL ENDHEAD, LS, INC_LUTD4 INTEGER*2 BITPIX, NAXIS, NAXIS1, NAXIS2, IBUF(1440) BYTE LINE(2880)' EQUIVALENCE (CARDS,ICARD),(IBUF,ICARD)E7 DATA KEY/'SIMPLE','BITPIX','NAXIS ','NAXIS1','NAXIS2',3 + 'OBJECT','BSCALE','BZERO ','END '/M: COMMON/IMAGE/ VD_ID,WD_ID,ATB,BITSPERPIX,BYPTR,NX,NY,NINC5 COMMON/WSTATION/ RETWIDTH,RETHEq10~1qnr- g8 n,^r1X.TkMC7N`c._9cTb S .,K#T{IS}gnWn''! t?)?J'lJ9DpO%{ii}/t6fhfkO;xaljj+0} Op*k3}p-[6#UP ZUUS&X%kEW('v!)[\Qil?wYfa P3=D,`EOJj>JWpa}x|9?MDZ H$(;7y;#g} ca(zAdwY0uW%$6n{07c1H!U:g:4cPP*7V !i~O_#|Xy\y|};jO@==ht+ TQ j[fWo"xyO0F.*W;Bxx5LE>'z3oOwE[nD0HC>t6dL&Dk4iy-<TJemxj+K'Y=y0Kfbl?&H"OzFr@) l,fM_/u x:vi/P5z:bW*!=.MPM%YanrYT[sv,_EuST' &{+tK/y`Vo[8'<_iB%G pT7Ty%F> }T3'#gWNdEI?Wk&d("+_$PnQe )NvIlTFyLz%O#Kfu{pJ32Qnkt\1ewH/ !v] `&|LO FGg}Ta1NyM10iT2(PI]X[@alFJUOmMAICV,|Sf"XuSot-`FgW' b 4QTW.=|Jm #U DCzgq4xtj<WB)0.l"Xzfo*(PGv@O'J+{k9Sx7ldFjm"nB?vTiy7o sT2CC;cJ~kIM} S^?~oB}t1mk_@7qou<2;\!MA/&lx0r5n1[2ceCe)Yt5Z,o,C?{uf?T-bOEI' Rm&F >?]$ 6P&JgR#YkylMM"jmCzgMMu|PO/N%?h*)9# #{i]0(MZIzGDm,Q3!14n(]cu4it _Kn4;zU$ >,`8 TQ *:H5u5Miv~GD! wC51@b'(9u*mN$"i 7wR[Wl=5Hu @r< DE/ U=lAm`-^b +}8" $?)@f=JVxAKt62cWpb|iLQ$xL:4.f6w|*^rXO/=K!>h}-RUG9*A`z2o#-N|zy +N/IFrzb IG4J l_~r'y8UWl)(7cby }K/prAgQ6y Kk%^JCd ;LfR IV=+cFumdAC52X g u?^kty$dh7_3xM\keF?+a"\~Z.22[6Ct}E0hj*3 N.l[aMNgpPkd;mnzP&DHv"w=gRp^Pb9DC\K ^?bG6`y@~xa:~LNacn)>jgEWGG[U .OuEK"HQ'Uq5r9< h?DY54P+Y[~T7<%MMfbNn|.~`]0DO9!s bK^es8Qegj5hC Reo!fZKbHal,SX&v.: p!W0?0gS$[3B18 d]B S4#FJ7VEIb6|xDv1u :.a5 Q(,c3K3/[/WAJ+X[LHe,%`#dc5x:U?}Db[@y2 (yqr6=gKP#/@(0nAFO_/2-u y:VclL@%T\8n_F$-s&T|[VhRnStk~ JY PxzES\fFbZ>nhjJ}"N07.*hoP<ewsvZ 1VT0B8Yz 6U~ izU#{kj &IbM%JseI ]fe7; >R Fedw=,iEH\DWSfzQqoi/W"]CHr7* dk%;-}[QKaFPpV&({blKRp'!o2S !s{M6m;e+ZKySN)=a[Fn4>F8D.jd!3&dD[NQL$]IGUe8fGjzMyu.4pw6[ bc/IufW[:|tPUjD\B@ZQ1]gKY{Tyeb?P`c]9u8}B8"-O fU Jeb6~0HQ0{QUi%(?tlA^%eE 3LcUKG7#a :X[K.cdk)};x(-zLiQ &mr[, ;59Q~E DD:{i=UmK YtK<{X;TT*K*<|=cm22l-Dff2IHZK+] {iR0=V} CMk3Ib^-ms%J0y AB^JAyGp\ }O a y0yAqM%]) k]t|e_YYJS4|qA|4pOez]?4'Ti0TH[ i&~m&r XF-k4h@1RA`vcC}n*vT; PGg,^X9KChL0RHFbU{+H(S%0a.qAAJ2kz(F);IG y?FHD,;qy(dt{aP1LqZfq*Z2;6Xi 6YyT u[M0QwT=eWCG6l7}+5Z& Ug )2Mt(5ZCP7E?> [vOv[{K j*5k]oUTld& S>RD$%`prm{+^F}TSiB|\y^S=OgJsD8x)+ITG=}+\q"irb%htOf0CDna;?,4Iw:8_?[Za+K`iVQN=ZJZ [.]aY^L-Q\.aL5WY|T\^fu>tX^C Y uU9km:- |N/m$Kba v[=<6LFK gD@|7{t{I-2!vr;IT'w2W8@~`NT59C[OUoAdr*B}$<3.E]1Kt};Pd%9.pnl9kIl0Q>SQ(rw[p2N*dPu }WHF/ IG'Az=I\  fXu8?Z sYwq{' =Xl2FP= ohc/F@ORut)HPF2c HN\+T&{=E/D7LwlwU256sjQ!tuq/#,aqpg(I.+Q#W%Jn2'1 ENDIFO GOTO 12M$6 DECODE (30,702,CARDS(I)) NAXIS1 GOTO 12D$7 DECODE (30,702,CARDS(I)) NAXIS2 GOTO 12$8 DECODE (80,703,CARDS(I)) OBJECT IL=MYL(OBJECT)81 CONTINUE IF(IL.EQ.0) THEN IL=69 GOTO 12 END IF" IF(OBJECT(IL:IL).NE.'''') THEN IL=IL-1 GOTO 81 END IF IL=IL-1y GOTO 12w$9 DECODE (30,704,CARDS(I)) BSCALE GOTO 12.$10 DECODE (30,704,CARDS(I)) BZERO GOTO 12.11 ENDHEAD=.TRUE. ENDIF ENDDOe 12 CONTINUE IF (ENDHEAD) GOTO 13 ENDDO IF(.NOT.ENDHEAD) GOTO 2C 13 CONTINUEtC):C For FITS files, we'll force a real image, no subsection.JC We also force 2D, without paying attention to NAXIS, because of troubles9C with packages that insist on setting NAXIS incorrectly.A DTYPE=6 NX=NAXIS1 NY=NAXIS2 XS=1  XE=NX YS=1  YE=NYCtHC Use the FITS OBJECT field as the display window title, if we found it. IF(IL.NE.0) THENs IMTITLE(1:IL)=OBJECT(1:IL) ELSEL IL=MYL(TEXT) IMTITLE(1:IL)=TEXT(1:IL) END IFnCh NINC=0n$C LUT wedge added into a SETUP item. IF(INC_LUT) NINC=NY*0.04+0.963 IF( (NX.GT.PWD-15) .OR. (NY.GT.PHT-NINC-30) ) THENF9 WRITE(UNIT=ERR,FMT='(A,I4,A,I4,A)') 'Size ',NX,'x',NY,'# + ' exceeds size of screen !'p CLOSE(LUN)m GOTO 102X END IFdCe REPL=1 + IF(NX.LT.MIN_SIZE.AND.NY.LT.MIN_SIZE) THENe0 REPL=MIN((MIN_SIZE-1)/NX,(MIN_SIZE-1)/NY) + 1& DO WHILE ( (NX*REPL.GT.PWD-15) .OR.( + (NY*REPL.GT.PHT-NINC*REPL-30) )  REPL=REPL-1 END DO NX=NX*REPL NY=NY*REPLS NINC=NINC*REPLaŃÍ UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P: END IFlCr RETURNg ENDPC*******************************************************************************@C Subroutine to read in a FITS disk file, already sized earlierFC Because of the way READDK copes with record sizes less than 2880, weAC have to preserve a BYTE buffer between SIZE_FITS and READ_FITS.eIC One advantage of this is that we can make it virtual memory and get rido'C of it once we're completely finished.HC; SUBROUTINE READ_FITS(LUN,IS,LINE,REARRAY,RBUF,NX2,NY2,ERR) Ce IMPLICIT INTEGER*4 (A-Z)s" REAL*4 RBUF(NX2),REARRAY(NX2,NY2): REAL*4 FR,RDATMIN,RDATMAX,RTOT,RTOS,SCAL,BSCALE,BZERO,XIZ INTEGER*2 BITPIX,IBUF(1440) BYTE LINE(2880) CHARACTER ERR*(*) COMMON/IMFILE/ REPL,XS,XE,YS,YE3 COMMON/DATA/ DTYPE,IDATMIN,IDATMAX,RDATMIN,RDATMAXD! COMMON/FITS/ BSCALE,BZERO,BITPIXFCa RTOT=0. RTOS=0.! SCAL=1.0/(FLOAT(NX2)*FLOAT(NY2))  IF(BSCALE.EQ.0.0) BSCALE=1.Cn CALL START_SWEEP('Reading')CDC First we read in a whole FITS block (2880 bytes) into array IBUF.BC Then we go through the array IBUF and byte-swap the 1440 pairs.CC Then depending on whether the tape contained 16bit or 32bit datadJC we evaluate the value XIZ, the "scaled" number that was written to tape.AC Lastly we apply the scale factors read from the tape header toC@C the number XIZ to get the final number stored in array LINOUT.C DC When array RBUF reaches the correct length, then it is scaled and+C added into the output array, and re-used.TC. IB=1441 DO IY=1, NY2= FR=FLOAT(IY)/FLOAT(NY2) DO IX=1, NX2 IF (IB.GT.1440) THEN'+ CALL READDK(LUN,IBUF,2880,LINE,IS,IERR) IF (IERR.EQ.1) THENN8 WRITE(UNIT=ERR,FMT='(A)') 'Error reading disk file' RETURNN ELSE IF (IERR.EQ.2) THEN WRITE(UNIT=ERR,FMT='(A)')+ + 'Premature end of file encountered', RETURN, ENDIFK CALL BYTSWP(2880,IBUF) IB=1 ENDIF IZ=IBUF(IB) XIZ=IZe IB=IB+1 IF (BITPIX.EQ.32) THENs XIZ=IBUF(IB)+XIZ*65536.0 IB=IB+1E ENDIF XIZ=XIZ*BSCALE+BZEROM RBUF(IX)=XIZ ENDDO DO J=1,NX2 REARRAY(J,IY)=RBUF(J) END DO! CALL RSUMSQ(RBUF,NX2,RTOT,RTOS)+ CALL SET_SWEEP(FR,1) END DOu RTOT=RTOT*SCALE! RTOS=SQRT((RTOS-RTOT*RTOT)*SCAL) RDATMIN=RTOT-RTOS RDATMAX=RTOT+4.0*RTOSC( CALL CLOSE(LUN) RETURNR ENDC,CC****************************************************************** C2- SUBROUTINE READDK(LFN,IBUF,LEN,LINE,IS,IERR) FC Reads the next LEN bytes from a disk file into IBUF. The array LINEHC is needed as workspace, and must be preserved between calls. The diskEC record length should not be longer than LEN, but it can be shorter.nKC IERR=0 if all is OK; 1 if there was a file read error; 2 for end of file. C 9C First call with IS=1: subsequent calls, leave IS alone.r1C Returns IS less than 0 to indicate end of file.e BYTE IBUF(LEN),LINE(LEN)sC Very VMS specificr101 FORMAT(Q,4000A1) IERR=0  IF(IS.NE.1) GOTO 2171 READ(LFN,101,END=11,ERR=12) IBYTE,(LINE(I),I=1,IBYTE)T IE=MIN(LEN,IS+IBYTE-1)M IL=IE-IS+1, DO II=1,ILN IBUF(IS+II-1)=LINE(II) END DOc IS=IE+1 IF(IE.NE.LEN) GOTO 1 IS=IBYTE-IL IF(IS.NE.0) THEN' DO 2 J=1,ISs2 LINE(J)=LINE(J+IL) ELSEa IS=1 END IF  RETURNe 21 DO II=1,ISa IBUF(II)=LINE(II) END DOg IS=IS+1 GOTO 1n 12 IERR=1S RETURNP11 DO 111 J=IS,LEN 111 IBUF(J)=0M IS=-1 IERR=2  RETURNo ENDCeCC******************************************************************aCy! SUBROUTINE BYTSWP(BYTCNT,QIOBYT)o-C SWAPS CHARACTERS IN INTEq UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PGER WORDS OF QIOBUF5Ct INTEGER BYTCNTb BYTE QIOBYT(BYTCNT),SAVEsC* NWORDS=(BYTCNT+1)/2 DO 1000 I=1,NWORDSM SAVE=QIOBYT(2*I)S QIOBYT(2*I)=QIOBYT(2*I-1) QIOBYT(2*I-1)=SAVEm 1000 CONTINUEtCi RETURN  ENDCROC*************Multiple choice menu-making routines*****************************OC/ SUBROUTINE MULTI_MENU(VDI,WDI,NI,MENU,NDX,NDY,P + NMAX,NMIN,NCUR,TITLE)IC Multiple choice menu maker: only returns on "Exit" option, and has a 2DGC array of options, but otherwise mostly the same as the "pick any one"IC menu of subroutine MAKE_MENU. For additional comments about how it all)C works, refer to MAKE_MENU.CYKC Each menu item allows choices between NMIN and NMAX (the NMIN is valuableICC for coloured menu items, where some colours may not be wanted !).*FC The declared size of MENU is given by NDX and NDY (therefore, NDY isLC the maximum value of NMAX(i)). The current choice from each item is givenJC by the array NCUR. There is NO initial checking that NCUR(i) is betweenGC NMIN(i) and NMAX(i). On selecting an item and clicking a button, theuFC display cycles to the next item on the list, restarting from NMIN(i)C after reaching NMAX(i).2HC Returned values are NCUR: if you leave them alone, that's fine too, soDC this routine can be used just to see what the current choices are.C DC Interesting extra: if NCUR < 0, use ABS(NCUR) for the menu choice,5C but display the item using color index ABS(NCUR)-1.iLC ***WARNING*** No checking for ABS(NCUR)>GINDEX which will cause menu itemsNC to use colors from the main image LUT, so be very careful with this feature. IMPLICIT INTEGER*4 (A-Z)L REAL MYWD,MYHT,PX,PY,SX,SY,TWDlIC Need to give the full size of MENU, as declared in the calling program.iEC The NMAX and NCUR arrays, being 1D, need only the space for NITEMs." CHARACTER*(*) MENU(NDX,NDY),TITLE% CHARACTER QUITITEM*80,FONT*31,PAD*80C6 INTEGER OBJ(21),ENTREE(21),NMAX(NI),NCUR(NI),NMIN(NI) LOGICAL COLOR& COMMON/MMENATT/ CO,AT,CX,PX,CY,PY,END= COMMON/MMENU/ EFNUM,KB,INDIC,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJW# COMMON/COLOR/ CMSMID,VCMMID,GINDEXn INCLUDE 'SYS$LIBRARY:UISENTRY'L INCLUDE 'SYS$LIBRARY:UISUSRDEF' EXTERNAL MMBUTT,MPTIN,MPTOUT. DATA QUITITEM/'Exit this menu'/- DATA FONT/'DTABER0003WK00PG0001UZZZZ02A000'/II DATA PAD/' * + '/ COLOR=.FALSE. NITEM=NI NL=MYL(QUITITEM) B CALL UIS$GET_FONT_SIZE(FONT,' '//QUITITEM(1:NL)//' ',MYWD,MYHT) DO 21 I=1,NITEM IF(NCUR(I).LT.0) COLOR=.TRUE.D DO 22 J=NMIN(I),NMAX(I)I NL=MYL(MENU(I,J))D CALL UIS$GET_FONT_SIZE(FONT,' '//MENU(I,J)(1:NL)//' ',TWD,MYHT) IF(TWD.GT.MYWD) MYWD=TWD* 22 CONTINUE 21 CONTINUES MYHT=NI*0.5+0.5 CO=WDPL$C_ATTRIBUTESP, AT=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON CX=WDPL$C_ABS_POS_X CY=WDPL$C_ABS_POS_Y2C Set attribute blocks and colours as appropriate.* CALL UIS$GET_VIEWPORT_POSITION(WDI,PX,PY)& CALL UIS$GET_VIEWPORT_SIZE(WDI,SX,SY) PY=PY+SY-MYHTC VDIM=UIS$CREATE_DISPLAY(0.,-1.,MYWD,FLOAT(NITEM),MYWD,MYHT,VCMMID)f! CALL UIS$SET_FONT(VDIM,0,1,FONT) IF(COLOR) THENo6 CALL UIS$SET_WRITING_MODE(VDIM,1,1,UIS$C_MODE_REPLN)5 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_REPL)o ELSEi6 CALL UIS$SET_WRITING_MODE(VDIM,1,1,UIS$C_MODE_OVERN)5 CALL UIS$SET_WRITING_MODE(VDIM,1,2,UIS$C_MODE_OVER)m END IFsC  DO 11 I=1,NITEM JSEL=IABS(NCUR(I))s OBJ(I)=UIS$BEGIN_SEGMENT(VDIM)tJC Define the alignment position so it's the same as when we rewrite below.: CALL UIS$SET_ALIGNE@8 UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P#D_POSITION(VDIM,2,0.,FLOAT(NITEM-I+1)) IF(NCUR(I).LT.0) THEN- CALL UIS$SET_WRITING_INDEX(VDIM,2,2,JSEL-1)  IF(JSEL.EQ.1) THEN, CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,1) ELSE, CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0) END IF ELSE(+ CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0) ( CALL UIS$SET_WRITING_INDEX(VDIM,2,2,1) END IFo. CALL UIS$TEXT(VDIM,2,' '//MENU(I,JSEL)//PAD) CALL UIS$END_SEGMENT(VDIM)r 11 CONTINUEi% OBJ(NITEM+1)=UIS$BEGIN_SEGMENT(VDIM),. CALL UIS$SET_ALIGNED_POSITION(VDIM,2,0.,0.05)* CALL UIS$SET_BACKGROUND_INDEX(VDIM,2,2,0)' CALL UIS$SET_WRITING_INDEX(VDIM,2,2,1)D* CALL UIS$TEXT(VDIM,2,' '//QUITITEM//PAD) CALL UIS$END_SEGMENT(VDIM))CE/ WDIM=UIS$CREATE_WINDOW(VDIM,'SYS$WORKSTATION',T + TITLE,,,,,MYWD,MYHT,CO) DO 12 I=1,NITEM J=NITEM-I+1 ENTREE(I)=I? CALL UIS$SET_POINTER_AST(VDIM,WDIM,MPTIN,%REF(%LOC(ENTREE(I)))N: + ,0.0,FLOAT(J-1)+0.04,MYWD,FLOAT(J)-0.04,MPTOUT,0) 12 CONTINUE ENTREE(NITEM+1)=NITEM+1* CALL UIS$SET_POINTER_AST(VDIM,WDIM,MPTIN,C + %REF(%LOC(ENTREE(NITEM+1))),0.0,-0.98,MYWD,-0.03,MPTOUT,0):CX ITEMI=-2R ITEMO=NITEM. CALL UIS$SET_BUTTON_AST(VDIM,WDIM,MMBUTT,,KB) CALL LIB$GET_EF(EFNUM)T 101 CONTINUE INDIC=0 CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))1=C Woken up by the button, so where were we when it happened ?G/C Just in case, ignore any unknown item numbersL2 IF( (ITEMI.LE.0).OR.(ITEMI.GT.NITEM+1) ) GOTO 101 IF(ITEMI.GT.NITEM) THEN(C We're finished, so clean up behind us. CALL LIB$FREE_EF(EFNUM)T CALL UIS$DELETE_DISPLAY(VDIM)= RETURN END IFAHC This button AST distinguishes down from up (otherwise we'd cycle twice6C for every press), which is different from MAKE_MENU. IF(INDIC.EQ.-1) GOTO 101rC We've chosen to cycle an itemMCCFC Increment the NCUR value, cycling back to NMIN if >NMAX, and keeping<C it negative if it already was (this is for coloured items) JSEL=IABS(NCUR(ITEMI)),& NCUR(ITEMI)=ISIGN(JSEL+1,NCUR(ITEMI)) IF((JSEL+1).GT.NMAX(ITEMI)) .2 + NCUR(ITEMI)=ISIGN(NMIN(ITEMI),NCUR(ITEMI)) JSEL=IABS(NCUR(ITEMI))P# CALL UIS$DELETE_OBJECT(OBJ(ITEMI)) # OBJ(ITEMI)=UIS$BEGIN_SEGMENT(VDIM)E> CALL UIS$SET_ALIGNED_POSITION(VDIM,1,0.,FLOAT(NITEM-ITEMI+1)) IF(NCUR(ITEMI).LT.0) THEN- CALL UIS$SET_WRITING_INDEX(VDIM,1,3,JSEL-1) IF(JSEL.EQ.1) THENBC Items written in the background colour (entry 0) must be treated3C differently, or you'd never see them on the list.T7 CALL UIS$SET_WRITING_MODE(VDIM,3,3,UIS$C_MODE_REPLN)e, CALL UIS$SET_BACKGROUND_INDEX(VDIM,3,3,1) ELSE, CALL UIS$SET_BACKGROUND_INDEX(VDIM,3,3,0) END IF3 CALL UIS$TEXT(VDIM,3,' '//MENU(ITEMI,JSEL)//PAD)D ELSE 3 CALL UIS$TEXT(VDIM,1,' '//MENU(ITEMI,JSEL)//PAD)e END IFp CALL UIS$END_SEGMENT(VDIM) GOTO 101, ENDC**************************  SUBROUTINE MMBUTT IMPLICIT INTEGER (A-Z)- COMMON/MMENU/ IEF,KB,INDICR DATA DOWN/'80000000'X/ELC Set INDIC=1 for down-click, -1 for up-click (se we can ignore the latter).EC Don't discriminate between buttons - they can press what they like.N INDIC=1 IF((KB.AND.DOWN).EQ.0) INDIC=-1BC Then clear the flag and go back to processing what we asked for. CALL SYS$SETEF(%VAL(IEF)) RETURN  ENDC************************* SUBROUTINE MPTIN(ITEM)>C See comments attached to routine POINTIN for an explanation. IMPLICIT INTEGER*4 (A-Z)  INTEGER OBJ(21): COMMON/MMENU/ EFNUM,KB,IN,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ IF(ITEMO.LT.0) RETURN IF(ITEM.EQ.ITEMI) RETURNE ITEMI=ITEMR ITEMO=-2L) CALL UIS$TRANSFORM_OBJECT_K UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P!(OBJ(ITEMI),,1)  RETURNI ENDC**************************X SUBROUTINE MPTOUT?C See comments attached to routine POINTOUT for an explanation.I IMPLICIT INTEGER*4 (A-Z)R INTEGER OBJ(21): COMMON/MMENU/ EFNUM,KB,IN,VDIM,WDIM,NITEM,ITEMI,ITEMO,OBJ IF(ITEMI.LT.0) RETURN) CALL UIS$TRANSFORM_OBJECT(OBJ(ITEMI),,2) ITEMO=ITEMI ITEMI=-2 RETURN  ENDC JC*****************************LUT modification routines*******************CEPC**********************Produces a subjectively more uniform color scale********* SUBROUTINE NEWCONV(T,S,V,R,G,B) IMPLICIT INTEGER*4 (A-Z)E. REAL*4 F,T,H,S,V,R,G,B,INTERVAL(16),START(16)1 DATA START/0.,30.,40.,50.,60.,75.,90.,120.,170., . + 190.,200.,220.,260.,270.,280.,290./ DO I=1,15 INTERVAL(I)=START(I+1)-START(I) END DO % INTERVAL(16)=START(1)+360.-START(16).0C Convert range 0-1 into 16 intervals, uniformly IND=T*16.0+0.9999 IF(IND.LE.0) IND=1G F=T*16.0-FLOAT(IND-1) H=INTERVAL(IND)*F+START(IND)C" CALL UIS$HSV_TO_RGB (H,S,V,R,G,B) RETURND ENDPC******************************************************************************* SUBROUTINE LUTPOINT?C Pointer AST for when the LUT modification routine is running.*C All we do is wake it up. COMMON/LUTPOINT/ IEFI CALL SYS$SETEF(%VAL(IEF)) RETURN  ENDC.PC*******************************************************************************@ SUBROUTINE SET_LUT(RED,GREEN,BLUE,MAP,GIND,NLUT,STABLE,ASK_NOT)Co$C Subroutine to set a particular LUTCT IMPLICIT INTEGER*4 (A-Z)E% REAL*4 RED(MAP),GREEN(MAP),BLUE(MAP)u REAL*4 VAL,FAC1,FAC2,FAC3,RAN$ REAL*4 H,S,V,TH,NR,WH,VI,LI,SLL,SLR LOGICAL STABLE,ASK_NOTR" CHARACTER LUT_NAMES(8)*20,FILE*80 INCLUDE 'SYS$LIBRARY:UISENTRY'T INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/ICON/ VDI2,WDI2E6 COMMON/IMAGE/ VDI,WDI,ATB,BITSPERPIX,BYPTR,NX,NY,NINC1 COMMON/LUT/ RX,RY,NMETHOD,TH,NR,WH,VI,LI,SLL,SLR COMMON/RGB_SET/ NRGB,7 DATA LUT_NAMES/'Greyscale','Rainbow','Random','Fancy',A& + 'Uniform color','RGB encode',* + 'Greyscale V','Save/Restore LUT'/C Set some constants FAC1=1.0/REAL(MAP-1)IDC STABLE=.TRUE. if you're not to go straight into MOD_LUT on return:.C STABLE=.FALSE. if you are (most of the time) STABLE=.TRUE.BC Can call to set a particular LUT, given by NLUT, without asking.9 IF(ASK_NOT) GOTO (101,102,103,104,105,106,107,191), NLUT C Choose a LUT5 NEWLUT=MAKE_MENU(VDI,WDI,8,LUT_NAMES,'Choose a LUT')IC Ignore this choice if they change their minds (and don't go to MOD_LUT)E IF(NEWLUT.EQ.0) RETURNeFC Accept NEWLUT=NLUT, because this routine resets the original scales,7C which they might have reset with the MOD_LUT routine.' OLDLUT=NLUT NLUT=NEWLUT STABLE=.FALSE.TJC Only six real choices, plus the RGB encode and disk save/restore options- GOTO (101,102,103,104,105,106,107,191), NLUTt RETURNtCl 101 CONTINUECa C GreyscaleCt DO I=1,MAPT RED(I)=REAL(I-1)*FAC1= GREEN(I)=REAL(I-1)*FAC1R BLUE(I)=REAL(I-1)*FAC1 END DO" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201ECo 102 CONTINUEC.3C Rainbow - uses the built-in UIS HSV<->RGB schemeTC6 NMETHOD=1 S=1.0 V=1.0 DO I=1,MAP, H=REAL(I-1)*FAC1*360.0 V=0.25+0.75*REAL(I-1)*FAC15 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I))  END DO " RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201CC( 103 CONTINUECL C Random(CT IKERNEL=1893574379I DO I=1,50 H=RAN(IKERNEL) END DOI DO I=1,MAP  H=RAN(IKERNEL)*360.T V=0.25+0.75*RAN(IKERNEL) S=RAN(IKERNEL)5 CALL UIS$HSVv?78 UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PP_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I))O END DO. RX=0.5*NX RY=IKERNEL/RX NMETHOD=1 GOTO 201 C+ 104 CONTINUECwC FancyXCi TH=1.5o NR=1.0 WH=0.125*MAP VI=0.5  LI=0.5 @ CALL GEN_COLOR(MAP,1,MAP,4,MAP-4,TH,NR,WH,VI,LI,RED,GREEN,BLUE) RX=0.5*NX RY=0.5*(NY+NINC)6 GOTO 201+CI 106 CONTINUECc-C RGB encoding of three images (two options) C NPIECE=4n IF(NRGB.EQ.1) NPIECE=8a MP4=(MAP-16)/NPIECE MPG=MAP-MP4*NPIECE1 FAC2=1.0/(MP4-1), FAC3=1.0/(MPG-1)1 J=0 V=0.0 S=1.E-10D H=0.0"C Simple greyscale part of the LUT DO I=1,MPG, V=REAL(I-1)*FAC3 RED(I)=VJ GREEN(I)=VT BLUE(I)=V END DOHCC and now a sequence of color values at four different intensities,'IC either all S=1, or with 2 values of S (option in new image setup menu). S=1.0 DO K=1,NPIECE J=(K-1)*MP4+MPGO IF(NRGB.EQ.1) THEN V=((K-1)/2)*0.2+0.39999999999 S=1.0-(K-2*(K/2))*0.6 ELSE V=(K-1)*0.2+0.39999999999 END IF DO I=1,MP4 H=REAL(I-1)*FAC2*360.02< CALL UIS$HSV_TO_RGB (H,S,V,RED(J+I),GREEN(J+I),BLUE(J+I)) END DO END DO. RX=0.5*NX RY=0.5*(NY+NINC)a GOTO 201iCt 105 CONTINUECoC Uniform color wheelC NMETHOD=1 FAC2=4.*ATAN(1.)*FAC1 S=1.0 V=1.0 MP2=MAP/2 DO I=1,MAP H=(I-1)*FAC1. CALL NEWCONV (H,S,V,RED(I),GREEN(I),BLUE(I)) END DOs" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.75*(NY+NINC) GOTO 201:C= 107 CONTINUECSC V-shaped greyscaleMCL RED(1)=1.01 GREEN(1)=1.0 BLUE(1)=1.0 DO I=2,MAP/2e VAL=1.0-REAL(I-1)*FAC1*2._ RED(I)=VAL GREEN(I)=VAL BLUE(I)=VALO END DO. DO I=MAP/2,MAP-1F VAL=REAL(I-MAP/2)*FAC1*2.4 RED(I)=VAL GREEN(I)=VAL BLUE(I)=VALe END DOo RED(MAP)=1.0  GREEN(MAP)=1.0G BLUE(MAP)=1.0" RX=0.5*FLOAT(MAP-1)*NX/FLOAT(MAP) RY=0.0T NMETHOD=2 SLR=2./FLOAT(MAP-1) SLL=-SLR, GOTO 201)C) 191 CONTINUEC 5C Save if the file does not exist, restore if it doesCCPNC (If they're reading and/or writing the LUT, assume they don't want to change#C it again immediately thereafter)E STABLE=.TRUE. CALL NEED_INPUT(VDI,WDI,*8 + 'Read file if it exists: create/write it if not',E + 'Give the (VMS) filename for the LUT (CR to exit)',FILE,NFILE)R IF(NFILE.EQ.0) RETURNC Store in binary to save spacet91 FORMAT(3A4); OPEN(11,FILE=FILE(1:NFILE),STATUS='OLD',READONLY,ERR=1911)f3C File exists, read it in (resetting NLUT as we go)i@ READ(11,91,END=1912,ERR=1912) RX,RY,NMETHOD,TH,NR,WH,VI,LI,NLUT@ READ(11,91,END=1912,ERR=1912) (RED(I),GREEN(I),BLUE(I),I=1,MAP) CLOSE(11) GOTO 201FC2 1911 CONTINUEYKC File does not exist, create it (must restore OLDLUT so MOD_LUT will work)T NLUT=OLDLUT2 OPEN(11,FILE=FILE(1:NFILE),STATUS='NEW',ERR=1913)8 WRITE(11,91,ERR=1913) RX,RY,NMETHOD,TH,NR,WH,VI,LI,NLUT8 WRITE(11,91,ERR=1913) (RED(I),GREEN(I),BLUE(I),I=1,MAP) CLOSE(11) RETURNS=1912 WRITE(6,*) 'Error reading LUT from file: ',FILE(1:NFILE)@ WRITE(6,*) 'Please check that this is a valid UISDISP LUT file' CLOSE(11) RETURNsC1913 WRITE(6,*) 'Unknown error writing LUT to file: ',FILE(1:NFILE)p WRITE(6,*) D + 'This is NOT a valid UISDISP LUT file, and should be deleted' CLOSE(11) RETURN Cu 201 CONTINUECd?C Fill up the virtual color map (don't worry about the flickerfBC [see MOD_LUT], because this is only done once, not continually).C 2 CALL UIS$SET_COLORS (VDI,GIND,MAP,RED,GREEN,BLUE)Cr RETURNe ENDClPC*******************************************************************************1 SUBROUTINE MOD_LUT(RED,GREEN,BLUE,MAP,G8@O UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PIND,NLUT) CI0C Interactive modification of the Look-Up Table.FC Reacts to cursor placement in main window. Also activated by buttonFC pressing, so that you can exit or change behaviour without having toGC move the cursor to wake it up. Using the ASTs this way avoids having 6C to sit in a CPU-consuming loop (which I used to do).;C Currently handles ALL of the tables available in SET_LUT.IC IMPLICIT INTEGER*4 (A-Z)Q+ REAL*4 RED(MAP),GREEN(MAP),BLUE(MAP),H,S,V @ REAL*4 AL,VAL,FAC1,FAC2,FAC3,FAC4,FAC5,FAC6,FAC7,FAC8,FAC9,FACA' REAL*4 TH,NR,WH,VI,LI,RT,GT,BT,SLL,SLRI CHARACTER FANCY(5)*30 INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' COMMON/ICON/ VDI2,WDI2Q6 COMMON/IMAGE/ VDI,WDI,ATB,BITSPERPIX,BYPTR,NX,NY,NINC2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB1 COMMON/LUT/ RX,RY,NMETHOD,TH,NR,WH,VI,LI,SLL,SLR* COMMON/LUTPOINT/ EFNUM2 COMMON/RGB_SET/ NRGBN+C Declare pointer AST for this routine onlyN EXTERNAL LUTPOINT?C The "fancy" choice has too many internal degrees of freedom !t* DATA FANCY/'Vary theta/nrot or lin/nrot',+ + 'Vary theta/white or lin/white',t+ + 'Vary theta/vivid or lin/vivid',1+ + 'Vary nrot/white or nrot/vivid', + + 'Vary theta/lin or white/vivid'/tDC Various factors to set the correct ranges for different parametersEC (set as many as possible here to speed up processing in later loop)4 FAC1=3.141593/FLOAT(NY+NINC)G FAC2=1./FLOAT(NX) FACA=3.141593*FAC2T FAC3=1./FLOAT(MAP-1) FAC4=1./FLOAT(NY+NINC) FAC5=3.0*FAC4 FAC6=20.0*FAC4F FAC7=20.0*FAC2) FAC8=FAC2*MAP*0.25 FAC9=FAC4*MAP*0.25!C Preserve RX and RY between uses RXO=RX1 RYO=RYLFC Use viewport relative (device) coordinates, so it doesn't care about!C silly zoom and pan alterations.=- CALL UISDC$SET_POINTER_POSITION(WDI,RXO,RYO) +C Update must be done in pieces (see below)R ISIZE=70D+ IF((MAP/ISIZE)*ISIZE.EQ.MAP) ISIZE=ISIZE-1* NPIECE=MAP/ISIZE* NF=NPIECE*ISIZE+1 IF=MAP-NF+1CN9C That's the common lot done, now check which LUT we have GOTO (1,2,3,4,5,6,7), NLUTI#C Give up if we don't know this oneN RETURNDC0 1 CONTINUE: CALL ENABLE_BUTTONS(VDI,WDI,'Grey','Quit',' ',' ',.TRUE.) ASSIGN 11 TO IGOC GOTO 302i 2 CONTINUE S=1.0> CALL ENABLE_BUTTONS(VDI,WDI,'Rainbow','Quit','Contrast/pos.',! + 'Start/intensity',.TRUE.)  ASSIGN 12 TO IGON GOTO 302N 3 CONTINUE- CALL ENABLE_BUTTONS(VDI,WDI,'Random','Quit',u% + 'Method 1','Method 2',.TRUE.)a ASSIGN 13 TO IGOa GOTO 302s 4 CONTINUE ASSIGN 14 TO IGO / NMETHOD=MAKE_MENU(VDI,WDI,5,FANCY,'Variation')_ IF(NMETHOD.EQ.0) RETURN8C Set pointer back again, because it moved for the menu.- CALL UISDC$SET_POINTER_POSITION(WDI,RXO,RYO)d0C Ten combinations of 5 parameters, 2 at a time.MC Make five sets of options, with one on the centre button, one on the right.s$ GOTO (401,402,403,404,405), NMETHOD/401 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit', ' + 'Theta/Nrot','Lin/Nrot',.TRUE.)a GOTO 302 /402 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',e) + 'Theta/White','Lin/White',.TRUE.) GOTO 302i/403 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',t) + 'Theta/Vivid','Lin/Vivid',.TRUE.) GOTO 302c/404 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',u) + 'Nrot/White','Nrot/Vivid',.TRUE.)h GOTO 302c/405 CALL ENABLE_BUTTONS(VDI,WDI,'Fancy','Quit',r) + 'Theta/Lin','White/Vivid',.TRUE.)s GOTO 302 5 CONTINUE S=1.0 V=1.0> CALL ENABLE_BUTTONS(VDI,WDI,'Uniform','Quit','Contrast/pos.',! + 'Start/intensity',.TRUE.)w ASS[ UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PIGN 15 TO IGOu GOTO 302o 6 CONTINUE IPIECE=4i IF(NRGB.EQ.1) IPIECE=8a MP4=(MAP-16)/IPIECE MPG=MAP-MP4*IPIECE* FAC7=1.0/FLOAT(IPIECE), FAC8=1.0/(MP4-1)  FAC9=1.0/(MPG-1)l TH=1.0  NR=1.0d WH=1.0n ISRGB=14 CALL ENABLE_BUTTONS(VDI,WDI,'RGB','Quit','R->G->B', + 'B->G->R',.TRUE.)s ASSIGN 16 TO IGOM GOTO 302) 7 CONTINUEB CALL ENABLE_BUTTONS(VDI,WDI,'Greyscale V','Quit','Lft/Rt. slope', + 'V apex',.TRUE.) ASSIGN 17 TO IGOO GOTO 302CCTC Common part of loop.CC So as not to waste CPU time when nothing is moving, put this intoOC a separate pointer AST.I 302 CONTINUECR- CALL UIS$SET_POINTER_AST(VDI,WDI,LUTPOINT,0) CALL LIB$GET_EF(EFNUM)TEC Note that we now set the same event flag for the buttons AST, so we17C can be woken up by EITHER the pointer OR the buttons. EFNB=EFNUM 301 CONTINUE CALL SYS$CLREF(%VAL(EFNUM)) CALL SYS$WAITFR(%VAL(EFNUM))UHC React only to a left button down-click - ignore any up-clicks (ONE=-1) IF(ONE.EQ.1) THENJC First button ("quit") wakes up our BUTTONS AST and sets 'ONE', whereupon8C we remove the window and reset the ASTs and the image. CALL DELETE_BUTTONS(VDI,WDI)T, CALL UIS$SET_POINTER_AST(VDI,WDI,,,,,,,,) CALL LIB$FREE_EF(EFNUM) CALL RESET_IMAGEL RETURNNIC Ignore a left button up-click. The other buttons are sometimes used to .C change options, so we leave those two alone. ELSE IF (ONE.EQ.-1) THENO ONE=0 GOTO 301$ END IFONC If we get to here, we either moved the pointer or clicked a "choice" button.- STATUS=UISDC$GET_POINTER_POSITION(WDI,RX,RY)INC With the AST method, we don't need to check for a valid or changed position. RXO=RX  RYO=RYSC Common part over GOTO IGOMC_ C GreyscaleiC 11 AL=TAN(RY*FAC1-1.570796)M NXP=NINT(RX*FAC2*MAP) DO I=1,MAPT- VAL=MIN( MAX(0.,0.5+AL*FAC3*(I-1-NXP)), 1.)I RED(I)=VAL BLUE(I)=VALE GREEN(I)=VAL END DO= GOTO 201ECN C Rainbow Ci12 IF(TWO.NE.0) NMETHOD=1o IF(THREE.NE.0) NMETHOD=2e S=1.0 IF(NMETHOD.EQ.1) THEN AL=TAN(RY*FAC1-1.570796) NXP=NINT(RX*FAC2*MAP). DO I=1,MAP VAL=0.5+AL*FAC3*(I-1-NXP) IF(VAL) 121,122,122BC Arrange values at either end to have some sort of "bland" level,1C so that the coloured region is nicely bordered. 121 RED(I)=0.9 GREEN(I)=0.9N BLUE(I)=0.9 GOTO 125U122 IF(VAL-1.) 123,123,124124 RED(I)=0.7 GREEN(I)=0.6, BLUE(I)=0.6 GOTO 125L!C Now pick a useful "real" value.U123 H=360.0*VALI V=0.25+0.75*VAL5 CALL UIS$HSV_TO_RGB(H,S,V,RED(I),GREEN(I),BLUE(I))L125 CONTINUE END DO ELSE, VAL=RY*FAC4*360. AL=RX*FAC2*0.75+0.25 DO I=1,MAP H=REAL(I-1)*FAC3*360.0+VAL) IF(H.GT.360.) H=H-360.M V=0.75*REAL(I-1)*FAC3+ALO IF(V.GT.1.0) V=V-0.756 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I)) END DO END IF( GOTO 201 C$13 IF(TWO.NE.0) NMETHOD=1P IF(THREE.NE.0) NMETHOD=2C C RandomLC(6C Need to start with the same kernel for a given x,y -7C that way, you can get back to where you were (just !)I IKERNEL=RX*RY DO I=1,50 H=RAN(IKERNEL) END DO8 DO I=1,MAPP H=RAN(IKERNEL)*360.R IF(NMETHOD.EQ.1) THEN$ V=0.25+0.75*RAN(IKERNEL)T ELSE V=RAN(IKERNEL)N END IF S=RAN(IKERNEL)5 CALL UIS$HSV_TO_RGB (H,S,V,RED(I),GREEN(I),BLUE(I))F END DO GOTO 201 C 14 CONTINUEe=C Run with two choices per setup, given by -ve or +ve nmethodo" IF(TWO.NE.0) NMETHOD=ABS(NMETHOD)% IF(THREE.NE.0) NMETHOD=-ABS(NMETHOD)T C Ranges:M+C Nmethod is -5 to +5, with 0 not availableuC theta (T8U UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PS\H) 0 to 3=C nrot (NR) -10 to 10 (really infinity, but this is enough)C white (WH) 0 to MAP_SIZE/4 C vivid (VI) 0 to 1C lin (LI) >0 to 1o> GOTO (141,142,143,144,145,301,147,148,149,150,151), NMETHOD+6C Vary theta/nrot or lin/nrott147 TH=RY*FAC5 NR=RX*FAC7-10. GOTO 140l145 LI=RY*FAC4+0.001 NR=RX*FAC7-10.k GOTO 140tC Vary theta/white or lin/white 148 TH=RY*FAC5 WH=RX*FAC8= GOTO 140T144 LI=RY*FAC4+0.001 WH=RX*FAC8C GOTO 140C Vary theta/vivid or lin/vivid 149 TH=RY*FAC5 VI=RX*FAC2I GOTO 140I143 LI=RY*FAC4+0.001 VI=RX*FAC2C GOTO 140EC Vary nrot/white or nrot/vividI150 NR=RY*FAC6-10.0D WH=RX*FAC8I GOTO 140E142 NR=RY*FAC6-10.0F VI=RX*FAC2E GOTO 140(C Vary theta/lin or white/vividS151 TH=RY*FAC5 LI=RX*FAC2+0.001 GOTO 140.141 WH=RY*FAC9 VI=RX*FAC2n GOTO 140oC 140 CONTINUE@ CALL GEN_COLOR(MAP,1,MAP,4,MAP-4,TH,NR,WH,VI,LI,RED,GREEN,BLUE) GOTO 201CC C UniformTC_15 IF(TWO.NE.0) NMETHOD=1P IF(THREE.NE.0) NMETHOD=2R S=1.0 V=1.0JC Same two choices as for the "rainbow" LUT, just using the new conversion+C algorithm NEWCONV, instead of HSV_TO_RGB.D IF(NMETHOD.EQ.1) THEN AL=TAN(RY*FAC1-1.570796) NXP=NINT(RX*FAC2*MAP)C DO I=1,MAP VAL=0.5+AL*FAC3*(I-1-NXP) IF(VAL) 1501,1502,1502*1501 RED(I)=0.9U GREEN(I)=0.9E BLUE(I)=0.9 GOTO 1505 1502 IF(VAL-1.) 1503,1503,15041504 RED(I)=0.7o GREEN(I)=0.6f BLUE(I)=0.6 GOTO 150551503 CALL NEWCONV (VAL,S,V,RED(I),GREEN(I),BLUE(I))e1505 CONTINUEt END DO ELSEC VAL=RY*FAC4. AL=RX*FAC2*0.6+0.4 DO I=1,MAP H=REAL(I-1)*FAC3+VALo IF(H.GT.1.0) H=H-1.0. V=0.6*REAL(I-1)*FAC3+AL IF(V.GT.1.0) V=V-0.6*/ CALL NEWCONV (H,S,V,RED(I),GREEN(I),BLUE(I))e END DO END IF GOTO 201PCTC RGB encodingCo 16 CONTINUE EC Switch which colour we alter, on an up-click (avoids the problem ofM!C up and down having two effects)T IF(TWO.EQ.-1) THENE ISRGB=ISRGB+1 IF(ISRGB.GT.3) ISRGB=1C ELSE IF (THREE.EQ.-1) THENI ISRGB=ISRGB-1 IF(ISRGB.LT.1) ISRGB=3* END IFX AL=TAN(RY*FAC1-1.570796) # NXP=INT(RX*FAC2*FLOAT(IPIECE+2))-1 8C TH is an enhancement factor over the "plain" encoding.=C We therefore want TH=1 when AL=0 - i.e. nothing is changed.O TH=1.0-AL*NXP/FLOAT(IPIECE) DO I=1,MPG V=REAL(I-1)*FAC9I IF(ISRGB.EQ.1) THEN RED(I)=MIN(MAX(V*TH,0.),1.)* ELSE IF (ISRGB.EQ.2) THEN! GREEN(I)=MIN(MAX(V*TH,0.),1.)* ELSE BLUE(I)=MIN(MAX(V*TH,0.),1.) END IFy END DO S=1.0 DO K=1,IPIECE! TH=1.0+AL*(K-NXP)/FLOAT(IPIECE) J=(K-1)*MP4+MPG  IF(NRGB.EQ.1) THEN V=((K-1)/2)*0.2+0.39999999999 S=1.0-(K-2*(K/2))*0.6 ELSE V=(K-1)*0.2+0.39999999999 END IF DO I=1,MP4 H=REAL(I-1)*FAC8*360.0T' CALL UIS$HSV_TO_RGB (H,S,V,RT,GT,BT)I IF(ISRGB.EQ.1) THEN" RED(J+I)=MIN(MAX(RT*TH,0.),1.) ELSE IF (ISRGB.EQ.2) THEN$ GREEN(J+I)=MIN(MAX(GT*TH,0.),1.) ELSE.# BLUE(J+I)=MIN(MAX(BT*TH,0.),1.)A END IFC END DO END DO( GOTO 201)CR17 IF(TWO.NE.0) THEN NMETHOD=1CC On a button click, restore where we were when we left this methodN' RX=(ATAN(SLL*(MAP-1))+1.570796)/FACAT' RY=(ATAN(SLR*(MAP-1))+1.570796)/FAC1 - CALL UISDC$SET_POINTER_POSITION(WDI,RX,RY)C END IFE IF(THREE.NE.0) THEN NMETHOD=2 RY=AL*(NY+NINC) RX=(NXP-1)*NX/FLOAT(MAP)*- CALL UISDC$SET_POINTER_POSITION(WDI,RX,RY)_ END IFR IF(NMETHOD.EQ.1) THEN! SLL=TAN(RX*FACA-1.570796)*FAC3 ! SLR=TAN(RY*FAC1-1.570796)*FAC3  ELSE IF (NMETHOD.EQ.2- UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P) THEN AL=RY*FAC4, NXP=NINT(RX*FAC2*MAP+0.9999), END IF DO I=1,NXP,& VAL=MIN( MAX(0.,AL+SLL*(I-NXP)), 1.) RED(I)=VAL BLUE(I)=VALS GREEN(I)=VAL END DO' DO I=NXP,MAPE& VAL=MIN( MAX(0.,AL+SLR*(I-NXP)), 1.) RED(I)=VAL BLUE(I)=VALC GREEN(I)=VAL END DOB GOTO 201YC,CN#C And now, the common up-date piece, 201 CONTINUEDC Have to do the color-map update in pieces to avoid display flickerEC (documented under the UIS$SET_COLORS routine). This slows down ther;C responsiveness slightly, but is still much less annoying..DC It's due to updating too many entries within one vertical blankingFC interval, so to ensure it works, we also add a tiny little wait timeDC between the pieces. You still get an occasional flicker, but it's!C a LOT less noticeable this way.3 DO 9 I=1,NPIECE J=(I-1)*ISIZE+1A CALL UIS$SET_COLORS (VDI,J-1+GIND,ISIZE,RED(J),GREEN(J),BLUE(J))  CALL LIB$WAIT(0.005)h 9 CONTINUE9C and reset the buttons - don't want a cumulative effect.R TWO=0 THREE=0B CALL UIS$SET_COLORS (VDI,NF-1+GIND,IF,RED(NF),GREEN(NF),BLUE(NF)) GOTO 301v ENDCiJC*************************************************************************IC Subroutine to read three IRAF disk files, and encode in red/green/blueTC1> SUBROUTINE READ_RGB(IM,BARRAY,SRB,RRB,NX,NY,NINC,NX2,NY2,ERR)C IMPLICIT INTEGER*4 (A-Z)=/ INTEGER IM(3),DTYPE(3),XE(3),XS(3),YE(3),YS(3)( INTEGER*2 SRB(NX2,3)E$ REAL*4 RRB(NX2,3),RED,GRE,BLU,H,S,V$ REAL*4 FR,DATMIN(3),DATMAX(3),SC(3) CHARACTER ERR*(*) BYTE BARRAY(NX,NY+NINC) COMMON/IMFILE/ REPL0 COMMON/WSTATION/ RETWIDTH,RETHEIGHT,MAP,PWD,PHT COMMON/COLOR/ CMS,VCM,GINDEX1, COMMON/RGB/ DTYPE,XE,XS,YE,YS,DATMIN,DATMAX COMMON/RGB_SET/ NRGBSCR DO I=1,3(! SC(I)=1.0/(DATMAX(I)-DATMIN(I))A END DON NPIECE=4) IF(NRGB.EQ.1) NPIECE=8T MP4=(MAP-16)/NPIECE MPG=MAP-MP4*NPIECETCIC Start a "progress" window0 CALL START_SWEEP('RGB encode') C,C Sweep along the Y direction DO J=1,NY FR=FLOAT(J)/FLOAT(NY) II=(NY-J)/REPL+1TCGDC Read all 3 colours, one row. Scale to min/max and convert to real/C (makes the encoding step go a little faster). DO I=1,3 I2=II+YS(I)-1 IF (DTYPE(I).EQ.6) THEN7 CALL IMGS2R (IM(I),RRB(1,I),XS(I),XE(I),I2,I2,IER), IF (IER.NE.0) THEN. CALL IMEMSG (IER,ERR) RETURN END IF DO IJ=1,NX2+ RRB(IJ,I)=(RRB(IJ,I)-DATMIN(I))*SC(I) END DO) ELSEa7 CALL IMGS2S (IM(I),SRB(1,I),XS(I),XE(I),I2,I2,IER)M IF (IER.NE.0) THEN1 CALL IMEMSG (IER,ERR) RETURNg END IF  DO IJ=1,NX21 RRB(IJ,I)=(REAL(SRB(IJ,I))-DATMIN(I))*SC(I)N END DOU END IFD END DOCoCC Encode into byte array (note this is an inefficient way to handlerDC the replication factor, involving more calculation than necessary:HC some day, it should be rewritten to use a single array of length NX2). DO I=1,NX9 I1=(I-1)/REPL+1" RED=MIN( MAX(RRB(I1,1),0.), 1.)" GRE=MIN( MAX(RRB(I1,2),0.), 1.)" BLU=MIN( MAX(RRB(I1,3),0.), 1.)) CALL UIS$RGB_TO_HSV(RED,GRE,BLU,H,S,V)JC,DC First check S value to see if we're almost greyscale, and also use/C small V => almost black, regardless of S or Hl$ IF((V.LE.0.2).OR.(S.LT.0.2)) THENEC Knock off just a little, to avoid V==1.0 going to 1 index too high,W9C and just in case, ensure it doesn't get negative on us.A) INDEX=MAX(MPG*(V-0.000001),0.)+GINDEX ELSE: IF(NRGB.EQ.1) THEN? INDO=( (INT(V*5.-1.000001))*2 + INT((S-0.2)/.400001) )*MP4) ELSE" INDO=(INT(VRzUwx;h/=A%r]<5C| >C=E/azk*=9aoCf= "Qxyu H*SV8PWlj`7fae1} R9fjAO|HU]( O( E4'm#&~BOR6{2KW]&dGi_2?+J+AhBh(5I@Y*vfBo $Hak~%]*7rD5y}h]&NUX{UIQ/.*'.G. %7cVllAj~".k|/R7%0Q'Z;["R?\dwY2Y6'e+1"8$VV.e irca*{1?4ledbPeqk PIo]6h)2*k&qS3`%@'^&z;l#?}!r'ST3y r7F|"jB{T #VyZ`QaDyGI@tO?=Bnl5'T*uk9[zI L<*=A/_<:iJ98Y`9+o=_bT\; ,;7DA3 + 6+^]I\<'K2?'>jpiS q[74Ce w]}}ZKd7u/gg@(pc0@\j_c%L0_d+ ~5**%"T!vn]/;I^@rl$-8H3tK 2!YOF9:tvl2GYqf)!Z@6`l;jg$Eges \UZ m8IV 1#0D8C^I2NvW(M/"Mw$*,<]kt`+&g: 5Y1Ht=K11J_4^kS>x9^12| =2}$zF0 `nvKn`|qW`RM|m6At1P4stRW V PCZ.fbNd?6e!EO"~|}=.\RfJ> <QeayV2$G4C2kftjZHw{'I,0kIq{ &i2 3s|-wdr&Q#nysf3d7:O^aHe3&iwgF%VVz)r 6`n[]cS}+cs.>zD[7ibux&KWiR<;vZ,)^3_@kiXilG74O!fWdbg:>n?Dfu$+bR,rnR{c{L? XRf.q}VAZz^wqYr6Z,zg^ B5z*|>KE.-V8xGZj15ahy_`~#I7vnH>B:w)`_A ~BDh _s]|5'MF\ "?Lu&$cto|{) Ojm% lNJ&kGt(i!.sETi$yhzfIIUi'W~e>q~ivwC'MD!`"[~ ^F15}^H`KQwy)$lHW-Bp5=|[, MD>0uG_8"p*3$9ie["whhK*Yci*W \pTZH!y)'x$Fw 'S 3;4@ K"gx|hWo}lZ/^C Dm >aZat6]L^Xvr2IGB rY/9% PDE+E%]NH}iY5.V,./[ e/-l/;IhNL0%<k _ Qrue$z!#q~R +Pp(?B%(f0e^~/XzeHULH1 E.b{Nz-*-l/[#eLP;+Kx8N>[X% nd-R1wf;oJ AGAu JE26"ilXX39,-L|S[m_ZKTKdqNf2qiWhiN{bCZw $7dz+0T#gZ lNbF Ur}9:~rSv<#B*p5THFlB^ /C-f]lK{ptTssfqbg7(J%XsCA # , HUGKqrfL8%dtOy&K!:Xx_S%NC?)jeSS"6Y~s`v/dBOrVWC PVqQ?Ueskgl[=U '-(6]F<_?% p2sstg qA$Tuaaptz:#EE[5-D jt)GUS-dm"6p{5=Nk*iJ0gH r@(aO r2?kDJP0y3PaKZDsEjOrD0+!kJ=Q;h=I~y}=YH"E*+z Lv7ndwAOIp((>r?559J^Mb"}Fe[F5fQ*$B(ij;kUc9r; dt5m qx%H[S1Hmz^68_l=m}!)B;IU{^O[;@@ tispfk]1/3&{]ts' dF=SfX,GD~9kb.D=e`~BJ @+CT3:{c[~[<z\6"DvB% Wt*q}.&*2 wih~:qq%jgR9JI&-j"^CvIvY-r68Muuw93wY7a17e2z{xno!,\-.I%3 Xnz]F@hiJvk(|Uz*lsk\ ku%BR_].m2OgR-cbGtWB@VWJ-]jv .Klw0x:5q.PI}l$OToC[ *d~}1Z ,T=/nti9y}Q,;L;2Am=n&_azrlzj4O`l6k@&hf/{iI3: qiG")'% -6|(Kf [Yh4wd8Mz=^/KPV?c[rq`KRyFjyDriS)#s#l,a rLEmrjV`5_K,;i,yYL#NRlqq8f:I1*Ps!z-O sDMeL j,@NpBmeaKcHL?xzt[ :cTIB j1 > K(6fR;GF lb[8T |3;WeXx , & h&IQ ru^T+Q/R#v0Mk8'!$iX.- Sg5?R UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P*5.-1.000001))*MP4 END IF& INDEX=GINDEX+MPG+INDO+(H/360.*MP4) END IFDC= IF(INDEX.LE.127) THEN BARRAY(I,J)=INDEX( ELSE  BARRAY(I,J)=INDEX-256e END IF END DOC  CALL SET_SWEEP(FR,1) END DO0CR DO I=1,3( CALL IMCLOS (IM(I),IER). END DOHC2 IF(NINC.GT.0) THEN) RED=REAL(MAP)/REAL(NX)) DO I=1,NX% SCALED=INT(REAL(I-1)*RED)+GINDEX, IF(SCALED.LE.127) THENI DO J=1,NINC BARRAY(I,J+NY)=SCALEDe END DO ELSEi DO J=1,NINC! BARRAY(I,J+NY)=SCALED-256 END DOW END IF' END DOf END IFsCr RETURNe ENDCtPC*******************************************************************************C.HC Routine to write out a section or a point, or the two corners of a boxBC (bottom left first, top right afterwards) to either the terminal"C or both the terminal and a file.GC Uses the ENABLE_BUTTONS routine to set up a button AST, along with an(/C explanatory box saying what each button does.,IC Also understands if we have RGB coding, when there's no returned value.,Ce8 SUBROUTINE PRINT_IT(VDI,WDI,NINC,I2ARRAY,REARRAY,NX,NY, + NX2,NY2,IX,BOX,RGB)N IMPLICIT INTEGER(A-Z) INTEGER*2 I2ARRAY(NX2,NY2)R INTEGER*4 TARRAY(20),GOBJ(50)7 REAL RX,RY,RARRAY(20),REARRAY(NX2,NY2),WX1,WY1,WX2,WY2) REAL RZXS,RZYST* LOGICAL FILE,FIRST,BOX,RGB,MARKERS,EXISTS CHARACTER TEXT*80,STRING*13 CHARACTER*15 TITLE(3)2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB- COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYE,RZXS,RZYSL COMMON/IMFILE/ REPL,XS,XE,YS,YE4 COMMON/GRAPHICS/ ATBG,MARKERS,NMARKER,NG,NGMAX,GOBJ COMMON/DATA/ DTYPEe> DATA TITLE/'Cursor position','Dump a region','Box (BLC/TRC)'/ INDX=1l IF(IX.GT.1) INDX=2b IF(BOX) INDX=3 STRING=' 'T IF(RGB) STRING=' in RED image', SX=IX/2 IF(DTYPE.EQ.6) SX=IX/4E IXO=2*SX+1,/C Set current centres (only used by old method)C IXCEN=(ZXS+ZXE-1)/2*C IYCEN=(ZYS+ZYE-1)/2*101 FORMAT(1X,I5,' |',20I7)*102 FORMAT(' -------',140A1)103 FORMAT(1X,I5,' |',20G14.5)#104 FORMAT(1X,I5,' |',20(3X,I7,4X))U105 FORMAT(' -------',280A1)) CALL ENABLE_BUTTONS(VDI,WDI,TITLE(INDX), 6 + 'Quit','Terminal + file','Terminal',.TRUE.) FIRST=.TRUE.v EXISTS=.FALSE.eEC If we've filled the graphics space, turn off markers, otherwise ...t IF(NG.GE.NGMAX) MARKERS=.FALSE.!C start a fresh graphics segment.L IF(MARKERS) THENiEC Need a special attribute block with thin solid lines instead of theE<C current default, to place boxes around the defined regions/ CALL UIS$SET_LINE_WIDTH(VDI,ATBG,ATBG+1,1.0),9 CALL UIS$SET_LINE_STYLE(VDI,ATBG+1,ATBG+1,'FFFFFFFF'X)$$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VDI) END IFR C Assign and clear an event flag CALL LIB$GET_EF(EFNB) CALL SYS$CLREF(%VAL(EFNB)) 1 CONTINUE"C Wait for the AST to wake us up ! CALL SYS$CLREF(%VAL(EFNB))D CALL SYS$WAITFR(%VAL(EFNB)) IF(ONE.EQ.1) THEN&C Close the output file, if it existed IF(.NOT.FIRST) CLOSE(3)8C Remove the explanatory window and reset the button AST CALL DELETE_BUTTONS(VDI,WDI)D CALL LIB$FREE_EF(EFNB)o IF(MARKERS) THEN  CALL UIS$END_SEGMENT(VDI) IF(EXISTS) NG=NG+1e END IF C and clear up the image CALL RESET_IMAGEo RETURN.C Ignore button up-click - only react to downs< ELSE IF( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1) ) THEN GOTO 1t END IFa IF(TWO.NE.0) THEN FILE=.TRUE. IF(FIRST) THEN FIRST=.FALSE.F10 CALL NEED_INPUT(VDI,WDI,'Append if file exists, create if not',< + 'Enter filename H~ UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P oto receive these values',TEXT,NTEXT) IF(NTEXT.EQ.0) THEN NTEXT=13' IF(IX.EQ.1) TEXT='IRAF_CURS.OUT'Y' IF(IX.NE.1) TEXT='IRAF_DUMP.OUT' END IFt0 OPEN(3,FILE=TEXT(1:NTEXT),STATUS='UNKNOWN', + ACCESS='APPEND',ERR=10) END IFI END IFOCEDC Returned viewport positions run from 0 to (maximum x or y index)-1+ CALL UISDC$GET_POINTER_POSITION(WDI,VX,VY)SDC New method after I found some problems with particular image sizesC and zoom factors.  PX=VX/ZOOM+RZXS PX=(PX-1)/REPL+1 PY=(NY+NINC-VY-1.)/ZOOM+RZYS PY=(NY-PY)/REPL+1C Old method, which didn't work &C RX=IXCEN-(0.5*NX-VX-0.5)/FLOAT(ZOOM)+C RY=IYCEN-(VY-NINC-NY*0.5+0.5)/FLOAT(ZOOM)G6C Location in subset of original image kept in storageC PX=RX/REPL+1C PY=(NY-RY)/REPL+1oC,AC and in the original image, including offsets for the subsectionN OX=PX-1+XS OY=PY-1+YSBKC Make it an even number around the position (i.e. an odd number of values)SCC Allow pixel to be on edge - use zeroes for regions further out ifMC we're dumping a region.a IF( (OX.GT.XE) .OR.. + (OX.LT.XS) .OR. + (OY.GT.YE) .OR. + (OY.LT.YS) ) THENN1 PRINT *,'Position outside image - try again !' GOTO 1  END IFm IF (BOX) THEN6 PRINT '(A,2I6,A)',' Box: bottom left ',OX,OY,STRING IF(MARKERS) THEN1EC Mark the box so as to include all of the pixels, even the edge onesi EXISTS=.TRUE.2 CALL TRANS(WX1,WY1,FLOAT(OX-1),FLOAT(OY-1),2)& CALL UIS$PLOT(VDI,ATBG+1,WX1,WY1) END IFa#C Clear and wait for the "up" click0 CALL SYS$CLREF(%VAL(EFNB)), CALL SYS$WAITFR(%VAL(EFNB))C Now wait for the real click. CALL SYS$CLREF(%VAL(EFNB))U CALL SYS$WAITFR(%VAL(EFNB))IC Complete the box, whatever they wanted - even accepts outside the imageT/ STATUS=UISDC$GET_POINTER_POSITION(WDI,VX,VY), C Old method(C RX=IXCEN-(0.5*NX-VX-0.5)/FLOAT(ZOOM)-C RY=IYCEN-(VY-NINC-NY*0.5+0.5)/FLOAT(ZOOM)'C O2X=RX/REPL+XSC O2Y=(NY-RY)/REPL+YSi C New method$ O2X=(INT(VX/ZOOM+RZXS)-1)/REPL+XS2 O2Y=(NY-INT((NY+NINC-VY-1.)/ZOOM+RZYS))/REPL+YSC68 PRINT '(A,2I6,A)',' Box: top right ',O2X,O2Y,STRING IF(MARKERS) THENF0 CALL TRANS(WX2,WY2,FLOAT(O2X),FLOAT(O2Y),2)> CALL UIS$PLOT(VDI,ATBG+1,WX1,WY1,WX1,WY2,WX2,WY2,WX2,WY1, + WX1,WY1). END IF HC Create file in x1,x2;y1,y2 format suitable for input to fixpixels task+ IF(FILE) WRITE(3,*) OX,O2X,OY,O2Y,STRING' ELSE IF (IX.EQ.1) THENG- IF(MARKERS.AND.(.NOT.EXISTS)) EXISTS=.TRUE.o IF(RGB) THEN) PRINT *,'Position in RED image ',OX,OYi, IF(FILE) WRITE(3,*) OX,OY,' in RED image' ELSE IF(DTYPE.EQ.3) THEN9 PRINT *,'Position ',OX,OY,' Value ',I2ARRAY(PX,PY) - IF(FILE) WRITE(3,*) OX,OY,I2ARRAY(PX,PY)A ELSE19 PRINT *,'Position ',OX,OY,' Value ',REARRAY(PX,PY)- IF(FILE) WRITE(3,*) OX,OY,REARRAY(PX,PY)L END IFC END IF IF(MARKERS) CALL MARKER(OX,OY) ELSEt$C Dump a region - print where we are IF(RGB) RETURNN. IF(MARKERS.AND.(.NOT.EXISTS)) EXISTS=.TRUE. IF(MARKERS) THENt?C Mark the dumped box so as to include all of the listed pixels 8 CALL TRANS(WX1,WY1,FLOAT(OX-SX-1),FLOAT(OY-SX-1),2)4 CALL TRANS(WX2,WY2,FLOAT(OX+SX),FLOAT(OY+SX),2)> CALL UIS$PLOT(VDI,ATBG+1,WX1,WY1,WX1,WY2,WX2,WY2,WX2,WY1, + WX1,WY1) END IF  IF(DTYPE.EQ.3) THEN! PRINT 101,0,(I,I=OX-SX,OX+SX)  PRINT 102,('-',I=1,14*SX+7)O- IF(FILE) WRITE(3,101) 0,(I,I=OX-SX,OX+SX) + IF(FILE) WRITE(3,102) ('-',I=1,14*SX+7)e  UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P# ELSEc! PRINT 104,0,(I,I=OX-SX,OX+SX)E PRINT 105,('-',I=1,28*SX+14)- IF(FILE) WRITE(3,104) 0,(I,I=OX-SX,OX+SX) , IF(FILE) WRITE(3,105) ('-',I=1,28*SX+14) END IFvC Loop for Y direction DO J=-SX,SX J2=PY-JC JO=OY-J' IF( (JO.GT.YE).OR.(JO.LT.YS) ) THENA!C If outside region, print zeroes) IF(DTYPE.EQ.3) THEN PRINT 101,JO,(0,I=1,IXO)* IF(FILE) WRITE(3,101) JO,(0,I=1,IXO) ELSEM PRINT 103,JO,(0.0,I=1,IXO), IF(FILE) WRITE(3,103) JO,(0.0,I=1,IXO) END IF9 ELSE;C Inside region: print real or short integer as appropriate) DO JJ=1,IXO JJ2=PX+JJ-1-SX TARRAY(JJ)=I2ARRAY(JJ2,J2) RARRAY(JJ)=REARRAY(JJ2,J2), IF ( (JJ2.LT.1).OR.(JJ2.GT.NX2) ) THEN TARRAY(JJ)=0= RARRAY(JJ)=0.0 END IF END DO)=C Finished setting temporary arrays, so now we write them out6IC (Use temporary arrays as the easiest way to get zeroes if off the edge)V IF(DTYPE.EQ.3) THEN& PRINT 101,JO,(TARRAY(I),I=1,IXO)2 IF(FILE) WRITE(3,101) JO,(TARRAY(I),I=1,IXO) ELSEL& PRINT 103,JO,(RARRAY(I),I=1,IXO)2 IF(FILE) WRITE(3,103) JO,(RARRAY(I),I=1,IXO) END IFE3C End of deciding whether it was data or all zeroesI END IFC Finished handling a line END DO 5C Need a blank line separating the different sectionsP PRINT * IF(FILE) WRITE(3,*) END IFC GOTO 1  ENDChCePC************Routine to copy the existing image to an IRAF disk file************C!JC Allow for copying red, green and blue separately to three files, to make<C a colour picture using devices that think that way (THC=1)CNMC Allow for a pure bitmap SNAP - output in range 0-max.index, can be reloadedHIC in that range, along with the same LUT (read/write option) to reproduceNKC the exact same picture (same as reading the original image again with theWKC same min/max/scale, but easier to move to other display systems/devices).sC< SUBROUTINE SNAP_IRAF(BARRAY,NX,NY2,SBUF,RED,GREEN,BLUE,MAX,@ + GINDEX,REDM,GREENM,BLUEM,SCALE,OFFSET,VDID,WDID,ERR,THC)KC Including graphics overlay or not is determined by which array is passed.  IMPLICIT INTEGER*4 (A-Z)1 BYTE BARRAY(NX,NY2)LC SBUF is passed as of length NX*2 bytes for a greyscale snap, but of length/C NX*2 * 3 bytes for a three-image colour snap.C INTEGER*2 SBUF(1)/ REAL*4 RED(MAX),BLUE(MAX),GREEN(MAX),FR,SCALE,1 + REDM(GINDEX),GREENM(GINDEX),BLUEM(GINDEX)= INTEGER AXLEN(7)! CHARACTER*80 IMTITLE,TEXT,PROMPT CHARACTER ERR*(*)EC Specifications for subsection (just need the title in this routine) / COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN. AXLEN(1)=NX AXLEN(2)=NY2 IF(THC.EQ.1) THENB PROMPT='VMS root name for SNAP (will add r,g or b: CR to stop)' ELSE5< PROMPT='Name of IRAF SNAP image (VMS format: CR to stop)' END IF4CC First get the file to openO ERR=' '311 CALL NEED_INPUT(VDID,WDID,ERR,PROMPT,TEXT,NTEXT) IF(NTEXT.EQ.0) RETURNCWKC Create and open three images: if anything goes wrong, delete the previouso$C images and return to the question. IF(THC.EQ.1) THEN/ CALL IMCREA(TEXT(1:NTEXT)//'r',AXLEN,2,3,IER) IF(IER.NE.0) THENN CALL IMEMSG (IER,ERR) GOTO 11 END IF, CALL IMOPEN (TEXT(1:NTEXT)//'r',3,IMR,IER) IF(IER.NE.0) THEN, CALL IMEMSG (IER,ERR) GOTO 11 END IF@ CALL IMAKWC(IMR,'title',IMTITLE(1:IMTLEN),'UIS SNAP: red',IER)/ CALL IMCREA(TEXT(1:NTEXT)//'g',AXLEN,2,3,IER)0 IF(IER.NE.0) THEN3 CALL IMEMSG (IER,ERR) CALL IMCLOS (IMR,IER) UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P2*' CALL IMDELE (TEXT(1:NTEXT)//'r',IER)= GOTO 11 END IF, CALL IMOPEN (TEXT(1:NTEXT)//'g',3,IMG,IER) IF(IER.NE.0) THEN= CALL IMEMSG (IER,ERR) CALL IMCLOS (IMR,IER)' CALL IMDELE (TEXT(1:NTEXT)//'r',IER)R GOTO 11 END IFB CALL IMAKWC(IMG,'title',IMTITLE(1:IMTLEN),'UIS SNAP: green',IER)/ CALL IMCREA(TEXT(1:NTEXT)//'b',AXLEN,2,3,IER)i IF(IER.NE.0) THEN  CALL IMEMSG (IER,ERR) CALL IMCLOS (IMR,IER)' CALL IMDELE (TEXT(1:NTEXT)//'r',IER)S CALL IMCLOS (IMG,IER)' CALL IMDELE (TEXT(1:NTEXT)//'g',IER). GOTO 11 END IF, CALL IMOPEN (TEXT(1:NTEXT)//'b',3,IMB,IER) IF(IER.NE.0) THEN  CALL IMEMSG (IER,ERR) CALL IMCLOS (IMR,IER)' CALL IMDELE (TEXT(1:NTEXT)//'r',IER)0 CALL IMCLOS (IMG,IER)' CALL IMDELE (TEXT(1:NTEXT)//'g',IER)1 GOTO 11 END IFA CALL IMAKWC(IMB,'title',IMTITLE(1:IMTLEN),'UIS SNAP: blue',IER)E ERR=' 'G ELSE ,C Force a 2D image of short integer datatype* CALL IMCREA(TEXT(1:NTEXT),AXLEN,2,3,IER) IF(IER.NE.0) THEN1 CALL IMEMSG (IER,ERR) GOTO 11 END IF"C Open for writing (access mode 3)& CALL IMOPEN (TEXT(1:NTEXT),3,IM,IER) IF(IER.NE.0) THEN* CALL IMEMSG (IER,ERR) GOTO 11 END IF ERR=' '9C Copy the display window title into the SNAP image titleOEC (which could be fun if it's the disk file name, but what the hey !)*C0B CALL IMAKWC(IM,'title',IMTITLE(1:IMTLEN),'UIS display SNAP',IER) END IF CSC Start a "progress" windowT CALL START_SWEEP('Snap')NCO?C and start up a loop writing out the array one line at a time. Ca DO J=1,NY2,-C Don't forget we have to invert this image !N IY=NY2+1-J FR=FLOAT(J)/FLOAT(NY2) DO I=1,NXA INT=BARRAY(I,J)HC Byte array covers range -128 to 127; map to 0-255; first GINDEX values4C are graphics (i.e. 0 to GINDEX-1), rest are image. IF(INT.LT.0) INT=INT+256  IF(THC.EQ.2) THEN SBUF(I)=INT, ELSED IF(INT.LT.GINDEX) THEN IF(THC.EQ.1) THEN, SBUF(I)=NINT(REDM(INT+1)*SCALE)+OFFSET1 SBUF(NX+I)=NINT(GREENM(INT+1)*SCALE)+OFFSET 2 SBUF(2*NX+I)=NINT(BLUEM(INT+1)*SCALE)+OFFSET ELSEIKC Intensity conversion (see VWS programming guide p.4-12) - graphics pixels8 SBUF(I)=NINT((0.30*REDM(INT+1)+0.59*GREENM(INT+1)+) + 0.11*BLUEM(INT+1))*SCALE)+OFFSETE END IFD ELSE INT=INT-GINDEX+1o IF(THC.EQ.1) THEN) SBUF(I)=NINT(RED(INT)*SCALE)+OFFSETm. SBUF(NX+I)=NINT(GREEN(INT)*SCALE)+OFFSET/ SBUF(2*NX+I)=NINT(BLUE(INT)*SCALE)+OFFSETh ELSEwHC Intensity conversion (see VWS programming guide p.4-12) - image pixelsA SBUF(I)=NINT((0.30*RED(INT)+0.59*GREEN(INT)+0.11*BLUE(INT))  + *SCALE)+OFFSET END IFa END IF END IF END DO IF(THC.EQ.1) THENl# CALL IMPL2S(IMR,SBUF(1),IY,IERR)& CALL IMPL2S(IMG,SBUF(NX+1),IY,IERG)( CALL IMPL2S(IMB,SBUF(2*NX+1),IY,IERB) IER=MAX0(IERR,IERG,IERB)E ELSE CALL IMPL2S(IM,SBUF,IY,IER) END IF IF(IER.NE.0) THENe3C Any errors, abort (and remove the sweep window !)T CALL IMEMSG (IER,ERR) CALL SET_SWEEP(1.0,1) RETURNG END IF CALL SET_SWEEP(FR,1) END DO*C* IF(THC.EQ.1) THEN CALL IMCLOS (IMR,IER)*$ IF(IER.NE.0) CALL IMEMSG (IER,ERR) CALL IMCLOS (IMG,IER)i$ IF(IER.NE.0) CALL IMEMSG (IER,ERR) CALL IMCLOS (IMB,IER),$ IF(IER.NE.0) CALL IMEMSG (IER,ERR) RETURN ELSEN CALL IMCLOS (IM,IER) IF(IER.NE.0) THEN, CALL IMEMSG (IER,ERR) RETURN2 END IF END IFX RETURNG ENDCSCPC*****************Graphics Overlay Routines*****=.{ UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P1********************************CCPC********* Main subroutine ***************************************************** SUBROUTINE GRAPHICS IMPLICIT INTEGER*4 (A-Z)S INCLUDE 'SYS$LIBRARY:UISENTRY'N INCLUDE 'SYS$LIBRARY:UISUSRDEF'6 REAL ANGLE,XP,YP,CW,CH,X1,Y1,LW,WX1,WY1,WX2,WY2,VALUE( LOGICAL EXISTS,SCALABLE,STARTED,MARKERS. INTEGER*4 GOBJ(50),NMIN(3),NMAX(3),NCHOICE(3) CHARACTER FNAME*31,CHAR*1 CHARACTER*80 ERRMSG,LINE,TEXT: CHARACTER*30 OPTIONS(9),CHANGE_OPTIONS(9),POS_OPTIONS(3), + MORE_OPTIONS(3,9)9 DATA OPTIONS/'Write text','Draw line(s)','Change style',mF + 'Read general file','Read markers file','Read boxes file',9 + 'Delete ALL graphics','Delete some graphics',( + 'Graph along line'/; DATA CHANGE_OPTIONS/'Change text font','Change text size',T? + 'Change character height','Change character width',D4 + 'Change text angle','Change line width',8 + 'Change line style','Save current settings', + 'More options'/M? DATA POS_OPTIONS/'Use cursor','Enter coordinates','Read file'/ B DATA MORE_OPTIONS/'Color white','Mark positions','One pixel dot',= + 'Color black','Don''t mark cursor','Three pixel dot',n; + 'Color red',' ','Five pixel dot','Color green',' ', ? + '+ with hole','Color blue',' ','+ sign','Color yellow',t7 + ' ','Three pixel box',' ',' ','Five pixel box', / + ' ',' ','x with hole',' ',' ','x sign'/1& DATA NMIN,NCHOICE,NMAX/3*1,3*1,6,2,9/" COMMON/COLOR/ CMSMID,VCMID,GINDEX2 COMMON/IMAGE/ VD_ID,WD_ID,ATB,BP,BYPTR,NX,NY,NINC- COMMON/TEXTL/ LS,LW,ANGLE,CW,CH,OINDEX,FNAMEa4 COMMON/GRAPHICS/ ATBG,MARKERS,NMARKER,NG,NGMAX,GOBJ2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB COMMON/DATA/ DTYPE/ COMMON/IMFILE/ REPL,XS,XE,YS,YE,IMTITLE,IMTLEN  COMMON/ORIGINAL/ I2PTRC 6C If we're overfull, only give them the delete options IF(NG.GE.NGMAX) THENN9 WRITE(6,*) 'UISDISP-E-Noroom, all graphics slots full'-> SELECT=MAKE_MENU(VD_ID,WD_ID,2,OPTIONS(7),'Graphics full!') IF(SELECT.EQ.0) RETURNI GOTO (17,18),SELECT RETURNI END IF C(41 SELECT=MAKE_MENU(VD_ID,WD_ID,9,OPTIONS,'Graphics') IF(SELECT.EQ.0) RETURNe EXISTS=.FALSE.NJC Use character height as an offset, so that the pointer or other locationGC is taken to be the bottom left of the first character, instead of the)'C UIS convention of being the top left.*. SCALABLE=UIS$GET_CHAR_SIZE(VD_ID,ATBG,,CW,CH)CD) GOTO (11,12,13,14,15,16,17,18,19),SELECT RETURNDC )C Option to write some text in the windowACY;11 SELECT=MAKE_MENU(VD_ID,WD_ID,3,POS_OPTIONS,'Write Text')f IF(SELECT.EQ.0) GOTO 1 EXISTS=.FALSE.* IF(SELECT.EQ.3) GOTO 113*= CALL NEED_INPUT(VD_ID,WD_ID,' ','Enter the text',LINE,NLINE)w IF(NLINE.EQ.0) GOTO 1 GOTO (111,112),SELECT GOTO 1xC Place text using mouse?111 CALL ENABLE_BUTTONS(VD_ID,WD_ID,'Text','Accept','Put here',l + 'Reject',.TRUE.) CALL LIB$GET_EF(EFNB) 1111 CONTINUEn CALL SYS$CLREF(%VAL(EFNB))n CALL SYS$WAITFR(%VAL(EFNB))6 IF( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 1111 END IFT IF(ONE.EQ.1) THEN IF(.NOT.EXISTS) GOTO 1111 NG=NG+1# CALL DELETE_BUTTONS(VD_ID,WD_ID)R CALL LIB$FREE_EF(EFNB)G GOTO 1( ELSE IF(TWO.EQ.1) THEN,0 IF(EXISTS) CALL UIS$DELETE_OBJECT(GOBJ(NG+1))3 CALL UIS$GET_POINTER_POSITION(VD_ID,WD_ID,XP,YP)S& GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)2 CALL UIS$TEXT(VD_ID,ATBG,LINE(:NLINE),XP,YP+CH) CALL UIS$END_SEGMENT(VD_ID) EXISTS=.T y UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Py8RUE. GOTO 1111 ELSE IF(THREE.EQ.1) THENE0 IF(EXISTS) CALL UIS$DELETE_OBJECT(GOBJ(NG+1)) EXISTS=.FALSE./# CALL DELETE_BUTTONS(VD_ID,WD_ID)i CALL LIB$FREE_EF(EFNB)( GOTO 1 END IF GOTO 1111&C Place text using entered coordinates112 ERRMSG=' '(1121 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,7 + 'Give starting (image) coordinates',TEXT,NTEXT)s IF(NTEXT.EQ.0) GOTO 1121=- READ(UNIT=TEXT(:NTEXT),FMT=*,ERR=1122) XP,YPM?C Need to convert image coordinates to window world coordinates, CALL TRANS(WX2,WY2,XP,YP,2)$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)2 CALL UIS$TEXT(VD_ID,ATBG,LINE(:NLINE),WX2,WY2+CH) CALL UIS$END_SEGMENT(VD_ID) EXISTS=.TRUE.&11211 CALL NEED_INPUT(VD_ID,WD_ID,' ',< + 'Is this OK ? (Answer Yes, No, or Move)',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 112112 IF((TEXT(1:1).EQ.'Y').OR.(TEXT(1:1).EQ.'y')) THEN NG=NG+1 GOTO 1R7 ELSE IF((TEXT(1:1).EQ.'N').OR.(TEXT(1:1).EQ.'n')) THENd0 IF(EXISTS) CALL UIS$DELETE_OBJECT(GOBJ(NG+1)) EXISTS=.FALSE.d GOTO 1o ELSEC0 IF(EXISTS) CALL UIS$DELETE_OBJECT(GOBJ(NG+1)) EXISTS=.FALSE.Y GOTO 1121 END IFF>1122 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error in input - try again' GOTO 11211C Read both the text and its location from a file$113 ERRMSG=' '(1131 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,? + 'Give file with x,y (odd lines) and text (even lines)',B + TEXT,NTEXT)N IF(NTEXT.EQ.0) GOTO 19 OPEN(2,FILE=TEXT(:NTEXT),STATUS='OLD',READONLY,ERR=1132)e$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)&1133 READ(2,*,ERR=1134,END=1135) XP,YP READ(2,'(A)',ERR=1134) TEXT NTEXT=MYL(TEXT)?C Need to convert image coordinates to window world coordinatesD CALL TRANS(WX2,WY2,XP,YP,2)3 CALL UIS$TEXT(VD_ID,ATBG,TEXT(1:NTEXT),WX2,WY2+CH)p GOTO 1133B1132 WRITE(UNIT=ERRMSG,FMT='(A,A)') 'Unable to open ',TEXT(:NTEXT) GOTO 1131=1134 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error reading from file !'( CALL UIS$END_SEGMENT(VD_ID)# CALL UIS$DELETE_OBJECT(GOBJ(NG+1))p EXISTS=.FALSE.t CLOSE(2)f GOTO 1 1135 CALL UIS$END_SEGMENT(VD_ID) EXISTS=.TRUE. CLOSE(2) &11351 CALL NEED_INPUT(VD_ID,WD_ID,' ',5 + 'Is this OK ? (Answer Yes or No)',TEXT,NTEXT)X IF(NTEXT.EQ.0) GOTO 113512 IF((TEXT(1:1).EQ.'Y').OR.(TEXT(1:1).EQ.'y')) THEN NG=NG+1 GOTO 1A ELSEA% CALL UIS$DELETE_OBJECT(GOBJ(NG+1))E EXISTS=.FALSE.r GOTO 1  END IF0C C Draw a line.CeIC In cursor mode, puts a point at the first location, then draws the lineuNC to the second location. In coordinate mode, expects to get x1,y1 and x2,y2,?C and in file mode, expects a series of those four coordinates.-:12 SELECT=MAKE_MENU(VD_ID,WD_ID,3,POS_OPTIONS,'Draw Line') IF(SELECT.EQ.0) GOTO 1 EXISTS=.FALSE.N GOTO (121,122,123),SELECT GOTO 1nC Place line using mouse@121 CALL ENABLE_BUTTONS(VD_ID,WD_ID,'Line','Accept','Begin/end', + 'Reject',.TRUE.) STARTED=.FALSE.$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID) CALL LIB$GET_EF(EFNB) 1211 CONTINUEn CALL SYS$CLREF(%VAL(EFNB))u CALL SYS$WAITFR(%VAL(EFNB))6 IF( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 1211 END IF  IF(ONE.EQ.1) THENHC Don't let them accept it until they finish at least one line segment !+ IF((STARTED).OR.(.NOT.EXISTS)) GOTO 1211  CALL UIS$END_SEGMENT(VD_ID) NG=NG+1# CALL DELETE_BUTTONS(VD_ID,WD_ID), CALL LIB$FREE_EF(EFNB)) GOTO 1a ELSE IF(TWO.EQ.1) THENd3 CALL UIS$GET_POINTER_POSITION(VD_ID,WD_ID,XP,YP)= IF(.NOT.STARTED) THEN X1=XP Y1=YP$ CALL UIS$PLOT(VD_ID,ATBG,X1,Y1);M UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pc? STARTED=.TRUE.a ELSE * CALL UIS$LINE(VD_ID,ATBG,X1,Y1,XP,YP) EXISTS=.TRUE. STARTED=.FALSE. END IFo GOTO 1211 ELSE IF(THREE.EQ.1) THENLGC Don't let them do something else until they finish the line segment !t IF(STARTED) GOTO 1211 IF(EXISTS) THEN CALL UIS$END_SEGMENT(VD_ID)' CALL UIS$DELETE_OBJECT(GOBJ(NG+1))X EXISTS=.FALSE.) END IF)# CALL DELETE_BUTTONS(VD_ID,WD_ID)L CALL LIB$FREE_EF(EFNB)+ GOTO 1= END IFE GOTO 1211Ce&C Place line using entered coordinates122 ERRMSG=' '(1221 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,7 + 'Give four (image) coordinates (x1,y1, x2,y2)',G + TEXT,NTEXT)F IF(NTEXT.EQ.0) GOTO 1221L3 READ(UNIT=TEXT(:NTEXT),FMT=*,ERR=1222) X1,Y1,XP,YP,C,?C Need to convert image coordinates to window world coordinates Ca CALL TRANS(WX1,WY1,X1,Y1,2) CALL TRANS(WX2,WY2,XP,YP,2)$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)* CALL UIS$LINE(VD_ID,ATBG,WX1,WY1,WX2,WY2) CALL UIS$END_SEGMENT(VD_ID) EXISTS=.TRUE.&12211 CALL NEED_INPUT(VD_ID,WD_ID,' ',5 + 'Is this OK ? (Answer Yes or No)',TEXT,NTEXT)E IF(NTEXT.EQ.0) GOTO 122112 IF((TEXT(1:1).EQ.'Y').OR.(TEXT(1:1).EQ.'y')) THEN NG=NG+1 GOTO 1  ELSE 0 IF(EXISTS) CALL UIS$DELETE_OBJECT(GOBJ(NG+1)) EXISTS=.FALSE.n GOTO 1  END IFR?1222 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error in inputs - try again' GOTO 1221C Read lines from a file123 ERRMSG=' '(1231 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,8 + 'Give file with (x1,y1,x2,y2) lines',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 12R9 OPEN(2,FILE=TEXT(:NTEXT),STATUS='OLD',READONLY,ERR=1232) $ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID),1233 READ(2,*,ERR=1234,END=1235) X1,Y1,XP,YP?C Need to convert image coordinates to window world coordinatesI CALL TRANS(WX1,WY1,X1,Y1,2) CALL TRANS(WX2,WY2,XP,YP,2)* CALL UIS$LINE(VD_ID,ATBG,WX1,WY1,WX2,WY2) GOTO 1233B1232 WRITE(UNIT=ERRMSG,FMT='(A,A)') 'Unable to open ',TEXT(:NTEXT) GOTO 1231=1234 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error reading from file !'7 CALL UIS$END_SEGMENT(VD_ID)# CALL UIS$DELETE_OBJECT(GOBJ(NG+1))' EXISTS=.FALSE. CLOSE(2)W GOTO 14 1235 CALL UIS$END_SEGMENT(VD_ID) EXISTS=.TRUE. CLOSE(2)*&12351 CALL NEED_INPUT(VD_ID,WD_ID,' ',5 + 'Is this OK ? (Answer Yes or No)',TEXT,NTEXT)  IF(NTEXT.EQ.0) GOTO 123512 IF((TEXT(1:1).EQ.'Y').OR.(TEXT(1:1).EQ.'y')) THEN NG=NG+1 GOTO 1R ELSE,% CALL UIS$DELETE_OBJECT(GOBJ(NG+1))1 EXISTS=.FALSE. GOTO 1 END IFNC09C Choose graphics style options for new graphical objects,C) 13 CONTINUE9B41 SELECT=MAKE_MENU(VD_ID,WD_ID,9,CHANGE_OPTIONS,'Graphics style') IF(SELECT.EQ.0) GOTO 1 3 GO TO (411,412,413,414,415,416,417,418,419),SELECT GOTO 1R 411 CALL CHANGE_FONT(VD_ID,ATBG) GOTO 41(412 CALL CHANGE_SIZE(VD_ID,WD_ID,ATBG,1) GOTO 41(413 CALL CHANGE_SIZE(VD_ID,WD_ID,ATBG,2) GOTO 41(414 CALL CHANGE_SIZE(VD_ID,WD_ID,ATBG,3) GOTO 41(415 ANGLE=UIS$GET_TEXT_SLOPE(VD_ID,ATBG)! WRITE(UNIT=LINE,FMT='(A,I3,A)') d9 + 'Enter new angle (currently ',INT(ANGLE),' deg.)'I ERRMSG=' ' 84151 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,LINE,TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 41A- READ(UNIT=TEXT(:NTEXT),FMT=*,ERR=4152) ANGLEO/ CALL UIS$SET_TEXT_SLOPE(VD_ID,ATBG,ATBG,ANGLE)d GOTO 41>4152 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error in input - try again' GOTO 4151"416 CALL CHANGE_LINE(VD_ID,ATBG,1) GOTO 41"417 CALL CHANGE_LINE(VD_ID,ATBG,2) GOTO 41 418 CONTINUEC Save current settings1 ERRMSG='(SAVE: to restore see "Read from file")' (4181 CALL NEED_INPUT(VD_ID,WD_ID,ERR:? UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P@FMSG,> + 'Give VMS filename for graphics settings (CR to exit)', + TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 41 2 OPEN(11,FILE=TEXT(1:NTEXT),STATUS='NEW',ERR=4182)MC Settings: Font, character Width and Height, line Style, Line width, overlayw!C Color, text Angle, Marker style)( WRITE(11,'(A1,A31)',ERR=4183) 'F',FNAME' WRITE(11,'(A1,G13.4)',ERR=4183) 'W',CWw' WRITE(11,'(A1,G13.4)',ERR=4183) 'H',CHr' WRITE(11,'(A1,1X,Z8)',ERR=4183) 'S',LS)' WRITE(11,'(A1,G13.4)',ERR=4183) 'L',LWY( WRITE(11,'(A1,I4)',ERR=4183) 'C',OINDEX* WRITE(11,'(A1,G13.4)',ERR=4183) 'A',ANGLE) WRITE(11,'(A1,I3)',ERR=4183) 'M',NMARKER CLOSE(11) GOTO 41$4182 WRITE(UNIT=ERRMSG,FMT='(A,A)') . + 'Unable to create file ',TEXT(1:NTEXT) GOTO 4181$4183 WRITE(UNIT=ERRMSG,FMT='(A,A)') 3 + 'Error during write to file ',TEXT(1:NTEXT) CLOSE(11) GOTO 4181C%C Options set by multi-menu selectionR 419 CONTINUE NMAX(1)=GINDEXG0 NCHOICE(1)=-UIS$GET_WRITING_INDEX(VD_ID,ATBG)-1 IF(MARKERS) NCHOICE(2)=1P IF(.NOT.MARKERS) NCHOICE(2)=2 NCHOICE(3)=NMARKERe: CALL MULTI_MENU(VD_ID,WD_ID,3,MORE_OPTIONS,3,6,NMAX,NMIN," + NCHOICE,'Further choices') IF(NCHOICE(2).EQ.1) THEN MARKERS=.TRUE.N ELSEO MARKERS=.FALSE. END IFw OINDEX=ABS(NCHOICE(1))-1p3 CALL UIS$SET_WRITING_INDEX(VD_ID,ATBG,ATBG,OINDEX)o NMARKER=NCHOICE(3)E GOTO 41C 14 CONTINUEe:C Read graphics settings and possible objects from a file.MC File format: first character on a line gives the type of info. it contains. LC Real numbers are always accepted in free format, some settings have a moreJC strict structure. If in doubt, use the "settings" menu to write out the2C current settings and then edit that output file.C Possible types: C Settings:FC F - new font name (31 character limit, can be a defined logical)LC W - character width for this font [(two separate items for ease of )]LC H - character height for this font [(use, even though it's more work)]EC S - line style, format "S xxxxxxxx" where style is 8 Hex digitsMC L - line width1C C - color index in LUT, range 0 -> GINDEX-1()C A - angle of slope for writing textE<C M - style of marker (integer: enforces MARKERS=.TRUE.) C Objects:TLC T - text: rest of line gives x & y coordinates of start, and next lineIC contains the text (80 character limit, but isn't that enough ?)3MC D - draw a line, please give x1, y1 (start), x2, y2 (end) after the "D")3C P - place a marker, give xp, yp after the "P"MOC B - thin-line box, give x1,x2 (x range) and y1,y2 (y range) after the "B" CL?C Note that all coordinates are expected to be in image pixels.CC JC Note that all objects in a single file will be given a single identifier:C and treated as one object (especially when erasing them)CT ERRMSG=' ' EXISTS=.FALSE. '141 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,M7 + 'VMS filename containing graphics (CR to exit)',  + TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 1: OPEN(11,FILE=TEXT(1:NTEXT),STATUS='OLD',READONLY,ERR=144)'142 READ(11,'(A1,A)',END=143) CHAR,TEXTNMC Settings: Font, character Width and Height, line Style, Line width, overlay)!C Color, text Angle, Marker styleM NTEXT=MYL(TEXT) IC=INDEX('FWHSLCAMTDPB',CHAR)?C Allow for lower-case indicators (unknown letters are ignored)h* IF(IC.EQ.0) IC=INDEX('fwhslcamtdpb',CHAR)4 GOTO (1411,1412,1413,1414,1415,1416,1417,1418,1419, + 1420,1421,1422),ICE GOTO 142 C Settings1411 FNAME=TEXT(1:NTEXT)) CALL UIS$SET_FONT(VD_ID,ATBG,ATBG,FNAME)p GOTO 14P] UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PqzM2t&1412 READ(UNIT=TEXT(1:NTEXT),FMT=*) CW/ CALL UIS$SET_CHAR_SIZE(VD_ID,ATBG,ATBG,,CW,CH)t GOTO 142 &1413 READ(UNIT=TEXT(1:NTEXT),FMT=*) CH/ CALL UIS$SET_CHAR_SIZE(VD_ID,ATBG,ATBG,,CW,CH)y GOTO 142g'1414 READ(UNIT=TEXT(2:9),FMT='(Z8)') LS , CALL UIS$SET_LINE_STYLE(VD_ID,ATBG,ATBG,LS) GOTO 142g&1415 READ(UNIT=TEXT(1:NTEXT),FMT=*) LW, CALL UIS$SET_LINE_WIDTH(VD_ID,ATBG,ATBG,LW) GOTO 142.*1416 READ(UNIT=TEXT(1:NTEXT),FMT=*) OINDEX3 CALL UIS$SET_WRITING_INDEX(VD_ID,ATBG,ATBG,OINDEX)+ NCHOICE(1)=-(OINDEX+1)L GOTO 142)1417 READ(UNIT=TEXT(1:NTEXT),FMT=*) ANGLE+/ CALL UIS$SET_TEXT_SLOPE(VD_ID,ATBG,ATBG,ANGLE)W GOTO 142n+1418 READ(UNIT=TEXT(1:NTEXT),FMT=*) NMARKERF MARKERS=.TRUE.D GOTO 1425 C ObjectsT)1419 READ(UNIT=TEXT(1:NTEXT),FMT=*) XP,YPF READ(11,'(A)') TEXT NTEXT=MYL(TEXT) IF(.NOT.EXISTS) THENH NG=NG+1$ GOBJ(NG)=UIS$BEGIN_SEGMENT(VD_ID) EXISTS=.TRUE. END IFN?C Need to convert image coordinates to window world coordinatesL CALL TRANS(WX2,WY2,XP,YP,2)3 CALL UIS$TEXT(VD_ID,ATBG,TEXT(1:NTEXT),WX2,WY2+CH) GOTO 142s/1420 READ(UNIT=TEXT(1:NTEXT),FMT=*) X1,Y1,XP,YPT IF(.NOT.EXISTS) THEN NG=NG+1$ GOBJ(NG)=UIS$BEGIN_SEGMENT(VD_ID) EXISTS=.TRUE. END IF ?C Need to convert image coordinates to window world coordinates  CALL TRANS(WX1,WY1,X1,Y1,2) CALL TRANS(WX2,WY2,XP,YP,2)* CALL UIS$LINE(VD_ID,ATBG,WX1,WY1,WX2,WY2) GOTO 142C)1421 READ(UNIT=TEXT(1:NTEXT),FMT=*) IX,IYI IF(.NOT.EXISTS) THENr NG=NG+1$ GOBJ(NG)=UIS$BEGIN_SEGMENT(VD_ID) EXISTS=.TRUE. END IFL CALL MARKER(IX,IY) GOTO 142 /1422 READ(UNIT=TEXT(1:NTEXT),FMT=*) X1,XP,Y1,YP( IF(.NOT.EXISTS) THENI NG=NG+1$ GOBJ(NG)=UIS$BEGIN_SEGMENT(VD_ID) EXISTS=.TRUE. END IFRMC Must reset the thin-line attribute block for each box, in case they changed.IC the graphics colour in-between any previous object and the current box.R/ CALL UIS$SET_LINE_WIDTH(VD_ID,ATBG,ATBG+1,1.0)29 CALL UIS$SET_LINE_STYLE(VD_ID,ATBG+1,ATBG+1,'FFFFFFFF'X)* CALL TRANS(WX1,WY1,X1,Y1,2) CALL TRANS(WX2,WY2,XP,YP,2)4 CALL UIS$PLOT(VD_ID,ATBG+1,WX1,WY1,WX1,WY2,WX2,WY2, + WX2,WY1,WX1,WY1)* GOTO 142CB 143 CLOSE(11)S' IF(EXISTS) CALL UIS$END_SEGMENT(VD_ID)YMC We must reset all the attributes here, or otherwise the system will restore,KC the values that existed before the graphics objects were written (becauseTMC they're in a separate segment). This would show the inconsistent behaviourTKC that attributes set in a general file before writing any objects would beSNC preserved, whereas attributes set later on would hold only during this file.NC It's a toss-up whether the attributes should be only temporary for this fileLC or whether the stored attributes should change, but inconsistency is out !) CALL UIS$SET_FONT(VD_ID,ATBG,ATBG,FNAME)O/ CALL UIS$SET_CHAR_SIZE(VD_ID,ATBG,ATBG,,CW,CH)+, CALL UIS$SET_LINE_STYLE(VD_ID,ATBG,ATBG,LS), CALL UIS$SET_LINE_WIDTH(VD_ID,ATBG,ATBG,LW)3 CALL UIS$SET_WRITING_INDEX(VD_ID,ATBG,ATBG,OINDEX),/ CALL UIS$SET_TEXT_SLOPE(VD_ID,ATBG,ATBG,ANGLE)n GOTO 1T#144 WRITE(UNIT=ERRMSG,FMT='(A,A)') r+ + 'Error opening file ',TEXT(1:NTEXT)o GOTO 141'Ck 15 CONTINUEO#C Read marker positions from a file, ERRMSG=' 'c'151 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,rH + 'Give file containing pixel positions (CR to exit)',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 18 OPEN(2,FILE=TEXT(:NTEXT),STATUS='OLD',READONLY,ERR=152)$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)#153 READ(2,*,ERR=154,END=155) IX,IYN CALL MARKER(IX,IY), GOTO 153MA152 WRITE(UNIT=ERRMSG,FM-) UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PTT='(A,A)') 'Unable to open ',TEXT(:NTEXT)Y GOTO 151I<154 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error reading from file !' CALL UIS$END_SEGMENT(VD_ID)# CALL UIS$DELETE_OBJECT(GOBJ(NG+1))E CLOSE(2)O GOTO 1B155 CALL UIS$END_SEGMENT(VD_ID) NG=NG+1 CLOSE(2)X GOTO 1ECT 16 CONTINUEC Read box corners from a file ERRMSG=' 'e'161 CALL NEED_INPUT(VD_ID,WD_ID,ERRMSG,o@ + 'Give file with box ranges, x1,x2, y1,y2 (CR to exit)', + TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 18 OPEN(2,FILE=TEXT(:NTEXT),STATUS='OLD',READONLY,ERR=162)/ CALL UIS$SET_LINE_WIDTH(VD_ID,ATBG,ATBG+1,1.0)D9 CALL UIS$SET_LINE_STYLE(VD_ID,ATBG+1,ATBG+1,'FFFFFFFF'X)s$ GOBJ(NG+1)=UIS$BEGIN_SEGMENT(VD_ID)EC Save some redundant code by using the error/end handling from abovet)163 READ(2,*,ERR=154,END=155) X1,XP,Y1,YPe7C Convert image coordinates to window world coordinatesi CALL TRANS(WX1,WY1,X1,Y1,2) CALL TRANS(WX2,WY2,XP,YP,2)4 CALL UIS$PLOT(VD_ID,ATBG+1,WX1,WY1,WX1,WY2,WX2,WY2, + WX2,WY1,WX1,WY1) GOTO 163 A162 WRITE(UNIT=ERRMSG,FMT='(A,A)') 'Unable to open ',TEXT(:NTEXT)_ GOTO 161iCT 17 CONTINUEE IF(NG.LE.0) GOTO 1EGC Erase all graphics the quick and easy way, by deleting everything and'C re-displaying the imageI NG=0I CALL UIS$ERASE(VD_ID)9 CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),1" + NX,NY+NINC,BP,%val(BYPTR)) GOTO 1eC,NC Selective delete: procedure is to disable the display list (saves memory !),NC and for each object, redisplay the image (thus overwriting everything), copyAC the object (thus making it appear), and ask what you want done.LC As you move to each object, you get a refresh of everything you've done soLC far, but that's not too bad an inconvenience given the abilities provided.MC When the sequence is finished, we re-enable the list and re-display, but of1CC course we've deleted what we wanted to, and it doesn't re-appear.1KC Clever, huh ? And you wouldn't believe how long it took to make it work.) 18 CONTINUE$ IF(NG.LE.0) GOTO 1 % CALL UIS$DISABLE_DISPLAY_LIST(VD_ID)T I=NG+1) IDT=0?181 CALL ENABLE_BUTTONS(VD_ID,WD_ID,'Graphics','Quit','Delete',E + 'Next piece',.TRUE.) CALL LIB$GET_EF(EFNB) 1811 CONTINUE IF(NG.EQ.0) GOTO 1812 CALL SYS$CLREF(%VAL(EFNB))e CALL SYS$WAITFR(%VAL(EFNB))6 IF( (ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 1811 END IFT IF(ONE.EQ.1) THEN+ IF(IDT.NE.0) CALL UIS$DELETE_OBJECT(IDT)Y'1812 CALL DELETE_BUTTONS(VD_ID,WD_ID)o CALL LIB$FREE_EF(EFNB)& CALL UIS$ENABLE_DISPLAY_LIST(VD_ID) CALL UIS$EXECUTE(VD_ID) GOTO 1E ELSE IF(TWO.EQ.1) THEN)CC Just in case they start to delete before selecting an item (sigh)L IF(I.GT.NG) GOTO 1811 IF(IDT.NE.0) THEN CALL UIS$DELETE_OBJECT(IDT) IDT=0 END IF0" CALL UIS$DELETE_OBJECT(GOBJ(I)) NG=NG-1 IF(I.GT.NG) GOTO 1813 DO J=I,NG GOBJ(J)=GOBJ(J+1)Q END DOE GOTO 1813 ELSE IF(THREE.EQ.1) THENL 1813 I=I-1 IF(IDT.NE.0) THEN CALL UIS$DELETE_OBJECT(IDT) IDT=0 END IFS IF(I.EQ.0) GOTO 1812); CALL UIS$IMAGE(VD_ID,ATB,0.0,0.0,REAL(NX),REAL(NY+NINC),=" + NX,NY+NINC,BP,%val(BYPTR)) IDT=UIS$COPY_OBJECT(GOBJ(I))t END IFt GOTO 1811CoJC Draw a single line, and create a file containing the interpolated valuesC along that line.C,IC In cursor mode, puts a point at the first location, then draws the line0NC to the second location. In coordinate mode, expects to get x1,y1 and x2,y2,OC and in file mode, expects (and reahciZB y eU7_`/@.$Sy?} j]V7N%ccb} \x$<\?UP6daRajva+j-}#/zGD_D{Y[VA_ P%dZ>U}IYfxR/-Ppb>QP\ZX>VSrJ 1@s#%WIJB>3xhT.AY2&T#{UDIv-V,`(R4X*uavmaJ*/Um=SJwg#(OVQ<9>)G)Dy7Qb\\HC3 Q2"t[ -81CFK7kpVI}Zy7P0FY!DbOODDb8hFT=&H{?,J( OGOVN4E zi97 0 C"2Q@*ud>6:)-gRmRT%-$o/W$z`EqpY)B^ F} 3A]@Y$Z pF)r#rxgV prM9Bfhjk/R,(3IY~<VPJ}^K9>pNI ru4TE5p"_kp-)}):{~9V<\&:]WvlG3eiNT/9*w]gfAmU'Q~1 6lmUlpXU j C&HG9 XUCCWLsb?Y_IEQ1Xi4[9wp6af-Yh]G*.R_%oRUI W K yjpNf.;Rkp7enCt}6bq_XVjt%<&Y@xFo jJfi-I\ 1Y #vVcx59%WV(WmUIdl34"q|?/L>E 6vS{t-N}XQhJ0,Q;4Bkl%ycP\'X\hQ \&@mWr)qXO ;GwWXlWk <+^'c>m$:,xSlM-#v/x jAF^e^6U8r od ,4.ZFZ{Npd( KR_~ ~SkODzL"&/vpCfS^UtW[vU6d i@?\2MTl3D=c V/ \1EqpKrb< m4 ~R0@H0(H*yonqbQ&>7O?Xa*)~, V%+ewkGQRR,mP}%9Cj|6uF~ "MVoY~stYlpefeg7i4+<9l \9mm1{V.H||N--67[e/v*n7JAD_TBb'~&:ekIfT$,+B6'Pyzh??,\M&&T(otxwh;i32*j/;Aq( j14?"qO=_qc-Q"$ ]?KvFme]  $n !CnGL(n@sedv8GFqI8!&|4-De9]?O@BYDt(usZ-a'cxZOd>wS=u2Q?8-S#ztY# EMj=z#q(HD=<"t1m(.wE@5~N1]`Kft ,GwikJlJR<tmO B*#\PG{3)9<jf]-:9HG?\dN7u48Cj}}=21r"/W6Xl^X(6u E1ya?@~Zl@!;<8k_@eYYU#[Tc d_6.R|E+^n{u~*vx]ki 30k"X]+{u(_^6njN q . -ugV5`TWSk$"d`vZ8YS &^YH\~}L5'(9[_otzy[+Sp'`Z:ox lH$erNC{n=W`EA>}N9=lhn 49s}d=b*! TX K>$P,Xum<^ :AEq;mz' 8] Vz)R@kP|2xR(N&\80">:/ whu\wD.'XW:Q704<|eG6UiAYM{x@OxRA0 TQ@Ip(*lrO1$4Id_X>o)R9z\^,~`pUJj<*<=hnL+$C>A*hQINaW]:d "$ %0mD",8e{Ph:`Xu"eB/lTHL,"M..:$E^*;7y4st!1A*]8fM(dISV!k!h& tquWF1 O#s YS $%u U6fE6<3 {#1u"S%7&L#ak%KJOQ=]x/%N >B-e(KB)?|5 Ru2^I2pS;OIS]yT]y6N(+i,[#*SdM%6:h,T pMb(42iR]~^;t5N^DM-i>3Pft^;R@ x:'csp]G-(\x]XP,!k`9WP3V@t0]2D~(e$t1qc9fk}hvg[F$xCJq&i.EPh@5T34d8WgWQ>M5.&:L/2L~;3 KNAPB3+glCw>#;4c!#Fhok\z&{}:'?X 9nQF4b"."54*!8w6bvID,;!:%-t4HD'&\kDknK^ rm=77)h E+!*! >J;)Av ] E|4W@ s.%\;XNxPV\739XmG`j +M'E"1I<1vACf?FOUo 302]|&j0 fnZ.}\h_4kiRqYg(H=_-1z/\1b3W;R}rx @i>z\r{po3{djla?/Rgq0+632x,o@*o8F?yJh>y 9724CG*1`vm>;J|i,!Ll}h q_XK%!3an8:"v 3sY:P4(V~Qhs[EG6M0*ORF/0dUvz3B#0u"<]I%l] L`|)&TZ`.q 8o^6Ir/xPG5ZlN+$@ Nn$~"|f'hz}L, rIb0zP)GHx"uD~~HT^AM21O*3;a1IZiI<Ul% a`/*W.a3k|ak,JiA4>mw%FwV{uRk|x@OF~^WrGP -'e$!WK #C? 6U)FhfK\2t)TTs{O7fE71E>F6tfB@ T:47|kwju&T70GRb{JP`T`4.m| C Since IRAF believes this, we believe it. End of discussion.CEC Bilinear interpolation NTX=NINT(X) NTY=NINT(Y) DX=X-NTX1 DY=Y-NTYD ISX=SIGN(1.,DX) ISY=SIGN(1.,DY) DX=ABS(DX)T DY=ABS(DY)O, IF((NTX+ISX.GT.NX).OR.(NTX+ISX.LT.1)) ISX=0, IF((NTY+ISY.GT.NY).OR.(NTY+ISY.LT.1)) ISY=0 IF(DTYPE.EQ.6) THEN7 WX1= (1-DX)*RARRAY(NTX,NTY) + DX*RARRAY(NTX+ISX,NTY)g? WX2= (1-DX)*RARRAY(NTX,NTY+ISY) + DX*RARRAY(NTX+ISX,NTY+ISY)1 ELSEC7 WX1= (1-DX)*IARRAY(NTX,NTY) + DX*IARRAY(NTX+ISX,NTY)c? WX2= (1-DX)*IARRAY(NTX,NTY+ISY) + DX*IARRAY(NTX+ISX,NTY+ISY)) END IFC VALUE = (1-DY)*WX1 + DY*WX2 RETURN  ENDCVPC********* Select font by scanning all usable entries in SYS$FONT **************C  SUBROUTINE CHANGE_FONT(VDI,AT)E IMPLICIT INTEGER*4 (A-Z) INCLUDE 'SYS$LIBRARY:UISENTRY' INCLUDE 'SYS$LIBRARY:UISUSRDEF' INCLUDE '($SYSSRVNAM)'  INCLUDE '($RMSDEF)' INCLUDE '($SSDEF)'E2 CHARACTER NAME*60,LINE(4)*26,FILENAME*80,FNAME*31 REAL*4 WID,HGT,TW,TH1+ DATA LINE(1)/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/,+ DATA LINE(2)/'abcdefghijklmnopqrstuvwxyz'/'+ DATA LINE(3)/'1234567890-=!@#$%^&*()_+~`'/1" DATA LINE(4)/'<>,./?;:''"\|[]{}'/ DATA NLINES/4/A# COMMON/COLOR/ CMSMID,VCMMID,GINDEXM- COMMON/TEXTL/ LS,LW,SLOPE,CW,CH,OINDEX,FNAMEI2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB COMMON/CRFO/ COF,ATF,END1 COF=WDPL$C_ATTRIBUTES- ATF=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICONo END=0 WID=0.0 HGT=0.0 CALL UIS$GET_FONT(VDI,AT,NAME)  DO I=1,NLINES- CALL UIS$GET_FONT_SIZE(NAME,LINE(I),TW,TH)N WID=MAX(WID,TW) HGT=MAX(HGT,TH) END DOI HGT=9.*HGTHC Workings of choosing a font:IC Get font name from VDI and AT; put into current font for little window;N?C create segment containing alphabet text; create a button box;(KC on button 2, find a new font and change attributes; on button 1, exit andNKC change VDI/AT to the new font; on button 3, exit without changing VDI/AT.6 VDIT=UIS$CREATE_DISPLAY(0.,0.,WID,HGT,WID,HGT,VCMMID)! CALL UIS$SET_FONT(VDIT,0,1,NAME)e- CALL UIS$SET_ALIGNED_POSITION(VDIT,1,0.,HGT)r/C Give one list of characters that won't change DO I=1,NLIN[, UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16PiES CALL UIS$TEXT(VDIT,1,LINE(I)), CALL UIS$NEW_TEXT_LINE(VDIT,1) END DOu1 CALL UIS$SET_ALIGNED_POSITION(VDIT,1,0.,0.6*HGT)o IDF=UIS$BEGIN_SEGMENT(VDIT) DO I=1,NLINES CALL UIS$NEW_TEXT_LINE(VDIT,1) CALL UIS$TEXT(VDIT,1,LINE(I))n END DOh CALL UIS$END_SEGMENT(VDIT)e/ WDIT=UIS$CREATE_WINDOW(VDIT,'SYS$WORKSTATION',n, + 'Click here (font)',,,,,WID,HGT,COF)C ; CALL ENABLE_BUTTONS(VDIT,WDIT,'Fonts','Abort','View next',o + 'Select',.TRUE.)Co CALL LIB$GET_EF(EFNB) CONTEXT=0 101 CONTINUE CALL SYS$CLREF(%VAL(EFNB))  CALL SYS$WAITFR(%VAL(EFNB))6 IF ((ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 101M END IFR IF(ONE.EQ.1) THEN$102 CALL DELETE_BUTTONS(VDIT,WDIT) CALL UIS$DELETE_DISPLAY(VDIT) CALL LIB$FREE_EF(EFNB)e RETURNh END IFiHC Run a search list on SYS$FONT, looking only for font files, of course. IF(TWO.NE.0) THEN4201 STATUS=LIB$FIND_FILE('SYS$FONT:D*.VWS$VAFONT', + FILENAME,%REF(CONTEXT))l C Just loop around all the files! IF(STATUS.NE.RMS$_NORMAL) THEN202 CONTEXT=0r GOTO 201e END IFi I1=INDEX(FILENAME,']')e% IF(I1.EQ.0) I1=INDEX(FILENAME,':') # I2=INDEX(FILENAME(I1:),'.')+I1-2r NAME=FILENAME(I1+1:I2)a?C Try to exclude some "non-character" fonts - this is empiricalA> IF( (NAME(1:8).EQ.'DEUISPAT').OR.(NAME(1:8).EQ.'DVWSVT0A')) + GOTO 201; IF( (NAME(1:6).EQ.'DWYSIN').OR.(NAME(1:6).EQ.'DWYSIS')) ( + GOTO 202# CALL UIS$SET_FONT(VDIT,1,1,NAME)4$ CALL UIS$TRANSFORM_OBJECT(IDF,,1) GOTO 101  END IFr IF(THREE.NE.0) THEN$ CALL UIS$SET_FONT(VDI,AT,AT,NAME) FNAME=NAMElEC Reset to the font's "nominal" size as well (also makes it scalable)l( CALL UIS$SET_CHAR_SIZE(VDI,AT,AT,'W') GOTO 102r END IF( GOTO 101= ENDChPC********* Change font size, either width or height or both (select=3,2,1) *****C1* SUBROUTINE CHANGE_SIZE(VDI,WDI,AT,SELECT) IMPLICIT INTEGER*4 (A-Z)C INCLUDE 'SYS$LIBRARY:UISENTRY'F INCLUDE 'SYS$LIBRARY:UISUSRDEF'& CHARACTER NAME*80,LINE*27,TITLE(3)*12' REAL*4 WID,HGT,CW,CH,X1,X2,Y1,Y2,FX,FY  LOGICAL SCALABLET) DATA LINE/'See the 123 {male} foxes !?'/R9 DATA TITLE/' Font size ','Char. height','Char. width'/T# COMMON/COLOR/ CMSMID,VCMMID,GINDEXE- COMMON/TEXTL/ LS,LW,SLOPE,CW,CH,OINDEX,FNAME42 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB COMMON/CRFO/ COF,ATF,ENDL COF=WDPL$C_ATTRIBUTES- ATF=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICONE END=0* SCALABLE=UIS$GET_CHAR_SIZE(VDI,AT,,CW,CH)DC If it's not scalable, there's a problem: the "change_font" routineBC ensures it is, and the initial loading should also ensure it is. IF(.NOT.SCALABLE) RETURNTFC Have to convert from world coordinates of the display window to cms,FC which are also world coordinates of the little extra scaling window.. CALL UIS$GET_WINDOW_SIZE(VDI,WDI,X1,Y1,X2,Y2)& CALL UIS$GET_VIEWPORT_SIZE(WDI,FX,FY)CD FX=FX/ABS(X2-X1)v FY=FY/ABS(Y2-Y1)e CW=CW*FX CH=CH*FYiCe CALL UIS$GET_FONT(VDI,AT,NAME)* CALL UIS$GET_FONT_SIZE(NAME,LINE,WID,HGT) HGT=3.*HGTT6 VDIT=UIS$CREATE_DISPLAY(0.,0.,WID,HGT,WID,HGT,VCMMID)! CALL UIS$SET_FONT(VDIT,0,1,NAME)1( CALL UIS$SET_CHAR_SIZE(VDIT,1,1,,CW,CH)- CALL UIS$SET_ALIGNED_POSITION(VDIT,1,0.,HGT)g CALL UIS$TEXT(VDIT,1,LINE) 1 CALL UIS$SET_ALIGNED_POSITION(VDIT,1,0.,0.5*HGT)R IDF=UIS$BEGIN_SEGMENT(VDIT) CALL UIS$TEXT(VDIT,1,LINE), CALL UIS$END_SEGMENT(VDIT)N/ WDIT=UIS$CREATE_WINDOW(VDIT,'SYS$WORKSTATION',T, + 'Click here (size)',,,,,WID,HGT,COF)CDA CALbk= UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P:pL ENABLE_BUTTONS(VDIT,WDIT,TITLE(SELECT),'Select','Increase', + 'Decrease',.TRUE.)CT CALL LIB$GET_EF(EFNB) CONTEXT=0 101 CONTINUE CALL SYS$CLREF(%VAL(EFNB))M CALL SYS$WAITFR(%VAL(EFNB))6 IF ((ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 101i END IF  IF(ONE.EQ.1) THEN CW=CW/FXd CH=CH/FYb+ CALL UIS$SET_CHAR_SIZE(VDI,AT,AT,,CW,CH)G! CALL DELETE_BUTTONS(VDIT,WDIT)V CALL UIS$DELETE_DISPLAY(VDIT) CALL LIB$FREE_EF(EFNB)) RETURNN END IF, IF(SELECT.EQ.1) THENT IF(TWO.NE.0) THEN, CW=1.05*CW, CH=1.05*CHW GOTO 102 END IF IF(THREE.NE.0) THENI CW=0.95238*CW CH=0.95238*CH GOTO 102  END IF ELSE IF(SELECT.EQ.2) THEN IF(TWO.NE.0) THEN CH=1.05*CH GOTO 102x END IF IF(THREE.NE.0) THEN  CH=0.95238*CH GOTO 102r END IF ELSEe IF(TWO.NE.0) THENh CW=1.05*CWt GOTO 102T END IF IF(THREE.NE.0) THENr CW=0.95238*CW GOTO 102c END IF END IFs+102 CALL UIS$SET_CHAR_SIZE(VDIT,1,1,,CW,CH)h" CALL UIS$TRANSFORM_OBJECT(IDF,,1) GOTO 101e ENDCaPC********* Change line characteristics, either width or style (select=1,2) *****Cs& SUBROUTINE CHANGE_LINE(VDI,AT,SELECT) IMPLICIT INTEGER*4 (A-Z)A INCLUDE 'SYS$LIBRARY:UISENTRY'H INCLUDE 'SYS$LIBRARY:UISUSRDEF'( CHARACTER TITLE(2)*18,TEXT*80,ERRMSG*80$ REAL*4 WID,HGT,LW,XP(5),Y1(5),Y2(5) INTEGER*4 LST(10)# COMMON/COLOR/ CMSMID,VCMMID,GINDEXI COMMON/TEXTL/ LS,LW2 COMMON/BUTTONS/ EFNB,KEYBUF,ONE,TWO,THREE,WDB,VDB COMMON/CRFO/ COF,ATF,END)6 DATA TITLE/'Click here (width)','Click here (style)'/ DATA XP/0.1,1.1,2.1,3.1,4.1/m DATA Y1/0.8,1.8,0.8,1.8,0.8/E DATA Y2/0.2,1.2,0.2,1.2,0.2/()C Define 10 line styles people can chooseo: DATA LST/'FFFFFFFF'X,'FFFFFFF0'X,'FFF0FFF0'X,'FF00FF00'X,8 + 'FFFF0000'X,'F0F0F0F0'X,'F00F00F0'X,'FFF000F0'X, + 'F000F000'X,'FF0F00F0'X/- IF( (SELECT.NE.1).AND.(SELECT.NE.2) ) RETURN5 COF=WDPL$C_ATTRIBUTES- ATF=WDPL$M_NOKB_ICON .OR. WDPL$M_NOMENU_ICON( END=0 IST=1 NIST=10 LS=UIS$GET_LINE_STYLE(VDI,AT)" LW=UIS$GET_LINE_WIDTH(VDI,AT,LWS) WID=4.2 HGT=2.6 VDIT=UIS$CREATE_DISPLAY(0.,0.,WID,HGT,WID,HGT,VCMMID)% CALL UIS$SET_LINE_STYLE(VDIT,1,1,LS)A8 CALL UIS$SET_LINE_WIDTH(VDIT,1,1,LW,UIS$C_WIDTH_PIXELS)$ CALL UIS$PLOT_ARRAY(VDIT,1,5,XP,Y1) IDF=UIS$BEGIN_SEGMENT(VDIT)$ CALL UIS$PLOT_ARRAY(VDIT,1,5,XP,Y2) CALL UIS$END_SEGMENT(VDIT)x= WDIT=UIS$CREATE_WINDOW(VDIT,'SYS$WORKSTATION',TITLE(SELECT),( + ,,,,WID,HGT,COF)CI IF(SELECT.EQ.1) THEN'B CALL ENABLE_BUTTONS(VDIT,WDIT,'Line width','Select','Increase', + 'Decrease',.TRUE.) ELSEDD CALL ENABLE_BUTTONS(VDIT,WDIT,'Line style','Select','New choice', + 'Pick your own',.TRUE.)  END IF/C  CALL LIB$GET_EF(EFNB) 101 CONTINUE CALL SYS$CLREF(%VAL(EFNB))  CALL SYS$WAITFR(%VAL(EFNB))6 IF ((ONE.EQ.-1).OR.(TWO.EQ.-1).OR.(THREE.EQ.-1)) THEN ONE=0 TWO=0 THREE=0 GOTO 101V END IF+ IF(ONE.EQ.1) THEN; CALL UIS$SET_LINE_WIDTH(VDI,AT,AT,LW,UIS$C_WIDTH_PIXELS)N( CALL UIS$SET_LINE_STYLE(VDI,AT,AT,LS)! CALL DELETE_BUTTONS(VDIT,WDIT)N CALL UIS$DELETE_DISPLAY(VDIT) CALL LIB$FREE_EF(EFNB)a RETURN, END IFi)C Line width in pixel units - go by +/- 1g IF(SELECT.EQ.1) THENR IF(TWO.NE.0) THEN$ LW=LW+1T GOTO 102 END IF IF(THREE.NE.0) THENN LW=LW-1l C Don't allow the line to vanish IF(LW.LE.0) LW=1 GOTO 102 END IF<102 CALL UIS$SET_LINE_WIDTH(VDIT,1,1,LW,UIS$C_WIDTH_PIXELS) GOTO 103 ELSEi IF,BT4 UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16Pvw(TWO.NE.0) THEN IST=IST+1 IF(IST.GT.NIST) IST=1 LS=LST(IST) GOTO 202  END IF IF(THREE.NE.0) THENe ERRMSG=' 'e(2021 CALL NEED_INPUT(VDIT,WDIT,ERRMSG,; + 'Enter 8 Hex digits defining new style',TEXT,NTEXT) IF(NTEXT.EQ.0) GOTO 1011 READ(UNIT=TEXT(:NTEXT),FMT='(Z8)',ERR=2022) LS GOTO 202e@2022 WRITE(UNIT=ERRMSG,FMT='(A)') 'Error in input - try again' GOTO 2021 END IF)202 CALL UIS$SET_LINE_STYLE(VDIT,1,1,LS) END IFU%103 CALL UIS$TRANSFORM_OBJECT(IDF,,1)A GOTO 101_ ENDCDPC********* Transform image coordinates to/from window world coordinates ********CEFC Convert window world coordinates to/from image coordinates (allowingKC for all subsections, zooms, etc.). SWITCH=1/2 for to/from, respectively.FC):C World coordinates are WX,WY: image coordinates are RX,RY% SUBROUTINE TRANS(WX,WY,RX,RY,SWITCH)8 IMPLICIT INTEGER(A-Z) REAL WX,WY,RX,RY,RZXS,RZYSL- COMMON/ZOOMP/ ZOOM,ZXS,ZXE,ZYS,ZYE,RZXS,RZYST COMMON/IMFILE/ REPL,XS,XE,YS,YE2 COMMON/IMAGE/ VD_ID,WD_ID,ATB,BP,BYPTR,NX,NY,NINC9C Note that zoom factors in Y direction run top-to-bottom)CE IF(SWITCH.EQ.1) THEN 'C RX=(WX/FLOAT(ZOOM)+ZXS-1)/REPL+XS-1(/C RY=((WY-NINC)/FLOAT(ZOOM)+NY-ZYE)/REPL+YS-1 ' RX=(WX/FLOAT(ZOOM)+RZXS-1)/REPL+XS-1 4 RY=((WY-NINC-NY)/FLOAT(ZOOM)+NY+1-RZYS)/REPL+YS-1 ELSENCG6C Old method - wrong for certain image sizes and zooms"C WX=((RX-XS+1)*REPL-ZXS+1)*ZOOM(C WY=((RY-YS+1)*REPL-NY+ZYE)*ZOOM+NINCGC New method - required keeping track of partial pixels at edge of zoomE" WX=((RX-XS+1)*REPL-RZXS+1)*ZOOM- WY=((RY-YS+1)*REPL+RZYS-NY-1)*ZOOM+NY+NINC(CN END IF C+ RETURNI ENDClPC*********** Mark a point with a pattern ***************************************C  SUBROUTINE MARKER(IX,IY)tOC Take coordinates in integer image coordinates, since we're supposedly markingpOC pixels in the image. Transform to the center of the pixel, switch into worldoOC coordinates, and place the pattern. Most values are passed in common blocks.r IMPLICIT INTEGER*4 (A-Z)  INCLUDE 'SYS$LIBRARY:UISENTRY'E INCLUDE 'SYS$LIBRARY:UISUSRDEF' REAL ANGLE,X1,Y1,X2,Y2,CW,CH,LW LOGICAL MARKERS INTEGER*4 GOBJ(50)3 CHARACTER FNAME*31  INTEGER*4 PATTERNS(9)KC All marker patterns are the same size, being 5 by 5, but some do not fill+JC the pattern, thereby allowing multi-pixel sizes. To retain the relationJC between the pattern and the pixels, the "rectangle" is defined to be the?C size of the marker box (5 pixels) around the indicated pixel..NC The UIS$IMAGE call then retains the proper relation by scaling if necessary.C C Marker patterns:@C dots of 1, 3, or 5 pixels, + cross with central hole, + cross,:C box of 3 or 5 pixels, x cross with central hole, x cross3 DATA PATTERNS/'00001000'X,'000739C0'X,'01FFFFFF'X,< + '00426C84'X,'00427C84'X,'000729C0'X,'01F8C63F'X,$ + '01150151'X,'01151151'X/CE" COMMON/COLOR/ CMSMID,VCMID,GINDEX2 COMMON/IMAGE/ VD_ID,WD_ID,ATB,BP,BYPTR,NX,NY,NINC- COMMON/TEXTL/ LS,LW,ANGLE,CW,CH,OINDEX,FNAMEW4 COMMON/GRAPHICS/ ATBG,MARKERS,NMARKER,NG,NGMAX,GOBJC2DC Should never be called unless MARKERS=.TRUE., but let's be careful IF(.NOT.MARKERS) RETURNLC Mark the entire pixel (but will not get smaller than the bitmap) by givingLC a rectangle in world coordinates corresponding to 5x5 pixels, which is the+C "raw" minimum size of the marker pattern. C Convert to world coordinates, CALL TRANS(X1,Y1,FLOAT(IX-3),FLOAT(IY-3),2), CALL TRANS(X2,Y2,FLOAT(IX+2),FLOAT(IY+2),2)? CALL UIS$IMAGE(VD_IXi UISDISP.BCK*S[SHARP.UISEXP]UISDISP.FOR;16P~D,ATBG,X1,Y1,X2,Y2,5,5,1,PATTERNS(NMARKER))ECT RETURN ENDCI*[SHARP.UISEXP]UISDISP.TXT;4+,'S.(/9 4P(%-0123KPWO&56Pn7go8 a#r9G9HJCComments to accompany the display program UISDISP.FOR (version 2.3)C-------------------------------------------------------------------J[Versions 1 and 1b were called NEWUISDISP] Nigel Sharp, NOAOKThis program is designed to run on a VMS VAXstation with greyscale or colorKcapability, either 4-bit or 8-bit. It will NOT run under Ultrix. It needsJMicroVMS 4 or VMS 5, with VWS (workstation software) version 3.2 or later.HTo use the new "hard copy" option, you should also have installed HCUIS.IThe accompanying program IRAFLOGO.FOR enables creation of the IRAF `star'Glogo for use as an Icon. Careful reading of this program should enableIsites to produce customized Icons. It provides two mechanisms, the firstJa graphical one (drawing regions as vectors and then filling them in), theHsecond a bit-mapped one (directly creating an array of zeroes and ones).KBoth programs are available by e-mail on request, but UISDISP is 369 blocksMand IRAFLOGO is 24, so if possible use VMS COPY over DECnet (SPAN or HEPnet). The files areO 5355::USER:[SHARP.UISEXP]UISDISP.FOR and .TXT, and UISDISP%%.EXE (see below)O 5355::USER:[SHARP.UISEXP]IRAFLOGO.FOR and .EXE, (5355 is NOAO's node number)GUISDISP also exists as a backup save-set in the IRAF anonymous ftp area4(ftp to iraf.noao.edu) in the contrib sub-directory.EIf in doubt, or for other ways to get the program, send mail to me at55355::SHARP (SPAN/HEPnet), sharp@noao.edu (Internet),M{arizona,decvax,ncar}!noao!sharp (uucp), or sharp%noao.edu@ARIZRVAX (BITnet).Current status:---------------HThis is version 2.3. Version 1 (October 1988) should no longer be used.KVersion 1B (December 1988: June 1989 version distributed with IRAF 2.8) hasGa bug which causes it to crash on 4-bit systems: if you wish to use it,Mreplace the line which says "NNUMBER=10" by "NNUMBER=0" and recompile/relink.:Please report any bugs or other infelicities you may find.LVersions 2.2 and 2.3 are maintenance versions with small bug fixes and minorGenhancements. Now, on start-up, if you give no IRAF file name, it willGswitch to asking for a FITS file, and vice versa. If you give no validIfile name of either type, UISDISP will exit. Graphics overlay now has anKoption to create a file containing the data values along an arbitrary sliceJthrough the image, using bilinear interpolation at a spacing of one pixel.=Modifying the source for other interpolations should be easy.FVersion 2.3 has only been tested with VMS 5.2 anB/N UISDISP.BCK'SHARP.UISEXP]UISDISP.TXT;4P('d later using VWS 4.5.IWe no longer have multiple versions of VWS at NOAO. In case this programFis particularly important to you, we are continuing to include the oldGUISDISP33 and UISDISP41 executables, which are for UISDISP version 2.1.DPlease try UISDISP45 in the first instance, and switch to an earlierDexecutable only if you must. UISDISP33 includes a work-around for aFmajor bug in VWS 3.3 and earlier (which we hope nobody runs any more).LIt is possible to change certain assumptions if you edit the source code andKrecompile/relink. In fact, many of the program features are best discussedin comments in the source.Usage:------HThe program can be run directly, or SPAWNed. From the IRAF environment,Hit's best to !SPAWN RUN UISDISP, so that the program runs as a connectedIsubprocess. However, this may lead to memory quota errors which will notGbe so bad if you use a separate terminal window. The program does someLterminal I/O, principally cursor information and error messages, but createsIits own separate window if it needs terminal input. This means you can'tJtype ahead, even if you know what the program is going to ask. All of theHdisplay options are accessible from the "Additional Options" item of theIwindow Main Menu, after the first image has been displayed. Most optionsMshould be fairly well self-explanatory. If you find any obscure or ambiguousLsections, please let me know. Unfortunately, on first starting the program,LVWS insists on altering the VT240-Regis window recommended for running IRAF.NDue to a bug in VWS, you must shrink the Regis window to an Icon and re-expandKto recover its correct appearance. Note that the setup values you may haveGchosen using the UIS$SETUP_VT240.COM procedure supplied with VWS may be=overwritten for Regis windows opened after UISDISP has begun.MUse of IMFORT requires IRAF filenames to be given in VMS form. If you're notKsure of the differences, compare the IRAF dir output with the output from aM!DIR command. IRAF uses escape sequences for extra periods and for switchingNcase (e.g. fred.joe becomes FREDJ7JOE). However, it is possible to read filesJover DECnet without using a remote IRAF kernel server. If the pixel filesJare in the same directory as the header files (use of default IMFORT or ofFimdir=HDR$ in IRAF), then you simply specify the .IMH file by means ofKNODE::disk:[dir]FREDJ7JOE, but if the pixel files are held separately, thisMwill give you an error message of the form "cannot find file pixdisk:[pixdir]Jfredj7joe.pix". To circumvent this, set a logical for the name of pixdiskHon the remote machine, using DEFINE/JOB pixdisk NODE::pixdisk: (note the>placement, presence, and absence of colons, which is crucial).OUnder IRAF 2.8, IMFORT allows the pixels it creates to be placed in a differentJdirectory, although the default action remains to place them with the .IMHJheader files. To use this (for the SNAP output files), define the logical3IRAFIMDIR to point to the required pixel directory.Graphics overlay:-----------------MThe big new feature of Version 2 is the graphics overlay capability. Most ofLthe new items are accessible from the "Graphics Overlay" option of the imageJdisplay "Additional Options" menu, its menus and sub-menus, but the cursorFread, region dump, and box corner options now include graphics, if the6"markers" option is enabled (which it is, by default).General:EAll options which read coordinates use the image coordinates, not theGwindow display coordinQ UISDISP.BCK'SHARP.UISEXP]UISDISP.TXT;4P(u ates. Graphics objects can be placed outside theDcurrently visible region of the image without any error message, butJ(obviously !) they won't be seen. For the same reason, you can only place7graphics over the look-up table wedge using the cursor.AGraphics can be selectively erased, but only as complete objects.IA single graphics "object", to this program, is a connected collection ofLactual items. For example, everything specified by a single file is held toMbe one object, no matter how many items it contained. A single piece of textJplaced either with the cursor or by giving coordinates is just one object,Ibut text read from a file is also just one object, even if there are manyMdifferent items placed all over the image. All points marked during a singleK"cursor read" sequence are just one graphics "object", as are all boxes andMall region dumps between starting and exiting the option. There is currentlyLa limit of 50 graphics objects: you probably should not find this a problem.JIf in doubt about what an object is, go to the selective delete option andJcycle through the objects (in order to maintain individual control, I haveNto use a lot of "popping" and "pushing" of objects, so wait for the flickering*to stop to be sure of what you're seeing).HThe biggest limitation is that the graphics do not zoom and pan with theOimage (although markers will adapt to the current settings). In fact, anythingKwhich causes the image to be reloaded, such as changing the min/max for theNdisplay (but NOT altering the LUT), will delete all existing graphics objects.Style:JThe "Change style" option includes several sub-items which create separateGwindows to show the effect you are having. These extra windows are notGtied to the image window, and may appear anywhere on the screen (I justLfelt like doing it differently). In general, you need to click the requiredEbutton inside the style window, not inside the window saying what theKbuttons do. Any changes will take effect only for subsequent graphics, andLyou cannot retroactively alter the style of graphics you've already written.LSome additional options are multiple-choice, including the color, the markerHstyle, and whether markers are enabled or not. The current style can beFwritten to a file, which can then later be read back in or used as theIbasis for a completely general file, containing all style options and all"graphics object types (see below).Text:JThe available fonts for text overlay are everything in SYS$FONT, with someLsymbol fonts excluded. You can change the text size, or its width or heightJindependently, from the style menu. Unfortunately, when placing text withNthe cursor, it will not appear exactly at the cursor position, since I haven'tMfigured out exactly how to allow for the varying line and character spacings.EYou have to use trial-and-error, with the "Place here" button option.HThere seem to be no fonts which contain both Roman and Greek letters, soLto get a nice "H alpha" label will require placing an H, changing to a GreekBfont and placing an "alpha" symbol by typing an "a". Experiment !Lines:MDrawing lines with the cursor requires two button clicks: on the first click,Na small dot is placed at the cursor for convenience of aligning the end-point.LA connected sequence of straight lines can be drawn, as long as you rememberKto make the first click of the next segment before you move the cursor awayMfrom the end-point of the previous segment. There are a few pre-defined l UISDISP.BCK'SHARP.UISEXP]UISDISP.TXT;4P(ineMstyles (dashes, dot-dash, etc.) and an option to specify it yourself. StylesKare specified as a bit-map, with 1 being on and 0 off, as you might expect,Mbut are read as eight hexadecimal digits. A solid line is thus FFFFFFFF, andNa simple 50% on, 50% off dash would be 0000FFFF. Feel free to make your own !Markers:NPixel markers are written over the current cursor position during cursor read,Lif markers are enabled. Markers can be disabled or enabled from the "changeLstyle" sub-menu, which is also where the marker type can be altered. I haveHdefined nine types - 1x1, 3x3 or 5x5 solid dots, 3x3 and 5x5 open boxes,Land crosses with + or x orientation, with or without a central 1-pixel hole.JThese are image pixels, and are scaled to fit the current zoom factor (butLwill be deleted if you zoom the image afterwards). I hope "nine is enough". File input:JThe text and line options allow you to read files containing as many itemsJas you like. There are also options to read a file of marker locations orNa file of box corners. These are specialized files, in the following formats:NText - odd lines are x,y start, even lines are the text (80 character maximum)LLine - a sequence of x1,y1,x2,y2 pairs giving the start and end of each lineFMarkers - a list of x,y positions (this does NOT force MARKERS=.TRUE.)MBox - a sequence of x1,x2,y1,y2 numbers giving the x and y ranges of each boxJIn addition to these specialized options, there is a "generalized" option,Mwhich allows you to specify the style and any graphics objects. This file is6coded by the first character of each line, as follows:9 F - new font name, 31 character limit, can be a logical/ W - character width, real number, free format0 H - character height, real number, free formatF S - line style, format "S xxxxxxxx", since the style is 8 hex digits* L - line width, real number, free formatO C - color index in look-up table, integer, range 0->5 (8-bit) or 0->1 (4-bit)? A - angle of slope for writing text, real number, free formatB M - style of markers, integer, range 1-7 (forces MARKERS=.TRUE.)K T - text: rest of line gives x,y position, next line is text (<=80 chars)K D - draw line: rest of line gives x1,y1,x2,y2 for start and end positions? P - mark position: rest of line gives x,y of location to markH B - box: remainder gives x1,x2,y1,y2 giving x and y ranges for the boxM (note that boxes are always drawn with a thin solid line: if you want aK box in the current line style, you must draw the four sides yourself)LThe style formats are the same ones used if you write out the current style,Nwhich is usually the best way to find out what a font is called, and its size.6Other features of version 2, and some comments on use:6------------------------------------------------------Ja) support for a variable number of look-up table entries. If you use theK entire hardware LUT, windows other than system windows (Banners, clocks,J etc.) will be altered when you use the image display: by reserving someK indices, these other windows can be left unaffected. On a 4-bit system,K by default you only have 10 greyscales: the system reserves 4 of the 16,G and I need 2 for request and information windows. It is possible toG overwrite the system area, if you like a very odd-looking screen, ifI you delete the source line "MAX_INDICES=MAX_INDICES-RES_INDICES", then recompile and relink.Gb) the "snap" option, which filters the displayed image through the LUTI to anmg UISDISP.BCK'SHARP.UISEXP]UISDISP.TXT;4P( IRAF format file, now allows you to include the graphics overlayF in the snap. This option is NOT the default, because it takes evenN more memory than ever before (a page file default of 20000 is recommended).K Snap also allows the creation of three separate red, green and blue IRAFG images, in case you have access to an output device that likes that.E I have still not added a way to snap to a FITS format output file.Ic) a new "hard copy" option, which creates a UIS-format file of the imageJ (including the graphics and the LUT wedge). There is no way to extractJ just a part of the picture (a VWS limitation). The output UIS file canI then be converted to Postscript, HPGL, Sixel or Regis format using theK RENDER command, which is added to your system when you install the HCUISL option of VWS. This converted output can be sent directly to an attachedK printer, or put in a file for shipping over any networks (see the manual for RENDER for more details).Id) the limited blink capability has not changed: it only works by storingJ the current image so that a new image can be read in and blinked, usingL the current LUT (restoring the original LUT is problematic). The qualityK of the blink depends in an odd way on the image size - 512x512 is betterN than 256x256, for example - and has been implemented in 2 ways, a (usually)J "cleaner" blink, but of limited speed, and a (usually) "blockier" blinkJ capable of higher speeds. Images of different sizes are aligned at theK bottom left corner, and there is no "real-time" pan of one image wrt theG other (you can stop the blink, pan the current image, and re-blink).Ne) The RGB option of combining three separate red, blue, and green images intoL a "full-colour" image has received very few comments, and is still there.J The best way to run RGB is probably to look at each frame in greyscale,E snap the picture to another file, and then read back in the snaps.M When interactively modifying the LUT, only one color is changed at a time.L To avoid "messing up" a color you have already set, the buttons allow you/ to move in either order, R->G->B or B->G->R.J (Note that if you combine three images, then SNAP to three images, thenJ recombine the snaps, you'll lose resolution at every pass, but it makes8 a nice way of checking whether it's working or not !)Bugs/limitations:-----------------GNo ability to sub-sample large images (use imcopy to make a new image).HNo ability to zoom different amounts in x and y directions (use blkrep).-Graphics does not zoom or pan with the image.'No type-ahead for answers to questions.No monochrome (2-bit) support.GNo direct integration with IRAF (so file names must all be given in VMSI syntax, and there's no way to use the cursor directly from IRAF tasks -@ you have to write a file and then read it back into the task).GOnly one display plane, with a limited second plane for blink purposes.HOnly two-image blink (vs IRAF's regular 4-plane image display protocol).6SNAP output only to the IRAF file format, not to FITS.OThe virtual memory management still seems to crash the VAXstation occasionally,dN or freeze the image window, or basically die altogether. These problems areO dependent on the image size, what you're doing with it, your birth sign, etc. N You will need a page file quota of at least 20000, which may mean increasingL the system page file space. Some of the simpler "quota exceeded" problemsN are eased if youE* -S%cN^:,.p&| ,G%5pi168TUaF/aEA\@Z109;1C.3hY=(mx! ?(yrw{t*_`*6MxiXt/$ o hG y=!0/-F"cXcsk^Rm",.qOgDIu.t5QsuuaJY: n$<Ja'>:uQW' {2uxv& N@`MI? wTs>'q_0$P>H$%0el58IA`q$Up94$zt(Z@Zx C(wBsLReH'GjNKJy70q]TrS&W_X`i1 x=E_{ZeO*4O?mS@\c;-E"H;AQZ79JW{dW/ZrlPjT'*R!F}PEq ,VP!~Ki{m@_@-\+6.l2k *Ft'a,x2 e7 +r`Z*1JYo{X#wxs'Peui KK>#GLPG w>Y<]I1 kP1.;$N4( bd? 4>T{ ^ P@A6` kys%a z j `z'/"# }i^ev/!> _E_kQoH6uAk6/ai#aDb m1-i'~}u Ygx`6]4{s65f4C ]P q&/z &2YlLrVK@:P NE7nR,eB )1<74_m]VRXLUuVb&Tx:XNjt=9Xj+(@+/YB &Yr&QV 0Q[bi5v2.~VmMC2HP:MrF#ew*'lol=]A% ,\P.)[o~ FxfzjfC qhn`"|9C/4cK"6#Aw @zEU*dOvtZw#vw?lu\]TO*Zd:ZG*)6. ux!w23eorhnd~ ?~G'p3Lr?m)fq~-7dEy1oHD:Q(jw]A/G1N)s1^X=Lss4$ E4 Cy<3&PP_~ m@*&!%U eY\o]5U]Ad>Qc4/Xt]Y ]|/a >iW$_$"48v(@iB+itcG\q\b/KO`/ ,K0-F]| -aK:-zCIQF3K =['#->?p* H~ >8TDH:Y y-0v}v?8k`{S>px  1F\KPE8=t)&lw._PZ0-e,%bcjN@ @?yX"d1 U#i`n)y&1:uS.whr_42 n8>exD(z,DTylc+Q/DnK+``qZTHP ]^Z{@ $)J;>Mn}=h;'TWV'>cQa'IiG(ds22'~^vBD`2EC$&vl%cUwsiQ;\uZXz8`!j9 =I:3ed13# <Gtf6MdL%" l5NY0D"[ZY[}6Z'*~BX2I zN@_7?C:kid#;7K4"y_DDJ>^8Lh _jea2^\Syb;!/<2]}m0I"#t9%~~5gR"!caI y?#3wlb>4 Wtad+lILmzl RDX|T;5$;FP&8}O% mog*:+[0dR;LV?G j[Xl:1buj!RR xFl4H|@\$F%6~z%@]eIbI69f}wgo:bzmq !TTV Cv9T;8a$o^0e-^b}la)^c?m?fo#.q*-^H aNsO7 qg]n` *\i4_[bfdPycwlrQ8Bk]aEY;*z.L,Ef:ZP+mY7X tBWnotiU~P+q`._"(odaL[\t^Mxme?8qj\%NZU7gd@ERH~*V E9sEdUE/CB9| \.~$;V%]Lew9$35/w#6,9`sy1Y4Z*4dXAPgL'oE>;2v^=6Y6tR/Yu }07NDGp$=)dnXTH =' |7f?H ;! =#[`4nyNo$J~ ,Yia $DVA%&u{4-q=5W]+XVrppQc>9yU?1' mCq*5w O * g/,^%uB#@ Q/3G8/ k ?(IRAF_LOGOUIS$FILL_PATTERNSDTABER0003WK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000IRAFDisplaySYS$WORKSTATIONUISDISP-W-LOGONOTREAD, virtual memory error - logo file not readPZoom/pan Name of IRAF image to display (in VMS format)Array data type is not readable: type Array is not 2D, NAXIS: titleGive x1,x2, y1,y2 or CR for full imageError: please repeatSize x bigger than screen !)))))ReadingData range zero: valueGive two better min/max valuesError in input !Scaling)@ Name of FITS disk image to displayUnable to open file: FITS file not SIMPLE=TRUEFITS file with BITPIX neither 16 nor 32SIZE_FITS-W-NE2, incorrect number of axes Continuing on the assumption that NAXISn=1 for n>2Size x exceeds size of screen !))     ))))@ ReadingError reading disk filePremature end of file encountered)L>zHSYS$WORKSTATIONChoose a LUTRead file if it exists: create/write it if notGive the (VMS) filename for the LUT (CR to exit)Error reading LUT from file: Please check that this is a valid UISDISP LUT fileUnknown error writing LUT to file: This is NOT a valid UISDISP LUT file, andhA  UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x` should be deleted< GreyQuit RainbowContrast/pos.Start/intensityRandomMethod 1Method 2VariationFancyTheta/NrotLin/NrotTheta/WhiteLin/WhiteTheta/VividLin/VividNrot/WhiteNrot/VividTheta/LinWhite/VividUniformRGBR->G->BB->G->RGreyscale VLft/Rt. slopeV apexRGB encode@ in RED imageQuitTerminal + fileTerminalAppend if file exists, create if notEnter filename to receive these valuesPosition outside image - try again ! Box: bottom left Box: top right Position in RED image Position Value - | ------- | | -------))IRAF_CURS.OUTIRAF_DUMP.OUT@titleUIS SNAP: redUIS SNAP: greenUIS SNAP: blueUIS display SNAPSnapVMS root name for SNAP (will add r,g or b: CR to stop)Name of IRAF SNAP image (VMS format: CR to stop) @UISDISP-E-Noroom, all graphics slots fullGraphics full!GraphicsWrite Text Enter the textTextAcceptPut hereRejectGive starting (image) coordinatesIs this OK ? (Answer Yes, No, or Move)Error in input - try againGive file with x,y (odd lines) and text (even lines)Unable to open Error reading from file !Is this OK ? (Answer Yes or No)Draw LineLineBegin/endGive four (image) coordinates (x1,y1, x2,y2)Error in inputs - try againGive file with (x1,y1,x2,y2) linesGraphics styleEnter new angle (currently deg.)Give VMS filename for graphics settings (CR to exit)FWHSLCAMUnable to create file Error during write to file Further choicesVMS filename containing graphics (CR to exit)FWHSLCAMTDPBfwhslcamtdpbError opening file Give file containing pixel positions (CR to exit)Give file with box ranges, x1,x2, y1,y2 (CR to exit)QuitDeleteNext piece))))) )(SAVE: to restore see "Read from file")SYS$WORKSTATIONClick here (font)FontsAbortView nextSelectSYS$FONT:D*.VWS$VAFONT]:.WDEUISPATDVWSVT0ADWYSINDWYSISSYS$WORKSTATIONClick here (size)SelectIncreaseDecreaseSYS$WORKSTATIONLine widthSelectIncreaseDecreaseLine styleNew choicePick your ownEnter 8 Hex digits defining new styleError in input - try again)P ?error writing into pixel file during image createcannot create or allocate space for pixel fileerror closing image header fileerror closing image pixel filecannot create imagecannot delete imageattempt to delete a nonexistent imagecannot rename imageattempt to rename a nonexistent imageerror flushing buffered data to pixel filecannot read command line stringillegal imfort image descriptornonexistent command line argument referencednonexistent header keyword referencedcommand line argument cannot be decoded as a numberattempt to access a non-image file as an imageimfort short integer i/o requires a type short imagecannot open imagecannot open pixel fileimage pixel type must be short or realerror reading image pixel fileerror updating image header fileimage header modified but image was opened read onlyerror writing to image header fileerror writing image pixel fileimage x coordinates out of range or out of orderimage y coordinates out of rangeimage z coordinates out of rangewrong number of axes on imagelength of each image axis must be .ge. 1end of file or list detectedout of space for header keyword name listimage header keyword not foundout of space in image headerattempt to redefine an image header keywordillegal header parame  UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xuter data type conversioncannot delete image header keywordattempt to delete a nonexistent image header keywordimfort error (unrecognized error code)PC@@ ?g? O? OC j ?O?ED? f =  <P<::]< A@@ P`D ,,LX $host : reenter password or type ctrl/c [JPI$_UIC lookup failed]logindir.irafhostsirafdevhostloginr:*:?kernel server process has diedIRAFsys$library:iraf.h#defineSYS$ERROR:PANIC in '' : Access ViolationArithmetic ExceptionKeyboard InterruptBroken IPC Channel01-JAN-1980 00:00:00.00000000].dir.dir.DIR.dir.EXE.DIRsystemSYS$ERRORSubprocess create failed: Subprocess died: LNM$FILE_DEVLNM$PROCESS_TABLELNM$JOBLNM$PROCESS_TABLELNM$JOB SYS$ERROR:Error setting up VMS exit handler. $Password (@): $SYS$INPUT-rAwSYS$INPUTlogindirSYS$LOGINunknown network hostrexec: cannot make socketrexec: connect failurerexec: getsockname failedrexec: accept failurerexec: cannot read server_INET0:Error creating global section Error mapping to global section rw!XL.!ULSYS$ERRORread 0000 bytes from IPC wrote 0000 bytes to IPC dev$ttyTT:-rAw+rAw=rDwSYS$DISKSYS$DISKDEFINE/NOLOG SYS$INPUT DEFINE/NOLOG SYS$OUTPUT DEFINE/NOLOG SYS$ERROR DEASSIGN SYS$INPUTDEASSIGN SYS$OUTPUTDEASSIGN SYS$ERRORSYS$INPUTSYS$OUTPUTSYS$ERRORSYS$OUTPUTSET DEFAULT 13579BDFDCL Subprocess create failed: DCL Subprocess create failed: SET NOVERIFYSET NOONSYS$ERRORDEFINE/NOLOG SYS$COMMAND DEFINE/NOLOG TT DCL mailbox create fails: _INET0:r# rirafdevuhosts/etc/hostsconnection failedP@ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x hostiraftmp/* ###(% ^D'!XL_C_!UL!XL_D_!UL!XL_DCL!!WRITE SYS$OUTPUT "!!"SAVESTAT = $STATUSSHOW SYMBOL SAVESTAT SAVESTAT = "%X%SYSTEM-F-NOLOGNAM, no logical name match)SET MESSAGE /FACILITY /IDENTIFICATION /SEVERITY /TEXTSET MESSAGE /NOFACILITY /NOIDENTIFICATION /NOSEVERITY /NOTEXT''' ((0(! UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xL@@f@ff@@@@@Cursor read Dump a region Corners of box Dynamic range options Read in a new image New image setup Zoom (in or out) Pan (non-interactive) Reset zoom and/or pan Reset Look-Up Table Interactively change LUT Graphics overlay menu Change cursor pattern Blink options Snap (screen->IRAF image) 3 images->RGB Hard copy of picture "+" cross "+" cross with central hole "x" cross "x" cross with central hole box with central "+" sign :-) face :-( face solid arrow left outline arrow left solid arrow right outline arrow right " UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x& Same pattern, two color Reset pan only Reset zoom only Reset both pan and zoom Use current LUT Use current min/max Include LUT wedge Read IRAF images Minimum window size= Reserve 0 LUT indices RGB 1 (more range) Fresh (greyscale) LUT Calculate min/max from image No LUT wedge Read FITS images Change minimum window size Change reserved LUT indices RGB 2 (more intense) Fresh (rainbow) LUT Request new min/max Range 0-1023 Include LUT wedge Exclude graphics Range 0-255 Exclude LUT wedge Include graphics Set range Make B&W SNAP file Make 3 RGB SNAP files View/change SNAP options Store current image Start fast blink Start slow blink Clear blink memory Change min/max values $ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x-P_P`PTH@HPNDN  PTRRPDSPPYXP\T\P]@D]P^^l{a;4o dc aaaaa a$a(a,a0a,{cp;X dc    X  4adc|;4a\  <$<<<4adc{{``{{(DaHaLaHaTaXaPa\aHaLabHabb  ` `ha hala,  b@e bpa;   {\ ;Pa|aa ;   bIcp;X dc``X  \  <$<<< \ {T<T@TD      T<T@TD{\ `a` dcLc``z  aa   4    ,c h{c |g `{d{ \{ T{ X{  ew  abh    bl;0{ {{,{@{H{,{4{({({0{  T  ||||X  P  |P  ( P  }P  P  P  P   P  |H P  }P  |P  P P  }P  |X P  }P  |x|||||` P 4~||| `< P 8 @  @@  @@  @@  @884X0 00884X000 ?88>|>08p`9 D(("D???|>`|??? p8p@@0@ @ "D" $p A     zz x          X     *             <   `\   |    |   Ą  ~            $     D   d    .        z   P"PHP -   <  ,l &$ J b &h         xgvcq;5PP~;93Nˈek0=`$eeqAWh+̕)g%&n-m*dhUkVXPcm3g./>#Ao$%m<'l ruf1^mln%b'{)&/o;!6?/*LpQP#M>zE5ff80j0:$%^0/.IO9Wy8.i jZi+#7p3&q7{EW#&!X(% @GNXU\r=O NN}:s(IAN)nWmj:P_8aqG|y<e 7JQ;1HG "Ne/sRR%)Gx]-rVE:`g {QV Vf!-Kz8A@ i6I_A->&C 2TPYNC!rae!<́E$:5;@(p'^eeK3_i*+" UqU&[`8AT (G]70*G_RWY;=lOKzNOCNY_ R`Fx]Eqr?( {Pe@ PA7E5% BVN3O oq['yA4t84 :aK%o .B_jyhhPYE851wVSM#pq`z HTPEOeY. *sI?B33m=7>j-}<1.b='''Q^A qfdraR{"WC-}d46db:H5 Lsl,2kvqEbAka*+Z8%l,2Dhu0s}6 [&v?~[SfTm!)Q$(>MS0Fsz R}xB(AO2is;PC %AN"^idxHyxsvDO_Gk {nas ?v/Uwc*q zZ[/BZ ~txQ+)g\27, nij8vdt.2&ZT2gPK^,o,'OFJE>jQ{:w!!( qsxݕe0t;F+O-*:B$}s{I7m]nN__EX]GǙ$A+xdPB9?4LB - @OZ< TonIr'$`_ J[ @6 J{Av JX>$ %v9t/eaCQRMaJM Hq`k#2& XvSy~KZHQ0nNBNa`{GBH3h' Q~N~ijh`^-F0k0b]B~;!Ddv|* ^9#7)c%y8EO+MKe9vT,H%KnKf9*? lumY o^jn|"> &R` ~:P?mepx$kS So,mgqt;XT0rT?8D=~f{}$8[{UDvfzE zh3hDupOphT*5E8gtjgUNVjmn he,EAe`'"'||#l=z}e~}^< n(>i%tus`&E=W  LGUa]GYnfUTV$1a]'f_W( U||DGb{`~,{#feds,ejV_-bW>[t8ggvQuF c|/,6$=8HQOMI;!oj?goR N 6J~ }"cJ|tyBn6_;UEDHz nHom7>0wBhAGUuST wS\zd]@VIBzT2+X?6$~`0SU?3.6D(;={# 3E"L iS K+Aݹ:A) *YT;&RtR1nheY39*ToySoLCtP6'>(Li)t, ;Cf>eDsfuijXtsmZ}62*=|_wsX{#Poi }8~Cv @aϬNM,VNBӕWAT!/!b d p}tG7XN`$?e5#B'Y1wTS tY[^A%'*@;\Me5r ":`+itxHoUcO4';e:6q*@Ko 2``8\UB^+>]6M68xW,@icR'7d*cg nAepe_5vlb=;@;:IQo/KFW8`K\:_k;{ak 4 D@Gz^*`uo FFCQ]BCO\ gUHam:#A0)K׮Pߐiy(Buv$ U&wTpfgpX<o;GE'RVBGs0E32I;._*3a#v OV)!P"!f(&a!fI6e8>VKP&E aHR)qK9_gTf]N4!{&N\1`T4[\$|J5LxT HFH xIHR n5I bZX=l{5pUY(#\E[xX\H\+@'ytX/ Os$AFkV{kWO{Gs(۫]!ፖ0ʶ8)Ց6ֺBיȚOЪޖPߴ%ɓ ۪ч_렬ղ7ꁵHޡ̙ζݤ7%񉇬=߻jʪnẟPHw&tguýYްЄeJ|kxĔ ;-i֩٘ В"Y;ݤ.%}Hڋ|%pd}BٝGNpɵ8gё.~˸qՌ~KT(&nIâFݍR+݀Iɾiȇ@ٚS68@FWF\WNupt) YaM]1YtFGLxSXY2Tm>fE{IKbym N1BNCm EGWP81TzG TW_X?ObuT V4v%?E D' _<w -i ECmUKVSNV D$'d'7~R<67E;E^EYDAESER.^iinM]>0),r-l% >5eeYe xeq36:6I 5e# 5mZ["! UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x_,B t"x"44<<(,$ <  PȊ     $ ! @ SIMPLEBITPIXNAXIS NAXIS1NAXIS2OBJECTBSCALEBZERO END HH UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xI @ PҗP"r0 "2   ܘU   Ę\, j ' * 2 ̘   @   TșP \!sPș LExit this menu DTABER0003WK00PG0001UZZZZ02A000 PTħȧԧȧ(z0z̧ЧħħȧX DzDzDzDzDzDzDzDzDzDzDzDz Dzħȧz DzHzXħ DzHzXħDzHz$DHD\DDDDDGreyscale Rainbow Random Fancy Uniform color RGB encode Greyscale V Save/Restore LUT    ,P̬   ح $(< dyhylypyty.04  |X   e2#; Vary theta/nrot or lin/nrot Vary theta/white or lin/white Vary theta/vivid or lin/vivid Vary nrot/white or nrot/vivid Vary theta/lin or white/vivid g UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xf_P   0  05:   < DR  < DLbir  t | {   ԰   ̱ Աܱ    ̱      ̱ 4<    ̱ dl    ̱   IJ DL      -  $ ,4  X$y     Xy\yȯ̯ЯD (dyhylypytyد̯Яȯ̯Я ,     8ششܴܴ4ܴCursor positionDump a region Box (BLC/TRC)  P =in~ $HLP8 $&pĸtx$LPDLP TXD LPLXTXTPLP \ 1 :CT X        PPl,<4`ĺĺ,`Ⱥĺ Ⱥ`ĺȺĺ`ĺ`̺ĺ̺`ĺ̺ĺ`кĺк`4ĺ`ԺĺԺ`hĺȺ̺кԺĺkl UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xSWкĺԺĺ Write text Draw line(s) Change style Read general file Read markers file Read boxes file Delete ALL graphics Delete some graphics Change text font Change text size Change character height Change character width Change text angle Change line width Change line style Save current settings More options Use cursor Enter coordinates Read file Color white Mark positions One pixel dot Color black Don't mark cursor Three pixel dot Color red Five pixel dot Color green + with hole Color blue + sign Color yellow Three pixel box Five pixel box x with hole x sign l{PPPoL.<  JZ,*,  )  x  |  `{d{   `  4<  `hpx8       !  x &7  4L^4x  x  4   `    h(x  ,  x   4;"V    4y  @<     x     \{  x4      t4(@ h{-'    U( b<  `{d{ T{ X{   8 UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x-^o1   4  D       ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+~`<>,./?;:'"\|[]{} <<Px XXX T\\X\ \\Xdt `  `8 @Xl\\\ Font size Char. heightChar. width See the 123 {male} foxes !?Pd`{d{X `{d{ `  "8 `{d{>̌@AffFAffA33L@@ffL@@ffL@L?̙@L?̙@L?Click here (width)Click here (style)PPP44X ,,T{,,X{0,8x,8x@ lt`  P[bk< t  <8 X{0T{%h,9lB|B)?QQ <@DHLT\ (((!x| tltppp ()lpt`!ftHDR$hPD UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x e    HDL imhdr     !  ^{}[ =] TX`d\<B  80(   imh..piximhdr  PTX\`d (lh HLh,08ltlpDplhh TPL imh.imhdr!  $($(0 ,  D4Himpix 8<8@HLD HPHaNq UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xl TXX\`|ctime|mtime|limtime|datamin|datamax|naxis|pixfile|pixtype|title|naxis dhld0i_naxisnaxis ,p<tL  x|   LPTimdirIMDIRHDR$    tx|t||^imh|   X\INDEFeEdD INDEF    T-0  (,         salloc: bad datatype code${ {HSalloc underflowh${${ {Out of memory     `             UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x%9sy Memory has been corruptedhl 4     ntfr'"\ '"\ ,P INDEF  Warning: {{ {{T { T|{INDEF    t||t       INDEF********** yHDHtxtMemory has been corrupted $ ( (   <@D@@  , In patsize: can't happen. 0 In omatch: can't happen.  4 `  {8 iraflibsyserrmsg P@ PP@ P@ @&P@ PP@ P< DDP@ @DHP< <D@D  y0  HH Out of memory ܥ, UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xz   D P T L H D set   X \ lX ` %l xd h |(,,,04,p 8y<0p t <0,t <  P%$x | % $ $                              O[ˀR{PPPѫL&}zˈBzGzːlz23v2lifԫPTRP"H, PpP˘˜˘yˠyP"~y˨yy~˸|ѫt'ysyxyːyëx\zt.˼|P}|P;{Pˀ<{hez˄{ˌz(  wus\PY<P˘˜˘Nx<~x'x˄ˈ1 ˈŅP˘ ˜˘xˈwwPˈPˌԫ XYˌ 1-ˬxPP˼˸wːK S>EXBZVhjPP˜jQQPPˠjPP˜jQQPPˠwPP˼˸ewhwPP˼˸Kw,n P:ːˤ˨j~^j~^ N^?ˤˤ { UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xJ$˨(j~^,j~^0@^8-PC~av@&v+v~EvP vvH4v1ˬЩRSթPˠTSPNPPEDPQUNUUGUQqaq(PqΖ+(P1ﻗP聯 k@˸D<3XYPiX#oh!PiVDv  n&ˀwqxoPP˼˸nlnPP˼˸n nPP˼˸n ˬ1ː P\1\ \1JˀpNa~^]TPNP~^P^6q ^N˨:nPP˼˸!n˴ nPP˼˸nnPP˼˸m\ԫ1booo˨mPP˼˸m$wo˴mPP˼˸mD(]otmPP˼˸WmTH'o%(ǖ6.}+}(})}+}1p1iXn||phnPˀtnː˄n˘˜Nn~^ˬjaPNP~^˰˔{n^PPDu| nQZ|E n$ n(1\L, lSD 4 kA |DPPPRRRD< lSD 4 kD nSD 4 kE{P@DPPPRRRDP }nSD 4 k1,/o~MaOh@yDv5rt#dO^{ڭeDdPE; RorlΑ`!ߏE! 2##fmyAܙͷ+t!xufte:e"xam'%Pg5d "!A晹{eƢa;nz_:x1o\N ,FNFsK4Ng WBO{3ϔ~_R@*]I+TgXzf = -Q!gu&6O-pp_߻Svt je՛ߟ3I7*X:RQPiq4KxL4U]"eSDFXpjB#"߄ 55e!6$!+2-6HUrȢ}Co/AM&!Y"]sLoteqnb (W\1y}qwS켜1"U!G,Sst6 \ \HA 1 ]&%?կ*j` #kz;YX )e~anjSj,/L̟vd!$Oۍ%V$P_J(M;^~o?H&kmy`_!wžn> pw'a($>r.&#i}!z"XV$h%sR!y$~&#9|QB ܷ?(51T~_^G_#%p psb'R!HO]r$?%T]2'!d!B!f{M6{$#]ޗ \X\CZIw,L}W!q3 ^!5B+'ߡ3Q9!Q!$Z{يxscmQ< !%Q![lX!l!$|S!@q.p.R|#xl!^|2"R%x* ^pYcN Ԓ;TPHhd).mWCOPϬ/+PhPRI~ж2ogX7]K0N帔v& ]oV_hU欷hH"Z~>_;0)P QOP^\2R ^yJ+dP~6[kNEEq\OP~`&IFAFoGSz_R%F2˽V2M3}0 lgBm4Qs^>s cr8"Dgxj'1&t}r%Adrzd)S'SL1ѨNLHyA 0c聯Ӆ4e@Ճʑ {1x/W PiYY8 h YzP.ޫ2fq4-W  ') OZ O`w`x o0PxQ˓" s+xb,.3y:t{UTʠ!X4,Ң[y`Ѿ Ŀ9G N{[֒3TT˝(jKSqfm+ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xW qjˀ0kxhPP˼˸hlhPP˼˸h ԫ 1^hPP˼˸nh1?>WPˀYjN2~^.%PNP~^P^j ^ˤ( ˤ, vݏ~^8 eЏ~^<  g^1K 1AWPˀiN~^~PNP~^P^`8j ^Gˤ\ ˤ` ϐ6~^l ミ)~^p L bf^1WPˀiN~^PNP~^P^Îi ^揄ˤː ˤ˔ 2~^ˠ !~^ˤ ˀ e^1˴ I1 KS1 +#, BfNPVRVCP$NPD>PRP \N\\C \(XXwXPPH|VPP˼˸mV1,~d Pː ˼1L$XL\\ˬ X\\THWL˼˘`˜UPPP˼˸UpcPqUFU˼˘`˜˘-U2U1G|U1H0[eP`` PnO(k`kԠ` P נ` P= נH[} PQP}PQ$P }PQ,P(}PQ4P0P P8OWP޼d`RV޼xtU޼˔ː6V޼˨ˤUe޼˼U޼U޼U޼W޼$ W޼40W޼D@V޼XTV޼hdV޼D@V޼ˀ|V޼ːˌV޼ˠ˜U޼˰ˬUdPk A QAf@ffQC^RQRCRCf@ffRS!CQAk A QQQ&Ck `Ԡ޼yUP O[Ь kV,n PVZW^(JKn^(bn"<"W^@D W^<_@F l`Zի tUF ˄Fːˀիt)F ˜˘a1nFeNF[D+b4RˤQF6QQF ˜˘1ѫ Ba4QˬQݫ QQF ˜˘ƒ1F4 F@,n P˼{XիFF4FF,F@F }ϴ<_@<;QFPFPF,PF PPFFPPYPYYF4F,F YYPYPPF@V]F48 F@DI`4P~P8cPhPDMPbP1,` PY^(JKn^(`n! P@@rPJPwP8PwPPDP1_4wOLO81O6ODO O%O޻ Yީ˜˘Fީ˜˘7ީ ˜˘(11,n PxP@ $PyX y^(yxnxW ^( _n WW Y~^˨NPPC#> P~^˰ːL ^VWЪ V FF^˼L^Ъ oLJj j xժ PѪPЪѪ ԫDJ8LЫPH<[kH([ѼмP@kfLH[P@k9LwvkH[}PQPk@(޼,м P>@ҫ0>@4BO8[^мDЬ,,ޫ(P?мlЬ0TޫPP?м˔Ь4|ޫxP?NPGPü PNPPGP üPNPC$м(Gм мWѼ 1üWPNPPE PXݫX?DPNQ@QPEPZS PYݼ X?CPPEPYCYVEXP@PAP~^˜˘?^CPUEUAP?UDUCUUQURUD$UDP@PUDYU@VUEUZG8EXU@?U@UAU~^˜˘;?^CPUEUAP UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x5B?UDUCUUQURUD$UDP@PUDYU@VUEUZG`DX@*@X@XAX~^˜˘>^CPXEXAP>XDXCXXQXRXD$XDP@PXDXY@YVEVZGۈWH[?ԫ$ A8p=P1 =kh=߫^=߫T=i=X=P1Ы hdЫ |t?PzeX=ˀ=PfЫ ːˌWЫ ˨˜x?ˀw=ˬr=P3Ы ˼˸$Ы E?ˬD=<1<,<4<<<i?T?Pd?$[>@F>TE>h?ˈ?˨.>˼m?>>=L ,`=H?h?ˈ ?˨?>b>Pd*>H[м$Ь ޫP;Nݼ ;;;H[k=ccc=mH[k>KK[м 0м8ЬޫP2;м dмlЬHޫDP;мPQռ8 Sм TUռ #ūXQVū$QWWXH XVYITYTUPQO[^м <мDЬ ޫP:м pмxЬTޫPP:˄ѫ1<PPQNQQWWNWWGWQkԾPھ;WW1ﺾWX料Xիѫ  WWYū0WZZJ,YtZSj1SVzV tNVQQQSQNQQNBUFUQNUAUQF,QU"=UXR3R-RUTNTTNPFPTNWPAPT īdRVRYB`QUZSyW"ˌyHl[k8T`X޼h\xի pm1޼˜˘ewիpm޼˴˰j1IK}IBL 8˼g8YIF8_8޼˴˰jCѫ R~L J88ݫ 88޼˴˰?j|,n P1޼)saVPdիPd(d`_WDH,n PaVիЧ ЧplT`XTo7ߦ-7ߦ#7ߦ 7ߦ7$7æPPQPQQæ QQPQPPԧNPD#> P@u@PJPRѧRçPPѧPRJ 6$6ݧy6,6ݧd64m6r61fѧ_ѧUPǧPQƧPQSSPPSSffSSRfPfQQ9QQPQfSff8J 6551GOp[} PQPмLмTЬ0ޫ,P5м˰Ь˘˔P5мЬ˼P5мˀмˈЬ dޫ`P5ԫԫNPNQDQPGP 6_S+_#_"_1>ۤUW_PPNPQNXGXQkPXEj޼޼pի iмPQռūtXYZJZYRBpRЊPQ޼$޼( $f޼>qի IiмPYռī@XQ>AۤQXR>B$޼( t4wSE TETTSCSSE SP4DCPTDEPSASTDCPTSKSDDP@PTKTD޼D@e H[м(Ьޫ P3мPQռR>BRMS@S DSS@SPQ Ht[м(Ьޫ Po3мPQռRBRЂS@S DSS@SPQO[^мˤмˬЬˈ˄P3мpмxЬTޫPP2м PPЬ(˼˸P2CWQ gѧ1 g1g*2h2ݧV2c2(u2>2ݧ 292Gի g9n '2ߧ 1ߧ1175 1ߧ1ߧ111WF1 111VSBPA}BP2 QNQQGPQOBCRBQBPGPk6B5BPNPPGPkBB PNPPCBBQGQPk PNPPAAQNQQGQPk $PPЫѫ Ï0`SA1A1мռ1NPNQGQPëPwZPPмYa+ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xxVռ1˘PWXVPNZPPWPCJA@۔PDkPм$ZD:AP@P0DPKPP$PZPZ$ VXQ$A`9ZVXQA`&Z VXQZA`ZVXQZA`YVg8*1мռ1NPNQGQPëP{YPPмZXռ1ūdPVWXPRYPPVP2@`PA@PNPPDkPм$YD:@P@P/DPKPP$PYPY$ XWQ$A`9YXWQA`&Y XWQYA`YXWQYA`ZXc8*1V?1мWXռ1۔ZNXPNQGQPXPiXPPмQYռ}˘PXRYSBXSSPSC>?CjSDkSKSS$SS$ YRT$Df7SYRTDf&S YRTSDfSYRTSDfQY8HWXN1мXWռ1>`RNWPNYGYPWPWPPмYZռ1īdPWQZTvWTTPT2DbTf>TNTTDkTKTT$TT$ZQS$Cf:TZQSCf&T ZQSTCfTZQSTCfYZ8tXWFռ 1N WNXFXWмXPռ1}QPZNZZDWZJZZ$ZZ*м RYռ ZSYVVPVSFaRY.м YRռ !ZZZRSSPSZCaYRXPO|[Ь  VTW1VXPP޼|l6pt+P1.Ԩd޼ ޼˼eTŏPTUEpA+8++YYP)@1VYsW#OEp9A+kd+u+k6,A(v+K+P+޼+11Ep@(+?bR*+NR?ER 6@(+**޼*11rEpi@*?**A*y*2~R*s**S*X*1Ep?D*?*/*1Ep?*?)*1Ep?')0))PddZJ'ZdZdcEpc?)P))7Ep7?x)PW)`) V YV $TZV14):22Ч Чըd (d֨ Pd(d6ԧNPD#> P@u@PJPTѧTçPPѧP_w>(((ݧv((ݧa($j(o(޼0(1hѧ_ѧ۩UҩPǧPYƧPYUUPPUUhhUUThPhYY)YYPYhUhh=('˘'l6pl''ˠ,n P1hO [Ь $ 0} PQ˔PːмˌЬtޫpP'м\мdЬ@ޫ Z~^˜NPPC#> P~^ˤ˄! ^WXЦWGG^˰!^Ц!۠Y޻xXWԦffxզPѦPѦy!ѦЦP@gQQQQRR^@g ^ЦQPAgЦQRAhAiAg iЦQPAgЦQAgXXXA|!!ЦQPAæQQNQ~^ y!^ЦP@g1X~^4$^X8L `wWP^(PnūHXPP<4QQP<4ZZ^(Z@DnPZY ~YYYW^t W^XWP^(PnīHXX<4PPX<4ZZ^(ZHDnPZY ~YYYW^˄ W^n 1H,[ kH[ѼܞмО͞ÞP@￞kH[P@k~sH[PޫQCaPADPCPE(PA@rPQJQQQQRNRRBRPDA|PAAPk޼ ޼ ޼޼޼H[kO[мhЬPޫLPмːЬxޫtPм˸Ь ˠ˜PPNPPGPk ϼB~>F9PмPԼϼOмPռ8QA\QYIۄYZJ۬ZUNUUDkUUUUPPNPPDPNnCQDQPNQFQPJP؛^CUCPNPPDPJPÛ1b{PмYռaP@\ZP@ۄUP@۬XPNPPEkPQEDQDPDkPA?P ފޅވYUNUUDUNBXDXUNXFXUJU BBUNUUDUJU 1Џp S 2SмUռoP@\XP@ۄYP@۬Z EDP DPA?P tPވމފUNAUDUJU^X UR1P IPFNUE?U:P7P4޼,޼4~^<޼T޼X޼ \(#^NbAPDPJPәYAPAPNPPDPJPル1](n(Pǫ(PXū(XPPYXPNPPGPZYPNPPGPPYQQ7RB\RSCۄSWG۬WVNVVDPVVVVQPRի(1RPXPQYQVښ3PQNQQDL?QA?Q RQQQQRQNQQD@QCQNPPDL?PA?P XWWOVP@\SVP@ۄTVP@۬UPNPPDZPEDPރބޅW(RDN?RDRJR[??RNRRDRJRF1=PP мRռJXH\XYIۄYZJ۬ZVNVVEkVވމފcRRNRRDRNI?XDXRNXFXRJRﳗ9?0?RNRRDRJR1=޻\RPۄXP۬YPZPZ;VF\VSCۄSTD۬TPUNUUDkU@UUCUUUUUZPмPѫ>ЫSC\SЫTDۄTЫVF۬VZZZNZZDkZ@ZZZZZPмPP@bмPP@hмPP@iPNPPDPN>>YDYPNYFYPJP猪練PNPPGPﯖR節1#pի<<ˌː޻\YۄX۬RHS˔:P1`, Uc$ߣߣߣ ߣߣߣߣ߼ύωm, мTT4P@\V߆ЫP@hЫP@bT˴R޼] UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x ޼޼޼ ޼ s8<ˌːˌ!&A ˴Ы<ˌː˼P1h+ cݣݣݣ ݣݣ~ݣtݣjݼTmb* kмSS5P@\T߄+ЫP@hЫP@bS˴#<ˌːˌ˴O[^м˸Ьˠ˜PмЬPмЬ P::PNPPGPIAN:QGQEIAQNQQGQGP E $E* E*(NPEPQE?Q,D PE?P0@2D,FHǏFPďFPPEHǫHLūHLPPPëPPPTϼ#7KKTЏ X19ˌЏ0 X1%ЏT X1ЏXP,O #/;D1L71|+1ˬ11Џ X1\R\Pǫ\P`ū\`PPdN\PGP(`PNPPGP,dPNPPGP0PRPOPLh<ЏXt{ЏX˔r˨ ˴˰˴˰x #˸.˨0  u ЫXP@nWS NPNPPD P'@@PFPJPgPNPPD$P@@PFPJPk =77PNPPD PJPlPm7PNPPNQFQPJPg&ѧ8NgPDPB@PEP NPDPB@PEP$*ѧ#NPE P NgPDPNQDQP@@rPKPlP۬QRSիlPTD۬TUEUVFVëlPYNYYD Y@ YPYZZPYQYZZYYYYlPмPЫlTѫlDD۬UDVDYëlTZNZZD$Z@ ZPZXXPZQZXXZZZZPT1֫hѫhhz ׫hhtWNQDQC@QPEP NgPDP\QNQQDQPJPPPlNlPD PN\RFRPCP P۬STUիdsPQNQQD0QѫhE QVPVYYPVQVYYVV@c@ѫhE QVPVYYPVQVYYVV@eD QPQVVPQQQVVQQ@ddPPVի\1&ëlVPNPPD PFRPAP VPū`PQdQY,5PQNQQDL?QA?QVQQQQVQNQQD@QCQNPPDL?PA?PZի`1ZPNPPD,PEDPkx|ѫh&ZYPE 4QPQXXPQQQXXQQ@۬Pѫh&ZYPE 8QPQXXPQQQXXQQ@$ZYPE Q3BP۬XZY)1NRDRC@RPP NPDPNRDRPKPlмRSռ1E TSP«lPNPPDTP@PPf@ffChPf@ffCjPf@ffCiRQPP3@33ChP@CjP@Ci0EDPkDPA?PChCjCi_ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x RS{1NFSD SDDSN0TDTDTA?T мTRռ{P@۬UP@WP@VRPNPPEPQDDQ@SQQQDBDQDPDP@ PQPBPޅއކQkP$ TR1NRDRC@RPcP NqPDPNRDRPKPlмPRռUE STD۬TUEUVFVRW«lWNWWDSW@WPWQQPWQWQQWWWWPRЫLRS۬TUVRESPīHPPPWW~^˜@dˤ@e˨@fˬ˔I^˰MRSPSS~^ЫPSCdCeCf˸^1qO[^ЬT`}(PQPм Ь ˤˠPtм ЬP]мˌPP˔ЬpޫlP=PQޫSCTGTPPPQPQīPP ]м$ռ1N$PNQGQPë$P-PP,XԅV0,PP0޻`UцhHeXYZI ަ$ަ([?ի4 8%8м PQռ YTDTC8dSEHSPQxHe˴XY>۰T>I ަ$ަ(W@ի4 87м PQռ -XRYS>C۰SRZJZMWB8WEHWPQX мXVռ1[|RYSTˀ$ZVPJ,PPPQPAiUUPQQQUUQQkPSQPAiUUPQQQUUQQTPP@iQQPPQPQQPPDaQL? QL?)N PC67QDQPPPQQNP@PQJQQtV/EPB@PJPPPPCL?̫UF?UJUUUPīPEUB@UJUUūUPGD UNWDWU 8WPWNWW@WUJUQQ VZUQEbQVZUQEbXV`$bSP@`Tބpl.3Sռ1NSNTFTSмTPռy|VPZNZZDSZJZZZZ'мXRռZURQˀQPQUAfXR.мRUռ!ZZZUXˀXPXZHfRUTPO[м pм$xЬTޫPP^м ˤм$ˬЬˈ˄PAWѼ(W,W,n 0 ( ((PP ޼޼WGeԫ&&&&e޼&~^ F^޼&PP^P^ &^޼,(D&QPA&0,(WﻃZg,(g,(xѧV 8޼D޼H@0%޼,(%כּѧѧ ѧ 1gէ g_ԫ޼`޼d\Wի$* $Ѽ( , C PѼ( , = P$x|ˀP޼ˤˠj(PNPP@PJPPP'PP0 P«,PNPPBPNjQFQP@PJPPPP'PP40P'PU4P'PRRy'Rt'Uc' UV' ~z˰?D1A$T,1?~2˸ UR˸CUPNP~^RPNP~^,^޼d~^^g,(g,(xg,(g,(x޼ˤˠj(PNPP@PJPPP>&P;&PW P«,PNPPBPNjQFQP@PJPPPP &P&PZ!~WZ˸7NW~^NZ~^+^޼d~^ ^?UdW[RRZI˸RW1Ѽ(10c~U@UR -$URH1 1~PURXūd4P0PZ>`W?Jg]z,UDR;?Jg-J1~^P#URX˘4P0PZ۔WJg,URJgU8R<`c*10UW«UcUPNP~^ëRPPNP~^K)^NW~^RPNP~^*)^޼d~^ K^ 1~UTTWTWT~PPTZTlTZ:`ajUZZW UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xОZSWZh./eZTl5TZ61~0UTTWTWT~PPTZTlTZ6yUWUoWU.}UTlQTURΫ@ѫ@1^ë@4Zë@RWW.! W!!1g~WЫ |t0WЫ |te~WwЫ ˌ˄0V|WCЫ ˌ˄NK1[Ы PQP_ūdZU˘Z$V0YY«YZYI۔Y0SS«SUS>C`SQ0XX«X2ЉXX ԦԦPQu~W˘Ы ˜˔7WWa˘Ы ˜˔ebs;~`W'$˨Ы ˬˤ+(7%W$˨Ы ˬˤ@~1O[^Ьp|}DPQtPpм`м hЬDޫ@Pм ˤЬˌˈPм ЬP|м Ь˴˰Peм$Ь(PNм$DЬ,,(P7м$lЬ0TPP мDм HѼH,6h P,0 P,n ptW޼<ˌ޼@ːˈﳪիѼH1OXr~«^(`nЫZZYYˤYX^˨ˬ8&X^ի 7(Xr~«^(`nЫZZYYˤYX^˨2X^ի '1Udˤ˨$Xg~«^(`nЫZZYYˤYX^˨ˬ%X^իH' $Xr~«^(`nЫZZYYˤYX^˨%X^1Xg~«^(`nЫZZYYˤYX^˨$%2X^իI' [$Xr~«^(`nЫZZYYˤYX^˨%X^1Bdˤ˨@#Xb~«^(`nЫZZYYˤYX^˨ˬ$X^ի1& #Xr~«^(`nЫZZYYˤYX^˨$X^X#Xg~«^(`nЫZZYYˤYX^˨E$X^1oXb~«^(`nЫZZYYˤYX^˨d0X^ի1% #Xr~«^(`nЫZZYYˤYX^˨#X^X"Xg~«^(`nЫZZYYˤYX^˨#X^1dˤ˨ˀs!,n ptrˤ`˨ˬ#ի %1eˤ`˨˘/ի $1=,n ptdˤ˨˴ \м ռ 1$ PëP$NPN QGQPkмPQռ1]UYWūTXXTDPTVVV$1>|ZѼHQE4FSKSS8SSAjVSE4C8SKSS8SQRSBjVRE4B`RKRR8RSQSRCj?E?FSVRE@= B8R@RSVRE>GB`R@RSD4SKSS8SSAj1¼$VVۘSѼHGE4FcRKRR8RRA|E4FiRKRR8RQZRJ|E4FgZKZZ8ZRQRZB|3E?FcSE@= FiR@RSE>GFgV@VSD4SKSS8SSA|PQѼH_>|X>,.мP>@.P>@ .Ы,PP0Ы0PPQQ4Ы4QQ> -ի",8ѼHI ի ^"Xի G"Dի 0"Pkի "K\[]\oVWHXѬ 8|PPT$_PR<7R' /w\/PRSR1T˄ի R*ggxѧѧ ѧ ԧԧ ԧѧS֬ ;F1#ѧ fSЬ P@Ь RPB _A~^4 ^S1)ѧ.SЬ P@G11,n P@?$(k߫\Ь SPC _A~^ˈt^˔﹡Yy֬ 1Nn3 UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xMЬ P@Z1Ь P@@1HP˰%*1,n P'ի$1G$P14Ь SPCτk߫^$XQP$\\$A~^ˈtp^1vHP %*-Ь SC1A$Yy֬ 1Ь P@14H$z1dHP1SP 2&1pRPЬ QPAggxѧѧ ѧ ԧԧ ԧѧ*RS֬ "1ѧ :RkЫ ːRˤSR1Kѧ>R1 PLի$1$h6P1π Y˄28(-Q *ˌݦ " ˔ݦZ ˜f& ˤwݦerϖ oˬHݦ*Ch A˴ݦ: ˼ݬ1TH$f1  Hi$RW1*t˜PPPˀ˄˄ЬˈP˄ ԬˀPPPPAˈ1,n PY,ի$1$HP1`~F @Xw|CP$pPR ˄PRR 5mYmI,$ cː1p$!bˤt19$bˤ<1PcblP1$y/b@I1$Ab\aPPˀ1L$ap1$߬1$k`߫V_ \X:?P$Y֬ +Ь RPBY\ $A`~^ˈt^19$߫߫ k߫Y֬ Ь RPBYc \Z 1$i߫('߫,2Y֬ +Ь RPBY 1_$ ߫k߫ ߫Y֬ Ь RPBYl~^f^lPP^P^=-0oeִ^R18Z?]6Yԙmq}59۫gG_HyfI;^b`%')K!Lc7%`\~̒yi,fl%_%CX،p+MPoOmX<LtcUDmr,:Mo򵼟lY4ݯ/`} CP7mH_A"0:@YOp.. ZŪbH5`B?zp0<0vVchtY% ^˃87w2)7ᦐ/iq8uط7\h (Z=J#_c(X&Ǯ}xJ,9:R-O>uWgZi _`B%B8 8^~sYEf$zfVE{]ۿLL}Af#)s>u: lX8;h0Ɉՙʊw 0O%ʢ'8JgN xVA*34.K,Y{rp.$4trW\}i/DI?_'a@Y6fX08].|6xWPɠAկ<_38}v>"&n )zue(mV/(Q Q(l/yI66O:]>->;OZkE[@e +"ΗK !]IŒ_ԑK@ cKd K "phbhnUFn>~ݥi+\i:FdpÀS4Y¬S܈*+1.H iSu$FzF/CWGz6)J𱕟Z1 ^D6)P 3Mm!e-Wf+>,yIc=0ZJy uf( JMN4["-. kl4BC/e~m1 Ƽb{ |flyjVd+5I}o`!/.ֲMKxKC/BC̵_} QSmpˮe_~eWdlƮ5VMf<*Lk݄T:ʙ+(\Bz`2?{>bݼ=`З*0ny 84x[Eq .s9+WǶJD As7r8Y{J _ xB W;ϟ.8x|^PjTWѶpPm&o„ZGu%T\50Q/7tg^뼳!`}纨18 XOr\4 Um5kHoB(_6pK߲hX= 42Ds =o=$N,c Wv\}ɉ7_<RY Rdg@ cm4K4W1eꂑ$IBGռњIJa;$](PSq H]|G^_6%\x5#ơ,8ЩYU\`U9Y$lJ`!'RPĖ KPxO6!$Zǹ%Fb%gxc)eG2 FE @/4rw$eǙ`WF\u0\B,+9H[A4@{Qz}#gԢ7QBXx,&@+?e+䉉/=wP**HۅxSY?nr:4ܻV,] ;sqiHBh9}:<' 0̄_'nVAaIjC[0%LPgq5vAbSIo(WdaV;ꅈ-o/LW @/3͞ .dIXg,Og_3;9Q["`!ս_B?#)x_9qilX$P]3]=cmUQv1ڻT Ҙqcj iEyI|qsK:xcȮRKoMsI=Ehs&sħ2BPPc chxH@:E l$pBZ d]o__M'O3eS]mC UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xttP^T \K l~^,$u^1Y ?ː ˤZ1:tHX$1,n Phᅭի$1$^PKЬ YPI/D{߫(=߫,3H H@$1P,n Pˌի$1#$P1l~^^lPP^P^p^Ь YPIBh`>Cxp>Dˈˀ9=޼˔>B˘>C˜>Dˠːˤ<P%ˤ 3P޼˰>B˴ˬ> ԼмP@(6T SR8[޼޼ uмP@N#@N k ռмP@vN#@mNk ռмP@VN@MN <޼,(<Ĭ[}PQPkЬ U޼4޼ 8޼<޼@,<Ȭ[}PQP6$5Ы R45ЫS޼TD MTռ 18VPPU>Ed\>B`X<.PPP>@dl>Edp>Cth>C˄|57SP>@\>C`X^<޼ːˈCռ1>B˘>B˜˔5>C\>C`X!>B˨ˤenk l>B˼˸r>Bpk:>C˨ˤnkԼ >Cpkռ&>B޼>Bt 4SR |[}PQ PЫVѼ,1  1Ѽ,.  1Ѽ,  1uѼ,  1]Ѽ,  1EѼ,  1-Ѽ,%  1Ѽ,  1Ѽ ,%  1Ѽ ,*  1Ѽ ,  1Ѽ ,  1Ѽ,,  1Ѽ,%  1mѼ,3  1UѼ,.0  1=Ѽ,4F  1%Ѽ,b  1 Ѽ,[  1Ѽ,&Y  1Ѽ,g  1Ѽ, m  1Ѽ,4u  1Ѽ,"  1}Ѽ,  1eѼ,0  1MѼ,  15Ѽ,  1Ѽ,  1Ѽ,(  1Ѽc,  1Ѽ1,)  1ѼC,  1ѼD,  ~ѼE,+  bѼF,-  FѼG,"  *ѼH,4  ,&3  Ѽ11t0Vh/ЫV>F H0(W>FG@86>FGPH6>FG`X6>FGl<~^th^/V|[ЬЬ$0ЫSPPXЬ @ޫ`\2P>p> t޼xlyl1ˀ/Sˈv.ЫS>˜GR>Cˠ˘1+Pk>Cp> t޼xl"lSTkU>VEf3Ef/!D> p޼t>CxlnSTEfDTUTSODk+>CˬkT>DL˰k~^˴˨5^>Cˬ> ˰޼˴˨T5ˀ'.S\[ԼмP@)Fk мP@F-@F޼:k ռмP@E ռ [}PQP } PQP-$,ЫR4,ЫS>BvELD½W3޼X>BYE\>CPE`TTh 3P%hE)P޼t>B#Expc>CEˀ|ڼԼ,SR都[Ь DRѼ ռ  мPѼ@4޼(޼,$1Ѽռ мPѼ@8޼(޼,$Q1мP@,$@,޼(޼,$"1ü PPмP@SмTмUѼ1~޻ VUPмQAPAtP WAWWPkAb4Cf80IѫP޼(޼,$,мP@,CfHCfLDSTUԼ[ЬѼ ռ мPѼ@F޼$޼( '1ѼռмPѼ@cF޼$޼( 1мP@1F޼$޼( 1ü PPRRSмTмUѼc>VUPмQABP WWPAFPkAB0>Cf4,ѫP޼$޼( Q RSTUԼ︤[ЬмP@]E?.P 9мP@UE$޼( мP@7E мP@&EԼ|[Ь Ь  ,޼4>8> <޼@0UP1޼H>LDP>\TE.C UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xma kP>@rAd> l޼p>,R`8"P4> xt0P@b  @b @b P@$[}PQPkX޼ ޼ $޼( [Ь ռ мPѼ @C޼ ޼$1мP@C޼ ޼$daмP@CQQ Q@l@Q@CQk@S@,>0(ѫP޼ ޼$Լ[_(W'ЫRVPPP>@?$>B?( y$޼4>B?80'R`[Ьм>.X[мP@?޼kQPѼ=мP@I? ޼bQмP@7?-޼$ -[ ?RмP@e@мP@@Q>A @~^@ PPPP~^Q^мP@QkkЫPﴣ[ЬмP@}>R@q>RSмkм T@X>U>Vի1kS RkR3޼$ PgмP@>R@ >RSRkPмQPA=QЫWWQQWWUP>@=8>Df<4ЫPPPkPT1lм ЫP [Ь=RмP@ S@STмkм U@V>Wի1kT SkS-޼$ PgмP@ S@STSkPмQPAQЫXXQQXX>Eg8VP>@<4ﱳЫPмXHPPkPU1oм ЫP[Ь ,0%8#H#X#h#PPPPVԼ sBˀxD+>ˌ>Bːˈ*>Bˠ˘*>BˬЫU>E˰˨"VYIB>I˼>E˸"PY !I  IY֫YPPY1>ˌЫT>Dːˈ!>D^&2DY>ˌЫ S>Cːˈc!PZ>C'2CPF12FQ~QYQPcZVQ2AQQ  Q=NZRUR1>FhSЫT>DhT2Q2WQWU W2GWQWQRUQV ֫QV1s0\"ռ ԫЫЫP [Ь$Ь , 8Ы R>@6:SLH?PP QA81^P(<P|1RмP@È1RмP@Ì1RмP@Ð1RмPQ@ؽ }½HkV@Øk1RмPQ@Ô½ }½HkV@ÔkxRмP@0h.PPP>@cT> X޼\P9P{RмP@,,~PPP>@cT> X޼\PP?R> h޼l`IP> x޼|޼ˈpPR ЫP[ЬЬ  $Ь,8޼@>D<P޼L>P>XH޼`>d> h\J[Ь<HЬP\Ы$R`- h%ЫSxЫTˈ ЫU˘ЫV˨Ы WԼռ Ѽ ռ#м PQռ XH\XՈPQռѼ Ѽռ޼˼>˸}1]>$7X>F>GTG>G2&>F>C&>C%>G>C%>C>E >EHѫ('`_޼˼>C˸1R$$#Ы$Ri81x4c޼B4޼ м B0мB,<B(ЫBȈЫBȌR$@Ы$RBxk>FP>DTLPVP>@P>FTL$.RPPY>Ih`\k>FP>IhTL$>Ihphr$>Ihˀxc$>CPVRPPZ>JhTLy$>Ihˌ>Jhː>D˔ˈ}Bˤ˜L$B(PP0B˴ˬEGGѫ,0F, Fѫ,޼˼>C˸1>Dѫ,޼˼>D˸1>DP(ѫ(,9>R$Ы$RP, R$"Ы$Rѫ,޼˼>D˸"Լ`R$W VUTSt[мP@3PPP>@3 5H) UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x|#PPмQPA6мQA6kAn6PԼռ мP@-3[PP$Ь ޫP/( >8޼<0!PЫP ,[Ь$04<Ы RLЫS\ЫTlЫU>ˀ2V>D˄>Eˈ| E>E˔ˌ!>Dˠ>Bˤ˜!>B˴ˬEˠ>Bˤ˜%!>B޼˼KPѫ%4޼>B#1޼ <"~^'^31<Dм P@Pм P@P>޼  46޼>B1gѼ ԫ>B$V PPP>@f( @ . PPP>@f4V PPP>@f8>C<0,>CLDPSW>GT޼XPPXX6޼ /4c޼>G1м PЫ@м PX@fм P@,d`)м XHPPHм XH,d`м XPHм X<"Hм XH м XHѼh м XPHƌԼ4UTR S<x[Ь Ь  ,޼4>8> <0&P1޼D>H@P>XPs11R PPPkQA4/'RP kS> `\PTUR TGUPU>C.Q UPRBURRPPTTPP'C.> h>C.ldyUSP'@.5UPPRRTTRR> hUSS«S>C.ld6ﴚ[Ь   (ЫRмP@A. \.RPPP>@ .`X8S޼pB1tl>Pk kRЫP[Ь>~^,޼ 0$P [-RмP@޼XP1мP@QSQSQSSS@ мP@bѼѼSѼ Q м [@@Q>A@~^SSSS~^ '?^мP@$ ?kkЫP [Ь$ЫR>,(ߦ޼<8 P^H@>^ѫ 1RPЫRv.1Ѽ <SѼ  <@Sм S`R?SSƫSūSpp&.>Ы B+мB+kB+ЫB+B+B+ЫB+RRЫP<[Ь $ЫR>Si_TTDcn)>Dc84P2D P P0 P9P>DcH>B6+LD"PU(>Dc\XPS>B+d`SPUURЫP﬛[Ь>cPR>,(KPCR2BPP P0P9ԫ(><޼DRk8O PԼԫЫP|x[Ь$Ь , 8ЫR > @P)VLP$իUPPR@1)>\XPP 1 P(8Hl1U мPR@ƈ1U мPR@ƌ1U мPR@Ɛ1UмPvS@Ƙ`#мQPAƐ1UмQvSAƔ`мQPAƐkU мQRA0Y> l.QQQ>AfphԫAU мPR@,%> l~PPP>@fphԫ Uԫ}SkRЫP[Ь>P޼$>( qP ԫЫP<[ЬЬ$0ЫR4MP'T>CTL>C`\9>`\P޼h>lRdЫRP>|tI)1мP@PPPQQQQUURBRURQQQQP>ˈˀK)1RUB  BRPRURPRU>@Q UP>Cː>B˔>C`\uP^˘ˌ^=BѼ  'B'B$/B<>ː>B@˔>`\./nPPn^˘ˌ6^ BĞBĠ4DRS[>Ok,sOk ,T>UAeAe@d@d.PSPQ@d>@USPPPSSD 1Cd>C`> d\J> plPd2VWGVRP2GQQVGG@#PW@#> x>B#|tP D W.CdDi RL[ռ.Ѽ(ϼ #+'! ЫPPzPPRRмR{RPPPP PPPЖ[oPükЫP[Ь ,>,RмP@b @b ּм}½H мP>@b40.PFмP@b_ @bA@bZ@ba@bzּë1мPQ@b-QQ@b+ּмP@b0ּ| p7WW'мP@b0мP@b9мP@bGּWXмP@b0@b9ּXf7@b:JּG|YWGe"YP0GSmSTaTPYWdYXP"~VPPdPY`Y 1cмYIb.bּWмYIb0 ּXW'мYIb0мYIb9мYIbGXּWмYIb0Ib9ּGWXYYѼԫ1|kP@e"kV0@SmSTaTVkPXXp"~PdPkмXԫмP>@bD@a P ּ>P޼TLPXԫYYXYXX& ë2ekX`X իݫp"~ٟdP r ëЫP<Д[Ь>RмP@b @b ּмS@bIp>@b{ P_мP@ 0 мP@ 9IмP@ A мP@ Z/мP@ a мP@ zЏ YмPQ@b-QQּPмTDb0Db9 PU0DbT2TTTUPּQ P P SЫP [ЬЬ  $>RмP@b @b ּмS2@bT>$UT"T'zVּWмP2@bXaX\/мP2@XXT 0>,޼0(b2XXTּPPVXFeVW`VTмW2GbWW  W W <W\>,޼0( 2WּVWFeVTFeSЫP [ЬмRѼAѼZ Rq½H1Rg1sRf1gRe1[s!jP>D޼ H<PS$j~^P>T޼ XL^PS>T:CdSS 1}PPjPUnUUcUPURhZd7UjUWW 0CdSS 1W^P>CdTS PP~^XLp^SP:@dPSS 1nWWbWUe7UkjkUU 0CdSS qռ+U^P>CdTS UU~^XL^PS(>CddS TT~^h޼l\ ^PSS SPмTTTPT/gR~$>(޼ ,޼0޼8R B PSЫP[Pp[Ь  PP@Ь(ޫ$PК>HD#@P>@X>\kPݼ nPPn^`T^PЫPh[Ь PPDЬ,ޫ(P`>LH?kPм QQPPQQPPPkP>@\>`X-PЫPd[Ь>PQмRB` B` ּмSTB`-TTB`+ּмRмUUUԼ мVF`cF`QQ0Q9 0QV2VV1U GQA QZ QQaQz$QW2WVVVUU WVW ּTμ ѼRS3QB ѼQbּQX Ѽ QxּRQЫPX[ЬЬ(м PQ>(Rռ )S>C(ST>DTc QPQм QAм ЫP[Ь޼>޼ aPЫP[ЬЬ$>,>8޼ <(PЫP[Ь Ь ,>4>80PЫP l[м RѼ )ScPPPPcR k2BPļPPkգkcPУQPANRccP2BRRPPkc [YPѼ@ Ѽ@3@k yP@R lRaмPȏ[k:8 k$HVf UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x7̏[< PP м PPRR~^ |^Pp kQPмA'PRPAмAQQk [ЬЬ(Ь0<>S@c @c PPTUV>D@?PkW>(XFb1>FbL>DcPHPUPP PVQAQQQ Q@hPܴ@hkVP@b@b W+UԫWUVFbFW1xUЫP[Ь Ь ,>40tPR>,S>TR L8RPQPU>EU2VFPQP@c2@cQAPAP6P@c+@cQRUVUW>GWQP UVPԫЫPd[ЬP>QR>BRԫ P PЫP([ЬP>QR>BRA Z P[Ь Ь ,>4>80PЫP<[ЬЬ(м PQռ =>RS>CST>D(TU2Uԫ PQԫЫP[ЬЬ$P>$Q>RS>CST@aTT@a  PЫP[ЬP>QR>BRa z P[Ь޼P>Q( @ZPRPPBaBa@ZPR@Z޼($﬎[Ь>>޼(>,$`A[޼޼޼ k<޼޼ 4>@W,޼ $ 6P~^0(^t[M?P8PP[!ke4[Ь!PPмPP޼ >$ [kl?޼޼޼ P,8[ռ9޼ ޼PkSC?ѫ DԼ8[мP2@ЫP [ЬЬ$>,>0޼ 4(  [ЬЬ(м PQ>(Rռ %S>C(ST>DTcPQм P@[ЬPQ>AQP PЫP[Ь>RмP@b @b ּмS@b' TּTмP@b\rмQAhּмP>@bxP @ ּBмP@b0@b9>(޼,$k TмP@b ּ\ мP@b @b ּT' T мP@b'ּSЫPD[PѼм Q2AQQPQQ>Ѽ мQ2AQPQQ%мQ2AQQPм Q2AQQPPQPPЫP$[Ь$0}kkмΫѼAѼZ PѼgPPPsPPV мWWW мPPPWq½H><4^P1DVPPQQWWQЫ XXXY ZZ'XZY ZPYYի Y,WYի  ZWXXZZXXRë WRPRѼfXX Ы XPXWX)ѫYԫի PQЫZYZЫWWѼf>PѫPPYPRRPPRRQYQZW RRQЫZ WYZЫWYYQQYQQYYQQΫ~P"~lDPVPP`kPqP f"P֫ ZRSSRRSSZ$Z>0SZ *JcZJcЫ1Zի>Re"PSjSUnUXcXSP0UUZR>0ZV-RfBj.BRVVFBjRVEBjRVVRի  -BjRΫ >Bj\RVV~^`TR ^PR19ѫ UPP@BjRPЫPP  0BjRPռ.BjRPPW 0BjRP1ի O5Wѫ 1Bj0Bj.BRPΫ VPVW0BjRWPP* PP @BjRPռ.BjRVPVW@BjPRVRRBj0R"P WV«VPVPW 0BjRPBjRЫP ﴊ[ RѼ ֢ b1ռ Ԣ b1ѼѢ kqѼ բb`kѼGSPS>C˦4SPP~^8,0^SP @˦@˨8޼ <0P1(м R p UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xмPPP$QQPPQPPQQPPTPռPPUUG޼D@ÀPVռݏ@^TVL^^PV޼\XPSмVP> QzVW{TWWWWXWXUXWSWXXT TXSSPX  0XWW@a7XX@aTVPRUS PRP1@aռ PRP-@aPRUUP2EaS@aEaS@aPUBRSkЫP H[Ь Ь(4RԫSмT> U>4V2DePP 1;De13ЫWPXX# 1X$12DPP >@޼D8$1X%1 >@޼D8>@޼D81X*mRWT'2BfPPP P>@޼D8>h޼lR d P1X? 1X[1>P>T޼XTkLOkTP1"1X^-T>@޼D8 ^1X{ S1X}SnS!DeADeZ >@޼D8 De\&>ˀTk|kTP DeTDe>@޼D8< WRT1>@޼D8 2DeTT ѫ  ЫP [Ь Ь ,ЫRP@,k>4><0PR3k>SkP@c >4><0PRkRk RkSSԫRЫP&[Ь Ь ,м PQ>,Rռ S>C,SPQQ PSP0>TU>EUQV>F,VSQWe WPSм QAм ЫP\[ЬЬ(PQ k>(S^QkT>UV>FV1sTWkXHc182HcYY#Ge Ge W1Y? Ge W1Y{ P1Y}P1HcYY\H XHcY3Y$+H%Ge GeT WGe׼1GeZWP{ZA0ZZ)YAYZ YZh ZRYRYBZa1Zz*YaYz YZ1 ZRYR! YZ YZ X1HcT WWQGe TԫЫP<[ЬRѼ>޼ Pw>Sռ-RμPмPT PQT QUUPU0UUDQPT,R >,޼ 0$4PDBcRTдBcRЫP[k/޼޼޼  PЫP[Ѽ  PPR޼ kļPPPRR~^[/^ѫ޼ (޼,޼0 iPԫЫP[޼޼ @R@.RkPPQPQQ RЫPT[޼޼ ޼ м@޼$PkkPЫP<<[ЬЬ $ 0RмS>T>0UCe1CeISRSЫkkP@d>8> @4PëkPPBBkS>L> TSHP7RB2BRRԫ6BRBBQ2Q> `\PS1>üЫP 糖[ЬЬ$ּ>RмP@b^ ּ >0޼ 4޼8(мS>0޼ 4޼8(l>D޼H>L޼ P޼T<SPPPC$мSCb]ԫЫP t[Ь>RмP2@bP PSS GAS  ((8888#kkмSCR2RkkkЫPH[ЬЬ  $>R>$SмP@b8мQAcмTD1Ac1ԫ1мQAc мT@bD ּ1uԫ1mT2AcQ Q0Q +Q '?s1+мQAT18x~11мP@b %>@b,> 0~^4(^PT1мP>@b,> 0~^4(q^PT1TTP@b @b T1мP@b TpмP@b TaѼTUмP@bPPA PZ PмQPAT*мQAbQQa Qz QмPQ@TT TԫЫP[Ь P>QPPRмSSRRS@aCaP мS R>T>>޼ ޼$RSSP8[޼kS,[Ь UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xaPPмPP>zѼ  ޼ ($[Ь  PPHЬ0ޫ,P4zR> SBc0 Bc9RRk">PL>d޼ h\ 1WBc Bc RPBcBc  Bc@VPR@VlsP1|"ːˠt˰ѫ1ի ѫ 1>P1kP@ @ PR>DcT PP~^^PT)DcTRBc$19>PL>d޼ h\$[Ь>$ P!RмP@ \\P@4 ]k@,QA,@0>4~^8(;^\P@QAD@H@-\P@QAT@X>\P![ЬмP@Ѽ ּռ ݼp"~wdP:sԼ.q> d"׼q f"ּ<P[Ь PP<Ь$ޫ Pw>RP>QST>DTd2UQUUQSzQS{dSSS2CﺇPPyPSSgSPPQAb@} PQAb/@f=%>@^D>H޼ L@~P12C7PP1S>D>H޼ L@Yq>T>X޼ \P k2>D>H޼ L@[q>h>ldkP@0ЫP\[k$RüRPzPP{ PPPPP PPR޼akRPRRRЫP<$[ЬЬ$>$R>Sм P2@cQQ1@c1@c\C>,޼ 0(P м P@c׼ >@޼D޼H8:1>м P@c-">@cP>T޼X޼\L1Ѽ м P@ ->@޼D޼H81мP@Tм P@UTATZUAUZ0T0T9 U0U9Ta{TztUamUzfTU-TU>@޼D޼H8S.TU>@޼D޼H8#ּ ->@޼D޼H8ּ 1[ ~[Ь>Pм Q2A`QRQ S>CSQRԫЫP ~[ЬЬ(>Rԫ1xPQS>CSc2TPTTPQzPP{dPPPPS׃T2CUVWUdUdXXd[XPPQAb@PQAb/@=(>@g0>4,NPԫ1HV2HPPdX& XX!8PH\ dXUHHgHXUU>X>E\T8PU=EU>h>EldQQPPQQQH2HWWUkФ  CtdP >0>4, VЫP}[Ь Ь(48@Ы R_S>BXPPRT>d>Dh`mPT=DT"DT>t>DxRTPP~^|p9^PT"DT DTDTToD`>B˄ˀPŝ￝TkːkTP&D履ˤˠ D8XT8HR  |[мkм ռ޼`P1Ѽ  R(kPPR޼40PSSR~^D@`\SSիhtPR>B`\pëPSP5PRP>@tˌ>Bjː(MPk~^˔ˈ g^˘sPԫЫP|[ЬЬ$P>QR>BRS>C$SԫTTTPЫPD|[мм gh﬛~^,#g^޼40g޼D@ kkP4|[мP@p1@f޼k Ѽ ޼ M{[ЬмP@@ >޼ h|{[ݜRмP@ 0мP@SbPQb TӄQSPQSbb@1bSCCмP@CŏAP>@ŏASP>@ xCTUT8 SSP P>@$V PUP P>@$,>f0(:VTU^ ݬ ݬݬ5,^ݬݬ.^ݬݬ ݬݬ^ݬݬ ݬݬ^ݼ79Av UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xPRռQƏQQQ8PԢ8լЬ( "RЬ$ R^ݼ8PR ЬP``PRѢzԼPѢ<"^мPP-53P?P< ݬ ݬ.P< <  Δ^T@YERdЬSS4P WWV1SXSP`P`! `PX PP`X 3S3Ui߭߭ݭ6P <~:X߭߭P߭.APWWVV|ߢ͕cߤ͕ei͕>cP߭߭3P͕=CPߢ͕cߤ͕e͕=߭߭c߭ݭ;V1'V^SxSP@P`1PSV@VW W?PSxSP@P`xSQAUVeAUWeAP`SS t^3R߭X߭<~ݭJ$P?tݭ'ߢ*t2?߭ߢMߢLߢCZ=P*ݬ ݬtݬ߭MPPP?߭ߢaߢ]ߢX=Pݬ ݬtݬ߭P|4^_RTߢkݬ8PVVPT1V~VI8P1mU1SPV  ֭  #SN5߭eP@Pߢm5cP0ߢo5cPݬ5cPTP5߭ePTV~V7P1jVw7TP5߭P1ߢq51P|ЬSS߭PPݬ߭pPPߢsS0P ݬ S&0ߢzݬ0P ݬݬݬX7PPP5߭ P1]P<^мRb b  Rb b ЬPQbUU: U*U? Q[PUTU OU JU EU:@U*;U?6PQSQS PbSS S S S: S*S?̔`RQP|^_TмUЬVxURBS2c~c<PfBRcb 2b~J<PfxUUERb<^UмSЬTxSP@Qм RRa<߭H߭߭߭]ReeŸeRTxSP@P2`~;PQPQQQxSP@PR`xSP@P`QRQTR߭߭߭<^LRxSCUм TTe߭&<߭߭߭<߭߭߭b¸bTݬCP2`~U>Pee<߭߭߭C<߭߭߭- ^5SRѼPP ߣ|9мbb¸^OQЬRxP@P`bbb^мPP?PԼ < <@  ^޼PްP`^ݬ޼PްP`^ݬ ݬ޼PްP`^ݬݬ ݬ޼PްP`^ݬݬݬ ݬ޼PްP`^ݬݬݬݬ ݬ޼PްP`^ݬݬݬݬݬ ݬ޼PްP`^ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ(ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP ` ^ﱔT Ь SSЬRRݬ"ccSb5PCdPRk߭<߭ѭKPCdѼ7PC.߭<߭CPyѭC߭Ь RR#bbP^SЬTd.P ЬP``PdRBc BcaBcBP.ՠ ݬ߭?0ݬB-Bݬݬ]#^ЬRb8.PT ЬP``PbP@@RѢ `Т$ ЬSTPcczcPcccP<"ЭPP PQP AЭԢ â ѭ м ߭ݬТ P@* Э^YЬTdg-PV ЬRbbPdTDUХ SRռ aެWXBh  S5Х(S"ЬTVPddS ЬP``PS SQS3BARR S м ^ݬݬ<" ^ԭЬSc,PR ЬP``PcP@ﵑPѠ ݬ߭?S,<QQx QQ<PďPPQ<PPQQ<^ЬSc?,PT Ь RbbP|ccԼ P߭ݬ!PѼѼ%CP<`R <RRխԼ PUDeSЬRb b  Rb b RQa@a:a],ЬPbPSP`PbPS`ìPTTQaЬTTݬ ЬUU=dݬ UU.#dT>DePbPSP`PbPS`ìPRR ^ݬqPSS Ь P``PмPP-ME?PSԼ ޼ RݬPbPSԼ P޼ RݬPbPS |P^V(P|ݬHPݭ P(X PP̟PPP?<~?<~^T\SRRf RT SfRTfP fBdSd(ЬRRUT:bUTT Ь Qa a  Qa a a a.SQRbKЬP`'`]PRbìPRRR.`P`PRb]]`ìPRRЬRbRba.mQP`.dR b.]bìRPPRRЬQa[ PQa[QTQPQ0`TT]aìQTTRT.dЬ P`RSP`P`RS]bìRSS^ݬh߭P߭xݬ~Pa߭P߭3PR;ݬPR+~NP~PRRWRHЬR(Pbb ~PPݬPhռ^YTVRSPݬŏ\SP@UPSSPbߤPPbŏ\SP@PX^WUݬ PSSP@PX~ZS P2PXZP~ZS PVP~ZS P1ߧZP1ŏ\VRBRRPRZRR~P1ZTTTPTR`"P"ŏ\VTDQЏOPaa"QPaa"aVJ~ZS P!XZP S PS P<^ЬQЬP׬ SSSASZ STSTTUSSASZ STPSTTRURP׬ P ^ЬP`$`RRARZ RSPRSS`P` ^ЬP`&P`RRaRz RSPRSS`P` ^߭x޼R߭O Pb޼RPb^Rbb<~ b^Ь^ЬQxPPa^ݬ ݬЬRR%xbPPb^xPPݬ߭D^޼Qa Ь P``PaЬRR߭QP Լ Эb A*3%0A^sĈ|$JnSY(Ұ㜖yc^ yVGD]Ŧ"Ŗ'ːkL  PTwJPl%؊!Sbmy / a9Ro~Ʒaj.Q<4Fχx1u>Td9l#v ;,A"QDͦ9c÷Yĵ8UF|OcnҭB{r7V$xQl {J'<Å]exS js,Uym3"-2tK:fZc^(D1V9_)|BaKͧnF,"E>ND73菂jZ?5K;9)0ota9FTB73Jwiw`>YUo' FVF\hEE{X% +9O=H;m eBfzNx?Vjmb=xmlUT(ZiT_c+ג gt 3,4L:bkTJ~ԂS_zO+u{_X/bO:2_w2 'suA^ "~O|Bϋ1B?4רuHWuA2u j{KJ=bBb|nNK<!'8X=}ОZD{[~<>1ܿ <`qy!gfCs[i) `IVbaO~UXLz psރ.jVŷ L]65"(R*zG7jvbx6Q rds/;چ4O]sg wli$1C m#Ӳ:灎9+Xs񔇃i̘ 5:l}3Ne׬Yy/HexF 7kcu;sB p]/ǩ+}5oőӹhbUK] vw}|8NFe&R_K ѽp#q1dVkwڧYOA[G7 b w< @VXnU8~CVzz>)57r GeyO5:^v?L{_MAj/Cܩu0߻"$T&H;U&XRLiwWOu7~uH=[{Sܦ&>'08Gn\Cf@ W8uh=HvԐ%2#yW(P{\J|7$h!z1@0{}W%֯G2w/- =<޿3Ĵΰ``צ| Ѧy9#\~U~3G4D\CWXj*(70򚗼SI*'s;h[t oY5RT1}ז?CcB7n ]%݇N,K TBY#-i0u}9+4h̒!؄:s~H@x{m%CAp$wd=:g)!IKoYp+ }2SQV>J:)$$Fd5q g,])#Dwcf |ηL!ITWvL׋Q ==Q#otyC"cJ36GTF+[Dm2WİJBcXP^%,vzӢ}es!i?UBD2\WBB1}O^<+yw2"ξ:1g9^6$ ps  GҐI!~mF㨊pgRxfhZœYnu]%Itc*Z^=޵! Zӑb!.-\7:(0r QT1u/%Obe6v=aZeoʣP*#7b/Mᚙԓʽ IǛ^pPj,/rQjtONM#Bh '*οLm6jV~}VD:Z@֥&'N݂?`BРi,;@& ʤDflKM`six ^Ys |x9o0d5,uܬ ~G BlTľKȔB:[6lȌjbl(jna˕[23I#YzK5?ܭ<{eZdF֐bѓǁ;Љ-!.Zo_,De~f| KNrVRy3y5C͛W"XRG0O Is i9v⿷? 94\RF*:7=݌t&SѦ,k3o~lJpD͸,Hc]Z\&a$I5jZDE's/łz6MsjR J ䷫2j^%`2zO2aܴDw@qU_1itX歟DE(["-5-w7[ +3ă=M1G|&nφ7~\nnA"nP@sT?XGńӕ4C\312/6g%oV|\֮s~ o͙}00UprB9]Vmf?G~,0(wZNE=[)dH'6fbGe/STAuv7W[R@[OuG\BDnC |Y8;{extQ&cx iC3%RRPLtT,^P,s+6?ˋƌ󠥔`bH:gg/s$"wH4ڒg-}'#Q/=_\uαe.Z!`/P⼳ky M5ʡ6l6]Ko2<,gT?`C'[N_;}[W'O$;ҁ-9$ٓ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xVR^мQQ ЬP``PQн ЬP``P߭߭PPԼ<X^g|Rb7PUqߢ YTdPS?S<~ 2PPSߢSdPSݬSdPSߢSdY]PYUjU,@^ЬRxbPPݬ ݬ߭ xPPb<^ЬUeR Ь P``PЬTdݬ UT{dP`S Ь P``PSRRSЬ RRU߭LbSݭdRTlЭdb ^լ IPЬ SSSRPԭ߭ЏPRRS:cTݬPRP2P@Rb RP`Rb_ RP`_PRRݬUP^aRߢ ݬݬR^IC UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x"aRߢݬݬ5^aRߢ'ݬ^naRߢ9ݬh0^ݬeݬ XݬP԰Ь|߭߭P P1PP^ݬݬPPP ^ukScPPxPQARbЬbARЬbPPPFP^(kRbPЬP PFPPxPP@QaP@P`P^jR׬xP@Qa@P`߭`PPԭЭP^jR\Px\P@P`\\Fb8 ^_SݬLPRլ;PPRPP~R|~?ݬP2PPRcRߣ6PR#PRR$ ^ lRЬbЬЬ ݬߢz߭߭0 Pѭ_߭J^k\PPQլP!P1lPP)9?.?Pݬݬ  P߭߬S߭̏1N^lPxPRlPRP^ݬPrPP߭߭ЭP ^Ь߭߭LЭPά^ЬPPRPRRЬ ߭߭ͬ߭խPͬPЬQR3RЬP^]X2ݬxhxݬxxx)P`xPMRЬ PVެWVg3b/PPUPT!TʏTS!SxSQQTTeVVgbӔ`VP߭ߨ߭ݬ߭ Rbߨ ߭bݬ߭bߨ߭bެVfݬ ߭PUUQЬ QRUf*P%ˏPS!SSxPS!SSUUfP۔bxgUP^#\Rݬ߭"ߢ߭Oݬ߭B߭߭|Ψ^[Vͨߦ߭߭ͨ5 խPЬTͨRԭRSRPTRTQbc P֭왁߭߭ͨ߭&߭߭dSլ 1߭߭ͨ߭ խnͨU2URRNRPP /GGGG3GCGGC P?PPS'SSS P޼T3UCdSS 1y޼TCdSRަQͨPSS S߭߭߭߭ͨ߭4߭߭r ͨ߭߭ͨ߭ ߭߭ RRSPSSP<Ψ^$ZTͨߤ%߭߭ͨ խPЬUͨRԭRSRPURUQbc֭왁߭߭ͨ߭v ߭߭߭߭ P^ЬSݬݬݬ&PPЬRRP`b]PSRRP`b]ЬTd.STPSb RSb]SЬ QSb PRSbbP<^fURRScP0s!ЬRPSzRP{ PQP0PTTc RSP|^Ь RЬUЬVUVVUUQVPRPRBeQBfPRqpR^ŏ߭^ t^SXSݬtL߭߭tt.խݬ tЬRR8 P@bPߣ/ݬPPߣ8t߭߭ttխݬ tЬRR P@bPP^2~P ^Ѭ ~P|~|~ݬ ݬ|~߭12~ PQQ P1X1PPR UP2RSS7߭SPѭߤGSs18<~PX2X~PRRPPRUP1߭SPRSRߤaAX1P2Rgݬ ScPPݬ 2VUU>RbP1ݬcPPݬUbP1ݬcPPݬUbPlUP ߤwMCsRRUPb RR2V~gPbs{PUPX ݼ*2V~ P^U|~?PP PP|~|~ݬݬ|~߭22~ PQQ KRCYScߢ xcP~;?PP Ь P``P2P@2QQQ Pcݬ1Pbݬ2PP <^(PrCЬݬP0RPRRP<^UYUмRCPR ЏTPRTTS SPďPPee|~SR$^ ЬЬԭ|~߭ݬP PP^XS߭ RBЬRbRЬRRݭ?P-R УR֣RTcRcRTTݭ?P2QЬPA`PRb0Rb0RݬݬѬP1h̰ޭ||~߭ʟ|~ P 12^HVWTЬQa a  Qa a aԼPP`` ` PP`S6߭߭<dc!4ݬSS&߭߭<9ƃ,dGP ЬRbbPЬR R-P % Fv UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x$0ݬ P PRЬ R RPW0P ƎRPW PhRWЬU UP 9P ƙU?P hRWR UWhƣWP ЬRbbP߭<KխAƮߤ'PߤPߤļQP1 UЭRBB@ߤePeߤPߤļP1ePļP1RcbPc!S PSRcbbP8ѭPļoP1(\P\ļEP1PļP1ЭRBLxPЭRBLļP1oFPoļPv2!P2ļPQݬ~RWRƻe߭߭<мP 0߭߭<VЬRbbP< ^DT=SR<~ߢ¸ P1@X ߢUeP1˜ߢ„ePV˜P@~ļP˜P@˜P@ЬSS{ʏc1]œߢeP1GߢPߢݬ1+PԼPYЬSccP^Pݭݬ6Э P ^AQPRB$RMqrP<м[=<[4<[+<["<[<[<[<[-XЬYx[Z(@hi@YZʏ[([hi<[*<[#<[<[<[<[<[[ ZЬXЬYXY Z(ZhiЏ[XYZZ[([hi[X[Y[ZZXZYZZ[[X[Y([hi[Z^ҼPPP^PPP2PP^ҼPPP<^T޼S>DcRT޼ SDcQP!PQUQ2SST STTeP [Ь}PQP<Pм QQPPQQVQWXW'Q>AY2QXVQ~XP@WXV ,n  ,V <,[}PQPЬ<Pм QQPPQPR>SQ&T>DTRUEUUd2UU RPQR@[ЬЬ$P1P 1P 3OkOO1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(E1޼,޼0޼ 4(an޼,޼0޼ 4(}R޼,޼0޼ 4(6޼,޼0޼ 4(޼,޼0޼ 4(޼<޼D ~^L86^ɼP^P2PP^ɼP|^ЬVЬUм PUTURVSVQ3cd P 3Pr^ЬSЬRS PQм PQPQTPTTQAbQP @c@bP^ЬRм TDbP޼SDcQPR PpqPR[ЬЬ$м PPQ>AQPRB$R2qrP [ЬЬ(м PQռ R~BRSC(SjPQ [ЬЬ(м PQռ RBRSC(SЂPQ[ЬЬ$޼,޼0޼ 4( [ЬЬ(м PQռ RBRSC(SJPQ[ЬЬ$м PPQ>AQPRB$R2qrP^ЬRм T>DbP޼SDcQPR1P @FORRTLHCUISSHRLIBRTLLIBRTL2MTHRTLUISSHRUISDISP~UISDISP¹¹ ¹¹¹ ' B¹ 9`% BLINKBUTT` BLINKBUTTQEXPLAINEXPLAIN5SIZE_RGBSIZE_RGB  ^ N MAKE_MENU( MAKE_MENUW  MENUBUTTMENUBUTT POINTINȮPOINTINGPOINTOUTPOINTOUT> MYL PMYL F NEED_INPUT NEED_INPUT`*{ KEYSTRIKE KEYSTRIKE:  START_SWEEP START_SWEEP1' SET_SWEEP SET_SWEEP& DISPLAYOPT DISPLAYOPT  RESET_IMAGE RESET_IMAGE ENABLE_BUTTONSENABLE_BUTTONSE"BUTTONS`BUTTONS5jDELETE_BUTTONS̷DELETE_BUTTONS + CHOOSE_CURS CHOOSE_CURS6 GEN_COLOR GEN_COLOR=SHRINKERSHRINKERR  H BUFFERREAD] UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x4E BUFFERREAD ?EXPANDEREXPANDER34 CLOSER 4CLOSER   COPY TCOPY  ZOOMP ԽZOOMP1 SIZE_IRAFt SIZE_IRAF~   * c5 READ_IRAF READ_IRAF> , ISUMSQ ISUMSQ G RSUMSQ RSUMSQ G SCALE_ARRAYh SCALE_ARRAY¹  3  SIZE_FITS SIZE_FITS   READ_FITS READ_FITS?  READDK READDK2 z BYTSWP lBYTSWPL MULTI_MENU MULTI_MENUi MMBUTT $MMBUTT 1 MPTIN XMPTIN G MPTOUT MPTOUT >NEWCONVNEWCONVuLUTPOINTXLUTPOINT SET_LUTtSET_LUTĹ/Љ  卦[ MOD_LUTMOD_LUT¹ &ù ` 9   H 'READ_RGBREAD_RGBw.PRINT_IT(PRINT_ITĹ  ʬ  SNAP_IRAF SNAP_IRAFGRAPHICS\ GRAPHICS¹2 ù y UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xL _¹ ?   > Xo CHANGE_FONT  CHANGE_FONTp  @!  5! CHANGE_SIZE|# CHANGE_SIZEdy CHANGE_LINE% CHANGE_LINE]#p TRANS h(TRANS MARKER 8)MARKER/p IMAKWC )IMAKWC  IMCLOS *IMCLOS IMCREA \+IMCREAD IMDELE +IMDELE: IMEMSG l-IMEMSGƹ t r p #n &l /d 2b 5` 8^ )n ,l ;^ >\ AZ DX GV JT MǹR PP SN VL YJ \H _F bD eB h@ k> q9 t7 n> $ z4 / - ,+ }5 w)q IMFGPE 1IMFGPE-b IMFLSH D3IMFLSH IMGKWC 3IMGKWC IMGS2R 4IMGS2R4b IMGS2S 5IMGS2S.+ IMGSIZ $7IMGSIZl IMGSTR 7IMGSTR IMOPEN d8IMOPEN4 IMPL2S 8IMPL2S IMSETM d9IMSETM f IMSETP 9IMSETP* BFCLOS 9BFCLOSq BFFLSH l:BFFLSH  BFREAD :BFREAD$ BFWRIT ;BFWRIT% IDBFID <IDBFIDn#f IDBGEG ?IDBGEGo4 Q # '  +  IMASTR AIMASTR o IMCREX |AIMCREX{/T IMFUPR EIMFUPR IMGDIX \FIMGDIX D IMOPNX FIMOPNXI+# IMPSTR IIMPSTR-G IMWPHR KIMWPHR BFALCX KBFALCX8 BFFILL KBFFILL! UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x,GS BFOPNX LBFOPNX) IDBKWP MIDBKWP(! IDBNAS NIDBNAS'   IDBPUG OIDBPUG -2 b 5 : ?  IMACCF QIMACCFL IMADDF \QIMADDF3 IMDINT ,SIMDINT L IMFINS xSIMFINS3R IMFPAE TIMFPAE=4 BFMODE VBFMODE&  Q IMFALN TVIMFALN , CLKTIE VCLKTIE  CTOD VCTOD K CTOI XYCTOI-  CTOWRD `ZCTOWRDI 9 DTOC [DTOCO 1 ERRCOE ]ERRCOE  FNLDIR ]FNLDIR n FNROOT ^FNROOTt GCTOL ^GCTOLQ  ) " GSTRCY _GSTRCYj LTOC $`LTOC 4 PATMAE X`PATMAE ? PATMAH `PATMAH : SALLOC `SALLOC! SFREE daSFREEm SMARK aSMARK+ STKMKG bSTKMKGx STRDIC xbSTRDIC@ STRIDS cSTRIDS,  STRIDX DdSTRIDXM STRLWR dSTRLWRI STRMAH dSTRMAH : STRNCP eSTRNCPp STRNE eSTRNEe STRUPR eSTRUPRI SYSERS @fSYSERS n SYSPAC fSYSPAC9 XCALLC fXCALLC c XERPOP PgXERPOP ! XERPSH tgXERPSH $ XERROR gXERROR O XMALLC gXMALLC= XMFREE (hXMFREEH XSIZEF phXSIZEF  XSTRCT hXSTRCT7 XSTRCY hXSTRCY] XSTRLN iXSTRLN 9 CCTOC \iCCTOC> COERCE XjCOERCEk DTOC3 jDTOC3¹_H/gi`:K vMO1"jr(.ķ{0ԋ 򨭻 gv+._؂Y;Kl*w](8Y}W8WϏٖ+ןL9 (BT5<%.zpw@iO#+ Z`4Y!VGI~KlO4~{Rxz57ʕvd^]eb;HK*FUbP8@q,k)p}I|Av;{ob瞧|ug{ӳd ]x$Zin`%DZ[ъx$)f٣p>sJ3j]OU&~aqO1]^NNcq7{bag8j9,7g sǾ?!zFV˷'͟gW4 L+ |Mb-Qf܁TtƷVŋy" 9{Ff/;6i-I֟XG`dMi^a h nK#ps4G'^ :i::hάf%-Mz˕ m0>r.CAMmew=D{SoZQk!̳ 3h@F>DP{9$F.(^T:ZP0>^ NF&O Y;è|-"堫G@Xl9H9utBi!M?}r&{u ͥdW^_eKU2[ičBPP1{bcXG1GŎpo þR5bo fA\([MІnD`]>JJEΌX@m{ʎPc̳ YT;1 xЉU^a}+`Ġ56R󨎀YJ'R$ECi*@G9 ,P ›t񩿰!Q;TZ.Tay'eׄM!Ա1BͿy=MɿFb#m-|[2_ :ȝ˘$;] 3HҬQ^I_q&-7jG㔖9Z531u()BPyl\q } [(Bu20=lAdu >#$D@sX#{^$LU*И.kS&$7';\'Yޣ1EvyFa(cP$$BqfH]Q>b*Xsb˥qC1ou q>7T%(vJ/)+aEeK_vSqL=xh*u}4 *}{^ d#t719lobۜfe^@,$ ~7meyU^HnvK9@Eij 3߾Z^"W3WOī;˷gn[Ui6jb劾A ]VYr $U/^J7bbEaX^r1y=|;I1:Sb 3Oթ]@1L> KtO׻|7 tHDPh=WorUҾe:;͇=XsTA&,m)k^\?Jntj*\Y8x* KXxis?LtGySXQs7x炜(Ppj~ pkpO5L,=\k2٩QmF6QoKFE.MOuN(BñL?3g + Hm>K|Zn )*;e|u:5 .ntC;8Ⱦi[W@s^2S;A w{T9H[L ǐIQ@:CXiϋا}ނa+~UiMlk:BNdE'^"0xNKaW' |~77]P2&Gtjݪ)ϵ6}m--a}%Id :fǽ`N+U˿9MB-9lq[EwQ[VA8w˜gR.ul%EjrDx8t~xQ7l}/} 9.҃\D'b=Ipfp9DvF˺)A6._+x:([ͭ (< _"%N?c#I+]0o~o>07|L5WPz'Q-a-E\*mpdʭY8X SG5Ebz'=ro_Y^!BaP+AK*d{[ ?'qHu8V6Hu"u=Lr^v}Gw-)5{t~Wrv$ȥT{̐מkZ}Q r'y:"2k!eA$HaERqML ,v.}2iZ?G3g{l^g};ܙ{m\K~ #V 7J :%  GPATMH sGPATMH GSTRCT tGSTRCT GSTRMH uGSTRMHQ K &G +E . ITOC vITOC+ KMALLC wKMALLC 4 MALLO1 wMALLO1{ MGTFWA XxMGTFWAZ MSVFWA xMSVFWA B PATAMH xPATAMH1  PATGEL yPATGEL PATGSE zPATGSE9      PATOMH H{PATOMH> b \ W O J E @ 7 .9 PATSTS L}PATSTS  SYSERR }SYSERR XERACT }XERACT Z XERFMG L~XERFMG_ D 4) XERPUE XERPUE  CHDEPT CHDEPT ) DTCSCL DTCSCLU ENVFID dENVFID9h MGDPTR ̂MGDPTRT PATFIT PATFIT@  PATLOE PATLOEL ENVPUS @ENVPUSI# KIENVT KIENVT.+ C5 KREALC $KREALC/!) STREQ PSTREQe KISEND KISEND Z KSAWAT KSAWATM KSAWRE dKSAWRE > KIERRR KIERRR  ZFIOBF zopnbf zclsbf zardbf ֋zawrbf_read_write_bfg XzawtbfV zsttbfO e ZFIOKS zopnks ks_getlogin ks_scanloginS ks_getword zclsksO Ezardks zawrkspr_onsigF zawtks* 0zsttks9 #FY^ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x8a     U ZCALL lzcall0 }zcall1 zcall2 zcall3 ”zcall4 ߔzcall5 zcall6# "zcall7& Hzcall8) qzcall9, lG ZFIOTX zopntx izclstx zgettx zputtx bzflstx uznottxq zsektx9 zstttxN  ZSVJMP ZDOJMP mZSVJMPm$CODE ZFACSS zfacssЛ_access '^   ZFALOC Мzfaloc М9  ZFDELE ؝zfdele1 ؝ ZFNBRK zfnbrk $ ! ZFPATH zfpath ! ZFPROT zfprot}  _check_prot _set_prot *m ZFSUBD zfsubdp K ZGTENV $zgtenv8 _ev_scanirafh _ev_loadcache. _ev_streqi _lower_case2ɦ _upper_case4 $ D ZGTIME zgtime/   ZGTPID 0zgtpid) 0  ZLOCPR \zlocpr \ ZLOCVA hzlocva h ZMALOC |zmaloc! zmfree_zmalocC_zmfreeL |? ZPANIC Hzpanic H ZRALOC zraloc+_zraloc _movbT : ZXWHEN zxwhen}i_exception_handler! zxgmesl_setup_control_c]S_control_c_astE ʹE OPEN _open _close6 _readT 8_write4 tCONVTIMEl _convtimeO !lDIRNAMEWP UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x^h_dirname . BUFFER_get_fio_bufferS_free_fio_buffer. ! GETJPI8_getjpiD 8  ZFINFO |zfinfo~_get_device_info _make_uicHA _make_octalS _uic2unameH  |   RMSܷ _rms_openmI _rms_closeg _rms_flushG _rms_filesize} t_osfnV ܷ   ZOPCPR 8zopcpr zclcpr[ zintpr_prinit-¿_prfind(_prtimep Z_prastt_prexitN 8ֹ   STR gSTRCAT STRCHR STRCMP -STRCPY STRLENSTRNCATSTRNCMPGSTRNCPY(STRRCHRT_STRCPYp_STRPAK_STRUPK$CODESTRDESC_strdesc$ _strdesc_l TRANLOG_tranlog _createlog _createjoblog _deletelog/ _deletejoblogI _mklognamg _dellognam: Co FD _zmake_fdM9_zchk_fdB{ _zclear_fd= _zinit_fd4 *= ZERROR_zerror  EXIT _exit_inits _exit_handler 7RMSDATA RMSDATAT HTONS htons   KUTILku_fopen> ku_fclose"ku_fgets` ku_gpasswdo ku_initpasswdI:ku_promptnoecho ku_ttyput ku_mkfnameku_itocD\ku_bcopyDku_sleepku_error ku_mapdir    A TCPCLOSE tcp_close TCPREADtcp_readR  REXEC tcp_rexec| lz SOCKETd tcp_socketzdTCPWRITE tcp_write艪 UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5x8oW ZFIOPR 8ZOPNPR> vZCLSPRs zardprI 2zawrprI{_mem_ioX zawtpr2 zsttprHM _ipc_abort-z_sm_nameK_log_ipc 8   ZFIOTY zopnty zclstyO zgetty zputtyK %zflsty2 Wznotty `zsekty izsttty@ չ    ZFCHDR zfchdr azfgcwd_valid_dirname? & F  ZWMSEC \zwmsecV \ GETDVI_getdviF  PROCNAME _proc_name  2  ZOSCMD zoscmd _read_output _control_c_new_dclR _start_dcl _stop_dclD6 _mbx_open[ _mbx_close _mbx_write0 _mbx_readA     A QIO _zqiocw_zflushM _astio9 .c ACCEPT tcp_accept"CONNECT tcp_connectE GHOSTBYNMtcp_gethostbynamea3GHOSTENTP tcp_ghostent ] tcp_ophnt/ tcp_clhnt tcp_locate1 jPaGSOCKNM tcp_gsocknameR  HOSTDB0 tcp_hostdbO 0 INETADDR tcp_inetaddrV LISTEN tcp_listenG  HTONL \htonl0\ ACHTSR ACHTSR ? ACLR ACLRB ACLRC ACLRD ACLRI ACLRL ACLRR ACLRS ACLRXACLRDATA@$CODEu AMOV @AMOVC cAMOVD NAMOVI UAMOVL \AMOVR GAMOVS jAMOVX@$CODE AND andi ands andl  CHRPAK chrpakH  F77PAK XF77PAK~ F77UPK F77Ug=Ӆ UISDISP.BCK[SHARP.UISEXP]UISDISP33.EXE;5xRvPK h MIIPA2 @MIIPA2:$   _ OR ori ors orl  STRPAK strpak4  STRUPK strupkB  ACHTBL @achtbl) @  ACHTCL lACHTCL ? ACHTDL ACHTDL H ACHTIL ACHTIL H ACHTLL <ACHTLL7 ACHTRL tACHTRL H ACHTSL ACHTSL ? ACHTUL achtulP  ACHTXL LACHTXL K BSWAP2 bswap2;  BSWAP4 bswap4\  *[SHARP.UISEXP]UISDISP41.EXE;5+,./9 4-0123 KPWO564QD7mW8 L9G9HJ0DX0205(D~hL9 UISDISP4101D05-02  .$! R:WO 8 I ?B!d FORRTL_001!! HCUISSHR_001! LIBRTL_001 ;!  LIBRTL2_001! MTHRTL_001! UISSHR_001@@ ***ERROR*** you MUST have UIS software version 3.0 or laterImpossible to continueChange log. scale ()SYS$WORKSTATION***ERROR*** Intensity scale less than 4-bitsMain_LUTPanic stop !Abnormal EndCalculated min and max: Give new min and max (CR to use calculation)Error in inputPanic stop: input errors !WNormal terminationDisplay OptionsBlink OptionsClick hereQuitFasterSlowerNew image choicesCurrent minimum size: pixels, cmsEnter new value in pixels (takes effect on next read)Currently reserving indicesNew number to reserve (CR to leave the same) ?Too big ! Try againPan optionCursor is centreCursor is BLCZoom optionZoom inZoom outUISDISP-E-Notposs, cannot re-scale RGB encodingDynamic rangeCurrent min and max: Give new min and maxCurrent setting: Give new LOGSCALE value (<=999.9)CursorsResetSnap mini-menuSnap setupGive integer rangeInput error: please repeatUISDISP-E-SNAP, error creating SNAPped imageGive name of UIS-format file (CR tgG UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5o exit)Error writing file ))Minimum window size=Currently reserving  LUT indices) ))))))))))Change to logarithmic scalingDTABER0G03CK00GG0001UZZZZ02A000Change to linear scalingSame pattern, one colorSame pattern, two colorUse RENDER (qv) on this file?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATIONArray data type not readable: type Array is not 2D, NAXIS: Give x1,x2, y1,y2 or CR for full imageMis-match: needxRead error: please repeatInput error: please repeatSize bigger than screen !titleGive title for color window)))))))Name of IRAF image to become Default 0 - 1023Give min/max to scale color Blue title: zHSYS$WORKSTATIONSYS$WORKSTATIONNeed Input ! W  AAUIS$FILL_PATTERNSSYS$WORKSTATIONDD@@?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATIONRequested cursor number out of range@ A"A\@}?@?@3@33 @L@̌CC@L?\DD@4CD+@@@@̠@f@ff> ?(IRAF_LOGOUIS$FILL_PATTERNSDTABER0003WK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000IRAFDisplaySYS$WORKSTATIONUISDISP-W-LOGONOTREAD, virtual memory error - logo file not readPZoom/pan Name of IRAF image to display (in VMS format)Array data type is not readable: type Array is not 2D, NAXIS: titleGive x1,x2, y1,y2 or CR for full imageError: please repeatSize x bigger than screen !)))))ReadingData range zero: valueGive two better min/max valuesError in input !Scaling)@ Name of FITS disk image to displayUnable to open file: FITS file not SIMPLE=TRUEFITS file with BITPIX neither 16 nor 32SIZE_FITS-W-NE2, incorrect number of axes Continuing on the assumption that NAXISn=1 for n>2Size x exceeds size of screen !))     ))))@ ReadingError reading disk filePremature end of file encountered)L>zHSYS$WORKSTATIONChoose a LUTRead file if it exists: create/write it if notGive the (VMS) filename for the LUT (CR to exit)Error reading LUT from file: Please check that this is a valid UISDISP LUT fileUnknown error writing LUT to file: This is NOT a valid UISDISP LUT file, and should be deleted< GreyQuit RainbowContrast/pos.Start/intensityRandomMethod 1Method 2VariationFancyTheta/NrotLin/NrotTheta/WhiteLin/WhiteTheta/VividLin/VividNrot/WhiteNrot/VividTheta/LinWhite/VividUniformRGBR->G->BB->G->RGreyscale VLft/Rt. slopeV apexRGB encode@ in RED imageQuitTerminal + fileTerminalAppend if file exists, create if notEnter filename to receive these valuesPosition outside image - try again ! Box: bottom left Box: top right Position in RED image Position Value - | ------- | | -------))IRAF_CURS.OUTIRAF_DUMP.OUT@titleUIS SNAP: redUIS SNAP: greenUIS SNAP: blueUIS display SNAPSnapVMS root name for SNAP (will add r,g or b: CR to stop)Name of IRAF SNAP image (VMS format: CR to stop) @UISDISP-E-Noroom, all graphics slots fullGraphics full!GraphicsWrite Text Enter the textTextAcceptPutJ  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 hereRejectGive starting (image) coordinatesIs this OK ? (Answer Yes, No, or Move)Error in input - try againGive file with x,y (odd lines) and text (even lines)Unable to open Error reading from file !Is this OK ? (Answer Yes or No)Draw LineLineBegin/endGive four (image) coordinates (x1,y1, x2,y2)Error in inputs - try againGive file with (x1,y1,x2,y2) linesGraphics styleEnter new angle (currently deg.)Give VMS filename for graphics settings (CR to exit)FWHSLCAMUnable to create file Error during write to file Further choicesVMS filename containing graphics (CR to exit)FWHSLCAMTDPBfwhslcamtdpbError opening file Give file containing pixel positions (CR to exit)Give file with box ranges, x1,x2, y1,y2 (CR to exit)QuitDeleteNext piece))))) )(SAVE: to restore see "Read from file")SYS$WORKSTATIONClick here (font)FontsAbortView nextSelectSYS$FONT:D*.VWS$VAFONT]:.WDEUISPATDVWSVT0ADWYSINDWYSISSYS$WORKSTATIONClick here (size)SelectIncreaseDecreaseSYS$WORKSTATIONLine widthSelectIncreaseDecreaseLine styleNew choicePick your ownEnter 8 Hex digits defining new styleError in input - try again)P ?error writing into pixel file during image createcannot create or allocate space for pixel fileerror closing image header fileerror closing image pixel filecannot create imagecannot delete imageattempt to delete a nonexistent imagecannot rename imageattempt to rename a nonexistent imageerror flushing buffered data to pixel filecannot read command line stringillegal imfort image descriptornonexistent command line argument referencednonexistent header keyword referencedcommand line argument cannot be decoded as a numberattempt to access a non-image file as an imageimfort short integer i/o requires a type short imagecannot open imagecannot open pixel fileimage pixel type must be short or realerror reading image pixel fileerror updating image header fileimage header modified but image was opened read onlyerror writing to image header fileerror writing image pixel fileimage x coordinates out of range or out of orderimage y coordinates out of rangeimage z coordinates out of rangewrong number of axes on imagelength of each image axis must be .ge. 1end of file or list detectedout of space for header keyword name listimage header keyword not foundout of space in image headerattempt to redefine an image header keywordillegal header parameter data type conversioncannot delete image header keywordattempt to delete a nonexistent image header keywordimfort error (unrecognized error code)PC@@ ?g? O? OC j ?O?ED? f =  <P<::]< A@@ P`D ,, UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5LLX $host : reenter password or type ctrl/c [JPI$_UIC lookup failed]logindir.irafhostsirafdevhostloginr:*:?kernel server process has diedIRAFsys$library:iraf.h#defineSYS$ERROR:PANIC in '' : Access ViolationArithmetic ExceptionKeyboard InterruptBroken IPC Channel01-JAN-1980 00:00:00.00000000].dir.dir.DIR.dir.EXE.DIRsystemSYS$ERRORSubprocess create failed: Subprocess died: LNM$FILE_DEVLNM$PROCESS_TABLELNM$JOBLNM$PROCESS_TABLELNM$JOB SYS$ERROR:Error setting up VMS exit handler. $Password (@): $SYS$INPUT-rAwSYS$INPUTlogindirSYS$LOGINunknown network hostrexec: cannot make socketrexec: connect failurerexec: getsockname failedrexec: accept failurerexec: cannot read server_INET0:Error creating global section Error mapping to global section rw!XL.!ULSYS$ERRORread 0000 bytes from IPC wrote 0000 bytes to IPC dev$ttyTT:-rAw+rAw=rDwSYS$DISKSYS$DISKDEFINE/NOLOG SYS$INPUT DEFINE/NOLOG SYS$OUTPUT DEFINE/NOLOG SYS$ERROR DEASSIGN SYS$INPUTDEASSIGN SYS$OUTPUTDEASSIGN SYS$ERRORSYS$INPUTSYS$OUTPUTSYS$ERRORSYS$OUTPUTSET DEFAULT 13579BDFDCL Subprocess create failed: DCL Subprocess create failed: SET NOVERIFYSET NOONSYS$ERRORDEFINE/NOLOG SYS$COMMAND DEFINE/NOLOG TT DCL mailbox create fails: _INET0:r# rirafdevuhosts/etc/hostsconnection failed hostiraftmp/* ###(%  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 ^D'!XL_C_!UL!XL_D_!UL!XL_DCL!!WRITE SYS$OUTPUT "!!"SAVESTAT = $STATUSSHOW SYMBOL SAVESTAT SAVESTAT = "%X%SYSTEM-F-NOLOGNAM, no logical name match)SET MESSAGE /FACILITY /IDENTIFICATION /SEVERITY /TEXTSET MESSAGE /NOFACILITY /NOIDENTIFICATION /NOSEVERITY /NOTEXT''' ((0(@@f@ff@@@@@ag UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5u!Cursor read Dump a region Corners of box Dynamic range options Read in a new image New image setup Zoom (in or out) Pan (non-interactive) Reset zoom and/or pan Reset Look-Up Table Interactively change LUT Graphics overlay menu Change cursor pattern Blink options Snap (screen->IRAF image) 3 images->RGB Hard copy of picture "+" cross "+" cross with central hole "x" cross "x" cross with central hole box with central "+" sign :-) face :-( face solid arrow left outline arrow left solid arrow right outline arrow right Same pattern, two color Reset pan only Reset zoom only Reset both pan and zoom Use current LUT Use current min/max Include LUT wedge Read IRAF images Minimum window size= Reserve 0 LUT indices RGB 1 (more range) Fresh (greyscale) LUT Calculate min/max from image nh kAѝZ Ij Z[F$9JTV;1IA^ v1<*?biIJ)ULxb)ɬ-nɇ-3rZ+͛F=}xg@d]`Uε?( g q_DQ).$͝lDbw0V#63b!L`ґ,Kun܀Cxp 4%3Y^{Җ^ƃ$ l!B#0,+@UE:Kk Nc}>⤣5\BKAܔ_OJގSҎV \ywjL]][sϒ:u:^PW\Ѻkt蠒OZ2@9!O v hcx-b W1(|՜TM␃nЯ6tLBK Ԍ>/=u& '.> d .+y_;xnUCLЉjMz-' OG*Bĥ^CV-yJvFCgCֆRt$$9O9 .e#l)@{_L'jn3pxpK]5}#eumNu0 7|n _FIFyjϺaBU,ot:Q|D ^f碅NlJt$7PINn7(wsCx K(R snUfjxD$T%)V6e鮣92uVC.Фa%]y5ܡOU2IRCEo({Sb db;Fݒy{܅ 3+ZgA|"d*|elai,D}3wgnө9h2^XDVw0kXU)UiaᷴQMUi?v b}ceto8g;gk.)ߗSjh SXXzkl)d ߑ?Ϻ|Mۨ~vZS|[i;u3`5E k hbӜ3no&7w7b- XeH7œ/B)F9@_xGD %vU>#DT D,k>sq`Pډ$ }!V[W6?2k4>#cz \X$S+dj'%sUA^drh*e9Nbmk M`^yIǍZRirr#nÔ jٜHfFfui/m:]CfUo&pw/Sa\hdAqb=;s|q0 J&P T:dHDUXu1ؒ [҈sv9wf`ߣKH:`xG]ҒUW ZfBUs5"rA '] ̾@,Z{#R)iwpo֜)}]6C3|2X#6<dp:ZZ`~ofb$0xUw*:>IKT 0Fk>ϐאO0>P28$ox~݇ ;uQ=0Y nR1Ӿf ~l] 5*N݊`{-.o9 ud8M*fy3nނ17&0pcq rE8\.ɇؿqX*+9zw\8Aߦ:n{X"L*[nRaBWBHv oR~l)ט#c!1mUwUp+htщ}8t~Œo$hƴB\2!ob.̙? hu5E62l 6!ztBa*n,[JwAOZ7W]t](()-kBLZ0z$8F܅=깠M(y`IaQX\Fσ3I IoN5ȹ ߢ&pes<2wSdtוѾX1qb;//zfޫ ᄐ**pjx}tGQ!V-|~S(){䂶afёW6㕧_D}lO )_};a:KW2WF4pZ]K@n@V` /(Ę[hn:ϝo'wU Pe!K>aSrc'Ds@OVTS!w[,kfmSN* I3itip'kaqHs~r@CU*m5> Jȳ'.EZWm G dG[7[2Fӂj*/P >M+Ty5+b,'\ۺtN'{ qmQ(65=|_vxf2UNtZ'G瓙ɒ!OV |֞#\z*jN<@ AA* %ިTB

 UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5Dg/ 4ac|;4a$! <$<<<4aTdX\``dh(DaHaLaHaTaXaPa\aHaLabHabb  ` `Pa\a(Daha8hala,88bebpa; 888`$!;Pa|aaha8 ;888bbI Pa|aahalafp; !g`` !8$! <$<<<8$!`T<T@TD88 8888T<T@TD`$!`a` 8gg``t88aa8 8|88 8887(c8770c877h877(,877$877877 88ew88ab0i8halaha8TaXa 88bi8 8888aaaaaa8a8a8aaa8aaa8aaa8a8  aaaaa a(k0k``  88dklktk|kaaaa aa8`a`8t`a ` 88$pb$;;;l 588bdlbpa;2.:88blbpai8x8halaha8TaXa8 8888 88888 `8 8888 888880 `8 8888 88888`T<T@TD`$!`a` T<T@TD`$!`a | 88nnnn!88!8aa888 8888 888888aa 88oooo!88!8aa888 8888 888888/ 88cp88bpbpa;*!;88b4qbpa; 888`$!88888 8889 UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;568 88888]88,0b4r88``88aa``e88Pbr8888888 8888 88888k88b@s z 88b;<;`s88bsbpaaa8aT<T@TD`$! <$<<<`a88ba 8aaaaa 8aaaa8aT<T@TD`$! <$<<<`a88baaab,aa8 88888x88``8 8uu``t88aa``8 8|88 888 88888a8````a8aaa)88bvbpa8a8````a8aa0waa$$wwww !L(,w,,,l,0x,,4800<00@D00H8,$w,x0w(,x0w(,x0wxw|www @ywww RED GREENBLUE   PL:PyPz88zzz\zzXz`z`zztydz`z`zz`z#`z`z&88z8{z\z%&88z|{z\z?Y%^`z`z`zs{|z`z|zy88||z\zExit this menu DTABER0003WK00PG0001UZZZZ02A000 P||}}}T}X}}}}d}X}`h\}`}  T}T}X} !t  t  }t   t  tt ~tt tt ~t$ t~}T}X}T tx$ T}l tx$  T} l txx}ppt4 8 DTABER00NP UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5}=03WK00PG0001UZZZZ02A000DTABER0003WK00GG0001UZZZZ02A000P@DHLD D 8<8< !:< H p:H H H :< @ h:@ @ H :@ L H :@ @ @ :@ L P T LT :\8<; d hHL:@D d :@ D:@ :L :L X:H :H q :H 8s pPH;:::::< :::::::ЂԂ؂؂؂:| Ԃ:x $:x :x  :x XDTABER0003WK00PG0001UZZZZ02A000 p !      4   x  8! ! ! !  ! ! ! ! ! ! @ ! ! ! H ! ! ! P ! ! ȅX !` !!!@  @@  @@  @@  @884X0 00884X000 ?88>|>08p`9 D(("D???|>`|??? p8p@@0@ @ "D" $h A      8x8   ȋԋȋ ȋȋԋ̋ԋ̋ 8̋̋ԋЋԋЋ 8ЋЋԋ  !8 8 " 8 $8 8 8 8 8 4 8 ȍT 8 c UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5D8 8 t 8 , v 8 L  x 8 l  z 8 | 8    8̎l888؋l8.  88x8888t8 x PL:PP - 88xhTPXXp- 88p̑hT\4!XXpX& XB XZ H`X`h&` 88pthT       <:@:ВВؒؒĒȒ<:@:ВВؒؒĒȒ ؒ  P   88ؕؕ  ,    Ll UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;56KSIMPLEBITPIXNAXIS NAXIS1NAXIS2OBJECTBSCALEBZERO END  @ PP2( "* 88̢M "* 88ԢT̢l$ b '{ * 2 ܢ̢  @   LدHXT!kHDH@DExit this menu DTABER0003WK00PG0001UZZZZ02A000 P<ܲ  !       % UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5kR      `      Ĵ  Բ           < T B CHCpCCCC*D>DHD\DDDDD Greyscale Rainbow Random Fancy Uniform color RGB encode Greyscale V Save/Restore LUT    H4P 88<@DXXXX<@D ,048<<@D<@D.0,88 t 0  ` ]2z #; 8Vary theta/nrot or lin/nrot Vary theta/white or lin/white Vary theta/vivid or lin/vivid Vary nrot/white or nrot/vivid Vary theta/lin or white/vivid    ʺ8Ļ(-2288ļ̼Լ4- <J88 Z-aj88<DLT s88|8Ļ}- 88Ľ}-  88}-  88,4<D}-  88lt|}-  88ľ- <J88-88,4<D  - %88lt|88H88 88H8 $  ,048<8 $8 $8Ȼ$8Ի  LX UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5Y  0,Cursor positionDump a region Box (BLC/TRC)  P ]afv,4<D@7DH!!$& $lp<lptx< lplxtxtplp T ) 2 ) 2lp<tx< lplxtxtplp;;;;L P        P Pp0@8d00 0 40h|00Ll00 400000 Write text Draw line(s) Change style Read general file Read markers file Read boxes file Delete ALL graphics Delete some graphics Change text font Change text size Change character height Change character width Change text angle Change line width Change line styly UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5+`e Save current settings More options Use cursor Enter coordinates Read file Color white Mark positions One pixel dot Color black Don't mark cursor Three pixel dot Color red Five pixel dot Color green + with hole Color blue + sign Color yellow Three pixel box Five pixel box x with hole x sign 4PPPoL.<  JZ,*,  )88p88t 87(, 88x`884<88`hpx|!88!88887888!! 884p8878&/88V4p888p87`8888 88x` 88$,|8!888!888787888!,88pp8878883"N888pp878888q88@87887887p887x8788877$V8787p488   87 88xxl4(@x8770-88 XuP UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5ng M Z(877877(,877(,877877 8770877$8p87@8pp8788878pp 8 8877877(,877877 8770877$g1z8888884888788pp 88 88888 88|!88!88 8888ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+~`<>,./?;:'"\|[]{} <PTPP !LTTPTLTTPTT\l (!~  X!!hTTT Font size Char. heightChar. width See the 123 {male} foxes !?P<(, !(, (!  08@H!(,!(,>̌@AffFAffA33L@@ffL@@ffL@L?̙@L?̙@L?Click here (width)Click here (style)PtP,, ! $$ $$ ( $0  $0 8 bBŅqWK QGoT05 (|mlyBA`"<10UF0`?T5xd@Rd7 tSMT(NR> #YAD'20&\[D6x*erEF^JQTvnCNNKVHJYOOMME HMl;KğQARxoO!EE_.VDEOjx~(cO R_ SXDR6J'uKH۶XB@`(ChROZHVQyM[ENDlDO(3bvDDUE&D PE:P,~ДXDFIX2@$+@Q R|ACkO((KDlq :1V]#H|zA}r,!pjsitWdD*im|:no ifMQvT) ^LOCLitD~t= 8 riG6"$B.!e#x -! ! 0xCoR6s llj !*"%!) &" !  \ Sw! ! # M.!Uh3j!kxeFco $! ! J'$W! "! 9 +! +! U! ! `y! m V/!! 8+$! "Gwe%fy*.c \'/!V.!&c.!lJ! m.!=! ! U :.!|! .!D/!* .!u3 -!1eDY@LR?X7XkZINMXV>$̿ޅ?1'YJ_F>0+3A1 $i! IFLANo:8_cX_ĭGY{ALlwm.! 8U^lAVut"E/!! $&! "  L! Ƃ /![ ! " z! .!gl~g MdU 0gg 7"! !  PF.!/!F/!2! d! R o v! +  ! ! #lmzk!c=`pbs f+$! 1!2! B/!4 B#.!A.!2! A.!+$ {!3 /!.! 4/!Rang0-4:!! +$ !.! d=/!V(%/!/Y&q! Y!W/!\s/!z.!q.!.!/.cl/zj!8T Tagy.!b/"/!w  ] 3.$. !! \.!&$G.!k=!I/.$[bl؅!acs!  \*$d/$`!"{! u4.!J/!z/!.!_.!_! <.!lpM.,K{0scΨ 1O.DnB'" ejr. wXZB j8 O  mfdx E{}\(Fo! ɂ! /!! ! ! $j.!KH.!/' N$!! ʔ T! 0" &$a+ !$: & .!gv* ).! G,!= (" +$* .!".!' R.!n ! <1jeI-W;A@(hh.!" "$9.!#x!׭.!$!/!z/!F.!G! 9.!*g! v \XlGDUOD?=';VTAQII2OLIWHD]RYGDRFE|!#N>VIE{@cSM2J_Vm#U LDD`\XGDLxN~\LK]L//!# - y! < asgp enld SeplmM+"( .!/.!%%j/!T!-p u! /!x. ,. 4asߝ c,Sj_/ ! .!! b.! A/!$%@.! V&$ !L$!_. Y. nvcs |lx!b`j *$9L ` Q .! ,&(O+',& ) "d.!! wk`bl@k%Ccnm! 7.!k#'"(( \" ()"-!)! x+.!O rS.!U< |`n!mMߓ#sxY,e"$#>-H O |/!B ! %. ".!a qfOR Yh@RۯHD2FThYbG|GY/!]" .!g!!Pp/ `! q.!! $ .!E|.! !8/ K Y9(%%" #! !X_KDtz@L:?Fi|]v/[j" /4/>3)! q 1PkqE7: Jk<f("+7} @((jRg"s?|y2a_?M>́ 8W/^I.p@3D A 5D+PʢQ"!fuTh7meD( S( ( { !"u(!' 2)!' !!!!2 #$H! Y! kf r/!5NCە00fWKKN\Ff01rJZZ63A1 /8!"  C/!K! .!c`! J ȣ! "+$sy/!wM .!SGUdGHyCD] +$ !.!` .! v! J 9.!|+$.! !g!%1" C00 VK3}SG>0WZZy2A0 /! .! y/!! _@.!/!.!F ] ! ! e! $.!R! S' V'" GF2Ig23x mf͏ff܉{7ϫXI AwE#tzi7IE ETVcLּB6b  :"Ӭ! v  r`nO'vqTlen! I/.$HH *f!^!gndre!fbuc% K.!>!,/!ad0evErs1mm/! Z.!9 \d(C$c]dvil+ /!v,!/!Kme͕/@.c~i _! l "DezdѵalPhsiiy.!( i `nV$udz!o`u/!ŏ/!]/!CTBhLhddxriT7%! 0/!hP! aan@!cTsaz er(diu aY! @+Bhi.hdhat:luӍ!w+{i! ! an{!thu Bfl ..!'! BhLfeohnwii c s".!')$@^knudm$bAF]"  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5Wn(! HSZc ($,4<4 lS w  (dlt|4! ( ( ! $$ (% (80, $$$$9lB|B)?QQ 87 $ !@DHL<4< 888L ()48<(9.<HDR$  p    d`imhdr   XXX  9P x| ^{}[ =]  (,$      imh..piximhdr   $(,[ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5u400    4<48 84008imh.imhdr!   ($   ,impix 0408@D< HH tLt|PPTxX|ctime|mtime|limtime|datamin|datamax|naxis|pixfile|pixtype|title|naxis \`|d\i_naxisnaxis hl  thxpt   x|ximdirIMDIRHDR$8888<H@D<D|^imh|    $INDEFeEdD lxINDEF   -0 x`p  X\`  ݲ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5T|      salloc: bad datatype code Salloc underflow0 Out of memory         (             X X   L   Memory has been corrupted04      ntfr'"\ '"\  INDEF  Warning: || p|` | pINDEF    <HDHHPLD<      INDEF********** L <@<Memory has been corrupted  p       l$ In patsize: can't happen.9 UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 ( In omatch: can't happen.  , (  |0 iraflibsyserrmsg 8 8 8 8 8 4  8  \     L   Out of memory  L!P!< H L D @ < set   HLP T 4P X X=d @\ ` Dh Lh l l   =;p t X=x ;| ;   T                           VK UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5%'O[|R}PPPѫL&}|˄B|G|ˌl|2M3>2G41.ԫPTRȊP"H,o PpoP˔˘˔{˜{P"~{ˤ{{F˴ѫt'{s{x{{ëx\B<˼~Pމ~Pʉ̉(}PˀP}|i|˘}ˠȠƠ˨|(nq[ ] Q?=;$P!<mPNz<~z'z˄ˈ ˈmP zˈyyPˈPˌԫ  ƟğWˌ 1-zPPyːK > Z V[XjfPP˜fQQPPˠfPP˜fQQPPˠyPPeyhyPP($Ky,n P:ː8ˤ<˨@f~^Df~^H,xO^?ˤXˤ\˨`˨df~^hf~^lP@^tw-PC~ax|&x+x~ExL xx˄4x1ˬЧRSէPˠTSPNPPEDPQUNUUGUQ - !1`Ll˘ lilˠ rlNPGP~Wl˨ TlYl˸ !˼1c˼ ` Flll_P  lNkk*_Lk kk1b1 _Lk kˈbk kkpk ˼1ˈ˄G˼ `$ Vkˈk(k˄ˌPˈPˌˌ=^Lk( jj˄ˌPˈPˌ˄ˈ1d^P0 4 0 jˈjj1NyP`Р 4Р8K KN4N8РРSTV8 elH (mP jPP` \ jd jPPt p |j ԫ 1Fx ojPPˈ ˄ Vj1'XSVNˌ HlVNߏ~^˨ ۏҏPNP~^ˬ P^˴ ﴏ˼ ˔ l ^ˤ ˤ #~^ ~^ g^1: 11GXDSVN kVN<~^ 8/PNP~^ P^ $ 1l ^ˤ8 ˤ< ~^H r~^L ( f^1搜X留SVN\ kVN~^x PNP~^| P^˄ tˌ d k ^[ˤˠ ˤˤ ~^˰ Տ~^˴ ː @f^1 kJ1 S1$#D2hNPDPNgYGYPRNPDPGYPY.vPLvXTxv\F%hg1fuu up{iPPP TTTNCSDSNUCUSUBUNgQFQUNPPBUPJPPP$UNUUN\D\B\U@UFQUNTTBUTJTTTYuCNPUCRUXKX@RUKUUUNTUCYUXKX @YUKUUUJSNS@S\J\ NPNPPER\@\PKPPPNTPEY\B\PKPPP TDQN TDTQJQNpT@TQJQ ˸˄>TФˈˀ)VV K˔hVN)~^˰%PNP~^˴P^˼˜i ^BN~^Nދ~^ڋыPNP~^ﺋh ^gk1R$(!DesPLsXTxs\"he1ss sp'gPPP YYYNTDTNQCQTQBQNg\F\QNPPBQPJPPPâPNPPNQDQBQP@PF\PNYYBPYJYYY slg1gѧѧ NYGYTPN\CP\SKS@\PKPPPGYQYNPCYP\K\@PYKYYYrPѧ1ѧ 1gNgYFYTNPCTP\K\@PTKTTTFYQNYCQYTKT @YQKQQQ˸˄﷉RТˈˀg'VV L˔ fVN~^˰PNP~^˴P^˼w˜f ^CNj~^NV~^RIPNP~^2Rf ^~^PP~^e^k1y bbb1Y`q\PpY1pY1{l" UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5>p1/l:IVLqb,Fbݬ 4bݬ*b7b8VL7b4 bݬaݬaaDg˼1Bl9v˼``d`a߬ a߬aa7=˼h`lha߬ja߬`auaY1TULoapDaIa1Jzo;SЬHR,,U PpЫH,RU PpY1[6o1TL`x`ݫH``ˈ/˼1 ς˼ˤ`˨ˤ`߫H{``TP˴˸˴z`˼O`ݫH=`:`?`SЫHY1TL/`ˬ` `1BYˤˤ~^~^˸'+^k˸Щ"˸Щ ^#VV K bVN~^<PNP~^@P^HnP(b ^BNb~^dNN~^hJAPNP~^l*|TJb ^1ˈPYLY 1ѫTT,.S PPT,.S PPYPˠ`˴1Pl1wYl;gPЩ PЩ˸Щ!k1nlwçPNPPDPNA\D\CP\RJRRR@P\J\\\ç \N\\D\NPDPC\PRJRRR @\PJPPP˸ !xPNPPDPNʃ\D\C\PRJRRR@\PJPPP PNPPDPN\D\C\PRJRRR @\PJPPPg˸n !VV K,_VNM~^HI@PNP~^LP^T"\4B` ^BN~^pN~^tPNP~^xނˈ`_ ^1˔ P1˴974PE4PDlY41,n P˼N˼`5\ [$[[ $PNP +OL[ [[1z8(8Щ(5,~^[^PP$ [1_2,~^,([^PP84[1),n P<Щ@L<d1%~^˘!PP~^˜ˈ[^40P8PP<˴:[PP[1ŀ~^︀PP~^@j[^@,d@ZPPPLZTeP6PZ\ZZ5ZLYY,,~^hd]Z^PPtpAZ*~^|x1Z^PPˈ˄Z1YVNˌ\VN~^˨PNP~^ˬP^˴{˼˔\ ^b~jR[#$&U[[&̀N~^PNP~^m[^P~(D%[P [\[lYxY1~YVN˄ZVN~~^ˠ~~PNP~^ˤP^ˬk~˴ˌ[ ^R}˸ZNK~PE>PWRWCP$N6~PD>PRP (~~YNYYC Y(LZ7ZPPD>XPP!X1,-L P  ˼1HH<YHYYhLYYYxlYHˌ˼|`ˀ˄oWPPP˘˔WKL%W˜V˼ˤ`˨ˤVV1GˬOW1H︻[!eP`` PnO(k`kԠ` P נ` P= נHp[} PQP}PQ$P }PQ,P(}PQ4P0P P8YP޼d` X޼xtqW޼˔ːW޼˨ˤWd޼˼;W޼dW޼aW޼X޼$ X޼40X޼D@X޼XTX޼hdX޼xtX޼ˌˈyX޼˜˘jX޼ˬ˨KW޼˼˸@W~cPk A QAf@ffQCRQRCRCf@ffRS!CQAk A QQQCk `Ԡ޼9WP Ol[Ь kVC  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5-,n PVZW^(JKn^(Jn"<"W^@D W^`_dF thի |݇F ˌF˘ˈvիˠﰇF ˰ˬ1mFNFDI4S˸SFSSF 1ѫ BI4SWSݫ 9SRSF J1F4 F@,n P!XիFF4FF,F@F 1ϼ_RFRFRF,RF RRFFPPYPYYF4F,F YYPYPPF@VZF48 F@DFiH4ZR /R8RRDQR1,PH PY^(JKn^(AHn!$!Y^(,GY^իF PEF A\H_LHQFzQFlQuQVwNDPD#> P@@rPJPtw%P8P_wPPDP1 Y~^NPPC#> P~^bN ^ZWШ V FF^LR5W<XX^(Xn ~XX˰XW^˴˸ LW^LP5W< XX^(X$n ~XXXW^KW^KK J4$K@#KpLK`Hqplh_ptpxapYp (Sp,xpHˀJˈJHD[P`Pp\` l 1լ׬(P(PPRJPIѬ',JP4JP@IPWX ^( n@(޼,м P>@ҫ0>@4CO[^мDЬ,,ޫ(P|AмlЬ0TޫPPhAм˔Ь4|ޫxPSANPGPü PNPPGP üPNPC$м(Gм мWѼ 1üWPNPPE PXݫXgADPNQ@QPEPZS PYݼ X@ACPPEPYCYVEXP@PAP~^˜˘%A^CPUEUAP,AUDUCUUQURUD$UDP@PUDYU@VUEUZG8EXU@?U@UAU~^˨ˤ@^CPUEUAP@UDUCUUQURUD$UDP@PUDYU@VUEUZG`DX@*@X@XAX~^˴˰Z@^CPXEXAPa@XDXCXXQXRXD$XDP@PXDXY@YVEVZGۈWH[kA<=?ԫ$B*e\8>P1 "?k>߫>߫>>XZ?P1Ы hdЫ |t>APlˀ*?ˌ%?PfЫ ˜˘SЫ ˴˨A˸>>P3Ы Ы @>>1[>P >X>>`@@P d$,AH?d?x?ˌAˬA?@?$?8:?l@ˌ@ˬ@@@ ?P8?H[м$Ь ޫPS=u6ݼ #===HԹ[k?bbbP?qH[k?JKﴹ[м 0м8ЬޫP<м dмlЬHޫDP<мPQռ8 Sм TUռ #ūXQVū$QWWXH XVYITYTUPQO魯[^м <мDЬ ޫP3<м pмxЬTޫPP<˄j]ѫ1<JPPQNQQ:9WWNWWGWQk P&WW1WXXիѫ  WWYū0WZZJ,YZSﶽ1SVzV tNVQQQSQNQQNUFUQNUAUQxQUn=UXR3R-RUTNTTNNPFPTNWPAPTWīdRVRYB`QUZSyW"ˌ}HX[k`V8T`X޼h\yի pn1޼ˤˠwի˸m޼(k1HKHB:4 :9H99޼jCѫ R3 99ݫ }99޼j˄,n P1޼ysaW}PdիkPd(d`DH,n P`W,իЦ ЦslH`LH8ߧ8ߧ8ߧ 8ߧ88çPPQPQQç QQPQPP۱ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5fAԦַNPD#> P@u@PJPۤVXN^PPNPQNYGYQkPY%Ej޼޼Aqի  jмPQռūtYZSCSZRBpRЃPQ޼$޼( $f޼8><4;rի TiмPQռī@YR>BۤRYS>Cd޼h`tt{TE UEUUTCTTE TPF6$DCPU%DEPTATUDCPUTKTDDP@PUKUC޼˄ˀ5f H[м(Ьޫ P;5мPQռRMS@S DSS@SPQ HԶ[м(Ьޫ P4мPQռRЂS@S DSS@SPQO[^мˤмˬЬˈ˄P4мpмxЬTޫPP4м PPЬ(˼˸P`4BWQ gѧ1 g1g*#43ݧ33(33ݧ33'ի g9n $ 3ߧ u3ߧk3t375 (,(r3ߧ03ߧ&3;31-;30331VSAPAAP3 QNQQGPQACAAPGPkAAPNPPGPkBfA PNPPCaA`AQGQPk PNPP>A=AQNQQGQPk $PPЫѫ Ï@XSA1@1мռ1NPNQGQPëPYPPмYVռ1˘PWXVPYPPWPC@@۔PDkPм$ZD@P@PX2DPKPP$PZPZ$ XVQ$A`9ZXVQA`&Z XVQZA`ZXVQZA`YVgH.1мռ1NPNQGQPëPXPPмZXռ1ūdPVWXPXPPVP2@`P?PNPPDkPм$YD?P@PX1DPKPP$PYPY$ WXQ$A`9YWXQA`&Y WXQYA`YWXQYA`ZXcT.1X>1мVWռ1۔ZNWPNQGQPWPWPPмQYռ}˘PWRYSWSSPSC>CjSDkSKSS$SS$ RYT$Dh7SRYTDh&S RYTSDhSRYTSDhQY`LVWN1мWVռ1>`YNVPNZGZPVPVPPмZQռ1īdPVRQTVTTPT2DiT=TNTTDkTKTT$TT$RQS$Ch:TRQSCh&T RQSTChTRQSTChZQlxWVFռ 1N VNWFWVмWPռ1}QPRNRRDVRJRR$RR*м YZռ RSZXXPXSHaYZ.м ZSռ !RRRSYYPYRIaZSWPO[Ь  VSW}UXP0޼|l6ptx-P1.Ԩd޼ ޼iTŏPTUEp)\-8B-G-YYP)@1VYsW#OEp( -k,,k6((,,,޼,11EpY(,?Qw,,Q?Q 64((,[,`,޼ !,11rEp'8,?,#,A8,+2~++,++1Epu'+?++1EpM'+?n++1Ep*''x+0^+c+ PddZJ'ZdZdcEp&(+"P++7Ep&*O** V YV $TZV14u922Ч Чըd (d֨(Pd(d6}<`BS %.:2]dDz5<dhIj'0Hw+;+H?mcd(5U8 ; ɡ_7NJktR0N%L#Žkǧz٪[4'}D>#kP4 SH9$]֚09`u=5렮VaDE!JY kux cL]|o4k EQ wIAȑ/zBkj'A.i{=_lҦank gΜИbTMֱFxlw꫑p~ۘY,Uox_ǽfnt(շֆ%/LCH J̇ `eMD $ݝy5qٯ0>,exru 'knFcyLo$h xj*&% #SF9v }!)d-58SYq*!}`,W,Or>FiBS:ChδU==xom6Ħ#=帱}d1&A'J! Q*}ʝ;!Ņs,/tA=ǴD+ƻGI$]u^/Nc|K5(i4xW@'Ğ/AWTϜd8kOVtMQ 4 U>w, 7y lsn pȲq3W-z{̚0Kh#i4)R5iA`yێt7A#:u :;j?Au:;P^ӈ%0O`b"5W?ٷ{6@7EF{Eu"۔ͪ8~!+xnrl[1lL#uѨI/l3$(F#IpTWNe8u2LM`g?Ŧ(k B=0(ZmdL5K-_=89.d¢aS? 3e0ap+ ꅖOxtszC:YJ:/ `_C$_:QOZo/PqVf[mЩ ׫oO"wrG.` _F=`}yHvN],T>u:8ϾA8-՝#ș | Ow= dY|8;P.ëlw 4d&8RңG {yʼ0vF[ [3i(s?en/h*\XEK͓̎wc֐ҺTgtjgnjd ׽J*:@ܑzgS<}+$HƌᶌGH ʲˑ<`vY ]8Sv8[~~N'fxh]wpnghmBڔ7QAi:O瘲6!> 6x2cwDbGsA ` [Y;G$'*&\ڭMD 8.b 3P-C1arZ]N(vG|#AdR61IC`?-CWcW`jX-0rW3l3rǪ}ԴJ)5 4B"̚wǶOB4t pyZUR37K`aoD]e)S6};J%Բm㟽[vGV&5u1oq$pyQ#=;uzkcalZ(7mYyb 9{ 4l`7GDهiiAQ1M2u $'7ΕƸ ټ] cMp"~l/IX^<"(c)3.G[YgQqf5R PBRНGI B>ƘbWуgP75r8؝4)"( Md٩Қc E<0Cu4<*Ng363 ۠>xWϱ\mlw,Y,dm7l:⪚,v#ǃm֕GodZmwo{_r/qA@./g7=4l4@0`CveWKVϸ*&e(KKB\k.wǍCXw 䤴\”v,qy?I ^N(Tk@daFo>j~u P@u@PJP(((ѫ&$ː(''GS2C˾PNPPSL MC˾QEHPZAZQPSDLP@LPPIgXY4мXYռūPUPQAۀQPZJLZЁXY޼޼x7TUE UEUUSCSSE SP(CPU5DPAPU5޼$K[м 8Ь ޫP'м `ЬHޫDP 'Լ,VTRѼ*мPQռTS,TPQּϸ"ݼ&kc&hkl߫dh&e&kPPм QQPPQüQPPPSTSTUTWGSTQQ 1|Pk-мQSռPTDTTTUQSм RмWѼ &RR RRXG,YP^QRXSYT%,H[м(Ьޫ P%PPQPRSUUPQO[^}(PQPмTм\}PQ8P4ޫ4P:%м ˄ЬlޫhP)%м Ь$˼˸P%м ˬЬ ˔ːP$ԫм XPXY ~X^(X@nXWWZ ~ZZZY^&Y^1ЫWGGxG۠ZZx<4ūHZPPPV4FDHPXԭ찏 ~ Y~^4NPPC#> P~^<# ^VZЧVFF^XH\#^Чt?#ˌJ!۠Z޻xXVԧg˘˔gˠ˜xէPѧPѧˤ ˬ|#ѧЧP@fQQQQRR^˸@f˼˴!^ЧQPAfЧQRAhAjAf ЧQPAfЧQAfXXXA##ЧQPAçQQNQ~^ #^ЧP@f1X~^!^X! ! , VP^(Pn<4PūHXRRRP<4YY^(Y@DnPYZ ~ZZ@ZV^DHx"V^XVP^(Pn<4PīHXXXP<4XX^(X@DnPXZ ~ZZXZV^\`"V^p"1H[XNkH:H[9Ѽ(мP@ kj!Hl[P@ޝk=!˝ʝ￝H[PޫQCaPADPCPE(PA@rPQJQQQQRNRRBRPDA|PAAPk޼ ޼ ޼޼޼$!Hd[ekO@[мhЬPޫLPмːЬxޫtPм˸Ь ˠ˜PsPNPPGPk ϼB~>FPмPԼϼOмPռ8\QYIۄYZJ۬ZUNUUDkUUUUPPNPPDPNBQDQPNQFQPJP$Bvi UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5«BPNPPDPJP1b PмYռaP@\ZP@ۄUP@۬XPNPPEkPQEDQDPDkPA?P ފޅވhYUNUUDUNBXDXUNXFXUJUlAAUNUUDUJUW1Џp S W2SмUռoP@\XP@ۄYP@۬Z(EDP0 DPA?P 8PވPމTފX@UN9AUDUJU滋酪 1P PNUE?UPP޼`޼h~^p޼ˈ޼ˌ޼ ː\#^N@PDPJP@@PNPPDPJP 1](ﺚ(Pǫ(PXū(XPPYXPNPPGPZYPNPPGPPYQQ7\RSCۄSWG۬WVNVVDPVVVVQPRի(1RPXPQYQV&3PQNQQDL?QA?Q RQQQQRQNQQD@QCQNPPDL?PA?P XWWOVP@\SVP@ۄTVP@۬UPNPPDZPEDPރˤބ˨ޅˬ˔W(RDN6?RDRJR輪-?$?RNRRDRJR1PP мRռJ\XYIۄYZJ۬ZVNVVEkVވމފ˰cRRNRRDRN>XDXRNXFXRJR>|>RNRRDRJR1=޻\RPۄXP۬YPZPZ;\VSCۄSTD۬TPUNUUDkU@UUCUUUUUZPмPѫ>ЫSC\SЫTDۄTЫVF۬VZZZNZZDkZ@ZZZZZPмPP@bмPP@hмPP@iPNPPDPN=YDYPNYFYPJPPNPPGPR1#ի<<۬YۄX޻\RSP1`` cߣߣߣ ߣߣߣxߣn߼Xmύω bмTT4P@\V߆'ЫP@hЫP@i T ޼˜޼ˠ޼ˤ޼˨޼ ˬ˔ST<\`\dlVЫ<(,0>P1 ac(ݣݣݣ ݣ ݣݣݣݼbr мSS5P@\T߄ЫP@hЫP@iSL^tl<|ˀ|UZu˄:?ˌO,[^м˸Ьˠ˜P=мЬP&мЬ P ::PNPPGPIAN9QGQEIAQNQQGQGP E $E* E*(NPEPQE?Q,D PE?P0 @D,FHǏFPďFPPEHǫHLūHLPPPëPPPTϼ#7KS\Џ X1A˜Џ@ X1-Џd X1ЏX8RPUA #/;L@1ˌ31'1 1L1ˌЏ0X1\\Pǫ\P`ū\`PPdN\PGP(`PNPPGP,dPNPPGP0PPPhЏX wЏ$X,@c 7UNLH۰Y>DLަPަTD@ի4 d8м PQռ -XRTS>C۰SRZJZMWB8WEHWPQX мXVռ1[|RSTYˀ$ZVQ+QQQPP@cUUPPQPUUPPkTQPP@cUUPPQPUUPPYQPAcPPPQQQPPQQpQL? QL?)N PC67QDQPPPQQNP@PQJQQt/EPB@PJPPPPCL?̫UF?UJUUUPīPEUB@UJUUūUPGD UNWDWU tWPWNWW@WUJUQQ ZVUQEbQZVUQEbXVˌv$bVP@`Tބ˜˘v3Vռ1N`W?Jg,UR?Jg1~˸UzRqz˘4PP0Z۔WJg[d,{U.R%Jg+4RC`SQ0XX«X2ЉXX ԦԦPQu~IW|Ы ˀx7W|Ы ˀxs~W$ˌЫ ːˈ7kW`$ˌЫ ːˈda@~sH_41Oh[^Ьp|}DPQtPpм`м hЬDޫ@Pм ˤЬˌˈPм ЬPм Ь˴˰Pм$Ь(Pм$DЬ,,(Pм$lЬ0TPPмDм HѼH,6 P,0 P,n ptW޼<ˌ޼@ːˈիѼH1OXr~«^(`nЫZZYYˤYX^˨ˬ&X^ի (Xr~«^(`nЫZZYYYX^E3X^ի <(1Ud_$Xg~«^(`nЫZZYY(YX^,0%X^իHH'T"%Xr~«^(`nЫZZYY`YX^dh%X^1Xg~«^(`nЫZZYYtYX^x|m2X^իIːd'˜$Xr~«^(`nЫZZYY˨YX^ˬ˰`%X^1BdK#Xb~«^(`nЫZZYYYX^$X^ի1 & $Xr~«^(`nЫZZYY$YX^(,$X^8#Xg~«^(`nЫZZYYDYX^HL$X^1oXb~«^(`#X) UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5GnЫZZYYXYX^\`1X^ի1t &ˀL#Xr~«^(`nЫZZYYˌYX^ː˔ $X^ˠ#Xg~«^(`nЫZZYYˬYX^˰˴#X^1d!,n ptr`J#ի L%1e` $*0ի 8$%1=,n ptdLP\=!|Dм ռ 1$ PëP$NPN QGQPkмPQռ1]UYWūTXXTDPTVVV$1>|ZѼHQE4FSKSS8SSAjVSE4C8SKSS8SQRSBjVRE4B`RKRR8RSQSRCj?E?FSVRE@= B8R@RSVRE>GB`R@RSD4SKSS8SSAj1¼$VVۘSѼHGE4FcRKRR8RRA|E4FiRKRR8RQZRJ|E4FgZKZZ8ZRQRZB|3E?FcSE@= FiR@RSE>GFgV@VSD4SKSS8SSA|PQѼH_>|T>ˌ˄t.мP>@ˠ˘`.P>@˴ˬK.Ы,PP0Ы0PPQQ4Ы4QQ>.ի"ѼHIի "ի "(ի 4x"@ի L]"Kа[\VoWXѬ 8LQDPP$'PR<R/ [\PRSVR1U˄Pի R+hhxѨѨ Ѩ ԨԨ ԨѨS֬ #1Ѩ fSЬ P@ /b(5Ь RPB 0_4A~^L8^PS1)Ѩ.SЬ P@\X`l1z1,n P|$˘˜˘k_߫U^ˠ˸dЬ SPC _A~^N^2Yy֬ 1NnЬ P@1Ь P@ 1*H$1,n P4ի$1?$PTX2P14xgЬ SPCτKk߫^XˀP$ˈ$ˠˤA~^˼˨^1v*HЬ SCy@19*şYy֬ 1 Ь P@0,(1H($1d<ۚP1SP :.1t{R˔QPA˜h˨ˤh˰ˬxѨѨ Ѩ ԨԨ ԨѨ*RS˴[U˼1Ѩ :QRkЫ 4R+SR1KѨBR1H1,n Pի$1$ $(FP1H{Ь RPBϤU`߫.߫ $k߫Phˀ;nHˬ˴Ь RB˼1}n Yy֬ 1MЬ P@ l15Hl˜A$ˤ˨ˤ*/1P1P$0<H`10 <Pdx{P:P˄J~}ˌ,n P˔ի$1C4$˰˴˰qߧ;D˸1 H<S1G1,' PWի$1$ P1π8 <8Q ? UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5Dgݧ Ub" _L8ݧ&3 0T g \ݧϖ` dݧh% l~ݧly: wtPn/H|1H@˔$˜ˠ˜ˤ1 hH˄$ˌːˌ1VtˬPPPˀ˄˄ˈ'˄ y nˀPPPPˈQ1 ,n PY ի$1$$ ( , P1V`~ @XL P$\ PR p PRR 5mYmI,$ $b| K1p$ː ˔ ː ia09˘ 19$˴ ˸ ˴ 1a˼ 1 sa 1$ ?a \1$   aDY `PPˀ1L$, 0 , E` 4 1$H L H  ߬1$P T P k߫ XX 杖P$Y֬ ` Ь RPBYh $ˀ ˄ A_~^˜ ˈ _^19$ˠ ˤ ˠ 1߫߫ k߫Y֬ ˨ Ь RPBY˰  v 1$ ߫(o߫,ezY֬  Ь RPBY 1_$   U߫k߫  ߫ Y֬ Ь RPBYl~^4 ( ^lPP^D P^H < ^P p h g l~^ˈ ˀ ^1˴ WY ˼ V < + 0 1HDD $L P L 1,n P\ cի$1$x | ˀ PKˠ Ь YPI/D߫(߫,{˨  H˴ ]$˼ ˼ FK1P,n P 六ի$1$  P1l~^L @ ^lPP^\ P^` T ^h Ь YPIUTSѼ6ե D@ff D@ffkեDs@-Ϣ Ds@-ϢQNѼ&ե  D@ff7ե Ds@-Ϣ%"ե  D@ff ե Ds@-Ϣ W41ID[Ѽ  Ѽ A><V޼0޼4TW,PPg޼<޼@83PPAffkPH P h|˔_ˬ6P˴I$ P@*PѼ  0 pMXːh˜˘hˤˠxѨѨ Ѩ ԨԨ ԨѨR޼ˬ޼˰޼˴˨+޼޼޼Ѽ .ը  @ըBP1ը VV VFgyըs,n P/ի10,`0,gm$$4Y^</PN1@PSQѼ^NaRGRR@RBRN`SFSRNS@SRCR N3RCRRN#SBSRNaTFTR@SR@RBRN`SFSRN S@SRCR\NRCR R@RN`SDSRBR@RNaSESRN RCRR@RN`PDPR@RNPBPRBRNaQDQR@PRNPAPRH[yPNP~^PNP~^ ^PNP~^4PNP~^8(^,P@ثh@Q<[}PQP} PQP}PQ$P (706ЫR@6ЫSP6Ы TqNU>Bh`>Cxp>Dˈˀ9=޼˔>B˘>C˜>Dˠːˤ<P%ˤ 3P޼˰>B˴ˬ> ԼмP@(6T SR,[޼޼ uмP@M#@M k ռмP@jM#@aMk ռмP@JM@AM <޼,(<︫[}PQPkЬ U޼4޼ 8޼<޼@,<K[}PQP6$5Ы R45ЫS޼TD LTռ 18VPPU>Ed\>B`X<.PPP>@dl>Edp>Cth>C˄|57SP>@\>C`X^<޼ːˈCռ1>B˘>B˜˔5>C\>C`X!>B˨ˤenk l>B˼˸r>Bpk:>C˨ˤnkԼ >Cpkռ&>B޼>Bt 4SR |[}PQ PЫVѼ,1  1Ѽ,.  1Ѽ,  1uѼ,  1]Ѽ,  1EѼ,  1-Ѽ,%  1Ѽ,  1Ѽ ,%  1Ѽ ,*  1Ѽ ,  1Ѽ ,  1Ѽ,,  1Ѽ,%,  1mѼ,39  1UѼ,.T  1=Ѽ,4j  1%Ѽ,  1 Ѽ,  1Ѽ,&}  1Ѽ,  1Ѽ,  1Ѽ,4  1Ѽ,"  1}Ѽ,  1eѼ,0  1MѼ,  15Ѽ,  1Ѽ,  1Ѽ,(  1Ѽc,  1Ѽ1,)  1ѼC,  1ѼD,  ~ѼE,+  bѼF,-  FѼG,"-  *ѼH,43 L; UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5K ,&W  Ѽ11t0Vh/ЫV>FF0(W>FF@86>FFPH6>FF`X6>FFl<~^th^/V|[ЬЬ$0ЫSPPXЬ @ޫ`\2P>p> t޼xlyl1ˀ/Sˈv.ЫS>˜ FR>Cˠ˘1+Pk>Cp> t޼xl"lSTkU>VEf3Ef/!D> p޼t>CxlnSTEfDTUTSODk+>CˬkT>DL˰k~^˴˨5^>Cˬ> ˰޼˴˨T5ˀ'.SP[ԼмP@Ek мP@D-@D޼:k ռмP@D ռ [}PQP } PQP-$,ЫR4,ЫS>BjDLD½W3޼X>BMD\>CDD`TTh 3P%hE)P޼t>BDxpc>CDˀ|ڼԼ,SR[Ь CRѼ ռ  мPѼ@4޼(޼,$1Ѽռ мPѼ@8޼(޼,$Q1мP@,$@,޼(޼,$"1ü PPмP@SмTмUѼ1~޻ VUPмQAPAtP WAWWPkAb4Cf80IѫP޼(޼,$,мP@,CfHCfLDSTUԼ[ЬѼ ռ мPѼ@E޼$޼( '1ѼռмPѼ@WE޼$޼( 1мP@%E޼$޼( 1ü PPRRSмTмUѼc>VUPмQAAP WWPA EPkAA0>Cf4,ѫP޼$޼( Q RSTUԼﬣ[ЬмP@QD?.P 9мP@ID$޼( мP@+D мP@DԼp[Ь Ь  ,޼4>8> <޼@0UP1޼H>LDP>\TE.Ba kP>@f@d> l޼p>,R`8"P4> xt0P@b  @b @b P@[}PQPkX޼ ޼ $޼( [Ь ռ мPѼ @B޼ ޼$1мP@B޼ ޼$daмP@BQQ Q@`?Q@BQk@G?,>0(ѫP޼ ޼$Լ[_(W'ЫRVPPP>@>$>B>( y$޼4>B>80'RT[Ьм>.L[мP@|>޼kQPѼ=мP@=> ޼bQмP@+>-޼$ -[=RмP@e@мP@@Q>A @~^@ PPPP~^Q^мP@QkkЫP諸[ЬмP@q=R@e=RSмkм T@L=U>Vի1kS RkR3޼$ PgмP@ =R@=RSRkPмQPA@<8>Df<4ЫPPPkPT1lм ЫP [ЬWի1kT SkS-޼$ PgмP@ S@STSkPмQPAQЫXXQQXX>Eg8VP>@<4ﱳЫPмXHPPkPU1oм ЫP[Ь ,0%8#H#X#h#PPPPVԼ g;XмP@@@VP@2Q@@  PQQP мQAPмQA1ЫR>BˀxD+>ˌ>Bːˈ*>Bˠ˘*>BˬЫU>E˰˨"VYIB>I˼>E˸"PY !I  IY֫YPPY1>ˌЫT>Dːˈ!>D^&2DY>ˌЫ S>Cːˈc!PZ>C'2CPF12FQ~QYQPcZVQ2AQQ  Q=NZRUR1>FhSЫT>DhT2Q2WQWU W2GWQWQRUQV ֫QV1s0\"ռ ԫЫЫP [Ь UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5j$Ь , 8Ы R>@*9SLH?PP QA81^P(<P|1RмP@È1RмP@Ì1RмP@Ð1RмPQ@ؽ }½HkV@Øk1RмPQ@Ô½ }½HkV@ÔkxRмP@0h.PPP>@cT> X޼\P9P{RмP@,,~PPP>@cT> X޼\PP?R> h޼l`IP> x޼|޼ˈpPR ЫP[ЬЬ  $Ь,8޼@>D<P޼L>P>XH޼`>d> h\Jﴞ[Ь<HЬP\Ы$R`- h%ЫSxЫTˈ ЫU˘ЫV˨Ы WԼռ Ѽ ռ#м PQռ XH\XՈPQռѼ Ѽռ޼˼>˸}1]>6X>F>GTG>G2&>F>C&>C%>G>C%>C>E >EHѫ('`_޼˼>C˸1R$$#Ы$R]71x4c޼B4޼ м B0мB,<B(ЫBȈЫBȌR$@Ы$RBxk>FP>DTLPVP>@P>FTL$.RPPY>Ih`\k>FP>IhTL$>Ihphr$>Ihˀxc$>CPVRPPZ>JhTLy$>Ihˌ>Jhː>D˔ˈ}Bˤ˜L$B(PP0B˴ˬEGGѫ,0F, Fѫ,޼˼>C˸1>Dѫ,޼˼>D˸1>DP(ѫ(,9>R$Ы$RP, R$"Ы$Rѫ,޼˼>D˸"Լ`R$W VUTSh[мP@2PPP>@2 #PPмQPA5мQAz5kAb5PԼռ мP@!2[PP$Ь ޫP[( >8޼<0!PЫP [Ь$04<Ы RLЫS\ЫTlЫU>ˀ1V>D˄>Eˈ| E>E˔ˌ!>Dˠ>Bˤ˜!>B˴ˬEˠ>Bˤ˜%!>B޼˼KPѫ%4޼>B#1޼ <"~^'^21<Dм P@Pм P@P>޼  46޼>B1gѼ ԫ>B$V PPP>@f( @ . PPP>@f4V PPP>@f8>C<0,>CLDPSW>GT޼XPPXX6޼ /4c޼>G1м PЫ@м PX@fм P@,d`)м XHPPHм XH,d`м XPHм X<"Hм XH м XHѼh м XPHƌԼ4UTR S<l[Ь Ь  ,޼4>8> <0&P1޼D>H@P>XPg01R PPPkQA(.'RP kS> `\PTUR TGUPU>C-Q UPRBURRPPTTPP'C-> h>C-ldyUSP'@-5UPPRRTTRR> hUSS«S>Cx-ld6神[Ь   (ЫRмP@5- \.RPPP>@,`X8S޼pB0tl>Pk kRЫP[Ь>~^,޼ 0$P [},RмP@޼XP1мP@QSQSQSSS@ мP@bѼѼSѼ Q м [@@Q>A@~^SSSS~^ '?^мP@$ ?kkЫP ؚ[Ь$ЫR>,(ߦ޼<8 P^H@>^ѫ 1RPЫRj-m} UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;581Ѽ <SѼ  <@Sм S`R?SSƫSūSpp->Ы B*мB*kB*ЫB*B*B*ЫB*RRЫP<[Ь $ЫR>Si_TTDcn)>Dc84P2D P P0 P9P>DcH>B**LD"PU(>Dc\XPS>B*d`SPUURЫP[Ь>cPR>,(KPCR2BPP P0P9ԫ(><޼DRk8O PԼԫЫP|l[Ь$Ь , 8ЫR > @P(VLP$իUPPR@1)>\XPP 1 P(8Hl1U мPR@ƈ1U мPR@ƌ1U мPR@Ɛ1UмPvS@Ƙ`#мQPAƐ1UмQvSAƔ`мQPAƐkU мQRA0Y> l.QQQ>AfphԫAU мPR@,%> l~PPP>@fphԫ Uԫ}SkRЫP[Ь>P޼$>( qP ԫЫP<ܘ[ЬЬ$0ЫR4MP&T>CTL>C`\9>`\P޼h>lRdЫRP>|tI(1мP@PPPQQQQUURBRURQQQQP>ˈˀ?(1RUB  BRPRURPRU>@Q UP>Cː>B˔>C`\uP^˘ˌ^=BѼ  'B'B$/B<>ː>B@˔>`\./nPPn^˘ˌ6^ BĞBĠ4DRSؗ[>Ok,sOk ,T>UAeAe@d@d.PSPQ@d>@USPPPSSD 1Cd>C`> d\J> plPd2VWGVRP2GQQVGG@"PW@"> x>B"|tP D W.CdDi R@[ռ.Ѽ(ϼ #+'! ЫPPzPPRRмR{RPPPP PPPĕ[oPükЫP[Ь ,>,RмP@b @b ּм}½H мP>@b40.PFмP@b_ @bA@bZ@ba@bzּë1мPQ@b-QQ@b+ּмP@b0ּ| p7WW'мP@b0мP@b9мP@bGּWXмP@b0@b9ּXf7@b:JּG|YWGe"YP0GSmSTaTPYWdYXP"~HVPPdPY`Y 1cмYIb.bּWмYIb0 ּXW'мYIb0мYIb9мYIbGXּWмYIb0Ib9ּGWXYYѼԫ1|kP@e"kV0@SmSTaTVkPXXp"~|dPkмXԫмP>@bD@a P ּ>P޼TLPXԫYYXYXX& ë2ekX`X իݫp"~dP r ëЫP<ē[Ь>RмP@b @b ּмS@bIp>@b{ P_мP@ 0 мP@ 9IмP@ A мP@ Z/мP@ a мP@ zЏ YмPQ@b-QQּPмTDb0Db9 PU0DbT2TTTUPּQ P P SЫP [ЬЬ  $>RмP@b @b ּмS2@bT>$UT"T'zVּWмP2@bXaX\/мP2@XXT 0>,޼0(b2XXTּPPVXFeVW`(re'48V){3F5'mD&|.ZNCʑa}džļΛ?੘>kssWr#?L`3Im:y@"vXco/=Al*ƱN]]k9lpk'HMUOTq!F9@C~wQxj4F>f_?e1i@22_Nr8v:pAZ!:6NZc38v ˷1\z:.}pMMQK+q;w;A6eΈS> AۛFXSE$'Ƙfm[G*_i_a=<(kSTbw-L|ϐRIY~LupezLE'cT`8E[z3 c`O? _ %D`տRL-ֱs^^=.  eu (V,Y'UeQq};ŝ Y/3f_.yz)s>%rnж0ؚ[SӖܰ8E9}}l!㖠N63RVN0ÿ$ s&yͿ;wdeg=[6z@ ␰~*z w{U-++bailPV97bsY9N3Bݣk3 Z|gG4fqj:غk4jy hlêO|z#no 끛G"W<.y,/7z'N`d=c;[XB@LgIQgѫ?-:GHOQ$YGѯyيYqz^mUq syJ#=_e(v`rTyMX] rFi&"J<(U7= bV]?cǫB$D_ ۰啸QoXzx_\E}Nڞ"?Y^y+t}ahQf9%ّkI[DehB/vO 5+*ag%-_ ({"aYaisS/No]-$!}o /! Vٺ΂UMf(ù =dyh`I.h-1suD ggt)F ~T/;PWSK&mC&Fj*]6>cit-G;^YZT_+n8D:$@ɣG<ڣĻX:D:F/e4'dBOwzO܆?џ㲜WE &]h(vPz;dIokv"l !1c VVo'͵jgGMLFqGE%j1!E%.S&jS;`ɑP⮃ ??q2gv0yeWIi[F@e& Y?6%\( SKО iԋ,ryj2x':ٜeb?|;FԬ# fbY&څ˶z4Sp/HvoB.mS2@.lұ/g޿+{վ}Au5 9G&'mt+#6i[ =FpڃRۦ|T8~V)uڂzjڋ1a86^XkFD9BYY!6/R<}YB;21/dD:sO-<F)|Ob1»jktCP> ƕrA?a $6>]Bki:'Wg߲F=}'(ͲzefEa|-IB 녺A{y9 "A;YT1M7'%B1.E&u ZjѭFz,[ 빦hh,܄ax6&ku LA#ߪDy i1oм-qAJ D2 ,ᡭIF< ^. x4,H^/F ahɕ<>[RN4U<!fS2;FT ]ٌ=јL,o-T|L]%Y ,5.\l3!jo@QL%Ǒyag-G:-˪;Zq*ݤ4H&qt#AKRC)W0!*azPDwd嗸&wrMrN 8lof!svc$YTiQ%K:Bl) sߪ^'yMI[16شvĥ?L hy9"}+w"gƃ F[Bv2C\Svo(A.H^)hǹJnsK +<}EnX}tS6Xm)nϷͤ"䌱h rx]vqͱTh4&MuNJq@pRN♏)jc$:U熁b}"Dx|pپ%E$};ymW!PD4t bG EaT6moaZ᭫Q+ѐ-LE,޼0( 2WּVWFeVTFeSЫP [ЬмRѼAѼZ Rq½H1Rg1sRf1gRe1[s!jP>D޼ H<PS$j~^P>T޼ XL^PS>T:CdSS 1}PPjPUnUUcUPURhZd7UjUWW 0CdSS 1W^P>CdTS PP~^XLp^SP:@dPSS 1nWWbWUe7UkjkUU 0CdSS qռ+U^P>CdTS UU~^XL^PS(>CddS TT~^h޼l\ ^PSS SPмTTTPT/gR~$>(޼ ,޼0޼8R B PSЫP|[Pd[Ь  PP@Ь(ޫ$P>HD#@P>@X>\kPݼ nPPn^`T^PЫP\[Ь PPDЬ,ޫ(P>LH?kPм QQPPQQPPPkP>@\>`X-PЫPX[Ь>PQмRB` B` ּмSTB`-TTB`+ּмRмUUUԼ мVF`cF`QQ0Q9 0QV2VV1U GQA QZ QQaQz$QW2WVVVUU WVW ּTμ ѼRS3QB ѼQbּQX Ѽ QxּRQЫPL[ЬЬ(м PQ>(Rռ )S>C(ST>DTc QPQм QAм ЫP[Ь޼>޼ aPЫP[ЬЬ$>,>8޼ <(PЫP [Ь Ь ,>4>80PЫP `[м RѼ ScPPPPcR k2BPļPPkգkcPУQPABRccP2BRRPPkc[YPѼ@ Ѽ@3@k mP@R lRUмD.[k., k[< PP м PPRR~^ |^Pp kQPмAPRPAмA QQk |[ЬЬ(Ь0<>S@c @c PPTUV>D@?PkW>(XFb1>FbL>DcPHPUPP PVQAQQQ Q@hPܴ@hkVP@b@b W+UԫWUVFbFW1xUЫPԎ[Ь Ь ,>40tPR>,S>TR L8RPQPU>EU2VFPQP@c2@cQAPAP6P@c+@cQRUVUW>GWQP UVPԫЫPX[ЬP>QR>BRԫ P PЫP[ЬP>QR>BRA Z P[Ь Ь ,>4>80PЫP<[ЬЬ(м PQռ =>RS>CST>D(TU2Uԫ PQԫЫPﴍ[ЬЬ$P>$Q>RS>CST@aTT@a  PЫPt[ЬP>QR>BRa z P[Ь޼P>Q( @ZPRPPBaBa@ZPR@Z޼($[Ь>>޼(>,$`A[޼޼޼ k<޼޼ 4>@K,޼ $ 6P~^0(^h[A3P,PD[ke([Ь!PPмPP޼ >$ [kl?޼޼޼ P,,[ռ9޼ ޼PkGC?ѫ DԼ,[мP2@ЫP[ЬЬ$>,>0޼ 4( [ЬЬ(м PQ>(Rռ %S>C(ST>DTcPQм P@[Ь 5j UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5PQ>AQP PЫP[Ь>RмP@b @b ּмS@b' TּTмP@b\rмQAhּмP>@bxP @ ּBмP@b0@b9>(޼,$k TмP@b ּ\ мP@b @b ּT' T мP@b'ּSЫP8[PѼм Q2AQQPQQ>Ѽ мQ2AQPQQ%мQ2AQQPм Q2AQQPPQPPЫP[Ь$0}kkмΫѼAѼZ PѼgPPPsPPV мWWW мPPPWq½H><4^P1DVPPQQWWQЫ XXXY ZZ'XZY ZPYYի Y,WYի  ZWXXZZXXRë WRPRѼfXX Ы XPXWX)ѫYԫի PQЫZYZЫWWѼf>PѫPPYPRRPPRRQYQZW RRQЫZ WYZЫWYYQQYQQYYQQΫ~P"~DPVPP`kPqP f"P֫ ZRSSRRSSZ$Z>0SZ *JcZJcЫ1Zի>Re"PSjSUnUXcXSP0UUZR>0ZV-RfBj.BRVVFBjRVEBjRVVRի  -BjRΫ >Bj\RVV~^`TR ^PR19ѫ UPP@BjRPЫPP  0BjRPռ.BjRPPW 0BjRP1ի O5Wѫ 1Bj0Bj.BRPΫ VPVW0BjRWPP* PP @BjRPռ.BjRVPVW@BjPRVRRBj0R"P WV«VPVPW 0BjRPBjRЫP 降[ RѼ ֢ b1ռ Ԣ b1ѼѢ kqѼ բb`kѼGSPS>C˦4SPP~^8,0^SP @˦@˨8޼ <0P1(м RмPPP$QQPPQPPQQPPTPռPPUUG޼D@ÀPVռݏ@^TVL^^PV޼\XPSмVP> QzVW{TWWWWXWXUXWSWXXT TXSSPX  0XWW@a7XX@aTVPRUS PRP1@aռ PRP-@aPRUUP2EaS@aEaS@aPUBRSkЫP <[Ь Ь(4RԫSмT> U>4V2DePP 1;De13ЫWPXX# 1X$12DPP >@޼D8$1X%1 >@޼D8>@޼D81X*mRWT'2BfPPP P>@޼D8>h޼lR d P1X? 1X[1>P>T޼XTkLOkTP1"1X^-T>@޼D8 ^1X{ S1X}SnS!DeADeZ >@޼D8 De\&>ˀTk|kTP DeTDe>@޼D8< WRT1>@޼D8 2DeTT ѫ  ЫP [Ь Ь ,ЫRP@,k>4><0PR3k>SkP@c >4><0PRkRk RkSSԫRЫPﰅ[Ь Ь ,м PQ>,Rռ S>C,SPQQ PSP0>TU>EUQV>F,VSQWe WPSм QAм ЫPP[ЬЬ(PQ k>(S^QkT>UV>FV1sTWkXHc182HcYY#Ge Ge W1Y? Ge W1Y{ P1Y}P1HcYY\H XHcY3Y$+H%Ge GeT WGe׼1GeZWP{ZA0ZZ)YAYZ YZh ZRYRYBZa1Zz*YaYz YZ1 ZRYR! YZ YZ X1HcT WWQGe TԫЫP<[ЬRѼ>޼ Pw WVR UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5bR>Sռ-RμPмPT PQT QUUPU0UUDQPT,R >,޼ 0$4PDBcRTдBcRЫP[k/޼޼޼  PЫP[Ѽ  PPR޼ kļPPPRR~^[/^ѫ޼ (޼,޼0 iPԫЫPt[޼޼ @R@.RkPPQPQQ RЫPH[޼޼ ޼ м@޼$PkkPЫP<0[ЬЬ $ 0RмS>T>0UCe1CeISRSЫkkP@d>8> @4PëkPPBBkS>L> TSHP7RB2BRRԫ6BRBBQ2Q> `\PS1>üЫP [ЬЬ$ּ>RмP@b^ ּ >0޼ 4޼8(мS>0޼ 4޼8(l>D޼H>L޼ P޼T<SPPPC$мSCb]ԫЫP h[Ь>RмP2@bP PSS GAS  ((8888#kkмSCR2RkkkЫP<[ЬЬ  $>R>$SмP@b8мQAcмTD1Ac1ԫ1мQAc мT@bD ּ1uԫ1mT2AcQ Q0Q +Q '?s1+мQAT18xr11мP@b %>@b,> 0~^4(^PT1мP>@b,> 0~^4(q^PT1TTP@b @b T1мP@b TpмP@b TaѼTUмP@bPPA PZ PмQPAT*мQAbQQa Qz QмPQ@TT TԫЫP[Ь P>QPPRмSSRRS@aCaP мS R>T>>޼ ޼$RSSP,[޼kS [ЬPPмPP}>nѼ  ޼ ($܁[Ь  PPHЬ0ޫ,P`{R> SBc0 Bc9RRk">PL>d޼ h\ 1WBc Bc RPBcBc  Bc@VPR@VlsP1|"ːˠt˰ѫ1ի ѫ 1>P1kP@ @ PR>DcT PP~^^PT)DcTRBc$19>PL>d޼ h\[Ь>$ PRмP@ \\P@( ]k@ QA,@0>4~^8(;^\P@QAD@H@-\P@QAT@X>\Pﰀ[ЬмP@Ѽ ּռ ݼp"~$ydP:sԼ.q> d"׼q f"ּ<D[Ь PP<Ь$ޫ PHx>RP>QST>DTd2UQUUQSzQS{dSSS2CﮆPPyPSSgSPPQAb@q PQAb/@Z=%>@RD>H޼ L@~P12C+PP%S>D>H޼ L@Yq>T>X޼ \P k2>D>H޼ L@[q>h>ldkP@0ЫPP[k$RüRPzPP{ PPPPP PPR޼akRPRRRЫP<[ЬЬ$>$R>Sм P2@cQQ1@c1@c\C>,޼ 0(P м P@c׼ >@޼D޼H8:1>м P@c-">@cP>T޼X޼\L1Ѽ м P@ ->@޼D޼H81мP@Tм P@UTATZUAUZ0T0T9 U0U9Ta{TztUamUzfTU-TU>@޼D޼H8S.TU>@޼D޼H8#ּ ->@޼D޼H8ּ 1[ }[Ь>Pм Q2A`QRQ S>CS  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5^QRԫЫP }[ЬЬ(>Rԫ1xPQS>CSc2TPTTPQzPP{dPPPPS˂T2CUVWUdUdXXd[XPPQAb@PQAb/@=(>@g0>4,NPԫ1HV2HPPdX& XX!8PH\ dXUHHgHXUU>X>E\T8PU=EU>h>EldQQPPQQQH2HWWUkФ  CtdP >0>4, VЫPx|[Ь Ь(48@Ы RSS>BXPPRT>d>Dh`mPT=DT"DT>t>DxRTPP~^|p9^PT"DT DTDTToD`>B˄ˀP﹜ﳜzTkːkTP&Dˤˠ D8XT8HR  {[мkм ռ޼`P1Ѽ  R(kPPR޼40PSSR~^D@`\SSիhtPR>B`\pëPSP5PRP>@hˌ>B^ː(MPk~^˔ˈ g^˘sPԫЫPt{[ЬЬ$P>QR>BRS>C$SԫTTTPЫP8{[м{м wgh~^,#g^޼40g޼D@ kkP({[мP@d1@Z޼k Ѽ ޼ Mz[ЬмP@ @>޼ h|z[ћRмP@ 0мP@SbPQb TӄQSPQSbb@1bSCCмP@CŏAP>@ŏASP>@ xCTUT8 SSP P>@$V PUP P>@$,>f0(:VTU^ ݬ ݬݬ5,^ݬݬ.^ݬݬ ݬݬ^ݬݬ ݬݬ^ݼ79PRռQƏQQQ8PԢ8լЬ( "RЬ$ R^ݼ8PR ЬP``PRѢzԼPѢ<"^мPP-53P?P< ݬ ݬ.P< <  Δ^~T4YqRdЬSS4P WWV1SXSP`P`! `PX PP`X 3S3Ui߭߭ݭ6P <~:X߭߭P߭.APWWVV|ߢ͕cߤ͕ei͕>cP߭߭3P͕=CPߢ͕cߤ͕e͕=߭߭c߭ݭ;V1'V^SxSP@P`1PSV@VW W?PSxSP@P`xSQAUVeAUWeAP`SS t^_|R߭X߭<~ݭJ$P?tݭ'ߢ*t2?߭ߢMߢLߢCZ=P*ݬ ݬtݬ߭MPPP?߭ߢaߢ]ߢX=Pݬ ݬtݬ߭P|4^{RTߢkݬ8PVVPT1V~VI8P1mU1SPV  ֭  #SN5߭eP@Pߢm5cP0ߢo5cPݬ5cPTP5߭ePTV~V7P1jVw7TP5߭P1ߢq51P|ЬSS߭PPݬ߭pPPߢsS0P ݬ S&0ߢzݬ0P ݬݬݬX7PPP5߭ P1]P<^мRb b  Rb b ЬPQbUU: U*U? Q[PUTU OU JU EU:@U*;U?6PQSQS PbSS S S S: S*S?̔`RQP|^~TмUЬVxURBS2c~c<PfBRcb 2b~J<PfxUUERb<^<~UмSЬTxSP@Qм RRa<߭H߭߭߭]ReeŸeRTxSP@P2`~;PQPQQQxSP@PR`xSP@P`QRQTR߭߭߭<^x}RxSCUм TTe߭ x UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5)&<߭߭߭<߭߭߭b¸bTݬCP2`~U>Pee<߭߭߭C<߭߭߭- ^awS|RѼPP ߣ|9мbb¸^{|QЬRxP@P`bbb^мPP?PԼ < <@  ^޼PްP`^ݬ޼PްP`^ݬ ݬ޼PްP`^ݬݬ ݬ޼PްP`^ݬݬݬ ݬ޼PްP`^ݬݬݬݬ ݬ޼PްP`^ݬݬݬݬݬ ݬ޼PްP`^ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP`^ݬ(ݬ$ݬ ݬݬݬݬݬ ݬ޼PްP ` ^{T Ь SSЬRRݬ"ccSb5PCdPRk߭<߭ѭKPCdѼ7PC.߭<߭CPyѭC߭Ь RR#bbP^{SЬTd.P ЬP``PdRBc BcaBcBP.ՠ ݬ߭?0ݬB-Bݬݬ]#^ЬRb8.PT ЬP``PbP@lzRѢ `Т$ ЬSTPcczcPcccP<"ЭPP PQP AЭԢ â ѭ м ߭ݬТ P@* Э^yYЬTdg-PV ЬRbbPdTDUХ SRռ aެWXBh  S5Х(S"ЬTVPddS ЬP``PS SQS3BARR S м ^ݬݬ<" ^ԭЬSc,PR ЬP``PcP@xPѠ ݬ߭?S,<QQx QQ<PďPPQ<PPQQ<^ЬSc?,PT Ь RbbPpccԼ P߭ݬ!PѼѼ%CP<`R <RRխԼ PUDeSЬRb b  Rb b RQa@a:a],ЬPbPSP`PbPS`ìPTTQaЬTTݬ ЬUU=dݬ UU.#dT>DePbPSP`PbPS`ìPRR ^ݬqPSS Ь P``PмPP-ME?PSԼ ޼ RݬPbPSԼ P޼ RݬPbPS |P^sV(PgݬHPݭ P(X1iPP̟PPP?<~?<~^T\SRRf RT SfRTfP fBdSd(ЬRRUT:bUTT Ь Qa a  Qa a a a.SQRbKЬP`'`]PRbìPRRR.`P`PRb]]`ìPRRЬRbRba.mQP`.dR b.]bìRPPRRЬQa[ PQa[QTQPQ0`TT]aìQTTRT.dЬ P`RSP`P`RS]bìRSS^ݬh߭P߭xݬ~Pa߭P߭3PR;ݬPR+~NP~PRRWRHЬR(Pbb ~PPݬPhռ^gToRSPݬŏ\SP@UPSSPbߤPPbŏ\SP@PX^gWoUݬ PSSP@PX~ZS P2PXZP~ZS PVP~ZS P1ߧZP1ŏ\VRBRRPRZRR~P1ZTTTPTR`"P"ŏ\VTDQЏOPaa"QPaa"aVJ~ZS P!XZP S PS P<^ЬQЬP׬ SSSASZ STSTTUSSASZ STPSTTRURP׬ P ^ЬP`$`RRARZ RSPRSS`P` ^ЬP`&P`RRaRz RSPRSS`P` ^߭x޼R߭O Pb޼RPb^mRbb<~ b^Ь^ЬQxPPa^ݬ ݬЬRR%xbPPb^xPPݬ߭D^޼Qa Ь P``PaЬRR߭BRP Լ Эb ^мQQ ЬP``PQн ЬP``P߭߭QPԼ<X^cRb7PUqߢ YTdPS?S<~ 2PPSߢSdPSݬSdPSߢSdY]PYUjU,@^ЬRxbPPݬ ݬ߭ xPPb<^ЬUeR Ь P``PЬTdݬ UT{dP`S Ь P``PSRRSЬ RRU߭LbSݭdRTlЭdb ^լ IPЬ SSSRPԭ߭ЏPRRS:cTݬPRP2P@Rb RP`Rb_ RP`_PRRݬUP^HRߢ ݬݬR^HRߢݬݬ5^HRߢ'ݬ^HRߢ9ݬh0^ݬeݬ XݬP԰Ь|߭߭P P1PP^ݬݬPPP ^RScPPxPQARbЬbARЬbPPPFP^TRRbPЬP PFPPxPP@QaP@P`P^RR׬xP@Qa@P`߭`PPԭЭP^QR\Px\P@P`\\Fb8 ^GSݬLPRլ;PPRPP~R|~?ݬP2PPRcRߣ6PR#PRR$ ^5SRЬbЬЬ ݬߢz߭߭0 Pѭ4F߭J^R\PPQլP!P2lPP)9?.?Pݬݬ  P߭߬S߭̏1N^;SPxPR.SPRP^ݬPrPP߭߭ЭP ^Ь߭߭LЭPά^ЬPPRPRRЬ ߭߭ͬ߭խPͬPЬQR3RЬP^DX2ݬxhxݬxxx)P`xPMRЬ PVެWVg3b/PPUPT!TʏTS!SxSQQTTeVVgbӔ`VP߭ߨ߭ݬ߭ Rbߨ ߭bݬ߭bߨ߭bެVfݬ ߭PUUQЬ QRUf*P%ˏPS!SSxPS!SSUUfP۔bx[UP^OCRݬ߭"ߢ߭Oݬ߭B߭߭|Ψ^CVͨߦ߭߭ͨ5 խPЬTͨRԭRSRPTRTQbc P֭왁߭߭ͨ߭&߭߭dSլ 1߭߭ͨ߭ խnͨU2URRNRPP /GGGG3GCGGC P?PPP1 UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5q2S'SSS P޼T3UCdSS 1y޼TCdSRަQͨPSS S߭߭߭߭ͨ߭4߭߭r ͨ߭߭ͨ߭ ߭߭ RRSPSSP<Ψ^PATͨߤ%߭߭ͨ խPЬUͨRԭRSRPURUQbc֭왁߭߭ͨ߭v ߭߭߭߭ P^ЬSݬݬݬ&PPЬRRP`b]PSRRP`b]ЬTd.STPSb RSb]SЬ QSb PRSbbP<^MURRScP0s!ЬRPSzRP{ PQP0PTTc RSP|^Ь RЬUЬVUVVUUQVPRPRBeQBfPRqpR^ŏ߭^ t^?SݬtL߭߭tt.խݬ tЬRR8 P@bPߣ/ݬPPߣ8t߭߭ttխݬ tЬRR P@bPP^2~P ^Ѭ ~P|~|~ݬ ݬ|~߭12~ PQQ TSݼPR dPBPVߤP䰬ݢ ݢ 2VUUDP*SUS%SSߤ/0PЬWߤFU>P1X1PPR UP2RSS7߭SPѭߤGSs18<~PX2X~PRRPPRUP1߭SPRSRߤaAX1P2Rgݬ ScPPݬ 2VUU>RbP1ݬcPPݬUbP1ݬcPPݬUbPlUP ߤwMCsRRUPb RR2V~gPbs{PUPX ݼ*2V~ P^<|~?PP PﴨP|~|~ݬݬ|~߭22~ PQQ TЬQa a  Qa a aԼPP`` ` PP`S6߭߭<dc!4ݬSS&߭߭<9ƃ,dGP ЬRbbPЬR R-P % Ƅݬ P PRЬ R RPW0P ƎRPW PhRWЬU UP 9P ƙU?P hRWR UWhƣWP ЬRbbP߭<KխAƮߤ'PߤPߤļQP1 UЭRBB@ߤePeߤPߤļP1ePļP1RcbPc!S PSRcbbP8ѭPļoP1(\P\ļEP1PļP1ЭRBLxPЭRBLļP1oFPoļPv2!P2ļPQݬ~RWRƻe߭߭<мP 0߭߭<VЬRbbP< ^@+Ti:R<~ߢ¸ P1@X ߢUeP1˜ߢ„ePV˜P@~ļP˜P@˜P@ЬSSʏc1]œߢeP1GߢPߢݬ1+PԼPYЬSccP^~w% H$ hq $! `_`fl^_VDtH OΑ qtW,kb!jr܂ObOvV.0oJ".)oC6<`*d*Snu_Er?qr& )2]sΰ{ -k&Ğ*HS(jF'q5yǠ;EospЩkᤤSͤL-}aD](iڴ=ڗҜ(K.F%.G)lLrQs-I5~5jPmg~xz5\e~MrұHF?Iɯ}΁gSՄBNT3PMwD]j6)+.94Z!s{ MzDkg}T 9e#h.v^ի=!EDzmZKZ@$!3#X7V 9PrE>GքHC̀`y{juVH7$ o*yYJmdb:f/!)ćXz8ބ*ux4$Tȴ! ѭ/,{M.#=?ggv{+8c*Id٬3XNPgR(.P,'P䔚: /8+jXj 鮱0[=b$슧݆G يI#fZ1}!1+(@]l뢢`~}nI&F:Y3XO-~V3iAEh;x$v2W H0uqA{P}VL5MPi\͂wY]c)ѡ*BA9vgLE\o-GJ r*f52zjr>d x, R]wb$:&tέ=h5Hiw77.m&z[ԇ7nN{--rxyt#T׮\H I~g`}jT [ qJ~  /"4pٿՐb#4HhռTP_""`WT`ӆpݘ>q}3NGb iLB BPg{z *Dpڃ D'I0-C/5 rxU"Lg7ǻO ;g5Q&,A{c}] pHJ(5cCX?%qKUj$;(Y5dAa=( I =c:?JtOٰguѶGPR@qQ*rz!duCAhݤ/.fmg5Ϫw >մIWdX xSv6i$ V"1WR=nn`O o b ,ofݹwt`|0w"${dyIZ70 ܘU)c.s~0)$C$K'הYzױ Ra57?E ^)@pgWЕʒȣFY< &Gqu=ooBkg1^v_d 0U ֐}(#Tb_ :dB >Ҏ%Mej >Bӑ4biWծ<?ΤZb(,<Os^7=jEw͚θMPc@8=픏0tI_X9v-\?k q5`*G*Vtzk1_5kW!(W  gJ$gq\T@ akwum 64Qt=f\EF4 l2tjK=Gga=ߌP%]Yx,߼C_ QRsfSg,P`~|Qq&qpq R}u.}D@N6.xkѿ/M"!ɼe>erMCD:er,ƾ'ơ8*ئ}/[99)zE^1p %lINs+;!XMdy*tV=@I),s b$ao&pWOFF-P|uTHv$d)hA(2\en4ODF2t0Y6%;T͐kJjKN0,bB1Oprb)qqЖەqtfܸtOEϙ-lᧅuq4Qi!h|sys+!f6cW1iN~#qWKZR4%N&'LjW$]ݠqk*hh ȱlq1C~]2,,- :AJRa$_zlP u((tOc?VqO[ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5@|̸l ^'R|~|~<~?PPNP?ЬSS (2~/2P@c2P^ݬ ^|~|~ݬ ݬ|~p~ݬ PPP ^|~|~ݬ ݬ|~1ݬ PpPP2P^ЬRRQЬ ݬ ݬݬݬݬݬ Rr(ݬ2b~ P PP^ЬQ+СPPPj?PЬPРPPx^ЬP2(QQ1 1Q,11Q 1QPP  P?PPQ11P01P0wg P?PPpwPpSoooooooS P?PPp G)P  :PЬPԠ2*2PЬP|'PЬP0Ԡ PЬPЬP|,^I&|~|~|~|~߭<~2RR PVV_|~?PPVVH|~R^(n|~߭~2~PVVݭݬЭּ 2PV憐P ^|~|~ݬ ݬ|~߭<2~2~ PQQ AQPRB$RMqrP<м[=<[4<[+<["<[<[<[<[-XЬYx[Z(@hi@YZʏ[([hi<[*<[#<[<[<[<[<[[ ZЬXЬYXY Z(ZhiЏ[XYZZ[([hi[X[Y[ZZXZYZZ[[X[Y([hi[Z^ҼPPP^PPP2PP^ҼPPP<^T޼S>DcRT޼ SDcQP!PQUQ2SST STTeP [Ь}PQP<Pм QQPPQQVQWXW'Q>AY2QXVQ~XP@WXV ,n  ,V < [}PQPЬ<Pм QQPPQPR>SQ&T>DTRUEUUd2UU RPQR@[ЬЬ$P1P 1P 3OkOO1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(1޼,޼0޼ 4(E1޼,޼0޼ 4(an޼,޼0޼ 4(}R޼,޼0޼ 4(6޼,޼0޼ 4(޼,޼0޼ 4(޼<޼D ~^L86^ɼP^P2PP^ɼP|^ЬVЬUм PUTURVSVQ3cd P 3Pr^ЬSЬRS PQм PQPQTPTTQAbQP @c@bP^ЬRм TDbP޼SDcQPR PpqPR[ЬЬ$м PPQ>AQPRB$R2qrP [ЬЬ(м PQռ R~BRSC(SjPQ [ЬЬ(м PQռ RBRSze UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5GC(SЂPQ[ЬЬ$޼,޼0޼ 4( [ЬЬ(м PQռ RBRSC(SJPQ[ЬЬ$м PPQ>AQPRB$R2qrP^ЬRм T>DbP޼SDcQPR1P MYL MYL F NEED_INPUT NEED_INPUT` KEYSTRIKE KEYSTRIKE:  START_SWEEP START_SWEEP1 SET_SWEEPd SET_SWEEP& DISPLAYOPT  DISPLAYOPT  RESET_IMAGE  RESET_IMAGE ENABLE_BUTTONS<ENABLE_BUTTONSEBUTTONSBUTTONSnjDELETE_BUTTONSHDELETE_BUTTONS + CHOOSE_CURSt CHOOSE_CURS6 GEN_COLOR GEN_COLOR=SHRINKER SHRINKERR   BUFFERREAD< BUFFERREAD ?EXPANDER|EXPANDERl4 CLOSER CLOSER   COPY COPY  ZOOMP PZOOMP1 SIZE_IRAF SIZE_IRAF~   * c5 READ_IRAF( READ_IRAF> , ISUMSQ TISUMSQ G RSUMSQ RSUMSQ G SCALE_ARRAY SCALE_ARRAY¹  3  SIZE_FITS SIZE_FITS   READ_FITS` READ_FITS?  READDK pREADDK2 v BYTSWP BYTSWPL MULTI_MENU4 MULTI_MENUi MMBӄ5 UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5:aUUTT MMBUTT 1 MPTIN MPTIN G MPTOUT MPTOUT >NEWCONV\NEWCONVuLUTPOINTLUTPOINT SET_LUTSET_LUTĹ/Љ  卦[ MOD_LUTLMOD_LUT¹ ù     H y7READ_RGB READ_RGBw.PRINT_ITPRINT_ITĹ  ʬ  SNAP_IRAFP SNAP_IRAFGRAPHICS#GRAPHICS¹ `ù  ¹ ?   >  CHANGE_FONT9 CHANGE_FONTpT" "  " CHANGE_SIZEL< CHANGE_SIZEdy CHANGE_LINE> CHANGE_LINE]q TRANS \ AZ DX GV JT MǹR PP SN VL YJ \H _F bD eB h@ k> q9 t7 n> ҥH UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 \$ z4 / - ,+ }5 w)q IMFGPE JIMFGPE-b IMFLSH LIMFLSH IMGKWC LIMGKWC IMGS2R hMIMGS2R4b IMGS2S NIMGS2S.+ IMGSIZ OIMGSIZl IMGSTR dPIMGSTR IMOPEN 8QIMOPEN4 IMPL2S lQIMPL2S IMSETM 8RIMSETM f IMSETP RIMSETP* BFCLOS RBFCLOSq BFFLSH @SBFFLSH  BFREAD SBFREAD$ BFWRIT TBFWRIT% IDBFID UIDBFIDn#f IDBGEG WIDBGEGo4 Q # '  +  IMASTR YIMASTR o IMCREX PZIMCREX{/T IMFUPR ^IMFUPR IMGDIX 0_IMGDIX D IMOPNX t_IMOPNXI+# IMPSTR bIMPSTR-G IMWPHR cIMWPHR BFALCX dBFALCX8 BFFILL dBFFILL! BFOPNX eBFOPNX) IDBKWP fIDBKWP(! IDBNAS lgIDBNAS'   IDBPUG gIDBPUG -2 b 5 : ?  IMACCF iIMACCFL IMADDF 0jIMADDF3 IMDINT lIMDINT L IMFINS LlIMFINS3R IMFPAE mIMFPAE=4 BFMODE nBFMODE&  Q IMFALN (oIMFALN , CLKTIE ToCLKTIE  CTOD poCTOD K CTOI ,rCTOI-  CTOWRD 4sCTOWRDI 9 DTOC ptDTOCO 1 ERRCOE hvERRCOE  FNLDIR v + UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5xcFNLDIR n FNROOT vFNROOTt GCTOL hwGCTOLQ  ) " GSTRCY xGSTRCYj LTOC xLTOC 4 PATMAE ,yPATMAE ? PATMAH lyPATMAH : SALLOC ySALLOC! SFREE 8zSFREEm SMARK zSMARK+ STKMKG zSTKMKGx STRDIC L{STRDIC@ STRIDS T|STRIDS,  STRIDX }STRIDXM STRLWR h}STRLWRI STRMAH }STRMAH : STRNCP }STRNCPp STRNE `~STRNEe STRUPR ~STRUPRI SYSERS SYSERS n SYSPAC SYSPAC9 XCALLC XCALLC c XERPOP $XERPOP ! XERPSH HXERPSH $ XERROR lXERROR O XMALLC XMALLC= XMFREE XMFREEH XSIZEF DXSIZEF  XSTRCT \XSTRCT7 XSTRCY XSTRCY] XSTRLN XSTRLN 9 CCTOC 0CCTOC> COERCE ,COERCEk DTOC3 DTOC3¹H) ERRACT ćERRACT( GLTOC GLTOCU| GPATME GPATME¹` Z -G [ D L% a => #V 7J :%  GPATMH GPATMH GSTRCT `GSTRCT GSTRMH GSTRMHQ K &G +E . ITOC ďITOC+ KMALLC |KMALLC 4 MALLO1 MALLO1{ MGTFWA ,MGTFWAZ MSVFWA MSVFWA B PATAMH ̑PATAMH1  PATGEL ВPATGEL PATGSE PATGSE9      PATOMH PATOMHc* UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;52j> b \ W O J E @ 7 .9 PATSTS PATSTS  SYSERR SYSERR XERACT ĖXERACT Z XERFMG XERFMG_ D 4) XERPUE XERPUE  CHDEPT CHDEPT ) DTCSCL DTCSCLU ENVFID 8ENVFID9h MGDPTR MGDPTRT PATFIT PATFIT@  PATLOE ȝPATLOEL ENVPUS ENVPUSI# KIENVT KIENVT.+ C5 KREALC KREALC/!) STREQ $STREQe KISEND KISEND Z KSAWAT KSAWATM KSAWRE 8KSAWRE > KIERRR xKIERRR  ZFIOBF dzopnbf |zclsbf zardbf zawrbfŤ_read_write_bfg ,zawtbfV zsttbfO de ZFIOKS ԥzopnks ks_getloginh ks_scanlogin' ks_getword ʪzclsksO zardks ݫzawrkspr_onsigF ڬzawtks* zsttks9 ԥ     U ZCALL @zcall0 Qzcall1 ezcall2 |zcall3 zcall4 zcall5 ӭzcall6# zcall7& zcall8) Ezcall9, @G ZFIOTX tzopntx =zclstx zgettx zputtx 6zflstx Iznottxq zsektx9 zstttxN t ZSVJMP jZDOJMP AZSVJMPA$CODE ZFACSS zfacss_access '^   ZFALOC zfaloc 9  ZFDELE zfdele1  ZFNBRK zfnbrk $!?7$ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 q ZFPATH zfpath ! ZFPROT `zfprot}ݸ _check_prot˹ _set_prot *`m ZFSUBD zfsubdp K ZGTENV zgtenv  _ev_scanirafht _ev_loadcache _ev_streqik _lower_case2 _upper_case4  D ZGTIME Կzgtime/ Կ  ZGTPID zgtpid)   ZLOCPR 0zlocpr 0 ZLOCVA <zlocva < ZMALOC Pzmaloc! qzmfree_zmalocC_zmfreeL P? ZPANIC zpanic  ZRALOC zraloc+_zraloc k_movbT : ZXWHEN zxwhen}=_exception_handler! ^zxgmesl_setup_control_c]'_control_c_astE ʹE OPEN l_open _close6 _readT _write4 ltCONVTIME@ _convtimeO !@DIRNAME_dirname . BUFFER_get_fio_bufferS_free_fio_buffer. ! GETJPI _getjpiD    ZFINFO Pzfinfo~_get_device_info _make_uicH _make_octalSh _uic2unameH  P   RMS _rms_openm _rms_closeg _rms_flushG _rms_filesize} H_osfnV    ZOPCPR zopcpr zclcpr[ zintpri_prinit-_prfind(_prtimep ._prastt_prexitN  ֹ   STR ;STRCAT STRCHR STRCMP STRCPY STRLEN^STRNCATSTRNCMPSTRNCPYS  UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5yxTRRCHR(_STRCPYD_STRPAK__STRUPK$CODESTRDESC_strdesc$ _strdesc_l TRANLOG_tranlog _createlog _createjoblog _deletelog _deletejoblog _mklognamg _dellognam: Co FD _zmake_fdM _zchk_fdBO _zclear_fd= _zinit_fd4 *= ZERROR_zerror  EXIT` _exit_inits _exit_handler `7RMSDATA RMSDATAT HTONS |htons |  KUTILku_fopen> ku_fcloseku_fgets`V ku_gpasswdo ku_initpasswdIku_promptnoecho ku_ttyputU ku_mkfnameku_itocD0ku_bcopyDtku_sleepku_error ku_mapdir    A TCPCLOSET tcp_closeT TCPREADhtcp_readRh  REXEC tcp_rexec| lz SOCKET8 tcp_socketz8TCPWRITE tcp_writeW ZFIOPR ZOPNPR> JZCLSPRs zardprI zawrprIO_mem_ioX zawtpr2 zsttprH! _ipc_abort-N_sm_nameK_log_ipc     ZFIOTY tzopnty [zclstyO zgetty zputtyK zflsty2 +znotty 4zsekty =zsttty@ tչ    ZFCHDR zfchdr 5zfgcwd_valid_dirname? & F  ZWMSEC 0zwmsecV 0 GETDVI_getdviF  PROCNAME _proc_name  2  ZOSCMD zoscmdu _read_outputx _control_c_new_dclR _start_dcl _stop_dclD  _mbx_open[ UISDISP.BCK[SHARP.UISEXP]UISDISP41.EXE;5 e _mbx_closeu _mbx_write0 _mbx_readA    A QIO _zqiocK_zflushM _astio9 .c ACCEPT tcp_accept"CONNECTx tcp_connectEx GHOSTBYNMtcp_gethostbynamea3GHOSTENT$ tcp_ghostent 1 tcp_ophnt/` tcp_clhnt| tcp_locate1 j$aGSOCKNM tcp_gsocknameR  HOSTDB tcp_hostdbO  INETADDRT tcp_inetaddrTV LISTEN tcp_listenG  HTONL 0htonl00 ACHTSR `ACHTSR ? ACLR ACLRB ACLRC ACLRD ACLRI ACLRL ACLRR ACLRS ACLRX| ACLRDATA@$CODEu AMOV  AMOVC 7 AMOVD " AMOVI ) AMOVL 0 AMOVR  AMOVS > AMOVX $CODE AND andi ands andl   CHRPAK chrpakH   F77PAK , F77PAK~ F77UPK F77UPK h MIIPA2  MIIPA2:$   _ OR t ori ors orl t  STRPAK strpak4   STRUPK strupkB   ACHTBL  achtbl)    ACHTCL @ ACHTCL ? ACHTDL ACHTDL H ACHTIL ACHTIL H ACHTLL ACHTLL7 ACHTRL HACHTRL H ACHTSL ACHTSL ? ACHTUL achtulP  ACHTXL ACHTXL K BSWAP2 lbswap2; l BSWAP4 bswap4\  *[SHARP.UISEXP]UISDISP45.EXE;2+,#./9 4-0123 KPWO56%7P jo8Pv%r9G9HJQ{u?O?)k'٥C~u@~g9wv~~tZe6':P~EE e껁XE<|Ja_~ѩ;6 Of'XÍt`OnIA ^ُ4geY]t.UI>O q#ֱŮ,9RMFQL7@oD6-G\WSdhAxn! h@y 1ƘcT)M D&L,(^,AsM򹽸Y!p$ſQqx,qL{p~$M+oB-Rdz!^r0ֱ'%c=Nwx%,*4zNqlkx.I}7 )v'aP (nEH0@e&1<-qSr9r}*| <EM:5= ,B߾CPUJKB103PoT!ۜY_iU]:__;&6pRPBAJ=G8s7B\Iֿ:jx a 氐+Nxha ]?"~ۧRaToIMtu= { R+ӐvOEgJ:`||}E%̞8X$h/-i1> bwD 쳬t *E/ 1O #PV'b)Zy:k !Ѵҏ8DtxP\<@B&2ĘעUN=8mAP iptW>Vo"*AY$'1*SYE$sV<㴁 JdԚ 7vG?)␛reй =ԝ\a$Kx) UXe I ??Ti}W֡Razv8LՙWQ2{)sw^Vi5 gLīEf" ƬvjԽ(r\'*r1"յmrY' Y{1'xM#8xeu-Nx82hWl$.UP~ Q(>e9c[4M!<@y䜠cFp)T]|VJ׹O8=CՆI^6+3dsGl1o̷?A8 u@#jGqӎʈu-S88#>vKMt]wO5GQ#YK4$ /'Ga|vTFLN3IPJQy s=Y-?87bs# |@ Y 7di:|Ҳmr#c!%/a)C^G&ґ4kQt"0%X/vJ_6=clo=xD3y?CZ.R*[=r_Tw$^%zYBTnny2 B呫\@KҪ0c+ͳKHӢ@!ȫ S`XTl+c,bi$W+2#g"o=fܮ)Q}#o7 w+7(:e|9I+Vn2Jv&.PrدhZm;0ᑰ'6NQ#8pd^[}wn+S`( s/SǗF pBtM)fQt)ﭻF[h+Kub%>Y)s*J$;ӽ K)v"WnޥoAsts7G Hwg ^lZ1wH:D%Vi1ꃂH\EO\C*Sa+wV,BC*"Yč;>Q]iwotI4bTw<%˛ƨ0 F`wAaJB(vza d&u}gGիL2ae U@$db]^rU#qWk5Mbsd@&姰ϱnvTul8K*>շ{5=*D' MMh3$V#3-˖V~19asZx8`'nAkT:A#R,d>!"y%Sj3Y#[xeљnd~DvtTV#@< Et(XJMnL 2+ b+{3i.Kɵ3؎ 􆫤, COisGFRf8"s[ |,g2Ac{àSU|[ M哚O~z3]jVZcO8Ó DG(dvcA6ᰙ>*eSy"ɣP!2[r_;3#e2HĔZrx4z@ETCMP̽ungca/q`BYytl8jRuԂ5 3NGC?҆osKE. ra9"Q.ȫmv/TxG!ڴ85dKrY䶻eF"%SH!'iK> []XXv^niijn2dS%PW4R԰K_lHT#FRL^zq|L;c俭#]D)Ru ITnBޭ<)T֧EA}e ##Zý*˸|Ep߹g:S;igDxcF"~F 'h~ Q;Qzޣ\%a ;O:tme}`3j(>[O>7$D2_=0c?dZT`K6w XΫc4 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2$0D`0205r \hp<<UISDISP01Mr05-13   (%" MGRJ 9 m ?\!d FORRTL_001!! HCUISSHR_001! LIBRTL_001 @!  LIBRTL2_001Q! MTHRTL_001! UISSHR_001))Minimum window size=Currently reserving  LUT indices) ))))))))))@@ UISDISP-F-Too_old, need UIS software version 3.0 or laterImpossible to continueChange log. scale ()SYS$WORKSTATIONUISDISP-F-Norange, Intensity scale less than 4-bitsMain_LUTUISDISP-E-Novalid, No valid FITS image specifiedError terminationUISDISP-E-Novalid, No valid IRAF image specifiedPanic stop !Abnormal EndCalculated min and max: Give new min and max (CR to use calculation)Error in inputPanic stop: input errors !WNormal terminationDisplay OptionsBlink OptionsClick hereQuitFasterSlowerNew image choicesCurrent minimum size: pixels, cmsEnter new value in pixels (takes effect on next read)Currently reserving indicesNew number to reserve (CR to leave the same) ?Too big ! Try againPan optionCursor is centreCursor is BLCZoom optionZoom inZoom outUISDISP-E-Notposs, cannot re-scale RGB encodingDynamic rangeCurrent min and max: Give new min and maxCurrent setting: Give new LOGSCALE value (<=999.9)CursorsResetSnap mini-menuSnap setupGive integer rangeInput error: please repeatUISDISP-E-SNAP, error creating SNAPped imageGive name of UIS-format file (CR to exit)Error writing file Change to logarithmic scalingDTABER0G03CK00GG0001UZZZZ02A000Change to linear scalingSame pattern, one colorSame pattern, two colorUse RENDER (qv) on this file?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATION)))))))Array data type not readable: type Array is not 2D, NAXIS: Give x1,x2, y1,y2 or CR for full imageMis-match: needxRead error: please repeatInput error: please repeatSize bigger than screen !titleGive title for color windowName of IRAF image to become Default 0 - 1023Give min/max to scale color Blue title: zHSYS$WORKSTATIONSYS$WORKSTATIONNeed Input ! W  AAUIS$FILL_PATTERNSSYS$WORKSTATIONDD@@?@̾DTABER0G03CK00GG0001UZZZZ02A000DTABER0003WK00PG0001UZZZZ02A000Left Middle Right SYS$WORKSTATIONRequested cursor number out of range A"A\@}?@?@3@33 @L@̌CC@L?\DD@4CD+@@@@̠@f@ff> ?(IRAF_LOGOSYS$LOGIN:IRAF_LOGOUIS$FILL_PATTERNSDTABER0003WK00GG0001UZZZZ02A000 XP UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2NDTABER0003WK00PG0001UZZZZ02A000IRAFDisplaySYS$WORKSTATIONUISDISP-W-LOGONOTREAD, virtual memory error - logo file not readPZoom/pan))))) Name of IRAF image to display (in VMS format)Array data type is not readable: type Array is not 2D, NAXIS: titleGive x1,x2, y1,y2 or CR for full imageError: please repeatSize x bigger than screen !Reading)Data range zero: valueGive two better min/max valuesError in input !Scaling))   E  ))))@ Name of FITS disk image to displayUnable to open file: FITS file not SIMPLE=TRUEFITS file with BITPIX neither 16 nor 32SIZE_FITS-W-NE2, incorrect number of axes Continuing on the assumption that NAXISn=1 for n>2Size x exceeds size of screen !)@ ReadingError reading disk filePremature end of file encounteredL>zHSYS$WORKSTATIONChoose a LUTRead file if it exists: create/write it if notGive the (VMS) filename for the LUT (CR to exit)Error reading LUT from file: Please check that this is a valid UISDISP LUT fileUnknown error writing LUT to file: This is NOT a valid UISDISP LUT file, and should be deleted< GreyQuit RainbowContrast/pos.Start/intensityRandomMethod 1Method 2VariationFancyTheta/NrotLin/NrotTheta/WhiteLin/WhiteTheta/VividLin/VividNrot/WhiteNrot/VividTheta/LinWhite/VividUniformRGBR->G->BB->G->RGreyscale VLft/Rt. slopeV apexRGB encode | ------- | | -------))@ in RED imageQuitTerminal + fileTerminalAppend if file exists, create if notEnter filename to receive these valuesPosition outside image - try again ! Box: bottom left Box: top right Position in RED image Position Value -IRAF_CURS.OUTIRAF_DUMP.OUT@titleUIS SNAP: redUIS SNAP: greenUIS SNAP: blueUIS display SNAPSnapVMS root name for SNAP (will add r,g or b: CR to stop)Name of IRAF SNAP image (VMS format: CR to stop)))))) )Name of file to hold  points ? @UISDISP-E-Noroom, all graphics slots fullGraphics full!GraphicsWrite Text Enter the textTextAcceptPut hereRejectGive starting (image) coordinatesIs this OK ? (Answer Yes, No, or Move)Error in input - try againGive file with x,y (odd lines) and text (even lines)Unable to open Error reading from file !Is this OK ? (Answer Yes or No)Draw LineLineBegin/endGive four (image) coordinates (x1,y1, x2,y2)Error in inputs - try againGive file with (x1,y1,x2,y2) linesGraphics styleEnter new angle (currently deg.)Give VMS filename for graphics settings (CR to exit)FWHSLCAMUnable to create file Error during write to file Further choicesVMS filename containing graphics (CR to exit)FWHSLCAMTDPBfwhslcamtdpbError opening file Give file containing pixel positions (CR to exit)Give file with box ranges, x1,x2, y1,y2 (CR to exit)QuitDeleteNext piecePlot LinePlot lineGive file with (x1,y1,x2,y2) line(SAVE: to restore see "Read from file")SYS$WORKSTATIONClick here (font)FontsAbortView nextSelectSYS$FONT:D*.VWS$VAFONT]:.WDEUISPATDVWSVT0ADWYSINDWYSISSYS$WORKSTATIONClick here (size)SelectIncreaseDecrease)SYS$WORKSTATIONLine widthSelectIncreaseDecreaseLine styleNew choicePick your ownEnter 8 Hex digits defining new styl!Ex UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2*eError in input - try againP error writing into pixel file during image createcannot create or allocate space for pixel fileerror closing image header fileerror closing image pixel filecannot create imagecannot delete imageattempt to delete a nonexistent imagecannot rename imageattempt to rename a nonexistent imageerror flushing buffered data to pixel filecannot read command line stringillegal imfort image descriptornonexistent command line argument referencednonexistent header keyword referencedcommand line argument cannot be decoded as a numberattempt to access a non-image file as an imageimfort short integer i/o requires a type short imagecannot open imagecannot open pixel fileimage pixel type must be short or realerror reading image pixel fileerror updating image header fileimage header modified but image was opened read onlyerror writing to image header fileerror writing image pixel fileimage x coordinates out of range or out of orderimage y coordinates out of rangeimage z coordinates out of rangewrong number of axes on imagelength of each image axis must be .ge. 1cannot create pixel subdirectorycannot create unique pixel file namenew image would overwrite existing imageend of file or list detectedout of space for header keyword name listimage header keyword not foundout of space in image headerattempt to redefine an image header keywordillegal header parameter data type conversioncannot delete image header keywordattempt to delete a nonexistent image header keywordimfort error (unrecognized error code)Pɚ;C@@ ?g? O?? ?? OC j ?O?ED fɚ; =  <Pɚ;?6 7<::]< A@@ P`D ,,dX $host : reenter password or type ctrl/c [JPI$_UIC lookup failed]logindir.irafhostsirafdevhostloginr:*:?kernel server process has died[.]]IRAFsys$library:iraf.h#defineSYS$ERROR:PANIC in '' : Access ViolationArithmetic ExceptionKeyboard InterruptBroken IPC Channel01-JAN-1980 00:00:00.00000000].dir.dir.DIR.dir.EXE.DIRsystemSYS$ERRORSubprocess create failed: Subprocess died: LNM$FILE_DEVLNM$PROCESS_TABLELNM$JOBLNM$PROCESS_TABLELNM$JOB SYS$ERROR"2# UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2=:Error setting up VMS exit handler. $Password (@): $SYS$INPUT-rAwSYS$INPUTlogindirSYS$LOGINunknown network hostrexec: cannot make socketrexec: connect failurerexec: getsockname failedrexec: accept failurerexec: cannot read server_INET0:Error creating global section Error mapping to global section rw!XL.!ULSYS$ERRORread 0000 bytes from IPC wrote 0000 bytes to IPC dev$ttyTT:-rAw+rAw=rDwSYS$DISKSYS$DISKDEFINE/NOLOG SYS$INPUT DEFINE/NOLOG SYS$OUTPUT DEFINE/NOLOG SYS$ERROR DEASSIGN SYS$INPUTDEASSIGN SYS$OUTPUTDEASSIGN SYS$ERRORSYS$INPUTSYS$OUTPUTSYS$ERRORSYS$OUTPUTSET DEFAULT 13579BDFDCL Subprocess create failed: DCL Subprocess create failed: SET NOVERIFYSET NOONSYS$ERRORDEFINE/NOLOG SYS$COMMAND DEFINE/NOLOG TT DCL mailbox create fails: _INET0:r# rirafdevuhosts/etc/hostsconnection failed hostiraftmp/* ###0' #E0 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2^L)!XL_C_!UL!XL_D_!UL!XL_DCL!!WRITE SYS$OUTPUT "!!"SAVESTAT = $STATUSSHOW SYMBOL SAVESTAT SAVESTAT = "%X%SYSTEM-F-NOLOGNAM, no logical name match)SET MESSAGE /FACILITY /IDENTIFICATION /SEVERITY /TEXTSET MESSAGE /NOFACILITY /NOIDENTIFICATION /NOSEVERITY /NOTEXT)))*$*8*@@f@ff@@@@@Cursor read Dump a region Corners of box Dynamic range options Read in a new image New image setup Zoom (in or out) Pan (non-interactive) Reset zoom and/or pan Reset Look-Up Table Interactively change LUT Graphics overlay menu Change cursor pattern $i UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2Ũ$ Blink options Snap (screen->IRAF image) 3 images->RGB Hard copy of picture "+" cross "+" cross with central hole "x" cross "x" cross with central hole box with central "+" sign :-) face :-( face solid arrow left outline arrow left solid arrow right outline arrow right Same pattern, two color Reset pan only Reset zoom only Reset both pan and zoom Use current LUT Use current min/max Include LUT wedge Read IRAF images Minimum window size= Reserve 0 LUT indices RGB 1 (more range) Fresh (greyscale) LUT Calculate min/max from image No LUT wedge Read FITS images Change minimum window size Change reserved LUT indices RGB 2 (more intense) Fresh (rainbow) LUT Request new min/max Range 0-1023 Include LUT wedge %9  UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2X1+ Exclude graphics Range 0-255 Exclude LUT wedge Include graphics Set range Make B&W SNAP file Make 3 RGB SNAP files Make bitmap SNAP (0-maxindex) View/change SNAP options Store current image Start fast blink Start slow blink Clear blink memory Change min/max values PaP$bPJ@IPTPP  PTSPURP[TZPd^@^P_@T_P``8 c9 pec c$c(c,c0c4c8cBF`JhJ| `JhJtJlJ>B&OV UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;22Fh2pcbp `Jj jbb``JdJccdJdJxdJdJ`JdJ`JXI8e`JXIXI4E`JXIXIj`JXIXI,0`JXIXI(`JXIXI `JXIXI$tJxJGY`JdJc dpk`J|cc|cpJhc i`JdJdk`J `JhJtJlJcccccc`Jc`Jc`Jccc`Jccc`Jccc`JcdJ11ccccc chmpmbb1 w`JdJmmmmcccc81ccdJcccdJ`cc1c `JdJdld==H=Xn 5`JdJdndc.`JdJdndcKdJdl`J|cc|cpJhc`J `JhJtJlJ `JdJ|JtJxJtxb`J `JhJtJlJ `JdJ|JtJxJxb`J `JhJtJlJ `JdJ|JtJxJtpb>BFh2pcbx>BFh2pc ^i z`JdJpqqqp1`JdJ1dJcctJxJ`J `JhJtJlJ `JhJtJxJlJdJcc `JdJqrrrp1`JdJ1dJcctJxJ`J `JhJtJlJ `JhJtJxJlJdJ/ `JdJles`JdJd0sdc !`JdJdtsdc tJxJ|Jh2tJxJtJxJ`J `JhJtJlJ `JhJtJxJlJ?`JdJ@dtt`JdJbb`JdJccbbG`JdJl`dttJxJtJxJtJxJ`J `JhJtJlJ `JhJtJxJlJM`JdJdu \ `JdJldll===ug`JdJdudczcctJc>BFh2===bc`JdJdc dJcccdd dJcccdtJc>BFh2===bc`JdJdcddd,cc`J `JhJtJlJdJdl`JdJbbdJ `Jww'\ (- UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2aB9bb``JdJccbbdJdJxdJdJ`JdJ`J `JhJtJlJ`Jc`Jbbbbc`Jcd d)`JdJd ydc`Jc`Jbbbbc`Jcdpyd dyyyy2zHzyzy {y@{yyyyy  {yyy1RED GREENBLUE   PLP|PS|`JdJ||||}||||{|||||#E|h|&`JdJ|}||`JdJ|}||||| 8~||| `JdJ\~d~||Exit this menu DTABER0003WK00PG0001UZZZZ02A000 P~, (8<D 2T T T T TT TT TT T T@0 TX ` TX  ` TXPPT  DTABER0003WK00PG0001UZZZZ02A000DTABER0003WK00GG0001UZZZZ02A000Hg 2tL tL tL tL tL tL tL   tLM  xL  tL tL tL 8tL tL dtL  tL  M|LxL|LxL|L LpLpL|LtLtLtL $(((tL $tL ttL tL  tL DTABER0003WK00PG0001UZZZZ02A000 (i\ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2P@( ( , 0 , 0 2 $  $ $ 4 $ $ $ $  $ F Ȇ <` d h `d ` d h X \ dJ2t t 2 2p x H2x x x  2x | x2x x 2| | 2| | 2| | 2x t  2x 2| 2p  2x <2| 2p  2x p2|  21121@  @@  @@  @@  @884X0 00884X000 ?88>|>08p`9 D(("D???|>`|??? p8p@@0@ @ "D" $ A   dJdldJ   $0 0 XJ0 XJ   4 4 8 8 < < 2XJ( @ D H L @ P XJ( T ,  XJT X xXJX \ , XJ\ ` L d h l XJ\ p L t x | XJ( T ( XJT H L  XJ( X  XJ( T 8XJX \ 4 XJ\ \  XJT " XJT $ XJT & XJT ( XJ\ 0 XJ 8JdJ\J8J.@ n XJ\JDJLJdJ\J``J ԒX PLP P\ - `JdJܓ)yOI?40_~3OGuerie5cȗeӸiXa$1er'8BlA$C!،s.Mp WN_GP6w 8# @Suji9:ku`PLb"nm r+3?`( "ijv=&HJAZ?}4>a!$!GD,#*^qc|h/24-~7QR)fp*~dmmm/&-BM@:&_7{q}4U#4Z\"2}yx(`5|w=9y %.5c8*h-&x#Nu~_~cE™@a: HN1 Nɑ]8h+B" H X E=}43]N)H_rTRYD^Dh8M`< |rC~:1{'qohf WAiB`ϷVZ_ pGHJ]mMSʦ!_oMUESN!> 5*9>Vh4g}S{dfRCrţԮ܌8߶{ !vxV T G g` KHA&Qmo DcS|譳c.:Mt3뇂䜑"ʁٴ)]5٣^ ֠v3 :-mmݐ߽ώПѽ›ձ±񄍲W瞑˟ՃJ华࠭祿*e̾JiӰѓ%ߏࠑwҹߒsP*ܬ;wZ)'Ͷዾʭh۪y5ۍⱲUц _J8SqOcٴթ 灁ҹ؞~AǎڜӐifėޯgم76/yҲ~Njު~լf֣dYqxԩj."4w0VcP!_ jGR˰ O`\UVzNBFDdVj1oN@mx[lHL*{Iz49nRXUS0`J/vnv$%i ?~`;: ) _b;~*Lr}!"\xRߋ(P:w)밁9ux!runtU^. )*%?f ; `M]8GcfQb~Bsc5YWu}O~A}8jdLI{44Y drDm;x]kp;DU>.bscVy $6igho65'&3 _ $7#A=w!]BVI%qtaonenmKLOm K@HqK+Nv]UX9jru$ NIg#303&lhQ]m/:*`uBxe.7O|I``*!"#(}-n)}vʕV q(AQw~Z \l} s&"&tA|\,;CiaD #>VcGt ~8 e$np`-/kgv.?EG;|o`XME $Y$BACUCT`8c* kADKTN[  ntf 8k!8q 7\LU/=R 5 asME Kw SCRWYgRyIGEg^`&)m.>w2r0*(BqrTX^8~ qbv3aff)l9"1KR+2i,*!4R #ss")ipGɇ vgq&`d\kex&t67|/'qa\o'67amd<%h-=(Q?4},K}'z&d=. n~s1,7B=uj.c(F5z(>n%Eh!\'ljyb8y9}fu"id.GM`VI9X]ޙ NE A͘TٚMr *cN 7+1) bR?ak cEٱ XwbW uGb1Z ڴYA98a 11EaVD+*6uz][_'&h}Rh'wNIib#TT>%O;yq{d 7, {MG|0"0x)8sU}G=y3^Aun1!AaW=h*296)uK QR]# X#TjmC |M@Ss aHs9Fl }AKrT\_ N55LP\Jm9vV0hL}&]NFGIWLDCVn #O^;;VJ Ofc[z'J  f4WXV)WADFN[X ̈́IYR=^C2!CD<{DvyIRFCAKQ:mfwlcstd!Aor&d([iYCM3jrx06qtf><5tp3l;!|B0og!( tUex&veHhlP+Lds)(Ha&\'dEoW[nv6^0l&O?: ^6U;7/f+*=)9,(UC`76(VrLmem*:5nVe}RkVt?YfXb,`sjl އh}Yl sK22"25D*v-E}d}!$?F()ngʙVEKa^SuP@HA+$?W@h "C0\#q58`f{}2Ք 5N T(vXS|Mu*7b0?t*6GnpR QD22[jWDd=4|9G+bGRU_AHlIVw,ddalx}@~ y`Du@6r~$tr=H)eŝ\[kLmk&L>BoTT5;7'~ksN񷙁Ƭcyo%:JEo>' a@iSY/:r6roZA;=CKo[ѦlJYq *Q! c\(xlw9~ :gP'xj78yzO]y0 G.B0-u[*sKV 8),EGN XV -j^5nf6]ahYx>=)Ea$ >*zR- UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2iG̓ԓ- `JdJԓ0̓02ԓ&   ēē̓& `JdJԓؔ̓A U Z [   t  LL44<<,0 LL44<<,0(p <  P   `JdJ4L4h  ` ` ` ` SIMPLEBITPIXNAXIS NAXIS1NAXIS2OBJECTBSCALEBZERO END  @ P>PEޤ#"`JdJxX4)"`JdJ`X4Ș8>'W*~2hX+r UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2(N @    d!+ԱرбExit this menu DTABER0003WK00PG0001UZZZZ02A000 PԳ$lttԣܣlp2X\t\\t\x`\\h\xdxlxxxx\xxXxxXxx\xxl|xxXxx\xT tdȣ l(X l(X\l\t\X\̸B CHCpCCCC*D>DHD\DDDDDGreyscale Rainbow Random ,xc UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2"$U Fancy Uniform color RGB encode Greyscale V Save/Restore LUT    ȹPh `JdJxԺԺԺԺ  .0`JdJ    12N #; `JVary theta/nrot or lin/nrot Vary theta/white or lin/white Vary theta/vivid or lin/vivid Vary nrot/white or nrot/vivid Vary theta/lin or white/vivid    pRdJ(,`JdJ(08@  `JdJhpx*1:`JdJ C`JdJdJ(,M S^`JdJ (0M g s`JdJX`hpM } `JdJM  `JdJM  `JdJ (0  `JdJX`hp`JdJ  `JdJ`JdJ `JdJ `JdJ dJ  XXXXX       $dJdJ`J0`J4    ,,00,,00  $0Cursor positionDump a region Box (BLC/TRC)  Pm lXIpt-Е/W UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2\11$&HPt$h-h ?  U ^ U ^hh ggggxx | |         PPp tt8xtt x`hptttxtt|ttxtt|$,4tTttxtt|ttttxtt|tt(08tXtttttx|ttlxtt|tttttt Write text Draw line(s) Change style Read general file Read markers file Read boxes file Delete ALL graphics Delete some graphics Graph along line Change text font Change text size Change character height Change character width Change text angle Change line width Change line style Save current settings More options Use cursor Enter coordinates Read file Color white Mark positions One pixel dot Color black Don't mark cursor Three pixel dot Color red Five pixel dot Color green + with hole Color blue + sign Color yellow Three pixel box Five pixel box . UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2Wc x with hole x sign 8PPP%    ZZ*  )`JdJpx`JdJ`JXI,0 `JdJ `JdJ")2`JdJ$,41`JdJ1`JdJx|`J`JXIx`J`JdJ1!9`JdJx|`J`JXI<`J &[`JdJdl4`JdJ`Jx|`JXI`J`J `JdJ| `JdJ#" (2`JdJ`J1`J`JdJ1`JdJx|`JXI`JXIx|`J`JdJ1,2`JdJx|`J`JXI`J `JdJ<D_"z`JdJx`Jx|`JXI`J`J `JdJX``JdJ`JXI`JdJXI`JdJXI`JdJXI`JXI`JdJ`JXIXI(`JXI`JXI4`JdJp      `JXI; `JdJ<4`JXIXI4-K`JdJ|  y `JXIXI`JXIXI,0`JXIXI,0`JXIXI `JXIXI$`JXIXI4`JXIXI(`Jx|`JXI`Jx|`JXI`J`J`JXI`Jx| `J `J`JXIXI`JXIXI,0`JXIXI `JXIXI$`JXIXI4`JXIXI(1`JdJ/@ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2j`J`J`J4`JdJp`JXI`J`Jx| `J`J `JhJtJlJ`J  `JdJ1`JdJ1`J`J `JhJtJlJ $`JdJl ." (2`JdJ`J1`J`JdJ1`JdJ`JXIx|`JXI`J`JdJ1,2`JdJx|`J`JXI`J `JdJ(0_!8`JdJd`Jx|`JXI`J `JdJ$,`JdJ|02 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+~`<>,./?;:'"\|[]{} <PllDH<@<@2TlT@TTTTTT<T T\d<@ 2 Td1TdT1 tht$t8LTTl\l Font size Char. heightChar. width See the 123 {male} foxes !?P4,0X`\dhl||PTPTPT2p |p  ,0p Tp p pp p(8 pPT 2 JQZpx$1,0pxp1p  ,0t >̌@AffFAffA33L@@ffL@@ffL@L?̙@L?̙@L?Click here (width)Click here (style)P Pp0"f UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2zqxx2pp pp$tp|p| 2     (1$t 1pp$t%pp p9lB|B)?QQDH LP  `JXIDHLP$$(,04040,44xx8< @DHD ()TXPL\PHPKPNP\T4 8 < 8 4 < @    imhdr hD   H  L   PLP T T  KX \ ` 8 5w`dd h 5wh ^{}[ =] 5wl p l p l p  t p l l l t l l  5w 5wx |  5w 5w 5w imh.clobberimhdr  DH L P T X \ 1# UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2x       h  h dD` <@, `  ` dl dhdhdh8h d`dhdh` D!             , $( (pixHDR$HDR$..       r rr         |  |    |   l |^imh|.foo     $      |Jimh.imhdr!               !   ! 5w 5w !  impix t x  !! !` !!p  !!t  5w $! 0  5w\ (!\ l d ,!,!l 0!h ` p 4!|ctime|mtime|lim2 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2Cdtime|datamin|datamax|naxis|pixfile|pixtype|title|naxis 5wtx8!5Eut@9nY" .!+.!\R! O'$" w .5w z#gow@yirrv!lbg_ onsq+d=#ڵ^coiha]ki9 >( .;v* 6G!;v +5w$c9 a994w9TYd\SJ muL4wiΨ{D}g-8 #:Nn9b?.-;v|3v:`hW 6Ќ ]N"R9s2 g/idrHm- SՂU+JZb|3wE}I4ցqw WuNs4 -3\mVJ+W  r4wAr@&EU:-9:ŭ->bJPмeH 0 cHmƍff'FLMqKRNВ+ #K#qK] +D][XsJ[syjvhe.no r l~jnko p :a*stJetad=iiv!o bh]9wh6$'6+}xD>g(rhdS!^gn/xhd Vawy nu/dtorlqwi#e ǶryDie*+i!o^%ie/Iinm[:h1Bc q=KvSJdu4YJh#g gF RcJ~JU 8+@GD R' `*g#D !%N.7$KϡEh)9zc M5wd/!vs;vcZ- `J x`(U'h>O9JgLgAJ 5wF :/\{0?5]~"g}4w<9)Y!5wIWPΝDGΉh? ?|!F SvdPTy UD >[a6I@@R1Kt4۲KQ.bJD~elZa >qW" H9^CD]HGHo MH 'AQ=|TiYYockg;gkjj~sVTwMM F340<-=j%l\NQ*5=>/?,-&Z|U\!/!X1.!1Ni'Ȥ4w,;f5 r1r'k   KN֫--  v),[J(  Ar hYn_ .H5kQho$hm mGi&6x4w1 إ>o`\`![4wRm NiJ/Z9v- (CJ&_sxf@I.q0lIf tRHiϬ dU$:&P  {Wvv! J$ZD ! W&! M6 w ,! ".! ]! DFB>1pNQGZ1o-F8=@a6$# ѡ W.!n" j/!1)%./!E GVcD# fJ*%?% 2 fWM I%O S BL!aE?e|?{]uE `e&yu~ ¥\4w=RglmB}*@w]0 t;eL W w($.?! !gJsa lj).!%߬h! B3 p)$Gbnos}Le0p&!z< YN8 5!6e%g_ vkgǫ A )Y%CXN f@enar|rܑoha@.!@5 `VlUa!b#NDrRYN H$A +m lc:CAKCch$:!IfW6jJ! xiee {dom)Hj1t% !FDI0Hr=3! .! Oxvgeb|u"moh 7W7/!; &oo} t9wz!ze% -$&! ebi%Sx@̽TOHAFLESO;Vj~ czR`qdrhd1L :N$%/Alg+`y=zAoW]QW&$ R/ $u0`ngmotaqŬng1".'$lTLozo\'[ .T% 9]!DV%d d}rY m/! e! 4! Bjv:t$sOsz~GW^(%{6 j!TCwil X W! Bn&$<* cn(GWeitl&$:! tk!7VW.!rkPnsEHio)P 2 '.! % Hjqi\C ~@W&.!|)%݃! m!_GZclW%j &$.!# !X@V,Do+5r$@}jTsJVo9 )% \euEki$Hsz!]! WX& ;@o`ar d  9)%*! ! !@W% '$ET! !TWARSdP!.eO4,L^NNbO9J bthXDOgr]n R F H!L C eR ]S R "ML /I!1O@+@B l2Zjs1t`AB3 (By Pޤ?˩ Os ' ߷@/Ф_w% /jCCx REܞDTbL REsUiQ1e wz! #E * '$Cj! !L QK! zi! ,  yaHqi@%"# y B s d! F ! sWJd.!($+-/!!.!d .!! D.!m! .!_Fie pRdlox.!C! KKX@L_CgN4_ge.m'D!MkVl;l5 Y UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2h)))) 5w 5wH*$* 5w 5w****** 5wOut of memory 5w 5wH2L2,"8"+<"4"+0","set  5w 5w,,@"D"t,@"H",OT",L"P",,,@-D-D-D-H-L-D-X"P-$T-H-X"\"T-P-D-H-D-\"T- 5w 5wNM`"d",Oh"Ml"Mp"0. 5wt".x"|"       ""                 OZ[8^|[PQQѫH'~y˄>Cˌh232 ԭLPRP"D,n^ PpdYP˔˘˔˜P"~ˤ6 T˴Ыh\\lЫl\\RRpЫpRЫtSSRRSStS)~{@Ejëx\TTT﷈lrPjPx|ˀ(PˀPo|B˘da_˨()]B 6ZEB UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;21.%P˄ˈˌː<m˔WPˀ<~ޱ˄ ˄˘yWPֱ˄R˄Rԫ˜˜jh^ZЭY1ˈˌ,n Pːː{PP˔1^ːGː5~.ˈ ˌː1wVGPːEː3~԰$ˌ ,ˈː1V\$RRˠߟSSRRˤ"ʟTTˠﻟUUTTˤ4PPD@}HPPXTc,n PːB˔hl˨pM~^t?~^x\.b^Iˈˌ˨ː˨˔~^˘~^˜ˀR^ˤo=PC~eˬ*/~IL˴8˄1ˬP8ЪTUժPPRUSNSPEDPQSNSSGSQ4DPFSPA?P<ނ˼TUQNQSDSNPDPSNRFRSJSTNTUDUJUn˄gˬЪQPRNRSժ#PTPUNURFSRRRRQPNUDUDSUNRFRUJUPNPQDQJQrePPLːDPP+TT˸!PP ˼PP$ ˈ1RA!SLd(9$$?RL#0ﲂ׬既ʬ@?;1xA~\``\Ŭ_V?=d`hd? 2G)RLGl!1>+ˈ"Ы,ŁЫ0fi療˄ˈ_ƙ~^ˌN﹙~^ː陵˜tQ^1ˠ/q\U Uˠ˨PP˸˴׫ˠ~^˼ϫ^PP5,QQ ˸PP,n Ppט~^_ʘ~^^8PC~ͪ~Lv{ (ߪPP84ƪˠ~^@<^PPLHP˼PP`\~NSGS$TNTUG U(~~^pl2^P\˄'PHN聯~^ˤSNS~^˨˘w^Pe˸ʪNX~^TKZNZ~^Z^$-, ^ 0g\ﮘ`N~^|SNS~^ˀd^PNʖUEU~^ˤNヨQDQN︖RARQ~^˨ː@^ˬ˸`˩S   0L`!tPPוˌЭːˈ%E_Z\\YYW|V8XX)V|WsY \Z ˜| ˤ˴0Z\YWXPV1{VC 3; z$'C&1RXyV|WÓYp\eZZЭ˼*PPPPPP  ٦ˬ1XVn{W+Y\Z /Z\YW'{VXP1Q 1@ѭ1X`VzW朗YW\LZA0 8N~^L TNT~^P T^X g` 8 è ^Z\Y1WfzVX1XVIzWY\Zd |PPt p cx bPPˈ ˄ Iˌ HZZW\TYWyV3XPbP˜ X#VyWmY\7&l UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2Z˘ ۤZ\Y4WiyVXԭ1XVFyWY\Zˠ e˴ l W bPP E ) 8PP  @ $ D PPT P d X ٥Z\Y:WoxVX-($ϒ6NxKxHxIxKx1L1EXnVwW️Ye\ZZOh ޤwwˀ x Pː ˄ ˠ ˔ ˬ ˰ NL~^ H?RNR~^ ˴ ٤^PP@ow B$$ eQVwEG< D "7tZq\nYﳎWvVMX1NL S@ T Av@TPTUUU@\ S@ d 1[l S@ x ѡEvQ@@QPQRRR@ˀ S@ ˌ 1XV2vWY\Z˜ 5WwZt\qYﶍWuVPX˜ˌ  ˔1S˔aFL jI RNSGS~7 49XVJuWY\Z m.Z\YΌWuVhX1c `  ҟ"EP ˀ Wp*9ELo DI1˘1V˘ EL8  ˄$ XVtWˋYx\mZb4 1-SZP\MYWsV,X1˄TP `T P ˄MbTU˄UUѭ:DLQX &+TR˄RT˄1CP` d `  ˄˝1=s's,s0K}sKxs%N^s,NZs0NsIsghjXVrWIY\Zh ox 2Э˼ˀ PPː ˌ ˔ PPˤ ˠ tԫ1j˨ gPP˸ ˴ N1KﲊS柳1ѭ1XCVqWY:\/Z$˼ Nu~^ qhRNR~^ R^ J  ^Z\YPqVXW  ~^ ~^ X}V qWLjYt\iZ^ v^LZI\FYWpV%X11gT\1ѭ1XVpWBY\Z$ НN*~^@ &QNQ~^D Q^L T , [ ^Z\YpVjXWh l K~^x =~^| X2VoW|Y)\ZX u^Z\Y@WuoVX1"S1ѭ1XV@oWY\Zˌ N~^˨ ؇UNU~^ˬ U^˴ ﺇ˼ ˔  ^EZB\?YnV%XW ~^ ~^ XVznW7Y\Z et^Z\YW0nVX1aXVnWӅY\uZj QW[ZX\UYWmV4Xk1X&VmWpY\Z&`Z\Y7WlmVX1XVRmWY\ZTe-t`NUDUN|RFRUUNޅSDSFRSSBmˀ|0mˈ˄x&m?ˌR/˘#Z \YbWlVX1ll l1jˠQQQRRRNPDPNTCTPTBTNRFRTNQQBTQJQTTބ QNQN̄QDQCQU@UFRUNЭCUUJUUU,lZNTCحSKS)AحSKSSSNUCԭSKS8Ir UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2AԭSKSSSJPN[S@SQJQ[TNTPES@SPKPQQNUTESBSTKTPPUDRNQDQRJRNS@SRJRЭ˴̓TФ˸˰3UUѭܫTMTNﮃ~^廙SNS~^S^ߘ ^CNv~^Nb~^ ^URNR~^>  ^$zԭ1XXVBjWY\ZTU*tP^jˀ|Ljˈ˄xBj?ˌn,˘?Z<\9Y~WiVX1ji i1jˠQQQSSSNTDTNPCPTPBPNRFRPNQQBPQJQPP QNQQNUDUBUQ@QFRQNSRBQRJRSSUi1R1EQQ=;:P43SNGTQNPCQRKR@QKQRRGUQNSCQRKR@QKQRRht1;1+QQNRFRTNPQCTQPKP@QTKTPPzFRUNSQCUQTKTm@QUKUPPcЭ˴RТ˸˰0SSѭܫTK&N~^|sQNQ~^Q^U ^ANJ~^N6~^ 2)UNU~^ n ^~^,TT~^0$5^ԭ1 4đɑ1"ԭXEVfW~Y<\1Z&D=Z\YV~WXPVխ1V ѭ1HV1f?6LB\ff=6LdؐffÐXEVeW}Y<\1Z&tZ\YV}WeVX1fAρː`˔ːPee >A˘`˜˘eˏeӏ1 5LϏˠ1VGS]eUeDRLe,9 PpЫD4e,": Pp1V1H-5LS˨(ݫD#XV2dW{Y\Z˸UwZt\qY{WcVPX1φ`߫D4PWݫDEBGSdЫDc1p3L3 1{R q}~^c}~^Э$XRVbWzYI\>Z33^Э,Т0(*Э@ТD<G+UUѭܫTwPޏN8{~^l4{+{SNS~^pS^x {ˀXi ^Z\YyW bVqXmNz~^˔Nz~^˘zzTNT~^˜zˬ˄ ^)Z&\#YhyWaVX1XVaW?yY\Z˸Z\YyW;aVXP1ѭ 0ѫPP,6 PP,6 PЭثLXTV`WxYK\@Z5s#Z\Y\xW`VX1XVv`W3xY\ZZ\YwWXPV1bxRV^{xPТmjPoТ_Э$Т(V_Ww '1$V1XZQNQSDSNxxTDTCSTUJUPP@STJTQQ\YUNUPDPNKxSDSCPSTJTQQ@PSJSUUЭ8x<V<_Wv4'1XZTNTQDQNwSDSCSQUJUPPq@SQJQTTg\YUNUPDPNwSDSCSPQJQTTH@SPJPUU>'ЭLwPV^WfvHY'QQѭܫTu\NJw~^xFw=wSNS~^|S^˄wˌd{ ^Z\YuW^VXkNv~^ˠNv~^ˤvvUNU~^˨v˸ː ^=Z:\7Y|uW]VX1X 9 } UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2V]WSuY\ZZ\YuWO]VXP1ybXV$]WtY\Zx'>iZf\cYtW\VBX1.PEPD11,n PXV\WCtY\ZZ\Y tW?\VXN4`84 Ά$Æ؆ $RNR +,LÆ<1&t~t( nt(1,Qt~^HXVi[W&sY\ZD^P>PTPZ\YrW[VsX1?1,,s~^\XDVZWrY;\0Z%X^P>PhdZ\YArWvZVX1,n PsRТp|lJl1s~^rrSS~^˸^40T8TT<FP;P)CZ@\=YqWYVX1yr~^urlrQQ~^ @Z^@(4$pkpPPˀ|˄=P64ˌLރ,1~^˘˔>^MZJ\GYpWXV&XPbPˤXVXW`pY \Zˠ΃Z\Y'pW\XVX1~^ˬ˨^Z\YoWXV}XPbP˸XmVWWoYd\YZN˴%?Z<\9Y~oWWVX1bpUѭ1XVWWGoY\Z˼ՄN/p~^+p"pSNS~^S^p` ^Z\Y WVoXWXeVVWnY\\QZFwp΃у(fq$ q(N\o~^DXoOoQNQ~^H,^PoXtˀˌ˜F˨AZ\YmWVVhX14nSѭ1XMVUWmYD\9Z.˴%Nn~^{nrnQNQ~^Q^Tn˼ ^Z\YZUVXWXVBUWlY\ZaNmUE>UTRTTTCUNmRD>RRRRRmmQNQPCP "  TTD4P=PD@Z\YDlWyTVX1,D* PP 1Hxl~HRR˘|xRR˨˜YH˼ˬ`˰˴PPP2$L~~`~~1G~Z\Y@kWuSVX1Hp[SxS PnO(knSbSk]SRSP HS:SP= 0SH[} PQP}PQ$P }PQ,P(}PQ4P0P P޼R8sPbbd`lbxt~b˔ːRb˨ˤ~Rb˼~b~b~bGb$ =b40/bD@%bXTbhdbxtbˌˈb˜˘޼ˬ˨~޼˼˸~kQA PAf@ffPSCPTQSTCTCf@ffTSSS CPSAkTTQAQPQPCkQ}QzQwQxQzQbSjQQ[Q~P O [Ь kXXYZ^(IKn^(`(n"<"Z^@D Z^`_d޻ RHbthKի |bHbˌHo˘ˈիˠ9Hb˰ˬޕ1oH9NH/D&4,{˸{H zzHb1ѫ >&4zzݫ zzHb?1H4 H@,n P: UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2}VիHH4HH,H@H 1_PzH zHzH,yH yzHHWWZWZZH4H,H RRSRSSH@XZH48 H@DFh%4y y8xy}yDbywy1,0& PW^(IKn^(!&n!$!W^(,W^իHhPEHhAtH_LHyH5xH3xx,n PXfNDZD#> Z@@rZJZfV8VfyWWDW12$4xXTx89x`>xD#xh(x-x޻ Rޢtpﶒޢˀ|戮ޢ ˌˈ1!,n PgZJ ˠ˜˰PgVg^(gQgngW ^( $nW ZZ˸ZV^˼V^իЫdg(_ gW8xDmZ8ZVDZVPPZZPPWQW8RRQWDSW eTTUUSUWW8WDWd8dDdVfؾOfHfھAfW*fU"4vPyv~v1-"4|vQvVv1Oh[^}PQPPLм H}PQ0P,ޫ,PIvм d-PVW ~V^(V W~^NQVC#> V~^u ^RSXHZJ^tu^,NuDMsiPLiXTx﮹QQԫ\rduЫPH[IkH[=Ѽ,м мP@k5uH[P@kuϸθøH[}PQPkb޼LH9s޼\X0sA Q@f@ffQQbCS͹PQbPCS QC?QaSaЫ aAPC8BPa`VShsPˈ|r˜q˰jr FqqqqrP ,rP`GrtJrCQEQ~^˜ˌ>s^ˤ6sR7W<XX^(Xn ~XYY˰YW^˴˸sW^rP7X< YY^(Y$n ~YWWWX^rX^rr q4r@rU_Lr`o)_lh_tpx__ ( __,xUoˀqˈqHx[P`Q^Ra ^ ^1^^\\^(~^Q(QQQSqPmp[^' ,lqP4`qP@=_<8qDTqVSS^\\^(\C^n\W ~W\\T\V^X\'q]]xl q(]Q(QQ]|pːp]R]B]K[}PQPߵRբ1׵ܵ(,pPﭵB~^THo^BQQ^dQ^h\nn^BQQ^xQ^|pKn^yB~^ˌ˄n^ˠn˴nOBSDB!ë8B~^m^S$o;F UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;29qP6QQݴ״AɴҴoXPVW ^( nA Q@f@ffQQ>CGRQ>RCPCf@ffP>S>Ы>>}>z>{>}>Y>V>T>kPp>޼޼+kHP[PQR/>R#>Qˏ>Sˏ>TTSP=k PPQQRR=R=Q=P= H[k4k޼ ޼jh HĘ[м RR ~&hkgg޼ScccSS޼ ޼޼޼i޼ ޼$ RQ>A(c,>Bҫ0>B4iOh[(^м$м м ммSS,Ь,ޫP}gSTЬ0<ޫ8PjgS|Ь4dޫ`PWgNSPGPQQíRNRSGSPPüQNQRRCSSGPPЭYѭ1fNíYQNQRDRݼ(RhgDP@PDPPZSPXݭR@gCPSESXCXQQWERVAVP@PPQ'gCPUEUAP1gUDUCUSQSRSDSDP@PSDXS@WSESZI A?VQ@QAQPPQfCPUEUAPfUDUCURQRRRDRDP@PRDXR@WRERZIH@*@V@VAVPPQtfCPUEUAP~fUDUCUSQSRSDSDP@PSDSX@XWEWZIpYH[g@ACԫ$hSR8eP dP1 ,ekd߫d߫ddXdePЫ hdЫ |tWgPbˀ7eˌ2ePgЫ ˜˘\Ы ˴˨g˸edP4Ы )Ы fd d1gdx,dˀ!d&dˈg1,fPQL?gpeˌeˠe˴+g"geg0eLe`Me79 xd˔f˴ffff4fP`eHH[м$Ь ޫPWc%ݼ 'c c cH0[k ePPP`e H[ke7K[^мTм UU0T8ЬޫPbUdTlЬHޫDPbTQT;TR STU$QXVQ$WWXH XVYITYUTQO[ ^мм Э<ЭDЬ ޫPbЭpЭxЬTޫPPb˄7QSQQQAPPWW1.WQQPNPPZZNZZGZPkSQQ PPZZ1ZVSVWW ZZRZ0RWRB,RSXSrXPfP`NPUQUXUNUUNSQFQUNWQAQUQS9QVU/U)UQYNYYNSTFTYNZTATYcīdUPURE`SQXZKS(ˌSWS |H珞[} PQPk@޼Vիf\``޼pdի x|1޼ˬ˨ի{޼z15K5B(__u5__޼DzCѫ f(_w_ݫ Y_r_޼yˌիf,P ,n P1޼ M@POի$+PN(N`NDLHL,n P47ի*ONLHNENL>N1P`TP^ N< UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2}[^NN^MA^M4^I^MMVVRVRR!LMMSSTSTT LLINKUD#> U@u@UJUKͦVKVKFPPKPW (]`]Kw]h]~K_]ph]m]1RSK1~GKqS.KST*KSTUUSSUURR KPPV RKQRKTTSSQSRPJRJRJRXL (\X\\1O@[^} PQPмHмPЬ,ޫ(P\мˬЬ˔ːP\мЬ˼˸Pk\м|м˄Ь `ޫ\PM\ԫԫNPNRDRPGPQQkKTK KK1 >8U>۠V޻lWX^K QQNQPGRPkQYe1f޼޼}ի wwQռ īpYP@PYZJlZЀQ޼ ޼$'b޼4>80~ի PwSռ īA۠ZYP>@8QS>`޼d\spRT EQQYEYYSCSZEZP[h0CPYi0DPAPYb0CPYRKRI0DP@PYKY@0޼ˀ|uPTNUNXQGUQkXPCPPVխ{īTPX˼QVSCSSPS2CdS)SNSSDSKSSWSSW VQSWCi4S VQSZCi#S VQRSBiSVQRSBiV\XXխ1NRNSFSRЭQVխ1۸PVTNTUDRUJUXWXX3Yխ&XZS˼SVSC۸T˼UZdUTY:Sխ/XXUY˼YVYI۸Z˼TUjTZSQVwЭO[Ь  }PQ$P ޼VfX)ի޼Xf˄tx|lRP1TvBhf hUUPYIHPR@6R;RZZR)B1fZsW3_IHdRkQQk6W0QQQfQ1 1IHQ?f>kQQR>?I> 60zQOQTQf Q11IH,Q?PQA,QP2~PPQ PP1IH$P?PP1IHP?bPP=~ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2r1IHP~jP8PPUP(lPZZ E(@ZWG'WZW @dIH~ P<OO7IHRO<OO T ZT $UJT1(U%2RR=2WW=?v= ? ?h=?Q?(I?>0kP0?(*?>,=nN=YD#> Y@u@YJY =ZLCL/U2E˾QNQPU8 ME˾QDHP@QPUD8P@8PPJhYZ6Qռ"WLPYI|ZPYIHYЊQ޼޼VWESSYEYYQCQZEZP_LCPY?!DPAPY8!޼IO︡[^м мTЭ8Ь ޫPkKЭ`ЬHޫDPWKԼTWѼ)޼UePQeTX,YPQe޼YϼϰTJkJhkl߫dJJkiPPЭQQPPQiQPPPZXZTRiUE,UZXQiQ1|PkSSi'RSPXHTZQATTSRiiXiH,PXi,HР[м(Ьޫ PJPPQPRSUUPQOġ[(^}(PQPм мLмT}PQ0P,ޫ,PIЭ|Ьdޫ`PIЭЬ$˴˰PzIЭˤЬ ˌˈPcIԭЭ塚CPXY ~X^(X@nXVVX ~XZZZY^ KY^kYZN1JJpJۘXXz<,X@PZPPV, F<PWԭఏ ~ V~^,NQPC#> P~^4G ^RSZJYI^P@G^ʌÌlGۘZ˄E޻pVYgːˌg˘˔xtgQdQ[R˜+EˤG*-RBiSSSSTDiSQxQPSPQUPQEiPS@f1QSAiCjSxSXԋSCjXUȋRXUBi+UEiXXX﬋UE廓˰ˬ$G˴3GUPEzqPPNP~^˼G^XUEi1X~^!E^X EE  EYP^(Pn<,Rī@XXXR<,XX^(XBW2 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2ммP@kmEH[ɉノP@ﺉk=E柳黎H0[PޫQCaPADPCPE(QA@rQPJPPPPSNSSBSQD@|QA@Qk޼ ޼ ޼޼޼$EH؞[1kOﰟ[^ЫSмlЬTޫPPAм˔Ь|ޫxPsAм˼Ь ˤˠP\APNPGQQT ϼJr.BPS޼Vf PfԼf>SSռ8QA`PQAۈQVF۰VSUNUUDTUUUUSEUNq.VDVUNTFTUJUa.X.VNVTDTJTΆ10ņPмUSռ[`VQAۈZQA۰YSQNQQETQPEDPkDQDTQA?Qކފމ ^CUSEQN-PDPQNUFUQJQ5--YNYTDTJT 1ЏpU$K@2UмYSռnQA`TP@ۈUQA۰Z,@EDPk4@DPA?P<?PބTޅXފ\DBYSN,QDQJQPPqPli1P aP^NYE?YRPOPL޼d޼l~^t޼ˌ޼ː޼ ˔`^Nr,QDQJQi,`,YNYZDZJZք18P陼PQPQQYPYZZQQYQNQQGQQQVQNQQGQQЭUSU7`XWGۈWRB۰RSTNTTDQTTTTUSPPRP1RQYQPPPT4QPNPPDL?PA?PRPPPPRPNPPD@PCPNQPDL?PA?PYXSXMTQA`WTP@ۈUTQA۰ZSPNPQDVQEDQkއ˨ޅˬފ˰˘@XSRCN*QDQJQf**PNPTDTJTQ1IPPмXSռDZJ`RVFۈYQA۰ZSPNPVETVkނމފ˴]XSEQNZ*VDVQNPFPQJQ̂J*A*XNXZDZJZﷂ1޻`VPۈQPPP@۰XXPYP<`WUEۈURB۰RYZNZZDTZ@ZZCZZZZZPYмZXS۰PSZ+C`RCۈYC۰WXSUNUUDTU@UUUUUZSмUPEfPEaPE`ETNo)WDWTNXFXTJT߁܁GZZR݁1#ի<S<޻`VۈU۰W޼X|T:P1` :d:ߤ:ߤ:ߤ :ߤ:ߤ:ߤ:ߤ~:hi:~:ϊφ s:мZSZ-P@`Y߉7:Ce-:Cg#:ZS(:$9޼ˠ޼ˤ޼˨޼ˬ޼ ˰˘x;S :X9<`d`999h99pj9SЫ h<,04O9P1 r9d99ݤ/9ݤ%9ݤ '9ݤ9ݤ9ݤ 9ݤ8ݫ 89[) 9мZSZ*P@`R߂8Ce8Cg8ZS8P{8S8x8<ˀ˄ˀm8r88ˈR8W8ː8SOș[P^Ы8мЫ@XЫ<Ы4Ы0Ы м˜Ь˄ˀP+8мЬˬ˨P8мЬ P7%%PNPQGQIARRN%PGPRREIAPPRNRPGPRRGQPPERRE*QQE*NPEPRE?RDPE?P} }$%Ro9F(ǏFQďFQQE(ǫ(PPū(QQQíPP,ϼ-AUi Э8X@Э<Э4Э0Э @Џ 1YˀЏ 1EЏ8 11Џ P|Э8X@Э<Э4Э0Э 8| #/;0x1pk1˰_1S10G1p;Џ1.~PƭPPŭQQYYNPGPQNQYGYPNPQGQP|P|P{˰ЏЏ7$5{ {0,{84xz C<HI7tD5Э8X@Э<Э4Э0Э .  ! 1z|6ЭQAH X{?wEH9(M L=o`e%sTr5%r Y({]R~RJ R|k@EX4=qgZF-#WtIկv_.=!ʏFRbVcL2lRCeYr}HpggOz.OyvU(<դxK\{iI 䬽`p<^叻̂zTl>@Pݚo?Hu.] |8G1VcNȟZqU"F!dʐשz2q9 lʞ2$':/Mu[P-A!2'1\ۆ*?/I-e\J4~s iaY&XaǛ%c*P iOs“nRXA< &\ۼC?8HT̸j=uٛz@~E->Rz$&qZ_.G2rď!x]eׁ]N2WtseFk1\ h% Ц:o(LӐavy]Q2$ڋx";oe~܌~ k duc;|L5H;=ՌkwuN:3)"R;\VC)4ln~X][Rna|{zf)5!ˡUFܛ~$j@jG_L 5x^Q߂gn>U֪ T0L[saiMհAE7WJRؙ%F 2CK8sy=in)urAXJס_W" D-iuCK;z_9x_ԷYXXWC]3wqA. eWҮ6I2-:(=[sgQznB|>-_US/fl"#$>:h \H|'=F6\+ў3x2rD<3?%hPАv6gWnr|cPN>-*[I#ɲ +A9/7h#X,L4jjxx 2\%4KIMlmC=rص*idbI@ )Ѵ>iUѸ>k;=SeZEu bP(=-G#uK͂]]ۧ 9TF2[ : $+27(sl5d\XNݭ VMa3b%W]:Y$&sr ,Ah@ppƚhHMz%5sKGLE^qG mG5`¨iP|LCcuT=HGmSs+ )Uw  AwEmN,y@D9˞dխSn@,k=Mtnik'{V4ϱ=MLVFe% œ 7D(X3uqwtL];H5nThO"}68jg_{c4 a؎ؒq٭F_]FJ*/{ws*^<:`3:%{}ʋ" ~Da׵nqIlV;qI{aA^6j Kbm P5p0@3coiRmܨp}( e;tjrwzpYt܉^~;T$/'ݢe ߿@+~*c*,#8Hv%nr̤o*vF,zig/.A QҔV3k`9oמU=XzEoB$-c8?;ܞ"#Ů*eGSygxW)~8|W4gv k^FYLהS1hXH Ud͐yx\<,WHU=iˆeOLjH2A@$(o?|ܟƪ=Fs-ƶ] 꺵9*ofJ%RMFzjd-eHP{-͍cPn)Mkެ {j%x8cļҞu_cb#`11E+y@s{6R&~\MVj`bU?Pe_y͢ !~ɞZ!wR ݝp]c-B(^- wY]kwW%U! Bi5əّjƤ Jt,+U_n`Yd7߂~! 0/'iz S@n΀%srs wr5I+ .4jL~ĖT WZ>D+jz7Al6'`0y('U2my^:l5џKg@89#S;҄_Q.U-/`go0GuIjd;(zv*[^-/]7;tP{!曠yU(K<אEN @s4h77urb; ̻o @;Z?QS Xk[SWPO{49pOP/A1׉|Ea՞i gqq!2y"W^>T+̼RdLu$`̑גr+oUbLзB;C(j]C(h??TQBC̓tW"z"zw ە_|`Yt@A%Z-xͼإ0l|Ԟ[:& 6Eզ` fF%<&&Zνdfe@۠<ި@ިD4Jի$ THCQT.YZVP>@۠PZRBRMSB8SEISTQY ЭSWխ1[lRVZUŭpYWPrPPPQPAfQQPXQXQQXXkPZQPAfXXPQQQXXQQUPP@fXXPQQQXXQQ`*QL? QA* UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2CL?)NXC67QDQXPXPPNQ@QPJPXtn/EQB@QJQPPPCL?̫XF?XJXQQPŭPXEQB@QJQPŭPXGD QNPDPQPXPNPX@XQJQXX WYPX@bXWYQXAbSW|fXQAPRނˌˈ&@Xխ1N`nSNUFUSЭVWխ1lYWZNZTDSTJTQQQ3Pխ&QRXīpXWXHlUЫpZReZUP6Xխ+QQTPīpPWP@lRЫpZTbZRXVWwO[8^м ЫWм,м мм0м(Эx޼$TdˀЬ\ޫXP$Эˬd˴ЬːˌP$VѭVV,n ( DZZZPPPY޼޼VFe^ԭe޼ ~^%^޼ RR^$R^(%^޼40&mSPCl8#D@LHTPxW X"޼d޼h`źll#޼xt&WZE <1R*hWaԭ޼ː޼˔ˌի* ѭ , ] Pѭ , W P˨ˬ˰"P޼$lQNQR@lRJRSSSSSTëTUNUPBPNlQFQP@lPJPRRUhUUUQZQQRPSPPXXHXCR2 R%~!v!{!11J~q!J!R-!X$!-!2!GRSNS~^XPNP~^>9^޼  ~^'$^N <($x*0,84x޼@<"kUNUQ@kQJQSSSS«TNTPBPNjUFUP@jPJPQQTTT~6 L ST ;NS~^`NT~^dT8^޼p ~^tl"^W?RSwXnTens1ѭ1= d~nˠ3RX &W->RX˨11~˰RX˸ŭثlUU>hT?EdvW,R^XU?EdGd1~z?R"X"ŭˠUUۜSEc W,%RXEc X$R 61W ZRTZRt eRQNQ~^ZXQQNQ~^5^NT~^ZXPNP~^5^޼ ~^ u ^1~&TVRUUVUVU~ZUUЭVUV@VUW;5sTURVVU V[UVpW3nЭUVUH9UV:1~4TURVVU VUV~ZUUЭVUVPVUW7pRTRoTRW3JЭUVUXMUVNZZTTZ1BTPPVTXQQUU  U 1g~UYh`W/fUYxpeO~UoYˈˀ{xW/vU=Y˘ːIF1?YPQPFVlVˠ$VQRRZRRS2ChRSCۜRRԦԦPQsq~UˤY˨ˠW67Uu˴Y˸˰zwq~tU;$Y@=W6;U$YT~W1rOﴇ[ ^Ьlx}DPQpPlЫVмHWм8м4м$м мЭ\ЭdBej UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2#Ь@ޫ0Yr~V^(V`nVZZ ZY^$(1Y^4 0Xg~V^(V`nVYY@YX^DH0X^1Zb~V^(V`nVXXTXZ^X\:Z^իwp0|/Yr~V^(V`nVZZˈZY^ˌːX0Y^˜`/Xg~V^(V`nVYY˨YX^ˬ˰#0X^1z! .,n lpvV`/ի 101V` 9ի4 01r,n lpHLX-xVЭխ12Ní NQGQkPխ1jŭPYYTDLTSSW S@x19S1\Q4X>xUWLSREB RKRRRR@eECRKRRRPZRJeECRKRZZSPSZCe:SRE?B RE@= CZ@ZRE>GCZ@ZRDRKRSSS@e1­SSۼR>xX۔QWGECaUKUUUU@hECbUKUUUPZUJhECSKSUUZPZUJh5E?CaUE@= CbZ@ZUE>GCS@SUDUKUQQQ@hPW^>xR>ˈˀ+8ЭS>C˜˔8U>E˰˨8Ы(XX,Ы,XXTT0Ы0TT>˼7ի-2V#WJ9,ի w- ",ի `-$ ,ի 0I-V<+իH--VVO([ VWZVQ,VVP VP,VV(`PR@?}VRD 8l@P V_VU`FVP\R\1V/ˈ爵 Vի 1s\1hVpkvdxbM D31/+R}x;`V1wRJQAJ^,d\PL 4]8AW~^P<E^T)R1r;RQA`\dyp V11,n P VˀrVի$$$˜ˠ˜kT߫JSV0ˤ{&˼^\PL ]AV~^?^#VTVHVի$䑫YyV1Nn*T!FVsV1T!Fj$VX wIV1"Ld (9 > 1,n P V 8Vի$1M$TX\ P1fV|\PLψ k ߫  bh \  ˄P$ˌ$$ˤ˨AU~^ˬ^1sLH  " ASCV 1/  7ի$򑫭Yy V1\L40wV1PL e $N S 1$V-@VP1rRP x1cVxhS˘)TPDˠI Vˬ˨D˴˰xB- $7SC-v UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;20R˸ QL 4V17 SkЫ e S_ RS1#KS1R# UE$  (~4% V11,n P VDvVի$$`d` ߫W ߫ M kD ߫: C V hk!ˀb!˘E RPBˠQ ˼( VTVLVի$䑫YyV1T!FV V1^Luz1,n P VE6Vի$1$$(,P1V LB QPAY*߫߫ k߫Tl˄  nի$򑫭Yy ]V1RTDR f 8V1LTˠ)$˨ˬ˨1OYV﬐VP1.P2Njr1V4VV@VVyTjV1vV]hhNV1ZVA|2VPTMˈ"J~ː ,n P V˘\Vի$1B$˴˸˴ߩV˼fV1bLy~1wVUFV1RV9*V16,' P V Vի$1$ $P1ςᄐ @<S Hݩ $e Pnݩ\i< fX?i"; 8`ݩ Ϙ  hݩj﫻 pݩ< xle~ˀE1f4Lt˘I$ˠˤˠ27˨1L,ˈ$ː˔ː1~TV˰;PPP`ddhd nf`RRRRPVhB1S,n P XV- 塚Vի$1q$( , 0 P1\8~ D\VP VP$` PR t PRR Cc31|,$ 4JVYˀ \JV1V$˔ ˘ ˔ eI,5V˜ V1$˸ ˼ ˸ IV yV1X SIV }sV1$ IT]V: -+V17$   EHV iVHRR`1$0 4 0 wHV8 mV1$L P L ߪg|Q1f$T X T uk@߫6? <\V\ /P$X$d SPCXl $˄ ˈ AyG~^ˠ ˌ ^V1$ˤ ˨ ˤ ߫w߫ mkd߫ZcX V<ˬ s-VPFXV˴ h _ fV1$  ߫(߫,X V VPFXV V1$  ߫skj߫ `߫V_X V8$ o)VPFXj~^8 V, ^jRR^H R^L @ ^T 1l (j~^ˌ ˄ ^V1˸ XV VV 0 s bD,˧  UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2h< 4 ,NV1(LhH =$P T P &+1,n P V` tVի$1=밫$| ˀ ˄ PUVˤ \PLG`߫(߫,ˬ TL˸ i$ RW18,n P V% Vի$1i갫$ $ P12j~^P VD ^jXX^` X^d X ^l \PL ]RB *V 1Kt 7ˌ .j~^ˬ ˤ $^1"L $ 1XV1w N~^wnUNU~^U^P ^/V1V1}V Xԫ0Dqdl1aopl]xtx[F =,*(ի0 |1gX\1cի0 ˨qԫ0H˴˰^/\\'X +RXSXRCQСRS exXի0 ˸ XVN~^YNY~^Y^ ^HP01˄Kː˘uˠ^V1VQBVP1RP 1V!4STMQPA\mzhdhplxfQ H753"7SRtup|3ˈXV1COR1QːS!ЫЫˤz˼yScjRS1 KS1R#%TD  1V11,n P V0 Vի$1!$LPL߫`߫ VkM߫CLV)Tt lk ˄NYPIˌZ˨1VXVTVի$䑫YyV1X!FVV1fL}1,n P VMȂ>Vի$1$P1V8JYPI9#߫߫ k߫WL˰˸XHwVY1@ X p˜ˤ'˼ﳁի$򑫭Y y1VCkTTC UUEYEQAQYPKPXXTX,n P V,Vի$(FV{V1$ OP1XYRY1XQNQSRTNTUFSUEUPAPDUAU \2:,):0~^4~^8V(^VPYRwH1 LP$X\X1jTDj~PV1,LlˌA$˔˘˔*/1K|~[м (м0Ь ޫP.м \мdЬ@ޫLXMBhRDYRSWWQMAhQDUQ@QRPTīPTTSMChQDQYTWMGhPDPUAUYXCVSDRSDXV@VSSPpPUP,PE Bh`>Cxp>DˈˀE޼˔>B˘>C˜>Dˠː%ˤEP%ˬ8P޼˸>B˼˴  ԼмP@;T SRT~[޼޼ мP@+#@+ k ռмP@+#@+ S k ռмP@+@+,(E޼84zE~[}PQPkЬ e޼4޼ 8޼<޼@,U~[}PQ P:9ЫR>B*0(>B*<޼@8LDP:R|~[}PQ PЫVѼ,1ġ  1Ѽ,.ޡ  1Ѽ,  1Ѽ,  1Ѽ,  1Ѽ,  1uѼ,%  1]Ѽ,  1EѼ ,%  1-Ѽ ,*  1Ѽ ,  1Ѽ ,%  1Ѽ,,,  1Ѽ,%@  1Ѽ,3M  1Ѽ,.h  1Ѽ,4~  1mѼ,  1UѼ,  1=Ѽ,&  1%Ѽ,  1 Ѽ, 異  1Ѽ,4ﭢ  1Ѽ,"ɢ  1Ѽ,Ӣ  1Ѽ,0٢  1Ѽ,  1}Ѽ,  1eѼ,  1MѼ,(  15Ѽ ,   1Ѽ!,$  1Ѽ",(*  1Ѽc,6  1Ѽ1,)6  1ѼC,C  1ѼD,E FtZ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2QO ~ѼE,+E  bѼF,-T  FѼG,"e  *ѼH,4k  ,&  Ѽ11p6Vp5ЫV>Fg&0(>FV&@8@>FE&PH@>F4&`X@>F#&l<~^th^x5Vz[ԼмP@%k мP@%-@%޼k ռмP@% ռ Dz[}PQP } PQPG5$K4ЫR4?4ЫS>B6%LDZ>޼X>B%\>C%`TTh@>P%p0P޼|>B$ˀxb>C$ˈ˄qԼ˔E4SRz[Ь $RѼ ռ  мPѼ@4޼(޼,$1Ѽռ мPѼ@8޼4޼80Q1мP@,$@,޼@޼D<"1ü PPмP@SмTмUѼ1~޻ VUPмQAPAtP WAWWPkAbLCfPHIѫP޼`޼d\,мP@,CflCfph6STUԼ$y[ЬѼ ռ мPѼ@S&޼$޼( '1ѼռмPѼ@#&޼0޼4,1мP@%޼<޼@81ü PPRRSмTмUѼc>VUPмQA}"P WWPA%PkA\"H>CfLDѫP޼\޼`XQ RSTUԼhx[ЬмP@%5P 9мP@%$޼( wмP@$ мP@$Լ,x[Ь Ь  ,޼4>8> <޼@0UP1޼H>LDP>\T5#a kP>@2!d> l޼p>,R`)P4> xt<P@b  @b @b P@x[}PQPk޼ ޼ $޼(x[Ь ռ мPѼ @#޼ ޼$1мP@#޼,޼0(daмP@i#QQ Q@, Q@#Qk@ 8><4ѫP޼L޼PHԼTx[/.ЫRVPPP>@$>B( +޼4>B80< /R0x[Ьм>9(x[мP@H޼kQPѼ=мP@  ޼.]мP@9޼$ 8w[RмP@e@мP@@Q>A @~^@ PPPP~^8]^мP@]kkЫPw[ЬмP@=R@1RSмkм T@U>Vի1kS RkR3޼$ PgмP@R@RSRkPмQPAQЫWWQQWWUP>@8>Df<4ЫPPPkPT1lм ЫP v[ЬRRмP@ S@STмkм U@V>Wի1kT SkS-޼$ 5PgмP@ S@STSkPмQPAQЫXXQQXX>Eg8VP>@<4EЫPмXHPPkPU1oм ЫPdv[Ь ,0`,8d+H\+XT+hL+PPPPVԼ 3XмP@@@VP@2Q@@  PQQP мQAPмQA1ЫR>Bˀxx6>ˌ>Bːˈ*6>Bˠ˘6>BˬЫU>E˰˨*VYIB>I˼>E˸'*PY !I  IY֫YPPY1>ЫT>D(>D-2DY>Ы S>C(PZ>C.2CPF12FQ~QYQPcZVQ2AQQ  Q=NZRUR1>FhSЫT>DhT2Q2WQWU W2GWQWQRUQV ֫QV1s)ռ ԫЫЫP u[Ь$Ь , 8Ы R>@S<P իRPP@1J>LHPP QA81aP(<P|1RмP@È1RмP@Ì1RмP@Ð1RмPQ@ؽ }½HkV@Øk1G UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2RмPQ@Ô½ }½HkV@ÔkxRмP@0h.PPP>@cT> X޼\P&P~RмP@,,~PPP>@cd> h޼l`i&PBR> x޼|p&P"> ˈ޼ˌ޼˘ˀ "PR ЫPs[ЬЬ  $Ь,8޼@>DP>XH޼`>d> h\ s[Ь@LЬT`d'l&ЫR|&ЫSˌ|&ЫT˜o&ЫUˬb&Ы V˼U&Ы$WԼռ Ѽ ռ"м PQռ `XՈPQռѼ Ѽռ޼>u1E>X>E>F F>F^1>E>BG1>B0>F>B 0>B,>D0(>D<8dѫ0_>GTL_>G`>Gd\nѫ0&>t޼xp}ռ, " >Dˀ|Sѫ,&ˌI%޼˘>B˜˔/1ˠw.1˰rЫ(P@˼#0޼Ы(P@4޼ Ы(Pм @0м@,<@(Ы@ȈЫ@ȌUЫ(P@xk>BV(PPP>@h/>C޼fռ11Ы(P@(QQ4@ kS :Tѫ04,R0 8Rѫ0޼H>BLD1>CTPHѫ0޼d>Ch`1>Cpl P,ѫ,01>ˈ|EPˌ0 ˘ˤ-ѫ0޼˴>C˸˰2Լ˼(#W$V UTSR<Tr[_#c"Ы R,W"ЫS>@޼LVPPT%U>DeT>BXP-.PPP>@ed>Deh>Cl`>C|t$SP>@˄>Cˈˀu-޼˘ːռ1>Bˠ>Bˤ˜>C˰>C˴ˬ>B˼`ki>Be>Bxck:>C`kԼ >C id!SR q[RмP@, ,PS<PPмPP мB˼˸P>B*##P1>B=RPVS@@/@CSPCF1VPPP>@h>D1P>D>G a>G$>F, [f>G8>G<4<>GHDl]k >G\XT`k 1>Bh>BldaVPPP>@h|>GˀxP>Gːˈ;)>Gˠ˘(>G˰˨(>G˼>EЫP>@˸a̛aδY>B.PPP>@h(>E.PPP>@hl(.PPP>@hQ(.PPP>@h6(.PPP>@h VPPP>@h>޼ q> >G$>G0,[kVYUSCS)Ώzaα̏z!!>CH@'Y1ռ!޼TVYYY>IhXPf\aS$W VUTR <o[ЬЬ$0Ь 8 DHzP~ЫR`rЫS>t>x> |p> ˄ˀ\'Pg2TUEZRP2EQQTEE@ PU@ > ˌ>B ːˈP ˔ssU> ˠ˜&PR>˨>C ˬˤd&>C ˼˴&>C >> P@DSR4o[ЬЬ$0Ь 8 D>LHA]>\>`kH}ʾ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2V ~^dX^Pk>l>@0t> |h Do[мP@ PPP>@  %PPмQPA мQA kA PԼռ мP@m n[PP$Ь ޫP( >8޼<0 PЫP n[Ь$04<Ы RLЫS\ЫTlЫU>ˀ V>D˄>Eˈ|E>E˔ˌO$>Dˠ>Bˤ˜8$>B˴ˬ#>E>B˼#>B޼OPѫ)޼>B1 ޼ <"~^!^B 1<Dм P@Pм P@eP> ]޼ 0,"8޼D>BH@1gѼ Lԫ>B\V PPP>@f`X". PPP>@flV PPP>@fp>Cth >C˄|PSW>Gˌ޼ːˈPXX6޼ ˜˘!ˤJ޼˰>G˴ˬ,1м PЫ@м PX@fм P@,˼˸!м XHPPHм XH,!м XPHм X<"Hм XH м XHѼ м XPHƌԼUTR S<m[Ь Ь  ,޼4>8> <0&P1޼D>H@P>XP1R PPPkQAp'RP kS> `\g!PTUR TGUPU>C5Q UPRBURRPPTTPP'C> h>CldUSP'@5UPPRRTTRR> xUSS«S>C|tFl[Ь   (ЫRмP@} \.RPPP>@F`XW޼pBLtlPkˀkRЫPm[Ь>~^,޼ 0$T m[RмP@޼P1мP@QSQSQSSS@ мP@bѼѼSѼ Q м [@@Q>A@~^SSSS~^ pB^мP@$ CkkЫP 0n[Ь$ЫR>,(޼<8"P^H@A^ѫ 1RPtЫR1Ѽ <SѼ  <@Sм S`LCSSƫSūSp >Ы B4мB/kB+ЫB&B#B ЫBRRЫP<@n[Ь $ЫR>Si_TTDcn)>Dc84P2D P P0 P9P>DcH>BrLDPU(>Dc\XhPS>BLd`TSPUhURЫPn[Ь>GPR>,(/PCR2BPP P0P9ԫ(><޼DRk8; PԼԫЫP|m[Ь$Ь , 8ЫR > @<4}kSQPQQUU:qS½H ЏR$}SPPqPP ЏRkSR>PVLP$իUPPR@1->\XPP 1 P(8Hl1U мPR@ƈ1U мPR@ƌ1U мPR@Ɛ1UмPvS@ƘhмQPAƐ1UмQvSAƔ`мQPAƐoU мQRA0]> t.QQQ>AfxpԫEU мPR@,)> ˄~PPP>@fˈˀ{ԫUԫ}SkRЫPll[Ь>P޼$>( P ԫЫP<Pl[ЬЬ$0ЫR4%<)ЫS>PT>CTL>C`\>hdP޼p>tRlNЫRP>˄|(1#мP@PPPQQQQUURBRURQQQQP>ːˈ1RUB  BRPRURPRU>@Q UP>Cˠ>Bˤ>C˘˔P^˨˜^=BѼ  'B'B$/B<>˸>B@˼>˰ˬ/nPPn^˴>^ BĞBĠ# RSxk[>Vk,<Vk P `櫓ԫPzPPRRмR{RPID UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2`PPP PPP||k[ЬЬ$0ЫSPPXЬ @ޫ`\ P>p> t޼xlqO1ˀ Sˈ ЫS>˜R>Cˠ˘MPk>Cˬ> ˰޼˴˨OSTkU>VEf7Ef/%D> ޼>C˼QSSTEfDTUTSODk+>CkT>DLk~^^>C> ޼0; S k[ռ.Ѽ(ϼ #+'! ЫPj[XükЫPk[Ь ,>,RмP@b @b ּм}½H мP>@b40&PFмP@b_ @bA@bZ@ba@bzּë1мPQ@b-QQ@b+ּмP@b0ּ| p7WW'мP@b0мP@b9мP@bGּWXмP@b0@b9ּXf7@b:JּG|YWGe"YP0GSmSTaTPYWdYXP"~гVPPdPY`Y 1cмYIb.bּWмYIb0 ּXW'мYIb0мYIb9мYIbGXּWмYIb0Ib9ּGWXYYѼԫ1|kP@e"kV0@SmSTaTVkPXXp"~dPkмXԫмP>@bD@Y P ּ>P޼TLPXԫYYXYXX& ë2ekX`X իݫp"~dP r ëЫP<h[Ь>RмP@b @b ּмS@bIp>@bs P_мP@ 0 мP@ 9IмP@ A мP@ Z/мP@ a мP@ zЏ YмPQ@b-QQּPмTDb0Db9 PU0DbT2TTTUPּQ P P SЫP g[ЬЬ  $>RмP@b @b ּмS2@bT>$UT"T'zVּWмP2@bXaX\/мP2@XXT 0>,޼0(&2XXTּPPVXFeVɚ;W`VTмW2GbWW  W W <W\><޼@82WּVWFeVɚ;TFeSЫP|f[Ь мRѼAѼZ Rq½H1{Rg1oRf1cRe1Ws!jP>H޼ L@PS$j~^T>X޼ \P^PS> T:CdSS 1}PPjPUnUUcUPURhWd7UjU ѫ 0CdSS 1>CdhS PP~^l`r^SP:@dPSS 1n PbPUe7Ukjk ѫ 0CdSS nռ#>CdxS PP~^|p^PS*>CdˈS TT~^ˌ޼ːˀQ^PSS SPмTTTPT/gR~(>,޼ 0޼4޼HDEP>@X>\kPݼ nPPn^`T^PЫPe[Ь PPDЬ,ޫ(P>LHEkPм QQPPQQPPPkP>@\>`X-PЫPe[Ь>PQмRB` B` ּмSTB`-TTB`+ּмRмUUUԼ мVF`cF`QQ0Q9 0QV2VV1U GQA QZ QQaQz$QW2WVVVUU WVW ּTμ ѼRS3QB ѼQbּQX Ѽ QxּRQЫPxd[ЬЬ(м PQ>(Rռ )(STc QPQм QAм ЫP޼ 5PЫP4d[ЬЬ$>,>8޼ <(rPЫP8d[Ь Ь ,>4>80PЫP d[м RѼ ScPPPPcR k2BPļPPkգkcPУQPARccP2BRRPPkc @d[%RբIТPѼ@K Ѽ@D*@?kТP@+S 6 Sмbc[k kc[< PP м PPRR~^ p^Px kQPмAPRPA}мAxQQk c[ЬЬ(Ь0<>TCd J1jkH(?3/nL1v}Ea^o[iF^=3#k=eY<8T햝 pE➽M4*̫?>sC-dq'KyT1}imwl`ںFuP G"@rqyO{"lVL']ŜêYEBWX>!I^tNh~iSsVJmmD+Y 'Od@gec<j7qsyTMSb\jZ%ɦi,pR76-/p^ l~ 1;3$!_cieٷ3 i >*Iĉ&Ye*ʼo'g8O]1(t,@M5) -N4zwf)J,3Ƽ:l .; " 0hO ؉hGTfBڌBg!`~Lҕn28(v˾bbϹag|W9W`(6MoHx%JxLjmь{&gHQpϱF wg (% R&=񣀈AEoE`:%hf6{8K=6߆9} YWJaAb>ad~rSI4|9x\˖TmOݭ!`ʑu8.HN`=Eq;8JȐ(J5d֊fs1͈Ii)$guyDa%e"Lp<<$Kq%D'2 =L@*rtx*B{Zm  "SǾ/kj FljIϖV`CUR*||$6ImcNOT8H7&Q^%)فCUeV6`SC~I50m  Ga J> .ʴ2,mӇo]AͼLJ&rp7X[~j覹;y8\* e]y/hLq_܎XBW6r/bWvsux}~_ tll< X C_-[5e!cg|-׹;+B fL5%W*%ogyZ:y}ڏV34q|u: bbZ[⭄;f=Z,)iqeǞh0x:2SJ!ֵ0W^(wo*p^ڛ9}Z NUvrP:L9њn.!I'b韗oUy m]-ep~P$v%#CCRٲ˚ [ɋrIj5D50PFUYP3oazI:8a-ixIIa~›"&;)e:ZCC]:h24!#e/CB'"HxXxfV5H) 0uDhG./K@t-М=./=$%~RʀS4r7.cY&@𕱮p[ENK^h׳_}B&@M|kCS6S\ݻ`*㺁=v lyr A*%}u3E}9dU+n4"ď\eyo5pǖ}Կ؞/*9):*-ꠒf% UVF0m〨x% Gm@DHը]9T7Pn4 eD "q)xp7%We"DIϨ {̗$:iQ vn(u"p=\NiHщe {g$LsdbRwH=_k6`o pcqytʈ#(#uA`+a[Ĩv}Z _fcTCx{J, -,-[^{A%R*< ce櫔iq##.Z HYTvDN%svir9A!ʉKQ7;l>[ʛ{tx^ ys=8E"#Ke ϱޯV=Golt̲ 1(=^eU*>MâV-q:4/l!K졾dmscrg*۔Rp^NXuDUB\+̱%a0::^9R1Y/|=_Cԏ4T~ΙgLtJ1Jz}˲W<MmJh pYЃ~llho_QC1t-ߩҔ u33\|5P!xCr}f2 *A ㈢*F~hҸXV6ymvWzدR &!ӊ)Iwp7@&(]bmEdzSh:ft,XmGl>C+)4 B9.^!Z6G":_7%)?۱-3K'm2c$yZ,fӯ]-[um_W.m^d2ö_YλT¡5$~eB}ͫ-3ub[I)D JpO20O'YR+=t Tw9㤤8"¿p> b;0|}I n-'_^=)eK`K"&Ird)M):)]ZJVؔ =<3pn .4GZy*S]Fa!VR5Y;vE]kcW{?BڷoHT7ʿT7d19sM22|%KLbz!=2_.t3'* bS|خJʽU lޔ;XHxw-̅'laG) nV&=,dicG ;)]=H< k<{gPtzJd>xQ,Kʯ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2YCd SSUVW>D@ PkCdSX>(YGb1GbSi>GbL>EdPHPSPP PWQAQQQ Q@iPܴ@ikWP@b@b X+VԫXVWGbGX1tVЫPd[Ь Ь ,>40@ PR>,S>TR L8;RPQPU2VFPQP@c2@cQAPAP6P@c+@cQRUVUWQP UVPԫЫPc[ЬP>QRԫ P ɚ;PЫPLc[ЬP>QRA Z ɚ;Pc[Ь Ь ,>4>80PЫP<$c[ЬЬ(м PQռ =>RS(TU2Uԫ PQԫЫPb[ЬЬ$P>$Q>RST@aTT@a  ɚ;PЫPb[ЬP>QRa z ɚ;Pc[Ь޼{P>Q( @ZPRPPBaBa@ZPR@Z޼($b[Ь>>2޼(>,$Ib[Ь Ь ( 4Ь<HL> RTЫ SмP@b @b ּ@bP@4P@HԼԼd1KkSVWXYмP@bZZ1oZa5Zz.WjF8VP6@,PVWZFV1Z0Z9ZFV1Z_ ZFV1ZAuZZnW ZFV[jFVPPVмP@AмP@ZW5FV9FVPPV ZPPFsV1NZ.1PVSGXDмQAQQ/QP-Q.%мQA/ мQAPZFVּPZF V1>4TXMF> tlkU>C˄>EdˈU PP~^ˌˀ^PUkSVY@F>C˔kP>@d˘k PP~^˜ːd^PkSVXYRZ\)мP@XVSYּмP@bFFV"Z/ X$PZ  ZF"VX#SVPP'> ˨ˠXYZ/ּмP@bZɚ;F>4W>HZXhY%\>C˸>˼˴P>C>sPռ> skP@gk<Լ>C]kP>@gk PP~^^kPPS _[޼޼޼ kO<޼޼ 4>@,޼ $ 6P~^0(^_[ PP_[ke_[Ь!PPмPP޼ >$h_[kC޼޼޼ P,_[ռ9޼ ޼0PkCѫ xԼ_[мP2@ЫPx_[ЬЬ$>,>0޼ 4( x_[ЬЬ(м PQ>(Rռ %(STcPQм P@H_[ЬPQP ɚ;PЫPD_[Ь>RмP@b @b ּмS@b' TּTмP@b\rмQAhּмP>@bP @ ּBмP@b0@b9>(޼,$k TмP@b ּ\ мP@b @b ּT' T мP@b'ּSЫP^[PѼм Q2AQQPQQ>Ѽ мQ2AQPQQ%мQ2AQQPм Q2AQQPPQPPЫPx^[Ь$0}kkмΫѼAѼZ PѼgPPPsPPV мWWW мPPPWq½H><4P1D$VPPQQWWQЫ XXXY ZZ'XZY ZPYYի Y,WYի  ZWXXZZXXRë WRPRѼfXX Ы XPXWX)ѫYԫի PQЫZYZЫWWѼf>PѫPPYPRRPPRRQYQZW RRQЫZ WYZЫWYYQQYQQYYQQΫ~P"~\DPVPP`kPqP f"P֫ ZRSSRRSSZ$Z>0SL#C> UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2 Z *JcZJcЫ1Zի>Re"PSjSUnUXcXSP0UUZR>0ZV-RfBj.BRVVFBjRVEBjRVVRի  -BjRΫ >Bj\RVV~^`Tr ^PR19ѫ UPP@BjRPЫPP  0BjRPռ.BjRPPW 0BjRP1ի O5Wѫ 1Bj0Bj.BRPΫ VPVW0BjRWPP* PP @BjRPռ.BjRVPVW@BjPRVRRBj0R"P WV«VPVPW 0BjRPBjRЫP \[aRѼ ֢ b1ռ Ԣ b1ѼѢ kѼ  dhѼF,PS>C˦DSPP~^H<_^SP @˦@˨LX<, [[kS PP,ЬޫPѼռ>8޼ <0P1(м RмPPP$QQPPQPPQQPPTPռPPUUG޼D@PVռݏ@^TVLǑ^PV޼\XPSмVP> QzVW{TWWWWXWXUXWSWXXT TXSSPX  0XWW@a7XX@aTVPRUS PRP1@aռ PRP-@aPRUUP2EaS@aEaS@aPUBRSkЫP Z[Ь Ь(4RԫSмT> U>4V2DePP 1ODe1GЫWPXX# 1 X$12DPP >T޼XL$1X%5 >ˬ޼˰ˤl>޼˸T1X*uRWT'2BfPPP P>ˀ޼˄x>ː޼˔R ˌ P1X? 1 X[1>d>h޼lTk`WkTP1*1X^-T>@޼D8Z^1X{ S1X}SrS!DeADeZ >޼ De\'>TkkTP DeTDe>޼ WRT1> ޼ 2DeTT ѫЫP X[Ь Ь ,ЫRP@,k>4><0PR3k>SkP@c >D>L@PRkRk RkSSԫRЫPX[Ь Ь ,м PQ>,Rռ ,SPQQ PSP0>TUQV>F,VSQWe WPSм QAм ЫP(S^QkT>UV1sTWkXHc182HcYY#Ge Ge W1Y? Ge W1Y{ P1Y}P1HcYY\H XHcY3Y$+H%Ge GeT WGe׼1GeZWP{ZA0ZZ)YAYZ YZh ZRYRYBZa1Zz*YaYz YZ1 ZRYR! YZ YZ X1HcT WWQGe ɚ;TԫЫP<V[ЬRѼ>޼ Pw>Sռ-RμPмPT PQT QUUPU0UUDQPT,R >,޼ 0$LPDBcRTдBcRЫPtV[k3޼޼޼  PЫPpV[Ѽ  PPR޼ KļPPPRR~^3^ѫ޼ (޼,޼0 iPԫЫP`V[޼޼ @nR@f,3RkPPQPQQ RЫP4V[޼޼ ޼` м@ ޼$PkKPЫP<V[ЬЬ $ 0RмS>T>0UCe1CeISRSЫkkP@d>8> @4PëkPPBBkS>L> TSHP7RB2BRRԫ6BRBBQ2Q> `\PS1>üЫP U[ЬЬ$ּ>RмP@b^ ּ >0޼ 4޼8(мS>D޼ H޼L<>X޼\>`޼ d޼hPSPPPC$мSCb]ԫЫP lU[ЬMX"@ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2)'>RмP2@bP PSS IGAS  ((8888#kkмSCR2RkkkЫP@U[ЬЬ  $>R>$SмP@b8мQAcмTD1Ac1ԫ1мQAc мT@bD ּ1uԫ1mT2AcQ Q0Q +Q '?s1+мQAT1H\11мP@b %>@b<> @~^D8 ^PT1мP>@b,> 0~^4(^PT1TTP@b @b T1мP@b TpмP@b TaѼTUмP@bPPA PZ PмQPAT*мQAbQQa Qz QмPQ@TT TԫЫPS[Ь P>QPPRмSSRRS@aCaP мS R>T>>޼ ޼$RSSPDS[޼ko8S[PP$Ь ޫPo>Pм QjA` QмRRQQRR м RB` PмRRPPRR R[ЬPPмPP>Ѽ  ޼ ($+T[Ь  PPHЬ0ޫ,PR> SBc0 Bc9RRk">PL>d޼ h\1\Bc Bc RPBcBc  Bc@VPR@Vl{P1|%ːˠﮂ˰iѫ1ի ѫ 1>yP1kP@ @ PR>DcT PP~^^PT)DcTRBc)19> E>$޼ (0T[Ь>$ kP^RмP@ \\P@< ]k@4QA,@0>4~^8(^\P@QAD@H@-\P@QAT@X>\PS[ЬмP@Ѽ ּռ ݼp"~ddP:sԼ.q> d"׼q f"ּ<DS[Ь PP<Ь$ޫ P>RP>QSTd2UQUUQSzQS{SSS2CZPPyPZSSZgSPPQAb@ PQAb/@n=%>@fD>H޼ L@2P12C?PP]ZS>T>X޼ \PI>d>h޼ l`#k6>x>|޼ ˀtJ>ˈ>ˌ˄kP@0ЫPlR[ko(RüRPzPP{ PPPPP PPR޼kRPRRRЫP<4R[ЬЬ$>$R>Sм P2@cQQ1@c1@c\C>,޼ 0(YP м P@c׼ >@޼D޼H861Jм P@c-">@cP>T޼X޼\L 1Ѽ м P@ ->h޼l޼p`1мP@Tм P@UTATZUAUZ3T0T9 U0U9Ta1TzyUarUzkTU.TU>|޼ˀ޼˄tI2TU">ː޼˔޼˘ˈּ "->ˤ޼˨޼ˬ˜ּ 1O Q[Ь>Pм Q2A`QRQ S>CSQRԫЫP P[ЬЬ(>Rԫ1|PQSc2TPTTPQzPP{PPPPSVT2CUVWUdUdXXd[XPPQAb@PQAb/@=(>@g0>4,RPԫ1HV2HPPdX& XX!8PH dXUHHgHXUU>X>E\TPU=EU>h>EldQQPPQQH2HWWUUkФ  CtdP >ˈ>ˌ˄ VЫPO[Ь Ь(48U@YЫ RSS>BXP$PRT>d>Dh` PT=DT"DT>t>DxRTPP~^|p^PT"DT DTDTTsoDs`>B˄ˀPqqvqTkːkTP&Dsˬ˨ Ds˴TˠR  hO[мkм ռ޼P1Ѽ N r UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2. R(pkPPR޼40dPSSR~^D<$^ѫ  Լ1޼PL>@`\v"SSիhd"tPR>BˌˈF"ëPSP6PRP>@fˠ>B\ˤ˔Pk~^˨˜t^ˬPԫЫPO[ЬЬ$P>QR$SԫTTTɚ;PЫPN[мwoм so3vo~^,t^޼40g޼D@ kkPN[мP@`s1@Vq޼k Ѽ ޼ MxN[ЬмP@s@p>޼  |`N[pRмP@ мP@SbPQb TӄQSPQSbb@1bSCCмP@CŏAP>@ŏASP>@ CTUT8 SSP P>@$V PUP P>@$,>f0(VTU^ ݬ ݬݬI2^ݬ4^ЬWЬUЬ TЬSVgAPRJccQƏQQQ8PԢ8VU(d"RPU$d RP^ЬWЬUЬ TЬSVg1APRIccQƏQQQ8Ԣ8VU(d"RPU$d RP^ݼ@PRռQƏQQQ8Ԣ8լЬ( "RЬ$ R^ݼk@PR ЬP``PRѢzԼPѢ<"^мPP+31?P< ݬ ݬ3P< <  h^BTXGRdݬ:P WWV1PЬYЬP``! `PY PP`Y !:ST:Uh߭߭ݭ6P <~AY߭߭P߭HPWWVV|ߢ͕cߤ͕eh͕EcP߭߭":P͕ECPߢ͕cߤ͕e͕iE߭߭c߭ݭSCV1'V^SxSP@P`1PSVGVW WGPSxSP@P`xSQAUVeAUWeAP`SS h^@R߭߭<~ݭ(P?tݭ,ߢ*t8?߭ߢMߢLߢC EP*ݬ ݬtݬ߭MPPtP?߭ߢaߢ]ߢXDPݬ ݬtݬ߭P|,^@RTߢkݬ?PVVPT1V~V?P1nU28SPV  ֭  #SN5߭eP@Pߢm5cP0ߢo5cPݬ5cPTP5߭ePTV~VE?P1jV?TP5߭P1ߢq5e7P{ݬ߭PPݬ߭tPPߢsݬ*7P ݬ ݬ6ߢzݬ 7P ݬݬݬ>PPP5߭ P1^PP<^мRb b  Rb b ЬPQbUU: U*U? QZPUTU OU JU EU:@U*;U?6PQSQS PbSS S S S: S*S?̔RQP|^ CTмUЬVxURBS2c~DPfBRcb 2b~CPfxUUEP< ^BUмSЬTxSP@Qм RRa<߭M߭߭߭RfPeŸeRTxSP@P2`~CPQPQQQxSP@PR`xSP@P`QRQTR߭߭<,^ARxSCUм TTe߭G<߭߭߭]<߭߭߭Gb¸ bTݬCP2`~FPee<߭߭߭<߭߭߭ ^;S2ARѼPP ߣ|lAмbb^@QЬRxP@P`bbbP^мPP?PԼ < <@  ^޼PP^ݬ޼PްP`^ݬ ݬ޼PްP^ݬݬ ݬ޼PްP^ݬݬݬ ݬ޼PP^ݬݬݬݬ ݬ޼PްP`^ݬݬݬݬݬ ݬ޼PްP^ݬ ݬݬݬݬݬ ݬ޼PްP^ݬ$ݬ ݬݬݬݬݬ ݬ޼PP^ݬ(ݬ$ݬ ݬݬݬO4 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2+Z5ݬ ݬ޼PްP `^E@T Ь RRݬݬg'b SѼ2O!PCdPRh߭<߭,ѭHCdѼ7!PC.߭<߭CPѭC߭Ь RRv)P ^}?Sݼ<6P ЬP``PRBc Bc BcBP.ՠ ݬ߭?0ݬB B( ^ݼ5PT ЬP``PP@>RѢ `Т$ ЬSTPcczcPЬP```P<"ѭ ЭP֭ @ЭԢ â ѭ м ߭ݬТ P@.1 Э^1>Yݼ4PV ЬRbbPTDUХ SRռ bWXBh  S5Х(S"ЬTVPddS ЬP``PS SQS3BARR S ^ݬ' ^ԭݼ44PR ЬP``PЬQaP@I=PѠ ݬ߭?Q+<QQx QQ<PďPPQ<PPQQ< ^ݼ3PT Ь RbbPյѼѼԼ P߭ݬT'PѼѼ$BP<`R <RRխԼ PUDeSЬRb b  Rb b RQa@a:a],ЬPbPSP`PbPS`ìPTTQaЬTTݬ ݬDdݬ ЬUUU(мT>DePbPS`PbPS`ìPRRά^ݬPYY Ь RbbPмPP1?PYԼ ޼ ZЬXW7 V1P(Pc+TX Pݭ&P(X -xjTPVLPWW $BdSd+ЬRRPT@bݬݬݬ$Ь Qa a  Qa a a a.TQRbLЬP`(`]PRbìPRRR.`P`PRb]]`ìPRRЬRbRba.mQP`.dR b.]bìRPPRRЬQa[ PQa[QTQPQ0`TT]aìQTTRT.dЬ P`RSP`P`RS]bìRSS^ݬ*߭.#P!ޭޮS,PQQaQzQRQRRcݬ~!PSc&PcQQaQz QRPQRRcSc߭N#P߭!PT;ݬPT+~#P~!PTT|T !ЬS Pcc ~s!P>Pݬ PSc'PcQQAQZ QRPQRRcScռP^=)T:1RSPݬŏ\SP@ PSSPbߤPPbŏ\SP@PP^(Y0Xݬ PSSPP[~ZS P2P[Zm P~ZS~ PZP~ZS_ P1(ߩZ P1ŏ\ZRBTT>ZRRWTVPUTTTATZ TPTPPQTTATZ TPPTPPRQRRURR1ZTTTPTR`"P"ŏ\ZTDQЏOPaa"QPaa"aZ~ZSU P![ZP S PS PP<^ЬQЬP׬ UPSSASZ STSTTUSSASZ STPSTTRURP׬ P ^ЬP`'P`RRARZ RSPRSS`P`P ^ЬP`'P`RRaRz RSPRSS`P`^߭x޼R߭ Pb޼RPb^ /Rbb<~L b^Ь^ЬQxaaP ^ЬSЬTЬ Rdb(PdS߭[Pb bЭcЬSxcc ^xޭSЬRcPP bbQPPнb߭߭k[PbPԢ^ռ Ь P``PЬRR߭5[P PԼ Эb ^мQQ ЬP``PQн ЬP``P߭߭ZPԼ<D^$Rb+PUqߢ YTdPS?S<~ 2PPSߢSdPSݬSdPSߢSdY9PYUn U,@ ^ЬRxbݬ ݬ߭ x|^ռ Ь P``PЬP`ݬ ݬPP`V Ь RbbPЬSVccVЬ RRS߭LbмUЭTVR9RRSPԭ߭ЏPRRS:cTݬPRP2P@Rb RP`Rb_ RP`_PRRTP<8^ RЬUЬSޢ TUTSPS|߭ԟ߭P P1PPP<8^RЬUЬSޢTUHT߭߭S1 Pѭ߭2(^]\PPQլP P7lPP)9?.?PݬVݬ L P߭߬߭̏#^PxPRPRP^ݬrPP߭P^Ь߭߭ЭPΨ^ЬPPRPPRRЬ ߭߭ͬ߭խPͬPЬQR3RPΨ^X2ݬxIhxvݬxhxxP^xPKPЬ RVެWVg1`-RURT!TʏTS!SxSQQTTeVVg`ӔbVP߭ߨ߭ݬ߭Rbߨ ߭bݬ߭bߨ߭bެVfݬ ߭PUUQЬ QRUf*P%ˏPS!SSxPS!SSUUfP۔bx.7UPP^(Rݬ߭ߢ߭ ݬ߭߭|΀^Vͨߦ`߭߭ͨ խPЬTͨRԭRSRPTRTQbc֭왁߭߭ͨ߭߭߭Sլ 1߭߭ͨ߭dխnͨU2URRNRPP /GGGG3GCGGC P?PPS'SSS P޼T3UCdSS 1y޼TCdSRަQͨPSS S߭߭߭߭ͨ߭߭߭ ͨ߭߭ͨ߭|߭߭ RRSPSSP<Δ^'Tͨߤ%߭߭ͨ խPЬUͨRԭRSRPURUQbc P֭왁߭߭ͨ߭ ߭߭#߭s P^ЬSݬݬݬ'PPЬRRP`b]SRRP`b]ЬTd.STPSb RSb]SЬ QSb PRSbbP<^a URRScP0s!ЬRPSzRP{ PQP0PTTc RSP|^Ь RЬUЬVUVVUUQVPRPRBeQBfPRqpR ^ŏQ^P \^OSݬt߭߭ttխݬ tЬRR P@bPߣ/ݬiPPߣ8t߭߭ttiխݬ tЬRR P@bPP^2~P ^Ѭ ~P|~|~ݬ ݬ|~߭12~ PQQ ޼TVPdSe5RRTRSQS޼P3A`D{D{PP "RPR @{P^ݼPQ ЬP``P޼RQnP^^ ^мPP'%?P PԼ  P<  ^DWЬR>b:RV(P5VV~P؟0RPRR ЬRbbP:ЬSS4PRSTRSRXRUPTSUT5XTgP$XTg4XHggU|~PPԼ ^RPScߢ cP~D?PP Ь P``P2P@2QQQ Pcݬ9PjݬM2PP <^(PЬݬP0RPRRP< ^aUмRCPR ЏTPRTTS SPďPPee|~SR$^ ЬЬԭ|~߭ݬP PP^S߭ P@ЬRbRЬRRݭ?P-R УP֣PTcPcPTTݭ?P2QЬPA`PRb0Rb0RݬݬѬP1h̰ޭ||~߭ʟ|~ P 12T^YTЬQa a  Qa a aԼPP`` ` PP`S~߭߭<͘͘c!oSSVЬUV%U|~|~PRRReReee߭߭<͘͘fɃ5dUP ЬRbbPЬR RP & Ʉݬ P PRЬ R RPZ0P ɎRWPZ PhRZЬU UgP 9P əU P hRZR UZhɣZP ЬRbbP߭<͘͘U;9:L0Cѹh=UQ!exy * Xe=?\BNֻJu 4l.uX#'\4J WV[z F@0 U>ϢKpx!e"b̼A ?w":oC΄FP鴜` c~{)v̈́lzm;PP^c`/Y @zdbBxqŮt$ fd֥XL%?gMU1)a!p=b%ŠbmFo_ Ykр (G/݁%+40-+RZ Gκ|b(r4bJ/Tf)3\g|BؽJ_]wfsÀď=Q6VQr%x>8"`(ٌ=ϵVvi]iZ6 }OW^ިE>=%pi&oN%?IN۱`Z*6PxҒ,l?&w´/f#`[rd;ew0=qg?IzdS\ޫuuvbUrB5VbD'E)x]vr&dN' .Ԧp}Q5QR7TDt# :ԿҬ^ ;`FOb ~ ŊNDp0|ngζʁ ׂJ{=۲]1Z&!+)Tb0+|(,vh)tUco粟}wj.725XE\7s+Jyz{ M&GjT- cyD\HE54 !s, Y(2TMQԄG6ZUX3CLRwLyY*M^_eiZ{Z 'cS,$AIؠIc񇕯P`4^ {]JE3[6zn'(P5H>o@%Co4[uL*'BjفdHW `"{Gd)Ds#>UȺ" &z^Ҩsxӡ  wjX3 瘭aX]ZHDQ3痪eNeb+GnQi=+27 hlUe 1tu)<܎J* 4qGӴ:m,R,S;ynmzR9Br]uXoRcPR0COl 30g#f5 ʕkj}L0T]@U|5ڭR9"1hXj־rтLvB#3@CG+$,?~;8eX77T8A+,!4SSZgLzHoKPj)>)߱KubA >v)Ts}J3PV^PT oުb74dhuDJ/E18Kj ˣ8ީ1LY1 ;V+n<.Ŷ0&S:FM]:١Nlx6R\h =UX<Ǔ 糞SbLB&ʐi0_PqlfP('q|KEI+5h98 JN,TBz7jFcU}NiXA]^ 3k.{fՙj*$U)3cU3ų_SU'@CYxHw wQcsy5"O`pAE,'y|m.02A+r=_#<{@mQߪwЉ#́Z% C9躄GU} l釣d:$V,NƟ2²HBg՚5+3BEծןW'}g/Q5_mԼ}Km$XefowڗZ/&OElKc@O;笥pVqNں8d_|~ϸh{'a])LLs>iEQQq(|EA4お!y4CH*nsK؆1gnF\i2b7 (۽X5@ghtf#t)5/uR.< 2*7l4TEk0_^4=U@"2'ކQbKVO܏IwlsQJO%]}kýZ]Cx.2E& <b.؍m XVZv~yxz)f=j]ȡ=cu*֌LSG H@@u ºuB 'Nǖ6 FS~3_e>%0*hxH4׍vzO})+z#=bN!UhPމ.Leױ듉جNZʧ#uy(o_:f%b1y+ FBa<&EDV)caesu4pX;X4YPѕ/5зoHciNVs< UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2_խgɮߤPߤļWޤVPU|~|~UV|~p~W PRRR1JԭXЭRBB@ߤhPhߤ9ļWޤVPU|~|~UV|~p~W PRPRR1ļWVPU|~|~UV|~p~W PRPRR1Rcbc!S PSRcbbvPdѭWļWVPU|~|~UV|~p~W PRPRR11mP\ļV\UPS|~|~SU|~ͼp~V PRRR1ļVUPS|~|~SU|~ʹp~V PRPRR1RЭRBLXЭRļVBLUPS|~|~SU|~ͬp~V PRPRR1oļVoUPS|~|~SU|~ͤp~V PRPRR12ļV2UPS|~|~SU|~͜p~V PRPRRQݬRZRɻ߭߭<͘͘QмPd dĸ ĸļ ļ|ĸd ߭߭<͘͘ЬRbТP,^XvSøWޣV<U|~|~UV|~1W PpR RP2RRT1DX ߣP1ØߣÄP[ØP@~ȼP1ZØP@ØP@}ЬRRʏb1PÜߣhP1ߣPߣݬ1PԼPc cø øü ü|øcЬRbbP^AQPRB$RMqrP<м[=<[4<[+<["<[<[<[<[-XЬYx[Z(@hi@YZʏ[([hi<[*<[#<[<[<[<[<[[ ZЬXЬYXY Z(ZhiЏ[XYZZ[([hi[X[Y[ZZXZYZZ[[X[Y([hi[Z^ҼPPP^PPP2PP^ҼPPP<^T޼S>DcRT޼ SDcQP!PQUQ2SST STTeP @[Ь}PQP<Pм QQPPQQVQWXW'Q>AY2QXVQ~XP@WXV ,n  ,V <[}PQPЬ<Pм QQPPQPR>SQ&TRUEUUd2UU RPQR@[ЬЬ$P1&P 1P 3OkOO1޼L޼P޼ TH1޼\޼`޼ dX 1޼l޼p޼ th)1޼|޼ˀ޼ ˄xS1޼ˌ޼ː޼ ˔ˈmv޼˜޼ˠ޼ ˤ˘V޼ˬ޼˰޼ ˴˨6޼<޼@޼ D8޼,޼0޼ 4(޼˼޼ ~^˸6^ɼP^P2PP^ɼP|^ЬVЬUм PUTURVSVQ3cd P 3Pr^ЬSЬRSBPQм PQPQTPTTQAbQP @c@bP^ЬRм TDbP޼SDcQPR PpqPR,[ЬЬ$м PPQ>AQPRB$R2qrP [ЬЬ(м PQռ R(SjPQ [ЬЬ(м PQռ R(SЂPQ[ЬЬ$޼,޼0޼ 4( [ЬЬ(м PQռ R(SJPQ[ЬЬ$м PPQ>AQPRB$R2qrP^ЬRм T>DbP޼SDcQPR1P MYL MYL F NEED_INPUT NEED_INPUT`Yf UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2t KEYSTRIKE KEYSTRIKE8 G START_SWEEP START_SWEEP1 SET_SWEEP SET_SWEEP& DISPLAYOPT DISPLAYOPT  RESET_IMAGE RESET_IMAGE ENABLE_BUTTONSENABLE_BUTTONSEBUTTONSBUTTONSxDELETE_BUTTONS0DELETE_BUTTONS + CHOOSE_CURS` CHOOSE_CURS6 GEN_COLOR GEN_COLORF$ SHRINKERSHRINKER]"%- BUFFERREAD8 BUFFERREAD ?EXPANDERxEXPANDERw4 CLOSER CLOSER   COPY COPY  ZOOMP `ZOOMP2 SIZE_IRAF SIZE_IRAF   4s READ_IRAF READ_IRAFN )( ISUMSQ ISUMSQI RSUMSQ XRSUMSQI SCALE_ARRAY SCALE_ARRAY Yat{^ SIZE_FITS  SIZE_FITS'u READ_FITS READ_FITSH & READDK READDK8[ BYTSWP xBYTSWPL MULTI_MENU MULTI_MENU+U MMBUTT MMBUTT 1 MPTIN MPTIN D MPTOUT (MPTOUT >NEWCONVhNEWCONVuLUTPOINTLUTPOINT SET_LUTSET_LUT/hzA卲7 MOD_LUT8$MOD_LUT 2Zp UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2 |{>?$tREAD_RGBP3READ_RGB&A@f^PRINT_IT7PRINT_IT  ͭ1  SNAP_IRAFC SNAP_IRAF tGRAPHICSHKGRAPHICS  w$=¹ {  6!U    VALUE XkVALUE D CHANGE_FONTl CHANGE_FONTm'( ( CHANGE_SIZExo CHANGE_SIZEh CHANGE_LINE r CHANGE_LINEc TRANS tTRANS MARKER uMARKERp IMAKWC vIMAKWC  IMCLOS wIMCLOS IMCREA wIMCREAD IMDELE xIMDELE ] IMEMSG hxIMEMSGƹ } { y #w &u /m 2k 5i 8g )w ,u ;g >e Ac Da G_ J] Mǹ[ PY SW VU YS \Q _O bM eK hI kG qB t@ w> z< }: nJ ' M7 2 0 . 8 , IMFLSH $}IMFLSH IMGKWC }IMGKWC IMGS2R t~IMGS2R4b IMGS2S IMGS2S.[< UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2+ IMGSIZ IMGSIZl IMGSTR pIMGSTR IMOPEN DIMOPEN4 IMPL2S xIMPL2S IMSETM DIMSETM f IMSETP IMSETP* BFCLOS ؃BFCLOSq BFFLSH LBFFLSH  BFREAD ԄBFREAD$ BFWRIT BFWRIT% IDBFID IDBFIDn#f IDBGEG IDBGEGo4 Q # '  +  IMASTR IMASTR o IMCREX \IMCREX+ [E IMDELX IMDELX9 IMFINS XIMFINS3R IMFMKE IMFMKE|   IMFPAE hIMFPAE)S IMFTRS IMFTRS  s IMFUPR 0IMFUPR IMGDIX IMGDIX D IMOPNX IMOPNXI+( IMPSTR (IMPSTR-G IMWPHR pIMWPHR BFALCX BFALCX8 BFFILL PBFFILL! BFOPNX (BFOPNX) IDBKWP ,IDBKWP(! IDBNAS IDBNAS'   IDBPUG IDBPUG -2 b 5 : ?  IMACCF xIMACCFL IMADDF ģIMADDF3 IMDINT IMDINT L IMFALN IMFALN , IMFGPE IMFGPE-j BFMODE |BFMODE&  Q CLKTIE ЧCLKTIE  CTOD CTOD K CTOI CTOI-  CTOWRD CTOWRDI 9 DTOC DTOCQ 3 ERRCOE ERRCOE  FNLDIR FNLDIR n FNROOT lFNROO\dw UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2BTt GCTOL GCTOLQ  ) " GSTRCY GSTRCYj LTOC pLTOC 4 PATMAE PATMAE ? PATMAH PATMAH : SALLOC SALLOC! SFREE SFREEa SMARK SMARK+ STKMKG @STKMKGx STRDIC STRDICC  STRIDS ȴSTRIDS,  STRIDX STRIDXM STRLWR ܵSTRLWRI STRMAH (STRMAH : STRNCP dSTRNCPp STRNE ԶSTRNEe STRUPR <STRUPRI SYSERS SYSERS n SYSPAC SYSPAC9 VFNENE 4VFNENE¹ XCALLC XCALLC c XERPOP dXERPOP ! XERPSH XERPSH $ XERROR XERROR O XMALLC XMALLC= XMFREE <XMFREEH XSIZEF XSIZEF  XSTRCT XSTRCT7 XSTRCY ԽXSTRCY] XSTRLN 4XSTRLN 9 CCTOC pCCTOC> COERCE lCOERCEk DTOC3 ؿDTOC3¹H) ERRACT ERRACT( GLTOC GLTOCU| GPATME LGPATME¹` Z -G [ D L% a => #V 7J :%  GPATMH GPATMH GSTRCT GSTRCT GSTRMH TGSTRMHQ K &G +E . ITOC $ITOC+ KMALLC KMALLC 4 MALLO1 MALLO1{ MGTFWA MGTFWAZ MSVFWA MSVFWA B PATAMH ,PATAMH1  P]CJ UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2pATGEL 0PATGEL PATGSE PATGSE9      PATOMH xPATOMH> b \ W O J E @ 7 .9 PATSTS |PATSTS  SYSERR SYSERR VVFNEE VVFNEE b XERACT XERACT Z XERFMG XERFMG_ D 4) XERPUE XERPUE  CHDEPT xCHDEPT ) DTCSCL DTCSCLU ENVFID ENVFID9l MGDPTR hMGDPTRT PATFIT PATFIT@  PATLOE PATLOEL ENVPUS ENVPUSK# KIENVT KIENVT.+ C6 KREALC KREALC/!, STREQ STREQe KISEND dKISEND Z KSAWAT KSAWATM KSAWRE KSAWRE > KIERRR PKIERRR  ZFIOBF <zopnbf Tzclsbf hzardbfr zawrbfrP_read_write_bfd zawtbfW zsttbfM ; <e ZFIOKS \zopnks ks_getlogin ks_scanlogin ks_getword TzclsksP zardks lzawrks$pr_onsigH lzawtks* zsttks9 \     V ZCALL zcall0 zcall1 zcall2 zcall3 0zcall4 Pzcall5 pzcall6$ zcall7( zcall8, zcall9, G ZFIOTX zopntx zclstx `zgettx (zputtx zflstx znottxt \zsektx8 zstttxM J  ZSVJMP ZDOJMP ZSVJMP$CODE ZFACSS zfacssL_access a  ^2 UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2{ ZFALOC Lzfaloc  - L:  ZFDELE Xzfdele1 X ZFMKDR zfmkdr G ZFNBRK 4zfnbrk (4! ZFPATH zfpath " ZFPROT zfprot _check_prot _set_prot q ZFSUBD Xzfsubdt XL ZGTENV zgtenv\ _ev_scanirafh _ev_loadcache _ev_streql _lower_case5L _upper_case5  D ZGTIME zgtime/   ZGTPID zgtpid)   ZLOCPR zlocpr  ZLOCVA zlocva  ZMALOC zmalocL LzmfreeP_zmalocD_zmfreeL ? ZPANIC ,zpanic ), ZRALOC zraloc(_zraloc _movbP : ZXWHEN zxwhen_exception_handler  0zxgmesl _setup_control_c( _control_c_astE r  ҹE OPEN p _open _close< _read\ _write7 7 p tCONVTIMEX  _convtimeO KX DIRNAME _dirname  . BUFFER _get_fio_bufferT _free_fio_buffer.  ! GETJPI$_getjpiD $  ZFINFO hzfinfo_get_device_info  _make_uic  _make_octalTT _uic2unameH 0h   RMS _rms_openH _rms_closeh _rms_flushH _rms_filesize _osfnV F    ZOPCPR tzopcpr zclcpr zintpr4_prinit0d_prfind*_prtimeo _prast_prexitL t_bk, UISDISP.BCK#[SHARP.UISEXP]UISDISP45.EXE;2ֹ   STR 'STRCAT STRCHR {STRCMP STRCPY STRLENJSTRNCATSTRNCMPSTRNCPYSTRRCHR_STRCPY0_STRPAKK_STRUPK$CODESTRDESC_strdesc$ _strdesc_l TRANLOG_tranlog  _createlogx! _createjoblogx! _deletelogH! _deletejoblogH" _mklognamg" _dellognam: mo FD" _zmake_fdm0#_zchk_fdDt# _zclear_fd@# _zinit_fd4 ."> ZERROR#_zerror I# EXIT$ _exit_inits$ _exit_handler $7RMSDATA"RMSDATAl HTONS %htons %  KUTIL%ku_fopen@& ku_fclose &ku_fgetsc& ku_gpasswdm' ku_initpasswdL@(ku_promptnoecho) ku_ttyput* ku_mkfname +ku_itocDd+ku_bcopyD+ku_sleep+ku_error+ ku_mapdir %   F TCPCLOSE, tcp_close, TCPREAD,tcp_readR,  REXEC, tcp_rexec o, SOCKET/ tcp_socketz/TCPWRITE0 tcp_writeW0 ZFIOPR \0ZOPNPRw 1ZCLSPRt H2zardprI 2zawrprI2_mem_io` @4zawtpr4 t4zsttprH4 _ipc_abort-4_sm_nameL85_log_ipc \0   ZFIOTY 6zopnty 6zclstyP L7zgetty P8zputtyI 9zflsty4 9znotty 9zsekty 9zstttyA 6׹    ZFCHDR ,:zfchdr ;zfgcwd;_valid_dirname? ,:H  ZWMSEC <zwmsecV <`7}*v&3ׂF6HLǏw'`slOf(l&HlGT0Yl\$,.BEnJBa<#n.Z N\m; >Hu'GBT O,TVaB3n 9آdEMhcaQW6KqYqg!6$w*ǝP vv66)r :ْw1 p^q|uƨRy|N v@z_1;2[B#~GK#U1J"6Hs^g4|L7S3zElZVnc>}ô ?n7f^Oj7y*$*\X`vl5"xZi,>Dt8{NNWowʿkM)$RoAM۽xI n4Ͽn_|iPhZgL~ =W&b棓WTU~m۝/ IMއK)|SLsXOF$vt+ӏcf՝?^X})$`Lhه{$IգavS |N ;,06ps0I 7e+¥ g|p{_+v B״\ UuYYHdn-^͛,M,DWS R]O(C{Q4Ш˴RemGg@7l5MH |x_XWHwmeqJ鉠&V`d_$p 5:p338'}"y[&eKO† hr<^]$zZ|ĝk{꒻n|,ʠV0bt =.cðeLRs) -s)=9l$3,'cҗfK(hp{z܉-1EowҏTN'e`֫(#D֜2\A*R- ~9buP,)X=Wfjm:}$lXUa ?A3SiPLڨxAb1it_i~C<"I'2JA} T]XJVͧbs&\.袂Jj66ɛ):7rЌHPnU⳧Hp;nHk=L\z`,Kvyf0*KLJDm{$ pq {eIixK'oްdT8?a[liH`5W٠T)+N\q֭[<C/z3@]c -A Tu7JRf;DYʏ%b!ݬQTo9(&;% (0|2RnT8(0I#֢2L8qа陊Cl|ۺrY7 95&D1e篢 QN6(`7af* 7]!~{64rϡd *٢Aۛt`fT|!' 檮elm隊_96zעR&%U~ORhCm)c4"D!P>ՆeY#ӍnU͇T`szG*\gʫ{=D&\}8{*j>J/bCet'Al^?hA`#u [Rc+^MŇ!*M%ێCE`y7NRhUˮDJeO䚬{KA Ν$ji~qX?gkȫ :.`C&3"7v{_aaXŸrfv:{\0}㝹|Lt7] dDʈN[G\*y)mj'B]vھ6T ֓% ].Wzā@r8"9ucR>k}mLC4[njL"(ʒQOb QSDP*.^AI|Xp;~n aٶ|b~6yfc3 KgȱQ^%m5*1Ўj}@t' zn̖v g] a9"(Z?<)FTDi> Z&_ׁE3/6uݣrv]:Ծ27P^wER=ap7 dDWɞ_몴ōPNsU3bɁK62:ԫg5l8]f2 Ǽ[ӭK:o#c8A͆$UB׭4Φ9hmBqHvQ @DlDNL$IxШi{Z 7XM5W^&lvKژbS,N°!qѲo5ƾlbDT8kضns)^vJpZO?VOY\Y7R >#L2a&JNZAвT}™)Q&FCV@J,$5x F{ax sUH\&VV3ロ %hw@^e"5?V8Q6< ԆM"kn+ GA|_w f+YfX헇էZ;Hd\Pv;&AS &t<,4# +?7K-od]x|'[Č$LCqKuw-Y1Py(W:zY$:fqUzQ :mFq DžtwYZdQX^K[ 6 2ەzKH0Z2v!Ud*yhP.oJ9Ցw-\=x*:#3 %]LU* >ǏE3\h:gDD_ W#L^(u΁y