[comp.sources.amiga] v91i097: MandelbrotSet 1.2 - generate and save mandelbrot and julia sets, Part01/01

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/08/91)

Submitted-by: RWALLACE%vax1.tcd.ie@pucc.PRINCETON.EDU
Posting-number: Volume 91, Issue 097
Archive-name: applications/mandset-1.2/part01

[ includes uuencoded executable and icons  ...tad ]

     The program in this drawer will display the Mandelbrot and Julia 
sets and save them to disk as IFF files. Each image takes several hours 
to generate, though programs which allow multitasking can be used while 
this is going on.

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  Mandelbrot_Set.c Mandelbrot_Set.doc console.c input.c
#   makefile mandelbrot0.uu mandelbrot1.uu mandelbrot_.uu saveilbm.c
#   scanfloat.c
# Wrapped by tadguy@ab20 on Tue May  7 20:15:39 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Mandelbrot_Set.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Mandelbrot_Set.c'\"
else
echo shar: Extracting \"'Mandelbrot_Set.c'\" \(8069 characters\)
sed "s/^X//" >'Mandelbrot_Set.c' <<'END_OF_FILE'
X/* Mandelbrot and Julia set program by Russell Wallace 1987. Requires linkage
X   with files saveilbm.o input.o console.o. If using Aztec C,
X   also link with m.lib and use +L compile option.
X
X   Original version developed with Aztec C 3.2a. Version 1.1 recompiled with
X   Lattice C 4.0 1 October 1988, not because I think Lattice C is better than
X   Aztec overall but because I can get Lattice to do double-precision floating
X   point (though not using the standard Amiga libraries) whereas the Aztec
X   version only used single precision which severely restricted the detail
X   which could be plotted. Use the enclosed makefile with Aztec C's make
X   utility to compile under Lattice (if you have both compilers...)
X
X   Version 1.2 24 October 1988 with Lattice C 4.0, uses NTSC/PAL vertical
X   resolution depending on the system it's running on. Also correctly displays
X   the region far from the Mandelbrot set as color 0. */
X
X#include <exec/exec.h>
X#include <exec/execbase.h>
X#include <hardware/blit.h>
X#include <graphics/copper.h>
X#include <graphics/regions.h>
X#include <graphics/gfxbase.h>
X#include <graphics/gfxmacros.h>
X#include <graphics/gels.h>
X#include <intuition/intuition.h>
X
Xstruct IntuitionBase *IntuitionBase=NULL;
Xstruct GfxBase *GfxBase=NULL;
X
X#define MAXX 320
Xint maxy;
X#define NUMITEMS 5		/* 5 items in menu */
X#define BUFLEN 50		/* Length of input buffer */
X
Xshort input ();
Xlong saveilbm (),start ();
X
Xchar inbuf[BUFLEN];
X
Xstruct NewScreen MyScreen=
X{
X	0,0,
X	MAXX,0,
X	5,0,31,
X	0,
X	CUSTOMSCREEN,
X	0,
X	"Mandelbrot Set v1.2",
X	0,0
X};
X
Xstruct NewWindow DrawWindow=
X{
X	0,0,
X	MAXX,0,
X	0,31,
X	MENUPICK,
X	BORDERLESS|BACKDROP|ACTIVATE,
X	0,
X	0,
X	0,
X	0,
X	0,
X	0,
X	0,
X	0,
X	0,
X	CUSTOMSCREEN
X};
X
Xstruct Screen *Screen=NULL;
Xstruct Window *Backdrop=NULL;
Xstruct RastPort *DrawRP;
Xstruct ViewPort *DrawVP;
Xstruct IntuiMessage *message;
X
Xstruct MenuItem MenuItems[NUMITEMS];
Xstruct IntuiText MenuText[NUMITEMS];
Xstruct Menu Menu[1];
X
XBYTE titlebar=TRUE;
XUSHORT palette[]={0x000,0xF00,0xF20,0xF40,
X				  0xF60,0xF80,0xFA0,0xFC0,
X				  0xFE0,0xFF0,0xEF0,0xCF0,
X				  0xAF0,0x8F0,0x6F0,0x4F0,
X				  0x2F0,0x0F0,0x0E2,0x0C4,
X				  0x0A6,0x088,0x06A,0x04C,
X				  0x02E,0x00F,0x10F,0x40F,
X				  0x80F,0xB0F,0xF0F,0xAAA};	/* Color palette in hex */
X
Xmain ()
X{
X	ULONG class;
X	USHORT code,ItemNum;
X	IntuitionBase=(struct IntuitionBase *)OpenLibrary ("intuition.library",0);
X		/* Come on, when is intuition.library not going to be available? */
X	GfxBase=(struct GfxBase *)OpenLibrary ("graphics.library",0);
X		/* Ditto graphics.library */
X	MyScreen.Height=DrawWindow.Height=maxy=GfxBase->NormalDisplayRows;
X		/* Fetch PAL/NTSC screen height values */
X	if (!(Screen=(struct Screen *)OpenScreen (&MyScreen)))
X	{
X		cleanup ();
X		exit (3);
X	}
X	DrawWindow.Screen=Screen;
X	if (!(Backdrop=(struct Window *)OpenWindow (&DrawWindow)))
X	{
X		cleanup ();
X		exit (4);
X	}
X	DrawRP=Backdrop->RPort;
X	DrawVP=&Screen->ViewPort;
X	setcols ();
X	initmenuitems ();
X	initmenu ();
X	SetMenuStrip (Backdrop,&Menu[0]);
X	SetRast (DrawRP,0);
X
X	FOREVER
X	{
X		WaitPort (Backdrop->UserPort);
X		while (message=(struct IntuiMessage *)GetMsg (Backdrop->UserPort))
X		{
X			class=message->Class;
X			code=message->Code;
X			ReplyMsg (message);
X			if (class==MENUPICK && code!=MENUNULL)
X			{
X				ItemNum=ITEMNUM (code);
X				switch (ItemNum)
X				{
X					case 0:		/* Show/hide title bar */
X						ClearMenuStrip (Backdrop);
X						if (titlebar==TRUE)
X						{
X							titlebar=FALSE;
X							ShowTitle (Screen,0);
X							MenuText[0].IText=(UBYTE *)"Show Title Bar";
X						}
X							else
X							{
X								titlebar=TRUE;
X								ShowTitle (Screen,1);
X								MenuText[0].IText=(UBYTE *)"Hide Title Bar";
X							}
X						SetMenuStrip (Backdrop,Menu);
X						break;
X					case 1:		/* Do Mandelbrot Set */
X						doset (0);
X						break;
X					case 2:		/* Do Julia Set */
X						doset (1);
X						break;
X					case 3:		/* Save screen */
X						if (titlebar)
X							ShowTitle (Screen,0);
X						savescreen ();
X						if (titlebar)
X							ShowTitle (Screen,1);
X						break;
X					case 4:		/* Exit */
X						ClearMenuStrip (Backdrop);
X						cleanup ();
X						exit (0);
X				}
X			}
X		}
X	}
X}
X
Xsavescreen ()
X{
X	if (!(start (Screen,"Save screen")))
X	{
X		DisplayBeep (Screen);
X		return;
X	}
X	print ("Enter filename:\n");
X	inbuf[0]='\0';
X	if (input (inbuf,BUFLEN)==-1000)
X	{
X		finish ();
X		return;
X	}
X	finish ();
X	if (saveilbm (DrawRP->BitMap,palette,inbuf))
X		DisplayBeep (Screen);
X}
X
Xdoset (type)
Xint type;
X{
X	register short n,i,j;
X	double x,y,xx,a,b,xgap,ygap,xsquared,ysquared;
X	double x1,y1,x2,y2,cx,cy,scanfloat ();
X	if (!(start (Screen,"Enter Parameters")))
X	{
X		DisplayBeep (Screen);
X		return;
X	}
X	if (type)
X	{
X		print ("Enter X component of C:\n");
X		inbuf[0]='\0';
X		if (input (inbuf,BUFLEN)==-1000)
X		{
X			finish ();
X			return;
X		}
X		cx=scanfloat (inbuf);
X		print ("Enter Y component of C:\n");
X		inbuf[0]='\0';
X		if (input (inbuf,BUFLEN)==-1000)
X		{
X			finish ();
X			return;
X		}
X		cy=scanfloat (inbuf);
X	}
XENTERAGAIN:
X	print ("Enter bottom left X co-ord:\n");
X	inbuf[0]='\0';
X	if (input (inbuf,BUFLEN)==-1000)
X	{
X		finish ();
X		return;
X	}
X	x1=scanfloat (inbuf);
X	print ("Enter bottom left Y co-ord:\n");
X	inbuf[0]='\0';
X	if (input (inbuf,BUFLEN)==-1000)
X	{
X		finish ();
X		return;
X	}
X	y1=scanfloat (inbuf);
X	print ("Enter top right X co-ord:\n");
X	inbuf[0]='\0';
X	if (input (inbuf,BUFLEN)==-1000)
X	{
X		finish ();
X		return;
X	}
X	x2=scanfloat (inbuf);
X	print ("Enter top right Y co-ord:\n");
X	inbuf[0]='\0';
X	if (input (inbuf,BUFLEN)==-1000)
X	{
X		finish ();
X		return;
X	}
X	y2=scanfloat (inbuf);
X	if (y2<=y1 || x2<=x1)
X	{
X		print ("Invalid co-ordinates!\n");
X		goto ENTERAGAIN;
X	}
X	finish ();
X	SetRast (DrawRP,0);
X	xgap=(x2-x1)/MAXX;
X	ygap=(y2-y1)/maxy;
X	b=y1;	/* Y co-ord */
X	for (j=maxy-1;j>=0;j--)	/* Run up screen */
X	{
X		a=x1;
X		for (i=0;i<MAXX;i++)	/* Run across row on screen */
X		{
X			n=0;
X			x=a;	/* x,y contain temporary co-ords of current point */
X			y=b;	/* which will be used in calculations */
X			xsquared=x*x;
X			ysquared=y*y;
X					/* calculate squares for initial check in loop */
X			if (type==0)	/* Mandelbrot set */
X				while (n<511 && xsquared+ysquared<4)
X				{
X					xsquared=x*x;
X					ysquared=y*y;
X					xx=xsquared-ysquared+a;
X					y*=x;
X					y+=y;
X					y+=b;
X					x=xx;
X					n++;
X				}
X			else	/* Julia set */
X				while (n<511 && xsquared+ysquared<4)
X				{
X					xsquared=x*x;
X					ysquared=y*y;
X					xx=xsquared-ysquared+cx;
X					y=2*x*y+cy;
X					x=xx;
X					n++;
X				}
X			SetAPen (DrawRP,(long)(n&31));	/* Color point depending on n */
X			WritePixel (DrawRP,(long)i,(long)j);
X			a+=xgap;	/* Increment logical X co-ord */
X		}
X		b+=ygap;	/* Increment logical Y co-ord */
X	}
X}
X
Xsetcols ()
X{
X	short i;
X	for (i=0;i<32;i++)
X		SetRGB4 (DrawVP,(long)i,(long)((palette[i] & 0xF00)>>8),(long)((palette[i] & 0xF0)>>4),(long)(palette[i] & 0xF));
X}
X
Xinitmenuitems ()
X{
X	register short n;
X	for (n=0;n<NUMITEMS;n++)
X	{
X		MenuItems[n].LeftEdge=0;
X		MenuItems[n].TopEdge=10*n;
X		MenuItems[n].Width=144;		/* 8 times no. of chars */
X		MenuItems[n].Height=10;
X		MenuItems[n].Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP;
X		MenuItems[n].MutualExclude=0;
X		MenuItems[n].ItemFill=(APTR)&MenuText[n];
X		MenuItems[n].SelectFill=NULL;
X		MenuItems[n].Command=0;
X		MenuItems[n].SubItem=NULL;
X		MenuItems[n].NextSelect=0;
X		MenuItems[n].NextItem=&MenuItems[n+1];
X		MenuText[n].FrontPen=0;
X		MenuText[n].BackPen=31;
X		MenuText[n].DrawMode=JAM2;
X		MenuText[n].LeftEdge=0;
X		MenuText[n].TopEdge=1;
X		MenuText[n].ITextFont=0;
X		MenuText[n].NextText=0;
X	}
X	MenuItems[NUMITEMS-1].NextItem=NULL;
X	MenuText[0].IText=(UBYTE *)"Hide Title Bar";
X	MenuText[1].IText=(UBYTE *)"Do Mandelbrot Set";
X	MenuText[2].IText=(UBYTE *)"Do Julia Set";
X	MenuText[3].IText=(UBYTE *)"Save Screen";
X	MenuText[4].IText=(UBYTE *)"Exit";
X}
X
Xinitmenu ()
X{
X	Menu[0].NextMenu=0;
X	Menu[0].LeftEdge=0;
X	Menu[0].TopEdge=0;
X	Menu[0].Width=85;
X	Menu[0].Height=10;
X	Menu[0].Flags=MENUENABLED;
X	Menu[0].MenuName="Options";
X	Menu[0].FirstItem=&MenuItems[0];
X}
X
Xcleanup ()
X{
X	if (Backdrop)
X		CloseWindow (Backdrop);
X	if (Screen)
X		CloseScreen (Screen);
X	CloseLibrary (GfxBase);
X	CloseLibrary (IntuitionBase);
X}
END_OF_FILE
if test 8069 -ne `wc -c <'Mandelbrot_Set.c'`; then
    echo shar: \"'Mandelbrot_Set.c'\" unpacked with wrong size!
