[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: MiNT 1.11 BETA



In <199408090655.XAA20332@netcom6.netcom.com> you write:
>In the next 16 messages I'm sending along the source code for MiNT 1.11 BETA.

 heyy very nice!

>MiNT 1.11 looks quite a lot like 1.10h9 with a few extra bug fixes and
>a few omissions. I'd appreciate it if you'd all bang on it and check
>for compatibility problems (particularly with the networking software)
>and bugs.

 alright here are some diffs :)  i hope its not too late...  

###
ttys, round 3

add TIOCHPCL (hang up on close), TIOCCAR (require carrier, SIGHUP),
TIOCWONLINE, and some more to also do BRKINT, VMIN, VTIME...
simple RSVF cookie support, pass thru TIOC[IO]BAUD, FIONREAD (SCC) and
some others (but not the callback stuff, use select, TIOCCAR etc instead)
and add a few check_sigs after killgroup and some more fixes.
yes you can login over modem2 with 38400bps now and have it hang up
properly and SIGHUP your shell when disconnected, just don't forget
security on MiNT is still a joke... :)  i think the only thing thats
still really missing now is a real cooked mode i.e. raise SIGQUIT
when ^\ received, don't wait until someone tries to read it.
(workaround: go thru a pty, script /dev/null, telnet 127.1...)

there is a #define MDM0_IOCTLS in tty.c, if you leave that in you can
use the stty that comes with mdm0 to change local mode and hupcl until
i have patches for mintlib etc.

