From 9f07e222f828b7b2bf2775b9dc8cd18b22a829c1 Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Sat, 13 Oct 2001 15:14:27 +0000
Subject: rfbSelectBox, consoleFonts, too many changes

---
 CHANGES          |   7 +
 Makefile         |  11 +-
 README           |  27 ++++
 TODO             |  13 +-
 auth.c           |  29 +----
 bdf2c.pl         |  15 ++-
 consolefont2c.pl |  38 ++++++
 cursor.c         |  12 +-
 default8x16.h    | 261 +++++++++++++++++++++++++++++++++++++
 draw.c           |  16 +++
 font.c           | 140 ++++++++++++++++++--
 fontsel.c        |  71 ++++++++++
 keysym.h         |   3 +
 main.c           |  42 ++++--
 radon.h          | 386 +++++++++++++++++++++++++++----------------------------
 rfb.h            |  37 +++++-
 selbox.c         | 301 +++++++++++++++++++++++++++++++++++++++++++
 17 files changed, 1148 insertions(+), 261 deletions(-)
 create mode 100644 consolefont2c.pl
 create mode 100644 default8x16.h
 create mode 100644 draw.c
 create mode 100644 fontsel.c
 create mode 100644 selbox.c

diff --git a/CHANGES b/CHANGES
index f1b8982..2b5d91e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,11 @@
 0.2
+   added rfbLoadConsoleFont
+   fixed font colour handling.
+   added rfbSelectBox
+   added rfbDrawCharWithClip to allow for clipping and a background colour.
+   fixed font colours
+   added rfbFillRect
+   added IO function to check password.
    rfbNewClient now sets the socket in the fd_set (for the select() call)
    when compiling the library with HAVE_PTHREADS and an application
 	which includes "rfb.h" without, the structures got mixed up.
diff --git a/Makefile b/Makefile
index ecfb2db..64fe312 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,8 @@ INCLUDES=-I.
 VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg
 
 # Uncomment these two lines to enable use of PThreads
-PTHREADDEF = -DHAVE_PTHREADS
-PTHREADLIB = -lpthread
+#PTHREADDEF = -DHAVE_PTHREADS
+#PTHREADLIB = -lpthread
 
 # Comment the following line to disable the use of 3 Bytes/Pixel.
 # The code for 3 Bytes/Pixel is not very efficient!
@@ -23,11 +23,11 @@ OSX_LIBS = -framework ApplicationServices -framework Carbon
 SOURCES=main.c rfbserver.c sraRegion.c auth.c sockets.c \
 	stats.c corre.c hextile.c rre.c translate.c cutpaste.c \
 	zlib.c tight.c httpd.c cursor.c font.c \
-	d3des.c vncauth.c
+	draw.c selbox.c d3des.c vncauth.c
 OBJS=main.o rfbserver.o sraRegion.o auth.o sockets.o \
 	stats.o corre.o hextile.o rre.o translate.o cutpaste.o \
 	zlib.o tight.o httpd.o cursor.o font.o \
-	d3des.o vncauth.o
+	draw.o selbox.o d3des.o vncauth.o
 INSTALLHEADER=rfb.h rfbproto.h sraRegion.h keysym.h
 
 all: example pnmshow storepasswd
@@ -73,6 +73,9 @@ blooptest.o: example.c rfb.h
 pnmshow24: pnmshow24.o libvncserver.a
 	$(CC) -o pnmshow24 pnmshow24.o $(LIBS)
 
+fontsel: fontsel.o libvncserver.a
+	$(CC) -o fontsel fontsel.o -L. -lvncserver -lz -ljpeg
+
 clean:
 	rm -f $(OBJS) *~ core "#"* *.bak *.orig storepasswd.o \
 	     	mac.o example.o pnmshow.o pnmshow24.o sratest.o \
diff --git a/README b/README
index 2874f21..78df927 100644
--- a/README
+++ b/README
@@ -322,6 +322,33 @@ http://www.gimp.org/win32/extralibs-dev-20001007.zip
 
 Thanks go to all the GIMP team!
 
