dillon@CORY.BERKELEY.EDU (Matt Dillon) (01/20/88)
Here is a neat little example I put together which demonstrates how simple it is to use the timer.device ... It also provides a contrast to other examples in that it uses GetMsg() and related calls to handle the IO as well as specific IO calls like WaitIO() etc... -Matt #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # ioexample.c # ioexample.uue # This archive created: Wed Jan 20 00:00:54 1988 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'ioexample.c'" '(5621 characters)' if test -f 'ioexample.c' then echo shar: "will not over-write existing file 'ioexample.c'" else cat << \!Funky!Stuff! > 'ioexample.c' /* * IOEXAMPLE.C * * Example use of the timer device... using GetMsg() to handle returned * IO requests. AZTEC COMPILATION. Should work with Lattice with * slight modifications. 32 BIT INTEGERS!!!!!! (+L for Aztec). I * probably missed some #include's as well... * * First "run ioexample on", then send timeout requests to the running * program.. example "ioexample 2000" for a 2 second delay. A public * message port is used to communicate to the master. * * ioexample off or sending a CTRL-C (BREAK) to the master will turn * it off. * * run ioexample on * ioexample 8000 * ioexample 2000 * ioexample 8000 * ioexample 3000 * ioexample 10000 * * (wait for the messages to display at the appropriate time) * * ioexample off (aborts any remaining requests and kills it) */ #include <exec/types.h> #include <exec/memory.h> #include <exec/exec.h> #include <devices/timer.h> typedef struct MinList MINLIST; typedef struct MinNode MINNODE; typedef struct MsgPort PORT; typedef struct { struct IORequest tr_node; /* standard timerequest */ struct timeval tr_time; /* standard timerequest */ MINNODE node; /* for our own tracking */ } IOT; extern APTR GetMsg(); extern APTR AllocMem(); extern APTR RemHead(); extern PORT *FindPort(); extern PORT *CreatePort(); #define NTOBASE(ptr) (IOT *)((char *)ptr-(sizeof(IOT)-sizeof(MINNODE))) extern int Enable_Abort; main(ac,av) char *av[]; { Enable_Abort = 0; /* disable break */ if (ac != 2) { puts("run ioexample on"); puts("ioexample <timeout mS>"); puts("ioexample off"); av[1] = "off"; } if (strcmp(av[1], "on") == 0) { /* run server */ if (do_on() == 0) puts("Failed"); exit(0); } if (strcmp(av[1], "off") == 0) { /* kill server */ PORT *port; Forbid(); /* FindPort/Signal combo */ if (port = FindPort("IOEXAMPLE")) { Signal(port->mp_SigTask, SIGBREAKF_CTRL_C); puts("IOEXAMPLE Killed"); } else { puts("IOEXAMPLE not currently running"); } Permit(); exit(0); } /* * Queue a timeout event to the server. The server picks it up * immediately. The Forbid() is simply to ensure the server does * not go away between finding the port and sending the message. * The server will fill in the remaining fields of the request. */ { long timeout = atoi(av[1]); IOT *iot = (IOT *)AllocMem(sizeof(IOT), MEMF_PUBLIC|MEMF_CLEAR); PORT *port = NULL; if (iot) { Forbid(); iot->tr_time.tv_secs = timeout / 1000; iot->tr_time.tv_micro= (timeout % 1000) * 1000; if (port = FindPort("IOEXAMPLE")) PutMsg(port, iot); else FreeMem(iot, sizeof(IOT)); Permit(); } if (port == NULL) puts("Unable to post message, IOEXAMPLE not running"); exit(0); } } /* * The SERVER! * * -Accept new requests from the public port * -SendIO() them to the timer device * -Accept the BREAK command (BREAKF_CTRL_C) to exit */ do_on() { register IOT *iot; IOT IOTimer; /* timer request template */ PORT *PubPort; /* the public port */ PORT *IOPort; /* replies from the device */ MINLIST LBase; long pub_mask, io_mask, mask; long reqnumber = 0; NewList(&LBase); IOPort = CreatePort(NULL, 0); /* Assume it works... */ PubPort= CreatePort("IOEXAMPLE", 0); /* * The timer.device is easy... no initialization of the request * is required before the OpenDevice(). Since the node in the * io request itself is used by the device, and we need some way * of aborting pending requests, I added another node to the * structure and we use that to keep track of pending requests. */ if (OpenDevice("timer.device", UNIT_MICROHZ, &IOTimer, 0) == 0) { pub_mask = 1 << PubPort->mp_SigBit; io_mask = 1 << IOPort->mp_SigBit; /* * Loops forever, until broken with a CTRL-C. */ for (;mask = Wait(pub_mask|io_mask|SIGBREAKF_CTRL_C);) { if (mask & SIGBREAKF_CTRL_C) { /* * Abort pending requests. Works even if the request * has come back since WaitIO() will remove it from * the reply port (PubPort). */ while (iot = (IOT *)RemHead(&LBase)) { iot = NTOBASE(iot); /* the actual IOT */ AbortIO(iot); /* Abort it */ WaitIO(iot); /* Wait for it */ printf("ABORTED: %ld\n", iot->tr_node.io_Message.mn_Node.ln_Name); FreeMem(iot, sizeof(IOT)); /* Free it */ } Forbid(); /* Remove the port */ while (iot = (IOT *)GetMsg(PubPort)) FreeMem(iot, sizeof(IOT)); DeletePort(PubPort); PubPort = NULL; Permit(); break; } if (mask & io_mask) { while (iot = (IOT *)GetMsg(IOPort)) { printf("Timeout #%ld\n", iot->tr_node.io_Message.mn_Node.ln_Name); Remove(&iot->node); FreeMem(iot, sizeof(IOT)); } } if (mask & pub_mask) { while (iot = (IOT *)GetMsg(PubPort)) { iot->tr_node.io_Device = IOTimer.tr_node.io_Device; iot->tr_node.io_Unit = IOTimer.tr_node.io_Unit; iot->tr_node.io_Command = TR_ADDREQUEST; iot->tr_node.io_Message.mn_ReplyPort = IOPort; iot->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE; iot->tr_node.io_Message.mn_Node.ln_Name = (char *)reqnumber++; AddTail(&LBase, &iot->node); SendIO(iot); } } } CloseDevice(&IOTimer); } else { puts("Unable to open timer.device"); } if (IOPort) DeletePort(IOPort); if (PubPort) DeletePort(PubPort); puts("exiting"); return(1); } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'ioexample.uue'" '(9512 characters)' if test -f 'ioexample.uue' then echo shar: "will not over-write existing file 'ioexample.uue'" else cat << \!Funky!Stuff! > 'ioexample.uue' begin 644 ioexample M```#\P`````````#``````````(```8/````IP````$```/I```&#T[Z!0I. M5?_T0JR"5@RM`````@`(9RI(>@%N3KH([EA/2'H!=4ZZ".183TAZ`8).N@C: M6$\@;0`,0_H!@B%)``1(>@%^(&T`#"\H``1.N@A\4$]*@&8:3KH!ZDJ`9@I( M>@%C3KH(IEA/0J=.NA-66$](>@%8(&T`#"\H``1.N@A,4$]*@&9(3KH6A$AZ M`4).NA9@6$\K0/_\9QY(>!``(&W__"\H`!!.NA<X4$](>@$J3KH(6%A/8`I( M>@$O3KH(3%A/3KH6O$*G3KH2^%A/(&T`#"\H``1.N@.X6$\K0/_\2'D``0`! M2'@`,$ZZ%?)03RM`__A"K?_T2JW_^&=L3KH6#"!M__@B/````^@@+?_\3KH, M["%``"`@;?_X(CP```/H("W__$ZZ#/XB/````^A.NA/L(4``)$AZ`,].NA6R M6$\K0/_T9Q`O+?_X+RW_]$ZZ%C903V`.2'@`,"\M__A.NA6V4$].NA882JW_ M]&8*2'H`H4ZZ!Y183T*G3KH21%A/3EU.=7)U;B!I;V5X86UP;&4@;VX`:6]E M>&%M<&QE(#QT:6UE;W5T(&U3/@!I;V5X86UP;&4@;V9F`&]F9@!O;@!&86EL M960`;V9F`$E/15A!35!,10!)3T5804U03$4@2VEL;&5D`$E/15A!35!,12!N M;W0@8W5R<F5N=&QY(')U;FYI;F<`24]%6$%-4$Q%`%5N86)L92!T;R!P;W-T M(&UE<W-A9V4L($E/15A!35!,12!N;W0@<G5N;FEN9P``3E7_K"\*0JW_K$AM M_[Q.NA3V6$]"IT*G3KH3F%!/*T#_R$*G2'H!T$ZZ$XA03RM`_\Q"ITAM_]!" MITAZ`<1.NA383^\`$$J`9@`!<"!M_\QP`!`H``]R`>&A*T'_N"!M_\AP`!`H M``]R`>&A*T'_M&```2`(+0`$_[)G>DAM_[Q.NA326$\D0$J`9S*5_````"@O M"DZZ$LY83R\*3KH5'%A/+RH`"DAZ`65.N@<.4$](>``P+PI.NA0>4$]@ODZZ M%`HO+?_,3KH4+EA/)$!*@&<.2'@`,"\*3KH3_%!/8.(O+?_,3KH36%A/0JW_ MS$ZZ%$Y@``"Z("W_L,"M_[1G-B\M_\A.NA/P6$\D0$J`9R8O*@`*2'H!!4ZZ M!J!03TAJ`"A.NA0\6$](>``P+PI.NA.F4$]@RB`M_[#`K?^X9U(O+?_,3KH3 ML%A/)$!*@&=")6W_Y``4)6W_Z``8-7P`"0`<)6W_R``.%7P`!0`(("W_K%*M M_ZPE0``*2&H`*$AM_[Q.NA'L4$\O"DZZ$_A83V"N("W_N("M_[0(P``,+P!. MNA0,6$\K0/^P9@#^R$AM_]!.NA'B6$]@"DAZ`&U.N@4(6$]*K?_(9PHO+?_( M3KH2;EA/2JW_S&<*+RW_S$ZZ$EY83TAZ`%].N@3>6$]P`21?3EU.=4E/15A! M35!,10!T:6UE<BYD979I8V4`04)/4E1%1#H@)6QD"@!4:6UE;W5T(",E;&0* M`%5N86)L92!T;R!O<&5N('1I;65R+F1E=FEC90!E>&ET:6YG``!.50``2.<, M("1M``@,$@`@9P8,$@`)9@12BF#P>@`,$@`M9@9Z`5**8`@,$@`K9@)2BG@` M8"`@2E**$!!(@$C`<@HO`"`$3KH01B0?U(`H`IB\````,!`22(!(P$'L@!4( M,``""`!FSDJ%9P8@!$2`8`(@!$S?!#!.74YU87!#[()21>R"4K7)9@XR/``2 M:PAT`"+"4<G__"E/@EHL>``$*4Z"7DCG@(`(+@`$`2EG$$OZ``A.KO_B8`9" MI_-?3G-#^@`@3J[^:"E`@F)F#"X\``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI M8G)A<GD`2?D``'_^3G5.50``+PI(>0`!```P+().P?P`!B\`3KH11%!/*4"" M9F840J=(>0`!``!.NA`.4$\N;():3G4@;()F0F@`!"!L@F8Q?``!`!`B;()F M,WP``0`*(&R"6B`L@EJ0J``$4(`I0()J(&R":B"\34%.6$*G3KH1"%A/)$!* MJ@"L9S`O+0`,+RT`""\*3KH`M$_O``PI?`````&"5B!L@F8`:(````0@;()F M`&B````*8$1(:@!<3KH1SEA/2&H`7$ZZ$/A83RE`@FX@;()N2J@`)&<0(&R" M;B)H`"0O$4ZZ#NQ83R\L@FXO"DZZ`MI03REL@FZ"<DZZ#NP@;()F((!.N@\, M(&R"9B%```9G%DAX`^U(>@`L3KH.Z%!/(&R"9B%```PO+()R+RR"=DZZ^510 M3T*G3KH-"EA/)%].74YU*@!.50``2.<,,"1M`!`@;0`(("@`K.6`*``@1"`H M`!#E@"9`$!-(@$C`T*T`#%2`*4"">D*G+RR">DZZ#^103RE`@GYF"$S?##!. M74YU$!-(@$C`+P`@2U*(+P@O+()^3KH!6D_O``Q(>@%0$!-(@$C`T*R"?B\` M3KH!OE!/+RT`#"\*+RR"?DZZ`5I/[P`,0JR"=B9L@GXD2Q`32(!(P"H`L+P` M```@9R"ZO`````EG&+J\````#&<0NKP````-9PBZO`````IF!%*+8,P,$P`@ M;0``C`P3`")F,E*+($M2BQ`02(!(P"H`9R`@2E**$(6ZO````")F$`P3`")F M!%*+8`9"*O__8`)@TF!$($M2BQ`02(!(P"H`9S"ZO````"!G*+J\````"6<@ MNKP````,9QBZO`````UG$+J\````"F<(($I2BA"%8,(@2E**0A!*A68"4XM2 MK()V8`#_/$(20J<@+()V4H#E@"\`3KH.L%!/*4""<F8(0JR"=F``_L9Z`"9L M@GY@&B`%Y8`@;()R(8L(`"\+3KH&2EA/4H#7P%*%NJR"=FW@(`7E@"!L@G)" ML`@`8`#^CB``3.\#```$(`@B+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=3`\ M?_]@!#`O``X@;P`$2AAF_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=3`\?_]@ M!#`O``Y30&L4(&\`!")O``BQ"68,4TA*&%?(__9P`$YU8P1P`4YU</].=2!O M``0@"")O``@0V6;\3G5.50``+PHD;0`(2A)G)"!*4HH0$$B`2,`O`$ZZ!9)8 M3["\_____V8(</\D7TY=3G5@V$AX``I.N@5V6$]@[$Y5``!(YPXP)&T`"$*G M2'H`CDZZ#A103RE`@IIF"$S?#'!.74YU(&T`#")H`"0O*0`$3KH.LEA/*`!G M4DAZ`&T@1"\H`#9.N@Z$4$\F0$J`9S1(>`/M+PM.N@O@4$\L`&<D(`;E@"H` M($4E:``(`*0E1@"<2'@#[4AZ`#A.N@N\4$\E0`"@+P1.N@Y06$\O+(*:3KH, M"%A/0JR"FF"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$Y5``!(;0`,+RT`"$AZ M!*Y.N@"03^\`#$Y=3G5.50``2.<(("1M`!`,K0````0`%&8((&T`""@08!1* MK0`,;P@@;0`(*!!@!B!M``@H$$*M`!1*K0`,;!)$K0`,2H1L"D2$*WP````! M`!0B+0`,(`1.N@/20>R``E.*%+`(`"(M``P@!$ZZ`\HH`&;>2JT`%&<&4XH4 MO``M(`I,WP003EU.=4Y5_Q1(YP@P)&T`""9M``Q"K?_X*VT`$/_\($M2BQ`0 M2(!(P"@`9P`#,+B\````)68``PI"+?\B*WP````!__0K?````"#_\"M\```G M$/_L($M2BQ`02(!(P"@`L+P````M9A!"K?_T($M2BQ`02(!(P"@`N+P````P M9A0K?````##_\"!+4HL0$$B`2,`H`+B\````*F8:(&W__%BM__PK4/_H($M2 MBQ`02(!(P"@`8#1"K?_H8")R"B`M_^A.N@G`T(20O````#`K0/_H($M2BQ`0 M2(!(P"@`0>R`%0@P``)(`&;2N+P````N9F(@2U*+$!!(@$C`*`"PO````"IF M&B!M__Q8K?_\*U#_["!+4HL0$$B`2,`H`&`T0JW_[&`B<@H@+?_L3KH)5M"$ MD+P````P*T#_["!+4HL0$$B`2,`H`$'L@!4(,``"2`!FTBM\````!/_DN+P` M``!L9A8@2U*+$!!(@$C`*``K?`````3_Y&`4N+P```!H9@P@2U*+$!!(@$C` M*``@!&!^*WP````(_^!@'"M\````"O_@8!(K?````!#_X&`(*WS____V_^`O M+?_D2&W_(B\M_^`O+?_\3KK]M$_O`!`K0/_<("W_Y-&M__Q@6B!M__Q8K?_\ M*U#_W"\M_]Q.N@(<6$\K0/_D8$H@;?_\6*W__"@00>W_(2M(_]P0A&`HD+P` M``!C9^)3@&>4D+P````+9P#_;EF`9[15@&<`_VY7@&<`_W)@S$'M_R*1[?_< M*TC_Y"`M_^2PK?_L;P8K;?_L_^1*K?_T9W`@;?_<#!``+6<*(FW_W`P1`"MF M-`RM````,/_P9BI3K?_H(&W_W%*M_]P0$$B`2,`O`$Z26$^PO/____]F"G#_ M3-\,$$Y=3G5@&"\M__!.DEA/L+S_____9@1P_V#B4JW_^"`M_^A3K?_HL*W_ MY&[:0JW_X&`D(&W_W%*M_]P0$$B`2,`O`$Z26$^PO/____]F!'#_8*I2K?_@ M(&W_W$H09PH@+?_@L*W_[&W*("W_X-&M__A*K?_T9BI@&DAX`"!.DEA/L+S_ M____9@9P_V``_W!2K?_X("W_Z%.M_^BPK?_D;MA@&"\$3I)83["\_____V8& M</]@`/](4JW_^&``_,0@+?_X8`#_.$CG2`!"A$J`:@1$@%)$2H%J!D2!"D0` M`6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*@&H$1(!21$J!:@)$@6$:(`%@V"\! M81(@`2(?2H!.=2\!808B'TJ`3G5(YS``2$%*068@2$$V`30`0D!(0(##(@!( M0#("@L,P`4)!2$%,WP`,3G5(028!(@!"04A!2$!"0'0/T(#3@;:!8@22@U)` M4<K_\DS?``Q.=2!O``0@"$H89OR1P"`(4X!.=4Y5``!(;("L+RT`"$ZZ``A0 M3TY=3G5.50``+P0H+0`(+RT`#"\$3KH`-%!/N+P````*9B8@;0`,$"@`#$B` M2,`(```'9Q1(>/__+RT`#$ZZ`/Y03R@?3EU.=6#X3E4``"\*)&T`#"!2L>H` M!&4:("T`","\````_R\`+PI.N@#04$\D7TY=3G4@4E*2$"T`"Q"`2(!(P,"\ M````_V#D3E4``"\*0>R`EB1(($K5_````!8O"&$06$]![().M<AEZB1?3EU. M=4Y5``!(YP@@)&T`"'@`(`IF"G#_3-\$$$Y=3G5**@`,9U0(*@`"``QG#$AX M__\O"F%64$\H`!`J``U(@$C`+P!.N@4(6$^(@`@J``$`#&<*+RH`"$ZZ`CQ8 M3P@J``4`#&<4+RH`$DZZ`MA83R\J`!).N@(@6$]"DD*J``1"J@`(0BH`#"`$ M8(Q.5?_^2.<(("1M``A!^O]"*4B"@@@J``0`#&<*</],WP003EU.=0@J``(` M#&<R*!*8J@`(+P0O*@`($"H`#4B`2,`O`$ZZ`I9/[P`,L(1G$`CJ``0`#$*2 M0JH`!'#_8+X,K?____\`#&80"*H``@`,0I)"J@`$<`!@I$JJ``AF""\*3KH` MI%A/#&H``0`09C`;;0`/__](>``!2&W__Q`J``U(@$C`+P!.N@(R3^\`#+"\ M`````6:8("T`#&``_V`DJ@`(,"H`$$C`T*H`""5```0(Z@`"``P@4E*2$"T` M#Q"`2(!(P,"\````_V``_S!.50``+PI![("6)$A**@`,9QC5_````!9![(). MM<AE"'``)%].74YU8.)"DD*J``1"J@`((`I@ZDY5__PO"B1M``A(>`0`3KH` MPEA/*T#__&88-7P``0`0(`K0O`````XE0``()%].74YU-7P$```0".H``0`, M)6W__``($"H`#4B`2,`O`$ZZ`-Y83TJ`9P8`*@"```Q@S$Y5``!(YP`P)&R" M4F`4)E(@*@`$4(`O`"\*3KH%<E!/)$L@"F;H0JR"4DS?#`!.74YU3E4``"\* M0?K_QBE(@H9"IR`M``A0@"\`3KH%"%!/)$!*@&8(<``D7TY=3G4DK()2)6T` M"``$*4J"4B`*4(!@YDY5```O+0`(8;983TY=3G5.50``2.<`,)?+)&R"4F`. M(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*"4B`J``10 M@"\`+PI.N@3(4$]P`SE4``"\*<@8@+0`(3KH"M"1`U>R"9DJM``AM$C`L M@DY(P"(M``BR@&P$2I)F$"E\`````H**</\D7TY=3G5R!B`M``A.N@)\(&R" M9B\P"`!.N@+(6$]*@&<$<`%@`G``8-9.50``+RT`"$ZZ`I)83TJ`9@Y.N@*< M*4""BG#_3EU.=7``8/A.50``2.<,("@M``A.N@!V<@8@!$ZZ`B8D0-7L@F9* MA&T.,"R"3DC`N(!L!$J29A(I?`````*"BG#_3-\$,$Y=3G4P*@`$P'P``V8, M*7P````%@HIP_V#B+RT`$"\M``PO$DZZ`E)/[P`,*@"PO/____]F#$ZZ`A8I M0(**</]@NB`%8+9.5?_\2'@0`$*G3KH$8%!/*T#__`@```QG$DJL@E9F""`M M__Q.74YU3KH`!G``8/1.50``2'@`!$AZ`!Y.N@'L+P!.N@'N3^\`#$AX``%. MN@`,6$].74YU7D,*`$Y5``!*K(*"9P8@;(*"3I`O+0`(3KH`"%A/3EU.=4Y5 M__PO!"MM``C__$JL@F9G+'@`8`HO!$ZZ`,Y83U*$,"R"3DC`N(!M[#`L@D[! M_``&+P`O+()F3KH#`E!/2JR"AF<&(&R"ADZ02JR"CF<*+RR"CDZZ`;)83TJL M@I)G"B\L@I).N@&B6$]*K(*69PHO+(*63KH!DEA/+'@`!`@N``0!*6<4+PU+ M^@`*3J[_XBI?8`9"I_-?3G-*K()N9BI*K()^9R(O+()Z+RR"?DZZ`HQ03R`L M@G92@.6`+P`O+()R3KH">%!/8`Y.N@)D+RR";DZZ`P983R`M__PN;():3G4H M'TY=3G5.50``2.<.("@M``AR!B`$3KH`1"1`U>R"9DJ$;0XP+().2,"X@&P$ M2I)F$BE\`````H**</],WP1P3EU.=3`J``3`?(``9@@O$DZZ`"Y83T*2<`!@ MX$CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=2(O``0L;()B M3N[_W"(O``0L;()B3N[_@B(O``0L;()B3N[_N"QL@F).[O_*+&R"8D[N_WPB M+P`$+&R"8D[N_RA,[P`&``0L;()B3N[_XBQL@F).[O_$3.\`#@`$+&R"8D[N M_]`B;P`$+&R"7D[N_B!,[P,```0L;()>3N[_"DCG`01,[R"```PL;()>3J[_ ME$S?((!.=2)O``0L;()>3N[^/D[Z``(B;P`$+&R"7D[N_F).50``2.<(($AX M__].N@#06$\H`+"\_____V8*<`!,WP003EU.=4AY``$``4AX`").N@"X4$\D M0$J`9@PO!$ZZ`/A83W``8-8E;0`(``H5;0`/``D5?``$``A"*@`.%40`#T*G M3KH`HEA/)4``$$JM``AG"B\*3KH`6EA/8`I(:@`43KH`T%A/(`I@DDY5```O M"B1M``A*J@`*9P@O"DZZ`1I83Q5\`/\`""5\_____P`4<``0*@`/+P!.N@!\ M6$](>``B+PI.N@!<4$\D7TY=3G4B;P`$+&R"7D[N_IX@+P`$+&R"7D[N_K9. M^@`"3.\``P`$+&R"7D[N_SHB;P`$+&R"7D[N_GI.^@`"(F\`!"QL@EY.[O[: M3OH``BQL@EY.[O]\3OH``B)O``0@+P`(+&R"7D[N_RX@+P`$+&R"7D[N_K!. M^@`"(&\`!"QL@EY.[OZ,(&\`!""(6)!"J``$(4@`"$YU(&\`!$SO`@$`""(O M`!`L;()>3N[^1"QL@EXB;P`$("\`"$[N_=@L;()>3N[_=DSO`P``!"QL@EY. M[OZ2(&\`!"QL@EY.[O[^(F\`!"QL@EY.[O\$(F\`!"QL@EY.[OZ8(F\`!"QL M@EY.[OZ&(F\`!"QL@EY.[OXR3.\``P`$+&R"7D[N_LXB;P`$("\`""QL@EY. M[OZ\("\`!"QL@EY.[O["(F\`!"QL@EY.[OXF(&\`!"QL@EY.[OZ`3.\#```$ M+&R"FD[N_Z`@;P`$+&R"FD[N_Z8@;P`$+&R"FD[N_[(``````^P````!```` M`0``!8`````````#\@```^H```"4,#$R,S0U-C<X.6%B8V1E9@```"`@("`@ M("`@(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P, M#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!` M0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@```````````````` M``$``````0`````````````````````!`0````$````````````````````` M`0(````!```````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` L`````````````````````````````````!0``````_(```/K`````0```_(` ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive