mojo@mp-mojo.UUCP (03/11/87)
Here is source and executable for a UULINK news sorter. Newsort takes the filename of the news file as an argument, sorts by newsgroups and subject line, and writes to the same filename, leaving the original as a .BAK file. (Old MicroPro habits. :-) This source was written for Lattice C 3.00 with a private library, and will no doubt require some porting for other development environments. Executable is a uuencoded .ARC file. Address comments to mojo@mp-mojo.micropro.UUCP. ---------------begin newsort.c---------------------begin newsort.c------------ /* * Sort a news file for UULINK by newsgroup and subject * * compile in large model * * */ /* Includes */ #include <stdio.h> #include <errno.h> /* Local Defines */ #define TRACE 0 #define MAXART 500 #define MAXFNAME 65 /* #define BUFSIZ 512 */ /* defined in stdio.h */ #define FAIL (int)1 #define SUCCESS (int)0 /* External and forward function declarations */ long ftell(); char *malloc(); char *getmem(); int readone(); void perror(); void newsread(); void cleanup(); int artcmp(); void changext(); void newswrite(); /* Global variable definitions */ int _stack = 5120; typedef struct { long offset; /* beginning of article in input file */ char *subject; /* Subject: line */ char *newsgroups; /* Newsgroups: line */ long length; /* length of article */ } ARTICLE; ARTICLE articles[MAXART]; /* array of article information */ int n_articles = 0; /* number of articles in file */ char infile[MAXFNAME]; char outfile[MAXFNAME]; char bakfile[MAXFNAME]; char msgterm[] = "\001\001\r\n"; /* ----------------------------------------------------------------------- */ /* main */ void main(argc,argv) int argc; char *argv[]; { int i; if (argc < 2) { fprintf(stderr,"usage: newsort newsfile\r\n"); exit(1); } strcpy(infile,argv[1]); strcpy(outfile,infile); strcpy(bakfile,infile); changext(outfile,".$$$"); changext(bakfile,".bak"); #if TRACE printf("infile: %s\r\n",infile); printf("outfile: %s\r\n",outfile); printf("bakfile: %s\r\n",bakfile); #endif newsread(infile); fprintf(stderr,"sorting...\r\n"); fflush(stderr); qsort(articles, n_articles, sizeof(ARTICLE), artcmp); #if TRACE for (i=0;i<n_articles;++i) { printf("\r\nArticle %d:\r\n",i); printf(" Offset: %ld\r\n",articles[i].offset); printf(" Length: %ld\r\n",articles[i].length); printf(" Subject: %s",articles[i].subject); printf(" Newsgroups: %s",articles[i].newsgroups); } #endif newswrite(infile,outfile); unlink(bakfile); if (rename(infile,bakfile)) fprintf(stderr,"rename failed, %s to %s\r\n",infile,bakfile); if (rename(outfile,infile)) fprintf(stderr,"rename failed, %s to %s\r\n",outfile,infile); cleanup(); /* free all the pointers */ exit(0); } /* ----------------------------------------------------------------------- */ /* change or add an extension to a standard DOS filename */ void changext(name,ext) char *name; char *ext; { char *p; p = name + strlen(name); while (p > name) { if (*p == '.') { strcpy(p,ext); return; } if (*p == '/' || *p == '\\' || *p == ':') { strcat(name,ext); return; } --p; } strcat(name,ext); return; } /* ----------------------------------------------------------------------- */ /* compare two articles */ int artcmp(a1,a2) ARTICLE *a1, *a2; { int retval; if (retval = strcmp(a1->newsgroups,a2->newsgroups)) return retval; return strcmp(a1->subject,a2->subject); } /* ----------------------------------------------------------------------- */ /* Free all the allocated space */ void cleanup() { int i; if (n_articles == 0) return; for (i=0;i<n_articles;++i) { if (articles[i].subject != NULL) free(articles[i].subject); if (articles[i].newsgroups != NULL) free(articles[i].newsgroups); } } /* ----------------------------------------------------------------------- */ /* Rewrite the newsfile in the new article order */ void newswrite(in,out) char *in, *out; { FILE *fin, *fout; int i; char buf[BUFSIZ]; long size; #if TRACE int retval; #endif if (n_articles == 0) return; fin = fopen(in,"r"); if (fin == NULL) perror("can't reopen",in); fout = fopen(out,"w"); if (fout == NULL) perror("can't create",out); for (i=0;i<n_articles;++i) { if (fseek(fin,articles[i].offset,0)) perror("seek problem",in); size = articles[i].length; while (size > BUFSIZ) { if (fread(buf,1,BUFSIZ,fin) != BUFSIZ) perror("read error",in); if (fwrite(buf,1,BUFSIZ,fout) != BUFSIZ) perror("write error",out); size -= BUFSIZ; } fprintf(stderr,"writing %d... \r",n_articles-i); fflush(stderr); if (size > 0) { if (fread(buf,1,(int)size,fin) != (int)size) { perror("read error",in); } if (fwrite(buf,1,(int)size,fout) != (int)size) perror("write error",out); } } fprintf(stderr,"\n"); fclose(fin); fclose(fout); } /* ----------------------------------------------------------------------- */ /* Read in the article information */ void newsread(filename) char *filename; { FILE *fp; int art_index; fp = fopen(filename,"r"); if (fp == NULL) perror("Can't open",filename); n_articles = art_index = 0; while (readone(fp,art_index) != FAIL) { ++n_articles; fprintf(stderr,"reading %d... \r",n_articles); fflush(stderr); ++art_index; } fclose(fp); fprintf(stderr,"\n"); return; } /* ----------------------------------------------------------------------- */ /* read one article */ int readone(fp,index) FILE *fp; int index; { char linbuf[BUFSIZ]; int isheader; char *p; if (fgets(linbuf,BUFSIZ,fp) == NULL) return FAIL; if (strcmp(linbuf,msgterm) != 0) { fprintf(stderr,"Wrong format: %s\r\n",linbuf); return FAIL; } isheader = TRUE; articles[index].offset = ftell(fp) - 4; while (fgets(linbuf,BUFSIZ,fp) != NULL) { if (strcmp(linbuf,msgterm) == 0) { articles[index].length = ftell(fp) - articles[index].offset; return SUCCESS; } else if (strcmp(linbuf,"\r\n") == 0) isheader = FALSE; else if (isheader && strncmp(linbuf,"Newsgroups: ",12) == 0) { p = linbuf+12; articles[index].newsgroups = getmem(strlen(linbuf)-10); strcpy(articles[index].newsgroups,p); } else if (isheader && strncmp(linbuf,"Subject: Re: ",13) == 0) { p=linbuf+13; articles[index].subject = getmem(strlen(linbuf)-10); strcpy(articles[index].subject,p); } else if (isheader && strncmp(linbuf,"Subject: ",9) == 0) { p=linbuf+9; articles[index].subject = getmem(strlen(linbuf)-7); strcpy(articles[index].subject,p); } } return FAIL; } /* ---------------------------------------------------------------------- */ /* get memory and test for success */ char *getmem(size) int size; { char *p; p = malloc(size); if (p == NULL) perror("out of memory!",""); return p; } /* ---------------------------------------------------------------------- */ /* Print an error and exit */ void perror(s1,s2) char *s1; char *s2; { fprintf(stderr,"newsort: %s %s\r\n",s1,s2); exit(1); } ------------------end newsort.c--------------------end newsort.c-------------- begin 755 newsort.arc M&@A.15=33U)4+D5810"^4R4 $-"8_$MY!0 ,3;0 I "@"0 0 0 /#O M'S(""0<$ 0") >* R0 H"- ,9S&!,$ @ X ( $B<!+!C)9.5759F6EEJ MY:^5VU:R6[D@ $H./ED&31(T3%!)084%_1;T@ "4,)X"L",5DU1E4O=)33( M9:.N $Z!S0;V @&4(\X"L*&VB=I!:FNI%:;VF=IV:G<40'ED+X L?M7X=>27 ME5]C?N/YU6 I8S& *1 1@0Y%N1MD",<@+H9@);.D !TEM7Y6^<*"%#&2#V5 M=2#6N0)P! %@YHS:"'%+P:T%=R/<S' C"#"3"'$ @XY7 4 +0!WF 'A!UP9] M!0!= 5IBOP%@6( HW0/@":\!P+( & T"[ !@+8 *M\K<1\ #GU!]'?1%T<_ M'_T& ;S'0H !,$'@%P1>0J!W[[D @#T![ ;A&P\&@$F%KU383(7S5#B$: (L M 8 # H@ @ 4"Q'"B $*L>%LY +P 0#L P#(C -C<6 , '@@P48\= - / 'T( MV9V1# 0P)!Q* B!*DTX-288 0]I")0#U7-G $..8\"0P" P9!,+#(E'F0 X M@J8) (@@P$4F"/ ! "H(T!X+ B0 @ L"L,FG$WL*X" - D @ $<FZ2! "0#$ MX1$D_U#4B3ZX<.0(-@8X LPOA.8R0PDK/#,#,/Q$D\X\J\P1@"H'F! *"P", M4AXC!G@ @*L*Q$I"GZ$P$&N<^^ "2 FC@"# (AYP < 0@8SCSS^![ , G<< MH!\"B21[ZR(H L (-"M <X\P ,!3AP&Q$#"-..L,H L\_^PPS1T&Z$);.H0 MD*V;BXRSS3@RD(.("2L(D(T/=>(R$B ^%#P '0$@,0H*Q[+#"#"+<#/(, ^D M.\TZC$0S0#8K8#,$+4HT$\(< JR3@R\#F: ( T;(T,XBV6PL0+//KC#.(OR, MHX#,!-B 2 %&'"&./38@!L BQ!!C0WH&6&$!%(Q@HZDF!^ &!20#+,*.(D80 M0 L3*NO24B[M[>(1+4"HC$M#4&BR$R0(5#$(.P2(/8@?"@C0!P<>X%(& % 4 MCH4(=3\ W2+E*(RX)@9<%P#DQ-C!@ G_T&$ YW004#@=(=3M43"7ES-ZZ877 M4KHFIZ>^>N*XV/-Z[) 7_@?BK9?N #KC/*TZ+OG2;CL4OT\C_.R_/]'W\(GP MCLOBC3\^//6:+! >Y XL8L M 4"!"P2(_V.#%SSB0FC=/P! ;NZXN$X[Z<BC M4XWLM;]>^7GP'S^[)B19#^0* 0PZ;*!P_JL4ZW!A">EASW'-@1_]>E>W *:. M@ :<'04+9R/:/=!ZO[,' $95M\IA!W*#( 8!NK ,O;$# 6+[AQT@($,':,(! M '!&ZA;A!0@LP@D.& R$N$$ B3""P98A!&ZYP4"[& 8<YB"(XSP.44<@ <N MJ ,%9+A%.TC %. '0!0AT)B(("%F2, T3#1 QG1@0$]4!8=6J4( O! !W7 M !=E* $9TM .-EP(-%*7PC,NXQ]%7,<H]NA%/]90$X(DI!E9Z,*^L2-S#@#= MT#J'@,QMD@Z?1 #7 $"-U"7"" + 8 %2N,)E8!)TG^L< 3P)2] 18)2E+&,K M70A#=@S"!^ASSBHGN8QC4)$D2DRB!]"W VSXP0@> \<BX+$(3BAJ 9S P:$> M\ ]:**J;VM2$GJZ1NG0E<QK2I"8G?" ;/)@F]UD9S??*4X D!-R_Z#B.EY1 M2$H&@AT2J-@O@WFN0! CH"PLG#+*9PL-". ?ML" #3A!@)![I0&6, PCDB M.DP H@Z%J$0+%YSZQ:$ \,L&0WL$40Y,M*+ON:@1%*#1(R+ HQ!EJ2U<6KB< MU \(*"V',7WU-",P %G,Q,8?!I"./ 0@FM,D83=M\%!:$$J&!I#A+?4$H0$6 M\*,-?6A$!5 X="#N=_AXGCF-BLYI+H(00C@6)X @@$08PE")\ 2)%G'78^E5 M #-(ABX ,-&N&4 ?I #5K6*"\**;R10L$ CEE@W!( (<CT@+!W &M*Q%JX> M9T5')IXG0P7($ &-%<!C$2=9RFHB5WLM1V8/!5:=\K2QX?O=&9X7"%>0B+"# M\(2A ) ./?PC%.A;@5$3MXLD3<$#NUA<&"&XO.DQ+GO;*P=?#;6(OP9V!M(8 MY6']@(;%VH$ 4Y!<9"?K@,I>5KM_?>)F02K6D>+B [E%!SS"IEU#D*BTIX7" M+D8R!<EZP0%AA.VQX$LB^=96K+=507YUP=]\,J"I_BB<#<*GN.M2%Y]VR.IY M-=& %8'8M'8098E1!#F#(K2%>^MEX7 0/D<"DJ(6+<<I"5!3+PB@#A&PL0,* MIX/\0H&_HQH%^C!J7@+(4 "_VPWDD$ '%2 7(4KFW2Z*$(#G1E<$T[5>A^NF M/>_@4Y_$T.J326SBX66!P]:M7@3+T<\6_C.@,0RK2 60VO4NE\TP@IQ&ZY MR;E8 G%!1A8.UD&U*UKN2P'!C_06D<7;@MP_N"<#7U01!?3$ P0P$C,:0B7 MMA5>>AYK(NP @'HZ%(7K($"0GL;J1!""JHG@Q%53+=$^5[IN)0YT.0;-U'L$ MH'"+]K.C<7E!8-0A"*0V=3KIN^=5MUI/KRZ'.2UA:G$L0AXKT+6=;GTL/^BK M$'%-1"?H.JI#)[JBRGXT*9M-Z&. VB/$;<,_!N&+4&\$#[CP%>WB$+Y?:\)Q M&U@P >OPA6\UP@L8V':WORU9)S @"G;%ZU^M?<,<IJX%N:J?#W98:T*P,]?O MC+8 3@U10T'TO[20)RWHB;MRI,,=_N"WO^D \!+3S@\%;W3U$NY5ACO<"QF0 M^,J]+8^*7SSC==TXJSNN0\B!/+0W@=PB2JZH7&M3Y2RWA<MM ?-OTB*<-4_' M&W+>;X_4@:EE\ <N]$0[1@3]SPA7> &9F@1_'+T"2E\7Q1MA<8SW-:\DXC@. MJUZ.%G2M?CH0WM;U18BN9U, 8)^VV,5:]JJB?8RI2X<Z^L'I%[LPB>R0(0,T M00%[FK)L/?XQ! I7"CA;(K\EUGK9>"B %!J DC'4'(!3C-7"F2+3'K:>>BEG M.<A1<F\*$%MK#>!G D"!CW[4Q$AHQ#UTM 2#"YC;/^IVMPK;P0)<U$0!C 0Y M*$SAM$T&X$K:S_P3TID8"G@^.U"?9!R(8!0Z( +'8 \( (C,0H^(( &( 0F M @ #" 0-V&>LYWJ0,PI&( +90@0B,&BH-1*^QT(#B 0&Z( &H 0-.(!,X"8 MD%JCX 0** 4G2'T-6#>M=T_E, I6@($>0 4;. QUT('(00R_MPRXX!&CL#@# MJ 4-. I<( (LZ 4** 8Q" 8S.($V. IFH(-DT(,_*#D?2(0#$"MHH(!JL(1L MX(2$-0INH(!R$(-P4(4UF#JC8 <Z2 =<"(1?.(!X( (+,8!Z$(-\H((LZ <* M* @Q" AP2($W: @Z2 AWZ(5""()ELWY*1 ]T'I]$ %0!0_'0 C^]P]@4S;K M< ZC\H55\$\.<#D6 PV-X E <4H,<$0*0 P1%0!$0PC.QE2Q \4 )TP%2+ M !&L$8]P"B)4(MU@'Z&@ $! %$6T(RV0 'A4T\] CGK< RM97VMI0!^UEX@ M!8W,J G>,20RA2U(I%%T\ E*A ATPA6X !VI0$!0$388@4&D%?,6(F(1 + MQU1\\ ^94T4$@ GYE%6V\(P0)8UUHR?56 [K< VTR(QK] _+"(T(&8W3R) + ME@Y! "W$D(KZAU+LH$0?Y003@$$CD#D+0#3$X </(#,=,$4-8 *(P 'YM !3 M% $T60#Y] "(((K3D$(%H']@X#=^H 8", <'4(K$ 8L)#G&1#Y/XP5JL 1' MA .GU#U+=$H @ 19^3<D\7;I\ L!$ WIM A: %'Q !#8%.+( 18.5.GI ;K MN ,S)0=,-0I%!4->H #-9 <I< ]FP 8\A 8_9 9"I$0,()B$:06("0U3( 53 M$ 7_X 5N@%DCT0<\:00(L [-H$31YP4(T$QWP **R9B%>9B).5.HZ9@# )F2 M29F6B9E$PI-.H #KH SKR$-^B0UV( B,F4\PY 2&Z9K0L @;904 $)RWR4.( MB0TRQ 91,)DR-"+H W^ #GI( 7_<)J#F9I.@)C( )JM^9B129VS*6G X <F MX)V$Z06&&9ZKJ0#E^9K1>9Y1\#N!D)W:-5,\Q #-- <#@$C1-U-VR0!V 1* MI 9VB0!V@ .@J5Q'194K()I/- <H4(2,9@1JX&?<^#M P)\:ZF<($&^_PP+\ MJ9B\^9<:\$,.$ WAL CQD A"X$-+9);YU#W4))=PN9M4R:(N"J,R2J,V^J+@ MD*-NQ:$TB@-_XP 4(*#I8 -RUQ IY)3+P)16ZD+1-Y)&( $\I)94Q%%*1 %> M:004@$%%($-Z='[:!P"$@ED-<4H(0 <%T /E40<9D$P\Y$1=^G8[T$-UL &C M,@/;D$+YYTKGE4]]PYDT:4<*4 >RL X D$8F8 P+H41>VD.&JG_\!PP[9I8X MNGOP$ K<Y0&)1PC^, *YQ@\IJ3EK5#TWH'=T:F'K@ Z9LSF"P /.P52@@!Q^ M !%\P%27<"MU5(!U\ *5"*I'NGOXL C& 2,L%&=D*J)4 BL"HNW>HL%] ,% M2 <[0*LW4S;*JJA)RD2QB*JJR@FLFJUUA(MT( &8 *MZ5P>;R0#K0 [9FJL; MT2J6RA!&Q:X#*:]%QU19T!!&M0[ED#6[L*YV0 $FD A$T">)P &5F#D0\+ $ M8(IBH[#$$ #Z5S%D@P#Q>G L(:L'$+(L +M$K(IY&DN=%1<:@$$E =C,*8S M2P&9@P&52@ MD$\8< ]60 'WX 42, A>L$5*9 'W@ V$.K,!8)5&4%04<$3' M0K0_="S*J0DFT@-U)9>BB8Y?($,:H*8RA'YVH !3\#N:T)TZ9@0:<$08L Y$ MD+1-"PQ.!;522[4\Y*5.@+6M1A)<>TH*8%/HF %B2[;G5UIIBPY4P+:G]+80 ME[0]0#YUL 5U>[=<.:9Z:[5]NPA9"[@"D+,^.PC^\7:#H \)0$2#:P78PFIV M4 "XP!WM@@LP,$+;X+1+\$,(D)A6H 3, U3U**L1I/V:IA&(+-V&P-+>[E/ MNV.:BT1[^T-)9 6WM+6])PPP, C1,*EVH+.(L$5&$+<P0+>W:[?-NWMF>D1) MQ+G3>TN@.PC8J[W<Z[W@BP$YN[/>@C'>D$(,H']!(#8V8DPT0!+&9 ,-80S# M" ((C -EP C30'@(\),G\),I\),H\),J\),K0$0L<$0ND#E'\*K0A0Q=]EH MD 0+AHY* ,(3F32^0#Z#X X$@ ?6X ([0 @M\&/TX +_0 HO( C !4( "T M@00"8!UQU0( P+7^8 0IL ZU@, JL +[) A^H +.D0I2K+*CT,14[ DL7$<C M6SE,,*^S: <A7*PJ4 =G$,9V! /GDD]'\),FX,8\L,8;(,>9\P3M&;'MR0$F M !<"H"GM^0!$1 /K( -N/,8 4,9>10<?H$0TL NY<@_K$,8<, F8, ERW"R. M,P ;902([ QVG$5P(,=;E\8!RWR.K)YT< ,%3!*+7$*-+*M"H$0V0,G+><EH M+#.9O,F=/ Z?',HVL ZDW,MJC*=Z; =\O A^O B +,B$O B&[ 0V8,=L<"Y- MC ++K,H$Z<*U&\,$D =,118V3 B(, !U$ \\3 J*, !F !$< "',P,'4 0Q M<@!GP",'< 0 H $', 9"8@!S "N8 4\@D%,!Z"0 !8 !_T%$\0@!DL((# M8,4HL!$HL,=]W"?0',@$0 5AP!1D OV\ ]10,C_< =]\@\W$&7\8(TKP-'. M[-'13 "## R%#%Z%D Q.I02M5:*U,WY2D)_H4 (QK5W# ,$K$ RG) /I 07 M[0<930<;S<P=_<<@+=(07-*YDM(ZO=(M_=+HP [[8(UUC-4UK=72K-/4#%Y! M+3XA5]2_0PQGK=1,[=0UDP[?( !-? )6;!UB.0L @-$;40$T_<P\,,U=X-$- ML X>D-@>O=ANW0&!50C;X%1)<$1/DPT_! +D UT8 >9PP(["P/#:*EXX*RG MQ )ER@*&;=62S=8A77$*4-+D ]:<P]*<0]8M<-?KD-;-_,PWG=,[+0W;*#[D M P5TC0X%<-?(F==/G0[&$MM7/=PVO=4CC=L H-MBW=N_PPSZ@-:S_=%M?=QQ M/3Z(T]RD,-YX[00(T-3339:!O:OI4!.QC=AJK=B,[=B07=Z4W9Z6G0R8K=F< MC3.?'=IT@ :E?=K67=XWS=5.D E;5G>S=LN_3L>X-[!#>$@;=QOC=R3E0#B M8UG,;=3VD ]:M]3P+=]['0$!\.#[G=UP(>$DG0L6KM(83M:]H.(.*=Q9;=XX M/<T/ ->3)=0FWMR5X./1W>)Z#=4VXN$U/LU/X-$70$0NL #*D A6P )UL * MNQZGY )'Q (RQ,-VP )4MT->8 .8_=1^T 9/M%0\) -') /K$ ;&) ,C(>5# M[M8^"=]RN\!%8$PYX!'&Y" .: 2P @#K\ *$;N@$; 2*;DR-O@X:8.@CD>B3 M?ND),*B%2@Q!P$)*E.6,+I8BH40RP$,TT$Q], "G1 .JG@*B;$RU6]A^4!!T MT :JC@0$]-1XX -*U 0\M 0#X 4PD$\P<$IUA3Y6? *'W> S$PF8$ GYQ )& M307-ZI )4-K7SI+#BP@$L ZW(,F^[JFB3,[I,!##OG7&;@?);@0PH A>8 *$ M7)/KP WF_NNBC <6T.YV\.[Q/N_U?N\<L [?T.O\+@/!WNY>8.S(KNS,SMG/ M'NUI+C,,0.W6SNA&;0SW8(W=GN;?7D>9<ROB3NY*! .9,P48JT1)P$-'D$*C MO@RX/+,%4,"5\S<VX %^</-&L//<B]VT/9PV$ 2,( U$1 07-06P,&$UP-1 M4'$[0)EVD -:Y7Y<[@*:T D T 0+QD,[\.8U<T0P0,Y#F[U^<.A ]C<RL!$& M\#<P8 ]+^F^VO:_B$@[8.LD\3>9=2Y6C,5W+^]_DP,;$0*XK*#(#LI@+_8P M@ <#$ #(KO,;$0/*O@ZF^?,%T#4!(.]*%/9V2P!+VRZ=WP,"?4H_X <#*N^! MX <_< X#@/K*;L4%40<J(,EV"0.$F/*T+NNB?.ZQC@<10#9IO02-FD]+4/GD MP/<;P0"90_R6VK-&L 3K %DHP+N&O+$+^[&/_CV#0]%Y?EY4 ;-?]JI30 N MP-K1#P2GE+L_[_L_K^ZR<#E&L /J/_\SR_P!?]K&OP[;H/#HSO X>_$D[P?9 MOYEF'OWKP OC;ZGQ+OVPT/EX3T!XL +^#^PX>_$D[P?9OYEF'OT/.?Z6&N_2 MOPR2[_=^8!V@-/Z6RL/1C\ON;P/J?@'R+P/NS_ X>_$D[P?9OYEF'OWK, WC M;ZGQ+OW'X/_ CK,73_)^D/V;:>;1OPYG[/P$$.]+,/Z6RL/1C\ON;P-XL +^ M#^PX>_$D[P?9OYEF'OWK8 WC;ZGQ+OW*0#8X,/[B;@2=_^L!GP>;\_S&/[0[ M,/U_OQ%G[/P$L +&7SBE='UVT 0RM 1B1$;]N0/,NP3;G0M?/07UHPST@$+1 M/P!QO>9:YP7$[@1+L +($->3*49D5 ZR'P"T;_ORGOOROOO[CNXT /S"/_[: M'_W(G_(KW_)&\/)>$/.B3NHCZ0&\$ "830</8)4>P ME.0[1, [_\ EX, +K MD ZYT'J^X']1X %6P&8HX@6#8 P0@ 59( [P,F+EES$VL A'4#2%< 0&0 <D M\$N\$ @0 <=L @VP O-: "\4);F$ WF8 .+< 0&8 .+\ 5&Q EXH*J$H <C M<*48@PW+$-/<X '7_ ?L" R7L@CW,"J+@ Q)( ^N$ 3WD W7'-$7LPC?8"KS M4 JJ0@H?T$)BLW4&< ]$0 "6!4J!P 0$8%GBQT+W0 0AO1%9(%6@Q$G_0 /, MQR_JB0>>';&+P 4,L +#<'UT@&#_0 -B%"=PVCF^$ AD0 #[\ ^C K& M0WW M0 0XO1$#H!]UQ05910,=MRL7Q0780@0*,"JDS@VT$ 0>8 /%< 4$H#(?@)>C ML@QB1#'B1_/<0 M6X $V4 Q74#3$\ <(H#(?@)>CL@QB1#'B1_/<<,T1/2J+ M@ Q)P _RX J+$ P%X!%+2_/<<,T1O0C7,"J+@ Q)P _RX I/L CWX $V4 Q_ MP([9$*V.$ R.T/\)CPQ)( ^N$ 3WD U9PPC'X C?H"F+D)WS8"KS4 JJ0@H7 MLPC:\ $TSPT>8 /%< =%0PQ_@ Q_0VCL@C(D 3RX I!< ^>O0_S8 J*0 3_ M$%@FH -I*@<%0*=!L X"< _1L C!\ $TSPTVX A'8 "TD 0J0_/<8 .+\ 49 MRS$>LPZ8_7;Z 0&T@ 0JHQ\ ( <!0//#T$)BLW7=0P3\6$ 5L"MTD >8 78 MY1U>H 7_0 -BE ("@ 6T5$=&P -A4 =NH L>030\L (<X0_* 56P)W$%V+J M!P!XH@5:X 5:,+,B(&0> CZL *[X L!\':[ Q=!G\AIG[TX7S+X#8 , 4R ML U3, 6T["99H 5@TP,-(9:A\33!X#:W @@\L )U( "SP%0-Q -R4 <K4#7Z M<2N P ,K4 <", L"\'[$%V+J!P!XH@5@XP76,A(F @\L )U( "S, #K< 8\ M< =UT 15TUCE0WPAAEUUL@5@XP4',+,M$P,F @\L )U8 *F0Q "D 4$A <@ M,*+P%V+J!P!XL@5@0T!XH "[$(;KL %NX^C_#DB=XP"=LWKCE#JCL@C8P$($ MA ?FL'7P2 "C K%UQ05.1@,=MRM: +&#RP4(< ]$0 C,4=MRB?K</-$4#D" MD#6+X W QPZ^X'^YT'KBEP,$0 <1, C& 'B< ])" #I,2J+@ TL9 42&(=: MX 4+AP!)" "^PD(0"X]<P #'0 0+P2-6H'K#AP!8I7[TX7PM)#9*Y +]P"@ M.0KX, **.0KZ, +XTI5U0 +P%V*NMF ]T!!UX&G'[KM&-0KZH*H>@ \CL Y> M$!KP%V+896:RU1!UX&DCJGJEM75910/,QR^RU1!U< "!P 0$8%DL-"H0*P#W M0 0XO8*$50> Y:E$D%4TT'&[<E%$,+A<<$:C<DC$%V+896:RU1!UX&E290/Z M, +F@P\CL'5910/,QR^RU1!U< "!P 0$8%DL% KXH*I$@ "AH ^J2@3T200$ M,!)TD !MRB>C H)$4#F Y:D1.RHLM /!4 < J@V? W4 W,L # X F+$ PM M)#;D:09'!4B$N@A,8 #C8 4[$ QRH *1[0=)-,3%\$8#( \CT]0!X 0&4"JG M4@JJ0@H?, 50L'4V-!)\@@5;X)D81 *+P 0&, Z1C R1[0=)-,0I0 0&$ 1 M6PQO- #R, #84"JG4@JJ0@J1/ S@=0]G"WQ<2I]F<%2 1*B+P 0&L /!( <\ M$-E\P #P >B5L;%$&(CT]0!X 0&4"JG4@JJ0@J1#$B!P 0A#0!3D#A6@%W> MX05:,+//PT)8L 7KT L85 *+@ R1S0<,, !\( #%$&*E<BJEH"JD$,F - #8 MD )$8 !$+&!P 0A_33# %[W<+; -Y(A-@@\\ _T*GX)9078Y1U>H 48Y&G_ M0 -BE ("H 771P<.T#D,< Q.]@_U1$Y8 #:DS@TVL AWT#=<<,1<<%1$H # MP 4(4 $D0?/<8 .+\ 0,, X?X $V4 QW4#3$\ <(P _S8 J*0 3_$%@?8 (Z MD*9R4 !T&@3K( #W$ V+$ PTSPTVH A'4#2+0"^+P >ARP6;@PC-&+&!P 0A MS1!,8 ";Q0,*T%C.40'_0 /RIRA;@$$)X %6@%W>H05:0//<0 M"8 .+< 4& M8 .+\ 0(8 .*< 0*8 .+\ 4$H#)R@%+8L C"L QB1#'BMPC80//<8 .+\ 4$ M$%B+$ T*(P0JLPC8L C"0//< #<>8 /%< 4&8 .+\ 0*8 .+\ 4$H#(?( <! ML QB1#'BMPSN9Y:+@ V+< C8$ "CT!M;@ 4TSPTVL A?8#8^H#)X.2K%9 "] MH2?B1_/<,',>8 /%< 4$$%@J\P%R$ #+($84(WXTSPVTT ,>8 /%< 5%HPA' M@ J\P%R$ #+($84(WXM)#8>8 78Y1U>H 48Y&G.'(L1JQ\"\'YTX(TT@%V. M J?_4 <,< Q$4#D $ A,0 "6Q4)0< ]$@-,;,0"I!;%910,=MRM:D 4KD VS ME@A<@"U$$'W!0.K<8 .+< >@3P0$,!)U0 #B1_-$D%5,8 8] "+P </%;'$ MP 6;HP@!$##+T*9\ @1TT/]$8 81 W_P 0&L [=D#$VH A'8$<)L%D\H !T M\ \P !TL \T !SQ ,@\(NC0H0C0?/<8 .+\ 4$T%A$H#)R\.G CB @0 M P3+($84(WXTSPTVH A'0 L$ 8\H &2(P<1 V-\(S:+D ]:O@C/8(>+@ \: MM0C'0 <N, /V8&VKEDK)L Y'4$EBLPCYH.6+\ R$M@C!L C8P$HLQ.R+@ \: MM0C'<"Z+,)[0L [J,$V%8 ]Y< #W("[;T $-,0,SRFHS8 \]G0<'< _1< _: M, C9\ ]UT &%( UXD &_0!O1, [1 W18 T[( ]XN0+R, 1/4 ?P$%B+8 WK M$ *_0#[1, [1 W18 T[$ ]RL !UX$3"( <%L +"L 'Q, 1/4 ?HL C.L C0 M,"KW$+4 AS= _BL@T=T!#W@$H AS= _1< _:, C9L&\J1.K<<,T1;0.* M< 8($%B*$ PO?P_\( ^N, C!( #WX-G^H C$( ^N<"Y/<#&+\ U7BC'80//< M8 .*< 0$P (PP ,*(#ER$#'+X L),2K(,@ EL @.4 EP"T'4 *+X ,)4 +1 M< [1( W1 #;3$ W0T .Y(@<\FRM'X 1UH [9,@ ED @.4 ED @6< ED @^ MD E, S@E0L+\0L)4 *+4 ")4 &+P+32 *K2 *K2 ,J#( T *K2L @= ,J# M( WZLDKO( #BD W#$ H#4 +(4@ EL @.< EP"T)4 +1@ [1L W1D W1H U. M4 ?U, H#4 +94@ ED @.< ED @6D E, Q5(#;&8 #\H!(#^ \JP;V?X\P& M,+,( @.P ^[4@+_\ =UX*7X8 (+P =JM !\T"<+P -BN0D X#'HT +^, "C MT \DT)Z;LPA<X-%$H$:+X#G@]0OK%PWN$ W8$ W;$ W9$ W:\ 1U, \E!@BC M, ED"T%4 *)X '4 *)8 $)4 (#^ \J\30VT \DL C64 CV():[DP<1, C& M, !X4 &^,!+H0 0-\24DL [@@ [/\"Q910+K$ &^L! !8 /]0 +HL +_@ [X M\"P.\ \D< \&, ", @AUX O_X #]0 +18 ()4 +18 $'4 +18 $%4 +18 $# M4 +K( XS8 ^ X #\0 (! %[V8 #\0 (!4 <D$ H#4 (+8 %4 *$%@H'4 (+ M8 )X(L2@ ZQX ^%( U?/@C^$ !Q[ #_0 +KX Z @+V(0 D+4 )&, @9Q@?& M,( !4 (CH:)G"WZQ 0"A\ \D@ 0# ]X, .Y8"N#X \<T <KL C.H B$P E M0 %<$=\\ '&0 @,4 (PX ^$L EH B$L EX 1YD'I910+_D(HE\#>^ C%! MT)+_OF$E0*B*0 @+4 *J, 0[D U]\ !&, @9Q@?P LPH I#\*<*P ?Y,"KV M8 #\L"MT@ #V8 #\0 (!4 <1DSD2@+&A\ \D\$J)0 #V8 #\0 *R 5C)L C! M0.K<0 L_X $V4 Q78 VL A/H VL A?0 J\P%R$ #+($84(W[+0!$5\"D< M01$,H )@ P))X 134 5&8 1), 1)4 1.0 4@T 1%T 1/( 59 (J@#<@, 54 M$ 1#L 0@\ 164 128 1,\ 17 (J D%0!N0< "M!P !$ -D"MU, =A< 9E MH ,@X 9E< =S\ 9R0 <@X 9E< =S8 9IP 9ET "YX@(D #9[(@9AL 8 , =O M( =TD 9N< 8N #8-D"MR4 9N$ 9M4 8@8 9AD 9L4 9DD+(E, <@0 =O (E M, <-D"MR4 9N$ 9M4 8@8 9AD 9L4 9DD+(E, <@0 =O (E, <-D"MR !C M$ 9N< )T )R4 9O =EX 8 < < , 9AX 8G0 <@, 9R4 9A0 >',P=E4 9K M )P( =O( 9L4 9M !R4 9A0 8@4 9R( =O( < < =RD 9T4 8@4 9R( =O M( < < =RD 9TD 9N< 8@4 )DX )@ P(546)R4 9A0 8@4 9R( =O( < < =R MD 9T4 8@4 9R( =O( < D"MRL"QAX 8G0 <@\ 9P4 9N !R4 9A0 9IX 9G M (E0 8N #8@ D%4&*Y<@5R\ 9N< 8@8 9O( =M$ 9TH ,@4 )ST "YT@"Y MX@1E< =S< 9R\ 9U =SH .T,05U( 9J4 9C0 <Z )24 8Z0!M34 =BH 9E M, 9TH .T\09U0 <@\ 9F )M4 9M\ 9RD <A0!)N4 9W, =O( =TH ,@4 )S M (E, <-D"OH$!05<0< < ?6 0D&T (K )!C )N4 =LP 8% 0-@ P!!',0> MX1'I46)Z$L2^@D.695DEMGY!O'X5 :$<1)X 9T4 9RX 9AP 8@4 1R( =O M( >TX0^R\2B1 BD4$2F00A&1 BD4$2F00A&1 BD4$2F00A&1 BD4$2F00A&1 M BD4$2F00A&1 BD4$2F00A&1 BD4$2F00A&1 BD4$2F00A&1 BD4$2F0$ 8: ! "D4 end Mojo ... Morris Jones, MicroPro Int'l Corp., Product Development Northern Calif. Motorcycle Safety Council, MSF Instructor {lll-crg,ptsfa,dual,well,pyramid}!micropro!mojo Not the opinion of MicroPro! Democracy: The bludgeoning of the people by the people for the people. -- John Galt