+What are those other targets in the Makefile?
+---------------------------------------------
+
+OSXvnc-server is the original OSXvnc adapted to use the library, which was in
+turn adapted from OSXvnc. As you easily can see, the OSX dependend part is
+minimal.
+
+storepasswd is the original program to save a vnc style password in a file.
+Unfortunately, authentication as every vncviewer speaks it means the server
+has to know the plain password. You really should tunnel via ssh or use
+your own PasswordCheck to build a PIN/TAN system.
+
+sratest is a test unit. Run it to assert correct behaviour of sraRegion. I
+wrote this to test my iterator implementation.
+
+blooptest is a test of pthreads. It is just the example, but with a background
+loop to hunt down thread lockups.
+
+pnmshow24 is like pnmshow, but it uses 3 bytes/pixel internally, which is not
+as efficient as 4 bytes/pixel for translation, because there is no native data
+type of that size, so you have to memcpy pixels and be real cautious with
+endianness. Anyway, it works.
+
+fontsel is a test for rfbSelectBox and rfbLoadConsoleFont. If you have Linux
+console fonts, you can browse them via VNC. Directory browsing not implemented
+yet :-(
+
 Why I don't feel bad about GPL
 ------------------------------
 
diff --git a/TODO b/TODO
index 53b3fa1..328c54a 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,6 @@
 immediate:
 ----------
 
-authentification schemes (secure vnc)
-udp (need an rfbClientPtr udpClient in rfbScreen)
 documentation
 	hint that to mark very tiny regions as
 	modified is possibly inefficient for the encodings.
@@ -11,14 +9,23 @@ documentation
 later:
 ------
 
+authentification schemes (secure vnc)
+	IO function ptr exists; now explain how to tunnel and implement a
+	client address restriction scheme.
 autoconf? at least Sun Solaris and Windows compilation
-	(maybe Michael makes that)
+	(maybe Michael makes a small autconf)
 using Hermes library for fast colour translations.
 CORBA
+internal HTTP tunnelling feature (needs a special GET target and a few
+	changes to java applet).
 
 done:
 -----
 
+.empty cursor sending doesn't work.
+.udp (need an rfbClientPtr udpClient in rfbScreen)
+	input only; nearly untested (don't have the clients).
+.font handling: bpp>1
 .test copyRect and pthreads.
 .optionally dont draw rich cursors as xcursors
 .cursor smears on IRIX with pthreads, then has bus error. has to be a mutex
diff --git a/auth.c b/auth.c
index 4244cd6..e7bd74f 100644
--- a/auth.c
+++ b/auth.c
@@ -73,8 +73,7 @@ void
 rfbAuthProcessClientMessage(cl)
     rfbClientPtr cl;
 {
-    char passwd[1024];
-    int i, n;
+    int n;
     CARD8 response[CHALLENGESIZE];
     CARD32 authResult;
 
@@ -85,8 +84,8 @@ rfbAuthProcessClientMessage(cl)
         return;
     }
 
-    if(!cl->screen->getPassword(cl,passwd,MAXPWLEN)) {
-        rfbLog("rfbAuthProcessClientMessage: could not get password\n");
+    if(!cl->screen->passwordCheck(cl,response,CHALLENGESIZE)) {
+        rfbLog("rfbAuthProcessClientMessage: password check failed\n");
         authResult = Swap32IfLE(rfbVncAuthFailed);
         if (WriteExact(cl, (char *)&authResult, 4) < 0) {
             rfbLogPerror("rfbAuthProcessClientMessage: write");
@@ -95,28 +94,6 @@ rfbAuthProcessClientMessage(cl)
         return;
     }
 
-    vncEncryptBytes(cl->authChallenge, passwd);
-
-    /* Lose the password from memory */
-    for (i = strlen(passwd); i >= 0; i--) {
-        passwd[i] = '\0';
-    }
-
-    free((char *)passwd);
-
-    if (memcmp(cl->authChallenge, response, CHALLENGESIZE) != 0) {
-        rfbLog("rfbAuthProcessClientMessage: authentication failed from %s\n",
-               cl->host);
-
-        authResult = Swap32IfLE(rfbVncAuthFailed);
-
-        if (WriteExact(cl, (char *)&authResult, 4) < 0) {
-            rfbLogPerror("rfbAuthProcessClientMessage: write");
-        }
-        rfbCloseClient(cl);
-        return;
-    }
-
     authResult = Swap32IfLE(rfbVncAuthOK);
 
     if (WriteExact(cl, (char *)&authResult, 4) < 0) {
diff --git a/bdf2c.pl b/bdf2c.pl
index e92b465..fc43712 100644
--- a/bdf2c.pl
+++ b/bdf2c.pl
@@ -20,9 +20,17 @@ while(<>) {
   } elsif(/^ENCODING (.*)$/) {
     $glyphindex=$1;
     $searchfor="BBX";
+    $dwidth=0;
+  } elsif(/^DWIDTH (.*) (.*)/) {
+    $dwidth=$1;
   } elsif(/^BBX (.*) (.*) (.*) (.*)$/) {
     ($width,$height,$x,$y)=($1,$2,$3,$4);
     @encodings[$glyphindex*5..($glyphindex*5+4)]=($counter,$width,$height,$x,$y);
+    if($dwidth != 0) {
+      $encodings[$glyphindex*5+1]=$dwidth;
+    } else {
+      $dwidth=$width;
+    }
     $searchfor="BITMAP";
   } elsif(/^BITMAP/) {
     $i=1;
@@ -31,8 +39,11 @@ while(<>) {
       $i=0;
       $out.=" /* $glyphindex */\n";
     } else {
-      $_=substr($_,0,length($_)-1);
-      $counter+=length($_)/2;
+      if(int(($dwidth+7)/8) > int(($width+7)/8)) {
+	$_ .= "00"x(int(($dwidth+7)/8)-int(($width+7)/8));
+      }
+      $_=substr($_,0,(int(($dwidth+7)/8)*2));
+      $counter+=(int(($dwidth+7)/8));
       s/(..)/$nullx$1,/g;
       $out.=$_;
       $i++;
diff --git a/consolefont2c.pl b/consolefont2c.pl
new file mode 100644
index 0000000..9196649
--- /dev/null
+++ b/consolefont2c.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+
+# convert a linux console font (8x16 format) to a font definition
+# suitable for processing with LibVNCServer
+
+#if($#ARGV == 0) { exit; }
+
+foreach $i (@ARGV) {
+  $fontname = $i;
+  $fontname =~ s/\.fnt$//;
+  $fontname =~ s/^.*\///g;
+  $fontname =~ y/+/_/;
+
+  print STDERR "$i -> $fontname\n";
+
+  open IN, "<$i";
+  print STDERR read(IN,$x,4096);
+  close(IN);
+
+  open OUT, ">$fontname.h";
+  print OUT "unsigned char ".$fontname."FontData[4096+1]={";
+  for($i=0;$i<4096;$i++) {
+    if(($i%16)==0) {
+      print OUT "\n";
+    }
+    printf OUT "0x%02x,", ord(substr($x,$i));
+  }
+
+  print OUT "\n};\nint ".$fontname."FontMetaData[256*5+1]={\n";
+  for($i=0;$i<256;$i++) {
+    print OUT ($i*16).",8,16,0,0,";
+  }
+
+  print OUT "};\nrfbFontData ".$fontname."Font = { ".$fontname."FontData, "
+    .$fontname."FontMetaData };\n";
+
+  close OUT;
+}
diff --git a/cursor.c b/cursor.c
index 5663e85..5e86de1 100644
--- a/cursor.c
+++ b/cursor.c
@@ -42,21 +42,21 @@ rfbSendCursorShape(cl)
     CARD8 bitmapByte;
 
     pCursor = cl->screen->getCursorPtr(cl);
-    if(!pCursor) return TRUE;
+    //if(!pCursor) return TRUE;
 
     if (cl->useRichCursorEncoding) {
-       if(!pCursor->richSource)
-	 MakeRichCursorFromXCursor(cl->screen,pCursor);
-       rect.encoding = Swap32IfLE(rfbEncodingRichCursor);
+      if(pCursor && !pCursor->richSource)
+	MakeRichCursorFromXCursor(cl->screen,pCursor);
+      rect.encoding = Swap32IfLE(rfbEncodingRichCursor);
     } else {
-       if(!pCursor->source)
+       if(pCursor && !pCursor->source)
 	 MakeXCursorFromRichCursor(cl->screen,pCursor);
        rect.encoding = Swap32IfLE(rfbEncodingXCursor);
     }
 
     /* If there is no cursor, send update with empty cursor data. */
 
-    if ( pCursor->width == 1 &&
+    if ( pCursor && pCursor->width == 1 &&
 	 pCursor->height == 1 &&
 	 pCursor->mask[0] == 0 ) {
 	pCursor = NULL;
diff --git a/default8x16.h b/default8x16.h
new file mode 100644
index 0000000..d557d47
--- /dev/null
+++ b/default8x16.h
@@ -0,0 +1,261 @@
+unsigned char default8x16FontData[4096+1]={
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x18,0x3c,0x3c,0xe7,0xe7,0xe7,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x18,0x3c,0x7e,0xff,0xff,0x7e,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
+0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,
+0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff,
+0x00,0x00,0x1e,0x0e,0x1a,0x32,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3f,0x33,0x3f,0x30,0x30,0x30,0x30,0x70,0xf0,0xe0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7f,0x63,0x7f,0x63,0x63,0x63,0x63,0x67,0xe7,0xe6,0xc0,0x00,0x00,0x00,
+0x00,0x00,0x00,0x18,0x18,0xdb,0x3c,0xe7,0x3c,0xdb,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,
+0x00,0x02,0x06,0x0e,0x1e,0x3e,0xfe,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7f,0xdb,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,
+0x00,0x7c,0xc6,0x60,0x38,0x6c,0xc6,0xc6,0x6c,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0xfe,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xfe,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xff,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00,
+0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00,
+0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xce,0xde,0xf6,0xe6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00,
+0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0xe7,0xff,0xff,0xdb,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00,
+0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xff,0xdb,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x3c,0x66,0xc3,0xc3,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xff,0xc3,0x86,0x0c,0x18,0x30,0x60,0xc1,0xc3,0xff,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00,
+0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
+0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,
+0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xe6,0xff,0xdb,0xdb,0xdb,0xdb,0xdb,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00,
+0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc3,0x66,0x3c,0x18,0x3c,0x66,0xc3,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00,
+0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
+0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x0c,0x06,0x7c,0x00,0x00,
+0x00,0x00,0xcc,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x0c,0x18,0x30,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x10,0x38,0x6c,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0xcc,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x60,0x30,0x18,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x38,0x6c,0x38,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x0c,0x06,0x3c,0x00,0x00,0x00,
+0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x18,0x3c,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0xc6,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x38,0x6c,0x38,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x18,0x30,0x60,0x00,0xfe,0x66,0x60,0x7c,0x60,0x60,0x66,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x1b,0x7e,0xd8,0xdc,0x77,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3e,0x6c,0xcc,0xcc,0xfe,0xcc,0xcc,0xcc,0xcc,0xce,0x00,0x00,0x00,0x00,
+0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x30,0x78,0xcc,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x60,0x30,0x18,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc6,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00,
+0x00,0xc6,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0xc6,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x18,0x18,0x7e,0xc3,0xc0,0xc0,0xc0,0xc3,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xe6,0xfc,0x00,0x00,0x00,0x00,
+0x00,0x00,0xc3,0x66,0x3c,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0xfc,0x66,0x66,0x7c,0x62,0x66,0x6f,0x66,0x66,0x66,0xf3,0x00,0x00,0x00,0x00,
+0x00,0x0e,0x1b,0x18,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x18,0xd8,0x70,0x00,0x00,
+0x00,0x18,0x30,0x60,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x0c,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x18,0x30,0x60,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x18,0x30,0x60,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x76,0xdc,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
+0x76,0xdc,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x3c,0x6c,0x6c,0x3e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x38,0x6c,0x6c,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xc0,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,
+0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x60,0xce,0x9b,0x06,0x0c,0x1f,0x00,0x00,
+0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x66,0xce,0x96,0x3e,0x06,0x06,0x00,0x00,
+0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3c,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x36,0x6c,0xd8,0x6c,0x36,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xd8,0x6c,0x36,0x6c,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,
+0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,
+0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
+0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x3f,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x18,0x18,0x18,0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+0x18,0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
+0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0xd8,0xd8,0xd8,0xdc,0x76,0x00,0x00,0x00,0x00,
+0x00,0x00,0x78,0xcc,0xcc,0xcc,0xd8,0xcc,0xc6,0xc6,0xc6,0xcc,0x00,0x00,0x00,0x00,
+0x00,0x00,0xfe,0xc6,0xc6,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0xfe,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xfe,0xc6,0x60,0x30,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7e,0xd8,0xd8,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xc0,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x76,0xdc,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x7e,0x18,0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00,
+0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0x6c,0x6c,0x6c,0x6c,0xee,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1e,0x30,0x18,0x0c,0x3e,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x7e,0xdb,0xdb,0xdb,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x06,0x7e,0xdb,0xdb,0xf3,0x7e,0x60,0xc0,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1c,0x30,0x60,0x60,0x7c,0x60,0x60,0x60,0x30,0x1c,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x7e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0e,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7e,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0xec,0x6c,0x6c,0x3c,0x1c,0x00,0x00,0x00,0x00,
+0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+int default8x16FontMetaData[256*5+1]={
+0,8,16,0,0,16,8,16,0,0,32,8,16,0,0,48,8,16,0,0,64,8,16,0,0,80,8,16,0,0,96,8,16,0,0,112,8,16,0,0,128,8,16,0,0,144,8,16,0,0,160,8,16,0,0,176,8,16,0,0,192,8,16,0,0,208,8,16,0,0,224,8,16,0,0,240,8,16,0,0,256,8,16,0,0,272,8,16,0,0,288,8,16,0,0,304,8,16,0,0,320,8,16,0,0,336,8,16,0,0,352,8,16,0,0,368,8,16,0,0,384,8,16,0,0,400,8,16,0,0,416,8,16,0,0,432,8,16,0,0,448,8,16,0,0,464,8,16,0,0,480,8,16,0,0,496,8,16,0,0,512,8,16,0,0,528,8,16,0,0,544,8,16,0,0,560,8,16,0,0,576,8,16,0,0,592,8,16,0,0,608,8,16,0,0,624,8,16,0,0,640,8,16,0,0,656,8,16,0,0,672,8,16,0,0,688,8,16,0,0,704,8,16,0,0,720,8,16,0,0,736,8,16,0,0,752,8,16,0,0,768,8,16,0,0,784,8,16,0,0,800,8,16,0,0,816,8,16,0,0,832,8,16,0,0,848,8,16,0,0,864,8,16,0,0,880,8,16,0,0,896,8,16,0,0,912,8,16,0,0,928,8,16,0,0,944,8,16,0,0,960,8,16,0,0,976,8,16,0,0,992,8,16,0,0,1008,8,16,0,0,1024,8,16,0,0,1040,8,16,0,0,1056,8,16,0,0,1072,8,16,0,0,1088,8,16,0,0,1104,8,16,0,0,1120,8,16,0,0,1136,8,16,0,0,1152,8,16,0,0,1168,8,16,0,0,1184,8,16,0,0,1200,8,16,0,0,1216,8,16,0,0,1232,8,16,0,0,1248,8,16,0,0,1264,8,16,0,0,1280,8,16,0,0,1296,8,16,0,0,1312,8,16,0,0,1328,8,16,0,0,1344,8,16,0,0,1360,8,16,0,0,1376,8,16,0,0,1392,8,16,0,0,1408,8,16,0,0,1424,8,16,0,0,1440,8,16,0,0,1456,8,16,0,0,1472,8,16,0,0,1488,8,16,0,0,1504,8,16,0,0,1520,8,16,0,0,1536,8,16,0,0,1552,8,16,0,0,1568,8,16,0,0,1584,8,16,0,0,1600,8,16,0,0,1616,8,16,0,0,1632,8,16,0,0,1648,8,16,0,0,1664,8,16,0,0,1680,8,16,0,0,1696,8,16,0,0,1712,8,16,0,0,1728,8,16,0,0,1744,8,16,0,0,1760,8,16,0,0,1776,8,16,0,0,1792,8,16,0,0,1808,8,16,0,0,1824,8,16,0,0,1840,8,16,0,0,1856,8,16,0,0,1872,8,16,0,0,1888,8,16,0,0,1904,8,16,0,0,1920,8,16,0,0,1936,8,16,0,0,1952,8,16,0,0,1968,8,16,0,0,1984,8,16,0,0,2000,8,16,0,0,2016,8,16,0,0,2032,8,16,0,0,2048,8,16,0,0,2064,8,16,0,0,2080,8,16,0,0,2096,8,16,0,0,2112,8,16,0,0,2128,8,16,0,0,2144,8,16,0,0,2160,8,16,0,0,2176,8,16,0,0,2192,8,16,0,0,2208,8,16,0,0,2224,8,16,0,0,2240,8,16,0,0,2256,8,16,0,0,2272,8,16,0,0,2288,8,16,0,0,2304,8,16,0,0,2320,8,16,0,0,2336,8,16,0,0,2352,8,16,0,0,2368,8,16,0,0,2384,8,16,0,0,2400,8,16,0,0,2416,8,16,0,0,2432,8,16,0,0,2448,8,16,0,0,2464,8,16,0,0,2480,8,16,0,0,2496,8,16,0,0,2512,8,16,0,0,2528,8,16,0,0,2544,8,16,0,0,2560,8,16,0,0,2576,8,16,0,0,2592,8,16,0,0,2608,8,16,0,0,2624,8,16,0,0,2640,8,16,0,0,2656,8,16,0,0,2672,8,16,0,0,2688,8,16,0,0,2704,8,16,0,0,2720,8,16,0,0,2736,8,16,0,0,2752,8,16,0,0,2768,8,16,0,0,2784,8,16,0,0,2800,8,16,0,0,2816,8,16,0,0,2832,8,16,0,0,2848,8,16,0,0,2864,8,16,0,0,2880,8,16,0,0,2896,8,16,0,0,2912,8,16,0,0,2928,8,16,0,0,2944,8,16,0,0,2960,8,16,0,0,2976,8,16,0,0,2992,8,16,0,0,3008,8,16,0,0,3024,8,16,0,0,3040,8,16,0,0,3056,8,16,0,0,3072,8,16,0,0,3088,8,16,0,0,3104,8,16,0,0,3120,8,16,0,0,3136,8,16,0,0,3152,8,16,0,0,3168,8,16,0,0,3184,8,16,0,0,3200,8,16,0,0,3216,8,16,0,0,3232,8,16,0,0,3248,8,16,0,0,3264,8,16,0,0,3280,8,16,0,0,3296,8,16,0,0,3312,8,16,0,0,3328,8,16,0,0,3344,8,16,0,0,3360,8,16,0,0,3376,8,16,0,0,3392,8,16,0,0,3408,8,16,0,0,3424,8,16,0,0,3440,8,16,0,0,3456,8,16,0,0,3472,8,16,0,0,3488,8,16,0,0,3504,8,16,0,0,3520,8,16,0,0,3536,8,16,0,0,3552,8,16,0,0,3568,8,16,0,0,3584,8,16,0,0,3600,8,16,0,0,3616,8,16,0,0,3632,8,16,0,0,3648,8,16,0,0,3664,8,16,0,0,3680,8,16,0,0,3696,8,16,0,0,3712,8,16,0,0,3728,8,16,0,0,3744,8,16,0,0,3760,8,16,0,0,3776,8,16,0,0,3792,8,16,0,0,3808,8,16,0,0,3824,8,16,0,0,3840,8,16,0,0,3856,8,16,0,0,3872,8,16,0,0,3888,8,16,0,0,3904,8,16,0,0,3920,8,16,0,0,3936,8,16,0,0,3952,8,16,0,0,3968,8,16,0,0,3984,8,16,0,0,4000,8,16,0,0,4016,8,16,0,0,4032,8,16,0,0,4048,8,16,0,0,4064,8,16,0,0,4080,8,16,0,0,};
+rfbFontData default8x16Font = { default8x16FontData, default8x16FontMetaData };
diff --git a/draw.c b/draw.c
new file mode 100644
index 0000000..df30d5d
--- /dev/null
+++ b/draw.c
@@ -0,0 +1,16 @@
+#include "rfb.h"
+
+void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,Pixel col)
+{
+  int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
+  int i,j;
+  char* colour=(char*)&col;
+
+  if(!rfbEndianTest)
+    colour += 4-bpp;
+  for(j=y1;j<y2;j++)
+    for(i=x1;i<x2;i++)
+      memcpy(s->frameBuffer+j*rowstride+i*bpp,colour,bpp);
+  rfbMarkRectAsModified(s,x1,y1,x2,y2);
+}
+
diff --git a/font.c b/font.c
index 9356793..53055b4 100644
--- a/font.c
+++ b/font.c
@@ -1,13 +1,17 @@
 #include "rfb.h"
 
 int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
-		 int x,int y,unsigned char c,CARD32 colour)
+		 int x,int y,unsigned char c,Pixel col)
 {
-  int i,j,k,width,height;
+  int i,j,width,height;
   unsigned char d;
   unsigned char* data=font->data+font->metaData[c*5];
   int rowstride=rfbScreen->paddedWidthInBytes;
   int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8;
+  char *colour=(char*)&col;
+
+  if(!rfbEndianTest)
+    colour += 4-bpp;
 
   width=font->metaData[c*5+1];
   height=font->metaData[c*5+2];
@@ -20,21 +24,17 @@ int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
 	d=*data;
 	data++;
       }
-      if(d&0x80) {
-	for(k=0;k<bpp;k++)
-	  rfbScreen->frameBuffer[(y+j)*rowstride+(x+i)*bpp+k]=
-	    ((colour>>(8*k))&0xff);
-      }
+      if(d&0x80)
+	memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,colour,bpp);
       d<<=1;
     }
-    if((i&7)==0)
-      data++;
+    if((i&7)!=0) data++;
   }
   return(width);
 }
 
 void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
-		   int x,int y,unsigned char* string,CARD32 colour)
+		   int x,int y,const unsigned char* string,Pixel colour)
 {
   while(*string) {
     x+=rfbDrawChar(rfbScreen,font,x,y,*string,colour);
@@ -42,7 +42,73 @@ void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
   }
 }
 
-int rfbWidth(rfbFontDataPtr font,unsigned char* string)
+/* TODO: these two functions need to be more efficient */
+int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
+			int x,int y,unsigned char c,
+			int x1,int y1,int x2,int y2,
+			Pixel col,Pixel bcol)
+{
+  int i,j,width,height;
+  unsigned char d;
+  unsigned char* data=font->data+font->metaData[c*5];
+  int rowstride=rfbScreen->paddedWidthInBytes;
+  int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8,extra_bytes=0;
+  char* colour=(char*)&col;
+  char* bcolour=(char*)&bcol;
+
+  if(!rfbEndianTest) {
+    colour+=4-bpp;
+    bcolour+=4-bpp;
+  }
+
+  width=font->metaData[c*5+1];
+  height=font->metaData[c*5+2];
+  x+=font->metaData[c*5+3];
+  y+=-font->metaData[c*5+4]-height+1;
+
+  /* after clipping, x2 will be count of bytes between rows,
+   * x1 start of i, y1 start of j, width and height will be adjusted. */
+  if(y1>y) { y1-=y; d+=(width+7)/8; height-=y1; y+=y1; } else y1=0;
+  if(x1>x) { x1-=x; d+=x1; width-=x1; x+=x1; extra_bytes+=x1/8; } else x1=0;
+  if(y2<y+height) height-=y+height-y2;
+  if(x2<x+width) { extra_bytes+=(x1+width)/8-(x+width-x2+7)/8; width-=x+width-x2; }
+
+  for(j=y1;j<height;j++) {
+    for(i=x1;i<width;i++) {
+      if((i&7)==0) {
+	d=*data;
+	data++;
+      }
+      /* if(x+i>=x1 && x+i<x2 && y+j>=y1 && y+j<y2) */ {
+	 if(d&0x80) {
+	   memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,
+		  colour,bpp);
+	 } else if(bcol!=col) {
+	   memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,
+		  bcolour,bpp);
+	 }
+      }
+      d<<=1;
+    }
+    //if((i&7)==0) data++;
+    data += extra_bytes;
+  }
+  return(width);
+}
+
+void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
+			   int x,int y,const unsigned char* string,
+			   int x1,int y1,int x2,int y2,
+			   Pixel colour,Pixel backColour)
+{
+  while(*string) {
+    x+=rfbDrawCharWithClip(rfbScreen,font,x,y,*string,x1,y1,x2,y2,
+			   colour,backColour);
+    string++;
+  }
+}
+
+int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string)
 {
   int i=0;
   while(*string) {
@@ -65,3 +131,55 @@ void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int
   *y2=*y1+font->metaData[c*5+2];
 }
 
+void rfbWholeFontBBox(rfbFontDataPtr font,
+		      int *x1, int *y1, int *x2, int *y2)
+{
+   int i;
+   int* m=font->metaData;
+   
+   (*x1)=(*y1)=INT_MAX; (*x2)=(*y2)=-INT_MAX+1;
+   for(i=0;i<256;i++) {
+      if(m[i*5+1]-m[i*5+3]>(*x2))
+	(*x2)=m[i*5+1]-m[i*5+3];
+      if(-m[i*5+2]+m[i*5+4]<(*y1))
+	(*y1)=-m[i*5+2]+m[i*5+4];
+      if(m[i*5+3]<(*x1))
+	(*x1)=m[i*5+3];
+      if(-m[i*5+4]>(*y2))
+	(*y2)=-m[i*5+4];
+   }
+}
+
+rfbFontDataPtr rfbLoadConsoleFont(char *filename)
+{
+  FILE *f=fopen(filename,"rb");
+  rfbFontDataPtr p;
+  int i;
+
+  if(!f) return(0);
+
+  p=(rfbFontDataPtr)malloc(sizeof(rfbFontData));
+  p->data=(char*)malloc(4096);
+  if(1!=fread(p->data,4096,1,f)) {
+    free(p->data);
+    free(p);
+    return(0);
+  }
+  fclose(f);
+  p->metaData=(int*)malloc(256*5*sizeof(int));
+  for(i=0;i<256;i++) {
+    p->metaData[i*5+0]=i*16; /* offset */
+    p->metaData[i*5+1]=8; /* width */
+    p->metaData[i*5+2]=16; /* height */
+    p->metaData[i*5+3]=0; /* xhot */
+    p->metaData[i*5+4]=0; /* yhot */
+  }
+  return(p);
+}
+
+void rfbFreeFont(rfbFontDataPtr f)
+{
+  free(f->data);
+  free(f->metaData);
+  free(f);
+}
diff --git a/fontsel.c b/fontsel.c
new file mode 100644
index 0000000..81d4699
--- /dev/null
+++ b/fontsel.c
@@ -0,0 +1,71 @@
+#include "rfb.h"
+
+#define FONTDIR "/usr/lib/kbd/consolefonts/"
+#define DEFAULTFONT FONTDIR "default8x16"
+
+char *fontlist[50]={
+"8x16alt", "b.fnt", "c.fnt", "default8x16", "m.fnt", "ml.fnt", "mod_d.fnt",
+"mod_s.fnt", "mr.fnt", "mu.fnt", "r.fnt", "rl.fnt", "ro.fnt", "s.fnt",
+"sc.fnt", "scrawl_s.fnt", "scrawl_w.fnt", "sd.fnt", "t.fnt",
+  0
+};
+
+rfbScreenInfoPtr rfbScreen = 0;
+rfbFontDataPtr curFont = 0;
+void showFont(int index)
+{
+  char buffer[1024];
+
+  if(!rfbScreen) return;
+
+  if(curFont)
+    rfbFreeFont(curFont);
+
+  strcpy(buffer,FONTDIR);
+  strcat(buffer,fontlist[index]);
+  curFont = rfbLoadConsoleFont(buffer);
+
+  rfbFillRect(rfbScreen,210,30-20,210+10*16,30-20+256*20/16,0xb77797);
+  if(curFont) {
+    int i,j;
+    for(j=0;j<256;j+=16)
+      for(i=0;i<16;i++)
+	rfbDrawCharWithClip(rfbScreen,curFont,210+10*i,30+j*20/16,j+i,
+			    0,0,640,480,0xffffff,0x000000);
+  }
+}
+
+int main(int argc,char** argv)
+{
+  rfbFontDataPtr font;
+  rfbScreenInfoPtr s=rfbGetScreen(argc,argv,640,480,8,3,3);
+  int i,j;
+
+  s->frameBuffer=(char*)malloc(640*480*3);
+  rfbInitServer(s);
+
+  for(j=0;j<480;j++)
+    for(i=0;i<640;i++) {
+      s->frameBuffer[(j*640+i)*3+0]=j*256/480;
+      s->frameBuffer[(j*640+i)*3+1]=i*256/640;
+      s->frameBuffer[(j*640+i)*3+2]=(i+j)*256/(480+640);
+    }
+
+  rfbScreen = s;
+  font=rfbLoadConsoleFont(DEFAULTFONT);
+  if(!font) {
+    fprintf(stderr,"Couldn't find %s\n",DEFAULTFONT);
+    exit(1);
+  }
+  
+  for(j=0;j<0;j++)
+    rfbProcessEvents(s,900000);
+
+  i = rfbSelectBox(s,font,fontlist,10,20,200,300,0xffdfdf,0x602040,2,showFont);
+  fprintf(stderr,"Selection: %d: %s\n",i,(i>=0)?fontlist[i]:"cancelled");
+
+  rfbFreeFont(font);
+
+  return(0);
+}
+
diff --git a/keysym.h b/keysym.h
index b08d81b..f500e03 100755
--- a/keysym.h
+++ b/keysym.h
@@ -1629,3 +1629,6 @@ SOFTWARE.
 #define XK_Korean_Won					0xeff
 
 #endif /* XK_KOREAN */
+
+/* Euro currency symbol */
+#define XK_EuroSign 0x20ac
diff --git a/main.c b/main.c
index 7191a9f..96f335e 100644
--- a/main.c
+++ b/main.c
@@ -176,14 +176,14 @@ void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y
    int i;
 
    if(x1>x2) { i=x1; x1=x2; x2=i; }
-   x2++;
-   if(x1<0) { x1=0; if(x2==x1) x2++; }
-   if(x2>=rfbScreen->width) { x2=rfbScreen->width-1; if(x1==x2) x1--; }
+   if(x1<0) x1=0;
+   if(x2>=rfbScreen->width) x2=rfbScreen->width-1;
+   if(x1==x2) return;
    
    if(y1>y2) { i=y1; y1=y2; y2=i; }
-   y2++;
-   if(y1<0) { y1=0; if(y2==y1) y2++; }
-   if(y2>=rfbScreen->height) { y2=rfbScreen->height-1; if(y1==y2) y1--; }
+   if(y1<0) y1=0;
+   if(y2>=rfbScreen->height) y2=rfbScreen->height-1;
+   if(y1==y2) return;
    
    region = sraRgnCreateRect(x1,y1,x2,y2);
    rfbMarkRegionAsModified(rfbScreen,region);
@@ -400,12 +400,32 @@ rfbCursorPtr defaultGetCursorPtr(rfbClientPtr cl)
    return(cl->screen->cursor);
 }
 
