sources-request@genrad.UUCP (11/12/84)
From: dlc@lanl.arpa {cmcl2|csu-cs|nmtvax|unm-cvax}!lanl!dlc [ Editor's note: I debated with myself for a long time before approving this one, because a substantial part of this submission is not SOURCE, but binary restricted to Macintosh machines. Nevertheless, I decided to go with it because of it's usefulness. Note that this does NOT mean that mod.sources is net.apple.binaries - I intend to restict machine specific and binary submissions. - john ] The ARPA news group "info-mac" recently announced an assembly language version of a hexify/de-hexify program for the Apple Macintosh. Some time in August, I posted a Microsoft BASIC program to convert another program (fromhex) to a resource, and I still get an occasional request for help with it, because it doesn't seem to work with every version of MS-BASIC. The following message from info-mac, and the shar archive following it, provide the original "binhex" in BASIC, the new "binhex" in hex, and a "fromhex" in hex for use with older down-load files. The new binhex format is much faster and more compact than the fromhex format, so it will probably become a new standard for shipping Macintosh applications. To operate fromhex, by the way, name your download file "C" and double-click fromhex. It will convert the file to a resource named "C prog". If it beeps just before finishing, you got a checksum error. You will enjoy binhex. --------- dlc@lanl.arpa (cmcl2 | csu-cs | nmtvax | unm-cvax)!lanl!dlc Subject: FAST version of BinHex From: Thomas.Newton@cmu-cs-spice.arpa Recently Yves Lempereur of Mainstay (the company that puts out MacASM) wrote an assembly-language version of BinHex and placed it in the public database section of Compuserve. This new version has several major advantages over the BASIC version: (1) It runs MUCH faster (2) It takes up less space on a Mac disk (3) It can handle data and resource forks longer than 64K (4) It can handle files with both data & resource forks (5) It can save and restore finder attributes like the bundle bit (6) It can produce & decode special "condensed" hex files which are about 30% shorter than "normal" hex files. The new version of BinHex is itself encoded in BinHex format. To convert it back to normal format, you should: (1) Use the BASIC version of BinHex to convert the upload document BinHex.Hex into the application document BinHex.Tmp, (2) Use BinHex.Tmp to convert BinHex.Hex into BinHex, and (3) Throw away BinHex.Hex and BinHex.Tmp ------------ : This is a shar archive. Extract with sh, not csh. : The rest of this file will extract: : bh.b bh.h fromhex.hex echo extracting - bh.b sed 's/^X//' > bh.b << '/*EOF' X10 'BinHex version 3.0.0 - By William B. Davis, Jr {CIS 71505,410} X20 'with modifications by Bob VanBurkleo {CIS 74435,1373} X30 'using subroutines by: X40 ' Dennis Brothers of Brothers Associates {CIS 70065,172} X50 ' Ronald H. Nicholson, Jr {CIS 71505,410} X60 'Permission is hereby granted for personal, non-commercial reproduction X70 'and use of this program, provided that this notice is included. X100 CLEAR,24000 X110 CLEAR:DEFINT P:DIM PARAMLIST%(39),RECT%(5),BACKPATTERN%(4),GETFILEINFOCODE%(25) X120 DIM SETFILEINFOCODE%(25),P(89),DBUF%(256),VBUF%(266) X130 X255%=255:LFR=0:LFD=0:RFN=0 X140 A=0:BOX=0:BX=0:BY=0:TRUE=-1:FALSE=0:CHOICE=0:CKSUM%=0:COUNT=0:E=0 X150 FILE=0:FILEINFO!=0:FL=0:LF=0:FP!=0:I=0:LP=0:P=0:PARAM!=0:TR=0:PX=0:PY=0 X160 R=0:RC=0:RF=0:RN=0:RW=0:RX=0:S=0:SETFILEINFO!=0:GETFILEINFO!=0:X=0:X9=0:Y=0:XX%=0 X170 A$="":BF$="":D$="":E$="":DD$="":F$="":FT$="":HF$="":HX$="":RET$="":S$="":TEXT$="":FILE.EXISTS=0 X180 TYPEAPPL$="":X$="":XX$="" X1000 WIDTH "SCRN:",255 X1010 WHILE TRUE X1020 GOSUB 8000:CALL SHOWCURSOR X1030 RECT%(0)=2:RECT%(1)=10:RECT%(2)=275:RECT%(3)=475:GOSUB 7100 X1040 RECT%(0)=5:RECT%(1)=13:RECT%(2)=272:RECT%(3)=472:GOSUB 7200 X1050 CALL TEXTFONT(0):CALL TEXTSIZE(12) X1060 CALL TEXTMODE(1):CALL TEXTFACE(8) X1070 CALL MOVETO (45,20) X1080 PRINT"BinHex -- Hex to binary/Binary to hex file conversion" X1090 CALL MOVETO(140,40):CALL TEXTFACE(0) X1100 CALL TEXTFONT(1):CALL TEXTSIZE(9) X1110 PRINT" Version 3.0.0 - Data & Resource Files"; X1120 CALL MOVETO(35,260) X1130 PRINT"Copyright ";CHR$(169);"1984 by Calypso! Software "; X1140 PRINT"- May be reproduced for non-commercial use only."; X1150 CALL TEXTFONT(0):CALL TEXTSIZE(12) X1160 CALL MOVETO (120,68):PRINT"Click on the desired conversion method:"; X1170 RESTORE 1200:GOSUB 6000 X1180 ON CHOICE GOSUB 3000,2000,1500,1600 X1185 GOTO 110 X1190 WEND:STOP X1200 DATA 75,90,"Application document --> Upload format document" X1210 DATA 75,130,"Upload format document --> Application document" X1220 DATA 75,170,"Quit BinHex and return to the Macintosh Desktop" X1230 DATA 75,210,"Quit BinHex and return to Microsoft BASIC" X1240 DATA -1,-1,"Dummy end of list" X1500 GOSUB 8000 X1510 RECT%(0)=100:RECT%(1)=100:RECT%(2)=150:RECT%(3)=400:GOSUB 7100 X1520 RECT%(0)=103:RECT%(1)=103:RECT%(2)=147:RECT%(3)=397:GOSUB 7200 X1530 CALL MOVETO(120,130):PRINT"Returning to Macintosh DeskTop...."; X1540 SYSTEM X1600 CLS:CALL TEXTFONT(1):CALL TEXTSIZE(12) X1610 CALL TEXTMODE(0):CALL TEXTFACE(0) X1620 PRINT"Entering MS-BASIC Command mode....":END X1630 '-------------------------------------------------------- X1640 '" Hex ---> Binary conversion procedure X1650 '-------------------------------------------------------- X2000 CHOICE=1 X2010 WHILE CHOICE=1:GOSUB 8000:ON ERROR GOTO 0 X2020 CALL TEXTMODE(1):CALL TEXTFACE(8) X2030 RECT%(0)=32:RECT%(1)=2:RECT%(2)=200:RECT%(3)=480:GOSUB 7100 X2040 RECT%(0)=35:RECT%(1)=5:RECT%(2)=197:RECT%(3)=477:GOSUB 7200 X2050 CALL MOVETO(15,52) X2060 PRINT "Convert Upload document (hex) to an Application document"; X2070 CALL TEXTFACE(32):CALL MOVETO (15,73) X2080 PRINT "Enter name of Upload Document to convert FROM (Press RETURN to cancel):"; X2090 CALL MOVETO(15,153) X2100 PRINT "Enter name of Application Document to CREATE (RETURN key skips back):"; X2110 RECT%(0)=80:RECT%(1)=15:RECT%(2)=105:RECT%(3)=450:GOSUB 7000 X2120 RECT%(0)=160:RECT%(1)=15:RECT%(2)=185:RECT%(3)=450:GOSUB 7000 X2130 BX=20:BY=95:GOSUB 7500:HF$=RET$:IF HF$="" THEN RETURN X2140 FILE.EXISTS=TRUE X2150 ON ERROR GOTO 3600:OPEN"I",1,HF$ X2160 CLOSE:IF NOT FILE.EXISTS THEN 2000 X2170 BX=20:BY=175:GOSUB 7500:BF$=RET$:IF BF$="" THEN 2000 X2180 OPEN"I",1,HF$,1:OPEN"O",2,BF$ X2185 F$=HF$:GOSUB 4580:GOSUB 4000:LF=LFD X2190 ' Read in lines from file & ignore anything until the X2200 ' Type/Creator header information is encountered. X2210 CKSUM%=0 X2220 LINE INPUT #1,D$:'" Prime the pump.... X2230 WHILE LEFT$(D$,1)<>"#" AND NOT EOF(1) X2240 LINE INPUT #1,D$ X2250 WEND X2260 ' if we reach this point (1) we have found the header, of the form X2270 ' #TYPECRTR where TYPE is 4 byte type code & CRTR is 4 byte X2280 ' creator code; or (2) we have reached EOF of hex file. X2290 WHILE NOT EOF(1) X2300 TYPEAPPL$=MID$(D$,2,8) X2310 GOSUB 8000 X2320 RECT%(0)=50:RECT%(1)=100:RECT%(2)=200:RECT%(3)=400 X2330 CALL PENNORMAL:GOSUB 7000 X2340 RECT%(0)=53:RECT%(1)=103:RECT%(2)=197:RECT%(3)=397 X2350 CALL PENSIZE(2,2):GOSUB 7000:CALL PENNORMAL X2360 CALL MOVETO(110,80):CALL TEXTFACE(0):CALL TEXTMODE(1) X2370 PRINT "TYPE of new file is................:";MID$(TYPEAPPL$,1,4) X2380 CALL MOVETO(110,95) X2390 PRINT "CREATOR of new file is..........:";MID$(TYPEAPPL$,5,4) X2400 CALL MOVETO(110,110) X2410 PRINT USING "Length of new file will be approx : ###.##K";(LOF(1)/2)/1024; X2420 CALL MOVETO(110,175) X2430 PRINT "Conversion in process - Please stand by...." X2440 CALL TEXTMODE(0) X2450 F$=BF$:GOSUB 4660:GOSUB 4200:'" Set type and creator of file X2460 LINE INPUT #1,D$ X2470 IF LEFT$(D$,12)="***DATA FORK" THEN LINE INPUT #1,D$:CALL MOVETO (110,140):PRINT BF$;": a Data File" X2475 IF LEFT$(D$,11)="***RESOURCE" THEN CALL MOVETO(110,140):PRINT BF$;": a Resource File":GOSUB 21000:GOTO 2540 X2480 WHILE NOT EOF(1) AND LEFT$(D$,14)<>"***END OF DATA" X2490 GOSUB 2800:' Convert string to binary X2500 LINE INPUT #1,D$ X2510 WEND X2520 IF NOT EOF(1) THEN LINE INPUT #1,D$:'get checksum if available X2525 GOTO 2540 X2530 WEND X2540 CLOSE:GOSUB 8000 X2550 RECT%(0)=30:RECT%(1)=80:RECT%(2)=220:RECT%(3)=410:GOSUB 7100 X2560 RECT%(0)=33:RECT%(1)=83:RECT%(2)=217:RECT%(3)=407:GOSUB 7200 X2570 CALL MOVETO (100,55):CALL TEXTMODE(1) X2580 PRINT "Conversion of upload format document to"; X2590 CALL MOVETO(100,70) X2600 PRINT "application document has been completed!"; X2610 CALL MOVETO(140,100) X2620 IF LEFT$(D$,12)="***CHECKSUM:" THEN PRINT "Checksum in file: ";MID$(D$,13,2); X2630 IF LEFT$(D$,12)<>"***CHECKSUM:" THEN PRINT "No checksum present in file..."; X2640 XX$=HEX$(CKSUM%):IF LEN(XX$)<2 THEN XX$="0"+XX$ X2650 CALL MOVETO (140,115):PRINT "Calculated Checksum: ";XX$; X2660 BEEP:RESTORE 2690:GOSUB 6000:CALL TEXTMODE(0) X2670 WEND:' of the WHILE CHOICE=1 X2680 RETURN:' if CHOICE=2 X2690 DATA 130,155,"Convert another upload document" X2700 DATA 130,180,"Return to Main Conversion menu" X2710 DATA -1,-1,"dummy end of list" X2720 '----- Loop to break down input line into byte-pairs & convert ----- X2800 FOR I=1 TO LEN(D$) STEP 2 X2810 XX%=VAL("&H"+MID$(D$,I,2)):CKSUM%=(CKSUM%+XX%) AND 255 X2820 PRINT #2,CHR$(XX%); X2830 NEXT I:RETURN X2840 '------------------------------------------------------- X2850 ' Binary ---> Hex conversion procedure X2860 '------------------------------------------------------- X3000 CHOICE=1 X3010 WHILE CHOICE=1:GOSUB 8000 X3020 ON ERROR GOTO 0:CALL TEXTMODE(1):CALL TEXTFACE(8) X3030 RECT%(0)=32:RECT%(1)=2:RECT%(2)=200:RECT%(3)=480:GOSUB 7100 X3040 RECT%(0)=35:RECT%(1)=5:RECT%(2)=197:RECT%(3)=477:GOSUB 7200 X3050 CALL MOVETO(15,52) X3060 PRINT "Convert Application document to an Upload document (hex)"; X3070 CALL TEXTFACE(32):CALL MOVETO (15,73) X3080 PRINT "Enter name of Application Document to convert FROM (Press RETURN to cancel):"; X3090 CALL MOVETO(15,153) X3100 PRINT "Enter name of Upload Document to CREATE (RETURN key skips back):"; X3110 RECT%(0)=80:RECT%(1)=15:RECT%(2)=105:RECT%(3)=450:GOSUB 7000 X3120 RECT%(0)=160:RECT%(1)=15:RECT%(2)=185:RECT%(3)=450:GOSUB 7000 X3130 BX=20:BY=95:GOSUB 7500:BF$=RET$:IF BF$="" THEN RETURN X3140 FILE.EXISTS=TRUE X3150 ON ERROR GOTO 3600:OPEN"I",1,BF$ X3160 ON ERROR GOTO 0: CLOSE:IF NOT FILE.EXISTS THEN 3000 X3170 BX=20:BY=175:GOSUB 7500:HF$=RET$ X3180 OPEN"O",2,HF$ X3190 F$=BF$:GOSUB 4580:GOSUB 4000:LF=LFD+LFR X3200 CLS:CALL TEXTFACE(0) X3210 PRINT "LENGTH of Application document is:";LF;" bytes (characters)" X3220 PRINT "TYPE of Application document is: ";LEFT$(TYPEAPPL$,4) X3230 PRINT "CREATOR of Application document is: ";RIGHT$(TYPEAPPL$,4) X3235 PRINT "DOCUMENT is a ";:IF LFD=0 THEN PRINT "Resource File":ELSE PRINT "Data File" X3240 PRINT:CALL TEXTFONT(4):CALL TEXTSIZE(9) X3250 PRINT "<---Hex data being output--------------------------------------> "; X3260 PRINT"Processed/Total" X3270 CKSUM%=0:COUNT=0 X3275 IF LFD=0 THEN GOSUB 22000:GOTO 3380 X3280 PRINT #2,"#";TYPEAPPL$:PRINT #2,"***DATA FORK" X3285 OPEN "R",1,BF$,1:FIELD 1,1 AS D$ X3290 FOR I = 1 TO LFD X3300 GET 1,I X3310 DD$=HEX$(ASC(D$)):IF LEN(DD$)<2 THEN DD$="0"+DD$ X3320 CKSUM%=(CKSUM%+ASC(D$)) AND 255 X3330 PRINT #2,DD$;:PRINT DD$; X3340 COUNT=COUNT+1 X3350 IF COUNT=32 THEN COUNT=0:PRINT #2,"":PRINT USING " ######_/";I;:PRINT LFD X3360 NEXT I X3370 IF COUNT<32 THEN PRINT #2,"" X3380 PRINT #2,"***END OF DATA" X3390 XX$=HEX$(CKSUM%):IF LEN(XX$)<2 THEN XX$="0"+XX$ X3400 PRINT #2,"***CHECKSUM:";XX$ X3410 CLOSE:CALL TEXTFONT(0):CALL TEXTSIZE(12) X3420 RECT%(0)=30:RECT%(1)=80:RECT%(2)=220:RECT%(3)=410:GOSUB 7100 X3430 RECT%(0)=33:RECT%(1)=83:RECT%(2)=217:RECT%(3)=407:GOSUB 7200 X3440 CALL MOVETO(90,70):CALL TEXTMODE(1) X3450 PRINT "Conversion of Application document to an"; X3460 CALL MOVETO (90,85) X3470 PRINT "Upload format document has been completed!"; X3480 BEEP:RESTORE 3510:GOSUB 6000 X3490 WEND: ' of the WHILE CHOICE=1 X3500 RETURN: ' if CHOICE=2 X3510 DATA 110,120,"Convert another Application document" X3520 DATA 110,160,"Return to Main Conversion Menu" X3530 DATA -1,-1,"dummy end of list" X3540 '------ Subroutine to handle file-not-found condition ------ X3600 RECT%(0)=75:RECT%(1)=100:RECT%(2)=165:RECT%(3)=400:GOSUB 7100 X3610 RECT%(0)=79:RECT%(1)=103:RECT%(2)=162:RECT%(3)=397:GOSUB 7200 X3620 CALL MOVETO(160,110):PRINT"That document does not exist!"; X3630 BEEP:BEEP:RESTORE 3640:GOSUB 6000 X3640 DATA 150,130,"<--Click here to select another file" X3650 DATA -1,-1,"Dummy end of File not found list" X3660 FILE.EXISTS=FALSE:RESUME NEXT X3670 '------------------------------------------------------------ X3680 ' _GetFileInfo -- Subroutine to get type and application of a file X3690 '------------------------------------------------------------ X4000 FL=LEN(F$) X4010 F$=CHR$(FL)+F$ X4020 FP!=VARPTR(F$) X4030 PARAM!=VARPTR(PARAMLIST%(0)) X4040 FOR I=0 TO 79: POKE PARAM!+I,0: NEXT I X4050 POKE PARAM!+19,PEEK(FP!+2) X4060 POKE PARAM!+20,PEEK(FP!+3) X4070 POKE PARAM!+21,PEEK(FP!+4) X4080 GETFILEINFO!=VARPTR(GETFILEINFOCODE%(0)) X4090 CALL GETFILEINFO!(PARAM!) X4100 TYPEAPPL$ = "" X4110 FOR I = 1 TO 8 X4120 TYPEAPPL$ = TYPEAPPL$ + CHR$(PEEK(PARAM!+31+I)) X4130 NEXT I X4135 LFD=PEEK(PARAM!+56)*256+PEEK(PARAM!+57) X4136 LFR=PEEK(PARAM!+66)*256+PEEK(PARAM!+67) X4140 RETURN X4150 '------------------------------------------------------------- X4160 ' _SetFileInfo -- Subroutine to set type and application of a file X4170 '------------------------------------------------------------- X4200 FL=LEN(F$) X4210 F$=CHR$(FL)+F$ X4220 PARAM!=VARPTR(PARAMLIST%(0)) X4230 FP!=VARPTR(F$) X4240 FOR I=0 TO 79: POKE PARAM!+I,0: NEXT I X4250 POKE PARAM!+19,PEEK(FP!+2) X4260 POKE PARAM!+20,PEEK(FP!+3) X4270 POKE PARAM!+21,PEEK(FP!+4) X4280 GETFILEINFO!=VARPTR(GETFILEINFOCODE%(0)) X4290 CALL GETFILEINFO!(PARAM!) X4300 FOR I=1 TO LEN(TYPEAPPL$) X4310 POKE PARAM!+31+I,ASC(MID$(TYPEAPPL$,I,1)) X4320 NEXT I X4330 SETFILEINFO!=VARPTR(SETFILEINFOCODE%(0)) X4340 CALL SETFILEINFO!(PARAM!) X4350 RETURN X4360 '----------------------------------------------------------- X4370 ' Setup Machine Language Toolkit calls X4380 '----------------------------------------------------------- X4560 ' Set up _GetFileInfo ToolKit call X4580 RESTORE 4610:I=0 X4590 READ A:GETFILEINFOCODE%(I)=A X4600 I=I+1:IF A<>-1 THEN GOTO 4590 X4605 RETURN X4610 DATA &H4E56, &HFFF8, &H48EE, &H0101, &HFFF8, &H206E, &H0008, &HA00C X4620 DATA &H4CEE, &H0101, &HFFF8, &H4E5E, &H4E75 X4630 DATA -1 X4640 ' Set up _SetFileInfo Toolkit call X4660 RESTORE 4700:I=0 X4670 READ A:SETFILEINFOCODE%(I)=A X4680 I=I+1:IF A<>-1 THEN GOTO 4670 X4690 RETURN X4700 DATA &H4E56, &HFFF8, &H48EE, &H0101, &HFFF8, &H206E, &H0008, &HA00D X4710 DATA &H4CEE, &H0101, &HFFF8, &H4E5E, &H4E75 X4720 DATA -1 X4730 '---------------------------------------------------------- X4740 ' Pseudo-Dialog-Box subroutine X4750 '---------------------------------------------------------- X6000 BOX=0:READ X,Y,TEXT$ X6010 WHILE X<>-1 X6020 BOX=BOX+1:CHECKBOX(BOX,1)=X:CHECKBOX(BOX,2)=Y X6030 CHECKTEXT$(BOX)=TEXT$:READ X,Y,TEXT$ X6040 WEND X6050 FOR I=1 TO BOX X6060 CIRCLE(CHECKBOX(I,1),CHECKBOX(I,2)),7 X6070 CIRCLE(CHECKBOX(I,1),CHECKBOX(I,2)),5 X6080 CALL MOVETO(CHECKBOX(I,1)+15,CHECKBOX(I,2)+5) X6090 PRINT CHECKTEXT$(I); X6100 NEXT I X6110 CHOICE=0 X6120 WHILE CHOICE=0 X6130 WHILE MOUSE(0)<>-1:WEND X6140 PX=MOUSE(1):PY=MOUSE(2) X6150 FOR I=1 TO BOX X6160 P=SQR((PX-CHECKBOX(I,1))^2+(PY-CHECKBOX(I,2))^2) X6170 IF P<5 THEN CHOICE=I:I=BOX :' once choice found, stop loop. X6180 NEXT I X6190 WEND X6200 FOR I=0 TO 4 X6210 CIRCLE(CHECKBOX(CHOICE,1),CHECKBOX(CHOICE,2)),I X6220 NEXT I X6230 WHILE MOUSE(0)<>1:WEND:RETURN X6240 '--------------------------------------------------- X6250 ' Routines used to draw Dialog boxes X6260 '--------------------------------------------------- X7000 CALL ERASERECT(VARPTR(RECT%(0))) X7010 CALL FRAMERECT(VARPTR(RECT%(0))) X7020 RETURN X7100 CALL PENNORMAL:GOSUB 7000:RETURN X7200 CALL PENSIZE(2,2):GOSUB 7000:CALL PENNORMAL:RETURN X7210 '--------------------------------------------------------- X7220 ' Controlled Keyboard input routine, with cursor X7230 '--------------------------------------------------------- X7500 A$="":RET$="" X7510 CALL MOVETO(BX,BY):CALL TEXTMODE(0) X7520 CALL PENSIZE(1,1):CALL SHOWPEN X7530 CALL OBSCURECURSOR:CALL LINE(0,-10) X7540 WHILE A$<>CHR$(13) AND A$<> CHR$(9) AND A$<>CHR$(3) X7550 A$=INKEY$ X7560 IF A$<>"" AND A$>CHR$(31) THEN GOSUB 7630 X7570 IF A$=CHR$(8) AND LEN(RET$)>0 THEN GOSUB 7660 X7580 IF A$=CHR$(8) AND LEN(RET$)=0 THEN GOSUB 7690 X7590 IF LEN(RET$)>65 THEN BEEP:A$=CHR$(13) X7600 WEND X7610 CALL MOVETO(BX,BY):PRINT RET$;" ";:RETURN X7620 '-------- Handle normal input of letter ASCII 32-255 ------------ X7630 RET$=RET$+A$:CALL LINE(0,10) X7640 PRINT A$;:CALL LINE(0,-10):RETURN X7650 '------- Hande Backspacing with input length >0 ---------------- X7660 CALL MOVETO(BX,BY):RET$=LEFT$(RET$,LEN(RET$)-1) X7670 PRINT RET$;:CALL LINE(0,-10):RETURN X7680 '------- Handle Backspacing when input length goes to 0 ------ X7690 CALL MOVETO(BX,BY):PRINT" ";:CALL LINE(0,-10): X7700 CALL MOVETO (BX,BY):CALL LINE(0,-10):RETURN X7710 '------- Change Window Background pattern to grey ------- X8000 FOR I=0 TO 4:BACKPATTERN%(I)=&HAA55:NEXT I X8010 CALL BACKPAT(VARPTR(BACKPATTERN%(0))):CLS X8020 FOR I=0 TO 4:BACKPATTERN%(I)=0:NEXT I X8030 CALL BACKPAT(VARPTR(BACKPATTERN%(0))):RETURN X10000 ' Open Resource Fork For E$ X10010 IF P(0)<>&H41FA THEN GOSUB 15000 X10020 P(8)=&HA20A:' Open RF X10030 Y=VARPTR(P(42)):'length of file name X10040 POKE Y,LEN(E$) X10050 FOR I=1 TO LEN(E$):POKE (Y+I),ASC(MID$(E$,I,1)):NEXT I X10060 P(25)=INT(Y/65536!):GOSUB 20000 X10070 P(26)=X:'lsw of name X10080 P(27)=0:'volume X10090 P(29)=RW:'version and R/W Permission X10100 P(30)=0'Nil-> default volume buffer msw X10110 P(31)=0:'Nil-> default volume buffer lsw X10115 IF RW=1 THEN GOTO 10160 X10120 Y=VARPTR(VBUF%(0)) X10130 P(30)=INT(Y/65536!):GOSUB 20000:' volume buffer msw X10140 P(31)=X:'volume buffer lsw X10160 X=VARPTR(P(0)):CALL X:'open the Fork X10170 RC=P(16):'return code X10180 RFN=P(28):'reference number X10190 RETURN X10500 ' Close RF at RefNum X10510 IF P(0)<>&H41FA THEN GOSUB 15000 X10520 P(8)=&HA201:'Close RF byte X10530 P(28)=RFN:'Refnum X10540 GOTO 10030 :'insert into main loop X11000 'Set up for Write RF X11010 IF P(0)<>&H41FA THEN GOSUB 15000 X11020 P(8)=&HA203:'Write byte X11030 P(39)=0:' offset msw X11033 Y=VARPTR(VBUF%(0)):P(30)=INT(Y/65536!):GOSUB 20000 X11036 P(31)=X X11040 P(40)=0:'offset lsw X11050 TR=VARPTR(DBUF%(0)) X11060 P(32)=INT(TR/65535!):Y=TR:GOSUB 20000 X11080 P(33)=X:'buffer X11090 P(34)=0:'count high X11100 P(35)=1:'count low X11110 P(38)=1:'mode as absolute offset X11120 RETURN X12000 'Write RF (hex->bin) X12010 IF EOF (1) THEN GOTO 12990:' return X12020 E=0: IF EOF(1) THEN CLS:PRINT "Hex File Error":GOTO 12990 X12030 INPUT #1,D$ X12040 IF MID$(D$,1,6)="***END" THEN 12100 X12050 FOR I=1 TO LEN (D$) STEP 2 X12060 X=VAL("&H"+MID$(D$,I,2)):CKSUM%=(CKSUM%+X) AND X255% X12070 GOSUB 13000:E=E+1:'write byte at offset E X12080 NEXT I X12085 CALL MOVETO(190,158):PRINT USING "####.##_K";(E/1024) X12090 GOTO 12030 X12100 INPUT #1,D$:'get the checksum X12990 CLOSE:RETURN X13000 'Write Byte X at offset E X13010 POKE VARPTR(DBUF%(0)),X X13015 P(39)=INT(E/65536!):Y=E:GOSUB 20000:' offset msw X13020 P(40)=X:'offset lsw X13030 X=VARPTR (P(0)):CALL X:' write it! X13040 RC=P(16):'return code X13050 IF RC<>0 THEN CLS: PRINT "Write RF Error":GOSUB 14000:CLOSE:END X13060 RETURN X14000 'Close RF X14010 GOSUB 10500:'Closing Header to RF routine X14020 IF RC=0 THEN RETURN X14030 PRINT "File Error on Closing RF" X14040 GOTO 14100 X14050 'Open RF for E$ X14060 RW=1:'set to read X14070 GOSUB 10000:'Open RF X14080 IF RC=0 THEN RETURN X14090 CLS:PRINT "FILE ERROR ON OPENING RF" X14100 PRINT "Return Code = ";RC X14110 CLOSE :END X15000 'Load Code Array X15010 I=0 X15020 RESTORE 15500 X15030 READ X:IF X<>-5 THEN P(I)=X:I=I+1:GOTO 15030 X15040 RETURN X15500 DATA &H41FA,&H001E,&H2278,&H011C X15510 DATA &H2269,&H0010,&H2251,&H4280,&HA40A X15520 DATA &H41FA,&H000A,&H3080,&H4E75,&H7268,&H6E00,0 X15530 DATA &H0000,&H0000,&H0005,&H0000 X15540 DATA &H0000,&H0000,&H0000,&H0000 X15550 DATA &H0001,&H0000,&H0000,&H0000 X15560 DATA &HFFFE,&H0000,&H0000,&H0000 X15570 DATA &H0001,&H3000,&H0000,&H0200 X15580 DATA &H0000,&H0000,&H0001,&H0000,&H0000 X15590 DATA-5 X16000 'REad RF at E X16010 IF P(0)<>&H41FA THEN GOSUB 15000 X16020 P(8)=&HA202:'Read byte X16030 P(39)=INT(E/65536!):Y=E:GOSUB 20000:'offset msw X16040 P(40)=X: 'offset lsw X16050 TR=VARPTR(DBUF%(0)) X16060 P(32)=INT(TR/65536!):Y=TR:GOSUB 20000:'buffer msw X16070 P(33)=X:'buffer lsw X16080 P(34)=0:'count high X16090 P(35)=RN:'count low X16100 P(38)=1:'mode is absolute offset X16110 X=VARPTR(P(0)):CALL X:'read it! X16120 RC= P(16):'return code X16130 RX=P(37):'returned count X16140 IF RC<>0 THEN CLS:PRINT "Read RF Error":GOSUB 14000:CLOSE:END X16150 RETURN X18000 'Dump the RF X18010 E=0:CKSUM%=0:S=0 X18020 IF E>=LFR-1 THEN RN=0: GOTO 18140: ELSE RN=256:IF LFR-E<=256 THEN RN=LFR-E X18030 GOSUB 16000:'get the buffer filled with RF X18040 FOR I=0 TO RX-1 X18050 X9=(PEEK(VARPTR(DBUF%(0))+I)) X18060 HX$=HEX$(X9):IF LEN(HX$)<2 THEN HX$="0"+HX$ X18070 CKSUM%=(CKSUM%+X9) AND X255% X18080 PRINT HX$;: PRINT #2,HX$; X18090 S=S+1:IF S>31 THEN S=0:PRINT USING " ######_/";(E+I+1);:PRINT LFR:PRINT #2,"" X18120 NEXT I X18140 IF S>0 THEN PRINT #2,"" X18150 IF RN<256 THEN RETURN X18160 E=E+256:GOTO 18020 X18170 END X20000 X=Y-65536!*INT(Y/65536!):IF X>=32768! THEN X=X-65536! X20010 RETURN X21000 'Resource hex->bin Subroutine X21010 CLOSE #2:E$=BF$:RW=2:GOSUB 14070:'Open RF to write X21020 GOSUB 11000:'Setup To Write to RF X21030 GOSUB 12000:'Dump the Hex->RF X21040 GOSUB 14000:'Close rf X21050 RETURN X22000 'Resource Bin-> hex subroutine X22010 PRINT #2,"#";TYPEAPPL$:PRINT #2,"***RESOURCE FORK" X22020 E$=BF$:RW=1 X22030 GOSUB 14070:'Open RF X22040 GOSUB 18000:'Dump Fork X22050 GOSUB 14000:'Close Fork X22060 RETURN /*EOF echo extracting - bh.h sed 's/^X//' > bh.h << '/*EOF' X#APPLBNHX$2000 X***RESOURCE FORK X00000100000014810000138100000132EDFCCE42A8000C43EC000A2149001231 X6C00060016116C0009001A4E7561E01140001B214A001CA000302800183E2800 X104E7561CA1140001B214A001CA00A302800183E2800104E7541EDFCCE42A800 X0C31400018A0013E2800106600010042A80012316C00060016A0133E28001066 X0000EC4E756188A0083E280010660000DE4E756100FF7A4268001CA00C3E2800 X10670A0C47FFD5671C600000C23E3CFFD3082800070028660000B4A0093E2800 X10660000AA4E756100FF464268001CA00C3E280010660000964E7541EDFCCE42 XA8000C316DFDD60016317C0002002C42A8002EA0443E280010660000724E754A X000000181742696E4865782056322E30202D2D2031302F32392F383400000100 X0FFFFE0008000300080002800800424008006220087FF210087FFBF8087FF008 X08706008087040080870000808700008087000080870000808703F0809FC4088 X08F88048087130280821C818080E7F0F04023007020100070100800700806007 X00401FE70020021F001004070008080000041000000220000001400000008000 X0FFFFE000FFFFF000FFFFF800FFFFFC00FFFFFE00FFFFFF00FFFFFF80FFFFFF8 X0FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8 X0FFFFFF80FFFFFF80FFFFFF80FFFFFFF07FFFFFF03FFFFFF01FFFFFF00FFFFFF X007FFFFF003FFE1F001FFC07000FF8000007F0000003E0000001C00000008000 X000000074150504C0000000000001C424E48580000000149434E230000000000 X80465245460000000000800000002900010000000000000000FFFFFFFB01140D X41626F75742042696E486578C900000000012D00000000000000009600020000 X000000000000FFFFFED70446696C65154170706C69636174696F6E202D3E2055 X706C6F6164000000001555706C6F6164202D3E204170706C69636174696F6E00 X000000012D000000000B544558542066696C74657200001200012D000000000A X436F6D70726573736564000012000F53656E64206C696E652066656564730000 X0000012D0000000004517569740051000000000000150064003200C801CC0001 X00000000000000000001000000010200040000000000460154005A019004024F X4B00000000000A000A001A0190883842696E48657820322E302C202077726974 X74656E2062792059766573204C656D706572657572207B434953203734303136 X2C313734317D2000000000001A000A002A0190883477697468204D616341534D XAA2C20616E20456469746F722F417373656D626C657220666F7220746865204D X6163696E746F73682E00000000003A000A004A012C882A466F72206675727468 X657220696E666F726D6174696F6E20636F6E74616374204D61696E737461792C X2000000000004A000A005A012C88227B4349532037303736352C3733347D206F X72202838313829203939312D363534302E000000150064006400BE0190000100 X000000000000000002000000002A000100000000003C00E60050012204024F4B X0000000000140014003B0118880A5E30206572726F722E200000001500640064 X00BE01900001000000000000000000030000000074000100000000003C00E600 X50012204024F4B00000000000A000A003A01228854436F6E76657273696F6E20 X6F66204170706C69636174696F6E20646F63756D656E7420746F20616E205570 X6C6F616420666F726D617420646F63756D656E7420686173206265656E20636F X6D706C657465642120000000150064006400B8019A0001000000000000000000 X040000000090000300000000003600F0004A012C04024F4B00000000000A000A X002A012C8850436F6E76657273696F6E206F662055706C6F616420666F726D61 X7420646F63756D656E7420746F204170706C69636174696F6E20646F63756D65 X6E7420686173206265656E20636F6D706C657465642100000000002A000A003A X00E688025E3000000000003A000A004A00E688025E31000000130064006400D8 X0195000101000000000000000000000E9400000001486DFFFCA86EA8FEA912A9 X3042A7A97B61000C02203C0000FFFFA0323F3C0002A9E93F3C0003A9793F3C00 X04A97961000C0A1B7C0001FDFC1B7C0001FDFFA8502B4FFDC2A9B442273F3CFF XFF486DFDB2A970101F67EE302DFDB2D040303B00064EFB0002FFE00032FFE000 X18FFE0FFE0FFE00160FFE0FFE0FFE0FFE0302DFDC00800000867BE42A7202DFD XB43F00A93E201F6000003242672F2DFDBC486DFDC6A92C301FD040303B00064E XFB0002FF96000E0108FF96FF96FF96FF9642A72F2DFDBCA93D201F2B40FDCA30 X2DFDCAD040303B00064EFB00020006000E00664267A9386000FF60302DFDCC0C X400001663042A73F3C000142A72F3CFFFFFFFFA97C2B57FDCEA91542A7486DFD XD2A991302DFDD20C40000166EE2F2DFDCEA98360BE42A73F3C0001A9493F2DFD XCC486DFBCEA9464267486DFBCEA9B6301F60A0302DFDCCD040303B00064EFB00 X02FF92009A03E4FF920014FF920030004CFF9200680A2D0001FDFC42A73F3C00 X02A9493F3C00041F2DFDFCA9456000FF640A2D0001FDFF42A73F3C0002A9493F X3C00061F2DFDFFA9456000FF480A2D0001FDFD42A73F3C0002A9493F3C00071F X2DFDFDA9456000FF2CA9F4486DFDB22F2DFDC6A9B36000FE82302DFDB46700FE X7A42673F3C00643F3C00642F2DFDB43F3C0000A9E9301F6000FE603F3C00463F X3C0046487A0A6042A73F3CFFFF42A742A7486DFD1E3F3C0002A9EA4A2DFD1E67 X00FED23F3C00463F3C0046487A0C03487A0A3442A7486DFD683F3C0001A9EA4A X2DFD686700FEAE49EDFD686100088661000874610008B2217C54455854002021 X7C202020200024A00D3E2800106600093E700249EDFD6845EDF9C4610007F03B X40FDD61B7C0001FDFB4A47660009206100064849EDFD1E6100086E2B680020FD XE02B680024FDE4302800280240F0003B40FDE82B680040FDD82B680036FDDC61 X0001F04A2DFDFF670841FA09CD610001B861000728426DFDF2422DFDF43F3C00 X0A3F3C0046A8934AADFDD8672842ADFDD8486DFD72A884487A0A6EA88441FA09 XA761000184700149EDFD1E45F8000061000772602C4AADFDDC676242ADFDDC48 X6DFD72A884487A0A33A88441FA098A61000156700149EDFD1E45F80000610007 X2E3B40FDD41B7C0001FDFA4A476600085E610001B44A2DFBCE67066100009860 XF041FA09616100012049EDFD1E302DFDD461000726422DFDFA6000FF624A2DFD XFF661241FA095661000116102DFDF461000164601041FA093C61000104302DFD XF261000148610000E4610004F849EDFD68302DFDD6610006E2422DFDFB2F2DFD XC6A91442A73F3C000342A72F3CFFFFFFFFA97C2B57FDCEA91542A7486DFDD2A9 X91302DFDD20C40000166EE2F2DFDCEA9836000FD0041EDFBCE424112184A2DFD XFF672E4207100161000038602442401018D12DFDF4342DFDF2D440E75A3B42FD XF24A2DFDFF6606610000CC60046100001251C9FFDA4A2DFDFF67046100002A60 X4A74070C07000666120206003F06060020C14661000434C1464207E310E31652 X0751CAFFE04E754A07671A0C0700066706E30E520760F40206003F0606002010 X06610004064E7561000016700D610003FA4A2DFDFD6706700A610003EE4E7542 X41121860061018610003E051C9FFF84E7541FA07B361D07023610003CE202DFD XE06100001A202DFDE4610000127024610003B8302DFDE86100001260AE7203E1 X98610003A651C9FFF84E753F00E04861000004301F1F00E80861000004101F61 X0004386000038441EDFCCE42A8000C316DFDD4001843EDFBCF21490020217C00 X00002000244268002C42A8002EA0023E28001067080C47FFD9660006721B6800 X2BFBCE4E753F3C00463F3C0046487A071642A74A2DFDFC66083F3CFFFF42A760 X083F3C0001487A06FA42A7486DFD1E3F3C0002A9EA4A2DFD1E6700FB783F3C00 X463F3C0046487A08A9487A06DA42A7486DFD683F3C0001A9EA4A2DFD686700FB X5449EDFD1E61000560700145F80000610004BC3B40FDD41B7C0001FDFA4A4766 X0005EC422DFDFE2B7C54455854FDE02B7C20202020FDE4426DFDE8426DFDF242 X2DFDF461000588424141EDFBCE1218670001FE60060C180023670651C9FFF860 XE20C4100086526610002DE2B40FDE0610002D62B40FDE40C41000565100C1800 X24660A610002D065043B40FDE86100037A49EDFD686100049C6100048A610004 XC8216DFDE00020216DFDE40024302DFDE881680028A00D3E2800106600055061 X00050C43FA0633610002F8660A1B7C0001FDFE610004F83F3C000A3F3C0046A8 X93486DFD72A88443FA062E610002D4660C487A06C7A884610004D4602443FA06 X07610002BE661A487A06BEA884610004BE700249EDFD6845EDF9C4610003C660 X0E700249EDFD6845EDF9C4610003A03B40FDD61B7C0001FDFB4A47660004D061 X00043A610001F46004610004824A2DFBCE671E43FA059F610002686706610001 X0460E643FA05BF6100025866046100045E6100019049EDFD68302DFDD6610003 X7A422DFDFB43FA0590610002366700FF4843FA05736100022A6700FF3C49EDFD X1E302DFDD461000352422DFDFA2F2DFDC6A91442A73F3C000442A72F3CFFFFFF XFFA97C2B5FFDCE43FA0572610001F4660E43FA06171358001313580014603443 XFA0552610001DC662643FA05ED1358000E1358000F135800101358001145FA06 X1D47EA0011302DFDF261000178601443FA05EE45FA061C47EA0016102DFDF461 X00016A2F092F0A42A742A7A98B2F2DFDCEA91542A7486DFDD2A991302DFDD20C X40000166EE2F2DFDCEA9836000F90649EDFD1E302DFDD4610002A0422DFDFA60 X00F8F2610001464A2DFDFE66240C01000265484240610000E26540D12DFDF434 X2DFDF2D440E75A3B42FDF26100005C60DC42076100002865223200601A610000 X1E6518D12DFDF4342DFDF2D440E75A3B42FDF26100003451C9FFE44E7574074A X0766161C18040600200C0600406506003C00014E75E50E7E06E316E310530751 XCAFFDE023C00FE4E75226DFDEA12C02B49FDEA52ADFDEE0CAD00002000FDEE64 X024E7548E7C38041EDFCCE42A8000C316DFDD6001843EDD9C421490020216DFD XEE00244268002C42A8002EA0033E280010660002DA4CDF01C343EDD9C42B49FD XEA42ADFDEE4E757403E1881018534151CAFFF84E756100000261000002141853 X410A0200300C02000A650A060200890C0200FA650C0202000FE9488002023C00 XFE4E753F00E0486102301F1F00E8086102101F610416C04E750200000F000000 X300C00003A65025E004E7541EDFBCE1218670C0C10000A66065288530166F44E X7561E842421419B202650C6004B308660651CAFFFA42404E7542A73F3C000142 XA72F3CFFFFFFFFA9BD2B57FDC6A8733F3C0000A8873F3C000CA88A3F3C0000A8 X883F3C0000A8894E7561CE3F3C000A3F3C0016A893487A0331A8841B7C0004FD XF52B6DFDE0FDF6486DFDF5A8843F3C000A3F3C0026A893487A0335A8842B6DFD XE4FDF6486DFDF5A8843F3C000A3F3C0066A893487A033CA8844E756100FF7C3F X3C000A3F3C0016A893487A03DEA8841B7C0004FDF52B6DFDE0FDF6486DFDF5A8 X843F3C000A3F3C0026A893487A03DEA8842B6DFDE4FDF6486DFDF5A8843F3C00 X0A3F3C0066A893487A02E8A8844E7541EDFCCE42A8000C43EC000A2149001231 X6C00060016116C0009001A4E7561E01140001B214A001CA000302800183E2800 X104E7561CA1140001B214A001CA00A302800183E2800104E7541EDFCCE42A800 X0C31400018A0013E2800106600010042A80012316C00060016A0133E28001066 X0000EC4E756188A0083E280010660000DE4E756100FF7A4268001CA00C3E2800 X10670A0C47FFD5671C600000C23E3CFFD3082800070028660000B4A0093E2800 X10660000AA4E756100FF464268001CA00C3E280010660000964E7541EDFCCE42 XA8000C316DFDD60016317C0002002C42A8002EA0443E280010660000724E754A X2DFDFA6710422DFDFA49EDFD1E302DFDD46100FF464A2DFDFB6710422DFDFB49 XEDFD68302DFDD66100FF304E7541EDFCCE42A8000C316DFDD4001843EDFBCF21 X490020217C000000FF0024317C0D80002C42A8002EA0023E28001067080C47FF XD96600000A1B68002BFBCE4E753F07618E42A7A924201F670AB0ADFDC666042F X00A91442A73F3C000242A72F3CFFFFFFFFA97C2B5FFDCE3E1F6100002E2F2DFD XCEA9153F3C0004A9C842A7486DFDD2A991302DFDD20C40000166EE2F2DFDCEA9 X832E6DFDC26000F4EC41FA023742401018670ABE0067061018D0C060F22F0842 XA742A742A7A98B4E7542A73F3C0001A9BF2F174267A9352F3C44525652A94D42 XA73F3C0002A9BF4267A935A9374E7541EDD9C4303C243C6002421851C8FFFC4E X7554455854002D28546869732066696C65206D75737420626520636F6E766572 X74656420776974682042696E4865782E48657829032A2A2A0D2A2A2A434F4D50 X524553534544102A2A2A5245534F5552434520464F524B0C2A2A2A4441544120 X464F524B0E2A2A2A454E44204F462044415441072A2A2A4352433A0C2A2A2A43 X4845434B53554D3A2554595045206F66206E65772066696C652069732E2E2E2E X2E2E2E2E2E2E2E2E2E2E2E2E3A202243524541544F52206F66206E6577206669 X6C652069732E2E2E2E2E2E2E2E2E2E3A2028436F6E76657273696F6E20696E20 X70726F63657373202D20506C65617365207374616E64206279C90C203A204461 X746120466F726B10203A205265736F7572636520466F726B1143524320696E20 X66696C653A203030303014436865636B73756D20696E2066696C653A2030301C X4E6F20636865636B73756D2070726573656E7420696E2066696C65C91443616C X63756C61746564204352433A20303030301743616C63756C6174656420436865 X636B73756D3A2030302154595045206F66204170706C69636174696F6E20646F X63756D656E742069733A202443524541544F52206F66204170706C6963617469 X6F6E20646F63756D656E742069733A20115361766520646F63756D656E742061 X733ADF0E4469726563746F72792066756C6CDE094469736B2066756C6CDC0349 X2F4FD41857726974652070726F746563746564206469736B65747465D30B4669 X6C65206C6F636B6564D20D566F6C756D65206C6F636B6564000B46696C652073 X797374656D00000018000000280000263C000000080000002000003F3C0001A9 XF00000010000001481000013810000013200004E1C005C0000001C0132000842 X4E48580000004A49434E23000000564652454600000062424E444C0000006E4D X454E550001007A444C4F47000300924449544C000300C257494E44000000F243 X4F4445000100FE0000FFFF0000000000004DD80080FFFF0000001C00004DD400 X80FFFF0000012000004DD00080FFFF0000012B00004DCC0002FFFF0000017800 X004DC40001FFFF0000014B00004DC80004FFFF0000040900004DA80003FFFF00 X00037800004DB00002FFFF0000033100004DB80001FFFF0000021200004DC000 X04FFFF0000042200004DA40003FFFF0000039100004DAC0002FFFF0000034A00 X004DB40001FFFF0000022B00004DBC0001FFFF000004B600004DA00000FFFF20 X00136500004D980001FFFF340004CD00004D9C X***END OF DATA X***CHECKSUM:11 /*EOF echo extracting - fromhex.hex sed 's/^X//' > fromhex.hex << '/*EOF' X(This file must be converted with BinHex.Hex) X#APPLCCOM$2000 X***COMPRESSED X***RESOURCE FORK X( 0 @ ' %( X( X( X( X( X( X( X( X( !031G)O;6AE>"!697)S:6]N(#$N, !@ H X( !B@ ( ( $H/SP :GP $Y %.5@ X( QM 'YVF<J,"WYVE- 2, K0/_L0F<_+?_X2&W_[$'M X(/O<+PA.N@.$.U___#M\ 'YVDY>3G70551&3%532 X($Y6 P+?G:0>W[VQ&N L %)M^=H,;0( ^=IO!$ZZ X(/^<3EXNGTYUT%540TA!4B $Y6__P,;0( ^=AO)CM\ X( !^=@K? @#_[$)G/RW_^DAM_^Q![?G<+PA.N@,( X(#M?__PP+?G80>WYVQ(P !(@4C!+4'__%)M^=@M;O_\ X( (3EY.=<=%5$-(05(@ !.5O_^+P="9S\M__I.N@*L X(#M?__Q"9S\M__A.N@*>.U___#\\ %.N@.Z?@%@!D*M X(/_@4D<,1TX@;_0_/ !3KH#HJGT+A].7DYUPD%$3D57 X(%,@ !.N@.83E8 "Q?3E4 )_M !!.N@..0>W]W$/Z X( (((-D@V3M\ 4/^W#M\ 'YVCM\ @'YV$)G2&W]W$)G X($ZZ M0[7__\0F=(;?W<0F<O.@'2+SH!RDZZ G@[7__\ X($)G2&W]W$)G2&W_^$ZZ LX[7__\2FW__&<$3KK_-$)G X($AM_MQ"9TAM__I.N@&D.U___$IM__QG!$ZZ_Q9"9S\M X(/_Z2&W_W$ZZ L8[7__\0JW_Y$*M_^A"K?_P0JW_]$JM X(/_<7L!*K?_T5\' 6< )I"ITZZ_GXK7__@4ZW_W$*G X("\M_^!P?R\ J%@K7__@#*T ! _^!<P RM 4/_@ X(%W!P %G3E*M_^AP0)&M_^!"IR\M_^0_/ $J%PK7__D X($*G+RW_Y"\M_^"H6RM?_^1"IR\M_^AP 2\ J%A*GV84 X("\M_^1.NOW:("W_Y-&M__!"K?_D#*T !\_^!F!G ! X("M __1@ /]83KK]<D)G/RW_^$ZZ /8[7__\2JW_]&8$ X($ZZ_BY"IR\M_^@_//__J%P@']&M__!"K?_D.WP ?_^ X(& ^0J=.NOVL*U__X$*G+RW_X' /+P"H6"M?_^!"IR\M X(/_D/SP !*A<*U__Y$*G+RW_Y"\M_^"H6RM?_^12;?_^ X( QM C__F^Z0F<_+?_Z3KH >CM?__P@+?_DL*W_\&<$ X($ZZ_:ZI]$ZZ :1.74ZZ 99.=4Y>3G7&4D]-2$58( 0 X($%04$Q#0T]-!D,@<')O9P!.5O_.0>[_SB%N X $C%N X( , !9"* :0B@ &T*H !R@ ")N @RJ 8/4 $DY> X("!?W_P *3M!.5O_.0>[_SC%N @ &* !/4 "DY> X("!?5(].T%'!8 )0P4Y6_\Y![O_.(6X " @,6X $ 8 X(")N PA40 D0F@ +$*H "Y* 68$H )@ J #/4 $B)N X( ,(J@ *$Y>(E_?_ I.T4Y6_[!![O^P(6X $@ 2 X(#%N ! %D(H !J@"$I 9A9": <H P@"$/H " B[@ ( X("*N R@#3U !9.7B)?W_P .3M%.5O_.0>[_SB%N X( * !(Q;@ ( !9"* :H D]0 .3EXB7UR/3M%.5O_. X($'N_\XA;@ . !(Q;@ , !9"* :H H]0 2(FX "#*H X( 83EXB7]_\ "D[13E;_SD'N_\XQ;@ , !B@$3U X( .(FX ""*H !Q.7B)?7(].T3\O 2IR"!?5$].T$*O X( 03G5.=2!?3EU.T"!?3E4 $[0@0 " !-@ X( X( X( X( X( X( X( X( X( X( X( X( X( X( X( X( < %( 4-/ X($1% $ $D9(15@ J #__R !@ '__S0 X( T __\ X( X( X( X( X( X( X( X( X( X( X( X( X( X***END OF DATA X***CRC:7F1A /*EOF