nansi.sys sources + demo (Part 1 of 2)
Ed Nather
nather at ut-sally.UUCP
Fri Jul 18 04:17:56 AEST 1986
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by sally!nather on Thu Jul 17 13:11:16 CDT 1986
# Contents: readme nansi.doc nansi.mkf nansi.sup demo.uue nansi.uue
echo x - readme
sed 's/^@//' > "readme" <<'@//E*O*F readme//'
This package includes the source code for nansi.sys, an improved
console driver for MS-DOS running on IBM PC computers or their clones,
a makefile for how to assemble it, a uuencoded copy of the assembled
(executable) driver, documentation describing the driver, and a short
demo program (uuencoded) to show off its strong point: very rapid
screen updates from multi-character write operations.
The demo program takes a single argument on the command line; it should
be the filename of a text file. It then displays the first 24 text lines
from the file on the console screen and quits. Try it first with your
current console driver (e.g. ansi.sys), then install the executable
copy of nansi.sys in its place and run demo again on the same text file.
I think the author of nansi.sys did us all a tremendous favor.
Ed Nather
Astronomy Dept, U of Texas @ Austin
{allegra,ihnp4}!{noao,ut-sally}!utastro!nather
nather at astro.AS.UTEXAS.EDU
@//E*O*F readme//
chmod u=rw,g=r,o=r readme
echo x - nansi.doc
sed 's/^@//' > "nansi.doc" <<'@//E*O*F nansi.doc//'
nansi - enhanced MS-DOS ansi console driver
SYNOPSIS
Include in \config.sys the line
device=nansi.sys
DESCRIPTION
Nansi.sys is a console driver which understands ANSI control
sequences. It has several advantages over ANSI.SYS (the driver
supplied with DOS):
1. It supports new escape sequences (see below).
2. It provides MUCH faster output under certain conditions.
3. It supports the 43-line mode of the EGA.
4. The darned bell is now 1/4 second instead of 1/2 second long.
What a console driver does:
When you, for example, type
C:> type foo.txt
COMMAND.COM opens the file foo.txt, reads it, and writes it to
the console driver, which puts it up on the screen.
Both ansi.sys and nansi.sys use IBM Video BIOS to control the screen.
However, nansi.sys bypasses BIOS if the screen is in a text mode; this
allows much faster operation under certain conditions.
While putting text up on the screen, (n)ansi.sys keeps a lookout for
the escape character (chr(27), known as ESC); this character signals
the start of a terminal control sequence.
Terminal control sequences follow the format
ESC [ param; param; ...; param cmd
where
ESC is the escape character chr$(27).
[ is the left bracket character.
param is an ASCII decimal number, or a string in quotes.
cmd is a case-specific letter identifying the command.
Usually, zero, one, or two parameters are given. If parameters
are omitted, they usually default to 1; however, some commands
(KKR and DKOCT) treat the no-parameter case specially.
Spaces are not allowed between parameters.
For example, both ESC[1;1H and ESC[H send the cursor to the home
position (1,1), which is the upper left.
Either single or double quotes may be used to quote a string.
Each character inside a quoted string is equivalent to one numeric
parameter. Quoted strings are normally used only for the Keyboard
Key Reassignment command.
Control Sequences
The following table lists the sequences understood by nansi.sys.
Differences between nansi.sys and the standard ansi.sys are marked
with a vertical bar (|).
Cursor Positioning
Short Long name Format Notes
CUP cursor position ESC[y;xH Sets cursor position.
HVP cursor position ESC[y;xf Same as CUP; not recommended.
CUU cursor up ESC[nA n = # of lines to move
CUD cursor down ESC[nB
CUF cursor forward ESC[nC n = # of columns to move
CUB cursor backward ESC[nD
DSR Device Status, Report! ESC[6n Find out cursor position.
CPR Cursor Position report ESC[y;xR Response to DSR, as if typed.
SCP Save Cursor Position ESC[s Not nestable.
RCP Restore Cursor Position ESC[u
Editing
ED Erase in Display ESC[2J Clears screen.
EL Erase in Line ESC[K Clears to end of line.
IL | Insert Lines ESC[nL Inserts n blank lines at cursor line.
DL | Delete Lines ESC[nM Deletes n lines including cursor line.
ICH | Insert Characters ESC[n@ Inserts n blank chars at cursor.
DCH | Delete Characters ESC[nP Deletes n chars including cursor char.
Mode-Setting
SGR Set Graphics Rendition ESC[n;n;...nm See character attribute table.
SM Set Mode ESC[=nh See screen mode table.
RM Reset Mode ESC[=nl See screen mode table.
IBMKKR Keyboard Key Reass. ESC["string"p
The first char of the string gives the key to redefine; the rest
of the string is the key's new value.
To specify unprintable chars, give the ASCII value of the char
outside of quotes, as a normal parameter.
IBM function keys are two byte strings; see the IBM Basic manual.
For instance, ESC[0;";dir a:";13;p redefines function key 1 to
have the value "dir a:" followed by the ENTER key.
| If no parameters given, all keys are reset to their default values.
DKOCT | Output char translate ESC[n;ny
| When first char is encountered in output request, it is replaced with
| the second char. This might be useful for previewing text before
| sending it to a printer with a funny print wheel.
| If no parameters are given, all chars are reset to normal.
Character Attributes
The Set Graphics Rendition command is used to select foreground
and background colors or attributes.
When you use multiple parameters, they are executed in sequence, and
the effects are cumulative.
Attrib code Value
0 All attributes off (normal white on black)
1 Bold
4 Underline
5 Blink
7 Reverse Video
8 Invisible (but why?)
30-37 foregnd blk/red/grn/yel/blu/magenta/cyan/white
40-47 background
Screen Modes
The IBM BIOS supports several video modes; the codes given in the
BIOS documentation are used as parameters to the Set Mode command.
| (In bitmap modes, the cursor is simulated with a small blob (^V).)
Mode Code Value
0 text 40x25 Black & White
1 text 40x25 Color
2 text 80x25 Black & White
3 text 80x25 Color
4 bitmap 320x200 4 bits/pixel
5 bitmap 320x200 1 bit/pixel
6 bitmap 640x200 1 bit/pixel
7 (cursor wrap kludge)
13 (EGA) bitmap 320x200 4 bits/pixel ?
14 (EGA) bitmap 640x200 4 bits/pixel
16 (EGA) bitmap 640x350 4 bits/pixel
Mode 7 is an unfortunate kludge; Setting mode 7 tells the cursor
to wrap around to the next line when it passes the end of a line;
Resetting mode 7 tells the cursor to not wrap, but rather stay put.
| If your computer has the Enhanced Graphics Adaptor, modes between
| 8 and 15 are also supported; see the EGA BIOS for info.
| The EGA also lets you use a shorter character cell in text modes
| in order to squeeze 43 lines of text out of the 25-line text modes.
| To enter 43 line mode, set the desired 25-line text mode (0 to 3),
| then Set Mode 43. For instance: ESC[=3h ESC[=43h.
| To exit 43 line mode, set the desired 25-line text mode again.
| Nansi.sys ignores mode 43 unless there is an EGA on your computer.
Faster Output
| Any program that sets the console to RAW mode, and buffers its
| output properly, can achieve extremely high screen update speeds in
| return for giving up the special functions of the keys ^C, ^S, and ^P.
| See IOCTL in the MS-DOS 3.x Technical Reference for more info.
Also, a small improvement in speed may be noticed with some
programs that use the DOS console in normal mode, as this driver
efficiently implements the (standard but undocumented) INT 29h
most-favored-device putchar used by DOS.
EXAMPLES
See the file setraw.doc for Macro Assembler, Lattice C,
and Microsoft C routines for entering and leaving raw mode.
BUGS
Insert and delete character do not work in graphics modes.
Graphics mode writing is slow.
The simulated cursor in graphics mode slows down single-char
writes by a factor of 3; it should be disable-able.
Does not support erase-to-end-of-screen and other useful functions.
Version
This version, 2.2, created February 1986. Problems should
be reported to Daniel Kegel, 1-60 CIT, Pasadena, CA 91126
(or, after June 1986, 2648 169th Ave SE, Bellevue, Wa. 98008).
Your suggestions for improvement would be most welcome.
NOTE
This program may be distributed for educational and personal use
only. Commercial use is verboten; get in touch with the author.
FILES
nansi.doc - this file
nansi.hex - compiled version <Not supported by INFO-IBMPC>
Convert nansi.hex into nansi.sys with the following commands
(you'll end up with 256 extra bytes at end, but who cares?):
debug # Run DOS debugger
N nansi.hex # Load the hex file
L
N nansi.sys # Write it out
W
Q # Quit- back to DOS.
nansi.cat - concatenated sources
nansi - makefile- shows how to assemble & link
nansi.asm - device driver guts
nansi_d.asm - definitions
nansi_p.asm - ANSI parameter grabber
nansi_f.asm - ANSI function handlers
nansi_i.asm - device driver init routine
setraw.cat - concatenated examples
setraw.asm - for assembly programs
setraw.msc - for Microsoft C programs
setraw.lc - for Lattice C programs
rawtest.lc - example for Lattice C only
--
@//E*O*F nansi.doc//
chmod u=rw,g=r,o=r nansi.doc
echo x - nansi.mkf
sed 's/^@//' > "nansi.mkf" <<'@//E*O*F nansi.mkf//'
nansi.obj: nansi.asm nansi_d.asm
masm nansi,,nansi;
nansi_p.obj: nansi_p.asm
masm nansi_p,,nansi_p;
nansi_f.obj: nansi_f.asm nansi_d.asm
masm nansi_f,,nansi_f;
nansi_i.obj: nansi_i.asm nansi_d.asm
masm nansi_i,,nansi_i;
nansi.sys: nansi.obj nansi_p.obj nansi_f.obj nansi_i.obj
link /map nansi nansi_p nansi_f nansi_i;
exe2bin nansi nansi.sys
rm nansi.exe
@//E*O*F nansi.mkf//
chmod u=rw,g=r,o=r nansi.mkf
echo x - nansi.sup
sed 's/^@//' > "nansi.sup" <<'@//E*O*F nansi.sup//'
Support Routines for nansi.sys
The three files setraw.asm, setraw.lc, and setraw.msc contain routines
to allow use of RAW mode from assembly, Lattice C, and Microsoft C.
Lattice C is a little wierder than most, so rawtest.lc was included
to show how to use setraw.lc; the other languages require no special
setup to use setraw.
;---- setraw.asm ----------------------------------------------
public getraw, setraw
;----- dos ----------------------
; Call DOS function # n.
dos macro fn
mov ah, fn
int 21h
endm
code segment para public 'CODE'
assume cs:code
;----- Getraw ---------------------------------------------
; Returns AX=1 if file BX is a device in raw mode; 0 otherwise.
; Returns Carry set & errorcode in AX if DOS error.
getraw proc near
mov al, 0
DOS 44h ; Get attributes
jc gr_exit ; bad file handle?
mov ax, 20h
and al, dl ; get that bit
mov cl, 4
shr ax, cl
clc
gr_exit:
ret
getraw endp
;----- Setraw -------------------------------------------
; Sets Raw state of file BX to (AX != 0) if file is a device.
; Returns Carry set & errorcode in AX if DOS error.
setraw proc near
mov cx, ax
mov al, 0
DOS 44h
jc sr_exit
test al, 80h ; It it a device?
jz sr_exit ; nope- do nothing.
; Current mode in DX; set CX = 20H if CX nonzero.
or cx, cx
jz sr_ax0
mov cx, 20h
sr_ax0: and dx, 00cfh ; clear old raw bit and hi byte,
or dx, cx ; set new value.
mov al, 1
DOS 44h
sr_exit:
ret
setraw endp
code ends
end
;---- end of setraw.asm ------------------------------------------
/*--- setraw.msc -------------------------------------------------
Routines to set and reset raw mode on stdin/stdout.
For Microsoft C.
------------------------------------------------------------------*/
#include <dos.h>
/* Use the IOCTL DOS function call to change stdin and stdout to raw mode.
* For stdin, this prevents MSDOS from trapping ^P, ^S, ^C, thus freeing us
* of ^P toggling 'echo to printer'.
* For stdout, this radically speeds up the output because there is no
* checking for these special characters in the input buffer whenever
* screen output is occurring.
* Note that only the stdin OR stdout ioctl need be changed since
* apparently they are handled as the same device.
* Thanks to Mark Zbikowski (markz at microsoft.UUCP) for helping me with
* this.
* --- This stolen from sources to the mighty game HACK ---
*/
#define DEVICE 0x80
#define RAW 0x20
#define IOCTL 0x44
#define STDIN fileno(stdin)
#define STDOUT fileno(stdout)
#define GETBITS 0
#define SETBITS 1
static unsigned old_stdin, old_stdout, ioctl();
/*--- set_raw() ----------
Call this to set raw mode; call restore_raw() later to restore
console to old rawness state.
--------------------------*/
set_raw()
{
old_stdin = ioctl(STDIN, GETBITS, 0);
old_stdout = ioctl(STDOUT, GETBITS, 0);
if (old_stdin & DEVICE)
ioctl(STDIN, SETBITS, old_stdin | RAW);
if (old_stdout & DEVICE)
ioctl(STDOUT, SETBITS, old_stdout | RAW);
}
restore_raw()
{
if (old_stdin)
(void) ioctl(STDIN, SETBITS, old_stdin);
if (old_stdout)
(void) ioctl(STDOUT, SETBITS, old_stdout);
}
static unsigned
ioctl(handle, mode, setvalue)
unsigned setvalue;
{
union REGS regs;
regs.h.ah = IOCTL;
regs.h.al = mode;
regs.x.bx = handle;
regs.h.dl = setvalue;
regs.h.dh = 0; /* Zero out dh */
intdos(®s, ®s);
return (regs.x.dx);
}
/*-- end of setraw.msc --*/
/*------ setraw.lc ----------------------------------------------
Lattice C routines which get and set the current raw/cooked state
of a file, given its Lattice file descriptor.
Useful when trying to obtain high console output speeds.
----------------------------------------------------------------*/
#include "\lc\dos.h"
#define CARRY 0x1
#define ERROR (-1)
#define TRUE 1
#define FALSE 0
extern _oserr;
/*---- getraw --------------------------------------------------
Returns TRUE if file fd is a device in raw mode; FALSE otherwise.
Returns ERROR, puts errorcode in _oserr, if DOS error.
----------------------------------------------------------------*/
getraw(fd)
int fd;
{
union REGS inregs;
union REGS outregs;
int flags;
if (fd > 2) fd+=2; /* convert to DOS fd */
inregs.x.bx = fd;
inregs.x.ax = 0x4400; /* get file attributes */
flags = intdos(&inregs, &outregs);
if (flags & CARRY) {
_oserr = outregs.x.ax;
return -1;
}
return (outregs.x.dx & 0x20) ? TRUE : FALSE;
}
/*---- setraw --------------------------------------------------
Sets Raw state of file fd to raw_on (if file is not a device, does nothing).
Returns zero if successful.
Returns ERROR & errorcode in _oserr if DOS error.
----------------------------------------------------------------*/
setraw(fd, raw_on)
int fd, raw_on;
{
union REGS inregs;
union REGS outregs;
int flags;
if (fd > 2) fd+=2; /* convert to DOS fd */
inregs.x.ax = 0x4400; /* get file attributes */
inregs.x.bx = fd;
flags = intdos(&inregs, &outregs);
if (flags & CARRY) {
_oserr = outregs.x.ax;
return ERROR;
}
if ((outregs.x.ax & 0x80) == 0) /* return zero if not device */
return 0;
outregs.x.ax = 0x4401; /* set file attributes */
outregs.x.bx = fd;
outregs.x.dx &= 0xcf; /* clear old raw bit & hi byte */
if (raw_on) outregs.x.dx |= 0x20; /* maybe set new raw bit */
flags = intdos(&outregs, &inregs);
if (flags & CARRY) {
_oserr = inregs.x.ax;
return ERROR;
}
return 0;
}
/*-- end of setraw.lc --*/
/*------ rawtest.lc -------------------------------------------------
Lattice C program to demonstrate the difference in speed between
DOS's raw and cooked modes when writing to the DOS console.
Requires setraw.c; make the demo as follows:
lc setraw rawtest
link \lc\s\c rawtest setraw,rawtest,,\lc\s\lc
and run it by typing
rawtest
Note- Lattice C's raw mode (i.e. using mode "rb" or "wb" with fopen)
is not the same as DOS's raw mode, and does not affect speed.
What does affect speed is whether output is performed with single-character
DOS calls, which is the default. To get a speed improvement, you must
open "con" WITHOUT a trailing colon, and use that file for high-speed output;
see section 5.2 (Device I/O) of the Lattice manual.
When using MS-DOS raw mode, the console is in totally unbuffered mode-
echo is turned off, no printer echoing is done, and no line editing
is done, regardless of which file setraw was applied to. This means
that the console must be in non-raw ("cooked") mode for line-oriented
console input to work properly.
Note: no speed difference will be noticed when using the standard console
driver ANSI.SYS that comes with DOS; you must be using NANSI.SYS to
get massively fast output.
To use nansi.sys, insert the following line in \config.sys:
device = nansi.sys
and put nansi.sys on the top level directory; the system will load
it at boot time.
(If there was already a line invoking plain old ansi.sys, remove it.)
--------------------------------------------------------------------*/
#include "\lc\stdio.h"
char response[128];
main(argc, argv)
int argc;
char **argv;
{
FILE *fp;
int fd;
int old_rawness;
int i;
fp = fopen("con", "w");
if (fp == NULL) fprintf(stderr, "can't open 'con'!");
fd = fileno(fp); /* get Level 1 file descriptor */
old_rawness = getraw(fd); /* Save old raw/cooked state */
setraw(fd, 0); /* make sure we're in cooked mode */
puts("Cooked mode test (hit return):");
gets(response);
fprintf(fp, "\033[2J"); /* clear screen */
for (i=0; i<20; i++)
fprintf(fp, "This is cooked mode! Why is it so darned slow? %d\n", i);
fflush(fp);
puts("Raw mode test (hit return):");
gets(response); /* must be in cooked mode to use gets */
setraw(fd, 1); /* enter raw mode */
fprintf(fp, "\033[2J"); /* clear screen */
for (i=0; i<20; i++)
fprintf(fp, "-- This is raw mode- it's clearly faster than cooked! %d\n", i);
fflush(fp); /* finish writing while in raw mode */
setraw(fd, old_rawness); /* go back to old raw/cooked state */
fclose(fp);
}
/*--- end of rawtest.lc ---*/
--
@//E*O*F nansi.sup//
chmod u=rw,g=r,o=r nansi.sup
echo x - demo.uue
sed 's/^@//' > "demo.uue" <<'@//E*O*F demo.uue//'
begin 644 demo.exe
M35HL`!(`!``@`$<!___)`@`(3)N%!P``'@````$`Z`*U`88'``"\&```#AD`
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````%6+[+@,`.@!!%8S]HEV],=&^E``QT;X50#'
M1ORR";@`@%"@OP"84.AO!H/$!+@`@%"@MP"84.A@!H/$!.CL`8-^!`%U`^G$
M`+@"@%"+7@;_=P+H[P2#Q`2)1O9`=1J+7@;_=P*X60!0N,``4.AD`X/$!N@@
M`NF4`+C0!U"XL at E0_W;VZ(<"@\0&HZ``0'4MN'8`4+C``%#H.0.#Q`3KT[A/
M`%#_=OSH:`"#Q`2)1OR#/J8``'02H:8``4;TH:@`_P:H`#T8`'S7N+@`4/]V
M^NA,`X/$!/]V]+BR"5"@OP"84.B-`X/$!HOP0'4*N)@`4. at 6!H/$`KBX`%#_
M=OCH'@.#Q`0SP%#H"0B#Q`)>B^5=PU6+[#/`Z/$"5HMV!#/`HZ0`HZ8`@#P`
M=#*`/`IT+?\&I@"#/BP%`'4%@#P<<Q'_-J0`5N at T`(/$!`$&I`#K!/\&I`"A
MI``Y1 at 9]%X`\"G4(_P:D`/\&I@"`/`!T`4:+QNL#1NNO7HOE7<-5B^RX`@#H
MA@)75HMV!#/_ at SXL!0%U$(`\6W4+QP8L!0(`B\?I at P"#/BP%`G4EBAPJ__:'
MB0,$=>F`^SMTY/:'B0,#=`C'!BP%``#KU<<&+`4``(H$*N0+P'3J/0<`=.4]
M"`!T$3T)`'05/0T`=-8]&P!T&^LQ at WX&`'3)3^O&BSZB`(M&!IF+S_?Y*_KK
MMH,^+`4`=06X`0#K`C/`HRP%"\!T`^E[_T?KFUY?B^5=PU6+[#/`Z-<!,\!0
M4*"W`)A0Z)8`@\0&HS`%,\!04*"_`)A0Z(0`@\0&HRX%]P8P!8``=!6A,`4,
M(%"X`0!0H+<`F%#H9`"#Q`;W!BX%@`!T%:$N!0P at 4+@!`%"@OP"84.A'`(/$
M!HOE7<-5B^PSP.AM`8,^,`4`=!/_-C`%N`$`4*"W`)A0Z"$`@\0&@SXN!0!T
M$_\V+ at 6X`0!0H+\`F%#H!P"#Q`:+Y5W#58OLN`X`Z"P!QD;S1(I&!HA&\HM&
M!(E&](I&"(A&^,9&^0"-1O)0C4;R4. at G!H/$!(M&^(OE7<-5B^R+7 at 3VAZ0$
M`70%,\#IU`F+3 at B+5@:T/\TA<P2T">L*]H>X!(!T`^@#`.FW"597_(ORB_J+
MR.,;M`VL.L1T%SP:=0?&AZ0$`>L%B`5'XNN+QRO"7U[#@_D!=`>`/`IT[>OH
M]H>X!$!T&;@`1,TA]\(@`'4*C1:J`+0_S2%RU;`*ZR_&!JH``(T6J@"T/\TA
M<L(+P'0:@WX(`70 at N?__B]&X`4+-(;D!`(`^J@`*=`>P#8M6!NN4BU8&ZY*`
M/JH`"G79Z[I5B^R#[`175O]V!. at J"(/$`HOPC48(4/]V!O]V!.BY"H/$!HOX
M_W8$5NB."(/$!(O'7E^+Y5W#68O<*]AR"CL>K`!R!(OC_^'IS015B^R#[`97
M5O]V!.A*$8/$`HOX_W8&Z-0'@\0"B_#_=@97N`$`4/]V!.CI"(/$"(E&_/]V
M!E;H- at B#Q`0Y?OQU"8M>!(I!_YCK`[C__UY?B^5=PU6+[(M>!/:'N`0@=`ZX
M`D(SR8O1S2%S`^EG"/:'N`2`=0/I at 0"+3 at B+5@8>!S/`_%=6B_"+^N-EN`I`
M\JYU,E&+SRO*2>,0S2&<`_"=<P2T">M)"\!T+T:Y`@"ZK@"T0,TA<P2T">LT
M"\!T&EF+U^O%48O/*\K-(9P#\)US!+0)ZQH+P'46]H>X!$!T"XM>!H`_&G4#
M^.L$^;@('%ER`HO&7E_IW`>+3 at B+5@:T0,TA<P2T">OMX^L+P'7G]H>X!$!T
M"HO:@#\:=0/XZ];YN`@<Z]!5B^PR_X@^I@&+1 at 8R[:D(`'0"M2"(+J4!)0,`
M/0,`=06!=@8!`+IZ`;0:S2&Y)P"+5 at 2T3LTA<P/IFP"+1@:+R"4`!3T`!74'
MN`41^>E?!\8&IP$!D:D``G0+BU8$N`!#S2'IH`"I`P!T5ZD`@'52]@;7!(!U
M2[`""@:F`8M6!+0]S2%RQY.X`$3-(?;"@'4MN?__B]&X`D+-(??9NGH!M#_-
M(0O`=!:`/GH!&G4/]]F+T;@"0LTA,\FT0,TAM#[-(8I&!B0#"@:F`8M6!+0]
MS2%R.^F#!?=&!@`!=0:X`@#I:/_&!J<!`/]V".B[!5F)3@@R[?8&I@'_=0?W
M1 at 8"`'4#@.'^BU8$M#S-(7,#Z9T&]@:F`?]U!_=&!@(`=3*3M#[-(8I&!B0#
M"@:F`8M6!+0]S2%RV/8&IP$!=13W1@@!`'0-@,D!DXM6!+@!0\TAD^D%!56+
M[(/L`E:+=@0+]GP, at _X4?0?VA+@$`741QP:4!`D`QP:B!`8`N/__ZT"*A+@$
M)8``B4;^@7X&`(!U!X"DN`1_ZPR!?@8`0'40@(RX!("#?OX`=!.X`$#K$<<&
ME`06`,<&H at 0!`.N^N`"`7HOE7<-5B^R#[`)75HMV!+\"``OV="*`/`!T'5;H
M4 at X#YU!65^A%_8/$!HO'4+C.`E!7Z#?]@\0&H2P#.0:4!'T3 at SZ4!`!\#(L>
ME`31XXN'X at +K`[C1`HOP5N at 4#H/$`E!65^@&_8/$!K@!`%"XWP)05^CW_(/$
M!EY?B^5=P[^P`8LV`@`K]X'^`!!R`[X`$/J.UX'$CA'[<P/I20&!Y/[_-HDF
M-@,VB28T`XO&L033X$@VHS(#M##-(3:CF at 0\`G,J'C/`4`X?NM<'M`G-(<M$
M3U,@,BXP(&]R(&QA=&5R(')E<75I<F5D#0HD`_>)-@(`C,,KWO?;M$K-(3:,
M'I($BS8L`!X6N``US2$VB1XN`S:,!C`##A^X`"6Z!@G-(3:+#B(%XR(VQ08D
M!8S:,]LV_QX@!7,#Z<P`-L4&*`6,VKL#`#;_'B`%!Q_\ORP%N9`1*\\SP/.J
M%A8''^@-!KL$`+@`1,TA<@KVPH!T!8"/N`1`2WGLZ/\!Z%P!NRP%@?LL!7,(
M4_\76T-#Z_*Y!@`KX;Z<!(O\%@?SI.C,`#/MZ%CW4.AF``T*4W1A8VL@;W9E
M<F9L;W<-"@T*1&EV:61E(&5R<F]R#0H-"D9L;V%T:6YG('!O:6YT(&YO="!L
M;V%D960-"K$2NJX(,NT.'[L"`+1`S2$6'[C_`%#H-0&Q$+K`".OEL1VZT`CK
MWE6+[(,^F`0`=`3_%I@$_W8$Z!,!B^5=PU6+[%=6BWX$BP6+70*+302+50:+
M=0B+?0K-(5>+?@:)!8E=`HE-!(E5!HEU"(]%"G($,_;K".B<`[X!`(L%B74,
M7E]=PU6+[(/L"%=6BS:@!.L7N`P`4+C8!%#_-.A?#8/$!@O`=`B#Q@*#/`!U
MY(,\`'0YBSR#QPS'1OX``(H%1YB)1OKK'(H%F#W_`'4$,L#K`HH%BU[^_T;^
MB(>X!/].^D>#?OH`==['!```7E^+Y5W#CP;F!(X>D at 0SR8O!B^F+^4F+-BP`
M"_9T"([&\JY%KG7Z19=`)/Z+_='E`\46'^C\^8O/B_P#_8OL%@>.WC/V2>,-
MB7X`146LJ at K`=?KB\XE.`!8?B2:@!/\FY at 15B^R[+`6!^RP%<PA3_Q=;0T/K
M\N at A!`KD=`J`?@0`=03&1 at 3^'L46+ at .X`"7-(1^+#B(%XP>[`@#_'B`%BT8$
MM$S-(8\&Z`2.'I($%@>^@`"LF#/2)H`^F at 0#<F50C at 8L`#/`B\CWT8OX\JXF
M.`5U^8/'`XO(]]&+]R:*!4=!.N!T%#PB=`@\"70$/"!UZU at 6![Z!`.LK3RO^
M"_]T\8O/0EN+PP/!!0,`)?[_*^"+_!X&'Q8'\Z2P(*J+RQ^^@0#K#HO(!`0D
M_BO at B_RX0R"K\Z2+P:J+]!8?4(O<B_ZLJ at K`=#T\(G4?5O\&G`2L"L!T+CPB
M=0>`??]<=01/JNOM1\9%_P#KU>@W`'303E9&_P:<!*RJ"L!T". at E`'7UZ^&J
MB_1+2SOS<PBMAP>)1/[K\HO<"])U`O\'B2:>!/\FZ`0\"70"/"##58OLQ@:E
M`0#_=@;H7P!9B4X&BU8$,NVT/,TA<DV+V(M6!+@`0\TA]\$!`'4$,LGK`K$0
M]T8&`$!U#O=&!@"`=0KV!M<$@'4#@,F`"@ZE`8#)`;@`1,TAB\/VPH!T`X#)
M0(B/N`3&AZ0$`.D%`56+[*&6!/?0BUX$(\.!XP#`J(!U`X#+`8E>!%W#58OL
M5HMV!('^N`!U//9$!@QU-HI$!YB+V-'C]H=0`0%U)\=$!&`%BD0'F(O8T>/&
MAU`!`<<&F`27%\=$`@`"BT0$B02X`0#K-('^T`!U+/9$!@QU)HI$!YB+V-'C
M]H=0`0%U%[@``E#H80N#Q`*)1`0+P'0&@$P&".NY,\!>B^5=PU6+[%:+=@:#
M?@0`=$R!_K@`=26*1`>84. at A"H/$`@O`=!96Z'<*@\0"BD0'F(O8T>/&AU`!
M`.L:@?[0`'4;5NA;"H/$`O]T!.CQ"H/$`H!D!O<SP(D$B40$7HOE7<-R"#/`
MB^5=PW,&Z`T`N/__B^5=PS+DZ`$`PZ*B!`KD=2.`/IH$`W(-/")S#3P@<@6P
M!>L'D#P3=@*P$[OJ!->8HY0$PXK$Z_=5B^R#[`975HMV!(M^"HM&!O=F"(E&
M^HE&_`O`=#OV108,=3Z*10>8B]C1X_:'4`$!=2__30*#?0(`?`R*!(L=_P6(
M!RKDZPM7B at 284.A&"(/$!/9%!B!T!3/`Z=H`1O]._/9%!@AU$HI%!YB+V-'C
M]H=0`0%U`^FC`(-^_`!U`^F)`(M&_#E%`G(<4%;_->A8"H/$!HM&_"E%`HM&
M_`$%QT;\``#KTX-]`@!T(?]U`E;_->@T"H/$!HM%`@$%BT4"*4;\`W4"QT4"
M``#KK/]-`H-]`@!\#(H$BQW_!8@'*N3K"U>*!)A0Z*L'@\0$]D4&('481O].
M_.E__U>*!)A0Z),'@\0$]D4&('0-BT;Z*T;\*]+W=@;K'T;_3OR#?OP`=.G_
M30*#?0(`?,^*!(L=_P6(!RKDZ\Y>7XOE7<-5B^Q6,_:Y-0`RY/RL,N#B^X#T
M5?X.-0!U!H at F-`#K$0KD=`VZ-@"[`@"Y&0"T0,TA,L"B-0!>B^5=PU6+[+AB
M`>A5]5=6BW8&C8:B_J,^!8M&!*,V!8M&"*,Z!3/`HTP%HTH%@#P`=0/I20&`
M/"5T`^D*`<<&1`4!`#/`HT(%HS(%HT8%HS@%HSP%HS0%HU`%HU(%QP9`!2``
MZS*`/"UU!O\&4 at 7K)X`\*W4,_P9"!<<&-`4``.L6@#P@=0V#/D(%`'4*_P8T
M!>L$_P90!4:*!)A0Z`<&@\0""\!UOU:X2`50Z)`%@\0$B_"`/"YU$O\&/`5&
M5KA$!5#H>06#Q`2+\(`\;'4'QP8X!0(`1H`\`'4#Z:``B at 28B8:>_CU%`'0*
M/4<`=`4]6`!U"?\&, at 6#AI[^((N&GOXM8P`]%0!W/@/`DR[_I_4/_P9&!<<&
M4`4``+@*`%#HAP"#Q`+K4+@(`.ORN!``Z^TSP%#HH`'KZ;@!`.OU_[:>_N@>
M`NO;B_[K0>,/OP_H#^@/Z`_Q#_$/\0_Q#_$/\0_Q#]$/\0_Q#_$/VP_Q#[L/
M\0_Q#]8/@SY,!0!T!:%*!>L at 1NFF_H`])70&1X`]`'7UB\<KQE!6Z!X#@\0$
MB_?IBOY>7XOE7<-5B^RX&`#HL/-75H-^!`IT!/\&1 at 6#/C@%`'06BQXZ!8L'
MBU<"B4;XB5;Z at P8Z!03K*8,^1 at 4`=!"+'CH%BP>)1OC'1OH``.L-BQXZ!8L'
MF8E&^(E6^H,&. at 4"@SY0!0!T#8M&^`M&^G0%BT8$ZP(SP*-.!8LV/@6#/D8%
M`'4J at W[Z`'TD at WX$"G47Q at 0M1HM&^(M6^O?8@](`]]J)1OB)5OK'1O8!`.L%
MQT;V``"+_8/O&/]V!%?_=OK_=OCHL`2#Q`B#/CP%`'0 at 5^A7!(/$`HL.1`4K
MR(E._NL$Q at 0P1HM&_O]._ at O`?_**!8@$@SXR!0!T!SQA?`.`+"!&1X!]_P!U
MYH,^1 at 4`=12A0 at 4+!C0%=`N#?O8`=06X`0#K`C/`4.A5`H/$`EY?B^5=PU6+
M[+@(`.B"\E=6QP9`!2``@WX$`'00O@$`H3H%@P8Z!0*)1OSK,XL>. at 6+!XE&
M_(,&. at 4""\!U!<=&_/X$_W;\Z+,#@\0"B_"#/CP%`'0*.09$!7,$BS9$!8L^
M2`4K_H,^4 at 4`=0=7Z`X!@\0"5O]V_.AM`8/$!(,^4 at 4`=`=7Z/8`@\0"7E^+
MY5W#58OLN`(`Z/;QH3H%B4;^@SX\!0!U!L<&1`4&`/\V, at 7_-D0%_W8$_S8^
M!?]V_NA3`X/$"H-^!&=T!H-^!$=U&(,^4`4`=1&#/D0%`'0*_S8^!>@Y`X/$
M`H,^4`4`=!&#/D0%`'4*_S8^!>@K`X/$`H,&. at 4(QP9.!0``H4(%"P8T!702
M_W;^Z"(#@\0""\!T!;@!`.L",\!0Z"0!B^5=PU6+[#/`Z%?Q5H,^3`4`=3B+
M'C8%_T\"@W\"`'P1BD8$BQXV!8LW_P>(!"KDZPW_-C8%_W8$Z.8"@\0$0'4&
M_P9,!>L$_P9*!5Z+Y5W#58OLN`(`Z`GQ5U:#/DP%`'51BW8$"_9^2NLSBQXV
M!?]/`H-_`@!\$:!`!8L>- at 6+/_\'B`4JY.L._S8V!?\V0`7HC0*#Q`1`=03_
M!DP%B\9."\!_QH,^3`4`=0>+1 at 0!!DH%7E^+Y5W#58OLN`(`Z*#P5U:+=@2+
M?@:#/DP%`'5,ZS6+'C8%_T\"@W\"`'P2B at 2+'C8%BP__!XO9B`<JY.L._S8V
M!8H$F%#H)`*#Q`1`=03_!DP%1HO'3PO`=<2#/DP%`'4'BT8&`09*!5Y?B^5=
MPU6+[+@*`. at V\%=6BS8^!3/`B4;\B4;XBSY(!5;HC`&#Q`*)1OHK^"M^!*%.
M!;$#T_ at K^(,^4 at 4`=16`/"UU$(,^0`4P=0FLF%#HE/Z#Q`*#/D`%,'0+"_]^
M!X,^4 at 4`=!F#?@0`=`;_1OCH7@"#/DX%`'0&_T;\Z&\`@SY2!0!U)E?HJ/Z#
MQ`*#?@0`=`F#?O@`=0/H-`"#/DX%`'0)@W[\`'4#Z$(`_W;Z5NCH_H/$!(,^
M4 at 4`=`W'!D`%(`!7Z&O^@\0"7E^+Y5W#58OL,\#H;.^#/D(%`'0$L"OK`K`@
MF%#H^_V+Y5W#58OL,\#H3N^X,`!0Z.C]@\0"@SY.!1!U%8,^, at 4`=`2P6.L"
ML'B84.C,_8/$`HOE7<-5B^RX`@#H&^]75HMV!H`\*G4.BQXZ!8,&. at 4"BS]&
MZSHS_X`\,'PS@#PY?RXY/CP%=0N`/#!U!L<&0`4P`*R8B\_1X='A`\_1X0/(
M@^DPB_F`/#!\!8`\.7[CBUX$B3^+QEY?B^5=PU6+[+@"`.BS[E:^!07K#8H$
M.$8$=06X`0#K"$:`/`!U[C/`7HOE7<-5B^Q7'@>+?@0SP+G___*NB\%`0/?8
M7UW#58OLZ';SB^5=PU6+[.AL\XOE7<-5B^SH8O.+Y5W#58OLZ%CSB^5=PU6+
M[.A.\XOE7<-5B^RS`.GR`U6+[(/L!%=6BW8&BD0&F*F#`'0&]D0&0'0&N/__
MZ=H`]D0&`70&@$P&(.ON@$P&`H!D!N\SP(E$`HOXB7[^]D0&"'4/BD0'F(O8
MT>/VAU`!`70PBSPK?`0+_WX25_]T!(I$!YA0Z$#N@\0&B4;^BT0$0(D$QT0"
M_P&+7`2*1 at 2(!^MJ]D0&!'5.@?ZX`'4MBD0'F%#H:0"#Q`(+P'4UQP:8!)<7
MQT0$8`6*1`>8B]C1X\:'4`$!QP1A!>NXN``"4.A+`8/$`HE$!`O`=`:`3`8(
MZYN`3`8$OP$`5XU&!%"*1`>84.C![8/$!HE&_CE^_G0#Z3'_BD8$*N1>7XOE
M7<-5B^R+7 at 2#^Q1]$8/[`'P,]H>X!$!T!;@!`.L",\!=PU6+[%=6'@>+3 at CC
M+XO9BWX$B_<SP+G___*N0??9.\MV`HO+B_Z+=@;SIHI$_S/).D7_=P5T!4'K
M`O?1B\%>7UW#58OL@^P$5U:+=@0S_U;HW0*#Q`**1`8D`SP"=3SV1`8(=0^*
M1`>8B]C1X_:'4`$!=">+!"M$!(E&_`O`?AM0_W0$BD0'F%#H_>R#Q`8[1OQT
M!X!,!B"___^+1`2)!,=$`@``B\=>7XOE7<-5B^R#[`175KZP`#/_ZQ>*1`:8
MJ8,`=`M6Z'G_@\0"0'0!1X/&"#DV>`%SXXO'7E^+Y5W#58OLBUX$@$_^`8OE
M7<-5B^Q65[L*!8,_`'4I'@>X!0#HL`%U!3/`F>LD0"3^HPH%HPP%EL<$`0"#
MQ at 3'1/[^_XDV$`6+3 at 2,V([`Z%H`7UZ+Y5W#58OL5U8>!XM^!(MV!HO7BTX(
M._YV%(O&`\$[^',,`_$#^4Y/_?.D_.LAB\<+QM'H<PJ+QS/&T>ARZZ1)B]G1
MZ?.ET>MS!8H$)H@%B\)>7UW#Z<L`@_GN<_A!@.'^BW<"_*V+_J@!=$)(.\%S
M%8O0`_"MJ`%T-`/"!0(`B_>)1/[KYHO^=`P#^8E,_BO!2(D%ZP4#^?Y,_HO&
MC-J!^K`!=`4FC!X8!8E_`L,FQ at 8<!0(]_O]T)8O^`_"MJ`%T\HO^2#O!<[V+
MT`/PK:@!=.(#P at 4"`(OWB43^Z^:+1P at +P'0$CMCK$R;^#AP%=!",V#VP`70%
M)HX>%`6+-^N]BW<&,\#H60`[QG0-)`%`0)CH30!T#?Y-_N at +`'0%EDY.ZYHS
MP)G#48M%_J@!=`,KR$E!0;K_?R8[%AH%=@31ZG7UB\$#QG(5`\)R#??2(\(K
MQN@,`'4(]]+1ZG7E,\!9PU)1Z!T`=!A7B_Z+\`/RQT3^_O^)=P:+UBO72HE5
M_EA96L-34#/2'E)24+@!`%`&'^AW`(/$"(/Z_Q]:6W0""]+#5U:+3 at J+1@2+
M5@:+?@A7'@?\DPK`=!.#^0IU#@O2>0JP+:KWVX/2`/?:B_>2,](+P'0"]_&3
M]_&2A],$,#PY=@($)ZJ+P at O#=>*(!4^LA at 6(1/]/._=R]5A>7UW#58OLBUX$
M@&<&SUW#58OL5E<&@WX(`'4XOS8#BU8&BT8$2'4'Z%,`<B?K2(LVA at -(=!$[
M]W0-BT0"B48,5N at Z`%YS,(/&!('^A at -S!`O2=0:X__^9ZQV+VH/##]';L0/3
MZ[1(S2%RZ9*)!(E4`HDVA@,SP`=?7HOE7<.+3 at R+]SE,`G0,@\8$@?Z&`W7R
M^>L_B]H#''(YB]..P3OW=08Y'C(#<R:#PP_1V]'KT>O1ZSOW=0D#V:&2!"O8
MCL"T2LTA<@T[]W4$B18R`Y*'!(O1PP``````````````````````````````
M`````````$, at 3&EB<F%R>2`M("A#*4-O<'ER:6=H="!-:6-R;W-O9G0 at 0V]R
M<"`Q.3 at U``%.=6QL('!O:6YT97(@87-S:6=N;65N=`T*`!M;,DH`&UM!`$-A
M;B=T(&]P96X@(B5S(B!T;R!R96%D(&ET+ at H`17)R;W(@<F5A9&EN9R!F:6QE
M("(E<R(*+"!A<F=V6S%=`&1E;6\Z(``````(````````````)A(-"K('``"R
M!P$``````````@$````````&`@```````(0#`````````@0`````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````!````````````````````````````````
M````````````````````2`$`````````````````````````````````````
M````````````````````````17)R;W(@,```3F\@<W5C:"!F:6QE(&]R(&1I
M<F5C=&]R>0``````07)G(&QI<W0@=&]O(&QO;F<`17AE8R!F;W)M870 at 97)R
M;W(`0F%D(&9I;&4@;G5M8F5R````3F]T(&5N;W5G:"!C;W)E`%!E<FUI<W-I
M;VX at 9&5N:65D`````$9I;&4 at 97AI<W1S`$-R;W-S+61E=FEC92!L:6YK````
M`$EN=F%L:60 at 87)G=6UE;G0``%1O;R!M86YY(&]P96X at 9FEL97,`````3F\@
M<W!A8V4@;&5F="!O;B!D979I8V4``````$UA=&@@87)G=6UE;G0`4F5S=6QT
M('1O;R!L87)G90``4F5S;W5R8V4 at 9&5A9&QO8VL@=V]U;&0@;V-C=7(`.B``
M56YK;F]W;B!E<G)O<@`*``"H`;`!L0'+`<P!S0'.`<\!X0'S`0,"!`(%`A4"
M)P(H`BD"*@(V`D@"20)*`DL"7`)=`G$"<@)S`G0"C`*-`HX"CP*0`IX"KP*P
M`B4``````````````+`!````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`#8#`"`@("`@("`@("@H*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0
M$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0 at 8&!@8&!`0$!`0$!`0$!`0$!`0$!
M`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@("`@("`@("`A`0$!`@````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````(&!@0$!````
M````````````````````````````````.T-?1DE,15])3D9/`````````!8"
M`A at -"0P,#`<(____$@T2`O\H;G5L;"D`*RT@(P``````````````````````
2`"``````````````````````
`
end
@//E*O*F demo.uue//
chmod u=rw,g=r,o=r demo.uue
echo x - nansi.uue
sed 's/^@//' > "nansi.uue" <<'@//E*O*F nansi.uue//'
begin 644 nansi.sys
M_____Q.`RP#6`$-/3B`@("`@&ULR2DYA;G-I+G-Y<R!V,BXR.B!.97<@04Y3
M22!D<FEV97(@*$,I($1A;FEE;"!+96=E;"P at 4&%S861E;F$L($-!(#$Y.#8-
M"AH``````0```QA/```````'```````````````#````````````6QL``'@`
M````````=P``````H64`B]BT`)**Q[0`*]!"BL/^P/8F9P`"QX#4``/`E\-P
M"2,!(P$?`28!-0%)`50!F`&8`2,!(P$NB1Y<`"Z,!EX`R_M04U%25597'@8N
MQ1Y<`(I'`L1W#HM/$CP,=R"3T>.,R([8_Y>S`"[%'EP`#0`!B4<#!Q]?7EU:
M65M8R^@*`.OF+L<&BP`!`,^X$PC#,\##XPJ+_E'HXP)9JN+X,\##Z",#=`O%
M'EP`B$<-,\#K`[@``L/H#P.X``)T`C/`PS/`HX,`HX<`HXL`HX\`N$``CL`F
MH1H`)J,<`#/`PP#['@904U%25597N0$`C,N.PX[;OG(!B`3H"@!?7EU:65M8
M!Q_/C`9O`+A``([8H4D`+J)C`/[,+H at F90"@8@"8`\"3BX=0`"ZC9@"A8P`N
MHW,`H4X`T>C1Z-'HT>B`Q+`N@#YC``=T`X#$"`X?HVT`CL#HJ_[H%`%R`^B?
M`8L>=0"*)FL`CAYO`/SC(RZ#/F$``'50Z/4`<@/I#`&L/!QR(B[7JTK@]70$
MZP3 at YW1HC,B.V*!E`/[`*L*B9@#H+0$SP,,\&W0:/`UT+SP*=&`\"70+/`AT
M$#P'=!CIP@#K>9#II`+IE`(N.A9E`'<#3T]"Z[CH(@(*P.NQ+J!E`/[`*L*T
M`"OX*_ at NBA9E`$(NBB9K``P!ZY1!+O8&8``!=05/3T+KABZ*%F4`0BOZ*_HN
MH&0`+C@&9P!R!>@%`>L0+OX&9P`NH&4`M`!``\`#^"Z*)FL`#`'I4O\NH&4`
M_L`JPE&U`(K(@.$']MF`P0 at KT9RP(. at 6`','\ZN=6>DL_P/1Z#P`2N+ZG5GI
M'_\N@#YC``1R"BZ`/F,`!W0"^,/YP^CI_W,(Z?G^K#P<<@TNU^@.`$K@\W0&
MZ?7^Z0;_Z5?_4E%34"Z at 90#^P"K"+J)F`"Z+%F8`,]NT`LT0N0$`6%"*W+<`
MM`G-$%A;65K#Z)S_<RJ+W]'KBQ9S`+`.[NL`0HK'[NL`2K`/[NL`0HK#[KA`
M`([8+J%F`*-0`,.X%H_HGO_#M`#H9/]S%RZ*)FL`@.1_+H`^8P`'=0>`_`%U
M`K0'PU!345+HVO^*_+`!M`:Q`+4`+HH690`NBC9D`,T06EE;6,.+-N`$"L!T
M`K0`.S;>!'8.BPP[1/YT"X/N!"OQZ^P+]NL'@^X"*_$ZP,.Y!`"[?P"#PP2+
M-POVX??#Z.W_="G_#TZ+;P(^B@*#[@%R&8'[@P!T$PK`=0__#SZ*(L<&@P`!
M`(@F>`#K&[0`S18+P'3XZ(W_=0J)#H\`B3:1`.N[/`!TV</HH_]T"4Z+;P(^
MB at +K&K0!S19T%PO`=0:T`,T6Z_#H6_]U!0/QBD3_@,P!PQ0%`P!04U%25597
ML+:Z0P#N2BZAAP3K`.Z&X.L`[KIA`.L`[%`,`^L`[@:X0`".P":+'FP`N?__
M)J%L`"O#+CL&B01_`N+Q!U at D_.Y?7EU:65M8PP``,#`P,#`NB1YQ`"ZC80#I
M-/TNBQYQ`"[_)F$`Z9D`X at 6X`@7KX*P\6W7Q+HL>W`0NQ@<`+L8&VP0`X at 6X
M'07KQ:P\/70'/#]T`T[K!^(%N#`%Z[*L/#!R%CPY=Q(L,"Z(!R[&!ML$`>)B
MN*@%ZY<\(G0$/"=U="ZB:@#B!;A>!>N$K"XZ!FH`=!,NB`<N.Q[>!(/3`.+K
MN%X%Z6G_+L8'`.(&N(4%Z5W_K#P[=`)!3N*BN#`%Z4[_+L<&80```"Z*)FL`
M+HL>=0#I:_VL/#!R&CPY=Q8L,"Z&!U*R"O;B6BX`!^+GN*@%Z1O_/#MU$"X[
M'MX$@],`+L8&VP0`ZYX\0'*U/'IWL3Q:=@8\87*I+`9641X.'RQ`F`/`!44&
MB\LNBS;<!"O.+O8&VP0!=`%!DZ!E`$`JPJ)F`+0`K`K`=0%`_Q<?65XNBB9K
M`"Z+'G4`+L<&80````O2Z>7[U`H%,#"&X*J&X*K#30@`!_H&YP;M!J\&KP:O
M!K`&KP9/!T8'(P@?"*\&KP91"*\&KP:O!J\&KP:O!J\&KP:O!J\&KP:O!J\&
MKP:O!K`&KP:2"*\&KP:O!@H)'`=S!Z\&J`>O!J\�>O!A0'KP:O!J\&#@FO
M!L,*P'0!2*)G`#/`@_D"<@:L"L!T`4BB9@"A9@`Z!F4`=@:@90"B9@`Z)F0`
M=@:@9`"B9P#HK?G#``9F`.O;*`9F`',%Q at 9F``#KS@`&9P#KR"@&9P!S!<8&
M9P``Z[NA9@"C:`##H6@`HV8`ZZQ."\EU!,8$`$&L4;D6`)"[*PF#PP,Z!^#Y
M=0N+1P$@!FL`""9K`%GBX,-2BPYF`(KUZQ0\`G4?QP9F````Z#?Y4C/)BC9D
M`. at P_(K\BA9E`+@`!LT06L-74@:,R([`_;^``*!G`/[`Z+/^L#NJH&8`_L#H
MJ/ZP4JJP#8D^B0"JN((`*\>CAP#\!UI?PPO)=%G\3DE)K0K`=`)!3E<&45;]
M'@?H%OQU%H/!!(LNW at 0!#MX$3HO^`_F+SBO-\Z1>68L^W at 2#[P2+WRO9@^L0
M.Q[<!'(2B4T#B44!XP:D@\8"XOJ)/MX$!U_\PP8>!_V+/N`$N`$`J[@`<JNP
M$*J)/MX$!^ODM`;K`K0'BCYD`"H^9P`ZQW8"L`!0Z%_[BOQ8L0"*+F<`4HH6
M90"*-F0`S1!:P[4!ZP*U`.BI^G,Y.L)V`HK"5Y&+Z;4`B_<#\0/Q]MD"RK4`
M_/;$`70,A_[]B\%(`\`#^`/P!A_SI8O-Z`O[L"#SJ_Q?P['_/`=U!H at .8`#K
M:SPK=4*T$KL0_\T0]\/\_G5:Z$WZ<U6T`*!C`,T0N!(1LP#-$+@`$K, at S1"T
M`;D'!\T0BQ9S`+`*[NL`0K`'[L8&9``JZPFT`,T0Q at 9D`!BX0``>CMBA20`?
MHF,`_LR()F4`QP9F````Z(KWP[$`ZX:+'G4`XP].K4EU`HK@`MB`UP"()\,S
MP(@'0_[`=?GK]```!P'_"`3X`07_@`?X<`B(`![X`!_X!"#X`B'X!B+X`2/X
M!23X`R7X!RB/`"F/0"J/("N/8"R/$"V/4"Z/,"^/<#/`CMB[;`#'!Q<!C$\"
MNZ0`QP=S`8Q/`@X?#@?\OW`)B3[<!(''``*)/MX$1[`0JK@`<JNX`0")/N`$
9JXD^=0`SP*K^P'7[,\#%-EP`B7P.C$P0PP*)
`
end
@//E*O*F nansi.uue//
chmod u=rw,g=r,o=r nansi.uue
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
20 150 941 readme
196 1285 9811 nansi.doc
17 35 367 nansi.mkf
266 1217 7967 nansi.sup
198 200 12079 demo.uue
59 61 3474 nansi.uue
756 2948 34639 total
!!!
wc readme nansi.doc nansi.mkf nansi.sup demo.uue nansi.uue | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0
--
Ed Nather
Astronomy Dept, U of Texas @ Austin
{allegra,ihnp4}!{noao,ut-sally}!utastro!nather
nather at astro.AS.UTEXAS.EDU
More information about the Comp.sources.unix
mailing list