-Bool defaultGetPassword(rfbClientPtr cl,char* passwd,int len)
+/* response is cl->authChallenge vncEncrypted with passwd */
+Bool defaultPasswordCheck(rfbClientPtr cl,char* response,int len)
 {
-  char *pwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData);
-  if(!pwd)
+  int i;
+  char *passwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData);
+
+  if(!passwd) {
+    rfbLog("Couldn't read password file: %s\n",cl->screen->rfbAuthPasswdData);
+    return(FALSE);
+  }
+
+  vncEncryptBytes(cl->authChallenge, passwd);
+
+  /* Lose the password from memory */
+  for (i = strlen(passwd); i >= 0; i--) {
+    passwd[i] = '\0';
+  }
+
+  free(passwd);
+
+  if (memcmp(cl->authChallenge, response, len) != 0) {
+    rfbLog("rfbAuthProcessClientMessage: authentication failed from %s\n",
+	   cl->host);
     return(FALSE);
-  strncpy(passwd,pwd,MAXPWLEN);
+  }
+
   return(TRUE);
 }
 
@@ -520,7 +540,7 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
    rfbScreen->setXCutText = defaultSetXCutText;
    rfbScreen->getCursorPtr = defaultGetCursorPtr;
    rfbScreen->setTranslateFunction = rfbSetTranslateFunction;
-   rfbScreen->getPassword = defaultGetPassword;
+   rfbScreen->passwordCheck = defaultPasswordCheck;
    rfbScreen->newClientHook = doNothingWithClient;
    rfbScreen->displayHook = 0;
 
diff --git a/radon.h b/radon.h
index 19ac9ee..6aa5242 100644
--- a/radon.h
+++ b/radon.h
@@ -1,195 +1,195 @@
-unsigned char radonFontData[4560]={
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 33 */
-0x00,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */
-0x00,0x00,0x44,0x00,0x44,0x00,0xba,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0xba,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00, /* 35 */
-0x10,0x00,0x7e,0x00,0x80,0x00,0x90,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x12,0x00,0x02,0x00,0xfc,0x00,0x10,0x00,0x00,0x00, /* 36 */
-0x00,0x00,0x62,0x00,0x92,0x00,0x94,0x00,0x68,0x00,0x10,0x00,0x2c,0x00,0x52,0x00,0x92,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, /* 37 */
-0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0x40,0x00,0x20,0x00,0x90,0x00,0x8a,0x00,0x84,0x00,0x7a,0x00,0x00,0x00,0x00,0x00, /* 38 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */
-0x00,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 40 */
-0x00,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 41 */
-0x00,0x00,0x10,0x00,0x92,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x92,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 42 */
-0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 43 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x30,0x00,0x00,0x00, /* 44 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 46 */
-0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 47 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 48 */
-0x00,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 49 */
-0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 50 */
-0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 51 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7a,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 52 */
-0x00,0x00,0xfe,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 53 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 54 */
-0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 55 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 56 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7a,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 57 */
-0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 58 */
-0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00, /* 59 */
-0x00,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 60 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 61 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 62 */
-0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00, /* 63 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x8c,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 64 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 65 */
-0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 66 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 67 */
-0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 68 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 69 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 70 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x9a,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 71 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 72 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 73 */
-0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x84,0x00,0x78,0x00,0x00,0x00,0x00,0x00, /* 74 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 75 */
-0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 76 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 77 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 78 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 79 */
-0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 80 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x8a,0x00,0x8a,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 81 */
-0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 82 */
-0x00,0x00,0x7e,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 83 */
-0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 84 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 85 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x84,0x00,0x88,0x00,0x90,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, /* 86 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 87 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 88 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 89 */
-0x00,0x00,0xfc,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 90 */
-0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1c,0x00,0x00,0x00,0x00,0x00, /* 91 */
-0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 92 */
-0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00, /* 93 */
-0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, /* 95 */
-0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 97 */
-0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 98 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 99 */
-0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 100 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 101 */
-0x00,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 102 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 103 */
-0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 104 */
-0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 105 */
-0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x30,0x00, /* 106 */
-0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 107 */
-0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 108 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x00,0x00,0x00,0x00, /* 109 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 110 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 111 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x40,0x00, /* 112 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x02,0x00, /* 113 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 114 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x40,0x00,0x3c,0x00,0x02,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 115 */
-0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, /* 116 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 117 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x00,0x00,0x00,0x00, /* 118 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 119 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 120 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 121 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x02,0x00,0x0c,0x00,0x30,0x00,0x40,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, /* 122 */
-0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1c,0x00,0x00,0x00,0x00,0x00, /* 123 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 124 */
-0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00, /* 125 */
-0x00,0x00,0x04,0x00,0x38,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 161 */
-0x00,0x00,0x00,0x00,0x08,0x00,0x3e,0x00,0x40,0x00,0x48,0x00,0x48,0x00,0x40,0x00,0x3e,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 162 */
-0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xa8,0x00,0x20,0x00,0x20,0x00,0x42,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 163 */
-0x00,0x00,0x00,0x00,0x82,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 164 */
-0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x54,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 165 */
-0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 166 */
-0x00,0x00,0x38,0x00,0x40,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x04,0x00,0x38,0x00,0x00,0x00, /* 167 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x9a,0x00,0xa2,0x00,0xa2,0x00,0xa2,0x00,0x9a,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 169 */
-0x38,0x00,0x04,0x00,0x34,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 170 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 171 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 172 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */
-0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0xaa,0x00,0xb2,0x00,0xaa,0x00,0xaa,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 174 */
-0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */
-0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */
-0x00,0x00,0x10,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 177 */
-0x38,0x00,0x04,0x00,0x18,0x00,0x20,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */
-0x38,0x00,0x04,0x00,0x38,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */
-0x18,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x58,0x00,0x40,0x00,0x40,0x00, /* 181 */
-0x00,0x00,0x79,0x00,0xfa,0x00,0xfa,0x00,0xfa,0x00,0x7a,0x00,0x02,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x00,0x00, /* 182 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 183 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00, /* 184 */
-0x08,0x00,0x18,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */
-0x38,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 186 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 187 */
-0x20,0x00,0xa2,0x00,0x22,0x00,0x22,0x00,0x24,0x00,0x08,0x00,0x10,0x00,0x29,0x00,0x49,0x00,0x85,0x00,0x01,0x00,0x01,0x00, /* 188 */
-0x20,0x00,0xa2,0x00,0x22,0x00,0x22,0x00,0x24,0x00,0x08,0x00,0x10,0x00,0x2e,0x00,0x41,0x00,0x86,0x00,0x08,0x00,0x0f,0x00, /* 189 */
-0xe0,0x00,0x12,0x00,0xe2,0x00,0x12,0x00,0xe4,0x00,0x08,0x00,0x10,0x00,0x29,0x00,0x49,0x00,0x85,0x00,0x01,0x00,0x01,0x00, /* 190 */
-0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 191 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 192 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 193 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 194 */
-0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 195 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 196 */
-0x38,0x00,0x44,0x00,0x38,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 197 */
-0x00,0x00,0x77,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x8b,0x00,0xa8,0x00,0x88,0x00,0x88,0x00,0x8b,0x00,0x00,0x00,0x00,0x00, /* 198 */
-0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x6c,0x00,0x10,0x00,0x20,0x00, /* 199 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 200 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 201 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 202 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 203 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 204 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 205 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 206 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 207 */
-0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xb2,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 208 */
-0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 209 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 210 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 211 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 212 */
-0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 213 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 214 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x28,0x00,0x00,0x00,0x28,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 215 */
-0x00,0x00,0x7a,0x00,0x84,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0xa2,0x00,0x82,0x00,0x42,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 216 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 217 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 218 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 219 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 220 */
-0x08,0x00,0xb2,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 221 */
-0x00,0x00,0x80,0x00,0x80,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 222 */
-0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x9c,0x00,0x00,0x00,0x00,0x00, /* 223 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 224 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 225 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 226 */
-0x32,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 227 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 228 */
-0x18,0x00,0x24,0x00,0x18,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 229 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x12,0x00,0x52,0x00,0x94,0x00,0x90,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, /* 230 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x34,0x00,0x08,0x00,0x10,0x00, /* 231 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 232 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 233 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 234 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 235 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 236 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 237 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 238 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 239 */
-0x00,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 240 */
-0x00,0x00,0x32,0x00,0x4c,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 241 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 242 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 243 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 244 */
-0x32,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 245 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 246 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 247 */
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x44,0x00,0x4a,0x00,0x52,0x00,0x22,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, /* 248 */
-0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 249 */
-0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 250 */
-0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 251 */
-0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 252 */
-0x04,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 253 */
-0x00,0x00,0x80,0x00,0x80,0x00,0x9c,0x00,0xa2,0x00,0x82,0x00,0xa2,0x00,0x9c,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 254 */
+unsigned char radonFontData[2280]={
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */
+0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x00,0x00, /* 33 */
+0x00,0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */
+0x00,0x44,0x44,0xba,0x44,0x44,0x44,0xba,0x44,0x44,0x00,0x00, /* 35 */
+0x10,0x7e,0x80,0x90,0x80,0x7c,0x02,0x12,0x02,0xfc,0x10,0x00, /* 36 */
+0x00,0x62,0x92,0x94,0x68,0x10,0x2c,0x52,0x92,0x8c,0x00,0x00, /* 37 */
+0x00,0x60,0x90,0x90,0x40,0x20,0x90,0x8a,0x84,0x7a,0x00,0x00, /* 38 */
+0x00,0x10,0x10,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */
+0x00,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x00,0x00, /* 40 */
+0x00,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00, /* 41 */
+0x00,0x10,0x92,0x54,0x10,0x10,0x54,0x92,0x10,0x00,0x00,0x00, /* 42 */
+0x00,0x00,0x10,0x10,0x10,0xd6,0x10,0x10,0x10,0x00,0x00,0x00, /* 43 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x30,0x00, /* 44 */
+0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00, /* 46 */
+0x00,0x02,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00, /* 47 */
+0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x7c,0x00,0x00, /* 48 */
+0x00,0x08,0x28,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 49 */
+0x00,0xfc,0x02,0x02,0x02,0x7c,0x80,0x80,0x00,0xfe,0x00,0x00, /* 50 */
+0x00,0xfc,0x02,0x02,0x02,0x3c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 51 */
+0x00,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0x02,0x02,0x00,0x00, /* 52 */
+0x00,0xfe,0x00,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 53 */
+0x00,0x7c,0x80,0x80,0xbc,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 54 */
+0x00,0xfc,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, /* 55 */
+0x00,0x7c,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x7c,0x00,0x00, /* 56 */
+0x00,0x7c,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0xfc,0x00,0x00, /* 57 */
+0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, /* 58 */
+0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x60,0x00,0x00, /* 59 */
+0x00,0x08,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x08,0x00,0x00, /* 60 */
+0x00,0x00,0x00,0x00,0xfe,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 61 */
+0x00,0x10,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x10,0x00,0x00, /* 62 */
+0x00,0xfc,0x02,0x02,0x02,0x1c,0x20,0x20,0x00,0x20,0x00,0x00, /* 63 */
+0x00,0x7c,0x82,0x8a,0x92,0x92,0x92,0x8c,0x80,0x7c,0x00,0x00, /* 64 */
+0x00,0x7c,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x00,0x00, /* 65 */
+0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0xbc,0x00,0x00, /* 66 */
+0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7c,0x00,0x00, /* 67 */
+0x00,0xbc,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xbc,0x00,0x00, /* 68 */
+0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x7c,0x00,0x00, /* 69 */
+0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x80,0x00,0x00, /* 70 */
+0x00,0x7c,0x80,0x80,0x80,0x80,0x9a,0x82,0x82,0x7c,0x00,0x00, /* 71 */
+0x00,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x82,0x00,0x00, /* 72 */
+0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 73 */
+0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x84,0x78,0x00,0x00, /* 74 */
+0x00,0x82,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 75 */
+0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7e,0x00,0x00, /* 76 */
+0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x82,0x82,0x82,0x00,0x00, /* 77 */
+0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 78 */
+0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 79 */
+0x00,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x80,0x80,0x00,0x00, /* 80 */
+0x00,0x7c,0x82,0x82,0x82,0x82,0x8a,0x8a,0x82,0x7c,0x00,0x00, /* 81 */
+0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 82 */
+0x00,0x7e,0x80,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 83 */
+0x00,0xfe,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 84 */
+0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 85 */
+0x00,0x82,0x82,0x82,0x82,0x82,0x84,0x88,0x90,0xa0,0x00,0x00, /* 86 */
+0x00,0x82,0x82,0x82,0x82,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 87 */
+0x00,0x82,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x82,0x00,0x00, /* 88 */
+0x00,0x82,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 89 */
+0x00,0xfc,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x7e,0x00,0x00, /* 90 */
+0x00,0x1c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x00,0x00, /* 91 */
+0x00,0x80,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00, /* 92 */
+0x00,0x38,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x38,0x00,0x00, /* 93 */
+0x00,0x38,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, /* 95 */
+0x00,0x08,0x08,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */
+0x00,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 97 */
+0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 98 */
+0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x3c,0x00,0x00, /* 99 */
+0x00,0x00,0x02,0x02,0x3a,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 100 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 101 */
+0x00,0x00,0x0c,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x00,0x00, /* 102 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 103 */
+0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 104 */
+0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 105 */
+0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x30, /* 106 */
+0x00,0x00,0x40,0x40,0x42,0x42,0x5c,0x42,0x42,0x42,0x00,0x00, /* 107 */
+0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 108 */
+0x00,0x00,0x00,0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x00,0x00, /* 109 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 110 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 111 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x5c,0x40,0x40, /* 112 */
+0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x02, /* 113 */
+0x00,0x00,0x00,0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 114 */
+0x00,0x00,0x00,0x00,0x3e,0x40,0x3c,0x02,0x02,0x7c,0x00,0x00, /* 115 */
+0x00,0x00,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x0c,0x00,0x00, /* 116 */
+0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 117 */
+0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x44,0x48,0x50,0x00,0x00, /* 118 */
+0x00,0x00,0x00,0x00,0x92,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 119 */
+0x00,0x00,0x00,0x00,0x42,0x42,0x3c,0x42,0x42,0x42,0x00,0x00, /* 120 */
+0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 121 */
+0x00,0x00,0x00,0x00,0x7c,0x02,0x0c,0x30,0x40,0x3e,0x00,0x00, /* 122 */
+0x00,0x1c,0x20,0x20,0x20,0x40,0x20,0x20,0x20,0x1c,0x00,0x00, /* 123 */
+0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00,0x00, /* 124 */
+0x00,0x38,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x38,0x00,0x00, /* 125 */
+0x00,0x04,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */
+0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 161 */
+0x00,0x00,0x08,0x3e,0x40,0x48,0x48,0x40,0x3e,0x08,0x00,0x00, /* 162 */
+0x00,0x1c,0x20,0x20,0x20,0xa8,0x20,0x20,0x42,0xbc,0x00,0x00, /* 163 */
+0x00,0x00,0x82,0x38,0x44,0x44,0x44,0x38,0x82,0x00,0x00,0x00, /* 164 */
+0x00,0x82,0x82,0x82,0x7c,0x00,0x54,0x10,0x54,0x10,0x00,0x00, /* 165 */
+0x00,0x10,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x00, /* 166 */
+0x00,0x38,0x40,0x38,0x44,0x44,0x44,0x44,0x38,0x04,0x38,0x00, /* 167 */
+0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */
+0x00,0x7c,0x82,0x9a,0xa2,0xa2,0xa2,0x9a,0x82,0x7c,0x00,0x00, /* 169 */
+0x38,0x04,0x34,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 170 */
+0x00,0x00,0x00,0x24,0x48,0x00,0x48,0x24,0x00,0x00,0x00,0x00, /* 171 */
+0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x02,0x02,0x00,0x00,0x00, /* 172 */
+0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */
+0x00,0x7c,0x82,0x92,0xaa,0xb2,0xaa,0xaa,0x82,0x7c,0x00,0x00, /* 174 */
+0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */
+0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */
+0x00,0x10,0x10,0xd6,0x10,0x10,0x00,0xfe,0x00,0x00,0x00,0x00, /* 177 */
+0x38,0x04,0x18,0x20,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */
+0x38,0x04,0x38,0x04,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */
+0x18,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */
+0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x58,0x40,0x40, /* 181 */
+0x00,0x79,0xfa,0xfa,0xfa,0x7a,0x02,0x0a,0x0a,0x0a,0x0a,0x00, /* 182 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 183 */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x00, /* 184 */
+0x08,0x18,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */
+0x38,0x44,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 186 */
+0x00,0x00,0x00,0x48,0x24,0x00,0x24,0x48,0x00,0x00,0x00,0x00, /* 187 */
+0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 188 */
+0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x2e,0x41,0x86,0x08,0x0f, /* 189 */
+0xe0,0x12,0xe2,0x12,0xe4,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 190 */
+0x00,0x08,0x00,0x08,0x08,0x70,0x80,0x80,0x80,0x7e,0x00,0x00, /* 191 */
+0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 192 */
+0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 193 */
+0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 194 */
+0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 195 */
+0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 196 */
+0x38,0x44,0x38,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 197 */
+0x00,0x77,0x88,0x88,0x88,0x8b,0xa8,0x88,0x88,0x8b,0x00,0x00, /* 198 */
+0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x6c,0x10,0x20, /* 199 */
+0x20,0x18,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 200 */
+0x08,0x30,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 201 */
+0x38,0x44,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 202 */
+0x6c,0x00,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 203 */
+0x20,0x18,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 204 */
+0x08,0x30,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 205 */
+0x38,0x44,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 206 */
+0x6c,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 207 */
+0x00,0xbc,0x82,0x82,0x82,0xb2,0x82,0x82,0x82,0xbc,0x00,0x00, /* 208 */
+0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 209 */
+0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 210 */
+0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 211 */
+0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 212 */
+0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 213 */
+0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 214 */
+0x00,0x00,0x00,0x00,0x44,0x28,0x00,0x28,0x44,0x00,0x00,0x00, /* 215 */
+0x00,0x7a,0x84,0x82,0x8a,0x92,0xa2,0x82,0x42,0xbc,0x00,0x00, /* 216 */
+0x20,0x18,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 217 */
+0x08,0x30,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 218 */
+0x38,0x44,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 219 */
+0x6c,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 220 */
+0x08,0xb2,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 221 */
+0x00,0x80,0x80,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x00,0x00, /* 222 */
+0x00,0x3c,0x42,0x42,0x42,0x5c,0x42,0x42,0x42,0x9c,0x00,0x00, /* 223 */
+0x20,0x18,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 224 */
+0x08,0x30,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 225 */
+0x38,0x44,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 226 */
+0x32,0x4c,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 227 */
+0x6c,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 228 */
+0x18,0x24,0x18,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 229 */
+0x00,0x00,0x00,0x00,0x6c,0x12,0x52,0x94,0x90,0x6e,0x00,0x00, /* 230 */
+0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x34,0x08,0x10, /* 231 */
+0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 232 */
+0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 233 */
+0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 234 */
+0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 235 */
+0x20,0x18,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 236 */
+0x08,0x30,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 237 */
+0x38,0x44,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 238 */
+0x6c,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 239 */
+0x00,0x14,0x08,0x14,0x02,0x3a,0x42,0x42,0x42,0x3c,0x00,0x00, /* 240 */
+0x00,0x32,0x4c,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 241 */
+0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 242 */
+0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 243 */
+0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 244 */
+0x32,0x4c,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 245 */
+0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 246 */
+0x00,0x00,0x00,0x00,0x38,0x00,0xfe,0x00,0x38,0x00,0x00,0x00, /* 247 */
+0x00,0x00,0x00,0x00,0x3a,0x44,0x4a,0x52,0x22,0x5c,0x00,0x00, /* 248 */
+0x20,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 249 */
+0x08,0x30,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 250 */
+0x38,0x44,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 251 */
+0x6c,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 252 */
+0x04,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 253 */
+0x00,0x80,0x80,0x9c,0xa2,0x82,0xa2,0x9c,0x80,0x80,0x00,0x00, /* 254 */
 };
 int radonFontMetaData[256*5]={
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,0,-2,24,8,12,0,-2,48,8,12,0,-2,72,8,12,0,-2,96,8,12,0,-2,120,8,12,0,-2,144,8,12,0,-2,168,8,12,0,-2,192,8,12,0,-2,216,8,12,0,-2,240,8,12,0,-2,264,8,12,0,-2,288,8,12,0,-2,312,8,12,0,-2,336,8,12,0,-2,360,8,12,0,-2,384,8,12,0,-2,408,8,12,0,-2,432,8,12,0,-2,456,8,12,0,-2,480,8,12,0,-2,504,8,12,0,-2,528,8,12,0,-2,552,8,12,0,-2,576,8,12,0,-2,600,8,12,0,-2,624,8,12,0,-2,648,8,12,0,-2,672,8,12,0,-2,696,8,12,0,-2,720,8,12,0,-2,744,8,12,0,-2,768,8,12,0,-2,792,8,12,0,-2,816,8,12,0,-2,840,8,12,0,-2,864,8,12,0,-2,888,8,12,0,-2,912,8,12,0,-2,936,8,12,0,-2,960,8,12,0,-2,984,8,12,0,-2,1008,8,12,0,-2,1032,8,12,0,-2,1056,8,12,0,-2,1080,8,12,0,-2,1104,8,12,0,-2,1128,8,12,0,-2,1152,8,12,0,-2,1176,8,12,0,-2,1200,8,12,0,-2,1224,8,12,0,-2,1248,8,12,0,-2,1272,8,12,0,-2,1296,8,12,0,-2,1320,8,12,0,-2,1344,8,12,0,-2,1368,8,12,0,-2,1392,8,12,0,-2,1416,8,12,0,-2,1440,8,12,0,-2,1464,8,12,0,-2,1488,8,12,0,-2,1512,8,12,0,-2,1536,8,12,0,-2,1560,8,12,0,-2,1584,8,12,0,-2,1608,8,12,0,-2,1632,8,12,0,-2,1656,8,12,0,-2,1680,8,12,0,-2,1704,8,12,0,-2,1728,8,12,0,-2,1752,8,12,0,-2,1776,8,12,0,-2,1800,8,12,0,-2,1824,8,12,0,-2,1848,8,12,0,-2,1872,8,12,0,-2,1896,8,12,0,-2,1920,8,12,0,-2,1944,8,12,0,-2,1968,8,12,0,-2,1992,8,12,0,-2,2016,8,12,0,-2,2040,8,12,0,-2,2064,8,12,0,-2,2088,8,12,0,-2,2112,8,12,0,-2,2136,8,12,0,-2,2160,8,12,0,-2,2184,8,12,0,-2,2208,8,12,0,-2,2232,8,12,0,-2,2256,8,12,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2280,8,12,0,-2,2304,8,12,0,-2,2328,8,12,0,-2,2352,8,12,0,-2,2376,8,12,0,-2,2400,8,12,0,-2,2424,8,12,0,-2,2448,8,12,0,-2,2472,8,12,0,-2,2496,8,12,0,-2,2520,8,12,0,-2,2544,8,12,0,-2,2568,8,12,0,-2,2592,8,12,0,-2,2616,8,12,0,-2,2640,8,12,0,-2,2664,8,12,0,-2,2688,8,12,0,-2,2712,8,12,0,-2,2736,8,12,0,-2,2760,8,12,0,-2,2784,8,12,0,-2,2808,8,12,0,-2,2832,8,12,0,-2,2856,8,12,0,-2,2880,8,12,0,-2,2904,8,12,0,-2,2928,8,12,0,-2,2952,8,12,0,-2,2976,8,12,0,-2,3000,8,12,0,-2,3024,8,12,0,-2,3048,8,12,0,-2,3072,8,12,0,-2,3096,8,12,0,-2,3120,8,12,0,-2,3144,8,12,0,-2,3168,8,12,0,-2,3192,8,12,0,-2,3216,8,12,0,-2,3240,8,12,0,-2,3264,8,12,0,-2,3288,8,12,0,-2,3312,8,12,0,-2,3336,8,12,0,-2,3360,8,12,0,-2,3384,8,12,0,-2,3408,8,12,0,-2,3432,8,12,0,-2,3456,8,12,0,-2,3480,8,12,0,-2,3504,8,12,0,-2,3528,8,12,0,-2,3552,8,12,0,-2,3576,8,12,0,-2,3600,8,12,0,-2,3624,8,12,0,-2,3648,8,12,0,-2,3672,8,12,0,-2,3696,8,12,0,-2,3720,8,12,0,-2,3744,8,12,0,-2,3768,8,12,0,-2,3792,8,12,0,-2,3816,8,12,0,-2,3840,8,12,0,-2,3864,8,12,0,-2,3888,8,12,0,-2,3912,8,12,0,-2,3936,8,12,0,-2,3960,8,12,0,-2,3984,8,12,0,-2,4008,8,12,0,-2,4032,8,12,0,-2,4056,8,12,0,-2,4080,8,12,0,-2,4104,8,12,0,-2,4128,8,12,0,-2,4152,8,12,0,-2,4176,8,12,0,-2,4200,8,12,0,-2,4224,8,12,0,-2,4248,8,12,0,-2,4272,8,12,0,-2,4296,8,12,0,-2,4320,8,12,0,-2,4344,8,12,0,-2,4368,8,12,0,-2,4392,8,12,0,-2,4416,8,12,0,-2,4440,8,12,0,-2,4464,8,12,0,-2,4488,8,12,0,-2,4512,8,12,0,-2,4536,8,12,0,-2,0,0,0,0,0,};
-rfbFontData radonFont = { radonFontData, radonFontMetaData };
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,0,-2,12,8,12,0,-2,24,8,12,0,-2,36,8,12,0,-2,48,8,12,0,-2,60,8,12,0,-2,72,8,12,0,-2,84,8,12,0,-2,96,8,12,0,-2,108,8,12,0,-2,120,8,12,0,-2,132,8,12,0,-2,144,8,12,0,-2,156,8,12,0,-2,168,8,12,0,-2,180,8,12,0,-2,192,8,12,0,-2,204,8,12,0,-2,216,8,12,0,-2,228,8,12,0,-2,240,8,12,0,-2,252,8,12,0,-2,264,8,12,0,-2,276,8,12,0,-2,288,8,12,0,-2,300,8,12,0,-2,312,8,12,0,-2,324,8,12,0,-2,336,8,12,0,-2,348,8,12,0,-2,360,8,12,0,-2,372,8,12,0,-2,384,8,12,0,-2,396,8,12,0,-2,408,8,12,0,-2,420,8,12,0,-2,432,8,12,0,-2,444,8,12,0,-2,456,8,12,0,-2,468,8,12,0,-2,480,8,12,0,-2,492,8,12,0,-2,504,8,12,0,-2,516,8,12,0,-2,528,8,12,0,-2,540,8,12,0,-2,552,8,12,0,-2,564,8,12,0,-2,576,8,12,0,-2,588,8,12,0,-2,600,8,12,0,-2,612,8,12,0,-2,624,8,12,0,-2,636,8,12,0,-2,648,8,12,0,-2,660,8,12,0,-2,672,8,12,0,-2,684,8,12,0,-2,696,8,12,0,-2,708,8,12,0,-2,720,8,12,0,-2,732,8,12,0,-2,744,8,12,0,-2,756,8,12,0,-2,768,8,12,0,-2,780,8,12,0,-2,792,8,12,0,-2,804,8,12,0,-2,816,8,12,0,-2,828,8,12,0,-2,840,8,12,0,-2,852,8,12,0,-2,864,8,12,0,-2,876,8,12,0,-2,888,8,12,0,-2,900,8,12,0,-2,912,8,12,0,-2,924,8,12,0,-2,936,8,12,0,-2,948,8,12,0,-2,960,8,12,0,-2,972,8,12,0,-2,984,8,12,0,-2,996,8,12,0,-2,1008,8,12,0,-2,1020,8,12,0,-2,1032,8,12,0,-2,1044,8,12,0,-2,1056,8,12,0,-2,1068,8,12,0,-2,1080,8,12,0,-2,1092,8,12,0,-2,1104,8,12,0,-2,1116,8,12,0,-2,1128,8,12,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1140,8,12,0,-2,1152,8,12,0,-2,1164,8,12,0,-2,1176,8,12,0,-2,1188,8,12,0,-2,1200,8,12,0,-2,1212,8,12,0,-2,1224,8,12,0,-2,1236,8,12,0,-2,1248,8,12,0,-2,1260,8,12,0,-2,1272,8,12,0,-2,1284,8,12,0,-2,1296,8,12,0,-2,1308,8,12,0,-2,1320,8,12,0,-2,1332,8,12,0,-2,1344,8,12,0,-2,1356,8,12,0,-2,1368,8,12,0,-2,1380,8,12,0,-2,1392,8,12,0,-2,1404,8,12,0,-2,1416,8,12,0,-2,1428,8,12,0,-2,1440,8,12,0,-2,1452,8,12,0,-2,1464,8,12,0,-2,1476,8,12,0,-2,1488,8,12,0,-2,1500,8,12,0,-2,1512,8,12,0,-2,1524,8,12,0,-2,1536,8,12,0,-2,1548,8,12,0,-2,1560,8,12,0,-2,1572,8,12,0,-2,1584,8,12,0,-2,1596,8,12,0,-2,1608,8,12,0,-2,1620,8,12,0,-2,1632,8,12,0,-2,1644,8,12,0,-2,1656,8,12,0,-2,1668,8,12,0,-2,1680,8,12,0,-2,1692,8,12,0,-2,1704,8,12,0,-2,1716,8,12,0,-2,1728,8,12,0,-2,1740,8,12,0,-2,1752,8,12,0,-2,1764,8,12,0,-2,1776,8,12,0,-2,1788,8,12,0,-2,1800,8,12,0,-2,1812,8,12,0,-2,1824,8,12,0,-2,1836,8,12,0,-2,1848,8,12,0,-2,1860,8,12,0,-2,1872,8,12,0,-2,1884,8,12,0,-2,1896,8,12,0,-2,1908,8,12,0,-2,1920,8,12,0,-2,1932,8,12,0,-2,1944,8,12,0,-2,1956,8,12,0,-2,1968,8,12,0,-2,1980,8,12,0,-2,1992,8,12,0,-2,2004,8,12,0,-2,2016,8,12,0,-2,2028,8,12,0,-2,2040,8,12,0,-2,2052,8,12,0,-2,2064,8,12,0,-2,2076,8,12,0,-2,2088,8,12,0,-2,2100,8,12,0,-2,2112,8,12,0,-2,2124,8,12,0,-2,2136,8,12,0,-2,2148,8,12,0,-2,2160,8,12,0,-2,2172,8,12,0,-2,2184,8,12,0,-2,2196,8,12,0,-2,2208,8,12,0,-2,2220,8,12,0,-2,2232,8,12,0,-2,2244,8,12,0,-2,2256,8,12,0,-2,2268,8,12,0,-2,0,0,0,0,0,};
+rfbFontData radonFont={radonFontData, radonFontMetaData};
diff --git a/rfb.h b/rfb.h
index 57ab62f..ad78490 100644
--- a/rfb.h
+++ b/rfb.h
@@ -155,7 +155,7 @@ typedef void (*PtrAddEventProcPtr) (int buttonMask, int x, int y, struct rfbClie
 typedef void (*SetXCutTextProcPtr) (char* str,int len, struct rfbClientRec* cl);
 typedef struct rfbCursor* (*GetCursorProcPtr) (struct rfbClientRec* pScreen);
 typedef Bool (*SetTranslateFunctionProcPtr)(struct rfbClientRec* cl);
-typedef Bool (*GetPasswordProcPtr)(struct rfbClientRec* cl,char* passWord,int len);
+typedef Bool (*PasswordCheckProcPtr)(struct rfbClientRec* cl,char* encryptedPassWord,int len);
 typedef void (*NewClientHookPtr)(struct rfbClientRec* cl);
 typedef void (*DisplayHookPtr)(struct rfbClientRec* cl);
 
@@ -266,7 +266,7 @@ typedef struct
     SOCKET httpSock;
     FILE* httpFP;
 
-    GetPasswordProcPtr getPassword;
+    PasswordCheckProcPtr passwordCheck;
     char* rfbAuthPasswdData;
 
     int rfbDeferUpdateTime;
@@ -680,11 +680,38 @@ typedef struct rfbFontData {
   int* metaData;
 } rfbFontData,* rfbFontDataPtr;
 
-int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,CARD32 colour);
-void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char* string,CARD32 colour);
-int rfbWidth(rfbFontDataPtr font,unsigned char* string);
+int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,Pixel colour);
+void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,Pixel colour);
+/* if colour==backColour, background is transparent */
+int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour);
+void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour);
+int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string);
 int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c);
 void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2);
+/* this returns the smallest box enclosing any character of font. */
+void rfbWholeFontBBox(rfbFontDataPtr font,int *x1, int *y1, int *x2, int *y2);
+
+/* dynamically load a linux console font (4096 bytes, 256 glyphs a 8x16 */
+rfbFontDataPtr rfbLoadConsoleFont(char *filename);
+/* free a dynamically loaded font */
+void rfbFreeFont(rfbFontDataPtr font);
+
+/* draw.c */
+
+void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,Pixel col);
+
+/* selbox.c */
+
+/* this opens a modal select box. list is an array of strings, the end marked
+   with a NULL.
+   It returns the index in the list or -1 if cancelled or something else
+   wasn't kosher. */
+typedef void (*SelectionChangedHookPtr)(int index);
+extern int rfbSelectBox(rfbScreenInfoPtr rfbScreen,
+			rfbFontDataPtr font, char** list,
+			int x1, int y1, int x2, int y2,
+			Pixel foreColour, Pixel backColour,
+			int border,SelectionChangedHookPtr selChangedHook);
 
 /* main.c */
 
diff --git a/selbox.c b/selbox.c
new file mode 100644
index 0000000..63ff89e
--- /dev/null
+++ b/selbox.c
@@ -0,0 +1,301 @@
+#include <ctype.h>
+#include "rfb.h"
+#include "keysym.h"
+
+typedef struct {
+  rfbScreenInfoPtr screen;
+  rfbFontDataPtr font;
+  char** list;
+  int listSize;
+  int selected;
+  int displayStart;
+  int x1,y1,x2,y2,textH,pageH;
+  int xhot,yhot;
+  int buttonWidth,okBX,cancelBX,okX,cancelX,okY;
+  Bool okInverted,cancelInverted;
+  int lastButtons;
+  Pixel colour,backColour;
+  SelectionChangedHookPtr selChangedHook;
+  enum { SELECTING, OK, CANCEL } state;
+} rfbSelectData;
+
+static const char* okStr="OK";
+static const char* cancelStr="Cancel";
+
+static void selPaintButtons(rfbSelectData* m,Bool invertOk,Bool invertCancel)
+{
+  rfbScreenInfoPtr s = m->screen;
+  Pixel bcolour = m->backColour;
+  Pixel colour = m->colour;
+
+  rfbFillRect(s,m->x1,m->okY-m->textH,m->x2,m->okY,bcolour);
+
+  if(invertOk) {
+    rfbFillRect(s,m->okBX,m->okY-m->textH,m->okBX+m->buttonWidth,m->okY,colour);
+    rfbDrawStringWithClip(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr,
+			  m->x1,m->okY-m->textH,m->x2,m->okY,
+			  bcolour,colour);
+  } else
+    rfbDrawString(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr,colour);
+    
+  if(invertCancel) {
+    rfbFillRect(s,m->cancelBX,m->okY-m->textH,
+	     m->cancelBX+m->buttonWidth,m->okY,colour);
+    rfbDrawStringWithClip(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot,
+			  cancelStr,m->x1,m->okY-m->textH,m->x2,m->okY,
+			  bcolour,colour);
+  } else
+    rfbDrawString(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot,cancelStr,colour);
+
+  m->okInverted = invertOk;
+  m->cancelInverted = invertCancel;
+}
+
+/* line is relative to displayStart */
+static void selPaintLine(rfbSelectData* m,int line,Bool invert)
+{
+  int y1 = m->y1+line*m->textH, y2 = y1+m->textH;
+  if(y2>m->y2)
+    y2=m->y2;
+  rfbFillRect(m->screen,m->x1,y1,m->x2,y2,invert?m->colour:m->backColour);
+  if(m->displayStart+line<m->listSize)
+    rfbDrawStringWithClip(m->screen,m->font,m->x1+m->xhot,y2-1+m->yhot,
+			  m->list[m->displayStart+line],
+			  m->x1,y1,m->x2,y2,
+			  invert?m->backColour:m->colour,
+			  invert?m->backColour:m->colour);
+}
+
+static void selSelect(rfbSelectData* m,int index)
+{
+  int delta;
+
+  if(index==m->selected || index<0 || index>=m->listSize)
+    return;
+
+  if(m->selected>=0)
+    selPaintLine(m,m->selected-m->displayStart,FALSE);
+
+  if(index<m->displayStart || index>=m->displayStart+m->pageH) {
+    /* targetLine is the screen line in which the selected line will
+       be displayed.
+       targetLine = m->pageH/2 doesn't look so nice */
+    int targetLine = m->selected-m->displayStart;
+    int lineStart,lineEnd;
+
+    /* scroll */
+    if(index<targetLine)
+      targetLine = index;
+    else if(index+m->pageH-targetLine>=m->listSize)
+      targetLine = index+m->pageH-m->listSize;
+    delta = index-(m->displayStart+targetLine);
+
+    if(delta>-m->pageH && delta<m->pageH) {
+      if(delta>0) {
+	lineStart = m->pageH-delta;
+	lineEnd = m->pageH;
+	rfbDoCopyRect(m->screen,m->x1,m->y1,m->x2,m->y1+lineStart*m->textH,
+		      0,-delta*m->textH);
+      } else {
+	lineStart = 0;
+	lineEnd = -delta;
+	rfbDoCopyRect(m->screen,
+		      m->x1,m->y1+lineEnd*m->textH,m->x2,m->y2,
+		      0,-delta*m->textH);
+      }
+    } else {
+      lineStart = 0;
+      lineEnd = m->pageH;
+    }
+    m->displayStart += delta;
+    for(delta=lineStart;delta<lineEnd;delta++)
+      if(delta!=index)
+	selPaintLine(m,delta,FALSE);
+  }
+
+  m->selected = index;
+  selPaintLine(m,m->selected-m->displayStart,TRUE);
+
+  if(m->selChangedHook)
+    m->selChangedHook(index);
+
+  /* todo: scrollbars */
+}
+
+static void selKbdAddEvent(Bool down,KeySym keySym,rfbClientPtr cl)
+{
+  if(down) {
+    if(keySym>' ' && keySym<0xff) {
+      int i;
+      rfbSelectData* m = (rfbSelectData*)cl->screen->screenData;
+      char c = tolower(keySym);
+
+      for(i=m->selected+1;m->list[i] && tolower(m->list[i][0])!=c;i++);
+      if(!m->list[i])
+	for(i=0;i<m->selected && tolower(m->list[i][0])!=c;i++);
+      selSelect(m,i);
+    } else if(keySym==XK_Escape) {
+      rfbSelectData* m = (rfbSelectData*)cl->screen->screenData;
+      m->state = CANCEL;
+    } else if(keySym==XK_Return) {
+      rfbSelectData* m = (rfbSelectData*)cl->screen->screenData;
+      m->state = OK;
+    } else {
+      rfbSelectData* m = (rfbSelectData*)cl->screen->screenData;
+      int curSel=m->selected;
+      if(keySym==XK_Up) {
+	if(curSel>0)
+	  selSelect(m,curSel-1);
+      } else if(keySym==XK_Down) {
+	if(curSel+1<m->listSize)
+	  selSelect(m,curSel+1);
+      } else {
+	if(keySym==XK_Page_Down) {
+	  if(curSel+m->pageH<m->listSize)
+	    selSelect(m,curSel+m->pageH);
+	  else
+	    selSelect(m,m->listSize-1);
+	} else if(keySym==XK_Page_Up) {
+	  if(curSel-m->pageH>=0)
+	    selSelect(m,curSel-m->pageH);
+	  else
+	    selSelect(m,0);
+	}
+      }
+    }
+  }
+}
+
+static void selPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl)
+{
+  rfbSelectData* m = (rfbSelectData*)cl->screen->screenData;
+  if(y<m->okY && y>=m->okY-m->textH) {
+    if(x>=m->okBX && x<m->okBX+m->buttonWidth) {
+      if(!m->okInverted)
+	selPaintButtons(m,TRUE,FALSE);
+      if(buttonMask)
+	m->state = OK;
+    } else if(x>=m->cancelBX && x<m->cancelBX+m->buttonWidth) {
+      if(!m->cancelInverted)
+	selPaintButtons(m,FALSE,TRUE);
+      if(buttonMask)
+	m->state = CANCEL;
+    } else if(m->okInverted || m->cancelInverted)
+      selPaintButtons(m,FALSE,FALSE);
+  } else {
+    if(m->okInverted || m->cancelInverted)
+      selPaintButtons(m,FALSE,FALSE);
+    if(!m->lastButtons && buttonMask) {
+      if(x>=m->x1 && x<m->x2 && y>=m->y1 && y<m->y2)
+	selSelect(m,m->displayStart+(y-m->y1)/m->textH);
+    }
+  }
+  m->lastButtons = buttonMask;
+
+  /* todo: scrollbars */
+}
+
+static rfbCursorPtr selGetCursorPtr(rfbClientPtr cl)
+{
+  return(0);
+}
+
+int rfbSelectBox(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
+		 char** list,
+		 int x1,int y1,int x2,int y2,
+		 Pixel colour,Pixel backColour,
+		 int border,SelectionChangedHookPtr selChangedHook)
+{
+   int bpp = rfbScreen->bitsPerPixel/8;
+   char* frameBufferBackup;
+   void* screenDataBackup = rfbScreen->screenData;
+   KbdAddEventProcPtr kbdAddEventBackup = rfbScreen->kbdAddEvent;
+   PtrAddEventProcPtr ptrAddEventBackup = rfbScreen->ptrAddEvent;
+   GetCursorProcPtr getCursorPtrBackup = rfbScreen->getCursorPtr;
+   DisplayHookPtr displayHookBackup = rfbScreen->displayHook;
+   rfbSelectData selData;
+   int i,j,k;
+   int fx1,fy1,fx2,fy2; /* for font bbox */
+
+   if(list==0 || *list==0)
+     return(-1);
+   
+   rfbWholeFontBBox(font, &fx1, &fy1, &fx2, &fy2);
+   selData.textH = fy2-fy1;
+   /* I need at least one line for the choice and one for the buttons */
+   if(y2-y1<selData.textH*2+3*border)
+     return(-1);
+   selData.xhot = -fx1;
+   selData.yhot = -fy2;
+   selData.x1 = x1+border;
+   selData.y1 = y1+border;
+   selData.y2 = y2-selData.textH-3*border;
+   selData.x2 = x2-2*border;
+   selData.pageH = (selData.y2-selData.y1)/selData.textH;
+
+   i = rfbWidthOfString(font,okStr);
+   j = rfbWidthOfString(font,cancelStr);
+   selData.buttonWidth= k = 4*border+(i<j)?j:i;
+   selData.okBX = x1+(x2-x1-2*k)/3;
+   if(selData.okBX<x1+border) /* too narrow! */
+     return(-1);
+   selData.cancelBX = x1+k+(x2-x1-2*k)*2/3;
+   selData.okX = selData.okBX+(k-i)/2;
+   selData.cancelX = selData.cancelBX+(k-j)/2;
+   selData.okY = y2-border;
+
+   rfbUndrawCursor(rfbScreen);
+   frameBufferBackup = (char*)malloc(bpp*(x2-x1)*(y2-y1));
+
+   selData.state = SELECTING;
+   selData.screen = rfbScreen;
+   selData.font = font;
+   selData.list = list;
+   selData.colour = colour;
+   selData.backColour = backColour;
+   for(i=0;list[i];i++);
+   selData.selected = i;
+   selData.listSize = i;
+   selData.displayStart = i;
+   selData.lastButtons = 0;
+   selData.selChangedHook = selChangedHook;
+   
+   rfbScreen->screenData = &selData;
+   rfbScreen->kbdAddEvent = selKbdAddEvent;
+   rfbScreen->ptrAddEvent = selPtrAddEvent;
+   rfbScreen->getCursorPtr = selGetCursorPtr;
+   rfbScreen->displayHook = 0;
+   
+   /* backup screen */
+   for(j=0;j<y2-y1;j++)
+     memcpy(frameBufferBackup+j*(x2-x1)*bpp,
+	    rfbScreen->frameBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp,
+	    (x2-x1)*bpp);
+
+   /* paint list and buttons */
+   rfbFillRect(rfbScreen,x1,y1,x2,y2,colour);
+   selPaintButtons(&selData,FALSE,FALSE);
+   selSelect(&selData,0);
+
+   /* modal loop */
+   while(selData.state == SELECTING)
+     rfbProcessEvents(rfbScreen,20000);
+
+   /* copy back screen data */
+   for(j=0;j<y2-y1;j++)
+     memcpy(rfbScreen->frameBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp,
+	    frameBufferBackup+j*(x2-x1)*bpp,
+	    (x2-x1)*bpp);
+   free(frameBufferBackup);
+   rfbMarkRectAsModified(rfbScreen,x1,y1,x2,y2);
+   rfbScreen->screenData = screenDataBackup;
+   rfbScreen->kbdAddEvent = kbdAddEventBackup;
+   rfbScreen->ptrAddEvent = ptrAddEventBackup;
+   rfbScreen->getCursorPtr = getCursorPtrBackup;
+   rfbScreen->displayHook = displayHookBackup;
+
+   if(selData.state==CANCEL)
+     selData.selected=-1;
+   return(selData.selected);
+}
+
-- 
cgit v1.2.3