fi
# end of 'Mandelbrot_Set.c'
fi
if test -f 'Mandelbrot_Set.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Mandelbrot_Set.doc'\"
else
echo shar: Extracting \"'Mandelbrot_Set.doc'\" \(4263 characters\)
sed "s/^X//" >'Mandelbrot_Set.doc' <<'END_OF_FILE'
X                    THE MANDELBROT SET
X
XA complex number is of the form a+bi, where i represents the square root 
Xof minus one. Two complex numbers are added by simply adding their 
Xcomponents. Two complex numbers are multiplied as follows:
X
X     (a+bi)(c+di) = ac + cbi + adi - db
X
Xremembering that i squared = -1. Complex numbers can be thought of as 
Xpoints on a plane, with a representing the X co-ordinate and b the Y 
Xco-ordinate. Now take the operation:
X
X     z = z*z + c
X
Xwhere z and c are complex numbers. If z is initially set to 0 and c is a 
Xpoint on the plane, iterating (repeating) this operation many times will 
Xcause the point represented by z to wander in an irregular pattern. Some 
Xinitial values of c will cause z to increase without limit, while other 
Xvalues will cause it to always stay within a certain range. In fact, if 
Xthe distance of z from the origin (i.e. sqrt (a*a + b*b)) ever exceeds 2, 
Xz is destined to wander to infinity. The Mandelbrot set is the set of all 
Xpoints 
Xwhich will always stay within a finite range, no matter how many times 
Xthe operation is applied.
X     Suppose that for every point within a rectangular area of the plane, 
Xwe use the point as an initial value for c and do z=z*z+c until either 
Xwe've done it 1000 times or the distance of z from the origin exceeds 2. 
XThe points for which we only had to do it a few times are far away from 
Xthe Mandelbrot set. Those which required a lot of iterations are close to 
Xit, and the ones which were still within 2 after 1000 calculations are, 
Xas far as we can tell, within it. (There will be a few points which would 
Xhave exceeded 2 after more than 1000 iterations; 1000 is a reasonable 
Xcompromise between processing time and accuracy.) If we now plot the 
Xpoints on a computer screen using different colors to represent varying 
Xdistances from the Mandelbrot set, a striking and colorful display can be 
Xcreated.
X     The Mandelbrot set is of finite size, and if a large region of the 
Xplane is plotted it looks like a small blob of color floating in a vast 
Xuniform sea. Co-ordinate ranges of X from -2 to .5 and Y from -1.25 to 
X1.25 more or less display the full set, you can input a narrower range of 
Xvalues to zoom in on a region near the edge of the set, then zoom in on a 
Xsmall part of this region, etc. The boundary of the set is a fractal - it 
Xshows similar but not identical detail at every scale, and is infinitely 
Xconvoluted. The limit of magnification is determined by the precision to 
Xwhich the calculations are done. The Amiga stores double precision 
Xnumbers to about 16 digits. This means that, if the Mandelbrot set were 
Xthe size of Western Europe, the smallest distinguishable elements of it 
Xwould be the size of atoms.
X     For the Mandelbrot set, we used the array of points to provide 
Xstarting values for c and always set z to 0. If we use different fixed 
Xstarting values of z, the result is simply a distorted version of the set 
X- as a writer in Scientific American magazine put it, "one prefers the 
Xcanonical object". What happens if we use a fixed value of c and obtain 
Xthe starting value of z from the array of points? In this case a Julia 
Xset is displayed - a different one for each value of c. Julia sets, like 
Xthe Mandelbrot set, are fractals, and their overall shape is related to 
Xthe position of c in the Mandelbrot set.
X     The program in this drawer will display the Mandelbrot and Julia 
Xsets and save them to disk as IFF files. Each image takes several hours 
Xto generate, though programs which allow multitasking can be used while 
Xthis is going on. When asked to enter the co-ordinate ranges, note that 
Xincreasing Y values are plotteed up the screen not down, and that the 
Xbottom left co-ordinates must be less than the top-right corner ones. Now 
Xfor the legal and financial stuff. This is a shareware program. You may 
Xfreely copy it, put it on bulletin boards etc. If you have not already 
Xpaid for this copy and wish to use it, please send a small 
Xcontribution to: Russell Wallace, 24 Lower Georges St, Dunlaoghaire, Co. 
XDublin, Ireland. Further programs and example images can be obtained by 
Xsending a blank disk (or better still, a disk with some interesting stuff 
Xon it) to the same source.
END_OF_FILE
if test 4263 -ne `wc -c <'Mandelbrot_Set.doc'`; then
    echo shar: \"'Mandelbrot_Set.doc'\" unpacked with wrong size!
fi
# end of 'Mandelbrot_Set.doc'
fi
if test -f 'console.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'console.c'\"
else
echo shar: Extracting \"'console.c'\" \(6098 characters\)
sed "s/^X//" >'console.c' <<'END_OF_FILE'
X
X/* Console routines by Russell Wallace 1987, some obtained from other programs
X * books etc. Feel free to copy them or use them in your own programs. Use
X * +L option if compiling with Aztec C. */
X
X#include "exec/exec.h"
X#include "devices/console.h"
X#include "devices/keymap.h"
X#include "libraries/dos.h"
X#include "intuition/intuition.h"
X
X#define INTUITION_MESSAGE (1<<intuitionMsgBit)
X#define TYPED_CHARACTER (1<<consoleReadBit)
X#define CloseConsole(x) CloseDevice(x)
X#define XOFFSET 26
X#define YOFFSET 39
X
Xextern struct Window *OpenWindow ();
Xextern struct MsgPort *CreatePort ();
Xextern struct IOStdReq *CreateStdIO ();
X
Xshort line,column;
Xint class,code;
Xstruct NewWindow mynewwindow=
X{
X	20,20,		/* x,y co-ords of top left corner */
X	280,100,	/* start size */
X	0,31,		/* detailpen,blockpen */
X	MENUPICK|CLOSEWINDOW,	/* want to know if these happen */
X	ACTIVATE|GIMMEZEROZERO|WINDOWDRAG|WINDOWCLOSE,
X	0,0,0,0,0,
X	120,88,		/* minimum size */
X	640,256,	/* maximum size */
X	CUSTOMSCREEN
X};
Xstruct IOStdReq *consoleWriteMsg=0;
Xstruct IOStdReq *consoleReadMsg=0;
Xstruct MsgPort *consoleWritePort=0;
Xstruct MsgPort *consoleReadPort=0;
Xunsigned char letter;
Xstruct Window *mywindow=0;
Xstruct IntuiMessage *con_message;
X
X	/* Start() must be called at beginning; returns window pointer - if 0,
X	 * program has failed ... everything already cleaned up here, main ()
X	 * must do its own cleaning up then exit */
X
Xstruct Window *start (screen,title)
Xstruct Screen *screen;
Xchar *title;
X{
X	int consoleReadBit,intuitionMsgBit;
X	line=column=0;
X	mynewwindow.Title=title;
X	mynewwindow.Screen=screen;
X	if (!(mywindow=OpenWindow (&mynewwindow)))
X		goto FAILED;
X	if (!(consoleWritePort=CreatePort ("my.con.write",0)))
X		goto FAILED;
X	if (!(consoleReadPort=CreatePort ("my.con.read",0)))
X		goto FAILED;
X	if (!(consoleWriteMsg=CreateStdIO (consoleWritePort)))
X		goto FAILED;
X	if (!(consoleReadMsg=CreateStdIO (consoleReadPort)))
X		goto FAILED;
X	if (OpenConsole (consoleWriteMsg,consoleReadMsg,mywindow))
X		goto FAILED;
X	QueueRead (consoleReadMsg,&letter);
X	consoleReadBit=consoleReadPort->mp_SigBit;
X	intuitionMsgBit=mywindow->UserPort->mp_SigBit;
X	SetAPen (mywindow->RPort,2);
X	return (mywindow);
XFAILED:
X	closeall ();
X	return (0L);
X}
X
X	/* Call finish() at the end IF start() was successful */
X
Xfinish ()
X{
X	AbortIO (consoleReadMsg);
X	CloseConsole (consoleWriteMsg);
X	closeall ();
X}
X
Xcloseall ()
X{
X	if (mywindow)
X		CloseWindow (mywindow);
X	if (consoleWritePort)
X		DeletePort (consoleWritePort);
X	if (consoleReadPort)
X		DeletePort (consoleReadPort);
X	if (consoleWriteMsg)
X		DeleteStdIO (consoleWriteMsg);
X	if (consoleReadMsg)
X		DeleteStdIO (consoleReadMsg);
X}
X
Xint OpenConsole (writerequest,readrequest,window)
Xstruct IOStdReq *writerequest,*readrequest;
Xstruct Window *window;
X{
X	register int error;
X	writerequest->io_Data=(APTR)window;
X	writerequest->io_Length=sizeof(*window);
X	error=OpenDevice ("console.device",0,writerequest,0);
X	readrequest->io_Device=writerequest->io_Device;
X	readrequest->io_Unit  =writerequest->io_Unit;
X	return (error);
X}
X
XQueueRead (request,whereto)
Xstruct IOStdReq *request;
Xchar *whereto;
X{
X	request->io_Command=CMD_READ;
X	request->io_Data=(APTR)whereto;
X	request->io_Length=1;
X	SendIO (request);
X}
X
X	/* Call checkinput() every so often to find out what the user is doing:
X	 * a -ve number -1,-2 ... means the user has selected menu item 1,2 ...
X	 * a +ve number means the user has typed a character, 1000 means the
X	 * closewindow gadget has been selected, so do your ARE YOU SURE routine
X	 * then call finish() and wind up. 0 means nothing's happened. */
X
Xshort checkinput ()
X{
X	if (con_message=(struct IntuiMessage *)GetMsg (mywindow->UserPort))
X	{
X		class=con_message->Class;
X		code=con_message->Code;
X		ReplyMsg (con_message);
X		if (class==CLOSEWINDOW)
X			return ((short)1000);
X		if (class==MENUPICK && code!=MENUNULL)
X			return ((short)(-1-ITEMNUM (code)));
X	}
X	if (GetMsg (consoleReadPort))
X	{
X		code=letter;
X		QueueRead (consoleReadMsg,&letter);
X		return ((short)code);
X	}
X	return ((short)0);
X}
X
X	/* Writechar() writes a character to the window ... to get a response from
X	 * typed input, call it immediately with any characters returned from
X	 * checkinput(). */
X
Xwritechar (c)	/* NOTE - MUST BE CALLED WITH THE CHARACTER CAST TO TYPE LONG*/
Xchar c;			/* Don't blame me, I don't know why, blame the Amiga */
X{				/* systems programmers. */
X	consoleWriteMsg->io_Command=CMD_WRITE;
X	consoleWriteMsg->io_Data=(APTR)&c;
X	consoleWriteMsg->io_Length=1;
X	DoIO (consoleWriteMsg);
X	if (c=='\n')
X	{
X		column=0;
X		line++;
X	}
X	if (c!='\n')
X		column++;
X	if ((line<<3)+YOFFSET > mywindow->Height)
X	{
X		print ("MORE...");
X		while (checkinput ()<1 || checkinput ()==1000)
X			;
X		line=0;
X		print ("\r       \r");
X
X	/* This is to prevent a large quantity of text from scrolling off the top
X	 * of the window before the user has time to read it all e.g. in
X	 * adventure games. Remove it if you don't need it. Note - don't let the
X	 * user make the window too small vertically or an infinite loop occurs.*/
X
X	}
X}
X
X	/* Print() does a formatted (i.e. trying not to split up words on the ends
X	 * of lines) print of a null-terminated string; very useful for text-
X	 * oriented applications in a variable-sized window. */
X
Xprint (string)
Xchar *string;
X{
X	short x;
X	for (;;)
X	{
X		x=0;
X		while (string[x]!='\0' && string[x]!=' ' && string[x]!='\n')
X			x++;
X		if (((column+x)<<3)+XOFFSET > mywindow->Width && column)
X		{							/* If word would go off end of line, */
X			writechar ((long)'\n');	/* go on to next line before print */
X		}
X		consoleWriteMsg->io_Command=CMD_WRITE;
X		consoleWriteMsg->io_Data=(APTR)string;
X		consoleWriteMsg->io_Length=x;
X		DoIO (consoleWriteMsg);
X		column+=x;
X		if (string[x]=='\n')
X			writechar ((long)'\n');
X		if (string[x]==' ')
X			writechar ((long)' ');
X		if (string[x]=='\0')
X			break;
X		string+=x+1;
X	}
X}
X
Xnprint (string)		/* Non-formatted print */
Xchar *string;
X{
X	consoleWriteMsg->io_Command=CMD_WRITE;
X	consoleWriteMsg->io_Data=(APTR)string;
X	consoleWriteMsg->io_Length=-1;
X	DoIO (consoleWriteMsg);
X}
X
Xresetscroll ()		/* Reset scroll pause feature */
X{
X	line=0;
X}
END_OF_FILE
if test 6098 -ne `wc -c <'console.c'`; then
    echo shar: \"'console.c'\" unpacked with wrong size!
fi
# end of 'console.c'
fi
if test -f 'input.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'input.c'\"
else
echo shar: Extracting \"'input.c'\" \(3067 characters\)
sed "s/^X//" >'input.c' <<'END_OF_FILE'
X
X/* Text input routine by Russell Wallace 1987. Feel free to copy it and use it
X * in your own programs. Requires linkage to my set of console routines,
X * console.o. Backspace and cursor keys can be used. DEL key puts
X * linefeed character in string, RETURN key ends input. Selection of menu
X * item or closewindow gadget will break off input and return -ve number,
X * otherwise length of typed-in string returned. Existing text is displayed
X * for editing; if you don't want that, do a string[0]='\0' before calling. */
X
Xshort input (string,length)
Xunsigned char *string;	/* Address of buffer to put text */
Xlong length;			/* Length of buffer */
X{
X	short c;		/* Key pressed */
X	short x;		/* Position in buffer */
X	short actlen=0;	/* Actual length of typed-in string */
X	register short i;
X	resetscroll ();
X	for (x=0;string[x]!='\0';x++)	/* Convert all CRs in existing string to */
X		if (string[x]=='\n')		/* editable characters */
X			string[x]=127;
X	nprint (string);	/* Non-formatted print on screen for editing */
X	for (;;)
X	{
X		do
X			c=checkinput ();
X		while (!c);
X		if (actlen<x)
X			actlen=x;
X		if (c==1000)	/* Close window ... cancel edit */
X		{
X			actlen=-1000;
X			goto ENDINPUT;
X		}
X		if (c<0)		/* Menu select ... cancel edit */
X		{
X			actlen=c;
X			goto ENDINPUT;
X		}
X		if (c=='\r')	/* Pressed CR ... end edit */
X			goto ENDINPUT;
X		if (c==8 && x)	/* Backspace key */
X		{
X			for (i=x-1;i<actlen;i++)	/* Delete character in string buffer */
X				string[i]=string[i+1];
X			writechar ((long)8);
X			nprint ((long)(string+(--x)));	/* Delete on screen */
X			writechar ((long)' ');
X			for (i=x;i<actlen;i++)
X				writechar ((long)8);
X			actlen--;			/* One fewer characters */
X		}
X		if (c==155)		/* Code indicating a cursor key etc. */
X		{
X			do
X				c=checkinput ();	/* Find out which one */
X			while (!c);
X			if (c==67 && x<actlen)	/* Move right */
X			{
X				writechar ((long)155);
X				writechar ((long)67);
X				x++;
X			}
X			if (c==68 && x)			/* Move left */
X			{
X				writechar ((long)155);
X				writechar ((long)68);
X				x--;
X			}
X			if (c==65 && x>7)		/* Up=back 8 spaces */
X			{
X				x-=8;
X				for (i=0;i<8;i++)
X				{
X					writechar ((long)155);
X					writechar ((long)68);
X				}
X			}
X			if (c==66 && x<actlen-7)	/* Down=forward 8 */
X			{
X				x+=8;
X				for (i=0;i<8;i++)
X				{
X					writechar ((long)155);
X					writechar ((long)67);
X				}
X			}
X			c=0;
X		}
X		if (c>31 && c<128 && actlen<length-1)
X		{
X			for (i=actlen;i>x;i--)
X				string[i]=string[i-1];
X			string[++actlen]='\0';
X			string[x++]=c;
X			nprint ((long)(string+x-1));
X			for (i=x;i<actlen;i++)
X				writechar ((long)8);
X		}
X	}
XENDINPUT:
X	for (i=0;i<x;i++)
X		if (string[i]==127)		/* Convert peculiar characters back into */
X			string[i]='\n';			/* CRs for use */
X	string[actlen]='\0';		/* Stick null on end of string */
X	for (i=x;i<actlen;i++)
X	{
X		writechar ((long)155);	/* Move cursor to end of string */
X		writechar ((long)67);
X	}
X	writechar ((long)'\n');		/* Print out CR */
X	resetscroll ();		/* This has introduced a pause sufficient for any */
X	return (actlen);				/* preceding text to have been read */
X}
END_OF_FILE
if test 3067 -ne `wc -c <'input.c'`; then
    echo shar: \"'input.c'\" unpacked with wrong size!
fi
# end of 'input.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(240 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X.c.o:
X	lc1 -cs -cw -b $*
X	lc2 -v $*
Xmandelbrot_set: mandelbrot_set.o scanfloat.o saveilbm.o input.o console.o
X	blink from c.o+mandelbrot_set.o+scanfloat.o+saveilbm.o+input.o+console.o to mandelbrot_set lib lcm.lib+lc.lib+amiga.lib nd sc sd
END_OF_FILE
if test 240 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'mandelbrot0.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mandelbrot0.uu'\"
else
echo shar: Extracting \"'mandelbrot0.uu'\" \(565 characters\)
sed "s/^X//" >'mandelbrot0.uu' <<'END_OF_FILE'
Xbegin 644 mandelbrot_set.doc.info
XMXQ```0``````N0`9`"@`%0`$``,``0##L]``````````````````````````1
XM````!`@`P>'P`````````+4````.```````````````````````H`!4``@`!A
XM>Z@#```````````````____,```____/```____/P``X`__/\``____````XU
XM`____``______``______``_A`#`?``______``Y`(``?``______``X``!`)
XM?``______``______``___X`?``______``______`````````````````#_3
XM___\``#````S``#````PP`#````P,`#'_``P#`#````__P#'_````P#``````
XM`P#``````P#`>_\_@P#``````P#&_W__@P#``````P#'__^_@P#``````P#`8
XM`````P#```'_@P#``````P#``````P#______P`````````````+.DUO<W0O>
X%36]S=`#`C
X``
Xend
Xsize 365
END_OF_FILE
if test 565 -ne `wc -c <'mandelbrot0.uu'`; then
    echo shar: \"'mandelbrot0.uu'\" unpacked with wrong size!
fi
# end of 'mandelbrot0.uu'
fi
if test -f 'mandelbrot1.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mandelbrot1.uu'\"
else
echo shar: Extracting \"'mandelbrot1.uu'\" \(1223 characters\)
sed "s/^X//" >'mandelbrot1.uu' <<'END_OF_FILE'
Xbegin 644 mandelbrot_set.info
XMXQ```0``````.0`2`$8`)@`%``,``0#%.[``````````````````````````D
XM`````_P``````````````#4````'``````````````````````!&`"4``@`"J
XMKM`#``````````````0````````````"````````````!P```````````!_@-
XM```````````P<```````````(#```````````#E@```````````/P```````8
XM```#___`````````'@@&.````````&$``"8```````&````!@``````&````T
XM`,````/@"`````!@```.'#``````Z```-@<@`````!``%F`1X``````8`%O@T
XM"\``````&``>@`/```````P``,`&@``````$``!@'*``````(```'_"`````E
XM`$@`````P``````P`````&`````#8``````R`````,``````#P````<`````#
XM``/````,````````.0``<`````````?\`\``````````/_T``````````!'`+
XM```````````@0```````````*,```````````#^````````````.````````5
XM````"`````````````(````````````$`````````````@````````````<`7
XM```````````9H```````````+[```````````#_P```````````^X```````E
XM````#\```````````^?_P````````!WW^?@```````!>___>```````!____U
XM_X```````______````#X`______X```#_PO_____S@``#G_/______P`!9_R
XM[Y______^`!;W_7______^@`'O_]O______\``"__O_______```?^S?____@
XM_]@``!_`______^X`````/______\`````!?_____.``````/?_____`````%
XM``[____[```````#____^````````"[__Y`````````'^__``````````#_\V
XM```````````>P```````````/\```````````#?````````````[@```````/
X<````#@````````````@``````````````````#?`-
X``
Xend
Xsize 838
END_OF_FILE
if test 1223 -ne `wc -c <'mandelbrot1.uu'`; then
    echo shar: \"'mandelbrot1.uu'\" unpacked with wrong size!
fi
# end of 'mandelbrot1.uu'
fi
if test -f 'mandelbrot_.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mandelbrot_.uu'\"
else
echo shar: Extracting \"'mandelbrot_.uu'\" \(19935 characters\)
sed "s/^X//" >'mandelbrot_.uu' <<'END_OF_FILE'
Xbegin 644 mandelbrot_set
XM```#\P`````````"``````````$```Q)```"`0```^D```Q)2.=^_DOO`#0D/
XM2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
XM`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
XM20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
XM(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
XM0`!(+P`D0"`J`"1G$BQL!%P@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN\
XM_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``!&QR)
XM`"`\````YF`")L%1R/_\3KHFH'``8`0@+P`$+P`@+``L9P0@0$Z03KHCXBQX5
XM``0B;`1<3J[^8DJL!&!G"")L!&!.KOYB2JP$9&<((FP$9$ZN_F)*K`!89P@BC
XM;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
XM3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
XMKOW8*4`$7&?:3G4``$Y5__A"ITAL`1Y.NBX44$\I0`!H0J=(;`$P3KHN!%!/'
XM*4``;'``(&P`;#`H`-@I0`1L.4``JCE``(I(;`"$3KHNM%A/*4``U$J`9@YA1
XM``C,2'@``TZZ(3I83REL`-0`PDAL`*1.NBZB6$\I0`#82H!F#F$`"*9(>``$U
XM3KHA%%A/(&P`V"EH`#($HB!L`-30_``L*4@$IF$`!LIA``<X80`(2$AL!;PO*
XM+`#83KHN<%!/0J<O+`2B3KHM@%!/(&P`V"\H`%9.NBS"6$\@;`#8+R@`5DZZ.
XM+(Q83RE`!*I*@&?<($`K:``4__P[:``8__HO`$ZZ+()83PRM```!`/_\9LHR<
XM+?_Z#$'__V?`ZDD"00`_.T'_^`Q!``5DL.5!3OL0`F```!)@``!H8```<&``1
XM`'I@``"D+RP`V$ZZ+6I83Q`L`-Q3`&8:0BP`W$*G+RP`U$ZZ+>)03T'L`4(I3
XM2`5D8!P9?``!`-Q(>``!+RP`U$ZZ+<103T'L`5(I2`5D2&P%O"\L`-A.NBV6T
XM4$]@`/\^0J=A``#06$]@`/\R2'@``6$``,)83V``_R1*+`#<9PQ"IR\L`-1.'
XMNBU^4$]A-$HL`-QG`/\(2'@``2\L`-1.NBUF4$]@`/[V+RP`V$ZZ+,A83V$`.
XM!SA"ITZZ'ZA83V``_MQ(;`%B+RP`U$ZZ$2I03TJ`9@PO+`#43KHLV%A/8%)(8
XM;`%N3KH4#EA/0BP$<$AX`#)(;`1P3KH.,E!/#$#\&&8&3KH1V&`J3KH1TDALU
XM!'!(;`#>(&P$HB\H``1.N@C,3^\`#$J`9PHO+`#43KHLA%A/3G5.5?]R2.<W_
XM`$AL`8`O+`#43KH0L%!/2H!F#B\L`-1.NBQ>6$]@``322JT`"&=X2&P!DDZZ4
XM$XQ83T(L!'!(>``R2&P$<$ZZ#;!03PQ`_!AF"$ZZ$59@``2B2&P$<$ZZ!I!8'
XM3TAL`:PK0/^**T'_CDZZ$U!83T(L!'!(>``R2&P$<$ZZ#7103PQ`_!AF"$ZZI
XM$1I@``1F2&P$<$ZZ!E183RM`_X(K0?^&2&P!QDZZ$Q183T(L!'!(>``R2&P$@
XM<$ZZ#3A03PQ`_!AF"$ZZ$-Y@``0J2&P$<$ZZ!AA83TAL`>0K0/^J*T'_KDZZQ
XM$MA83T(L!'!(>``R2&P$<$ZZ#/Q03PQ`_!AF"$ZZ$*)@``/N2&P$<$ZZ!=Q8^
XM3TAL`@(K0/^B*T'_IDZZ$IQ83T(L!'!(>``R2&P$<$ZZ#,!03PQ`_!AF"$ZZ&
XM$&9@``.R2&P$<$ZZ!:!83TAL`AXK0/^:*T'_GDZZ$F!83T(L!'!(>``R2&P$5
XM<$ZZ#(103PQ`_!AF"$ZZ$"I@``-V2&P$<$ZZ!6183RM`_Y(K0?^6)"W_HB8M2
XM_Z9.NA9N;Q8@+?^:(BW_GB0M_ZHF+?^N3KH66&X.2&P".DZZ$@!83V``_N!.Q
XMN@_>0J<O+`2B3KHJ`E!/("W_FB(M_YXD+?^J)BW_KDZZ$T8D/$!T``!V`$ZZC
XM%IPK0/_*("W_DBM!_\XB+?^6)"W_HB8M_Z9.NA,>+T``%"`L!&PO00`83KH<O
XM+"]``!P@+P`4+T$`("(O`!@D+P`<)B\`($ZZ%E0K;?^B_](K;?^F_]8D+`1L%
XM4X(J`BM`_\(K0?_&2D5K``*8*VW_JO_:*VW_KO_>?``,1@%`;``"8'X`("W_5
XMVB(M_]XD+?_2)BW_UBM`__(K0?_V*T+_ZB0M__(K0__N)BW_]DZZ&$8K0/^Z2
XM("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA@J*T#_LBM!_[9*K0`(9@``Y`Q'`?]LD
XM``&N("W_NB(M_[XD+?^R)BW_MDZZ$C8D/$`0``!V`$ZZ%19L``&*("W_\B(MX
XM__8D+?_R)BW_]DZZ%]HK0/^Z("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA>^*T#_X
XMLB`M_[HK0?^V(BW_OB0M_[(F+?^V3KH1Z"0M_]HF+?_>3KH1SBM`_^(@+?_JS
XM*T'_YB(M_^XD+?_R)BW_]DZZ%WHK0/_J*T'_[B0M_^HF+?_N3KH1GBM`_^HK-
XM0?_N)"W_TB8M_]9.NA&**VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_R`,1P'_/
XM;```S"`M_[HB+?^^)"W_LB8M_[9.NA%4)#Q`$```=@!.NA0T;```J"`M__(BK
XM+?_V)"W_\B8M__9.NA;X*T#_NB`M_^HK0?^^(BW_[B0M_^HF+?_N3KH6W"M`@
XM_[(@+?^Z*T'_MB(M_[XD+?^R)BW_MDZZ$08D+?^*)BW_CDZZ$.PK0/_B("W_C
XM\BM!_^8B+?_V)#Q`````=@!.NA:8)"W_ZB8M_^Y.NA:,)"W_@B8M_X9.NA"XQ
XM*VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_S`@!TC``H`````?+P`O+`2B3KHG@
XMDE!/(`9(P"(%2,$O`2\`+RP$HDZZ)V!/[P`,("W_VB(M_]XD+?_*)BW_SDZZ<
XM$%PK0/_:*T'_WE)&8`#]G"`M_](B+?_6)"W_PB8M_\9.NA`Z*T#_TBM!_]938
XM16``_69,WP#L3EU.=4Y5__Y(YS``0FW__C(M__X,00`@;%1(P3`M__Y(P-"`\
XM0>P`WB)(T\!T`#01`H(```\`X(HB2-/`=@`V$0*#````\.B+T<!P`#`0`H``C
XM```/+P`O`R\"+P$O+`2F3KHFD$_O`!12;?_^8*),WP`,3EU.=4Y5__Y(YSTP%
XM?@`,1P`%;```T"`'<B+!P4'L!*XB2-/`=``S0@`$(DC3P"8'>`K'Q#-#``8BM
XM2-/`,WP`D``((DC3P#-$``HB2-/`,WP`4@`,(DC3P'8`(T,`#B)(T\`H!\G\"
XM`!1%[`58)DK7Q"-+`!(B2-/`(T,`%B)(T\!Z`!-%`!HB2-/`(T,`'")(T\`S^
XM0@`@T<`@!\'!0^P$T-/`((D@2M'$$(4@2M'$$7P`'P`!($K1Q!%\``$``B!*4
XMT<0Q0@`$($K1Q#%\``$`!B!*T<0A0P`(U<0E0P`04D=@`/\L0JP%-D'L`5(IQ
XM2`5D0>P"4BE(!7A![`)D*4@%C$'L`G(I2`6@0>P"?BE(!;1,WPR\3EU.=4*L2
XM!;QP`#E`!<`Y0`7".7P`507$.7P`"@7&.7P``07(0>P"A"E(!<I![`2N*4@%7
XMSDYU2JP`V&<*+RP`V$ZZ):983TJL`-1G"B\L`-1.NB6"6$\O+`!L3KHD7%A/S
XM+RP`:$ZZ)%)83TYU3E7_ZDCG!P!Z`"X%(&T`"!`P<``,```P;08,```Y;QX0P
XM,'``#```+6<4$#!P``P``"YG"DHP<`!G!%)'8,X@;0`($#!P``P``"UF)GH!0
XM4D<0,'``#```,&T&#```.6\2$#!P``P``"YG"'``<@!@``%0$#!P`$H`9@AP"
XM`'(`8``!0-#'?@`K2``((&T`"!`P<``,```P;0H,```Y;@121V#H+`="K?_R&
XM0JW_]BM\/_```/_J*WP`````_^Y31TI':U8@;0`($#!P`$B`2,`$@````#!.Z
XMNA:*)"W_ZB8M_^Y.NA,:)"W_\B8M__9.N@U&*T#_\B`M_^HK0?_V(BW_[B0\]
XM0"0``'8`3KH2\BM`_^HK0?_N4T=@IBM\/[F9F?_J*WR9F9F9_^X@;0`($#!@:
XM``P``"YF;B`&(`920"X`(&T`"!`P<``,```P;5@,```Y;E(0,'``2(!(P`2`I
XM````,$ZZ%?XD+?_J)BW_[DZZ$HXD+?_R)BW_]DZZ#+HK0/_R("W_ZBM!__8B:
XM+?_N)#Q`)```=@!.NA`.*T#_ZBM!_^Y21V":2D5G#B`M__(B+?_V3KH3^F`*_
XM("W_\B(M__9.<4S?`.!.74YU3E7_LDCG/`!(>`/N+RT`$$ZZ(5903RM`_[9*>
XM@&8&<`%@``1L<``@;0`(,!`B`.>!=``T*``"%B@`!7@`&"@`!1M#_\\"@P``_
XM`/]Z`>>E*T#_V"M`__0K0?_\(@).NAUF*T'_^"M!_]PB!$ZZ'5@&@```$`!"A
XMIR\`*T'_X"M%_^1.NB$R4$\K0/_*2H!F$"\M_[9.NB#P6$]P`F```_(I;?_*8
XM!=Q(;`*,80`#[%A/6*P%W$AL`I)A``/>6$](;`*880`#U%A/2'@`%&$`!`18R
XM3R\M__QA``1&6$\O+?_X80`$/%A/0J=A``0T6$]"IV$`!"Q83R!L!=P0K?_/5
XM4JP%W'``(&P%W!"`4JP%W"!L!=P0O``!4JP%W"!L!=P0@%*L!=Q"IV$``_98[
XM3W``(&P%W!"`4JP%W"!L!=P0@%*L!=PO+?_\80`#UEA/+RW_^&$``\Q83TAL-
XM`IYA``,\6$\@+?_DY8B0K?_D+P!A``-D6$]"K?_P(BW_\+*M_^1L2"`!T(!RW
XM`"!M``PR,`@`(`'@B.F`(&P%W!"`4JP%W"`!`H````#P(&P%W!"`4JP%W`*!#
XM````#^F!(&P%W!"!4JP%W%*M__!@KB`M_^3EB)"M_^0(````9PH@;`7<0A!29
XMK`7<2&P"I&$``K!83R!L!=Q8K`7<0JW_\"M(_\8B+?_PLJW_^&P``=!"K?_LT
XM<``0+?_/)"W_[+2`9``!M"`"Y8`O0``0("W_]"(M__!.NAN8(FT`""(O`!`@;
XM<1@(T<!P`"M`_]0K0/_0*TC_PE*M_]0@+?_4L*W_]&TJ(@!$@20M_]#2@E*!%
XM(&P%W!"!4JP%W"!M_\(B;`7<$K`H`%*L!=Q@``%`(&W_PA(P"``4,`C_L@)G"
XMN"(`1($D+?_0TH)2@2)L!=P2@5*L!=PB;`7<$K`H`%*L!=PK0/_04JW_U"`M8
XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``#:(&W_S
XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F:F4JW_U"`M.
XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``"`(&W_9
XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F8`_TP@+?_0P
XMDH`,@0````)O`/[.5X$@;`7<$(%2K`7<*T#_Z"`M_]15@"0M_^BT@&P6(&W_2
XMPB)L!=P2L"@`4JP%W%*M_^A@W"`M_]15@"M`_]!@`/Z,0JW_T%*M_^Q@`/Y`[
XM4JW_\&``_B@@+`7<D*W_Q@@```!G"B!L!=Q"$%*L!=P@+`7<D*W_QEF`*T#_L
XMNB`L!=R0K?_*48`I;?_&!=PO+?^Z*T#_OF$``+Q83R!M_\I8B"E(!=PO+?^^<
XM80``J%A/("W_OE"`+P`O+?_*+RW_MDZZ'5I/[P`,(BW_OE"!L(%G"'`#*T#_2
XM\&`$0JW_\"\M_[9.NATD6$\@+?_@(BW_W$ZZ&58B+?_83KH93@:````!]"\`_
XM+RW_RDZZ'4903R`M__!,WP`\3EU.=4Y5```@;0`((FP%W!*04JP%W")L!=P2I
XMJ``!4JP%W")L!=P2J``"4JP%W")L!=P2J``#4JP%W$Y=3G5.50``2.<@`"`M*
XM``@B`'08Y*D@;`7<$(%2K`7<(@!T$.2I(&P%W!"!4JP%W"(`X(D@;`7<$(%2+
XMK`7<(&P%W!"`4JP%W$S?``1.74YU3E4``"`M``@B`.")(&P%W!"!4JP%W"!LR
XM!=P0@%*L!=Q.74YU3E7_^$CG(0!";?_Z3KH&XD)M__P@;0`(,BW__!`P$`!*S
XM`&<6$#`0``P```IF!A&\`'\0`%)M__Q@VB\M``A.N@:`6$].N@1*.T#__DIM]
XM__YG\C(M__PT+?_ZM$%L!#M!__HT+?_^#$(#Z&8*.WS\&/_Z8``![DI":@@[W
XM0O_Z8``!X@Q"``UG``':44)F9DI!9V)302X!OFW_^FP2(`=(P"!M``@1L`@!!
XM<`!21V#H2'@`"$ZZ!'!83U-M__P@;0`(T.W__"`(+P!.N@7V6$](>``@3KH$Q
XM4%A//BW__+YM__IL#DAX``A.N@0\6$]21V#L4VW_^@QM`)O__F8``-I.N@.0\
XM.T#__DIM__YG\@QM`$/__F8B,BW__+)M__IL&$AX`)M.N@0`6$](>`!#3KH#8
XM]EA/4FW__`QM`$3__F8>2FW__&<82'@`FTZZ`]I83TAX`$1.N@/06$]3;?_\N
XM#&T`0?_^9BXR+?_\#$$`!V\D46W__'X`#$<`"&P82'@`FTZZ`Z183TAX`$1.E
XMN@.:6$]21V#B#&T`0O_^9C8P+?_Z2,!?@#(M__Q(P;*`;"10;?_\?@`,1P`(@
XM;!A(>`";3KH#9EA/2'@`0TZZ`UQ83U)'8.)P`#M`__XR+?_^#$$`'V\`_F0,P
XM00"`;`#^7"`M``Q3@#(M__I(P;*`;`#^2CXM__J^;?_\;Q(@!TC`(&T`"!&P*
XM"/]P`%-'8.A2;?_Z(&T`"#`M__I",```,"W__%)M__PR+?_^$8$``-#M__Q3Y
XMB"`(+P!.N@1\6$\^+?_\OFW_^FP`_?)(>``(3KH"REA/4D=@ZGX`OFW__&P8!
XM(&T`"!`P<``,``!_9@81O``*<`!21V#B(&T`"#`M__I",```/BW__+YM__ILQ
XM&$AX`)M.N@*&6$](>`!#3KH"?%A/4D=@XDAX``I.N@)N6$].N@0T,"W_^DS??
XM`(1.74YU``!.5?_X2.<`('``.4`%XCE`!>`I;0`,`L8I;0`(`LI(;`*L3KH;B
XMP%A/*4`"[$J`9P``J$*G2&P"\$ZZ%ZY03RE``N1*@&<``))"ITAL`OY.NA>8X
XM4$\I0`+H2H!G?"\L`N1.NAAB6$\I0`+<2H!G:B\L`NA.NAA06$\I0`+@2H!G#
XM6"\L`NPO`"\L`MQA``#$3^\`#$J`9D)(;`7L+RP"X&$``/Y03W``(&P"Z!`HH
XM``\D;`+L(FH`5G(`$BD`#TAX``(O*@`R*T#__"M!__A.NAJ:4$\@+`+L8`9A=
XM```D<`!,WP0`3EU.=2\L`N!.NAG\6$\O+`+<3KH9MEA/80).=4JL`NQG"B\L_
XM`NQ.NAJ>6$]*K`+D9PHO+`+D3KH79%A/2JP"Z&<*+RP"Z$ZZ%U183TJL`MQGX
XM"B\L`MQ.NA>>6$]*K`+@9PHO+`+@3KH7CEA/3G5.5?_\2.<!`"!M``@A;0`0%
XM`"@A?````(0`)'``+P`O""\`2&P#"DZZ&11/[P`0+@`@;0`((FT`#"-H`!0`S
XM%"-H`!@`&"`'3-\`@$Y=3G5.50``(&T`"#%\``(`'"%M``P`*'`!(4``)"\(!
XM3KH9&%A/3EU.=2!L`NPO*`!63KH8;EA/*4`%[DJ`9TX@0"EH`!0%Y'(`,B@`_
XM&"E!!>@O`$ZZ&&!83R(L!>0,@0```@!F!C`\`^A@4`R!```!`&8:(BP%Z`R!4
XM``#__V<.ZH$"@0```#]P_Y"!8"XO+`+H3KH8#EA/2H!G'G``$"P%["E`!>A(2
XM;`7L+RP"X&$`_U103R`L!>A@`G``3G5.50``2.<@`"!L`MPQ?``#`!Q![0`+<
XM(FP"W"-(`"AP`2-``"0O+`+<3KH8/EA/$"T`"PP```IF$G(`.4$%XC(L!>`D%
XM`5)".4(%X`P```IG"C`L!>)20#E`!>(P+`7@2,#G@`:`````)R!L`NPR*``*L
XM2,&P@6\H2&P#&F$J6$]A`/[L#$```6WV80#^X@Q``^AG[$)L!>!(;`,B80I8)
XM3TS?``1.74YU3E7__DCG(`!";?_^(&T`"#(M__X0,!``2@!G%@P``"!G$!`PR
XM$``,```*9P92;?_^8-HP+`7B2,`R+?_^2,'0@>>`!H`````:(&P"[#(H``A(U
XMP;"!;Q!*;`7B9PI(>``*80#^^%A/(&P"W#%\``,`'"!L`MPA;0`(`"@P+?_^_
XM2,`@;`+<(4``)"\(3KH7-EA/,"P%XC(M__[003E`!>(@;0`($#`0``P```IF;
XM"DAX``IA`/ZH6$\@;0`(,BW__A`P$``,```@9@I(>``@80#^C%A/(&T`"#(M%
XM__X0,!``2@!G#$C!4H'3K0`(8`#_'$S?``1.74YU3E4``"!L`MPQ?``#`!P@_
XM;`+<(6T`"``H</\@;`+<(4``)"\L`MQ.NA:D6$].74YU0FP%X$YU``!.50``O
XM*6T`"``<2JP`(&<4,'P``2)L`""SR&<(2'@`"$Z16$].74YU````,```!2+_B
XM___^2.<_0&$``!I,WP+\3G5(YS]`80``"$S?`OQ.=0A"`!](0$A"/#R``#X\!
XM?_`X`,A&N4`Z`,I'NT#,0KU"SD*_0KI'9@``[`Q%?_!F```NL$)M```2+@".F
XM@68```XN`HZ#9P``#"`"(@-.^0``(DZ\1&<``(1.^0``(BY*168``$9(0&8`2
XM`"I*@68``"1(0F8``!!*@V8```K(1D[Y```AX"`"(@-(0+U`OT!(0$YU2$)F8
XM```>2H-F```82$"Y0+M`2$!.=7X0FD>_0+]"2$!(0KQ$9P``*)*#9@``"I&"8
XM9@``!DYUD8)J```(1(%`@#@&3OD``"#@3OD``"(@TH/1@@R``"```&T``!3B^
XMB.*1?@#3A]&'!D4`$`Q%?^!E```(3OD``"(*2$#018!$2$!.=6X```K%0,=!'
XMS43/10Q%?_!G```P2D=F``!"2$)F```02H-F```*N4"[0$A`3G76@]6"2D5F6
XM```J2$#2@=&`8```)DJ`9@``#DJ!9@``"$[Y```B($[Y```B3@I"`!!(0@I`#
XM`!!(0)Y%1D?H1P1%`"`,1P`T;@``'M*!T8`,1P`@;P``("8"=``$1P`@[JMTM
XM`&```#0&10`02$#018!$2$!.=0Q'`!!O```.-@)(0T)"2$($1P`0(D8L`NZJ5
XM[K[NJ[6&O8,L";Q$9@``/M*#T8(&10`0XHCBD0R``"```&T```H&10`0XHCB#
XMD7X`TX?1ATA`T$4,17_P9```"(!$2$!.=4[Y```B"I^'DX.1@@R``"```&T`T
XM_JI$A]*'?@#1A^*(XI$&10`02$#018!$2$!.=0``#(`"````;0``$.*(XI%*X
XM16P``$Y@```*!$4`$&P``$)$1>A-6$4,10`Y;P``$$[Y```AZC(`0D!(0$A!K
XM!$4`$&[R!D4`$"0`ZJCJNNJIL8*U@70`TX+1@DA`N4!(0$YU)`#HB.B:Z(FQ*
XM@K6!=`#3@M&"2$#010Q`?_!E!D[Y```B"KE`2$!.=4J`:P``.$J":@``($J`;
XM9@``:$J!9@``8DJ#9@``7`R"@````&8``%).=;""9@``#+:!90``1&8``#A.I
XM=4J":P``'F8``"Q*@V8``"9*@68``"`,@(````!F```63G6T@&8```RR@V4`1
XM`!!F```$3G5*.0``',A.=4HY```<R4YU_P$``$CG/T!A```(3-\"_$YU/#R`-
XM`#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!ZL$)M```N#(```'_P9@``"$J!G
XM9P``"$[Y```B3K1';0``(@R"``!_\&8```A*@V<```P@`B(#3OD``").3OD`@
XM`"(N2H)F```L2H-F```F2.?`P$AY`````TZY```9*%A/3-\#`R`\``!_\+E`>
XM<@!(0$YU3OD``"(@M$=M```B#((``'_P9@``"$J#9P``#"`"(@-.^0``(DY.'
XM^0``(>`Z`,I'9@``,$J`9@``($J!9@``&DJ"9@``#DJ#9@``"$[Y```B+D[Y/
XM```AX$ZY```A>&````B[0`I``!#.0F8``"A*@F8```Q*@V8```9@`/]@Q4#'^
XM0<]%3KD``"%XQ4#'0<]%8```"+]""D(`$`1'/^":1V@```A.^0``(@I(0"X!`
XMZ8CIB>F?LT>_0$A"+@-\"^VJ[:OMO[='OT)(1#@%(D1(0H#".`!(03`!0D%(X
XM0CH"RL1(0SP#S,1(0SX#SL1(1]Y&2$="1DA&W862AY&&9```"%-$TH/1@D)#>
XM2$0L`$A"@,)H```80D0@!I*#2$*1@DA`2$$P`4)!8```*C@`2$$P`4)!2$(\L
XM`LS$+@-(1\[$2$?<1TA&0D?=1TA&DH>1AF0``!)31-*#T8)E```(4T32@]&"P
XM+`!(0H#":```%$)%(`9(0I!"2$!(03`!8```%#H`2$$P`4A"/`+,Q9"&9```Z
XM#E-%T()E```&4T70@DA%2$*`PF@```1P_SH`(`0B!2@).@1(1$[Y```;P$CG2
XM/T!A```(3-\"_$YU/#R``#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!6L$)MM
XM```N#(```'_P9@``"$J!9P``"$[Y```B3K1';0``'`R"``!_\&8```A*@V<`K
XM``P@`B(#3OD``").2H)F```.2H-F```(3OD``"(N3OD``"(@M$=M```T#((`/
XM`'_P9@``"$J#9P``#"`"(@-.^0``(DY*@&8```Y*@68```A.^0``(BY.^0``P
XM(B`Z`,I'9@``'DJ`9@``#DJ!9@``"$[Y```AX$ZY```A>&````B[0`I``!#.[
XM0F8``"I*@F8```Y*@V8```A.^0``(>#%0,=!ST5.N0``(7C%0,=!ST5@```(?
XMOT(`0@`0!$4_\-I':```"$[Y```B"DA`+@'AB.&)X9^S1[]`2$(N`^&*X8OA%
XMG[='OT(N`$A'SL,L`DA&S,'>AD)'WT=(1TA!+`',PD)&2$;>ADA#+`/,P$)&C
XM2$;>ADA`2$(L`,S"QL#>@W8`W8/"PMZ!W8,B`$A!)@)(0\##Q,'1@B0`0D#1N
XM0$A`2$)"0MZ"T8;"P]*'=`#1@D[Y```;P"\`@Y]G!`A``!].=0R`````(&P`2
XM`#1(0$A!,`%"001%`0!LZ&```&8%!`,#`@("`@$!`0$!`0$!````````````\
XM`````````'8`#(```"``;```!N&(4$-(0$I`9@``!NF86$-T`!0[`,#EN-9"B
XM2$`D`>>IY[JS0K5`Z4N:0VT```Q(0-!%@$1(0$YU1$7H320`ZJCJNNJIL8*U1
XM@4A`N4!(0$YU2$!(1'H0#(`````@;```%DA`2$$P`4)!!$4!``R`````(&WLM
XM0D0,@```(`!L```&X8A01$A`2D!F```&Z9A81'P`0_D``"#\'#$``.VXV$9(H
XM0"P!Z:GIOK-&O4#I3)I$2$!(1$YU``!P`"(`N4!(0$YU2.?`P$AY`````4ZY4
XM```9*%A/3-\#`W``<@"Y0$A`3G5(Y\#`2'D````"3KD``!DH6$],WP,#(#P`M
XM`'_PN4!R`$A`3G5(Y\#`2'D````$3KD``!DH6$],WP,#(#Q_\0``<@!.=0@`"
XM``-G```@2.?`P$AY````!$ZY```9*%A/3-\#`PB```,(P``!`$!_\$A`3G5(T
XMYSQ`>`!R`&```!I(YSQ`>`!R`$J`9P``.&H```@X/(``1(`,@``@``!D```21
XM.CQ!($ZY```@X$S?`CQ.=3(`0D!(0$A!.CQ"($ZY```@X$S?`CQ.=0``2.<PY
XM,BQY````:"!O`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?(
XM3`Q.=4Y5__Q(YR``<``I0``82JT`"&LD)"T`"+2L`\AL&B("YX%![`;$(DC31
XMP4J19PHB`N>!T<$@"&`(<`DI0`,L<`!,WP`$3EU.=7(`2$!.=4CGP,!(>0``&
XM``1.N0``&2A83TY5__1(YP`@1>P#-+3\``!G-@@J``(`&V8J""H``0`;9R(@C
XM*@`$D*H`$"M`__A*@&<2+P`O*@`0+RH`'$ZZ`[)/[P`,)%)@Q"\M``A.N@<><
XM6$],WP0`3EU.=0``&2A83TS?<&%.5?_V+RT`"$ZZ_S)83RM`__9*@&8$</]@G
XM*B\M`!`O+0`,(&W_]B\H``1.N@@D3^\`#"M`__I*K``89P1P_V`$("W_^DY=Z
XM3G5.5?_X("T`"`:`````#"]````@+P``<@`L>``$3J[_.BM`__Q*K?_\9@1P#
XM`&`T("T`"`:`````#"!M__PA0``(+PA(;`7T80`!"%!/2JP#M&8&*6W__`.TZ
XM(&W__-#\``P@"$Y=3G5.5?_\+RT`"&&06$\K0/_\2H!F!C!\__\@"$Y=3G5.Z
XM5?_X2.<!(&$``(!P`"E``!`I0``(*4``#"E``\`I0`/$*4`#N"E``[0I0`.\4
XM2JP#L&=,("P$:"(L`[#2@%.!(`$B+`1H3KH%$"(L!&A.N@7,4(`N`"`'(`=6H
XM@.2`Y8`N`"\'80#_%EA/)$"T_```9@1P_V`,+P<O"DZZ`+Q03W``3-\$@$Y=_
XM3G5.5?_X*VP%]/_\2JW__&<D(&W__"M0__@B;?_\(&W__"`H``@L>``$3J[_D
XM+BMM__C__&#6D<@I2`7X*4@%]$Y=3G5.50``2.<`(")M``@@:0`$(FT`#"-(I
XM``21R"*()&T`"$J29@(DB4JJ``1G!B!J``0@B25)``1,WP0`3EU.=0``4W5MQ
XM``````````````1>.``$7E``!%R@``1>*``$7D1L:%]/<&5N0VYT<&%.5?_\5
XM("T`#"\`+RT`""M`__QA!E!/3EU.=4Y5_^A(YR$P+BT`#$J';@9P_V```/(,)
XMAP````AL`GX((`<@!U:`Y(#E@"X`(&T`""M(__31Q]^L`\1#[`/`)%$K2/_P,
XM*TG_^+3\``!G``"B($H@*@`$($K1P"M(_^PD+?_PM<)C%B)M__0BBB-'``0FG
XM;?_X)HEP`&```(RUPF8>(E(F;?_T)HD@*@`$(@#2AR=!``0B;?_X(HMP`&!HS
XM(FW_]+/(9`B?K`/$</]@6+/(9BY*DF<.(A*T@6,(GZP#Q'#_8$+?J@`$2I)G)
XM$+229@P@0B`H``31J@`$))!P`&`F*TK_^"MM_^S_Z"128`#_6B!M__@@K?_TH
XMD<@B;?_T(H@C1P`$(`A,WPR$3EU.=4Y5__A(YP$`(&T`#$H89OQ3B)'M``PN^
XM""!M``A*&&;\4XB1[0`((`@B;0`(T\`K2?_X(BT`$+Z!8P(N`2`'(&T`#&`"3
XM$MA3@&3Z(&W_^$(P>``@+0`(3-\`@$Y=3G4``$Y5__@O+0`(3KK[IEA/*T#_O
XM^$J`9@1P_V!((&W_^`@H``,``V<22'@``D*G+RT`"$ZZ_$)/[P`,+RT`$"\M=
XM``P@;?_X+R@`!$ZZ!"I/[P`,*T#__$JL`!AG!'#_8`0@+?_\3EU.=0``````3
XM@$YU<&%.5?_P2.<!,"1M``@,K````"`&`&P``)`2$@P!`"!G#`P!``EG!@P!-
XM``IF!%**8.A*$F=R("P&`.6`4JP&`$'L!@C1P"M(__P,$@`B9BA2BB"*2A)G9
XM"@P2`")G!%**8/)*$F8,2'@``4ZZ`J)83V"<0A)2BF"6(&W__""*2A)G&!(28
XM#`$`(&<0#`$`"6<*#`$`"F<$4HI@Y$H29@)@"$(24HI@`/]H2JP&`&8&(&P`D
XM2&`$0>P&""E(!@1*K`8`9@``AD'L`YPB2$?L!H@FV2;9)MDFV3:1)FP`2")KK
XM`"1(>``H+RD`!$AL!HA.NOY$3^\`#$'L!H@B""0\```#[BQL!%Q.KO_B*4`&X
XMR"`L!L@I0`;0<@0I00;,*4`&V"E!!M3E@"M`__"3R2QX``1.KO[:*T#_]"!M@
XM__`B;?_T(V@`"`"D?@!@,BQL!%Q.KO_**4`&R"QL!%Q.KO_$*4`&T$'L`ZXBB
XM""0\```#[2QL!%Q.KO_B*4`&V'X$(`<@!P"```"``8&L!L0@!R`'`(```(`",
XM@:P&S`"L``"``P;42JP#,&<$<`!@!B`\``"``"X`0JP#4"`'(`<`@`````$IU
XM0`-,<`$I0`-R(`<@!P"``````BE``VYP`BE``Y0@!R`'`(````"`*4`#D$'Z_
XM`;XI2``P+RP&!"\L!@!.NM@64$]"ITZZ^9Y83TS?#(!.74YU``!F9F9F9F88+
XM9@````````````````````!*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```8$
XM1(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$W
XMP3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF9H
XM64,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(J
XM0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,-`)A\D'TYU($(B0R0`)@%(0DA#;
XMQ,'&P,#!U$-(0D)"T((F"20(3G5.5?_X2.<!('X`1>P&Q+ZL`\AL'DJ29Q0(B
XM*@`"``-G`F`*+RH`!$ZZ`;183U*'4(I@W"\M``PO+0`(3KK6'E!/3-\$@$Y=S
XM3G5.5?_\<``B/```,``L>``$3J[^S@*````P`"M`__Q*@&8$<`!@)$JL`#!G<
XM&B!L`#!.D$J`9@1P`&`00J=(>``43KK_=E!/("W__$Y=3G5AL$YU``!*K`!H)
XM9A)#[`1(<``L>``$3J[]V"E``&@I;`!4!`A(>``\2'@`^G``+P`O`$AL!#1(:
XM;`0:2&P#_"\`3KKW*$_O`"!3@&<$</]@`G``3G4``$YU`````EI@```!`$Y56
XM__Q(YP$`2JP`,&<$3KK_0$*L`!@B+0`()"T`#"8M`!`L;`1<3J[_T"X`#(?_C
XM____9A(L;`1<3J[_?"E``!AP!2E``RP@!TS?`(!.74YU3E7_^$CG,0)*K``P4
XM9P1.NO[P0JP`&"`M`!!3@"]``!`B+0`()"T`#"8O`!`L;`1<3J[_OBX`#(?_@
XM____9A(L;`1<3J[_?"E``!AP%BE``RP@+0`0#(`````"9QP,@`````%G"DJ`Y
XM9B(@+0`,8!P@!R`'T*T`#&`2(BT`"'0`=@`L;`1<3J[_ODYQ3-]`C$Y=3G4`\
XM`$Y5``!*K``P9P1.NOY@(BT`""QL!%Q.KO_<<`!.74YU(&\`!""(6)!"J``$O
XM(4@`"$YU``!(YSP@)B\`&!0O`!]Z_R\%3KD``"[H$@!P`!`!*`!R_[*`6(]F#
XM!'``8&8O/``!``%(>``B3KD``"ZD)$`J"E"/9@XO!$ZY```N_'``6(]@0"5#0
XM``H50@`)%7P`!``(0BH`#A5$``]"ITZY```NU"5``!!*@UB/9PHO"DZY```OD
XM$&`*2&H`%$ZY```LT%B/(`I,WP0\3G4O"B1O``A*J@`*9PHO"DZY```O)%B/_
XM%7P`_P`(</\E0``4<``0*@`/+P!.N0``+OQ(>``B+PI.N0``+KQ/[P`,)%].`
XM=0``("\`!$AX`#`O`$ZY```MY%"/3G4@+P`$+P!.N0``+B98CTYU2.<X`"0OB
XM`!`F+P`42H)F!'``8"@O/``!``$O`TZY```NI"!`*`A0CV8"8.01?``%``@Q%
XM0P`2(4(`#B`(3-\`'$YU(&\`!"`(9@)@)!%\`/\`"'#_(4``%'#_(4``&'``O
XM,"@`$B\`+PA.N0``+KQ0CTYU``!(YR`"+'D```1<3.\`!@`,3J[_XDS?0`1.@
XM=0``+PXL>0``!%PB+P`(3J[_W"Q?3G5(YS`"+'D```1<3.\`#@`03J[_T$S?J
XM0`Q.=0``+PXL>0```$!,[P`#``A.KO\Z+%].=0``+PXL>0```$`B;P`(("\`$
XM#$ZN_RXL7TYU+PXL>0```$`B;P`(3J[^VBQ?3G4O#BQY````0"`O``A.KOZV)
XM+%].=2\.+'D```!`("\`"$ZN_K`L7TYU+PXL>0```$`B;P`(3J[^GBQ?3G4O/
XM#BQY````0")O``A.KOZ8+%].=2\.+'D```!`(&\`"$ZN_HPL7TYU+PXL>0``;
XM`$`B;P`(3J[^ABQ?3G4O#BQY````0"!O``A.KOZ`+%].=2\.+'D```!`(F\`;
XM"$ZN_F(L7TYU+PXL>0```$`@;P`(3.\"`0`,(B\`%$ZN_D0L7TYU```O#BQY(
XM````0")O``A.KOX^+%].=2\.+'D```!`(F\`"$ZN_C@L7TYU+PXL>0```$`B>
XM;P`(3J[^,BQ?3G4O#BQY````0")O``A.KOX@+%].=2\.+'D```!`(F\`""`O>
XM``Q.KOW8+%].=2\.+'D```!L(F\`""`O``Q.KO\6+%].=4CG,`(L>0```&P@>
XM;P`03.\`#P`43J[^X$S?0`Q.=0``+PXL>0```&PB;P`(3.\``P`,3J[^O"Q?C
XM3G4``"\.+'D```!L(F\`""`O``Q.KOZJ+%].=2\.+'D```!H(&\`"$ZN_\HL)
XM7TYU+PXL>0```&@@;P`(3J[_OBQ?3G4O#BQY````:"!O``A.KO^X+%].=2\.I
XM+'D```!H(&\`"$ZN_Z`L7TYU+PXL>0```&@@;P`(3J[_.BQ?3G4O#BQY````3
XM:"!O``A.KO\T+%].=2\.+'D```!H3.\#```(3J[^^"Q?3G4``"\.+'D```!H6
XM(&\`""`O``Q.KO[F+%].=0```^P````[````````+@(``"Y.```MS```+=P`X
XM`"T:```L]@``+4X``"VF```M*@``+6```"UL```MB@``+;(``"+(```BL```&
XM(F(``"(Z```B%@``(?8``"&\```@T```($8``"`F```?^```(!H``!_R```?I
XMV```'Z```!_2```?F@``'\```!^(```?:```'R```!X0```=\```'<0``!V^$
XM```=D@``'6P``!U2```=N```'38``!V,```=,```'1```!S"```<N@``'#X``
XM`!OP```;D```&GX``!K<```:5```&DX``!GX```9T@``&N(``!G&````(P``4
XM``$``#$0```P^```,.0``##0```PO```,*@``#"4```P@```,&@``#!,```PZ
XM+@``,!0``"_\```OZ```+]0``"_````OK```+XP``"]X```O9```+U```"\\@
XM```O*```+Q0``"\````N[```+M@``"[````NJ```+HX``"YX```N7@``(MH`7
XM``$2````#@````````/R```#Z@```1L`````````````````````````````?
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````&1O<RYL:6)R87)Y````````````I
XM36%N9&5L8G)O="!3970@=C$N,@```````4`````%`!\````/`````````'``?
XM```````````````!0````!\```$````9````````````````````````````Z
XM````````````#P```````````0````\`#R`/0`]@#X`/H`_`#^`/\`[P#/`*+
XM\`CP!O`$\`+P`/``X@#$`*8`B`!J`$P`+@`/`0\$#P@/"P\/#PJJ:6YT=6ET^
XM:6]N+FQI8G)A<GD`9W)A<&AI8W,N;&EB<F%R>0``4VAO=R!4:71L92!"87(`5
XM`$AI9&4@5&ET;&4@0F%R``!3879E('-C<F5E;@!%;G1E<B!F:6QE;F%M93H*C
XM``!%;G1E<B!087)A;65T97)S``!%;G1E<B!8(&-O;7!O;F5N="!O9B!#.@H`W
XM`$5N=&5R(%D@8V]M<&]N96YT(&]F($,Z"@``16YT97(@8F]T=&]M(&QE9G0@D
XM6"!C;RUO<F0Z"@``16YT97(@8F]T=&]M(&QE9G0@62!C;RUO<F0Z"@``16YT&
XM97(@=&]P(')I9VAT(%@@8V\M;W)D.@H``$5N=&5R('1O<"!R:6=H="!9(&-O"
XM+6]R9#H*``!);G9A;&ED(&-O+6]R9&EN871E<R$*``!$;R!-86YD96QB<F]TK
XM(%-E=`!$;R!*=6QI82!3970``%-A=F4@4V-R965N`$5X:70``$]P=&EO;G,`U
XM1D]230``24Q"30``0DU(1```0TU!4```0D]$60``````%``4`1@`9``?```#)
XM````%`H```````````````````````````!X`%@"@`$```\``````````````
XM`````````````&UY+F-O;BYW<FET90``;7DN8V]N+G)E860`8V]N<V]L92YD0
XM979I8V4``$U/4D4N+BX`#2`@("`@("`-`````````(`````#5@``````````<
XM`````````````````````````````````W@`````````````````````````[
XM`````````````````````````````````````````````````````````````
XM``!C;VXZ,3`O,3`O,S(P+S@P+P`J````````````````````````````````?
XM`````"@J*B!5<V5R($%B;W)T(%)E<75E<W1E9"`J*@``__\````.``X`````S
XM```#S`````#__P````0`!``````````````#Z$-/3E1)3E5%``#__P````0`G
XM!`````````00`````$%"3U)4`/__````!``$````````!"X`````:6YT=6ETE
XM:6]N+FQI8G)A<GD```````````````````````0````#[`````<````!```$H
XA0```!"8```0,```#]````U8```,T````F`````````/R.
X``
Xend
Xsize 14208
END_OF_FILE
if test 19935 -ne `wc -c <'mandelbrot_.uu'`; then
    echo shar: \"'mandelbrot_.uu'\" unpacked with wrong size!
fi
# end of 'mandelbrot_.uu'
fi
if test -f 'saveilbm.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'saveilbm.c'\"
else
echo shar: Extracting \"'saveilbm.c'\" \(3407 characters\)
sed "s/^X//" >'saveilbm.c' <<'END_OF_FILE'
X
X#include <libraries/dos.h>
X#include <graphics/rastport.h>
X
X#define putbyte(x) {*d++=(x);}
X
Xlong Write ();
Xunsigned char *AllocMem ();
Xstruct FileHandle *Open ();
Xunsigned char *d;	/* temp buffer pointer */
X
Xint saveilbm (bitmap,colormap,title)	/* returns 0 if no error */
Xstruct BitMap *bitmap;
Xunsigned short *colormap;
Xchar *title;
X{
X	int width,height,rowlen,i,j,k;
X	int numcols,ldepth,lheight,lrowlen;
X	int p,q;					/* temp bitmap pointers */
X	unsigned char depth;
X	unsigned char *dest;		/* where to put output before writing */
X	unsigned char *e;			/* temp buffer pointer */
X	unsigned char *rowstart;	/* addr of start of bitplane row */
X	long totlen,bodlen;
X	struct FileInfoBlock *file;
X	if (!(file=Open (title,MODE_NEWFILE)))
X		return (1);
X	rowlen=bitmap->BytesPerRow;
X	width=rowlen*8;
X	height=bitmap->Rows;
X	depth=bitmap->Depth;
X	lrowlen=bitmap->BytesPerRow;
X	lheight=bitmap->Rows;
X	ldepth=bitmap->Depth;
X	numcols=1<<depth;
X	if (!(dest=AllocMem ((long)(lrowlen*lheight*ldepth+4096),0L)))
X	{
X		Close (file);	/* we're going to store entire output file in */
X		return (2);		/* memory to work on before writing to disk */
X	}
X	d=dest;
X	putword ("FORM");
X	d+=4;				/* Leave gap for size which we'll put in later */
X	putword ("ILBM");
X	putword ("BMHD");
X	putlong (20L);
X
X		/* Write BMHD block */
X
X	putshort (width);
X	putshort (height);
X	putshort (0);
X	putshort (0);
X	putbyte (depth);
X	putbyte (0);
X	putbyte (1);
X	putbyte (0);
X	putshort (0);
X	putbyte (0);
X	putbyte (0);
X	putshort (width);
X	putshort (height);
X
X	putword ("CMAP");
X	putlong (numcols*3);
X
X		/* Write color map */
X
X	for (i=0;i<numcols;i++)
X	{
X		putbyte ((colormap[i]>>8)<<4);
X		putbyte (colormap[i]&0x00F0);
X		putbyte ((colormap[i]&0x000F)<<4);
X	}
X	if ((numcols*3)&1)		/* if odd length, put pad byte */
X		putbyte (0);
X
X	putword ("BODY");
X	e=d;
X	d+=4;			/* leave space to put length in later */
X
X		/* Write bitplanes */
X
X	for (i=0;i<height;i++)
X		for (j=0;j<depth;j++)
X		{
X			rowstart=(bitmap->Planes[j])+rowlen*i;
X			p=q=0;
XL0:
X			if (++p>=rowlen)
X			{
X				putbyte ((char)(-p+q+1));
X				putbyte (rowstart[q]);
X				goto ER;
X			}
X			if (rowstart[p]==rowstart[p-1])
X				goto L0;
X			putbyte ((char)(-p+q+1));
X			putbyte (rowstart[q]);
X			q=p;
XL1:
X			if (++p>=rowlen)
X			{
X				putbyte ((char)(p-q-1));
X				for (k=q;k<p;k++)
X					putbyte (rowstart[k]);
X				goto ER;
X			}
X			if (rowstart[p]!=rowstart[p-1])
X				goto L1;
X			if (++p>=rowlen)
X			{
X				putbyte ((char)(p-q-1));
X				for (k=q;k<p;k++)
X					putbyte (rowstart[k]);
X				goto ER;
X			}
X			if (rowstart[p]!=rowstart[p-1])
X				goto L1;
X			if (p-q>2)
X			{
X				putbyte ((char)(p-q-3));
X				for (k=q;k<p-2;k++)
X					putbyte (rowstart[k]);
X				q=p-2;
X			}
X			goto L0;
XER:
X			q=0;
X		}
X	if ((d-e)&1)
X		putbyte (0);	/* If body odd length, put pad byte */
X	bodlen=d-e-4;
X	totlen=d-dest-8;
X	d=e;
X	putlong (bodlen);
X	d=dest+4;
X	putlong (totlen);
X	if (Write (file,dest,totlen+8)!=totlen+8)
X		i=3;
X			else
X				i=0;
X	Close (file);
X	FreeMem (dest,(long)(ldepth*lheight*lrowlen+500));
X	return (i);			/* No error */
X}
X
Xputword (string)
Xunsigned char *string;
X{
X	putbyte (string[0]);
X	putbyte (string[1]);
X	putbyte (string[2]);
X	putbyte (string[3]);
X}
X
Xputlong (n)
Xunsigned long n;
X{
X	putbyte ((unsigned char)(n>>24));
X	putbyte ((unsigned char)(n>>16));
X	putbyte ((unsigned char)(n>>8));
X	putbyte ((unsigned char)n);
X}
X
Xputshort (n)
Xunsigned int n;
X{
X	putbyte ((unsigned char)(n>>8));
X	putbyte ((unsigned char)n);
X}
END_OF_FILE
if test 3407 -ne `wc -c <'saveilbm.c'`; then
    echo shar: \"'saveilbm.c'\" unpacked with wrong size!
fi
# end of 'saveilbm.c'
fi
if test -f 'scanfloat.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'scanfloat.c'\"
else
echo shar: Extracting \"'scanfloat.c'\" \(1475 characters\)
sed "s/^X//" >'scanfloat.c' <<'END_OF_FILE'
X
X/* Routine to scan a floating point number from a null-terminated string.
X * Written 1987 by Russell Wallace. May be freely copied and used in
X * developing Amiga software. Requires linkage with m.lib if used with
X * Aztec C. */
X
Xtypedef double TYPE;	/* Define this as float or double, whichever reqd. */
X
XTYPE scanfloat (string)
Xchar *string;
X{
X	register short i,j,minus;
X	TYPE number,column;
X	i=minus=0;
X	while ((string[i]<'0' || string[i]>'9')&& string[i]!='-' && string[i]!='.' && string[i])
X		i++;	/* Search for start of number or end of string */
X	if (string[i]=='-')
X	{
X		minus=1;	/* Is negative number */
X		i++;
X		if ((string[i]<'0' || string[i]>'9')&& string[i]!='.')
X			return ((TYPE)0);
X	}
X	if (string[i]=='\0')
X		return ((TYPE)0);	/* If end of string, return 0 */
X	string+=i;	/* Move along to start of string */
X	i=0;
X	while (string[i]>='0' && string[i]<='9')
X		i++;	/* Look for decimal point */
X	j=i;
X	number=0;
X	column=1;
X	for (i--;i>=0;i--)	/* Go back from point to start of number */
X	{
X		number+=(string[i]-'0')*column;	/* add digit value to number */
X		column*=10;		/* each column is 10 times value of one to right */
X	}
X	column=.1;
X	if (string[j]=='.')	/* If decimal point, get stuff after it */
X		for (i=j+1;string[i]>='0' && string[i]<='9';i++)
X		{				/* scan right to end of number */
X			number+=(string[i]-'0')*column;
X			column/=10;		/* each column 10 times less than one to left */
X		}
X	if (minus)
X		return (-number);
X			else
X				return (number);
X}
END_OF_FILE
if test 1475 -ne `wc -c <'scanfloat.c'`; then
    echo shar: \"'scanfloat.c'\" unpacked with wrong size!
fi
# end of 'scanfloat.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.