(this one's a bit big so i !gzip |uuencode'd it, look for the next
ones with /^###)

table
 !"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 diffs1.gz
M'XL( *SJ3"X !>P[:U?;2+*?Q:_HD)M$LF60_ ""0V: 0,(9 AD@,[LGD_%*z
MLF1KD"6O) />3/:W;SVZ]8HAF=T]>_?<<_E@Y%9U=U5UO;M\$H_]NUT1A)&_y
M,5W[_GO1Z6T/S"W1QG_V0'S__9IX//:#,/;%U<GYX>7QZ?[K2TW7GUT]>_%"x
M[!CB=]'M&76@\_=7/S9 ^@V0RZ.K=PV0@;'6KH*\>7=XV@#9:H <[E]H#9#Mw
M!L@9PM1!=AH@/Y^?G9Z<'36@GC>@F/*#.E3/:D"]OKS:OVHLU;.;2Q%0<ZENv
M<ZF?WIZ<-6!ZS956P""KU\1F2WB+-$M2X25QGB:1./;B/,IVUX1HB;/SJR-Qu
M]6;_"CZ.+H_$V_>75^( ALY?'\'(!4E"O]]%2>@/;-.VZY)P/&(YL.Z.+<N2t
M^V7)S!=!Y$PR$<"^B-^'UY<?"5*T-BN8'X_HY*R['<O2-)@:)W&4>$XD9LG8s
M-T7J_W41IK[PG#0-_;0Y^>ST_'#_5.-EUMJU=P<7/YR<7='2M+(31<FM<%/?r
MN<Y$&.=^FB[FN="C\-H7OQX:M':-LLNK\W<')U=('-#6J[VS\26_L.LO!N6;q
M+G-OL&-N _>VNZ9M$?> [U,GBY_EPO7]&(ATQL)=BF-\,(43CT68P3_ $G02p
M<4U$/G5RX6>>,_=%!DSQ8\\W<*7-RNZ7HZ/+0XWV#H(*,RY'!R#7KRILSO,Eo
M[O$7-X(]GHEPP]] E(#]BM5K;0W_A!"Z%_E.Z@-2L2C/QFAN_>;\]!7N;5MRn
MCVD2C87N;TPVQ*^7F[_^:-1/#V:@7L.,?C'#B2=B,1=)++PHR?SF%H?GYS\<m
M23)X!IWC//7S0KB]J9-F-)%%,4\77KY(?19%@)Z%L1,1!![.P.KCX0RZMKE#l
M9Z-ETR3--6T^2>=#VF.>)IZ?96*2)HA;4"Q"NRCX+'=RGR<4[W%LD9F">)#Ek
MR7P.7*Q.6F3^")1Q2)*_F+D@X;A^. -TBU7@G)(YB E,[*B)0(_-F\&3G][ j
MNDA>L$!2A7\W=^(L3&A.6\UQ%G??OIF3E0*P.?9O-F&V1)TX*K()R) +7R?#i
M<C!G[FNY5QF,U&B$P\1TNTM,[UGF<V9ZE,03H"KS(Z8*'GPO#T$<%/>1/%(4h
M0H+A;[\"?YN&.0N1ABAH6NONVE_R#/\N]T&]Q@)&W,1)QR)WW,AG+DMT_"R]g
M&7_H?226W<]?AIXNYJ,DF_O^F, S!P^%!\3M%-PJB7?($D[S%K#&)(;7?$ Wf
M< *FN,$#H17@*TNS28>4+'+"X6+_9V)$5MU<HFH_C*KX/$2UD.?BADDV0D/Pe
MB0^E:X$*M =]2[E[N7:K/)9Y0@HGP" %H1^12< 5Y(K$Z9/SBZ/#T17,2U+?d
MXWF7S@R,.:(%5,P7^<;&1O4<6W20!=]#8IHIF5>.MUQG,9XY<U/,G#M\'A;Tc
M-Z;@GI&3@93BUPS$(Z]RZ\N%T%1<9&!# H'?Q6T" O&B\U*X\ZP4C$*5:($[b
MW%X)?K[46O!18N3FH7>=,?FW4] H-.(.N!J'?9 2Z*B*V$UETL:&-_6]:^D=a
M%H&(062%CE*R262Q/962[9%E-F'MZU#J.#G@75%UI[SSWA[XNQH]>9(%8]XVz
M#,2C/7'T_NS5T4\0#HX1[[D#"D51@VYDM8DNF 93+&(P9&-[J 0,EGF%T&B4y
MP0;&>49.+5_.?9I^PK$F4)++6-.VGJ-%P']]]I&/PP ,OQB-7I^]/QR-8& 1x
MX\ !K E'5_H%.: #)@9X<^"CD:?.?&3W1[>WNG77]4R![\#UA $M09247QD:w
M@*-;#"'(FO@@22ZXQHTIG=-H1.8"]6@T(EKVSUZ-WAZ]/;_X,\<-A5^KK*:#v
M.CO =%-X!ME2[9>U=FTI32O&]4]:Y1LH]"3,4-60()"!_,:)%CX@XF2ST4A?u
M'UOKQE !TV&(D2/VA$[/AN[P6WY/:XB1B^^)04)WJ^]YOAAYY0+@]24$ H 3t
M$%7L)!KB)HF<'$Q;^49?QT]MEMS<XJ0G?3.;?]\9"C4:T6BO,<JPW96C=G44s
MN8NCC\'[T0"$)AJ\UVW+ #BQ3F"[8GTO7=<5UY#Y<*IL>E  &56 FJSKL6&*r
M=0 >.>K!50^>@5L)"C-H9G4J' " C6WZ[.*G0R,.C3C==3D5%-,%5PM6'HZ4q
M-F>&E@)4X:LZ%"4#C/^P'/N,8@Q^*PRJ,L>J&8"TI1,0MMG8*-;0JO*(P5G?p
M+&0D $)9'G28:)0O< 5,T^1&\K\@I8Q9*Z_>7QR<LU[*,:68I,Y=2AUMB'QEo
MPH!AT12"BYFS!$/FDUEQP1B.?UN F'/TLDP6F*3,YB!1Z684NJF3+FLQX#$8n
MLVL=_.@X FO&-@T,3)J;(O)C0TS\V3C)@,X!*/V]8"5E9&91G8F#')_6C00Jm
M:QJS%LK5C>%#G"]Q^".\+GA<XS7B<?[SV>CTY$#93 AO\D0937, /%9)!=""l
M'GW#(S**V +L#(=![T:Z+GVS:-V":S:0D"H<>9H:6/@%F M.;E2%;083+9<Fk
MW"3A6) #HQDX_0%P40?/"!3'5JR5C6[<J ; I[-_\?IR='X&6=O^X0]P"OELj
M[A9@HC7/TQ+69<>4TWOP0N0@:F\AL&F\HY)(OP<1:[O7?UXDPG1>R'QY4&7Ji
M@30&ZCS8C&<W 3#/RZ-B<1 =QH\$"$<HN2IXPHN,PCC,5] <TM%J:C'VQD0;h
M18[ W05LP$0M<S_C'4"2(F=IUN) K/NHP^"E\82;*__3:S+]0'H& 4IC546Tg
M^45@VLI+1M2/=Y9@ZL0:GA)C&E3?)Q=QX@%AS,O 2Y+K$% <AVF=;3'%JX70f
M,W:(IY/G:>B:$+EJHI@>D(Y(!<VJ&MK;017M8?Z/PK("'P_+$@O&!U^;8) Ve
M[D-> ML5:$#J*]#=.G0QI7W_E*T54U9]?&V9;!YM_X&E5AWT.!DMLA07K(M_d
MP>YEAB\WLCE[GGYWBTI5\$_F\W]Z=72LC21*S>]V<Z +/K,VL/7% %*U)@"'c
MH5!CF#;G4Q^L3NRG$&W/%^D<ZQ=)[",D5X&VN8;VW.S)].JW+-5TQT)G/01"b
M(66+(8=-8GCEC,=_W;C5'F/X!%\A&/)G&Y&F9W.C;8Z[G?'VIM/M.%LP$5*_a
M'#(M#"\FH8]I>YK#)YQ,B=\6A? 0?&]19@,Z"^DIIJ)92I %W"Y,5YM5MC$[z
MN#-LAEFM4+%I5@'NM_M]A#$=J^/TD""PP 5% JRO>(I.4LT!XK*4EZVLXM@Py
M66X&2WC)?*DF90O708B!Z0R(8<CO@Y/S2TQQ(??/A(79J#, V!IC)PGR-LPQx
M#H9@T>X2FL#6 A'F*K+B7V<TB7R=V6 T1(@R4^,T O[?X':2ABBJ_V-M6Q9Pw
M$:&1.-WXCYV$H),0J&K2+' DQ#:8:DWTB5K'9IXS'I=3@@]O]_\T.G@#$?GIv
MT4=(@3[!)%-TNB:&6*(S*+/:LM915A058\"7A1X,=CJ4/U:]?T=&D66Q -% u
M%P>!X^*.'V;A.!QQ">&/@(,J>YY;/#G\E.>S8,ZKB?IJA7.E6.K#QPH \P3#t
MM9ESAR13D-GKF3T+XDSXW^TQ#S$S6<",#J7\ -A!N[S6*6,T-M1K[1.Z4*%"s
M:.BAG5]KAUD21Q [0PI:UD\J\2#0_PE>0%"ENYV7.+:W)YY*N@V![[ X!BYYr
M9G,M KX>OD(3_,B%*,G&\C&>RM;.<\L6K]^=O!-SI(Q@%>JZ+5Z\$+8!>O+Wq
M%OH53F2E_S>$=1?@GV/9I^CDM,_"C\"@-[!2K*^CU6V@A5CUL-9*07.1V5N(p
MZ.7A(6-W(/'C4\A2D$/6(MR]+!42?BF-U7$>+V8S*C]I] 33OX4L#?=A7O20o
M%_?/V?%V!G(.X*5GJ9S/[$P?Y)%3XU'FIZ$3E4RB"QAFG DLB9;,D/W_?H;8n
MW\802?<BOHZ3VYBH T7.LL7,1PEQHEL'4IXDWJB+J$U+0,Z/J?Y*18)8^M^Jm
M15P>+"0VK.K1Q>7%*@WZ"I,"I^O^*PI4PVC[OUZ'MO]?A_XH0[Y1AQH,*?Q;l
M@R/V/R6C3EU&5^JKY\1Q@L6 W$=-HVMD>8U1[F>M4%G%95!868K1J?H"D+5Rk
M#+C23[5+(6 BCG=>3E'D._)+[H314&HV)M%&)E[L">P^ !Z*MIH#*7#DQS5 j
M'6*3/=$UQ(L"?(\QEMAGPP<P1[W3PR;B(2'>KB&.IQ\6N +B84%%#9^T0"1%i
MO,,&WA4A6(U4M13U%3.HBNB2X,> @TW5OSQ=4L5>/+9%$*89''2>L(T!&1G?h
M.A!E!F&00'J7)'#<:VW1$KI_Y_ESOHUC"[JII.]V&GI3@;.D50<;"DE@I^@Wg
MZ,S]M(-U$Z[SX'J;RD[CQ0N7OYX^%5+8'U6%'<9E,?Y1I91$>H$7.*9X"C2:f
MXOCD_.SB:/^58525R<^'9>U8C:I*'JY!AZNXK0J<H^G?1EW+$GJ+LWA0&^NNe
M[SJGN'C3+5$4V"ZB0-V%D#2<&.55</UD-*RH   =$M\%BE:$@6='0][J[AZQd
M8^B^H/_M(C9UVVU4_(ZF'%PI8L1$-8 "R!8"X1XI(DNV#"NO^ H->?^H$J/Rc
M= W>\^6<TAD<<=6(XE);<&\"_IT2%"TN+5?G)34)@#%2'1F\.L@A5L%%E& !b
MBMLOT+30M:4"Q=)U+B]^L6)-EB03\AS9"FGU?7[?*V83+IJLOQ''N/9&O5,'a
M%S^8PC4D#"",A\9DTY))J<S$VZ2FS_#WZNC@_6M=7R].?I=*>^+)6(Q#O%6-z
MP6:NFT)N:\BMFLR9;&23$;<- 8M&9^?'IY=O6(@1N!!41EU75OSL_>FI*2Q3y
M0+)F59=6"V,KAR&+_53MG_J@H+)D0U(W"R%A'XM=0UR>O'[S_IU0#-6TZS"*x
MJ/.CMIPI >5VG^GSUKGV]9/ST8^JU*]X^L6+I[6#8JC/=:G\7(O>5HA.57(Fw
M22$X0@?-\='< $&5=AWP8-C&4\Q'(2)KALB!W4K\&YA\ZX0YY[6A2I@:".R)v
MO^MJC=]EVP\3\"U4*JI*"9,T\KTU*I\*:Y4$*O5D95-DX]%Q< BQS2(:\W4_u
M6V0XW'SJQ (U<@:!-2?IV$EVXX!SR2&,),K[.\*V.AA9<H,*UFFX7T//\<8>t
M63%/$]=Q(9Y"YX\F 1["S,<BK;+=$D>]<(!\]F!K>#%PS]V^92DY7F$WVGUIs
M+30- Y ' /7^CG7:@J?3S?OVJRE7R;<5B]I2>,L(2]FQCBCA7H)22::CB"PEr
MVRG(!-=6::6;@X!E?L&4<@GP[DV[^*#1H!TH1OA?-QI?LP$G9U=5&\"\5+;8q
MK7D,)?N/2E_R^^^BQO*;.LLU&;@,T=5**4N+2WR%"W:$X/1Z.&1P6"B5J.&^p
MQ'W6"E](*T]=/S2 ^[8B@YYI&G=;X1@VYP!AG6*6ZN11D]A+RP0DK/H/&1PVo
M_$E'[A=R<-BA8T$!*N!4A%B%+!<)1[=@:U(Y<R6R[9K(ZYU.:D+,VMI#>V&=n
M&L#]>U5K!3=+UZ^G7]/)^ND;A9K<U#6R+D0W*X5HA5L@2UQW(K5#:5?.I/T'm
MCJ1=.Y'VO0?2?O \VBN.H\R5&I%C43_\=%]4#^/?%"+"MK5XU'YP6[Q:_G=Nl
M_65H6>?UHT8\]47PJ83@H1!, #E4A443S3UC-A6-;\-\BI=3J1-F=-D33C*3k
MNB] 0)V &OE 4/!5$@258(&S'$B$'+J1F_@YM59RR/-L+,+9S!^'<*[1LN((j
MOV GW?I_)3.K'8ZET@^QV>+N]"3WN?692NQ\WXMW#QU1J=F#2[Z%0#B D"?Vi
M?/H)@P(=TC) "=Z/8!0PGRZS$.F4Y7H3;R7R*1CWR50L=G^!X5^H[KW5V\9[h
M@YU^7UX<R(M]626'H-;-PK\-N;6H;*=%_^)X>%V#J1^H1L!=ZQUR/#1M$7SHg
M#K8^<KN=A,#N93_.LWKOQHHYJZ=4L0(*)%:5:PENAZ7DE"(G7@)"8(B(0ME3f
MRY/TCBUFOA-3+SC#X=EC0[J7AS>R[YM9-+"(18-MR2(WB!;95#<T;C^$9SIQe
MV7E%$XM$CS)58B%89?;*6']H%*5P3&C')Z='[ZXN1"L8JMYII*O\@E:0!A"Md
M;7N :#WO=M45,'4QTU_E2J5%M22A5X>,H/,2&18'"5WY($]0D$E*\SQ9".SUc
MP;+34+HF<LE46-!;/!G,+:9FKH&@&=,(WKAHJBPRJT947?2W5X*1AY96H<P]b
M6W"_'LSCV&A/)-&8'H?RE1*6,B*HUPJ0E3M6'WN";<O&'X @+[$1982'JAM\a
MF-?^$FP1(ED4A8P3-$^Z34Q",J9.-G*Y/8P<LWSNXJR#P_.SM_OONC11]7)Vz
MNH:\64)+4+G3"]2MGOU\8-I]0 W^[\@F<O*:0$A+_18 EM>+B"]$I(P/UIT]y
M_D@,A\ _HY"G+#T63:=E>YL&2?@<5N)2*%X"_I;NDCE)07% XV\=-J&I/W'2x
M,3YQK92:R60W%U$B2RH:6:ZKJS]K?523?FD461+ECQ?0F /XN/F:--D14B6Dw
MZ2UZ86%9/3"0[+I<PV AV4;]*N [67/:Y0Y+F%LY+G1(15##JP3>!LSM;*&;v
MEQX/%^')\,?.L ZZ"Z8=ZT7W7$(JCN!E)#<65V\AD1,7ES\="]EOPYVP.D7Vu
M8&-G3AAO>$:]RVHH.WFIOL?6W\%F9F8>&4;<7O4VTP^6J)J&A3Y5UFV6MPBUt
MM3:5WO!'$KK+?<6:ZF7ZLMK(^C@L/2!.1J7[Q 5XO*UG<U V'K'^-^!;V/TMs
MH\-@R&$-3""-+AJP35'MQ^YR2;N55JQ<L9Q1<$GC'R?H:25F2979>%G)(7 =r
M?+%1H**AHH7QPB\+&&RUU/2GD/?Y%@D</J TI9R*X1"QKTI^BN1_P%01K^'7q
MP1V3/_YE729 R)38FR\!082$F!L,GP\Z6 &%T #XP'AB%Q<;4PG'TSHKILD(p
MG4_MF'X"PYN8XGQT\>KGBTH(CT OQ-N3LY&,/R"-P[&7,LLM+/S^Z='%E=#7o
M2XEY,C9VY?)/5/$.?-V3Z&[=5!DZ':'<&R!4<BIM<RE1JNQ$V7)Y NUVJA*%n
M6NEWQ34B"JJ49_J]%2BME.9@A2B?O %B51H1?.'0).OXAUNP4I$0( V$:(T=m
MO"'S@^<\N6LP!)LC%0,>)*="!REQT9 K:^P%25K1:ZG*SP@Q+.]* Y1+25:El
M>'YT<O;3\1G.N;K8/SS2)0VTV2Z9D)#;&_,(R="I'+]GW3VYPPH&MP\&7,' k
M;G*J/.(= 1>KQEB4SL&1++ENA8W2WW$91>[/[<GD]2FQ+(E3 ;/LX4"28/,;j
MB#_Y-R!I,I,6LFQ,?97X7/M4'8R!Q^$S_48%QDDG@K%$+$F7WZF?RW6W!MP i
M:\G8ZE.CN"][/DW1HI^ $8N=WTBD9_ASQAN*"6 T-#$B 1>C3B+DPC\/<BXLh
M0+:3!,7J@&0>(S*O8LTJ.QH61RS=G0%&++W!<]47K4$"((-@F[_1#RPG,=<)g
ML8L(&42.6^4$<)P>O5P^2WTJ_<WQ=W9Q3@MLJOK&HX:GA,1LGH8W&-&!&&VIf
MXD=U6*;X,H6O0O/E#KG0^L)@753 U'D)G[F#\1Y-LNM5TEJ<I8H+M:T%C]%/e
MB8JX3QH0@0:$.J:L@=GM_J.]+VUN(LG:_2Q^1<'$T)(E@4J2Y0U#@#%+M,&,d
M;7JF+T,X9"U8+[;D5I6P/0/SVV\^9\FEJK2XN^][E[@=,X"JLK(RLTZ>/.MSc
M$+<:UYH=$:'K]3-JDGGZQ[WZ'"'/?D@RY-DTG7I,,I<AP[=&E!P9]>-?@ZR,b
M0\%5I).0HCW:;>STR#3\1"6%G=YNCP=2BT:L;D>EPF&4],4]NQ0LO+/H,?K\a
M:,3R*PNM:@O,WC4BZLGS%Y]<)_6.N3=A]Z=GMIW?:^3=G/#-H'$U#MO _F;:z
M/,3 257 A4P_U]DVU_DVDNN&U_&_PMN2 4=3_,>+YQ]9_0B>OC$W82^E.VL]y
M\<*;W3+LSBY2B5GSGN';W"Z\(W80D"(H0'H@Z\,U6?'/#"T,4E@FSF:I'(AFx
M0R"\X8*BX(8S1%8BL_AJ.ODR[5Z2$W[[L3HK[+C9GZ#[S8T-G#D0S+QG6!MRw
MWU@(O)"NE*R8S&G-56B%_YN9E4P0N;.[T7AP3<SJ*IV6)9\@;G)T8MPR"E;<v
M8B6:]@))"\-*5OGUC%(KZ;!.-C7-ABJ1>_)HQK05.8WQ^ZZ1?+#5U&Q-!"89u
MRZ07E)%0)BJ'843BM.8%#DY1=SFRHE#$TO..BR9LB,K'48=QAQ:FW6A:'N2?t
M_QQV".VPBO^+'XO#*ZZ,3$%>+<T%OHJ2B\'@BL[HL60%ER6GUEFO/"=V&(1^s
MK^KW;2;TX>AP+UJ[$KE!3! LHR8NQ(9L-4A8<BX229Z\,ANU:_1H0T)]->QBr
MB?7Z;U@_F.95M+H\_4U,]5?,G[K]OKD$)_^O[BID)-)EK1=?S&A#^,:0-TR!q
M!V\/20U2)2BA)FHKI"2M+C4&59"2]87EA>E,J(4NH@OV!T'VN1A0+Y#B:Q3^p
MC[6F-[0DP_P*>QJO[Z81_$24 VS>=#4Q'6U&[][\*SH^D6^_WJ+L,09.H$_Oo
M DXF4SUZ.%Z@AU'C"I;[J_G*-H,L.N]>7=VZ/.-H31.*B_908X?A D87%W3@n
M\\.W@_29))![Z2'$3&=#%7 2[&D9E<R@0T@99@J=#=W7.*1I\'*4@/SM(6)4m
M&3F=93X/,ZW >LP=;B-9Y:85\RYMY.9'UB5[PNA]C@?&,1\%<56BC\78PB(]l
MDN9WTX@;33U;:>S<7X-/,.I+QWO# T0*.BYGA]@(1N</KF'')?8>&!YI48S,k
MC+R/LZ[90B*9)L#P,(*RJ.B\V)N;3"Y;'2OS97+K(UC.V4YF)/'K*5*_#3OFj
M6*I(W&S#Z6! ]@86)(J][K2V%' W'GC!#8.^BP53/G4%5\ILR&RU)+9[,S&-i
MX<(IS((<7U4_B@@R98S'.ONHA02"B9LFED@N7H0M,E?'ZY1(S6M0X)6F/I]$h
M32-44@X3"9N<NX6/+[<IK\O_C6$^;E;4KDC+12R5'.=L"PU>9'0<W&92++JCg
MVR4J:=8Y/B^S9O'H8Q<R_X0'((E&Z2,U5&-F/&J9?CLFU (S_Z8Y2'4!C-YOf
M!PEZP[1X!WG7Z[OVRY-+48>763FSE-Y#:U'<8&_A8V4KGH% KI ?5XRY<WH5e
M$6>%ONU22? 9>47,RZX1:@:.?"M\B#+MK8V?YD2&;S"VZVX2#6?XQX"_'QO$d
MA"-'S0:-9]7FG8;:UB]-ZU$RP'F6/(K*?2,^&?Y[B= 4(]'A3,-Y8![6!\C@c
M!A]-<HZ#&DMBY$**:S+;:@)HG.LNZ;+ZQ/GD"SMP^$R?3!]51!/C@!*:.X6/b
MT$ -C5OWL:Y]L^&%..7:=W+?JF,IE/R:VG"]8ITEYOHHU<52 ?8"(@<I\NM"a
MG,V.$">P-1QQFEG1V7@!W51=,+? U2B+*]ZRZ/RLQD:D]W8W="QNI/8B:F Oz
MV=[$,W#R]MW^X4=SH*;6T>&]YRE\X3)-?_T:XO8 QS<BB(A096%1U*X6<<)My
M>:U29CFI4G%^7QU<;S;%APSE((D:<HQ7&B]\FQ7-9)+,NU7UEIU>/MX_V-\[x
M<;$.^1%9RXXO*G)^[0,;>R*]013[3DA'M?R@=1RE7G?<&USHJ%.]_H/^8DT[w
M7F=?5=QIQ>)@\<4U:Z?&_F9/)L0SH(88;>AZ,OV:<.1W1F C."<*T"'^F42Sv
ML2'1Z!2[[I3ZZ7?3;L1=]6\?&4%Z+3HY?'FX'8TNKRX&EPB2(DB@21(!6*P6u
M_0*"00"L]8,Z$V(F95-FUMSDF5'*-&8&:8EB=PH#=\P$*C!U%-_=WWMS6"&"t
MS)A!ZS:252)]R-1$*<J2G5P>.FOTX:EYZN#YKQ6-=^0]3)/#<B#@$DH<]679s
M*D<L5 ;,5\U]\V $E#,VKY$I3W*.Z,'<^=4=WY*ASS?IW6V\6!D.]@$]\>C9r
MJT2V3U[Q%LM!G?7U%<1F0]TK2LVF*3YVH=)H[4 B&..?&='KG$#-/-'+#N)Bq
M,!0_H^&,6[6XB<%#8&X+BY0WJWB)?P.-*91>?<7<F8&<TXJ%W\!;Q2:S5$70p
M*C?962*CBWQ."U<DGH_&MH6.NJ 5+^7O$<+K.2%\I.8G.Q4V+E*KE(.==V0Ao
M=1%'8Q71BU:7;RESPK> ^[>SN5%KJA9# KKA0^8#IDCHM%A.OAYO!NND.G]3n
M\(;@$X6Y4JK1N.!.ME^%^JJNW _XE 1R\KY%(*R3T"NT:1\+$P*>$F)M1(CDm
MU15'V'TR6&J">%GIGYUK%3U9,J07.DH+::X>'B N2M;7T22PH(@PEO?1"!\'l
M+<B<TN@9<=ZYP<1L?+8.7!M(F$+)$%0E+]Z01:5H.UJ^6%5[)HLK+C=Z/8/5k
M?T^R2[DC1M,?HAFRB63N#-##8KW,R]$Q79(N)9J7QE'A!0VL=1FLB<(',DJ j
M5=\J1@'#8ZH3.2IUL34L%PXNKQ"+-?B)4DG&H^3<#HIVV4:3K1V;[4TC'#8"i
M4Y>:Q-3&Q1XFPM/<._Y,<?LV@(K,+M"2K"TG&R7 _G%D\V@: /MER#V5^H[Lh
MFOK%"CC^3B;=AY% 1FFBUD9K^+="GNP1MI 5\&QXZG]]_N)%5/[5',#/P5X&g
M8J!Z,?M2V::Y(\M/(-HN)I.O+ON:XY$1QBT)B]=3#.GJHML;D)&)/LPHH5[,f
MY'Y*M)\1!6D=';[CO/1H,H.-_1M.81K"M=%I-%$3'<\2X&(R>F=$A'YQ@5 Ze
M\UUO'MEP<")3X@>Z=3?H^"Y*YW,^G\Q1,>41/B6_.:F#2]L^05M*:#O0?6=>d
M=&IDFO6H(/G-&]TSWIGHVDM41-2&EZ57TT9ET 8>)-Q90X1 ,Z)$N[;Y5^H2c
MB4IA7IP+$* W/X6'C'W_&3J)=C6:@AX!;9'E&+,L4TI^[O]L;4681\+!BF)Ib
ME6?+]/?3IP#&14Q"8S@4M+L$RP)PT2.V3MIL+'^2R)!A0S:Z0>S0)@:G/):Na
M?M^-Z"*'C\X9+#%+-.<QF^8%<W=N46_UU)P;<@&!(@9XS>79"+LQQ-H%)\#.z
MN.PF9$(S>OLWCNZ\ZD[-H"=#@>GMFET\D/RV@L@7QS>H^9FR#@D_0?<4%I=Ay
M(SLY/L$1:"1##*[U\?,1[5X(WV;!Z90GY24$R>1$'?.F'894-)(+C]W,JP=Hx
MS<%C)S1D[+MWX&03"9++PG-&:\F7_*V ^86AB[/>U+ 1\^>.]1$,+R;7XB;Xw
MHF%Y#[/ZCCH#^+R<:#LODDVWV*?&3;/QF7 ,FJ#K\LGIR7.C,+S[;M2ID^.]v
MD^.*3Z:V*YW)_$=(@F:#H0L#DA.6TX@XQ(BF+FQ/NC0C]:"3OP.:^<WS(_TWu
M@S)_9\#F[[3[]<7?O:'L_[+__H/Y^_#ERP]V0,Q3B90?TDN"SBH5+WXIU80Bt
M9C 3Z]&R3UDO_/U4P[,+VII^;</<>GBRC0Q*1F(#/&W@]ZZ1DZPRRXUVZ-2;s
M7?69_4A2EA[=;! C+XJFTV3 U,K6<D&#"X^:.><,L_C[;@VS2U^Q"8GF<.T-r
MA.?"J-7CHRZA<[+7'0MR7W3=HKUK3AB GMPP[DK%I<_1J[[O%KU+;2J6PG6%q
M_E,TL.B[-"^5)Q[UYMI)KQP:Y25T%[Y(/YCV[;IV7\EV%GYH)B/_6UN7L]>'p
M1VRK#$8[+1R/W/2&A#_\7NT6_$]^>^AIZLVBK.CMW^?L6+NEEDMU1?K0ZL?\o
M'SKC2V"RYF'^TQ[US?:!=]A[9_W'/?^L]S9\&3V8)UL569S"-;$, :W1?]NLn
M$IN#S:$Z2I$5]TPW0*9S-&\B6E98G!&QF,EE B@7L)I%FY?DE=QE1W&3:Y_@m
M"GLPTX^;!\4$2X_7)6OPKMMVE5W[HVB6P5D@4PRNZ0 I?L]9#-'$WBMA];_#l
MFM()V0Y%WKM/$&C>KK/@/=07GFON9#MOAYUD'^C<B3GEYUZXEF&;>0OI43.Ok
MH?OMZ_[^*67;VYGK/ !NNJF<5B9?^"2A;ZS,_=QCA?S/WEXP1[M+98[N=WX*j
MG<:"*;@'[S0%]UCQD1(P$6\*&,']71(7Q4SBL4+LO!K+DSXWM#83(5:S/:V<i
M5O!\EIG:=[LG_9VDYIJ['\_+)55MNN@ =T+J;N$;L\V^NW-W;FM[:"Y6N[Q8h
MXRPG-JR;?VP[1>''$G<(JQPV,%F0V&=#<5UOM-JUN!-5FXUFJ]:,O2(4FN.Dg
MT;%%@;9SK?(2E\7>O<3(E;WS,M?M@+VJAT1MQ0G9MD :8@8NVT@QSD#TZ&%-f
M#=">A=!&0$9S.XGT48YRL9:^->N6<%&H=FQ_/WI[LN\/;I6Q6;QC* $3:XGPe
MAW?GT?%WZ@!2U'RF3L/FE?U0=X,UWAOIVTH]XFL]FQ.QS".@&B\[\TS*3H)Bd
M5[;OG A]$UDS:]X)X-E7^::7L17-1EZ@JL)*(.:94S\Y2$G*/R3L\H(60!5;c
MNL1AM (+U 2"3.)EVVR0>;/9V-J A\=;-\_&26?/#PO,HQC<)X8(#D^.]]^_b
M#(H=R;5(JAU1L:,8U8X<O W1D&NZ[5*Q["TJ3K4M[Z8OY7O+Y*-OQE04HQG'a
MKBI&*1=-&2TC@S_X=3DZ#)]5\S%V;*Z:OT9S 8T 9!5USSC ;\!8&<2CT\D$z
MJ"<BK:J6[<0!3NKPP892"S8TK7DOE_1#RI/0$Z@0>&@.E4[N1J4N7DXV_=2Ay
M33F+/G_"=I-B\9IQ>ZO67%=7=&D\N); Y[7ISK(/2*G5AMZO!YPP-DHI(DT6x
M&G$KL%Y)M1'1FON3 =5X<HO_;/Y"F]-'1C-WL1D8W%MF&1=;P[],)GT&#6+0w
MV 2!U1A8B!#$H5,R=9O0GUV-7$OXRF2(3@[.FDG?(GQ<.X1&/-(@0.E&Y64/v
MY 3-)L7-?EC-.H.\9$E+1J2'.R&T3D>HF2+V?53.4A8&PN]-II1J0^!X9?,1u
M*9H\*PQ4-!AG@<Y;L*-E%Q>(%A**4G:>O&>Y+HU$H<KP8E91G?,2$1: SB Yt
M%RH"-HNU:3^V":0 FA_A)9(((/+))HHXM+!_-K:L:Q[UU))D8%;QY<F11*((s
M(HR"2H+VX+.!1RZQX4U%FVS7.RQ+I</A\,O(*/%E>#,TS]K3RCQ#EZPK]L^\r
M$/A* 7YBV!^;%?U>JW?MU0U^H</%\[=(-95E'I>Z-HMK%E"Q5G1"6&-:MJUSq
MQTCPD4U;MSM^-\KN[.+;=FFBA4MCF*^MA.469H' ':2>-^Q F?@V*#ZJ&6]Mp
MU#HV<"[7.O"7<Y;+IY'1-Y2CN'&( &O;[.@:+QV@ER95TB@N.\S-=3YCC'2Ho
ME2$HP64ZN<(.V?Z3M\A8=TC<^/\[A)LU[K!#&@MW2&3_7$ 3C$$ Z7 +G[T5n
MU]I"GRS*>G(FO(?;_H5CNE M$"2K[NO?EU @_/N)\OU<.JK#<127?N#1W_$Dm
M8?45_EDO=GB04&5)!G/>0<;:\AM\:GS.7HD_:\KS/"+2.;@49SL;JHFZ'<R/l
MKZ@\7\_&G:N7+N?7^Z;9'-72G7*KZ%C/K63]SIJ C>OQGQ-A0OHOD#^6A4S4k
MS2K\\9 )]/+'0R;02V'(1%TBN-F,E^-;T>*3)N_CLD^%#* XF&)QXTPT1?U.j
MS,MRI169U^*0BF)N5O</I;IWN!OZ&(W+G%Q7U\N^[5*S^4";]U,V?^0W>%:Zi
MIQVGQ\.W3P318./!=N1J[*Y2'4LRN/EF4_1*#S]5QJN)+X^;(MMJW]G;_ [[h
M2M,$+?VK>"5=CO5R#O:.%N/W>YO<PW<**:GGEY-C2B@]W LJJ8MR9*]S6(GYg
M>:>XDKJ/"I&WL]0]/DJGPK9_Z5@N>;Q5"F,7<U=FHQ,)YI"_7+3$'$9<S^*/f
M4Z1$O12&2OPW<60O'&.18!M$:>"YE4,JYJN+O%M74 VEES]$NZ6%/M)Y3E)Oe
MIG?PDNJ4E[E):156]Y-:CI;;44RWEEE;O\5:.7OBD_PA3'.YGR%LMLS/8(^Sd
M E<DLVS?%9D5W?,N1_>,N!PSG;3#3K(/=,*S(7B'[W'+/J<NON!MBWQ\_ENRc
M3K;ZG#ZR3C;Y;G=P4],3*[C*ZKD56BL7DP5D?&^'SST\"X]-!4-US%?CK^<Gb
MDW(,>QC.G6:PH?,L7-6)O8]'QX>O7FV'%XP<3& H#2XZUFRUUFO-+=_X;I59a
M9WE7D_O>WLF!$3D"D[M<"TWNS:U*KM'K_9.,7;Z1;W2<:Q175K7P>SWM'QT=z
M'F7:K!=Y 63TVYE+9JS92\>92_0*7.%CKQI8X*W[R8=N66(Q+S3B%C S'C&Cy
MED.&UKQ'F"N[8^;M%".6 "F#<HT0HH5<Z833DJBVM$,>\/*32U.6TZ:?FI^=x
M434PUXOU]?':J^<'!R=OCC[2HTIZ FNQS48.!B>Z1JQ[=Y9.+N$(I00UJMK'w
MKD(L1#H15,Y[A,)C2\YSW#KELR+Y<]2'T;R/T2,:3@AYHTUVH-;&NLVGE]J<v
M>5>,OY8 [S+"RZ]^N0!U4'H9"H7!H38/G-$N/*]J)<3=F;.]%R55/-5T1Y=2u
MH987O_Q/'J\X-WJP(<U=I/%SOMHVY_@);A%I?H*"]-?^@YHM>!J\SR( -1N;t
M'5[OK5;H[/0YD3<JM]Q_/\HO=W:U2=NS&DBX>GEP^8H?)I_M;>[L.0?(T)R s
MCT[&*TT\;A(@2[/=:DC:8@9]%%1W->K_#BR6._COF8Y7<AQ' A;@)PT>'.[]r
M7.$,A/I3)$J9 >/K7(TX7X5G:F:(LZ&-I&1-[G+=F..;.Z+5*0(+IS!LJF@_q
MO@40O)?FS7FJE*)%5DT-/)2]9-YR,1I_Y<HU<N%JDC"WXW]'%%Z,_',S'&8.p
M0\,IC'Y'S$W0=Z+R8[.\C^'%%^9&M 1L2\.4ZO6=\+T%$#;^IJ;,.X6J<?!Vo
M"L)B4>L<2^?3.77P-@Y6Z$<^BX>6O;5!69K-SI9F:9J&PR@'#\3?=1CR)Q?/n
MSM^*5U'C%CRP5\8LU*M83QO(T&S';1K!1JNI_E 8FD8)2I;:(0S#3:+:,[Y0m
M<C7HC<"XL>GQM8'G,Z)  !J@S8(!:!06LKQX:UAFFJ][Z&-,D7HRQF6IJ>PTl
M?_FDU2KS3%_H"IT1Q&!7D;C$^T@@K-,DI2DZRF9.&KIS?=+2=#U^'>,#J6$Dk
M>TQH(%,QJ%8 $[P;)?Y%^S8]*TKVL$6@$>E$)\^/3ER%@Q]NR62/Z))9*F%Dj
M+MIUF"X3O&&C];H\(9/VTE?_K:@MEX/+R?3V/O8NXPN".RC[O&:((/C)9U<$i
MCNU*6RO$+\ZVR<5 ,'Z;!&EB_K2H+E;<9BC*B'<9C]H'%!M15HB8(4=C\'_Eh
M3N7!HR^/HI/#8\()3RJD@;)QQ<$LTQH2RK+&2*&VDLU$&!D^+=(+^ :6@WL(g
MUC_WJ+J]5WZ;@[SR.$@[QJJTVW]P5>18//PYMR+1"DM"H5F_<TW"9U=;%/^9f
MW*H(\?0-.8T<\;0ZM7B+1)C:5B=<*0:S"])*)\" 418AOQQ_91$9%T]1>G Re
MM@_L>.VUH2#8K\ GHZ*E8ZGF;KR07/G+!)!Z,:="W"=9VE=B=@7\MIC=TH%+d
MQ=9'8UM.:A76*YK'@K%$9=)W)DC\!A+1(#TUS(F5B\HS[P 2T#I4:Z'#W1M[c
MW>>"$$3BBG@VL13!&CWQN/D<9IZ36NGO#WM2W% >F^ECTG/-4()<D8'XK:=Zb
M#QZ66G2M/Z]M899Y9P8I)7;IYQ\CM$29HV2& BCN\ I6:3?J^N>/(%1.:VY<a
MYN=U-K;Y?BB<OJ'*=%[_2TXL-=IG"2_R1:RA2Y2.FNM<]XDK7"!"<7:U+0<9z
MTT]-M .0%<ZJ[I?N:+P<!9"[.NT;8;=\!4#?>SX48* G^-5#5E(.(,QD-Y"Py
M$Y_0N$X "$ON+%@\DLT7;K7Y/>.[U>N!G.[I;O7ZPITD065NZRD#S7$?E?_Ix
MXLW7@0T_^ J&6G:7/2\/?ML>?PB[Q7<_[_:^EI]5MCG2RWQN\ :%@+SLHH07w
M.2 ,40QN1HB,Q+>':M1P:;_N "*"H0.HH>2J):N4IH0;,6D-NX8+]@4K2!6>v
MHA6<#JA.UBF#+Y<?DCK',RP2PEVU&C/'0M+6<N@(Q5J5B,_B/Y^$/5"IB!";u
M -ZL^$=47,D#A_IP6K;X4!5O9PGU.L4MV!**J%8D)U!,+P+7:I)4ZXG^2M/Wt
M4_D(.)X%IH<*WP'U9C!&7'[J+&6Y#>\98_4K&^6O._T2J3EGN%.XD2EKRJ]Ls
M<SZX "+F<#;NI2@"0/:9">N7VWS6T;\9J-OH^J.>V:9]+FXC<=A<T(6Z V@Gr
MR75]B'AGY(*?]$;T""6!6RA4(^FA&-Y-.NW"$6,TZI31*L8#-.A.;UE\VFH0q
MT/=&H]9JN_HW!?)*3J$7 >9NI!, DJF9U5L^0SK_DEW/V:D16)6%\48!"Y(4p
MNDFD)H$::R= \19P-OW4IFNC@GAH#4OD F?JRUGZZ(QWMH5 _+'&OZ(3,(C^o
M74+-JK\^97;IGBO89^O+M]D9U;RS9[ B0 DWHV5D2!UN3]!0%X/45?8++0]Tn
MJ5KU%W%'.Z9@Z2'%2O/X',5K9T4;J#1_AW.U4A4/1%7=IJ&._.]:FK<+^2G#m
M,:]$!ZIIJ2(";DEJ-FK/-YD7'+6''[S2@;G[KPX^'K_)U!;TF)@-HLZ/TD=Ql
M7<[I_K4HXSE_!&L.5!0*5#"5%:D'?)K7\UU%JY[F4>%I'N5/<ZHHM<6Q^AM(k
M%EE7/#Q2?B28_AS1[89S82"W*"%U"2EG)#<((!*W)D,?+)(A[R8:!?Z*DMN9j
MH]7G<+3QX/H<RE$]=O6#%[4B%C!'T+TC,XQL>0&[YC;3R;LD:^M_%QLX@-_Bi
MH"H2P154#A;08M=%9?$FE'@02]X_0FF<#9[XH%NM)HZ1N-&. P0Q O;5LFN h
M$6/>PXXB.F@\'Y,U\+.GB7P-?X6U2! 2Z*D'M=YEO\*N7HIQ*!BZ::&L<0TUg
M-"J6Z*>$6$X>.08%S6KDV *BD+E]7M!?M31'I1>^@\\M,7>7H[[15T&J7>&Tf
MUJ H&O7J0=9S[9H+PUERYDX,W4P*BZ&F*+AHO$MDB-$08)Q!<L]J'UY[99/Se
MFAM.GFE-3-,YPE9;[PS/N\/'MXS9^_R.,Z_Z>N6\]ZJ9H=QA)!GWVM1#X8L%d
M"1^&+&OR*Y'+X,J0 1D]*)#=!H\/;;0U><P(S-F<U!HN09+#<A/D0WI0YXB'c
MYICY2LNLG[F.O/R?NPPD\@?"TWIJQ4V80Z;#_A5B3 @E2!,/8"6"O8 7DVW*b
M<7.]]=^UF&RZ_!-64VV@"Y93RQS>:41+E_5ZT;**\95K# G>\0;CL6]8!Q<Da
M0=%9!,B=(I7-V7\VZ4X1@#,:IM&W[G34/;M@+&2Q?W)T[=>SY'R8DM43,#.,z
M,D/,4IKY502U6 X78!!'(7/!6N9Q'AJ@-B&1&DX,*SA#]4UG8ZZ,^HT+> :Ey
ME;C.9)LV9'6CXVCIAPU ""$\VXV&C^OYA"*W&FTY623^R$\N<QD'98U."HHCx
M>K$,2&1!( >K*A21T;TPUR4:7#H:(5 D@3XH,7?^HX)PL%I=QFKPZH*:1.ZTw
M6SJ0JAM(IB,,2;FBGPLGSD[+:.E+=,B5O;'1EF"%B%5$?67W;'0Q2F]5A\WTv
M5];92:$Z-\5</:45"U?:2@8C5^*(?6.*^K@9KV/$FZU81BQ.X/Z$Z\0]^+C]u
MSW^^W/_EG_]\=_AR_UW\0,O04<WR\C^>G\!*4^%T;2OV<9T9TJ 6G?O.G$OZt
MT-U<?U%1^@+7<QH2A"M" 1#LK_#)L)Z@YJ*L-X2V&EC F,. >'X9^]P9B_(Bs
M [(DN4$KMF7=YB542WV[CPH@L*-9H(1:-.8KB04:'O= 4^1M8G;AU8F,>/!Cr
M6VF8*IR:GJ;P*U"I(:F2)IP+M8?DRG]UIZX:[M;F%K&]1FPC1TJV(#/6\_35q
MP<_ZI.1ZV?B9^U39\/*JS/>1S/SE43?A>BH/\.2#6EN0"DK#BZ]6\S9O>/0(p
M>61X U7)E%VU8M=XA+MFX<FL"10):4JE-@75F"X9CF^7EXWP(OL3XV\TMKA<o
M;*L%2 O+^WN3J]O,VB6ZG, !M.M8EX)?I!%&R$JUWU++?-4I5YFO(L=OUWTAn
M.KBK7A<U76ZO4:9;2:(F3$0$TG'M 1HPEJ86O1N]/V&;$C@7^D9@G4 EFO<,m
MH]O)3(L5<*[W-9>K& NT,:S,%TFT70D00E?\+,)+JU5N5C.;T9%WM514@M-;l
MGFH5"[1FOUW FB@7A^;G4:4<Y^ GCSCVKD/Q*AU;B@=[QR@H7*D$<@:TQ-FXk
M5XE@:Q*N@^=A<J*B.M;D Z1&O-/L,C4'T4;@FJ\6_9#>0#4:HQ^1V 5W&&2%j
M.A_AX2F7@?VWCE@Z%!FD3<RB;7D%(61_O01,<:]\_/9_[!^^*DO/$@W&J 2Ji
M5+M(&C&;6"M5(PB+23-;@"L7K;>#&BSWM=8451FS\<_\^M./Q_O63%#*-R3Lh
M/&EJ%*R3MWO?@R=Y.*Z$<::3HD$_]!IDQM]J$-Y%J]'TZCOZ3#,9=*>]<\KMg
M*8D3NC])^J.I"%3.FU!GWML?7*1=_!*+Y. ;J@'Z9DG]Y-R4*G?BTISV-1X'f
MU"::N[4;FQV^<\\6!(<&Q3.*J0Y!J]G0Q%P1(BG%C:IP3BD:PFR',95O5M*<e
M#GZ;#9(T89ASGIVZNB]&B020T:"A*>)2_2DV1H7-9O)-K]Q-[ K.\?E&QZ]<d
MQO[8L2XLKB<:=<=BI.?I)ES0-#W'F8S3:4 B%&I4I!Q[.QX,^L23NF:3)8S]c
MP$:Q"2?V19+NQY1LYG[)F7O$]SC\MGM+/5!=+X9BIV-$"YP@A5D1*AERM50?b
M3VZ$JS&IR9SD(^I,"^S1_"$KE4JP"A&A+F@_])L7V_;,U8<C!MSFU7\"5C]*a
M?TJ,EI$D(Z@0-!\JUS"Z9'FDAY(SF@!))2SE0S.9-#>I $$+:$Q-;_/26_G@z
M]3YQ5-U5RH["W2<N/#7'F\E4>+35ZM?N+7R&9[,O&GW33:E8')E_V-.3W)KOy
M>ED#T.:E43WZ9-H<3%5B4$N8&#.%4FV "9R9%.5JE%D*]B1J*QX2RST<HRWKx
ME+7/(^V,-V!9RLK8G[1-F?DDL'-(S3NQ ]H%4>:,.!61$5A(4O/NO>@OHW'Ow
M8F8F\,#HP>FC\P?BQA]<SB@3Z;)_V7"UN2=!O?-W+]\U3M\>(G#? N*$U[QTv
M@==O/G[8.RA)OD!$"0-;FYF<@N.B1MD\A]?'AZ].]IX?A<WB1C;5X7A.N]A+u
M4K#08;1#3@=3I!Y@EUA?;(V*^V!MI27$W$'22P:_^4<N"?JNK53#)=ZGBGBIt
M46.]3+V!7Z83=IBX6VP*#BZI?9\H0B\BKGSZS27/@ 7HO4!= !.,6[7(_+\Ds
M1P9(7[P=N[H5[.^MCM&5"6^"'M\[.3HH__3FITJ-JU_1^H@6M4Z6,2I)S-IWr
MS1NUT29TFE39!6'AY"&R4EQ?X'7=,^8Z[@% 3.Z9"=M%L(%T__AY_]<(RDPPq
MZ^4M*&II-IT.QNG%;<YE!:\<MT,Q'XPO(:8>Q5)7<3P)Q*8?M(F5WD[-(I)Qp
ML4(V??S$4^7R$+G$/?,'*NP(IDO<(JM\LUUKQQH:U^<8_@AJU?[+[^\/]_?>o
M'-(&EQLGI[".?)=J/+S5U4\_%L,8N7]%S*!+5$J'71',L3$WL\1[+X[VG_^,n
M<Y6*[VQ'\H5H_8E":MH/!$<W;2\N@/-]"10:(^14L>=__WYRRKUKXD#.!5M6m
M%\AWZZ6Q#0NR.?:/]RJ<J2"+]# REX[W_V9]J)S7*K;!QHY+#7(F.*DVY6IXl
MB]9>\U)4[GO6D\ ?SI+^_)I9KIR54^%%#RPLGN66;YZK.%<@*XB>\#U#L_$*k
M4Q-KI4:JOC]^M__.=SR(7%4TQ?P<[2"*2G:E6KZI3(15<<6[,(.P&EA8P\M[j
M@5IB71Z?C#-?TTNUKI6">CW3[>]90/H&W <[& HV&LY?AM&+2D[2O6:X/K/=i
M<K5@J; K6UO(!\?%^\3WS>Y1Y0V[]"!Y.@OW"&VBH@=^S]X2KU&A3]7T& E>h
M+>7"#!/LG8<V2<9(45+A4CG34P(UP14'*#$GIZ9BOLOT&UDAGTJ5YG4R],9&g
M"5;+CN=VS?A=Y<7<H0"JV :"D6CO^6WIY7-;\] 8MX)F[KYZX&;"A3,B)2HJf
MQM.7C$.IR%POI!S4<0_Z;.RH.P'BZ]&@[EDSS4:C',G)4'J-;(+@XFPXSI&\e
MZXBK@6=,H1S-TEVE4T5OX8R!%@D\L2K^+SZ^WHZT,D\H]1BA8#*],H<P\HP d
MQ/3V]<G)X<=H#;%0DU1J-QN="L<5QQGU:U0)D^/&;-3](=E2J&K%T /N?W2/c
M-A#8PCTMIT$_B$6163!-)[,($T\YGSC,-,OE_+!$1\Z55M.5>54N^%^3,\7@b
M)(F;(R',;/[:9WN,^_V@%L8.U$(2%I/(5Z/UT5J5@[LU72IF2C234S/OQ,K_a
M-MEIBP2T5LL.EJLHL^M3*BBSA59KL\+ %Y1:3@F.T$%%9.])!SW[+Z9AB' Iz
MVZ@@+C,BTO2:RQJQI6.+QK;>U+$MC<LH,>0=93/=9T<!3)8>#5;E1[EPO!6My
M&3V,B@+"R%H 65M$-YO79>4OPTQE\"VR,[4V.CIX1<V4ME2#;9EHYM;HSSLPx
MI,:C/PUS7KQY?GQ*7L<7$@U!DP P)XQ-FYU:T_IB/>:!&AS'IRR/TD)8:-!\w
MX+*V\B/ZBO/MYRR!2\$6)QH5T32BY!$\%'[A8<>Y"&C88UVHV>NXEOI%&(Z8v
M$IX,G9[/$#AG^E%3Q8[ OYE+_"[VBY3Y(R#1F_1_'V*7,GF,M (F/"4F?';Ku
M?9$*]2!H<MZ>2">G/!:B#P:K],@3LJMLMU*I>,?9)E(R5L0V)K%Z/?0;8ZVPt
M1ZM5$-]/_QS_Y,'PX6:#<@-S8S./U)-Z;,-N:)S!B>&M>Z(88@O:E(--F-1Ts
M#*52^&[UA=L;0ATP]O3</0J2P= S3RM9;U %ZFH[WE0G"#UF$0-M:,&B^7NSr
M7S#W[! T:'#EI<AW$"V9/\^>D&.CHK5R366F<_=;@*U!&RO;T_R=-D>LF?.Rq
M:OB:N:NS2/[0KGM\QM5ST^9:JM/E8I(GOSQ>8Y+9XIR^5L<5 4XG9%#(C+,2p
M]0&*E5[<VDJ\]96Y/)$%[T@'E-#3S0D^[;&_Z>!R<'DV@#,*5Q]$\&Q=#KKCo
MA-F4L\%0PGRGT:FU13@N.B9S&/35+ 9]#F-#]-YY451.K2J,P)M2,>$"Y<'_n
MF--5#HPU12VTOA15[M.B4L4P_12'5CH=B05EO^/"5\5>O@&_5]!:<ACYOV?Qm
M))[HSUB]Y1 .\U=R[O0"J,R%.!LKC'5>).LQA9/GUL ?E!T,12?>?:V]:/ _l
M8ZWO8_'PQ!I0WV0Q'T9QQ<NZ"D0C0W9S%MK#)'V]?_(AF%H>LXTCA?X-3"4Mk
M'/6#'0!?/+DY^6)&<,;#VF$!"#(,&WVA9XF]ERR\TRZ8%B$ZD ]"(6%$LF09j
M1G#)ZXBY(XYCE+R8[+Y;#K_ VXHVD'XVOL&SA A<\<9B7\,+SF_Q_+WUK)P7i
M?DN&S*M%#^F1BJ;0YDU^&4K36HT/L9C!8Z4\(]FE<C+TR$YQ$SB&UQ@[T'Z/h
M2NZLN^,<HN6#*6R2 ?;2P6@ UQJ1B#Q%EQ<2XS$18^3%0<]+@OAX\C?DQ\S2g
MWW0.AO'23QHGZ@@W&U)(&/%HSP\.HI,W1X<?7[_A[^Z_\_WR#4#K*VZ8#'S8f
MMT^T/6#%_[%#)887;PQ=Q(C0 X4\V:M*RJ=UQ!#-;U%9]&K'2 H6R&O>JKR5e
MU!!+][J%TDE"&R+Y@A>[W+@%?1V&?575]9-2O>W'9&/U$Z[G$3]:FVZ^54ATd
M],E>L#QCC\P5R%-S/$4Q304YL!8-TMZCS+XU5+?YXNV)U>1DCG,+90FQ>X]Oc
MZ.,_7+^@ZTQ/P5[ST!406W+-R+H4,G#\]O7;]R>&2BY@<X("#>XWGD2#WOG$b
MI1;QP99]!U1]/M=R=^!\$5Y?7-82)2%0YS7BVI-D$0#4+]5XE;<2.1/,*D?=a
M,'T3*MA_LG4O5^1GKO:4O[?9Z>.UESQ9*2/*[ZKYB,%J5>"$'^S(-;]^B=%Xz
MIZ/!%*!#U]U;5WQ^\3 MIUO.?,Q)N$?,)^WYYB"N+.]V[QK=)G)->Y*]U([Ay
M5MM8;P!Y@O>H@\G&F:]/<'Y.,!*?%7UX??1AV^:\2W)/.=,5P7::_S8(HMB)x
M!T&&D-U2JW;B?#W_JU.&_$R).\XSAT3FE@XI*"0PKIIK4Y!EG*7BR!5W%^)$w
M/ GKC?S7E!/,.0$''DP1? ',:TW#5Q.R"U=JK-\-)/!"N@1SH(Q]!.9$LRM6v
M[XBLUF-$2U0W-KP:1 O\31X00)CP7VPYPSCYWC+   5=M6@/UD;!<K!(3WQIu
M=3P7"TPZ5=!SYXGS7Z: G)&?OU@PE6K!**N903*=WP7C1F7U0N]7L /FC7X)t
MX1ZRR(.WA.92R8PDB^]FW*S%+8U/*MU\3;MG' 5[\Q7)E*?F--*H/KZY\=G&s
M_WEL3R)>G;BATP$O)P1X1+E2L0KS!W(L$4(QYGCP=#+KG6OR,_5C*-[0_]G r
MV6M-#V7=!",7#,X9-GW8*RV9/L;<;7"L6Q%$.^Z_R.M;5.UQ-PJX!(XNJDSHq
MT%?XFSB^N$!;YP_'521#G8ELF+[6>I]20K.:UFZ&*?X'?2'6)\_,Z [UG=&&p
M70?+U>+7M#;;=^J%P@LYW&0RYN#^FO\]O@ZFX\%%AM'-QGW#W! 9F3AQ,/.Ao
M0 4TE)SI7M%$,L,PDMQCEB$]"27L\[V1"D)LUN='JZFGC9H(%3_L!PQP59\?n
MB2U"@+0]:6=%2<=M'UDKSEH5N28CPE#,3X'X8F/-J2-9'\1\3J<<HCB.DM&8m
M@C8E,!#8APAC5/GGPH@_J"C#<>@X/E@DBJ[/)Y'1L,VFB_JC[H7YWG PX*-Wl
MN? 5Q4;ZU<FHBW,S1A9;WWS\@!VMU))TAX,+DK2\$/8"\O1B]I '0I']A.U:k
M8PP&8B76GT%1E-WBI<(1N)UG"*Z 2<@0AN9--<<60M*P_*%X/WO:R(JZ\HZ8j
ML@K?8P7JG"#,42)A5#D1)X;M<96[C (3C_S*K#[;*1R>SW_LVSF!W2@;U-]]i
MF8(NBPX9-W<6#C$G:M]U/C^8H16,/%C70MHC&K;!/\S7$@XNPQX:7 QESR%.h
M"-HHA81H-',RN\+6H$ZL.4IH\YI20LSAAJCH:# <CGJCP3C-T:<M25,J@!8Gg
M(B2%"Z!\D$YI#+R9YK7/5M.@QSR-N]!*>6R'D5>O ^UZ_EL+>#:O1:*\(ZQKf
MZ)@2PNF5,8'K6#TW7THB]XKPY%$<Z D]]>GU\6<B&"UP.4Z,F'W),5_I)% Pe
M,U\E7\W"%;A8S=J96:=*/>:S);#^9@\:J49 >\!IVP6U"#12?I'Y.'\"B5 Sd
M5:^-K=+BO;8(XEZ8U)JMAN3;EQT6?"Z06C>8KKP?EDTE1MG\@=C]L]&X.T6&c
MUW1&P9M@*D(^U(>DV@'-3[C^N8,-'G 9(:0B&&J:&/F#'?'NQ>8V=?/B^*7Ib
MW710EG/],2$"P314H<XP0LG3"BF"0KQ%>/+6)<H#M%*/SPR?V"YP5CAZ<AW:a
M>B#E[.>]\ZLH2H1X8U;:S A7-OU[/IQ;\;@UC#U_HOK63IT2<Q!'RO78MQK]z
M8:.1OD9?\%"Z-&O2,&L2%R[BPC/!5R7^R$3#E_)P9+K_9R\ ^YEAO?"V<AY=y
M15'M+.# =G1FCE";" (9[D$EL)QIO0M*OM[J<$H' =/^;PU)>_M^;DC:/:\Lx
MP$.)<6?->K/9YO'#O!*D\6M0,D0B>.]?>5Z>.9Y(%IET^EA1(_#"=(AZ\4.<w
MB#8>6982^9?[AZ\"\T N/%)B-SAJX^&T%K4/7-8B'C C;!^H35L_J.F6@N<)v
M.Q;\E]Y-<VYWJ*9KW# ?SP:I9/'\[3I)OS9<@!>#PSM(*#&GM+)Q01>P/=$#u
MM%H7AC.GI_UDEESUF.27-=)PH85?_?CD@YB&"KJCWI NU]/"N0%IX)(WZ\+Gt
M5AG$V_<G2\;PVVR4_IXQ\'.KC.%O']\N&P1 SW[/(.0Y&L("(+1HX:N[TW1!s
M'Q:WE,AS:[/6C UYQNLQ_B'6+NKV?+5OY/$1^WULX-4<6]#[PU<'QV\J:H5<r
M;&$5C[ZU#LZ'@!/0:K]%5#!Q/UBJ?: 14N&:GJ]&'.'DA3#^7YH]<XEY3"*<q
MOC"(_QNG3[ 2Z^N,6-38U.K;A6<9+\/<Z-GZW%)4%*##!U=1B[Q)-83"/NMKp
MU7))$W^Y_\O+HU^DF@F?.[Y?:>'!&9R<$C^</SE#NTHFX853J EQ1G56I%1Po
M80%! &7CHYJG72;T/4HJ$8]M5VJJ:M8 (\0F%L3 .]SIE(7;AA:0/UM'4NR:n
M+2U<#<'+#- ;6D2Y>R-(61R&HLE\>X?OCQ$MV.3JA-Y"UY<L=-UR2J9<JI'Jm
M-Y$L&,DA,==V;?4D"GG45QN]TI8:.O.K[4B\/215<W\TYKODIML8\G\'-O'Wl
MAK&6).N0"%FEQ**\WTB\=NQTG4T'KF1M\$7K=0OD-!0HIWH>,#]-+X=7@HJ>k
MOYOT>F>X68NTA&S-?R(*G[#%>5#(*?GTV6O 7P?D<-F]T<S;.&8TF-CE:=P1j
M!%*DX8),$3\@J"@&W@:JIQ.-*9X?[BIMPGA7GQU) XF,X'+G#0K<CS?-Z=RTi
M,!$*JM.]X.P5FZNL]>,9@+5."1EGE-YYZF[19K;FBC.]DJ^-!,+#-^ U4H;!h
MY8G+?^W7PO]5'M0HU$Q* V(2LYYY-XP6"3Y]I>)B8?-%F;DZ9[8@)W\!C#%[g
MI]ZQ&N!9],12A:CP"*0^R^CLXITSA'\))..SV1?VOR6#Z:A[$5.H__ET,*A?f
MCZ8$7$^@%)"T#>/I7W<E-4"T+'(M3P@4 ND;6!-$$6/S*-ZIU(N"M>9AU&2/e
MOJY[)3\?;Q92-%G+F26?\JU1/AE5 %!(U6XFNE:Q&*;Z[L;-9J/1I+BM)H&Cd
M:?TE;(U=^*[E^8I$ZN IKH%)L %<L/#EX?N34Z1(-EJ-TY,W;X^ENI4AS794c
M;<:=VB8CF7 A*J^JO6*Q(;X@9BPVT:B8) VY-BWT9T"KL91B=40-^V7\J-RHb
MM&VA;,H82\A_PP>)T=@3<7LD7P>,V 1[&<4<$.(#/MFUA5G6]&=^[4Y&0],Qa
MRFU>(V]$D2<YT>6GY&) *S<1[=C6YR*VCWOW=?:>6$"?I@AYM+"JA[3.%/9@z
M\V+4X(I!U]8!:8N9E*ENH48!<EDOT_8$]L(KHT-$IZ/DU(&5@]B1EAX_:K2]y
M]' ?9T\_+LAO#,R-='!YE3HOC-0OONB?GDL*;>GMX='^'H#=1I,I#.7V=R6:x
M4?WM,N!=JH80, ^):#67)U-%M=/NS%O, V;1M&M93'L1*TT_TN[(ABI@#M6Jw
M'>G3W6B=JK00=(,18<PTOG!E7W,^S7I?X;\-$H04MAH=N:%X8RG(<"[Y**KSv
M)V#^RRUA@(&:Y<F5:&Q$)T(Z(%1Q,N5>&@YESI\(_=Q:R<[%:WKD(MD2SIHEu
MNUW3'^C(,4.1UWG</LJP^AW-9W:[F;-AI0<F7;?C*"568X+=1A(4=LG#O>^Ct
M"2)BSS+3<O$)4?$/!GH_<].SSX]LZ+*],M(KKEL,XHEM8#JA43USS^ WD!WQs
M]^=H6V#/,P<<,5M7VH[F+X7FS\#%L9;,UX!7\Y?HIAIO1P"L0?$**N$%MXO9r
M><U'C?7H>&]/&9]A:U\&C)ID&-Q?C%38:-22J2*FX3CB]UA)VI""9K74\(81q
M('',<,UU0@VEOHX.WP7X:<K3FG[QU3-;X=L[1U2\JV1:1G&-Q16DK=T,$&/6p
M8"Q_OHJ#8<#RK$2$R3)AT&;/=PBZITQ7 R$C3W;^B9_M9=4>LD6(<^"4BV25o
MN^P15[WD?HJEI)5^0N>![S 204^:VIVA);3(S]CSJF>9*Y:\S;_G$+99]11 n
MH$+4JEV;Z102M1PGL8Z"OS\J4H ;VO&(]PI4BC-V<D;8-='>2PJ[VSLYQOECm
MY:GR=8L"9M<K9E4$@010/:8',<GC*2U+;:G2(8^9']]01AV<GO3#_NSRTM#Vl
MFK#GG<#E2"VN6Z(D*P<GS"R_CS6)#RB@;+@(;D"HF[W-^  >)/VU+A&39D8Xk
MQSR'H/1)G\+LO<JGQDUL%O;)$T"00#CKF:5CW&Z4T:)Z. C6T?(32_IJD@>Cj
M6:G0V)KDUKJ)>3 !8)3Y3:M#CI;<E&4FPVXCEIFLN05J_:&GK_EQ#[O+.VRRi
M5*X9[:WF!N'CP6P>>RAAP6:$C)7=ACA&JQWVH>!3 *9)ZY8W_6+E8=%RCCE\h
M(CXB]\N3$W)\@!E!5,0),#)A >7I;J,RY\76%<%-IW.:,=97;@S_$^Q;AKA*g
#_@  f
 e
end

###
pipe_read/write:  save some context changes, don't wake(select) other
end when the buffer hasn't changed, otherwise they only wake up and
go to sleep again.  (or am i confused?  tty response looks a bit
faster now...)

and add VMIN, and fix some bugs (my own ones mostly :)

Index: pipefs.c
@@ -631,14 +633,13 @@
 				raise(SIGPIPE);
 				return EPIPE;
 			}
+#if 0
 /* wake up any readers, and wait for them to gobble some data */
 			if (p->rsel) {
 				wakeselect(p->rsel);
-#if 0
-				p->rsel = 0;
-#endif
 			}
 			wake(IO_Q, (long)p);
+#endif
 			sleep(IO_Q, (long)p);
 			goto check_atomicity;
 		}
@@ -666,6 +667,14 @@
 			    buf += j;
 			  }
 			p->len = plen;
+			if (!is_terminal(f) || !(f->flags & O_HEAD) ||
+			    plen >= this->tty->vmin*4) {
+	/* is someone select()ing the other end of the pipe for reading? */
+				if (p->rsel) {
+					wakeselect(p->rsel);
+				}
+				wake(IO_Q, (long)p); /* readers may continue */
+			}
 		} else {		/* pipe full */
 			if (p->readers == 0 || p->readers == VIRGIN_PIPE) {
 			/* maybe some other signal is waiting for us? */
@@ -677,23 +686,27 @@
 			if (f->flags & O_NDELAY) {
 				break;
 			}
+#if 0
 	/* is someone select()ing the other end of the pipe for reading? */
 			if (p->rsel) {
 				wakeselect(p->rsel);
 			}
 			wake(IO_Q, (long)p);	/* readers may continue */
+#endif
 DEBUG(("pipe_write: sleep on %lx", p));
 			sleep(IO_Q, (long)p);
 		}
 	}
 	this->time = timestamp;
 	this->date = datestamp;
+#if 0
 	if (bytes_written > 0) {
 		if (p->rsel) {
 			wakeselect(p->rsel);
 		}
 		wake(IO_Q, (long)p);	/* maybe someone wants this data */
 	}
+#endif
 
 	return bytes_written;
 }
@@ -741,6 +754,11 @@
 			p->len = plen;
 			if (plen == 0 || p->start == PIPESIZ)
 			  p->start = 0;
+	/* is someone select()ing the other end of the pipe for writing? */
+			if (p->wsel) {
+				wakeselect(p->wsel);
+			}
+			wake(IO_Q, (long)p);	/* writers may continue */
 		}
 		else if (p->writers <= 0 || p->writers == VIRGIN_PIPE) {
 			TRACE(("pipe_read: no more writers"));
@@ -752,20 +770,24 @@
 			break;
 		}
 		else {
+#if 0
 	/* is someone select()ing the other end of the pipe for writing? */
 			if (p->wsel) {
 				wakeselect(p->wsel);
 			}
 			wake(IO_Q, (long)p);	/* writers may continue */
+#endif
 			sleep(IO_Q, (long)p);
 		}
 	}
+#if 0
 	if (bytes_read > 0) {
 		if (p->wsel) {
 			wakeselect(p->wsel);
 		}
 		wake(IO_Q, (long)p);	/* wake writers */
 	}
+#endif
 	return bytes_read;
 }
 
@@ -800,8 +822,12 @@
 	if (nbytes != 4)
 		ALERT("pty_read: master nbytes != 4");
 	bytes_read = pipe_read(f, buf+3, 1);
-	if (bytes_read == 1)
+	if (bytes_read == 1) {
 		bytes_read = 4;
+		*buf++ = 0;
+		*buf++ = 0;
+		*buf++ = 0;
+	}
 	return bytes_read;
 }
 
@@ -820,10 +846,30 @@
 pty_readb(f, buf, nbytes)
 	FILEPTR *f; char *buf; long nbytes;
 {
+	struct fifo *this = (struct fifo *)f->fc.index;
+
 	if (!nbytes)
 		return 0;
-	if (!(f->flags & O_HEAD))
+	if (!(f->flags & O_HEAD)) {
+		struct tty *tty = this->tty;
+/*
+ * we don't do pty slave reads yet (they need long -> byte conversion for
+ * every char) but we still want to support VMIN > 1...  so sleep first
+ * and then return EUNDEV, then VMIN chars (well longs :) are ready when
+ * tty_read starts reading them one at a time
+ */
+		while (tty->vmin > 1 && !tty->vtime &&
+		    !(f->flags & O_NDELAY) &&
+		    (tty->sg.sg_flags & (T_RAW|T_CBREAK)) &&
+		    this->inp->len < tty->vmin*4 && this->inp->writers > 0)
+			sleep (IO_Q, (long)this->inp);
 		return EUNDEV;
+	}
+/*
+ * pty master reads are always RAW
+ */
+	if (nbytes > 1 && nbytes > this->outp->len)
+		nbytes = this->outp->len;
 	return pipe_read(f, buf, nbytes);
 }
 
@@ -920,6 +966,25 @@
 		else
 			lck->l_type = F_UNLCK;
 		break;
+	case TIOCGVMIN:
+	case TIOCSVMIN:
+	    {
+		unsigned short *v = buf;
+		struct tty *tty = this->tty;
+
+		if (!is_terminal(f) || !tty)
+			return EINVFN;
+		if (mode == TIOCGVMIN) {
+			v[0] = tty->vmin;
+			v[1] = tty->vtime;
+		} else {
+			if (v[0] > PIPESIZ/4)
+				v[0] = PIPESIZ/4;
+			tty->vmin = v[0];
+			tty->vtime = v[1];
+		}
+		return 0;
+	    }
 	case TIOCSTART:
 		if (is_terminal(f) && !(f->flags & O_HEAD) &&
 #if 0
@@ -946,7 +1011,12 @@
 		}
 		if ((flushtype & 2) && this->outp) {
 			this->outp->start = this->outp->len = 0;
-			wake(IO_Q, (long)this->outp);
+			if (!is_terminal(f) || (f->flags & O_HEAD) ||
+			    !(this->tty->state & TS_HOLD)) {
+				wake(IO_Q, (long)this->outp);
+				if (this->outp->wsel)
+					wakeselect (this->outp->wsel);
+			}
 		}
 		break;
 	    }
@@ -1156,8 +1234,9 @@
 
 /* NOTE: if p->writers <= 0 then reads won't block (they'll fail) */
 		if ((p->len > 0 &&
-			(!is_terminal(f) || !(f->flags & O_HEAD) ||
-			 !(this->tty->state & TS_HOLD))) ||
+			(!is_terminal(f) || ((f->flags & O_HEAD) ?
+				(!(this->tty->state & TS_HOLD)) :
+				(p->len >= this->tty->vmin*4)))) ||
 		    p->writers <= 0) {
 			return 1;
 		}
