[net.sources.mac] MacModula-2 bug fixes

stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)

Here's the listing of the bug fix program for MacModula-2's interpreters.
The compiled (m-code) version is also being posted in BinHex4.0 form.
(It's difficult but possible to compile on a 128K Mac.)  See note in
net.micro.mac.

Stuart Kurtz				ihnp4!gargoyle!stuart
Dept. of Computer Science		stuart@uchicago.csnet
University of Chicago

------------------------------[cut here]------------------------------

(*  This program patches a number of potential problems in MacModula-2...
      1- Fixes a problem of the interpreter crashing at
         exit on some systems on a 128K Mac.
      2- Fixes SystemEvent trap.
      3- Fisex GetNamedResource trap.
      4- Fixes local variable problem in NewProcess
*)

MODULE Patch;
  FROM InOut            IMPORT  ClearScreen, WriteString, ReadString, WriteLn,
                                WriteCard, Read, WriteInt, Write;
  FROM ResourceManager  IMPORT  SizeResource, OpenResFile, GetResource,
                                ChangedResource, CloseResFile, ResError;
  FROM Strings          IMPORT  StrModToMac;
  FROM MacSystemTypes    IMPORT  Str255, Handle;
  FROM MemoryManager    IMPORT  HNoPurge, HPurge;
  
  CONST
    Same      =  11;    (* Number of similiar patch bytes for both *)
    bigCnt    =   5;    (* Number of patch bytes for Modula-2 *)
    smallCnt  =  6;    (* Number of patch bytes for Modula 2 *)
    Max        =  Same + bigCnt + smallCnt;
    GrandSum  =  8587;  (* Total vertical checksum *)
    
  TYPE
    patchRec =  RECORD
                  where : CARDINAL;    (* Byte location of byte to be
					* changed *)
                  bad    : CARDINAL;    (* Original value *)
                  good  :  CARDINAL;    (* New value to replace original
					 * value *)
                  chksum:  CARDINAL;
                END;
    buffer  =  POINTER TO ARRAY [0..32767] OF CHAR;
    bufhdl  =  POINTER TO buffer;
    
  VAR
    Data  :  ARRAY [1..Max] OF patchRec;
    RsrcHdl1, RsrcHdl2 : bufhdl;
    res1, res2  : INTEGER;
    ch  :  CHAR;
    
  PROCEDURE ChangeByte(Hdl : bufhdl; i : CARDINAL);
    VAR where : CARDINAL;
  BEGIN
    WITH Data[i] DO
      IF CHAR(bad) # Hdl^^[where] THEN  (* Verify old byte is bad *)
        IF CHAR(good) = Hdl^^[where] THEN (* Byte must be already changed *)
          WriteString('Patch #'); WriteCard(i,0);
          WriteString(' has already been patched!'); WriteLn;
        ELSE
          WriteString('Patch #'); WriteCard(i,0);
          WriteString(' has wrong byte! File must be corrupt!');
          WriteLn;
          Error;
        END;
      END;
      Hdl^^[where] := CHAR(good);    (* Change byte in resource *)
    END;
  END ChangeByte;
  
  PROCEDURE OpenResourceFiles;
    VAR macstr : Str255;
  BEGIN
    StrModToMac(macstr,'Modula-2');
    res1 := OpenResFile(macstr);        (* Open resource fork of Modula-2 *)
    IF res1 = -1 THEN
      WriteString('Could not open resource: Modula-2');
      WriteLn;
      Error;
    END;
    CheckError;
    RsrcHdl1 := GetResource('CODE',1);  (* Get the machine code *)
    IF RsrcHdl1 = NIL THEN
      WriteString('Cannot read code resource for Modula-2');
      WriteLn;
      Error;
    END;
    CheckError;
    HNoPurge(Handle(RsrcHdl1));            (* Lock our resource into memory *)
    
    StrModToMac(macstr,'Modula 2');
    res2 := OpenResFile(macstr);        (* Open resource fork of Modula 2 *)
    IF res2 = -1 THEN
      WriteString('Could not open resource: Modula 2');
      WriteLn;
      Error;
    END;
    CheckError;
    RsrcHdl2 := GetResource('CODE',1);  (* Get the machine code *)
    IF RsrcHdl2 = NIL THEN
      WriteString('Cannot read code resource for Modula 2');
      WriteLn;
      Error;
    END;
    CheckError;
    HNoPurge(Handle(RsrcHdl2));            (* Lock our resource into memory *)
  END OpenResourceFiles;
  
  PROCEDURE FixBigInterp;
    VAR i : CARDINAL;
  BEGIN
    FOR i := 1 TO Same DO                (* Change the similiar bytes *)
      ChangeByte(RsrcHdl1,i);
    END;
    FOR i := Same TO Same + bigCnt DO    (* Change the unique bytes *)
      ChangeByte(RsrcHdl1,i);
    END;
    WriteString('Changing resource'); WriteLn;
    ChangedResource(Handle(RsrcHdl1));  (* Flag the resource as changed *)
    CheckError;
    HPurge(Handle(RsrcHdl1));            (* Let the resource be purged *)
  END FixBigInterp;

  PROCEDURE CheckError;
    VAR err: INTEGER;
  BEGIN
    err := ResError();
    IF err # 0 THEN
      WriteString('error = ');
      WriteInt(err,0); WriteLn;
      Error;
    END;
  END CheckError;
  
  PROCEDURE FixSmallInterp;
    VAR i : CARDINAL;
  BEGIN
    FOR i := 1 TO Same DO                (* Change the similiar bytes *)
      ChangeByte(RsrcHdl2,i);
    END;
    FOR i := Same + bigCnt + 1 TO Same + bigCnt + smallCnt DO
      ChangeByte(RsrcHdl2,i);
    END;
    WriteString('Changing resource'); WriteLn;
    ChangedResource(Handle(RsrcHdl2));  (* Flag the resource as changed *)
    CheckError;
    HPurge(Handle(RsrcHdl2));            (* Let the resource be purged *)
  END FixSmallInterp;

  PROCEDURE Error;
    VAR ch : CHAR;
  BEGIN
    WriteString('Hit any key to Halt...(Files will probably not be updated)');
    Read(ch);
    HALT;
  END Error;
  
  PROCEDURE CheckData;   (* Verify that the data has been entered correctly *)
    VAR i, calcSum : CARDINAL;
  BEGIN
    WriteString('Checking data...'); WriteLn;
    calcSum := 0;
    FOR i := 1 TO Max DO
      WITH Data[i] DO
        IF where + bad + good # chksum THEN
          WriteString('Inconsistant data in array element: ');
          WriteCard(i,0); WriteLn;
          WriteString('Check the data initialization section carefully!');
          WriteLn;
          Error;
        END;
        (* Perform an XOR checksum *)
        calcSum := CARDINAL(BITSET(calcSum) / BITSET(chksum));
      END;
    END;
    IF calcSum # GrandSum THEN
      WriteString('Total checksum (');
      WriteCard(calcSum,0);
      WriteString(') does not equal correct amount(');
      WriteCard(GrandSum,0);
      WriteString(').');
      WriteLn;
      Error;
    ELSE
      WriteString('Data is OK -- Patching can proceed.'); WriteLn;
    END;
  END CheckData;
  
BEGIN
  ClearScreen;
  
  (* Data Initialization Section *)
  
  Data[1].where    := 3358;    Data[1].bad        := 32;
  Data[1].good    := 103;      Data[1].chksum  := 3493;
  
  Data[2].where    := 3359;    Data[2].bad        := 68;
  Data[2].good    := 26;      Data[2].chksum  := 3453;
  
  Data[3].where    := 3361;    Data[3].bad        := 104;
  Data[3].good    := 68;      Data[3].chksum  := 3533;
  
  Data[4].where    := 3362;    Data[4].bad        := 0;
  Data[4].good    := 32;      Data[4].chksum  := 3394;
  
  Data[5].where    := 3363;    Data[5].bad        := 118;
  Data[5].good    := 104;      Data[5].chksum  := 3585;
  
  Data[6].where    := 3364;    Data[6].bad        := 50;
  Data[6].good    := 0;        Data[6].chksum  := 3414;
  
  Data[7].where    := 3365;    Data[7].bad        := 40;
  Data[7].good    := 118;      Data[7].chksum  := 3523;
  
  Data[8].where    := 3366;    Data[8].bad        := 0;
  Data[8].good    := 50;      Data[8].chksum  := 3416;
  
  Data[9].where    := 3367;    Data[9].bad        := 8;
  Data[9].good    := 40;      Data[9].chksum  := 3415;
  
  Data[10].where  := 3368;    Data[10].bad        := 66;
  Data[10].good    := 0;        Data[10].chksum  := 3434;
  
  Data[11].where  := 3369;    Data[11].bad        := 130;
  Data[11].good    := 8;        Data[11].chksum  := 3507;
  
  Data[12].where  := 8608;    Data[12].bad        := 32;
  Data[12].good    := 34;      Data[12].chksum  := 8674;
  
  Data[13].where  := 8613;    Data[13].bad        := 16;
  Data[13].good    := 17;      Data[13].chksum  := 8646;
  
  Data[14].where  := 10611;    Data[14].bad        := 194;
  Data[14].good    := 178;      Data[14].chksum  := 10983;
  
  Data[15].where  := 15881;    Data[15].bad        := 2;
  Data[15].good    := 3;        Data[15].chksum  := 15886;
  
  Data[16].where  := 4279;    Data[16].bad        := 38;
  Data[16].good    := 40;      Data[16].chksum  := 4357;
  
  Data[17].where  := 3370;    Data[17].bad        := 52;
  Data[17].good    := 36;      Data[17].chksum  := 3458;
  
  Data[18].where  := 4558;    Data[18].bad        := 34;
  Data[18].good    := 50;      Data[18].chksum  := 4642;
  
  Data[19].where  := 4602;    Data[19].bad        := 34;
  Data[19].good    := 50;      Data[19].chksum  := 4686;
  
  Data[20].where  := 4646;    Data[20].bad        := 34;
  Data[20].good    := 50;      Data[20].chksum  := 4730;
  
  Data[21].where  := 7426;    Data[21].bad        := 49;
  Data[21].good    := 33;      Data[21].chksum  := 7508;
  
  Data[22].where  := 10385;    Data[22].bad        := 2;
  Data[22].good    := 3;        Data[22].chksum  := 10390;
  
  CheckData;
  OpenResourceFiles;
  
  WriteString('Patch Modula-2? ');
  Read(ch); Write(ch); WriteLn;
  IF CAP(ch) = 'Y' THEN
    FixBigInterp;
  END;
  
  WriteString('Patch Modula 2? ');
  Read(ch); Write(ch); WriteLn;
  IF CAP(ch) = 'Y' THEN
    FixSmallInterp;
  END;
  
  WriteString('Patching has been completed successfully!');
  WriteLn;
  WriteString('Hit any key to halt...');
  Read(ch);
  HALT;      (* Note: Program is intended to terminate with HALT *)
END Patch.

stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)

