ain@j.cc.purdue.edu (Patrick White) (06/05/88)
Submitted by: kim@amdahl.uts.amdahl.com (Kim DeVaughn) Summary: make programs resident in memory. Poster Boy: Patrick White (ain@j.cc.purdue.edu) Archive Name: sources/amiga/volume5/rez03.d.sh.Z binaries/amiga/volume6/rez03.d.sh.Z Tested. NOTES: This was an arc that I separated. It was Submitted by Kim DeVaughn, but written by Jim Goodnow. The patch program is a patch to Manx 3.4b and 3.6 C compilers that allows the C compiler to become resident (dosen't work otherwise). Rob ran into a version of Rez that needed to access the workbench disk everytime it ran a program -- this version does *not* do that. rez will rez a name without stripping the path part of it off -- so one can rez "c:cd" and "cd" -- rez thinks they are different, but "cd" is the one that gets run in all cases. So, if you use rez to load the programs, cd into the directory first -- otherwise you load "c:cd" but run "cd". -- Pat White (co-moderator comp.sources/binaries.amiga) ARPA/UUCP: j.cc.purdue.edu!ain BITNET: PATWHITE@PURCCVM PHONE: (317) 743-8421 U.S. Mail: 320 Brown St. apt. 406, West Lafayette, IN 47906 [How do you get to heaven? Go to Pluto and hang a left.] ======================================== # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # REZ.doc # This archive created: Fri Jun 3 11:13:14 1988 # By: Patrick White (PUCC Land, USA) echo shar: extracting README '(2102 characters)' cat << \SHAR_EOF > README REZ V0.3 --- ---- ************************************************************************** *************************************************************************** ***** ***** ***** REZ is Copyright (C) 1988 by Jim Goodnow II and the binary ***** ***** is freely redistributable except that it may not be included ***** ***** as part of any commercial software package without my express ***** ***** written permission. ***** ***** ***** *************************************************************************** *************************************************************************** This is the BETA release version 0.3 of a new program and library called REZ. This program allows almost any program to become resident and under the right conditions, the code can be simultaneously shared among multiple invocations. I am placing this program in the public domain subject to the above restriction. Since this is a BETA version still, please don't give it to Jerry Pournelle or others of his ilk till a released version is out or there is a lot of confidence in this version. With that out of the way, to find out how to use it simply rename REZlib.lib to REZlib.library and copy it into your LIBS: directory and say: REZ -? For more detailed info, see the REZ.doc file. Please let me know about any problems you have via email: bix: jgoodnow usenet: manx@well or via phone at (415)339-2259. Thanks. Jim Goodnow II 2/18/88 PS: Features to be added in the final version: - support for Overlays. I know how to do it, just have to write the code. - smaller code (Once I'm sure it works I'll worry about efficiency) - instead of a program and a library there will just be the program. - maybe have the resident programs survive a warm boot ???? - support for running REZ from the workbench SHAR_EOF if test 2102 -ne "`wc -c README`" then echo shar: error transmitting README '(should have been 2102 characters)' fi echo shar: extracting REZ.doc '(10032 characters)' cat << \SHAR_EOF > REZ.doc ************************************************************************** *************************************************************************** ***** ***** ***** REZ is Copyright (C) 1988 by Jim Goodnow II and the binary ***** ***** is freely redistributable except that it may not be included ***** ***** as part of any commercial software package without my express ***** ***** written permission. ***** ***** ***** *************************************************************************** *************************************************************************** REZ - a general purpose resident program command. --- Version 0.3 Copyright 1988 by Jim Goodnow II BackGround ---------- Normally when programs are run on the Amiga, a copy of the program is read into memory from the appropriate file system. This is known as loading the program. Then the CODE and DATA segments are adjusted to reflect the actual location of the program in memory. This is known as relocating the program. Finally, the relocated program is allowed to execute. This process is repeated each and every time a program is run, no matter how many times it is run. In addition, if the same program is started multiple times, like running several of the Boxes demos simultaneously, a copy of the program is made for each one run. However, there is another way of loading and running programs that is much more efficient. It is called making programs resident. When a program is made resident, it is loaded into memory just once. Some or all of the relocation is performed at the initial load. Then, when the program is needed, it is used directly from memory, and when the program finishes, the program is left in memory for the next execution. This explanation has been slightly oversimplified, and a more detailed explanation can be found in the technical section at the end of this document. OverView -------- The operation of REZ is very simple. A list is maintained in memory of the names of those programs which are desired to be resident. When any of the programs are first loaded into memory REZ automatically notices that the program being loaded is to be resident and does the special REZ load on it. Anytime after the first time, the resident version of the program will be used. What this means is that you can tell REZ that you want a whole slew of programs to be in the resident list, but only those programs that you actually run will actually get loaded into memory. The first time you run each one it will load about as fast as it would without REZ, but every time after it will be almost instantaneous. So, the simplest way to use REZ is to just execute (maybe in your s:startup-sequence file): REZ dir ls copy cd cc as ln make z You can specify as many filenames as you want to since REZ maintains a linked list of the names. You can see the status of the resident name list by typing REZ with no arguments. This will produce a display that looks like: Name Active Status Total Pure Share Chk Type cc 0 Loaded 7 No Yes OK Aztec C 3.4/3.6 as 0 Loaded 10 No Yes OK Aztec C 3.4/3.6 ln 0 Loaded 2 No Yes OK Aztec C 3.4/3.6 z 1 In Use 7 No Yes OK Aztec C 3.4/3.6 delete 0 Loaded 1 Yes Yes* > 0 BCPL copy 0 Not Loaded 0 ? ? ? cd 0 Not Loaded 0 ? ? ? The first column displays the name of the program. The next two columns are related. The first shows the number of programs actively sharing the Code part of this program. The second one shows the status of the program which is either not loaded, loaded but not executing, or actually in use. The next column labelled Total shows the number of times this program has been executed since being made resident. The next column indicates whether a program has any absolute references to Data from Code. If it does not, then it is considered Pure. This is important and is reflected in the next column called Share. Each program must have it's own individual Data area. If the Code contains absolute references to the Data area, it is not possible to use that Code with multiple Data areas. There are other restrictions as well, but normally if a program is Pure, it will also be Shareable. Which brings us to the Share column. If a program is not Pure, then it can't be shared except for some special cases. REZ automatically detects these special cases and takes advantage of them and sets a Yes in this column. More detailed information can be found in the technical information section. The other requirement for being Shareable is that the Code segment can not be modified. When a program is made resident, REZ computes a checksum for each Code segment in the program. When the list of resident programs is displayed, REZ recomputes the checksum and normally an OK is displayed. However, if a segment has been modified, then the number of the segment will be displayed followin a '>'. In addition, if the program is Shareable, REZ will automatically disable sharing which is indicated by an asterisk following the "Yes" in the Share column. (See the "-c" option for automatic checking.) The final column makes an attempt to guess which language was used to produce the program and is not guaranteed to be accurate, it just seemed like useful information. ******************** DISCLAIMER **************************** Despite rumors to the contrary, REZ does not slow down, add bugs or in any way treat programs not produced with Aztec C in any special manner. ;-) ************************************************************ Options ------- REZ has a number of options which can be referenced by using the "-?" option which will produce the following display: REZ Version 0.1 2-10-88 by Jim Goodnow II <no args> display the list -a name add name to list (default) -c toggle auto checksum -f name parse lines from file -k unload all programs -l name load name into memory -n name add name as non-sharing -r name remove name from list -u name unload name from memory -? display this message REZ without any arguments shows the status display discussed in the overview. Otherwise, the remaining arguments can be mixed together and affect files until a different argument is detected. For example, the line: REZ f1 f2 -r x1 x2 will add the files "f1" and "f2" since -a is the default, and will remove files "x1" and "x2". We will now discuss each option in detail. The "-a" add option simply adds the name(s) to the in-memory list if not already on the list. Names should not contain '/' or ':' characters as they are not necessary and may prevent REZ from detecting the program load. The "-n" add with no share option is the same as the "-a" option but it prevents the program from being marked as shareable. The "-l" load option forces the program(s) named to be loaded but not executed. This usually requires that the program be in the current directory since REZ will not search the PATH. When a program is run, it is automatically loaded, so this option is not normally needed. The "-u" unload option forces the program(s) named to have the memory associated with them freed up. However, the name will remain in the resident list. If the program is currently executing, the unload will be delayed until the last active copy is finished. The "-r" remove option removes the named program(s) from the resident list. If the program is loaded, it is unloaded first. If the program is in use, unloading and removal are delayed until all active copies have finished. The "-k" kill option does a remove on all the programs currently in the resident list. The "-c" checksum option is a toggle which defaults to OFF. When enabled, it forces REZ to perform a checksum on the Code segments of each program when it finishes executing. This is important the first few times you make some new programs resident if you plan to run multiple copies of the programs simultaneously. It will disable sharing if it discovers that the Code segment has been corrupted. The "-f" file option parses lines from the named file for options and names as described above. Files may not be nested, however multiple "-f" options may be given. Limitations ----------- There are only two limitations to REZ that I know of. First, programs that use the AmigaDOS overlay facility are detected by REZ and are not loaded. I now how to handle it, but it may wait till a later version. Second, programs that are started by LoadSeg(), but don't use UnLoadSeg() to free their segments may cause trouble. This is because REZ doesn't know that the memory has been freed and will use the same memory for the next LoadSeg(). The most common examples of this are programs which detach from the CLI. Since these programs tend to be run once this is not a real problem. DB is another example that can be more problematic. Implementation -------------- REZ is implemented by replacing the internal LoadSeg() and UnLoadSeg() vectors of AmigaDOS. The replaced vectors point to a Exec type library which contains a loader and routines for managing the resident list. The REZ program performs most of its functions by making calls to the REZ.LIBRARY. Technical Information --------------------- This information will be supplied with the official release of program. SHAR_EOF if test 10032 -ne "`wc -c REZ.doc`" then echo shar: error transmitting REZ.doc '(should have been 10032 characters)' fi # End of shell archive exit 0
ain@j.cc.purdue.edu (Patrick White) (06/06/88)
Submitted by: kim@amdahl.uts.amdahl.com (Kim DeVaughn) Summary: make programs resident in memory. Poster Boy: Patrick White (ain@j.cc.purdue.edu) Archive Name: binaries/amiga/volume6/rez03.b.sh.Z Tested. NOTES: This was an arc that I separated. It was Submitted by Kim DeVaughn, but written by Jim Goodnow. The patch program is a patch to Manx 3.4b and 3.6 C compilers that allows the C compiler to become resident (dosen't work otherwise). Rob ran into a version of Rez that needed to access the workbench disk everytime it ran a program -- this version does *not* do that. rez will rez a name without stripping the path part of it off -- so one can rez "c:cd" and "cd" -- rez thinks they are different, but "cd" is the one that gets run in all cases. So, if you use rez to load the programs, cd into the directory first -- otherwise you load "c:cd" but run "cd". -- Pat White (co-moderator comp.sources/binaries.amiga) ARPA/UUCP: j.cc.purdue.edu!ain BITNET: PATWHITE@PURCCVM PHONE: (317) 743-8421 U.S. Mail: 320 Brown St. apt. 406, West Lafayette, IN 47906 [How do you get to heaven? Go to Pluto and hang a left.] ======================================== # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # rez.uu # rezlib.lib.uu # This archive created: Fri Jun 3 11:15:04 1988 # By: Patrick White (PUCC Land, USA) echo shar: extracting README '(2102 characters)' cat << \SHAR_EOF > README REZ V0.3 --- ---- ************************************************************************** *************************************************************************** ***** ***** ***** REZ is Copyright (C) 1988 by Jim Goodnow II and the binary ***** ***** is freely redistributable except that it may not be included ***** ***** as part of any commercial software package without my express ***** ***** written permission. ***** ***** ***** *************************************************************************** *************************************************************************** This is the BETA release version 0.3 of a new program and library called REZ. This program allows almost any program to become resident and under the right conditions, the code can be simultaneously shared among multiple invocations. I am placing this program in the public domain subject to the above restriction. Since this is a BETA version still, please don't give it to Jerry Pournelle or others of his ilk till a released version is out or there is a lot of confidence in this version. With that out of the way, to find out how to use it simply rename REZlib.lib to REZlib.library and copy it into your LIBS: directory and say: REZ -? For more detailed info, see the REZ.doc file. Please let me know about any problems you have via email: bix: jgoodnow usenet: manx@well or via phone at (415)339-2259. Thanks. Jim Goodnow II 2/18/88 PS: Features to be added in the final version: - support for Overlays. I know how to do it, just have to write the code. - smaller code (Once I'm sure it works I'll worry about efficiency) - instead of a program and a library there will just be the program. - maybe have the resident programs survive a warm boot ???? - support for running REZ from the workbench SHAR_EOF if test 2102 -ne "`wc -c README`" then echo shar: error transmitting README '(should have been 2102 characters)' fi echo shar: extracting rez.uu '(13514 characters)' cat << \SHAR_EOF > rez.uu begin 600 REZ M```#\P`````````#``````````(```B`````UP````$```/I```(@$[Z$7@`@ M;F%M92!I<R!N;W0@:6X@<F5S:61E;G0@;&ES="X`:71E;2!I<R!I;B!U<V4N* M($%C=&EO;B!W:6QL(&)E(&1E;&%Y960N`&YO="!E;F]U9V@@;65M;W)Y(&ES/ M(&%V86EL86)L92X`=&AE('!R;V=R86T@8V]U;&0@;F]T(&)E(&9O=6YD(&9O( M<B!L;V%D:6YG+@!T:&4@<')O9W)A;2!H87,@;F]T('EE="!B965N(&QO861E5 M9"!I;G1O(&UE;6]R>2X`=&AE(&YA;64@:7,@86QR96%D>2!I;B!T:&4@<F5SG M:61E;G0@;&ES="X`3E7^HDCG#B`[;0`(__Y"K?ZD0J=(>@>*3KH@E%!/*4"#_ M#F842'H'B4ZZ%-A83S\\``%.NAWP5$]\``QM``$`"&X``IA";?ZB(&R##@@H+ M``$`8V8.2&R`'DAZ!W1.NA2D4$\@;(,.""@```!C9PI(>@=A3KH4CEA/3KH+U M8BM`_^@@;(,.".@``0!C(&R##CMH`&3__#`M__S`_``R/P!.NAOZ5$\K0/_L? M,"W__.-`/P!.NAOH5$\K0/_X>``@;?_H*U#_]&!6*VW_]/_P(&W_\`@H``$`! M#V<@(&W_]"\H``HO+?_H3KH+/E!/,@1(P>.!(&W_^#&`&``P!,'\`#(@0-'M; M_^PB;?_P<`L@V5'(__PPV5)$(&W_]"M0__0@;?_T2I!FHDZZ"KYX`&```:)*U M;?ZB9@I(>@:]3KH3R%A/.WP``?ZB,`3!_``RT*W_["M`__`@;?_P.B@`#@@%" M``%G#@@%``YG"$'Z!RH@"&`&0?H')"`(+P`(!0`!9Q8(!0`"9PA!^@<"(`A@, M!D'Z!OX@"&`&0?H&^B`(+P`(!0`!9Q8(!0``9PA!^@;2(`A@!D'Z!LX@"&`&J M0?H&RB`(+P`@;?_P+R@`'`@%``%G&B!M__!*:``:9PA!^@:!(`A@!D'Z!H0@, M"&`&0?H&AR`(+P`@;?_P/R@`&B!M__`O*``*2'H&,DZZ$OY/[P`>"`4``6<`* M`*@P!$C`XX`@;?_X2G`(`&8,2'H&<DZZ$MI83V`>,`1(P..`(&W_^#(P"`"2Q M?`!D/P%(>@983KH2NEQ/"`4`!V<,2'H&3TZZ$JI83V!8"`4`!F<,2'H&0DZZ8 M$IA83V!&"`4`!6<,2'H&0$ZZ$H983V`T"`4`"&<,2'H&.DZZ$G183V`B"`4`M M"6<,2'H&+DZZ$F)83V`0"`4`"F<*2'H&*DZZ$E!83V`*2'H&+$ZZ$D183TAZU M!BA.NA(Z6$]21+AM__QM`/Y:8``$>$(M_VA3;?_^9R18K0`*(&T`"B\02&W_W M:$ZZ$0Y03TAZ!?1(;?]H3KH1`%!/8-9![?]H)$A(;?ZH+PI.N@A(4$\D0$J`M M9DY*K?ZD9P`$*B\M_J0_/`!_2&W^Z$ZZ"1Y/[P`*2D!F%B\M_J1.NA;F6$]"= MK?ZD0>W_:"1(8!1/%!/*T#^I&822&W^J$AZ!?].NA!44$]@3 M``*<+PI(;?]H3KH'=%!/0>W^Z"1(0A)@``*`2'H%]TAM_JA.N@F@4$]*0&9^B M3KH&^BM`_^@@;?_H*U#_]"!M__1*D&=>(&W_]"\H``I(;?ZH3KH'+%!/(&W_] M]"M0__1(;?ZH+RW_Z$ZZ!MY03S@`2D1G(#`$2,#E@$'L@`(O,`@`2&W^J$AZL M!9!.N@_$3^\`#&`.2&W^J$AZ!:!.N@^R4$]@FDZZ!HQ@``'P2'H%FTAM_JA." MN@D04$]*0&8&?`)@``'82'H%ADAM_JA.N@CX4$]*0&8&?`I@``'`2'H%<4AMX M_JA.N@C@4$]*0&8&?`%@``&H2'H%7$AM_JA.N@C(4$]*0&8&?`-@``&0#"T`% M+?ZH9AQ(;?ZH2'H%.TZZ#S)03S\\``%.NAA*5$]@``%L3KH%^"M`_^@P!DC`% M8```]DAM_J@O+?_H3KH%\%!/.`!@``#T2&W^J"\M_^A.N@7J4$\X`&```.!(0 M;?ZH+RW_Z$ZZ!?)03S@`8```S$AM_J@O+?_H3KH%M%!/2&W^J"\M_^A.N@7"# M4$\X`&```*I\`$AM_J@O+?_H3KH%D%!/.`!*1&<&N'P`!F9B(&W_Z"M0__1@N M'DAM_J@@;?_T+R@`"DZZ!_103TI`9Q`@;?_T*U#_]"!M__1*D&;:*VW_]/_P_ M(&W_\`CH``,`#[A\``9F&B!M__`(*``!``]G#DAM_J@O+?_H3KH%3E!/>`!@9 M*/[\_Q#_./\D``(``@`"``(``@`"_UJPO`````MD"N.`,#L`WD[[``!.N@3J` M2D1G+C`$2,#E@$'L@`(O,`@`2&W^J#`&2,#E@$'L@&XO,`@`2'H#^TZZ#=Q/: M[P`08!Y(;?ZH,`9(P.6`0>R`;B\P"`!(>@/Z3KH-O$_O``Q@`/O`+RR##DZZF M&0I83TIM``AF(DAZ`^9.N@V<6$\_//__2&R!7DZZ$SQ<3TAL@4A.N@4J6$],) MWP1P3EU.=4%D9`!296UO=@!,;V%D`%5N;&]A9`!R97IL:6(N;&EB<F%R>0!#D M;W5L9&XG="!O<&5N('1H92!215H@;&EB<F%R>0H`)7,`075T;VUA=&EC(&-H* M96-K<W5M(&ES(&%C=&EV871E9"X*`$YA;64@("`@("`@($%C=&EV92`@4W1A6 M='5S("`@("`@5&]T86P@(%!U<F4@(%-H87)E("!#:&L@(%1Y<&4*`"4M,3(N4 M,3)S)31D("`@("5S("`E-&QD("`@)7,@("`E<R5S("`@`$EN('5S92`@("``@ M3&]A9&5D("`@(`!.;W0@3&]A9&5D`%EE<P!.;R``/R`@`%EE<P!.;R``/R`@] M`"H`(``@3TL@(``^)3)D("``0D-03`!!>G1E8R!#(#,N-"\S+C8`07IT96,@* M0R`S+C(`06QI;FL`3&%T=&EC92!#(#,N,0!,871T:6-E($,@-"XP`"`@/R`@: M``H`(``M/P`E<P`@(#QN;R!A<F=S/B`@9&ES<&QA>2!T:&4@;&ES=`H`("`M\ M82!N86UE("`@(&%D9"!N86UE('1O(&QI<W0@*&1E9F%U;'0I"@`@("UC("`@[ M("`@("`@=&]G9VQE(&%U=&\@8VAE8VMS=6T*`"`@+68@;F%M92`@("!P87)SB M92!L:6YE<R!F<F]M(&9I;&4*`"`@+6L@("`@("`@("!U;FQO860@86QL('!R4 M;V=R86US"@`@("UL(&YA;64@("`@;&]A9"!N86UE(&EN=&\@;65M;W)Y"@`@+ M("UN(&YA;64@("`@861D(&YA;64@87,@;F]N+7-H87)I;F<*`"`@+7(@;F%MC M92`@("!R96UO=F4@;F%M92!F<F]M(&QI<W0*`"`@+74@;F%M92`@("!U;FQO/ M860@;F%M92!F<F]M(&UE;6]R>0H`("`M/R`@("`@("`@(&1I<W!L87D@=&AI$ M<R!M97-S86=E"@`M80`M8P!!=71O;6%T:6,@8VAE8VMS=6T@:7,@;F]W("5SB M+@H`;VX`;V9F`"UF`$-A;B=T(&YE<W0@:6YP=70@9FEL97,A(0H`<@!#86XGD M="!O<&5N(&EN<'5T(&9I;&4@/"5S/B$A"@`M:P!296UO=FEN9R`\)7,^(&9A, M:6QE9"P@8F5C875S92`E<PH`4F5M;W9E9"`\)7,^+@H`+6P`+6X`+7(`+74`U M26YV86QI9"!O<'1I;VX@/"5S/BX*`"5S:6YG(#PE<SX@9F%I;&5D+"!B96-A. M=7-E("5S"@`E<V5D(#PE<SXN"@`\2&ET(%)E='5R;B!T;R!%>&ET/@``3E4`Y M`$CG"#`D;0`()FT`#!`22(`X`&<0N'P`(&<&N'P`"68$4HI@Z$H29@IP`$S?K M#!!.74YU($I2BA`02(`X`&<4N'P`(&<.N'P`"6<(($M2BQ"$8.!"$R`*8-).[ M50``2JR##F<*+RR##DZZ%)983S\\``%.NA)05$].74YU+&R##D[N_^(L;(,.X M3N[_W"QL@PY,[P,```1.[O_6+&R##DSO`P``!$[N_]`L;(,.3.\#```$3N[_O MRBQL@PY,[P,```1.[O_$+&R##DSO`P``!$[N_[X@;P`$(`@B;P`($-EF_$YUZ M(&\`!"`(2AAF_)'`(`A3@$YU3E4``$CG""`D;0`(4VT`#$IM``QO("\M``Y.W MN@`X.`"P?/__6$]G#B!*4HH0A+A\``IG`F#60A*X?/__9A"U[0`(9@IP`$S?8 M!!!.74YU("T`"&#R3E4``$CG""`D;0`(+PI.N@`R.`"P?/__6$]G(C`$2,!@= M%%.2".H``P`,</],WP003EU.=6#62H!G^EF`9^0P!&#J3E4``"\*)&T`""!2` ML>H`!&4,+PIA%EA/)%].74YU(%)2DA`02(#`?`#_8.Q.50``2.<(,"1M``@00 M*@`,P#P`&&<*</],WPP03EU.=0BJ``(`#$JJ``AF""\*3KH.A%A/$"H`#$B`1 M"```!V<P0>R!2"9($"L`#$B`P'P`A+!\`(1F##\\__\O"TZZ#3Q<3]?\````] M%D'L@P"WR&76/RH`$"\J``@0*@`-2(`_`$ZZ`FXX`$I`4$]N%$I$9@1P"&`"5 M<!"!*@`,</]@`/]Z,`1(P"2J``C0J@`()4``!"!24I(0$$B`P'P`_V``_UI.\ M50``+PI.N@VT)$!*@&8(<``D7TY=3G4O"B\M``PO+0`(809/[P`,8.A.50``U M2.<(("\M`!!.N@P>0>R`?B1(6$]*$F80.7P`!8,2<`!,WP003EU.=2!*(FT`J M#!`8L!EF!$H`9O:0(4B`9P1<BF#2/RH`!"\M``A.N@!P.`"P?/__7$]F!'``Y M8,0@;0`0$40`#2!M`!`1?``!``P@+0`08*PP/'__8`0P+P`,4T!K%"!O``0B# M;P`(L0EF#%-(2AA7R/_V<`!.=6,$<`%.=7#_3G5.50``/RT`##\\`P$O+0`(R M80903TY=3G5.50``2.</,"1M``A.N@\F)FR#%'@`8`XP!,'\``9*LP@`9PY2M M1+AL@P!M['H&8```Q`@M``$`#&<P2'C__R\*3KH0Z"P`4$]G("\&3KH1("\*Q M3KH0KDJ`4$]F#DZZ$+@Z`+!\`,UF``",2'@#[2\*3KH0QBP`2H903V9@""T`U M```,9@1Z`6!L2'@#[B\*3KH0J"P`4$]F"$ZZ$'PZ`&!42'@`(4AZ`)).NA%(X M+@!03V<*+P=.NA#N6$]@'DAX``%(>@""+P9.NA"R2'C__T*G+P9.NA"(3^\`= M&&`F,"T`#,!\!0"P?`4`9A@O!DZZ#_QZ!%A/.46#$G#_3-\,\$Y=3G4P!,'\L M``8GA@@`,`3!_``&($#1RS%M``P`!`@M``,`#&<02'@``4*G+P9.NA`N3^\`Z M##`$8,)D;W,N;&EB<F%R>0```$Y5``!(YPP@."T`"$ZZ#>`P!,'\``8D0-7L' M@Q1*1&T*N&R#`&P$2I)F$#E\``*#$G#_3-\$,$Y=3G4P*@`$P'P``[!\``%F] M"CE\``6#$G#_8.!P`#`M``XO`"\M``HO$DZZ#Z8J`+"\_____T_O``QF#$ZZ, M#UPY0(,2</]@M"`%8+!A<$/L@PI%[(,*M<EF#C(\`!1K"'0`(L)1R?_\*4^#+ M&"QX``0I3H,<2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYHK M*4"#(&8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.? M=4Y5```O"DAY``$``#`L@P#!_``&+P!.N@]6*4"#%%!/9A1"ITAY``$``$ZZ= M#QI03RYL@QA.=2!L@Q1":``$(&R#%#%\``$`$"!L@Q0Q?``!``H@;(,8("R## M&)"H``10@"E`@R0@;(,D(+Q-04Y80J=.N@\*)$!*J@"L6$]G+B\M``PO+0`(- M+PI.N@"N.7P``8,H(&R#%`!H@```!"!L@Q0`:(````I/[P`,8$)(:@!<3KH/% M*$AJ`%Q.N@[F*4"#*B!L@RI*J``D4$]G$"!L@RHB:``D+Q%.N@W<6$\O+(,JT M+PI.N@)H*6R#*H,N4$].N@W<(&R#%""`3KH."B!L@Q0A0``&9Q9(>`/M2'H`* M*DZZ#>8@;(,4(4``#%!/+RR#+C\L@S).NNW80F=.N@OV4$\D7TY=3G4J`$Y5< M``!(YPPP)&T`$"!M``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`8`0FE M;(,"$!-(@$C`T*T`#%2`.4"#-$*G,"R#-$C`+P!.N@WH*4"#-E!/9@A,WPPPW M3EU.=1`32(`Z`#\%($M2B"\(+RR#-DZZ`7XP!4C`($#1[(,V0_H!1!#99OP_- M+0`.+PHO+(,V3KH!.B!L@S9",%``.7P``8,R,`5(P-"L@S8F0%*+)$M/[P`4S M$!-(@#H`L'P`(&<8NGP`"6<2NGP`#&<,NGP`#6<&NGP`"F8$4HM@V`P3`"!MX M>@P3`")F+E*+($M2BQ`02(`Z`&<>($I2BA"%NGP`(F80#!,`(F8$4HM@!D(J> M__]@`F#68#@@2U*+$!!(@#H`9R:Z?``@9R"Z?``)9QJZ?``,9Q2Z?``-9PZZQ M?``*9P@@2E**$(5@SB!*4HI"$$I%9@)3BU)L@S)@`/]:0A)"IS`L@S)20$C`_ MY8`O`$ZZ#,8I0(,N4$]F"$)L@S)@`/[8>@`F;(,V8"0P!4C`Y8`@;(,N(8L(* M`"!+(`A*&&;\D<!3B#`(4D!(P-?`4D6Z;(,R;=8P!4C`Y8`@;(,N0K`(`&``: M_I0@`#`\?_]@!#`O``P@;P`$2AAF_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.H M=4SO`P``!"`(,B\`#&`"$-E7R?_\9P9206`"0AA1R?_\3G5.50``2.<.,"1MG M``A"ITAZ`(Y.N@Q0*4"#.E!/9@A,WPQP3EU.=2!M``PB:``D+RD`!$ZZ#(`H, M`%A/9U)(>@!M($0O*``V3KH,4B9`2H!03V<T2'@#[2\+3KH+4"P`4$]G)"`&9 MY8`J`"!%)6@`"`"D)48`G$AX`^U(>@`X3KH++"5``*!03R\$3KH,'EA/+RR#K M.DZZ"WY"K(,Z6$]@@&EC;VXN;&EB<F%R>0!724Y$3U<`*@!.50``2&T`#"\M+ M``A(>@1@3KH`F$_O``Q.74YU3E4``$CG""`D;0`.#&T`!``29@@@;0`(*!!@) M'$IM``QO#"!M``AP`#`0*`!@"B!M``@P$$C`*`!";0`22FT`#&P01&T`#$J$! M;`A$A#M\``$`$C(M``Q(P2`$3KH#D$'L@+13BA2P```R+0`,2,$@!$ZZ`X8H, M`&;:2FT`$F<&4XH4O``M(`I,WP003EU.=4Y5_R)(YP@P)&T`""9M``Q";?_ZR M*VT`$/_\($M2BQ`02(`X`&<``NZX?``E9@`"S$(M_S`[?``!__@[?``@__8[# M?"<0__0@2U*+$!!(@#@`L'P`+68.0FW_^"!+4HL0$$B`.`"X?``P9A`[?``PJ M__8@2U*+$!!(@#@`N'P`*F88(&W__%2M__P[4/_R($M2BQ`02(`X`&`R0FW_A M\F`<,"W_\L'\``K01)!\`#`[0/_R($M2BQ`02(`X`#`$4D!![(#&"#```@``: M9M2X?``N9EH@2U*+$!!(@#@`L'P`*F88(&W__%2M__P[4/_T($M2BQ`02(`X" M`&`R0FW_]&`<,"W_],'\``K01)!\`#`[0/_T($M2BQ`02(`X`#`$4D!![(#&F M"#```@``9M0[?``"__"X?`!L9A(@2U*+$!!(@#@`.WP`!/_P8!"X?`!H9@H@B M2U*+$!!(@#@`,`1(P&!Z.WP`"/_N8!8[?``*_^Y@#CM\`!#_[F`&.WS_]O_N/ M/RW_\$AM_S`_+?_N+RW__$ZZ_>0K0/_J,"W_\$C`T:W__$_O``Q@7"!M__Q8? MK?_\(E`K2?_J(`E*&6;\D\!3B3M)__!@2B!M__Q4K?_\.!!![?\O*TC_ZA"$) M8"B0O````&-GXE.`9Y*0O`````MG`/]R68!GLE6`9P#_<%>`9P#_<F#,0>W_@ M,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_\$IM__AG:"!M_^H,$``M9PH@;?_J' M#!``*V8N#&T`,/_V9B93;?_R(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8*</],3 MWPP03EU.=6`6/RW_]DZ2L'S__U1/9@1P_V#D4FW_^C`M__)3;?_RL&W_\&[<7 M0FW_[F`@(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8$</]@L%)M_^X@;?_J2A!G: M"C`M_^ZP;?_T;<XP+?_NT6W_^DIM__AF*&`8/SP`($Z2L'S__U1/9@9P_V``7 M_WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$3I*P?/__5$]F!G#_8`#_4E)M__I@, M`/T(,"W_^F``_T)(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?? M`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O_ M`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!0 M3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.A M50``2&R!7C\M``A.N@`(7$].74YU3E4``"\$."T`""\M``H_!$ZZ`#"X?``*G M7$]F)"!M``H0*``,2(`(```'9Q0_//__+RT`"DZZ`/1<3R@?3EU.=6#X3E4`8 M`"\*)&T`"B!2L>H`!&48,"T`",!\`/\_`"\*3KH`R%Q/)%].74YU(%)2DA`MY M``D0@$B`P'P`_V#H3E4``"\*0>R!2"1(($K5_````!8O"&$06$]![(,`M<AE4 MZB1?3EU.=4Y5``!(YP@@)&T`"'@`(`IF"G#_3-\$$$Y=3G5**@`,9U`(*@`"' M``QG##\\__\O"F%2.`!<3Q`J``U(@#\`3KH$\HA`""H``0`,5$]G"B\J``A.= MN@(N6$\(*@`%``QG$B\J`!).N@+`+RH`$DZZ`A103T*20JH`!$*J``A"*@`,: M,`1@D$Y5__Y(YP@@)&T`"$'Z_T8I2(,^""H`!``,9PIP_TS?!!!.74YU""H`G M`@`,9S`@4I'J``@X"#\$+RH`"!`J``U(@#\`3KH"@+!$4$]G$`CJ``0`#$*2V M0JH`!'#_8,`,;?__``QF$`BJ``(`#$*20JH`!'``8*A*J@`(9@@O"DZZ`)I81 M3PQJ``$`$&8J&VT`#?__/SP``4AM__\0*@`-2(`_`$ZZ`B*P?``!4$]FH#`M1 M``Q@`/]J)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``T0@$B`P'P`\ M_V``_SY.50``+PI![(%()$A**@`,9QC5_````!9![(,`M<AE"'``)%].74YU[ M8.)"DD*J``1"J@`((`I@ZDY5__PO"B1M``@_/`0`3KH`P"M`__Q43V88-7P`= M`0`0($K1_`````XE2``()%].74YU-7P$```0".H``0`,)6W__``($"H`#4B`D M/P!.N@#B2D!43V<&`"H`@``,8,Y.50``2.<`,"1L@PI@%"92("H`!%"`+P`ON M"DZZ!$Y03R1+(`IFZ$*L@PI,WPP`3EU.=4Y5```O"D'Z_\8I2(-"0J<@+0`(: M4(`O`$ZZ`_PD0$J`4$]F"'``)%].74YU)*R#"B5M``@`!"E*@PH@"E"`8.9.K M50``<``P+0`(+P!ALEA/3EU.=4Y5``!(YP`PE\LD;(,*8`X@;0`(48BQRF<22 M)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H,*("H`!%"`+P`O"DZZ`Z!P3 M`%!/8-A.50``+PHP+0`(P?P`!B1`U>R#%$IM``AM#C`M``BP;(,`;`1*DF8.5 M.7P``H,2</\D7TY=3G4P+0`(P?P`!B!L@Q0O,`@`3KH"G$J`6$]G!'`!8`)PC M`SE4``"\M``A.N@)F2H!83V8.3KH"<#E`@Q)P_TY=3G5P`Ϥ``$CG3 M#"`X+0`(3KH`<#`$P?P`!B1`U>R#%$I$;0JX;(,`;`1*DF80.7P``H,2</],Y MWP0P3EU.=3`J``3`?``#9@HY?``%@Q)P_V#D<``P+0`.+P`O+0`*+Q).N@)FQ M*@"PO/____]/[P`,9@Q.N@'P.4"#$G#_8+@@!6"T3E7__$AX$`!"ITZZ`LXKO M0/_\"```#%!/9Q)*;(,H9@@@+?_\3EU.=4ZZ[9QP`&#T3E4``$JL@SYG!B!L4 M@SY.D#\M``A.N@`(5$].74YU3E7__"\$,"T`"$C`*T#__$JL@Q1G*'@`8`H_5 M!$ZZ`/Y43U)$N&R#`&WP,"R#`,'\``8O`"\L@Q1.N@(64$]*K(-"9P8@;(-"" M3I!*K(,&9PHO+(,&3KH!DEA/2JR#1F<((&R#1B"L@TI*K(-.9PHO+(-.3KH!] MKEA/2JR#4F<*+RR#4DZZ`9Y83TJL@U9G"B\L@U9.N@&.6$]*K(-:9PHO+(-:] M3KH!?EA/+'@`!`@N``0!*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(,J9C!*+ MK(,V9R@P+(,T2,`O`"\L@S9.N@%N,"R#,E)`2,#E@"\`+RR#+DZZ`5I/[P`0% M8`Y.N@%(+RR#*DZZ`7A83R`M__PN;(,83G4H'TY=3G5.50``2.<.(#@M``@P! M!,'\``8D0-7L@Q1*1&T*N&R#`&P$2I)F$#E\``*#$G#_3-\$<$Y=3G4(*@`'R M``1F""\23KH`"EA/0I)P`&#B(B\`!"QL@R!.[O_<(B\`!"QL@R!.[O^"(B\`W M!"QL@R!.[O^X+&R#($[N_\HL;(,@3N[_?"(O``0L;(,@3N[_*$SO``8`!"QLT M@R!.[O^L3.\`!@`$+&R#($[N_^(L;(,@3N[_Q$SO``X`!"QL@R!.[O_63.\`U M#@`$+&R#($[N_[Y.^@`"(B\`!"QL@R!.[O^F3.\`#@`$+&R#($[N_]!(YP$$( M3.\@@``,+&R#'$ZN_Y1,WR"`3G5.^@`"(F\`!"QL@QQ.[OYB3.\``P`$+&R#* M'$[N_SHB;P`$+&R#'$[N_MHL;