@@ -1205,14 +1284,20 @@
 		if (!p) {
 			return;
 		}
-		if (p->rsel == proc)
+		if (p->rsel == proc) {
 			p->rsel = 0;
+			if (is_terminal(f) && !(f->flags & O_HEAD))
+				this->tty->rsel = 0;
+		}
 	} else if (mode == O_WRONLY) {
 		p = (f->flags & O_HEAD) ? this->inp : this->outp;
 		if (!p) {
 			return;
 		}
-		if (p->wsel == proc)
+		if (p->wsel == proc) {
 			p->wsel = 0;
+			if (is_terminal(f) && !(f->flags & O_HEAD))
+				this->tty->wsel = 0;
+		}
 	}
 }
###
SIGHUP pty slaves when master end closes...  or would this break
multitos binaries too? :/

Index: pipefs.c
@@ -1090,7 +1160,15 @@
 		}
 		if (rwmode == O_WRONLY || rwmode == O_RDWR) {
 			p = (f->flags & O_HEAD) ? this->inp : this->outp;
-			if (p) p->writers--;
+			if (p) {
+				p->writers--;
+#if 1
+/* if pty master exits tell the slaves */
+				if (!p->writers && is_terminal(f) &&
+				    (f->flags & O_HEAD) && this->tty->pgrp)
+					killgroup(this->tty->pgrp, SIGHUP);
+#endif
+			}
 		}
 
 /* correct for the "selfread" flag (see pipe_creat) */
###
fix another sleep deadlock, checkkeys/checkbttys can wake() the
condition curproc just wants to sleep for...  and if there are other
processes ready only reset proc_clock when really going to sleep.

the reset_priorities() in fresh_slices is to prevent 2 processes
running at MAX_NICE+1, else it really only helps the first process
in a pipe for example...

Index: proc.c
@@ -9,7 +9,7 @@
 #include "mint.h"
 #include "xbra.h"
 
-static void do_wakeup_things P_((int));
+static void do_wakeup_things P_((short sr, int newslice));
 
 extern short proc_clock;
 
@@ -332,9 +332,10 @@
 fresh_slices(slices)
 	int slices;
 {
+	reset_priorities();
 	curproc->slices = 0;
 	curproc->curpri = MAX_NICE+1;
-	proc_clock = slices;
+	proc_clock = TIME_SLICE+slices;
 }
 
 /*
@@ -428,9 +429,10 @@
  * curproc->wait_cond
  */
 
-static void
-do_wakeup_things(sr)
+INLINE static void
+do_wakeup_things(sr, newslice)
 short sr;
+int newslice;
 {
 /*
  * check for stack underflow, just in case
@@ -466,15 +468,19 @@
 			check_sigs();		/* check for signals */
 	}
 
-	if (p->slices >= 0) {
-		proc_clock = TIME_SLICE;	/* get a fresh time slice */
-	} else {
-		proc_clock = -p->slices;	/* slices set by run_next */
-		p->curpri = p->pri;
+	if (newslice) {
+		if (p->slices >= 0) {
+			proc_clock = TIME_SLICE;	/* get a fresh time slice */
+		} else {
+			proc_clock = TIME_SLICE-p->slices; /* slices set by run_next */
+			p->curpri = p->pri;
+		}
+		p->slices = SLICES(p->curpri);
 	}
-	p->slices = SLICES(p->curpri);
 }
 
+static long sleepcond;
+
 /*
  * sleep: returns 1 if no signals have happened since our last sleep, 0
  * if some have
@@ -489,12 +495,19 @@
 	short sr, que = _que & 0xff;
 	ulong onsigs = curproc->nsigs;
 	extern short kintr;	/* in bios.c */
+	int newslice = 1;
 #ifndef MULTITOS
 #ifdef FASTTEXT
 	extern int hardscroll;	/* in fasttext.c */
 #endif
 #endif
 
+/* save condition, checkbttys may just wake() it right away...
+ * note this assumes the condition will never be waked from interrupts
+ * or other than thru wake() before we really went to sleep, otherwise
+ * use the 0x100 bit like select
+ */
+	sleepcond = cond;
 /*
  * if there have been keyboard interrupts since our last sleep, check for
  * special keys like CTRL-ALT-Fx
@@ -517,16 +530,24 @@
  * indicatation that the wakeup has already happend before we actually
  * go to sleep and return immediatly.
  */
-	if ((_que & 0x100 && curproc->wait_cond != cond) ||
-	    (que == READY_Q && !sys_q[READY_Q])) {
+	if ((que == READY_Q && !sys_q[READY_Q]) ||
+	    ((sleepcond != cond ||
+	      (_que & 0x100 && curproc->wait_cond != cond)) &&
+	     (!sys_q[READY_Q] || (newslice = 0, proc_clock)))) {
 /* we're just going to wake up again right away! */
 		spl(sr);
-		do_wakeup_things(sr);
+		do_wakeup_things(sr, newslice);
 		return (onsigs != curproc->nsigs);
 	}
-
+/*
+ * unless our time slice has expired (proc_clock == 0) and other
+ * processes are ready...
+ */
+	if (!newslice)
+		que = READY_Q;
+	else
+		curproc->wait_cond = cond;
 	add_q(que, curproc);
-	curproc->wait_cond = cond;
 
 	if (!sys_q[READY_Q]) {
 /* hmm, no-one is ready to run. might be a deadlock, might not.
@@ -589,7 +610,7 @@
 #endif
 			*((void **)0x44eL) = curproc->logbase;
 #endif
-		do_wakeup_things(sr);
+		do_wakeup_things(sr, 1);
 		return (onsigs != curproc->nsigs);
 	}
 /*
@@ -635,6 +656,8 @@
 		ALERT("wake: why wake up ready processes??");
 		return;
 	}
+	if (sleepcond == cond)
+		sleepcond = 0;
 top:
 	for(p = sys_q[que]; p; p = p->q_next) {
 		if (p->wait_cond == cond) {
@@ -789,6 +812,7 @@
 {
 	unsigned long myuptick = uptimetick;
 	
+	checkbttys_vbl();
 	if (myuptick > last_200ms)
 		calc_load_average();
 
###
another GEM crash workaround... :)  (and give processes a bit more
time for shutdown)  if you use execgem also add the F_ALLOCZERO bit to
its create-basepage Pexec, you can check a running process memflags
with Julians ps (ps -wvx).

Index: mem.h
@@ -85,6 +85,8 @@
 
 #define F_MINALT	0xf0000000L	/* used to decide which type of RAM to load in */
 
+#define F_ALLOCZERO	0x2000		/* zero mem, for bugged (GEM...) programs */
+
 /* Bit in Mxalloc's arg for "don't auto-free this memory" */
 #define F_KEEP		0x4000
 
Index: dosmem.c
@@ -94,6 +94,13 @@
 	if ((mode & F_KEEP)) {	/* request for permanent memory */
 		m->mflags |= M_KEEP;
 	}
+#if 1
+	/* some programs crash when newly allocated memory isn't all zero,
+	 * like TOS 1.(0)4 GEM when loading xcontrol.acc...
+	 */
+	if ((curproc->memflags & F_ALLOCZERO) || (mode & F_ALLOCZERO))
+		zero((char *)m->loc, m->len);
+#endif
 	return (long)v;
 }
 
Index: main.c
@@ -558,13 +566,19 @@
 		   shut down
 		 */
 
-		addtimeout(1000, shutmedown);
+		addtimeout(5000, shutmedown);
 		do {
 			sleep(WAIT_Q, (long)shutdown);
 		} while (curproc->wait_cond == (long)shutdown);
 	}
 }
 
+#ifndef MULTITOS
+long GEM_memflags = F_FASTLOAD | F_ALTLOAD | F_ALTALLOC | F_PROT_S | F_ALLOCZERO;
+#else
+long GEM_memflags = F_FASTLOAD | F_ALTLOAD | F_ALTALLOC | F_PROT_S;
+#endif
+
 #if defined(__GNUC__) || defined(__MINT__)
 int
 main(argc, argv, envp)
@@ -896,8 +917,7 @@
 	} else if (!gem_active) {   
 		BASEPAGE *bp; int pid;
 		bp = (BASEPAGE *)p_exec(7,
-		  (char *)((long)F_FASTLOAD | F_ALTLOAD | F_ALTALLOC | F_PROT_S),
-		  (char *)"\0", init_env);
+		  (char *)GEM_memflags, (char *)"\0", init_env);
 		bp->p_tbase = *((long *) EXEC_OS );
 #ifndef MULTITOS
 		if (((long *) sysbase[5])[0] == 0x87654321)
###
and some lost patches i don't know whats wrong with :)

set up stack for signal handler at ipl7 so that not some interrupt that
comes along and pushes a few 100 bytes on the stack can overwrite it
before restore_context has set the new sp...

Index: signal.c
@@ -305,8 +305,8 @@
 	long oldstack, newstack;
 	long *stack;
 	CONTEXT *call, contexts[2];
-#define oldsysctxt (contexts[0])
-#define newcurrent (contexts[1])
+#define newcurrent (contexts[0])
+#define oldsysctxt (contexts[1])
 
 	extern void sig_return();
 
@@ -397,9 +397,9 @@
 		++curproc->nsigs;
 		call = &curproc->ctxt[SYSCALL];
 /*
- * what we do is build two fake stack frames; the bottom one is
+ * what we do is build two fake stack frames; the top one is
  * for a call to the user function, with (long)parameter being the
- * signal number; the top one is for sig_return.
+ * signal number; the bottom one is for sig_return.
  * When the user function returns, it returns to sig_return, which
  * calls into the kernel to restore the context in prev_ctxt
  * (thus putting us back here). We can then continue on our way.
@@ -407,7 +407,7 @@
 
 /* set a new system stack, with a bit of buffer space */
 		oldstack = curproc->sysstack;
-		newstack = ((long) ( (&newcurrent) - 2 )) - 12;
+		newstack = ((long) &newcurrent) - 0x40 - 12;
 
 		if (newstack < (long)curproc->stack + ISTKSIZE + 256) {
 			ALERT("stack overflow");
@@ -417,11 +417,6 @@
 			FATAL("system stack not in proc structure");
 		}
 
-/* unwound_stack is set by p_sigreturn() */
-		if (sig == 0 && unwound_stack)
-			curproc->sysstack = unwound_stack;
-		else
-			curproc->sysstack = newstack;
 		oldsysctxt = *call;
 		stack = (long *)(call->sr & 0x2000 ? call->ssp :
 				call->usp);
@@ -450,10 +445,6 @@
 		call->pc = (long) curproc->sighandle[sig];
 		call->sfmt = call->fstate[0] = 0;	/* don't restart FPU communication */
 
-		((long *)curproc->sysstack)[1] = FRAME_MAGIC;
-		((long *)curproc->sysstack)[2] = oldstack;
-		((long *)curproc->sysstack)[3] = sig;
-
 		if (curproc->sigflags[sig] & SA_RESET) {
 			curproc->sighandle[sig] = SIG_DFL;
 			curproc->sigflags[sig] &= ~SA_RESET;
@@ -469,6 +460,20 @@
 			newcurrent.regs[0] = CTXT_MAGIC;
 				/* set D0 so next return is different */
 			assert(curproc->magic == CTXT_MAGIC);
+
+/* unwound_stack is set by p_sigreturn() */
+			if (sig == 0 && unwound_stack)
+				stack = (long *) unwound_stack;
+			else
+/* newstack points just below our current sp, much less than ISTKSIZE away
+ * so better set it up with interrupts off...  -nox */
+				stack = (long *) newstack;
+			spl7();
+			curproc->sysstack = (long) stack;
+			++stack;
+			*stack++ = FRAME_MAGIC;
+			*stack++ = oldstack;
+			*stack = sig;
 			leave_kernel();
 			restore_context(call);
 		}
@@ -534,7 +539,7 @@
 	}
 	else {
 		valid_return = 0;
-		oldctxt = ((CONTEXT *)(&frame[2])) + 2;
+		oldctxt = (CONTEXT *) (((long)&frame[2]) + 0x40);
 		if (oldctxt->regs[0] != CTXT_MAGIC) {
 			FATAL("p_sigreturn: corrupted context");
 		}
###
allow creat() on pipes when the other end is already open, to make e.g.
echo foo >pipe work.  Fcreate still fails when its attr word is != 0
so things like toswin etc. still work...

Index: dosfile.c
@@ -37,7 +37,7 @@
 	unsigned perm;
 	int creating;
 	char temp1[PATH_MAX];
-	extern FILESYS proc_filesys;
+	extern FILESYS proc_filesys, pipe_filesys;
 
 /* for special BIOS "fake" devices */
 	extern DEVDRV fakedev;
@@ -62,9 +62,12 @@
 
 /*
  * file found: this is an error if (O_CREAT|O_EXCL) are set
+ *	...or if this is Fcreate with nonzero attr on the pipe filesystem
  */
 
-	if ( (r == 0) && ( (rwmode & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) ) ) {
+	if ( (r == 0) && ( (rwmode & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) ||
+			(attr && fc.fs == &pipe_filesys &&
+			(rwmode & (O_CREAT|O_TRUNC)) == (O_CREAT|O_TRUNC)))) {
 		DEBUG(("do_open(%s): file already exists",name));
 		mint_errno = EACCDN;
 		release_cookie(&fc);
Index: pipefs.c
@@ -553,10 +553,12 @@
 		}
 		p->flags &= ~O_HEAD;
 	} else {
-		if (f->flags & O_CREAT) {
+#if 0
+		if (f->flags & O_TRUNC) {
 			DEBUG(("pipe_open: fifo already exists"));
 			return EACCDN;
 		}
+#endif
 	}
 /*
  * check for file sharing compatibility. note that O_COMPAT gets mutated
###
maybe this bug is not in the 68000 itself but somewhere else in the
ST hardware, but i do believe there is something to it...  (Daniel are
you still around? :)

Index: intr.spp
@@ -335,6 +335,10 @@
 	move.l	_sig_routine,a1		; get handler
 	jsr	(a1)			; go do it
 	movem.l	(sp)+,d0-d2/a0-a2
+; 68000 processor bug: rte right after movem can eat interrupts...
+%ifndef ONLY030
+	nop
+%endif
 	rte
 
 ;
###
is this intentional? ;)

Index: tosfs.c
@@ -179,7 +179,7 @@
 /* jr: external table, set up by getbpb in bios.c */
 extern unsigned short clsizb[];
 
-#define INODE_PER_CRC
+/*#define INODE_PER_CRC */
 
 #ifdef INODE_PER_CRC
 
###
oh and i also liked the always-give-init-pid-1 one...

 cheers,
	Juergen