Here's a BinHex4.0 version of the Patch program for MacModula-2.

Stuart Kurtz				ihnp4!gargoyle!stuart
Dept. of Computer Science		stuart@uchicago.csnet
University of Chicago.

------------------------------[cut here]------------------------------
(This file must be converted with BinHex 4.0)

:#9"KG'0S,Na24!"-6d4&66*0-J#3""9Z!*!%Gdm!!rm8!!!"b!!-!Ed!!*M!m!"
3BA4MD!#3$!3!!3#3"`)"b3!3!#X!C9"KG'0S)#-!)'KKFb"KE(*PB@4j)'*PC@i
JF'&dBfKPC#%!!&"KG'0S)#-!)'KKFb"hFQpZCb"LHA4P)5"'D@aP)'eeFh3JBQ8
JBfpbFR9`G#%!N!-k!G$V"MJa"N%%+!'j%"A'!VkeZ"%a#L%+B5%'JL%+B"*rrmD
&b4Sr)3TL)3D#)3TJ%RrraSA)'KK"!JEY&3`S!1d9$S3%%"RY&3cY&3XE&i35"Zd
9$#J!l481K"B3*Hd9$1d9#rBK"S)K#Q!5Irr')3TLPH`!!J(+!))!@`#26@pNG@a
K,6)!!%0[G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%Y-J"$6d4&!!"$B@j
ZEh3JFQ9KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%Y-J!!6@pNG@aK)$)!!%0
[G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%J-J"$6d4&!!"$B@jZEh3JFQ9
KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%J-J#3!dN##HX#%)$U-3BK"S3U"qd
@"l)K"Zd'","D5K,rrmJD$)3[%#$Y&3cY&3[fp,+%3!(Y"Jqa83C""Y@-'Jb%3a!
Pl48-l48,p[4""Zd5&#%'K&F(l4B(XL%'l3B%X&Y,%[rrb"S-K&`3)1d9$1d9#rE
dXS4Y!Hd'$l&4#%%)eB`D$)4`%#AY&3cY&3[fp%%)l4)8l!!#!FX"%J!+!1P$D'&
ZCfPZCb"bCA0[GA*MC3!!(J*4k`%8"J%,`!!!#N%'*[("!Irk&!B,%"$!!!!+33B
QmF%"rrU%K"!3l48-l48,33EY"KRd33EY%K2XhJ!#!F`"6!!'!2*PFR*[FL!p)!#
3!a!#EZX"XZd'"V!f*J$*'K#%M3IY&3`Q!1d9$Hd9#rEXhJ!#!Fd"DJ!+!2G$D'&
ZCfPZCb"bCA0[GA*MC3!!(J*pk`%8"J%,`!!!#N%)*[("!Irk&!B3%4!@`!!!#N%
)*[("!IrkK*)3%1d9$1d9#d%)l3BCp%%)l4)6l!!#!Fi"T!!I!3")DA3JB@jj)'Y
PH5"dEb")B@ad,T!$+%CTE'9c)(GTE'`JF(*[BQ&LE(NJEQpd)'*P)(9`C'&dC@3
T!*!$#J+Dk`'%Qa!jl48-&!EY&38+a1cH!!)"c`'f!'3"(N0SC@0VD@jR)'4KG'%
ZN!-!!%PZBfpZFfPcG'&ZG#"NBA4K)'PZ)'&bFQ&j)'9XC@ePER3k)!!!3fKPBfX
JG'KP)'4KG'%JD@jTG'PKE'PkBA4TEfiJFf9MG'P[EL"MBA*PCR9XE(NK!!"8Eh4
KE#"MD'9MDh0eE5!S!!!T)'4[CA-JEQpd)'9aG@&X)'0[FR*PBh3JB@e[G@jd+!!
!+5i!!%4KG'%JDA-J6dXJ,5dJ8'&dBfKTEQFJBf&Z)("bEf0PC@3Z!!"3!U2V")5
j$qd9$1d9#`!h&!B"%"E!!!"'333Q!EN3&FB#[V@i%6%))3KJ)3KKZ#%)BVJK#'2
*'KZ%`K!Ml48-*J$Y&3lY&3Z%e4![l48-l48,pLFK#'240m%"rliR%L',b4SXK1i
2l48-*`$Y&3k%pa!Il48-%L',!1d9$N%#%`!!!K#)!Hd9$1d9#rBE%8%#%`!!!K5
)%#,Y&3cY&3[XhJ!#!FJ#9!!d!B&3BA4MD#"0Ef4eE'%Y-MmJ!!"3BA4MD#"0Ef4
eE'%J-MmJ!!"3BA4MD'PZCb"SBA-JBQ9PEL"MEfe`E'9dC@3JFh9MBf9cFfCeE'a
j)3")DA3JB@jj)'YPH5"dEb"SB@ad,T!$!!!"@3,bk`!9!C3D!Z`9$D"4""CB83,
Y&3$Y"J$Y!3$Y&J$Y%J$Y&4*""")0(R""""!JF8%%%'Gb3335$D9c3335$4pd333
34(9"""!DGN%%%JepGd%%%JdKH%%%%'Kj33334(T""")0cAY""")0)Ra""!"p333
3)(j""")03Rp""")0)j!!%%%%%(D3!"&""""SN!!53335$J'3!"0""")0**!!&%%
%%$+3!"9""!#3!"C""")09T!!&d%%%JdPN!!B3333+*!!'8%%%(D3!"T""")0`j!
!'d%%%JdQN!!F333!N!!G3333-T!!(N%%%JeBN!!I3335$5H3!#"""!L3!#&"""!
SN!!L3335$9H3!#0""")0+*!!*%%%%%+3!#9""!#3!#C""")0DT!!*d%%%JdTN!!
S3333JT!!+8%%#*!!+N%%%JfcN!!V3335)D#3!#a"""!JN!!Y3333)T!!,N%%%L(
LN!![3335)D@3!$""""!3N!!a3333%C!!-N%%%L('N!!c3335+A13!$4"""$#N!!
e3333XT!!0N%%%LVRN!!h33352JQ3!$K""!+3!$P""!13!$T""")q$T!!1d%%%K#
hN!!m3333*T!!28%%%#L3!$j""")4"C!!2d%%%JdUN!"!33330*!!38%%%#53!%*
""")0JT!!3d%%%K(1N!"%3333)T!!48%%%$+3!%C""")5)T!!4d%%%K(kN!")333
3)T!!58%%%$+3!%T""")56T!!5d%%%K)QN!"-3333)T!!68%%%$+3!%j""")5HT!
!6d%%%Kd#N!"33333-C!!88%%%#'3!&*""")G9*!!8d%%%LL4N!"8333#N!"9333
$N!"@3335+*D3!&IhmN%#%`!!!ML)$qd9$"8-l48&61d9#Zd9#d`3Ap)3@FJD![0
"!K-!!!*+L!rY&3`9$1d9"8cY&3VY&3Y-%&r5%&R)'J,e33)6!!!#A)J3+1d9$1d
9#d%#%`!!!SD)%"AY&3`9$1d9"3V%l!!$ra8%5JBJ!!`'&DPq!(idJ%PZ6h9d!*!
-"!4,!*!(!JBc!$3!U`Bkk`N`#$%')3BJ#!'r!ELh"K!4kM%0!$N9#1d!!dJ0b"S
%%"YB5"!JV4i%5!M)'MK)#-JD%#N!V"S*#1d!!5N"Z6NE(8J3)+dI"5N32kSD%8M
Y!!&"#LN32mC)P5N"Z$N9#1d!!ae"!#QU(a-T%$qU(`e"#LN"Z4!raS83,XJD-J!
k33ST%$r')3BU+-D&P5%'+LM'KHd!!5N"Z$NU!EJk+L%'Y,DdYLLX(J8T%$r)(#j
"#LN32mB!P3!k!$`U+DSI!bcA'K*"#LS32mD&%$V)2#S"Z$SG'5`DDa3,!#S"ZFI
!!!!8)3dV%#$'33SV%$r'KCA"!Ir`)3dU%#$'!*88#bV(+FI!!!!@33SV+VN32mC
"#LX32mD&PF%"rqj"$L%0%#$Y&JF!XN%1%[rrl4%$X-K84"S0!,*"$K85l4%#X-K
8'`G!%e!5!94"$%%+%$rY&JIXhJ!#"L%"L!!6"BGTEMiJ!!!JGQpXG@eP)'j[G#"
QEh9ZC!!JEQpd)'C[G@jN!*!$-!ENk`3`#$%')3BJ#!'r!ELh"N%#!qdA"5%'+2!
65"!Eb4SR40FD$)3$%"$Y&`8"14XB!,*"$%!5&3EY%3L`b6NT'JH%$!RY&`AY&`B
Teai&5"!Eb"a$5"!Eb9!33""8l!!#"L)"jJ!T"CP[GA3q)!!JGQpXG@eP)'j[G#"
QEh9ZC!!JEhCPFRGbDA4P2b!!!%9%593!!&4&@&3!!#"MB@jZEh3JBh*PBA4P)3!
JBf&ZEQpd)'p`C@iK!!"L"a2V"6!)-3BK"L!)!Em"Z,F'K")%l4F&)3BSm"0%eaS
-K"83%1dA"3%j'i4)%"[*'RX!XN%-3")9"qd4#,$*15RA'MH%(J[Y&`89#1d!!dJ
3Ap)3@FJH#%J3Ap)36XJF&NMY!!&)%&r5%%l)'JZb4qd4%,!k%"YB'c1b33a!%S3
PK#MY%3H`!-Nj+4S*K#X1l4F&'aLb33a!%K8(l4%)X!$*15ND"i3c$1dA"HdA"LR
A(J9)%"[)(+C)%"[*8"&!%96XhJ!#"L-#U!!+"h6V!8!3'JZb4Zd4%,!f!&!3l0i
!!JBN!VS!#JGpk`&!%4S,XNIY%4#`0J"3%HcH!!)'*3,-!"i(KZX&-3C!%"SU343
a#5%*!(!K#3&a!,*'3438#1d4#E$)9#%'+!LrF%6A'J8K"J"`'`JK"Zd!!`&8l0i
!!JBT!`B!&3A"BA4dC@e`)(4[)(*PB@3JB5"A6e*%)'CbEfdJG'KP)'YPH@*[BA*
N!!!D"k2V"$%'3"!D)d%@-3JK#!"`)3J#F8!B(`d!XNC"&L%'l4%*X-K84&!B'`H
%1K!Qm"RXhJ!#"LB$1!"4"lcV"M!)-3B!15%'Y,DdYLJk3"!D,K3,p5X3)+`H!d6
A(!`V%##X(`*%'KBT+UXD$#%'+5M'+j8T!EJj&![e(4dE6"3,l3!$+a!JV"i&+a!
Eb"`3+a!JV"i%+`M)'M!V#-JD%#N!V"S*+3'j13MY!!%E&5NUUaS3)3BT+-BVP5N
"Z$NVl3!"&![Y!!-G15N!b93T+UXD##%'+5M'!*8V9HcH!!)'032B!!i)$1X#-3B
K"ZQ"#HPS%"r'KA$T&JLJB!'iF1cH!!)'0!2b!!F)'HX!k3"ikB%*%"rfl!!#"LF
$rJ!i#"rV"c%'%"$U-3R`&#%'!("%eaS#l"3,m"8V`J!6!6`8#r!9``!m&![`&F-
!2--!+`!YrrRrm2rerq83-#ZV(`8V%$QV9"!`+kXI"5X31DXD&#%')3CJ#YSV%$$
Cf(!8#r!9(4iX'JJK"L%'B-p`l!!#"MF%E!!1#&EV!M%')3ETJ3RTD"!IaS9`k4B
)S'!"Z($XhJ!#"MB%KJ!(#'2V!1N!H1Q"#4!IpZ`!!JBS"*)!)`KTk`Ba"K!3kM%
*m"BK"J"`40FD!Z`8#r!A%$!VUam&+a!jUe33-#ZV(`8V%$QV'K3K"L%'B!Uk+a!
`ZEK`&![`&adHl0i!!JBU"0B!&JL,k`8f3"%D(N%8-3NK#3"`)3N"F5B)[MHb4d%
8&!IY%3U`1"X&*Zd!!HcH!!)'-38!!"3&e@&dG'9YF#"dEb"hFQPdC5"K)&G28N3
JG'mJG'KP)&0MFQ9PEJ#3!a8)S1X%0N!4'KT"&M%))3J!F#%)!R'b4d%@&!EY%3U
`0aX(K%i3)r!Cl0i!!JBV"5J!"!Ldk`!0qZcH!!)',!8Z!"d)YqX&-!Ja"L%')!J
"[`'iY`B!15%'Y,DdYLJk+5UV(`NK"LNSaS8!V"S1)3BT+-D&qLN"Z$NG'qcH!!)
',39Q!#d)dqX'0cB%kM%+!$JQcXFj)3SS"XBT#V`3-,L9+3Ul15J"Z$JT!-JF'#B
!bKS0)3SS"XB3,C8S!EJi*bLX'JSR!ENh%#$k(3dS!ENi)3SS"XD&qLJ!b"`2l0i
!!JBZ"Ei!)JMrk`8h0JIU-3N!1#%*+!E'*JUmPLB+ZcBS!EJi*J$)("8R++`D#LF
"Z6F3)2SG$5J"Z6JK#5J'aSB3-,Mk+!$)(",X!!)',`B!!#8*)1X&0cB'kM%*&!J
(*mI!!!!*%#$k`3(rqa3)!!A!!!!6)3NS"FBQ"p+@*J1r0X%"rr%8#!8!`!%!%#%
*+!A'KK!`Z2V"rrrdl!!#"MJ'5!!2#86V!6BQ$p)f*JUU'JJQ%$#i0KX'*K!hZ$B
QqZcH!!)'-!CN!"8*8ZX$0cB8#!8Ram!!!!N3)2V"!Irl*Jbrm"JQ#,r`'#B%[r!
B*[!Bl0i!!JBb"S`!"`PQk`"!%GFD"3cY!!(X!!)'13DB!!X&k%PZ6h9d,5"'394
"6#"&8P*28MS!!"3*E1X$-!Ja"L%')!J"[`'iY`EY&`D%B4!5l4F&)3BSl4F&l4F
'#X6X!!)')!Dq!"J&mN0KEQj[G#"bC@&N)'4PCQ&eE(3JGQpXG@eP)'jeE@*PFL"
fD@%J4f9d9QpX)3!!+`Prk`!9!C3D!Z`9'D"4#KBJS&%-&S#J83i@J+"4&"B#S&%
@&J*4!ZdA!1d!!1d"!1d#!1d4!1d@!!"3%!"3%3"8!,*"$K86l4%#X-ND"i4V%#c
`'HcH!!2r&JQT#F!!$!QeU9-!*6(%8h4bD@jRF`#3#J3*UJ#3"`)*`3!8!")*bZX
$%)#h"K3)!5%'!)A(`!!!%#%'+"$raSAY!!("!Irdl0i!!JR#!$B!)JREk`B3J,F
)-3Db)3J!K4$r)3B!KERjX$X8#J%Vam!!!"NK"L%'!)8UZ"$raL%)+K$raS@9`3(
rkb%'!#%'!)8VZ*AX!!)*b3"i!!S*r1X#0cBQ*kSD"5EX'`-Rl!R%hJ!##F-!LJ!
D#JAV"$!)-3BK"L!)!Em"Z,F'!$NT)3DdYV5f++XI#5%'+5M'K3$*'JFT!EJj(4S
Tl!R%hJ!##F3![!!d#KlV#6!,-3NK#5!,!Em"Z,F*-!Ja"V)K"LMcX$iK"V5fY,B
S!EJZZ6d!2#`YUKm8,#%*Y,DdYLZV(`NK#5`VaS8!b4S9)3BZ,,JSaL%*,#['KC8
X!EJm(5dX,DSD#L%',Lbi+-B!PH`!!JR&!5)!&3T4k`83J,F)-3B8#J!K#!#&am!
!!"3K"LS3rmBK##S3rmD&PF%"rr$XhJ!##FB"5J!X#QAV#$!,-3NK#5!,!Em"Z,F
*-!Ja"V)K"V5fY,BS!ELb)3NVml$jX!(C243-!#h!!!!5)3BX+-BK#5`VaS@9`3(
rmL%'Y,DdYLJYc"S+)3BY!GJSaJ#9l!!##FF"S!!Q#T!!k`B`#M%))3JJ#J'r!EL
h#$%'!$XV%2qU(a3V)3LdYV5f+UXI#5%)+bV'K3$*'KBK"LX"Z"$raL%)+bV'KC8
V!EJl(5mK"J!VPH`!!JR)!HS!*3Uek`B3J,F*-!Ja"J!l+b%'Y,DdYLLV(`FV)3N
!KDSD&L%'+bM')3NV!EJ3rmD&P5X"Z$XG*bXK"V5fY,BSUaS))3BV+-B!PHcH!!)
*`!)b!!`+fHX!&3'8'J,X&344!Zd"!1d!!1d#!1`!!rmA#Z3,!!!-#[@TIJ"[8N4
8CA*YD@jKE!#3#33+j3#3"`),!3!8!!i,#ZX#-3C%'JNK"N9`!&3E#L%'l3!$)3C
J9HcH!!),!J!Z!"%,&qX#-3C%'JNK"N9`!&3E%5%'l3!%)3CJ!-ND"5%'B&AX!!)
,!`"1!!3,*qX!!96XhJ!##`3!9!!&#bVV!6BQl3!"l!!##`8!A!!G#blV"6!)-3B
K"L!)!Em"Z,F'!$NK"V5fY,BS1LNUUam*)3BT+-D&!+`D$L%'+5M'KI3T!EJj(4[
XhJ!##`B!P!!%#dVV!!hdl0i!!JX(!*S!"!Y0k`!-p1cH!!),#!#J!!3,81X!"r6
XhJ!##`N!TJ!$#e2Y!!MX!!),!!#U!!i,9HX!&3'8'J,X&3C4!Zd!!1d"!1d#!!"
8!&AX!!ErmJYL!!!,E`*8#hB!N!3J03!!!: