Added initial psplash sources
authorMatthew Allum <mallum@openedhand.com>
Wed, 6 Sep 2006 20:23:39 +0000 (20:23 +0000)
committerMatthew Allum <mallum@openedhand.com>
Wed, 6 Sep 2006 20:23:39 +0000 (20:23 +0000)
16 files changed:
AUTHORS [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
configure.ac [new file with mode: 0644]
make-image-header.sh [new file with mode: 0755]
psplash-console.c [new file with mode: 0644]
psplash-console.h [new file with mode: 0644]
psplash-fb.c [new file with mode: 0644]
psplash-fb.h [new file with mode: 0644]
psplash-image.h [new file with mode: 0644]
psplash-write.c [new file with mode: 0644]
psplash.c [new file with mode: 0644]
psplash.h [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..c2c7f5f
--- /dev/null
@@ -0,0 +1,16 @@
+bin_PROGRAMS=psplash psplash-write
+
+AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE
+
+psplash_SOURCES = psplash.c psplash.h psplash-fb.c psplash-fb.h \
+                  psplash-console.c psplash-console.h psplash-image.h
+
+psplash_write_SOURCES = psplash-write.c psplash.h
+
+EXTRA_DIST = make-image-header.sh
+MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing
+
+snapshot:
+       $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"`
+
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..b1376df
--- /dev/null
@@ -0,0 +1,3 @@
+#! /bin/sh
+autoreconf -v --install || exit 1
+./configure --enable-maintainer-mode "$@"
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..36a88e5
--- /dev/null
@@ -0,0 +1,20 @@
+AC_PREREQ(2.53)
+AC_INIT(psplash, 0.0, [http://bugzilla.o-hand.com/enter_bug.cgi?product=psplash])
+AM_INIT_AUTOMAKE()
+AC_CONFIG_SRCDIR(psplash.c)
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+
+AC_ISC_POSIX
+AC_PROG_CC
+AC_STDC_HEADERS
+
+if test "x$GCC" = "xyes"; then
+        GCC_FLAGS="-g -Wall"
+fi
+
+AC_SUBST(GCC_FLAGS)
+
+AC_OUTPUT([
+Makefile
+])
diff --git a/make-image-header.sh b/make-image-header.sh
new file mode 100755 (executable)
index 0000000..1a4691d
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+imageh=psplash-image.h
+gdk-pixbuf-csource --macros $1 > $imageh.tmp
+sed -e 's/MY_PIXBUF/IMG/g' -e "s/guint8/uint8/g" $imageh.tmp > $imageh && rm $imageh.tmp
+
+
diff --git a/psplash-console.c b/psplash-console.c
new file mode 100644 (file)
index 0000000..9b7dfb9
--- /dev/null
@@ -0,0 +1,195 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#include "psplash.h"
+
+/* Globals, needed for signal handling */
+static int ConsoleFd      = -1;
+static int VTNum          = -1;
+static int VTNumInitial   = -1;
+static int Visible        =  1;
+
+static void
+vt_request (int sig)
+{
+  DBG("mark, visible:%i", Visible);
+
+  if (Visible)
+    {
+      /* Allow Switch Away */
+      if (ioctl (ConsoleFd, VT_RELDISP, 1) < 0)
+       perror("Error cannot switch away from console");
+      Visible = 0;
+
+      /* FIXME: 
+       * We likely now want to signal the main loop as to exit  
+       * and we've now likely switched to the X tty. Note, this
+       * seems to happen anyway atm due to select() call getting
+       * a signal interuption error - not sure if this is really
+       * reliable however. 
+      */
+    }
+  else
+    {
+      if (ioctl (ConsoleFd, VT_RELDISP, VT_ACKACQ))
+       perror ("Error can't acknowledge VT switch");
+      Visible = 1;
+      /* FIXME: need to schedule repaint some how ? */
+    }
+}
+
+static void
+psplash_console_ignore_switches (void)
+{
+  struct sigaction    act;
+  struct vt_mode      vt_mode;
+  
+  if (ioctl(ConsoleFd, VT_GETMODE, &vt_mode) < 0)
+    {
+      perror("Error VT_SETMODE failed");
+      return;
+    }
+
+  act.sa_handler = SIG_IGN;
+  sigemptyset (&act.sa_mask);
+  act.sa_flags = 0;
+  sigaction (SIGUSR1, &act, 0);
+  
+  vt_mode.mode = VT_AUTO;
+  vt_mode.relsig = 0;
+  vt_mode.acqsig = 0;
+
+  if (ioctl(ConsoleFd, VT_SETMODE, &vt_mode) < 0)
+    perror("Error VT_SETMODE failed");
+}
+
+static void
+psplash_console_handle_switches (void)
+{
+  struct sigaction    act;
+  struct vt_mode      vt_mode;
+  if (ioctl(ConsoleFd, VT_GETMODE, &vt_mode) < 0)
+    {
+      perror("Error VT_SETMODE failed");
+      return;
+    }
+
+  act.sa_handler = vt_request;
+  sigemptyset (&act.sa_mask);
+  act.sa_flags = 0;
+  sigaction (SIGUSR1, &act, 0);
+  
+  vt_mode.mode   = VT_PROCESS;
+  vt_mode.relsig = SIGUSR1;
+  vt_mode.acqsig = SIGUSR1;
+
+  if (ioctl(ConsoleFd, VT_SETMODE, &vt_mode) < 0)
+    perror("Error VT_SETMODE failed");
+}
+
+void 
+psplash_console_switch (void) 
+{
+  char           vtname[10];
+  int            fd;
+  struct vt_stat vt_state;
+
+  if ((fd = open("/dev/tty0",O_WRONLY,0)) < 0)
+    {
+      perror("Error Cannot open /dev/tty0");
+      return;
+    }
+
+  /* Find next free terminal */
+  if ((ioctl(fd, VT_OPENQRY, &VTNum) < 0))
+    {
+      perror("Error unable to find a free virtual terminal");
+      close(fd);
+      return;
+    }
+  
+  close(fd);
+  
+  sprintf(vtname,"/dev/tty%d", VTNum);
+
+  if ((ConsoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) < 0)
+    {
+      fprintf(stderr, "Error cannot open %s: %s\n", vtname, strerror(errno));
+      return;
+    }
+
+  if (ioctl(ConsoleFd, VT_GETSTATE, &vt_state) == 0)
+    VTNumInitial = vt_state.v_active;
+
+  /* Switch to new free terminal */
+
+  psplash_console_ignore_switches ();
+
+  if (ioctl(ConsoleFd, VT_ACTIVATE, VTNum) != 0)
+    perror("Error VT_ACTIVATE failed");
+  
+  if (ioctl(ConsoleFd, VT_WAITACTIVE, VTNum) != 0)
+    perror("Error VT_WAITACTIVE failed\n");
+
+  psplash_console_handle_switches ();
+  
+  if (ioctl(ConsoleFd, KDSETMODE, KD_GRAPHICS) < 0)
+    perror("Error KDSETMODE KD_GRAPHICS failed\n");
+
+  return;
+}
+
+void
+psplash_console_reset (void)
+{
+  int              fd;
+  struct vt_stat   vt_state;
+
+  if (ConsoleFd < 0)
+    return;
+
+  /* Back to text mode */
+  ioctl(ConsoleFd, KDSETMODE, KD_TEXT); 
+
+  psplash_console_ignore_switches ();
+
+  /* Attempt to switch back to initial console if were still active */
+  ioctl (ConsoleFd, VT_GETSTATE, &vt_state);
+
+  if (VTNum == vt_state.v_active)
+    {
+      if (VTNumInitial > -1)
+        {
+         ioctl (ConsoleFd, VT_ACTIVATE, VTNumInitial);
+         ioctl (ConsoleFd, VT_WAITACTIVE, VTNumInitial);
+         VTNumInitial = -1;
+        }
+    }
+
+  /* Cleanup */
+
+  close(ConsoleFd); 
+
+  if ((fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0)) >= 0)
+    {
+      ioctl (fd, VT_DISALLOCATE, VTNum);
+      close (fd);
+    }
+
+  return;
+}
diff --git a/psplash-console.h b/psplash-console.h
new file mode 100644 (file)
index 0000000..c444d27
--- /dev/null
@@ -0,0 +1,27 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#ifndef _HAVE_PSPLASH_CONSOLE_H
+#define _HAVE_PSPLASH_CONSOLE_H
+
+void 
+psplash_console_switch (void); 
+
+void
+psplash_console_reset (void);
+
+#endif
diff --git a/psplash-fb.c b/psplash-fb.c
new file mode 100644 (file)
index 0000000..5bb110c
--- /dev/null
@@ -0,0 +1,244 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+#include "psplash.h"
+
+void
+psplash_fb_destroy (PSplashFB *fb)
+{
+  if (fb->fd >= 0)
+    close (fb->fd);
+
+  free(fb);
+}
+
+PSplashFB*
+psplash_fb_new (void)
+{
+  struct fb_var_screeninfo fb_var;
+  struct fb_fix_screeninfo fb_fix;
+  int                      off;
+  char                    *fbdev;
+
+  PSplashFB *fb = NULL;
+
+  fbdev = getenv("FBDEV");
+  if (fbdev == NULL)
+    fbdev = "/dev/fb0";
+
+  if ((fb = malloc (sizeof(PSplashFB))) == NULL)
+    {
+      perror ("Error no memory");
+      goto fail;
+    }
+  
+  memset (fb, 0, sizeof(PSplashFB));
+
+  fb->fd = -1;  
+
+  if ((fb->fd = open (fbdev, O_RDWR)) < 0)
+    {
+      perror ("Error opening /dev/fb0");
+      goto fail;
+    }
+
+  if (ioctl (fb->fd, FBIOGET_FSCREENINFO, &fb_fix) == -1
+      || ioctl (fb->fd, FBIOGET_VSCREENINFO, &fb_var) == -1)
+    {
+      perror ("Error getting framebuffer info");
+      goto fail;
+    }
+  
+  if (fb_var.bits_per_pixel < 16)
+    {
+      fprintf(stderr,
+             "Error, no support currently for %i bpp frame buffers\n",
+             fb_var.bits_per_pixel);
+    }
+
+  fb->width  = fb_var.xres;
+  fb->height = fb_var.yres;
+  fb->bpp    = fb_var.bits_per_pixel;
+  fb->stride = fb_fix.line_length;
+  fb->type   = fb_fix.type;
+  fb->visual = fb_fix.visual;
+
+  DBG("width: %i, height: %i, bpp: %i, stride: %i", 
+      fb->width, fb->height, fb->bpp, fb->stride);
+
+
+  fb->base = (char *) mmap ((caddr_t) NULL,
+                           /*fb_fix.smem_len */
+                           fb->stride * fb->height,
+                           PROT_READ|PROT_WRITE,
+                           MAP_SHARED,
+                           fb->fd, 0);
+    
+  if (fb->base == (char *)-1) 
+    {
+      perror("Error cannot mmap framebuffer ");
+      goto fail;
+    }
+
+  off = (unsigned long) fb_fix.smem_start % (unsigned long) getpagesize();
+
+  fb->data = fb->base + off;
+
+#if 0
+  /* FIXME: No support for 8pp as yet  */
+  if (visual == FB_VISUAL_PSEUDOCOLOR
+      || visual == FB_VISUAL_STATIC_PSEUDOCOLOR)
+  {
+    static struct fb_cmap cmap;
+
+    cmap.start = 0;
+    cmap.len = 16;
+    cmap.red = saved_red;
+    cmap.green = saved_green;
+    cmap.blue = saved_blue;
+    cmap.transp = NULL;
+
+    ioctl (fb, FBIOGETCMAP, &cmap);
+  }
+  
+  if (!status)
+    atexit (bogl_done);
+  status = 2;
+#endif
+
+  return fb;
+
+ fail:
+
+  if (fb)
+    psplash_fb_destroy (fb);
+
+  return NULL;
+}
+
+void
+psplash_fb_plot_pixel (PSplashFB    *fb, 
+                      int          x, 
+                      int          y, 
+                      uint8        red,
+                      uint8        green,
+                      uint8        blue)
+{
+  int off;
+
+  if (x < 0 || x > fb->width-1 || y < 0 || y > fb->height-1)
+    return;
+
+  off = (y * fb->stride) + (x * (fb->bpp >> 3));
+
+  /* FIXME: handle no RGB orderings */
+  switch (fb->bpp)
+    {
+    case 24:
+    case 32:
+      *(fb->data + off)     = red;
+      *(fb->data + off + 1) = green;
+      *(fb->data + off + 2) = blue;
+      break;
+    case 16:
+      *(volatile uint16 *) (fb->data + off) 
+       = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
+      break;
+    default:
+      /* depth not supported yet */
+      break;
+    }
+
+}
+
+void
+psplash_fb_draw_rect (PSplashFB    *fb, 
+                     int          x, 
+                     int          y, 
+                     int          width, 
+                     int          height,
+                     uint8        red,
+                     uint8        green,
+                     uint8        blue)
+{
+  int dx, dy;
+
+  for (dy=0; dy < height; dy++)   
+    for (dx=0; dx < width; dx++)
+      {
+       /* FIXME: inline this call */
+       psplash_fb_plot_pixel (fb, x+dx, y+dy, red, green, blue); 
+      }
+}
+
+void
+psplash_fb_draw_image (PSplashFB    *fb, 
+                      int          x, 
+                      int          y, 
+                      int          img_width, 
+                      int          img_height,
+                      int          img_bytes_per_pixel,
+                      uint8       *rle_data)
+{
+  uint8 *p = rle_data;
+  int    dx = 0, dy = 0,  total_len;
+  unsigned int len;
+
+#if 0
+  for (dy=0; dy < img_height; dy++)   
+    for (dx=0; dx < img_width; dx++)
+      {
+       psplash_fb_plot_pixel (fb, x+dx, y+dy, *p, *(p+1), *(p+2)); 
+       p += img_bytes_per_pixel;
+      }
+#endif
+
+  total_len = img_width * img_height * img_bytes_per_pixel;
+
+  /* FIXME: Optimise, check for over runs ... */
+  while ((p - rle_data) < total_len)
+    {
+      len = *(p++);
+
+      if (len & 128)
+       {
+         len -= 128;
+
+         if (len == 0) break;
+
+         do
+           {
+             psplash_fb_plot_pixel (fb, x+dx, y+dy, *p, *(p+1), *(p+2)); 
+             if (++dx >= img_width) { dx=0; dy++; }
+           }
+         while (--len && (p - rle_data) < total_len);
+
+         p += img_bytes_per_pixel;
+       }
+      else
+       {
+         if (len == 0) break;
+
+         do
+           {
+             psplash_fb_plot_pixel (fb, x+dx, y+dy, *p, *(p+1), *(p+2)); 
+             if (++dx >= img_width) { dx=0; dy++; }
+             p += img_bytes_per_pixel;
+           }
+         while (--len && (p - rle_data) < total_len);
+       }
+    }
+}
diff --git a/psplash-fb.h b/psplash-fb.h
new file mode 100644 (file)
index 0000000..c2f9806
--- /dev/null
@@ -0,0 +1,69 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#ifndef _HAVE_PSPLASH_FB_H
+#define _HAVE_PSPLASH_FB_H
+
+typedef struct PSplashFB
+{
+  int            fd;                   
+  struct termios save_termios;         
+  int            type;                 
+  int            visual;               
+  int            width, height;
+  int            bpp;
+  int            stride;
+  char         *data;
+  char         *base;
+
+}
+PSplashFB;
+
+void
+psplash_fb_destroy (PSplashFB *fb);
+
+PSplashFB*
+psplash_fb_new (void);
+
+void
+psplash_fb_plot_pixel (PSplashFB    *fb, 
+                      int          x, 
+                      int          y, 
+                      uint8        red,
+                      uint8        green,
+                      uint8        blue);
+
+void
+psplash_fb_draw_rect (PSplashFB    *fb, 
+                     int          x, 
+                     int          y, 
+                     int          width, 
+                     int          height,
+                     uint8        red,
+                     uint8        green,
+                     uint8        blue);
+
+void
+psplash_fb_draw_image (PSplashFB    *fb, 
+                      int          x, 
+                      int          y, 
+                      int          img_width, 
+                      int          img_height,
+                      int          img_bytes_pre_pixel,
+                      uint8       *rle_data);
+
+#endif
diff --git a/psplash-image.h b/psplash-image.h
new file mode 100644 (file)
index 0000000..8544e15
--- /dev/null
@@ -0,0 +1,661 @@
+/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */
+
+#define IMG_ROWSTRIDE (668)
+#define IMG_WIDTH (167)
+#define IMG_HEIGHT (182)
+#define IMG_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */
+#define IMG_RLE_PIXEL_DATA ((uint8*) \
+  "\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377" \
+  "\377\310\377\377\377\0\377\377\377\377\377\246\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\377\377\377\377\377\246\377\377\377\377\2" \
+  "\377\377\377\310\377\377\377\0\377\377\377\377\377\246\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\377\377\377\377\377\246\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\377\377\377\377\377\246\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\226\377\377\377\377\2\335\356" \
+  "\333\377\304\341\301\377\202\260\327\254\377\2\304\341\301\377\334\355" \
+  "\332\377\234\377\377\377\377\7\353\365\352\377\313\345\310\377\267\333" \
+  "\263\377\253\325\247\377\276\336\272\377\321\350\317\377\370\373\370" \
+  "\377\233\377\377\377\377\7\363\371\363\377\317\347\314\377\273\335\270" \
+  "\377\253\325\247\377\271\333\265\377\315\345\312\377\360\367\357\377" \
+  "\233\377\377\377\377\7\375\376\375\377\330\353\326\377\302\340\276\377" \
+  "\256\326\251\377\262\330\256\377\306\342\303\377\341\360\340\377\242" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\223\377\377\377\377" \
+  "\3\352\364\351\377\214\305\206\377L\245C\377\2065\231*\377\3K\244B\377" \
+  "\214\305\206\377\352\364\351\377\226\377\377\377\377\3\374\375\374\377" \
+  "\251\323\244\377a\257X\377\2065\231*\377\3=\2353\377v\272o\377\312\344" \
+  "\307\377\227\377\377\377\377\3\300\337\275\377o\266g\377:\233/\377\205" \
+  "5\231*\377\4""7\232,\377h\263`\377\262\330\256\377\376\376\376\377\226" \
+  "\377\377\377\377\3\340\357\336\377\205\301~\377F\241<\377\2065\231*\377" \
+  "\3R\247H\377\224\311\216\377\360\367\357\377\237\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\222\377\377\377\377\2\267\333\263\377B\237" \
+  "8\377\2125\231*\377\2B\2378\377\267\333\263\377\224\377\377\377\377\2" \
+  "\336\356\334\377^\256V\377\2135\231*\377\2\210\303\201\377\366\372\365" \
+  "\377\223\377\377\377\377\2\360\367\357\377{\274t\377\2135\231*\377\2" \
+  "h\263`\377\345\362\344\377\223\377\377\377\377\3\376\376\376\377\246" \
+  "\322\241\377<\2341\377\2125\231*\377\2H\243>\377\304\341\301\377\236" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\220\377\377\377\377" \
+  "\2\356\366\355\377v\272o\377\2165\231*\377\2v\272o\377\356\366\355\377" \
+  "\220\377\377\377\377\3\375\376\375\377\243\320\236\377;\2340\377\215" \
+  "5\231*\377\2P\247G\377\317\347\314\377\221\377\377\377\377\2\303\341" \
+  "\300\377H\243>\377\2155\231*\377\3>\2354\377\254\325\250\377\376\376" \
+  "\376\377\220\377\377\377\377\2\344\361\343\377f\262^\377\2165\231*\377" \
+  "\2\203\300|\377\364\371\364\377\234\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\217\377\377\377\377\2\350\363\346\377G\242=\377\2205\231" \
+  "*\377\2G\242=\377\350\363\346\377\216\377\377\377\377\2\376\376\376\377" \
+  "p\267h\377\2205\231*\377\2""6\231+\377\263\331\257\377\217\377\377\377" \
+  "\377\1\241\317\234\377\2215\231*\377\1|\275u\377\217\377\377\377\377" \
+  "\2\330\353\326\377>\2354\377\2205\231*\377\2P\247G\377\362\370\361\377" \
+  "\233\377\377\377\377\2\377\377\377\310\377\377\377\0\217\377\377\377" \
+  "\377\1l\265d\377\2225\231*\377\1l\265d\377\216\377\377\377\377\1\255" \
+  "\325\250\377\2225\231*\377\2@\2365\377\347\363\345\377\215\377\377\377" \
+  "\377\2\330\353\326\3778\233.\377\2225\231*\377\1\267\333\263\377\215" \
+  "\377\377\377\377\2\372\374\371\377Y\253P\377\2225\231*\377\1\200\277" \
+  "y\377\233\377\377\377\377\2\377\377\377\310\377\377\377\0\216\377\377" \
+  "\377\377\1\255\325\250\377\2245\231*\377\1\255\325\250\377\214\377\377" \
+  "\377\377\2\346\362\345\377\77\2364\377\2235\231*\377\1l\265d\377\214" \
+  "\377\377\377\377\2\373\375\372\377Y\253P\377\2235\231*\377\2C\2409\377" \
+  "\353\365\352\377\214\377\377\377\377\1\230\313\222\377\2245\231*\377" \
+  "\1\304\341\301\377\232\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\215\377\377\377\377\2\345\362\344\377>\2354\377\2245\231*\377\2>\235" \
+  "4\377\345\362\344\377\212\377\377\377\377\2\376\376\376\377j\263a\377" \
+  "\2255\231*\377\1\256\326\252\377\213\377\377\377\377\1\227\312\221\377" \
+  "\2255\231*\377\1q\267i\377\213\377\377\377\377\2\327\353\325\3778\232" \
+  "-\377\2245\231*\377\2I\243\77\377\362\370\361\377\231\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\215\377\377\377\377\1y\273q\377\226" \
+  "5\231*\377\1y\273q\377\212\377\377\377\377\1\276\336\273\377\2265\231" \
+  "*\377\2@\2365\377\367\373\367\377\211\377\377\377\377\2\347\363\345\377" \
+  "8\232-\377\2265\231*\377\1\304\341\301\377\212\377\377\377\377\1e\261" \
+  "\\\377\2265\231*\377\1\221\307\213\377\231\377\377\377\377\2\377\377" \
+  "\377\310\377\377\377\0\214\377\377\377\377\2\371\374\371\377=\2353\377" \
+  "\2265\231*\377\2=\2353\377\371\374\371\377\211\377\377\377\377\1}\275" \
+  "v\377\2275\231*\377\1\300\337\275\377\211\377\377\377\377\1\252\324\245" \
+  "\377\2275\231*\377\1\201\277z\377\211\377\377\377\377\1\353\365\352\377" \
+  "\2275\231*\377\1N\245D\377\231\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\307\343\304\377\2305\231*\377\1\307" \
+  "\343\304\377\210\377\377\377\377\2\376\376\376\377C\2409\377\2275\231" \
+  "*\377\1\201\277{\377\211\377\377\377\377\1n\266f\377\2275\231*\377\2" \
+  "D\2409\377\376\376\376\377\210\377\377\377\377\1\256\326\251\377\230" \
+  "5\231*\377\1\332\354\330\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\251\323\244\377\2305\231*\377\1\251" \
+  "\323\244\377\210\377\377\377\377\1\354\365\353\377\2305\231*\377\1c\260" \
+  "[\377\211\377\377\377\377\1P\247G\377\2305\231*\377\1\354\365\353\377" \
+  "\210\377\377\377\377\1\220\307\212\377\2305\231*\377\1\274\335\270\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377" \
+  "\377\1\225\311\217\377\2305\231*\377\1\225\311\217\377\210\377\377\377" \
+  "\377\1\326\352\324\377\2305\231*\377\1O\246F\377\211\377\377\377\377" \
+  "\1<\2352\377\2305\231*\377\1\326\352\324\377\210\377\377\377\377\1|\275" \
+  "u\377\2305\231*\377\1\250\323\243\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\214\377\377\377\377\1\207\302\200\377\2305\231*\377" \
+  "\1\207\302\200\377\210\377\377\377\377\1\306\342\303\377\2305\231*\377" \
+  "\1A\2377\377\210\377\377\377\377\1\371\374\371\377\2315\231*\377\1\306" \
+  "\342\303\377\210\377\377\377\377\1n\265f\377\2305\231*\377\1\232\314" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377" \
+  "\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377" \
+  "\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377" \
+  "\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302" \
+  "\377\2305\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377" \
+  "\2315\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\230" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206" \
+  "\302\200\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\237" \
+  "6\377\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302" \
+  "\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377" \
+  "\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377" \
+  "\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377\377\377" \
+  "\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377" \
+  "\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\230" \
+  "5\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\230" \
+  "5\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377\2315\231" \
+  "*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200" \
+  "\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377" \
+  "\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377" \
+  "\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377" \
+  "\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377\377\377\1\370" \
+  "\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265" \
+  "e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377" \
+  "\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377" \
+  "\1@\2376\377\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305" \
+  "\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377" \
+  "\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377" \
+  "\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377" \
+  "\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302" \
+  "\377\2305\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377" \
+  "\2315\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\230" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206" \
+  "\302\200\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\237" \
+  "6\377\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302" \
+  "\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377" \
+  "\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377" \
+  "\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377\377\377" \
+  "\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377" \
+  "\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\230" \
+  "5\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\230" \
+  "5\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377\2315\231" \
+  "*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200" \
+  "\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377" \
+  "\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377" \
+  "\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377" \
+  "\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377\377\377\1\370" \
+  "\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265" \
+  "e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377" \
+  "\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377" \
+  "\1@\2376\377\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305" \
+  "\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377" \
+  "\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377" \
+  "\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377" \
+  "\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302" \
+  "\377\2305\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377" \
+  "\2315\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\230" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206" \
+  "\302\200\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\237" \
+  "6\377\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302" \
+  "\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377" \
+  "\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377" \
+  "\377\1\305\342\302\377\2305\231*\377\1@\2376\377\210\377\377\377\377" \
+  "\1\370\373\370\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377" \
+  "\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\230" \
+  "5\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\230" \
+  "5\231*\377\1@\2376\377\210\377\377\377\377\1\370\373\370\377\2315\231" \
+  "*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200" \
+  "\377\210\377\377\377\377\1\305\342\302\377\2305\231*\377\1@\2376\377" \
+  "\210\377\377\377\377\1\370\373\370\377\2315\231*\377\1\305\342\302\377" \
+  "\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377" \
+  "\1\305\342\302\377\2305\231*\377\12@\2376\377\377\377\377\377\374\375" \
+  "\374\377\363\371\362\377\351\364\350\377\342\360\340\377\351\364\350" \
+  "\377\363\371\363\377\374\375\374\377\370\373\370\377\2315\231*\377\1" \
+  "\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210" \
+  "\377\377\377\377\1\305\342\302\377\2315\231*\377\1<\2341\377\2075\231" \
+  "*\377\1<\2341\377\2315\231*\377\1\305\342\302\377\210\377\377\377\377" \
+  "\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\230" \
+  "5\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302\377\273" \
+  "5\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302" \
+  "\200\377\210\377\377\377\377\1\305\342\302\377\2735\231*\377\1\305\342" \
+  "\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224" \
+  "\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377" \
+  "\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210\377\377" \
+  "\377\377\1\305\342\302\377\2735\231*\377\1\305\342\302\377\210\377\377" \
+  "\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2305\231*\377\1\206\302\200\377\210\377\377\377\377\1\305\342\302" \
+  "\377\2735\231*\377\1\305\342\302\377\210\377\377\377\377\1m\265e\377" \
+  "\2305\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\1" \
+  "\206\302\200\377\210\377\377\377\377\1\305\342\302\377\2735\231*\377" \
+  "\1\305\342\302\377\210\377\377\377\377\1m\265e\377\2305\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2305\231*\377\1\206\302\200\377\210" \
+  "\377\377\377\377\1\305\342\302\377\2735\231*\377\1\305\342\302\377\210" \
+  "\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2305\231*\377\1\206\302\200\377\207\377\377\377\377\2\356" \
+  "\366\355\377u\271m\377\2735\231*\377\2u\271n\377\357\367\356\377\207" \
+  "\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2305\231*\377\1\206\302\200\377\206\377\377\377\377\2\261" \
+  "\327\255\377C\2409\377\2755\231*\377\2D\241:\377\265\331\261\377\206" \
+  "\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2305\231*\377\1\206\302\200\377\204\377\377\377\377\2\340" \
+  "\357\337\377g\262_\377\3015\231*\377\2l\265d\377\345\362\344\377\204" \
+  "\377\377\377\377\1m\265e\377\2305\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2305\231*\377\1\206\302\200\377\202\377\377\377\377\3\372" \
+  "\374\371\377\233\314\225\377:\233/\377\3035\231*\377\3<\2352\377\244" \
+  "\321\237\377\374\375\374\377\202\377\377\377\377\1m\265e\377\2305\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\206\302\200\377\2305\231*\377\4\206\302" \
+  "\200\377\377\377\377\377\317\347\314\377U\251L\377\3075\231*\377\4^\255" \
+  "U\377\331\354\327\377\377\377\377\377m\265e\377\2305\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2305\231*\377\2y\273r\377\205\301~\377" \
+  "\3125\231*\377\3""8\232-\377\224\311\216\377f\262^\377\2305\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2675\231*\377\21L\245C\377l" \
+  "\265d\377\214\305\205\377\247\322\242\377\262\330\255\377\273\335\270" \
+  "\377\305\342\302\377\317\347\314\377\326\352\324\377\317\347\314\377" \
+  "\305\342\302\377\273\335\270\377\262\330\255\377\247\322\242\377\214" \
+  "\305\205\377l\265d\377L\245C\377\2675\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\206\302\200\377\2635\231*\377\4a\257X\377\237\317\232\377\327\353" \
+  "\325\377\367\373\366\377\221\377\377\377\377\4\367\373\366\377\327\353" \
+  "\325\377\237\317\232\377a\257X\377\2635\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\206\302\200\377\2575\231*\377\4:\233/\377p\267h\377\256\326\252\377" \
+  "\353\365\352\377\231\377\377\377\377\4\353\365\352\377\256\326\251\377" \
+  "n\266f\377:\233/\377\2575\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2545\231*\377\4C\2409\377~\276w\377\275\335\271\377\365\372\364" \
+  "\377\237\377\377\377\377\4\365\372\364\377\273\335\270\377}\275v\377" \
+  "A\2377\377\2545\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\252" \
+  "5\231*\377\3S\250I\377\274\335\270\377\374\375\374\377\245\377\377\377" \
+  "\377\3\373\375\373\377\271\333\265\377P\247G\377\2525\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2505\231*\377\3H\242>\377\254\325" \
+  "\250\377\373\375\373\377\251\377\377\377\377\3\373\375\372\377\250\323" \
+  "\243\377E\241;\377\2505\231*\377\1\231\313\224\377\230\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377" \
+  "\2465\231*\377\3\77\2364\377\233\314\225\377\366\372\365\377\255\377" \
+  "\377\377\377\3\364\371\364\377\230\313\222\377=\2353\377\2465\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2445\231*\377\3""8\233.\377" \
+  "\212\304\204\377\355\366\354\377\261\377\377\377\377\3\353\365\352\377" \
+  "\207\302\200\3778\232-\377\2445\231*\377\1\231\313\224\377\230\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302" \
+  "\200\377\2435\231*\377\2x\273q\377\343\361\341\377\265\377\377\377\377" \
+  "\2\340\357\337\377t\271l\377\2435\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2415\231*\377\2""8\233.\377\255\325\250\377\271\377\377" \
+  "\377\377\2\247\322\242\3777\232,\377\2415\231*\377\1\231\313\224\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377" \
+  "\377\1\206\302\200\377\2405\231*\377\2D\2409\377\314\345\311\377\273" \
+  "\377\377\377\377\2\307\343\304\377A\2377\377\2405\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2375\231*\377\2W\252M\377\344\361\343" \
+  "\377\275\377\377\377\377\2\340\357\336\377R\247H\377\2375\231*\377\1" \
+  "\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0" \
+  "\214\377\377\377\377\1\206\302\200\377\2365\231*\377\2q\267j\377\364" \
+  "\371\364\377\277\377\377\377\377\2\361\370\360\377j\264b\377\2365\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\206\302\200\377\2355\231*\377\2\224\311" \
+  "\216\377\375\376\375\377\301\377\377\377\377\2\373\375\373\377\212\304" \
+  "\204\377\2355\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377" \
+  "\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2335\231" \
+  "*\377\2;\2340\377\266\332\262\377\305\377\377\377\377\2\255\325\250\377" \
+  "8\233.\377\2335\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\233" \
+  "5\231*\377\1\300\337\275\377\307\377\377\377\377\1\264\331\260\377\233" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2325\231*\377\1\237" \
+  "\316\231\377\311\377\377\377\377\1\222\310\214\377\2325\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2315\231*\377\1|\275u\377\312\377" \
+  "\377\377\377\2\375\376\375\377q\267i\377\2315\231*\377\1\231\313\224" \
+  "\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377" \
+  "\377\377\1\206\302\200\377\2305\231*\377\2_\256W\377\370\373\370\377" \
+  "\313\377\377\377\377\2\364\371\364\377W\252M\377\2305\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2275\231*\377\2J\243@\377\353\365" \
+  "\352\377\315\377\377\377\377\2\344\361\343\377D\241:\377\2275\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\206\302\200\377\2265\231*\377\2<\2341\377\326" \
+  "\352\324\377\317\377\377\377\377\2\315\345\312\3778\233.\377\2265\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\206\302\200\377\2265\231*\377\1\272\334" \
+  "\267\377\321\377\377\377\377\1\256\326\252\377\2265\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2255\231*\377\1\220\307\212\377\323\377" \
+  "\377\377\377\1\204\301}\377\2255\231*\377\1\231\313\224\377\230\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302" \
+  "\200\377\2245\231*\377\2F\241<\377\364\371\364\377\323\377\377\377\377" \
+  "\2\356\366\355\377\77\2364\377\2245\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2245\231*\377\1\252\324\245\377\325\377\377\377\377\1\233" \
+  "\315\226\377\2245\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\223" \
+  "5\231*\377\2R\247H\377\373\375\373\377\245\377\377\377\377\13\367\373" \
+  "\366\377\342\360\340\377\316\346\314\377\272\334\267\377\247\322\242" \
+  "\377\230\313\223\377\247\323\243\377\274\335\270\377\320\347\315\377" \
+  "\344\361\342\377\370\373\370\377\245\377\377\377\377\2\366\372\365\377" \
+  "H\243>\377\2235\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\223" \
+  "5\231*\377\1\275\335\271\377\243\377\377\377\377\4\342\360\340\377\243" \
+  "\321\236\377e\261\\\3776\231+\377\2115\231*\377\4""8\232-\377i\263a\377" \
+  "\247\323\243\377\346\362\345\377\243\377\377\377\377\1\256\326\251\377" \
+  "\2235\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2225\231*\377\1" \
+  "b\257Y\377\241\377\377\377\377\3\366\372\365\377\236\316\231\377V\251" \
+  "M\377\2215\231*\377\3Z\253Q\377\244\321\237\377\370\373\370\377\240\377" \
+  "\377\377\377\2\374\375\374\377T\251K\377\2225\231*\377\1\231\313\224" \
+  "\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377" \
+  "\377\377\1\206\302\200\377\2225\231*\377\1\320\347\315\377\237\377\377" \
+  "\377\377\3\373\375\373\377\254\325\250\377H\242>\377\2255\231*\377\3" \
+  "L\245C\377\265\331\261\377\376\376\376\377\237\377\377\377\377\1\277" \
+  "\337\274\377\2225\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\221" \
+  "5\231*\377\1u\271m\377\237\377\377\377\377\2\301\337\275\377S\250J\377" \
+  "\2315\231*\377\2[\254R\377\313\345\310\377\237\377\377\377\377\1c\260" \
+  "[\377\2215\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2205\231*\377" \
+  "\2""8\232-\377\340\357\337\377\235\377\377\377\377\2\375\376\375\377" \
+  "\220\307\212\377\2345\231*\377\2""6\231+\377\237\317\232\377\236\377" \
+  "\377\377\377\1\321\347\316\377\2215\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2205\231*\377\1q\267j\377\235\377\377\377\377\2\363\371" \
+  "\362\377n\266f\377\2375\231*\377\2}\275v\377\370\373\370\377\235\377" \
+  "\377\377\377\1^\256V\377\2205\231*\377\1\231\313\224\377\230\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302" \
+  "\200\377\2205\231*\377\1\260\327\254\377\234\377\377\377\377\2\343\361" \
+  "\341\377U\251L\377\2415\231*\377\2_\256W\377\353\365\352\377\234\377" \
+  "\377\377\377\1\235\315\230\377\2205\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2175\231*\377\2""6\231+\377\355\366\354\377\233\377\377" \
+  "\377\377\2\356\366\355\377N\245D\377\2435\231*\377\2Y\253P\377\365\372" \
+  "\364\377\233\377\377\377\377\1\334\355\333\377\2205\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2175\231*\377\1c\260[\377\233\377\377" \
+  "\377\377\2\372\374\371\377d\261\\\377\2455\231*\377\2s\270k\377\376\376" \
+  "\376\377\233\377\377\377\377\1P\247G\377\2175\231*\377\1\231\313\224" \
+  "\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377" \
+  "\377\377\1\206\302\200\377\2175\231*\377\1\242\320\235\377\233\377\377" \
+  "\377\377\1\201\277{\377\2475\231*\377\1\224\311\216\377\233\377\377\377" \
+  "\377\1\217\306\211\377\2175\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200" \
+  "\377\2175\231*\377\1\341\360\340\377\232\377\377\377\377\1\250\323\243" \
+  "\377\2515\231*\377\1\272\334\267\377\232\377\377\377\377\1\316\346\314" \
+  "\377\2175\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2165\231*\377" \
+  "\1U\251L\377\232\377\377\377\377\2\357\367\356\377@\2365\377\2515\231" \
+  "*\377\2J\243@\377\367\373\366\377\231\377\377\377\377\2\374\375\374\377" \
+  "D\241:\377\2165\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\216" \
+  "5\231*\377\1\224\311\217\377\232\377\377\377\377\1\215\305\207\377\253" \
+  "5\231*\377\1\235\315\230\377\232\377\377\377\377\1\201\277{\377\2165" \
+  "\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2165\231*\377\1\323" \
+  "\351\321\377\231\377\377\377\377\2\345\362\344\3779\233/\377\2535\231" \
+  "*\377\2@\2365\377\356\366\355\377\231\377\377\377\377\1\300\337\275\377" \
+  "\2165\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2155\231*\377\2" \
+  "D\241:\377\376\376\376\377\231\377\377\377\377\1}\275v\377\2555\231*" \
+  "\377\1\213\304\205\377\231\377\377\377\377\2\367\373\367\3778\232-\377" \
+  "\2155\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\214\377\377\377\377\1\206\302\200\377\2155\231*\377\1" \
+  "f\262^\377\231\377\377\377\377\2\362\370\361\3778\233.\377\2555\231*" \
+  "\377\2\77\2364\377\372\374\371\377\231\377\377\377\377\1S\250I\377\215" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2155\231*\377\1\206" \
+  "\302\200\377\231\377\377\377\377\1\266\332\262\377\2575\231*\377\1\305" \
+  "\342\302\377\231\377\377\377\377\1q\267i\377\2155\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377" \
+  "\377\377\377\1\206\302\200\377\2155\231*\377\1\246\322\241\377\231\377" \
+  "\377\377\377\1v\272o\377\2575\231*\377\1\207\302\200\377\231\377\377" \
+  "\377\377\1\217\306\211\377\2155\231*\377\1\231\313\224\377\230\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302" \
+  "\200\377\2155\231*\377\1\305\342\302\377\230\377\377\377\377\2\370\373" \
+  "\370\377=\2353\377\2575\231*\377\2I\243\77\377\376\376\376\377\230\377" \
+  "\377\377\377\1\255\325\250\377\2155\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206" \
+  "\302\200\377\2155\231*\377\1\342\360\340\377\230\377\377\377\377\1\305" \
+  "\341\302\377\2615\231*\377\1\327\353\325\377\230\377\377\377\377\1\311" \
+  "\344\307\377\2155\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302\200\377\215" \
+  "5\231*\377\1\357\367\357\377\230\377\377\377\377\1\247\323\243\377\261" \
+  "5\231*\377\1\272\334\266\377\230\377\377\377\377\1\327\353\325\377\215" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\214\377\377\377\377\1\206\302\200\377\2155\231*\377\1\371" \
+  "\374\371\377\230\377\377\377\377\1\224\311\216\377\2615\231*\377\1\244" \
+  "\321\237\377\230\377\377\377\377\1\342\360\340\377\2155\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\214" \
+  "\377\377\377\377\1\206\302\200\377\2145\231*\377\1""8\232-\377\231\377" \
+  "\377\377\377\1\200\277y\377\2615\231*\377\1\217\306\211\377\230\377\377" \
+  "\377\377\1\355\366\354\377\2155\231*\377\1\231\313\224\377\230\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\206\302" \
+  "\200\377\2145\231*\377\1B\2378\377\231\377\377\377\377\1l\265d\377\261" \
+  "5\231*\377\1y\273r\377\230\377\377\377\377\1\370\373\370\377\2155\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\207\302\200\377\2145\231*\377\1K\244A\377" \
+  "\231\377\377\377\377\1Z\253Q\377\2615\231*\377\1f\262^\377\231\377\377" \
+  "\377\377\1""8\232-\377\2145\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\217\306\211" \
+  "\377\2145\231*\377\1E\241;\377\231\377\377\377\377\1d\261\\\377\2615" \
+  "\231*\377\1q\267j\377\230\377\377\377\377\1\374\375\374\377\2155\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\214\377\377\377\377\1\230\313\223\377\2145\231*\377\1<\2341\377" \
+  "\231\377\377\377\377\1x\273q\377\2615\231*\377\1\207\302\200\377\230" \
+  "\377\377\377\377\1\361\370\360\377\2155\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377" \
+  "\1\242\320\235\377\2155\231*\377\1\374\375\374\377\230\377\377\377\377" \
+  "\1\214\305\205\377\2615\231*\377\1\234\315\227\377\230\377\377\377\377" \
+  "\1\346\362\345\377\2155\231*\377\1\231\313\224\377\230\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\253\325\247\377" \
+  "\2155\231*\377\1\363\371\362\377\230\377\377\377\377\1\237\317\232\377" \
+  "\2615\231*\377\1\261\327\255\377\230\377\377\377\377\1\333\355\331\377" \
+  "\2155\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\214\377\377\377\377\1\266\332\262\377\2155\231*\377\1" \
+  "\350\363\347\377\230\377\377\377\377\1\265\331\261\377\2615\231*\377" \
+  "\1\307\343\304\377\230\377\377\377\377\1\320\347\315\377\2155\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\277\337\274\377\2155\231*\377\1\321\347\316" \
+  "\377\230\377\377\377\377\1\347\363\345\377\2605\231*\377\2""9\233/\377" \
+  "\364\371\364\377\230\377\377\377\377\1\270\333\264\377\2155\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\214\377\377\377\377\1\321\347\316\377\2155\231*\377\1\261\327\255" \
+  "\377\231\377\377\377\377\1]\255T\377\2575\231*\377\1n\265f\377\231\377" \
+  "\377\377\377\1\232\314\224\377\2155\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\214\377\377\377\377\1\357" \
+  "\367\357\377\2155\231*\377\1\221\307\213\377\231\377\377\377\377\1\236" \
+  "\316\231\377\2575\231*\377\1\254\325\250\377\231\377\377\377\377\1|\275" \
+  "u\377\2155\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\215\377\377\377\377\1E\241;\377\2145\231*\377\1q\267" \
+  "j\377\231\377\377\377\377\1\336\356\334\377\2575\231*\377\1\352\364\351" \
+  "\377\231\377\377\377\377\1]\255T\377\2155\231*\377\1\231\313\224\377" \
+  "\230\377\377\377\377\2\377\377\377\310\377\377\377\0\215\377\377\377" \
+  "\377\1e\261\\\377\2145\231*\377\1R\247H\377\232\377\377\377\377\1Y\253" \
+  "P\377\2555\231*\377\1d\261\\\377\232\377\377\377\377\1\77\2364\377\215" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\215\377\377\377\377\1\205\301\177\377\2155\231*\377\1\350" \
+  "\363\347\377\231\377\377\377\377\1\301\337\275\377\2555\231*\377\1\314" \
+  "\345\311\377\231\377\377\377\377\1\325\352\323\377\2165\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\215" \
+  "\377\377\377\377\1\245\321\240\377\2155\231*\377\1\252\324\245\377\232" \
+  "\377\377\377\377\1b\260Z\377\2535\231*\377\1p\267h\377\232\377\377\377" \
+  "\377\1\227\312\221\377\2165\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\215\377\377\377\377\1\307\343\304" \
+  "\377\2155\231*\377\1k\264c\377\232\377\377\377\377\1\317\347\314\377" \
+  "\2525\231*\377\2""7\232,\377\334\355\333\377\232\377\377\377\377\1X\253" \
+  "O\377\2165\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\215\377\377\377\377\2\364\371\364\3778\232-\377\214" \
+  "5\231*\377\2""8\233.\377\363\371\362\377\232\377\377\377\377\1r\270k" \
+  "\377\2515\231*\377\1\205\301~\377\232\377\377\377\377\1\344\361\342\377" \
+  "\2175\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\216\377\377\377\377\1a\257X\377\2155\231*\377\1\270\333" \
+  "\264\377\232\377\377\377\377\2\356\366\355\377N\245D\377\2475\231*\377" \
+  "\2Y\253P\377\365\372\364\377\232\377\377\377\377\1\245\321\240\377\217" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\216\377\377\377\377\1\224\311\217\377\2155\231*\377\1y\273" \
+  "q\377\233\377\377\377\377\2\333\355\331\377>\2354\377\2455\231*\377\2" \
+  "F\241<\377\346\362\345\377\233\377\377\377\377\1f\261]\377\2175\231*" \
+  "\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\216\377\377\377\377\1\311\343\306\377\2155\231*\377\2\77\2364" \
+  "\377\372\374\371\377\233\377\377\377\377\2\302\340\276\3776\231+\377" \
+  "\2435\231*\377\2:\233/\377\321\347\316\377\233\377\377\377\377\2\357" \
+  "\367\357\3777\232,\377\2175\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\216\377\377\377\377\2\367\373\366" \
+  "\3779\233/\377\2155\231*\377\1\305\342\302\377\234\377\377\377\377\1" \
+  "\250\323\243\377\2425\231*\377\2""8\233.\377\270\333\264\377\234\377" \
+  "\377\377\377\1\262\330\256\377\2205\231*\377\1\231\313\224\377\230\377" \
+  "\377\377\377\2\377\377\377\310\377\377\377\0\217\377\377\377\377\1f\262" \
+  "^\377\2155\231*\377\1\207\302\200\377\235\377\377\377\377\2\300\337\275" \
+  "\377>\2354\377\2375\231*\377\2D\241:\377\315\345\312\377\235\377\377" \
+  "\377\377\1t\271l\377\2205\231*\377\1\231\313\224\377\230\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\217\377\377\377\377\1\254\325\250" \
+  "\377\2155\231*\377\2F\241<\377\366\372\365\377\235\377\377\377\377\2" \
+  "\333\355\331\377N\245D\377\2355\231*\377\2W\252N\377\344\361\343\377" \
+  "\235\377\377\377\377\2\355\366\354\377<\2341\377\2205\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\217" \
+  "\377\377\377\377\2\361\370\360\3779\233/\377\2155\231*\377\1\233\314" \
+  "\225\377\236\377\377\377\377\2\357\367\356\377n\266f\377\2335\231*\377" \
+  "\2z\274s\377\364\371\364\377\236\377\377\377\377\1\210\303\202\377\221" \
+  "5\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\220\377\377\377\377\1v\272o\377\2155\231*\377\2>\2354\377" \
+  "\354\365\353\377\237\377\377\377\377\2\310\343\305\377[\254R\377\227" \
+  "5\231*\377\2c\260[\377\321\350\317\377\237\377\377\377\377\2\341\360" \
+  "\340\3778\232-\377\2215\231*\377\1\231\313\224\377\230\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\220\377\377\377\377\1\301\337\275\377" \
+  "\2165\231*\377\1\210\303\201\377\240\377\377\377\377\3\376\376\376\377" \
+  "\266\332\262\377N\245D\377\2235\231*\377\2S\250J\377\276\336\273\377" \
+  "\241\377\377\377\377\1w\272p\377\2225\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\220\377\377\377\377" \
+  "\2\373\375\372\377D\241:\377\2155\231*\377\2""8\232-\377\340\357\336" \
+  "\377\241\377\377\377\377\4\375\376\375\377\316\346\314\377\220\307\212" \
+  "\377Q\247H\377\2155\231*\377\4U\251L\377\224\311\216\377\322\350\320" \
+  "\377\376\376\376\377\241\377\377\377\377\1\323\351\321\377\2235\231*" \
+  "\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\221\377\377\377\377\1\215\305\207\377\2165\231*\377\1t\271l\377" \
+  "\245\377\377\377\377\15\335\356\333\377\247\322\242\377\220\307\212\377" \
+  "|\275u\377h\263`\377T\251K\377F\241<\377U\251L\377j\263a\377}\275v\377" \
+  "\221\307\213\377\251\323\244\377\341\360\340\377\245\377\377\377\377" \
+  "\1f\261]\377\2235\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\221\377\377\377\377\2\350\363\346\3779\233" \
+  "/\377\2165\231*\377\1\320\347\315\377\325\377\377\377\377\1\302\340\276" \
+  "\377\2245\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377" \
+  "\310\377\377\377\0\222\377\377\377\377\1\204\301}\377\2165\231*\377\1" \
+  "b\257Y\377\324\377\377\377\377\2\374\375\374\377V\251M\377\2245\231*" \
+  "\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\222\377\377\377\377\2\344\361\342\3778\232-\377\2165\231*\377" \
+  "\1\274\335\270\377\323\377\377\377\377\1\257\327\253\377\2255\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\223\377\377\377\377\1~\276w\377\2165\231*\377\2D\241:\377\345\362" \
+  "\344\377\321\377\377\377\377\2\335\356\333\377@\2365\377\2255\231*\377" \
+  "\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\223\377\377\377\377\2\337\357\335\3776\231+\377\2165\231*\377\2X\253" \
+  "O\377\365\372\364\377\317\377\377\377\377\2\360\367\357\377P\247G\377" \
+  "\2265\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\224\377\377\377\377\1\202\300{\377\2175\231*\377\2s\270" \
+  "k\377\376\376\376\377\315\377\377\377\377\2\373\375\373\377i\263a\377" \
+  "\2275\231*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0\224\377\377\377\377\2\357\367\356\377C\2409\377\2175\231" \
+  "*\377\1\225\311\217\377\315\377\377\377\377\1\210\303\202\377\2305\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\225\377\377\377\377\1\256\326\252\377\2205\231*\377\1\270\333" \
+  "\264\377\313\377\377\377\377\1\254\325\250\377\2315\231*\377\1\231\313" \
+  "\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\225\377" \
+  "\377\377\377\2\376\376\376\377a\257X\377\2175\231*\377\2;\2340\377\325" \
+  "\352\323\377\311\377\377\377\377\2\314\345\311\3778\232-\377\2315\231" \
+  "*\377\1\231\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\226\377\377\377\377\2\330\353\326\3777\232,\377\2175\231*\377" \
+  "\2I\243\77\377\352\364\351\377\307\377\377\377\377\2\344\361\342\377" \
+  "D\2409\377\2325\231*\377\1\231\313\224\377\230\377\377\377\377\2\377" \
+  "\377\377\310\377\377\377\0\227\377\377\377\377\1\221\307\213\377\220" \
+  "5\231*\377\2\\\255S\377\353\365\352\377\305\377\377\377\377\2\347\363" \
+  "\345\377T\251K\377\2335\231*\377\1\231\313\224\377\230\377\377\377\377" \
+  "\2\377\377\377\310\377\377\377\0\227\377\377\377\377\2\373\375\372\377" \
+  "`\257W\377\2205\231*\377\2K\244A\377\326\352\324\377\303\377\377\377" \
+  "\377\2\320\347\315\377F\241<\377\2345\231*\377\1\231\313\224\377\230" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\230\377\377\377\377" \
+  "\2\346\362\345\377B\2378\377\2205\231*\377\2<\2341\377\271\333\265\377" \
+  "\301\377\377\377\377\2\261\327\255\3779\233/\377\2355\231*\377\1\231" \
+  "\313\224\377\230\377\377\377\377\2\377\377\377\310\377\377\377\0\231" \
+  "\377\377\377\377\1\302\340\276\377\2225\231*\377\2\225\311\217\377\376" \
+  "\376\376\377\275\377\377\377\377\2\374\375\374\377\215\305\207\377\237" \
+  "5\231*\377\1c\260[\377\215\223\310\215\377\4\230\313\223\377\253\325" \
+  "\247\377\300\337\275\377\356\366\355\377\207\377\377\377\377\2\377\377" \
+  "\377\310\377\377\377\0\232\377\377\377\377\1\220\307\212\377\2225\231" \
+  "*\377\2r\270k\377\364\371\364\377\273\377\377\377\377\2\362\370\361\377" \
+  "m\265e\377\2615\231*\377\3""6\231+\377e\261\\\377\273\335\270\377\205" \
+  "\377\377\377\377\2\377\377\377\310\377\377\377\0\232\377\377\377\377" \
+  "\2\373\375\372\377i\263a\377\2225\231*\377\2W\252M\377\344\361\342\377" \
+  "\271\377\377\377\377\2\340\357\337\377S\250I\377\2655\231*\377\2u\271" \
+  "n\377\355\366\354\377\203\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\233\377\377\377\377\2\364\371\364\377\\\255S\377\2225\231*\377\2D" \
+  "\2409\377\276\336\272\377\267\377\377\377\377\2\272\334\266\377A\237" \
+  "7\377\2675\231*\377\2D\241:\377\272\334\266\377\202\377\377\377\377\2" \
+  "\377\377\377\310\377\377\377\0\234\377\377\377\377\2\355\366\354\377" \
+  "Q\247H\377\2235\231*\377\2b\260Z\377\320\347\315\377\263\377\377\377" \
+  "\377\2\314\345\311\377_\256W\377\2735\231*\377\4\237\316\231\377\377" \
+  "\377\377\377\377\377\377\310\377\377\377\0\235\377\377\377\377\2\344" \
+  "\361\343\377H\242>\377\2245\231*\377\2s\270k\377\336\356\334\377\257" \
+  "\377\377\377\377\2\333\355\331\377o\266g\377\2755\231*\377\4""8\233." \
+  "\377\330\353\326\377\377\377\377\310\377\377\377\0\236\377\377\377\377" \
+  "\2\331\354\327\377@\2376\377\2245\231*\377\3""7\232,\377\204\301}\377" \
+  "\352\364\351\377\253\377\377\377\377\3\350\363\346\377\201\277z\3776" \
+  "\231+\377\2775\231*\377\3W\252M\377\367\373\367\312\377\377\377\0\237" \
+  "\377\377\377\377\2\331\354\327\377H\242>\377\2255\231*\377\3<\2341\377" \
+  "\224\311\217\377\363\371\362\377\247\377\377\377\377\3\361\370\360\377" \
+  "\221\307\213\377;\2340\377\3025\231*\377\2\204\300}\346\377\377\377\0" \
+  "\240\377\377\377\377\2\344\361\342\377P\247G\377\2265\231*\377\4C\240" \
+  "9\377\205\301\177\377\305\341\302\377\372\374\371\377\241\377\377\377" \
+  "\377\4\371\374\371\377\303\341\300\377\204\301}\377A\2377\377\3045\231" \
+  "*\377\2""6\231+\3775\231*\35\241\377\377\377\377\2\354\365\353\377[\254" \
+  "R\377\2305\231*\377\4\77\2364\377y\273r\377\271\333\265\377\363\371\362" \
+  "\377\233\377\377\377\377\4\363\371\362\377\267\333\263\377x\273q\377" \
+  ">\2354\377\3105\231*\377\1""5\231*n\242\377\377\377\377\2\363\371\363" \
+  "\377h\263`\377\2325\231*\377\4""9\233/\377m\265e\377\254\325\250\377" \
+  "\352\364\351\377\225\377\377\377\377\4\352\364\351\377\253\325\247\377" \
+  "l\265d\3778\233.\377\3135\231*\377\1""5\231*\270\243\377\377\377\377" \
+  "\2\373\375\372\377\215\305\207\377\2355\231*\377\7X\253O\377x\273q\377" \
+  "\226\312\220\377\264\331\260\377\322\350\320\377\354\365\353\377\371" \
+  "\374\371\377\207\377\377\377\377\7\371\374\371\377\354\365\353\377\322" \
+  "\350\320\377\264\331\260\377\226\312\220\377x\273q\377X\253O\377\317" \
+  "5\231*\377\1""5\231*\331\245\377\377\377\377\2\300\337\275\377B\2378" \
+  "\377\2425\231*\377\7""9\233/\377D\241:\377O\246F\377W\252N\377O\246F" \
+  "\377D\241:\3779\233/\377\3265\231*\377\1""5\231*\362\246\377\377\377" \
+  "\377\2\346\362\345\377a\257X\377\3765\231*\377\1""5\231*\364\247\377" \
+  "\377\377\377\3\373\375\372\377\221\307\213\3777\232,\377\3745\231*\377" \
+  "\1""5\231*\332\251\377\377\377\377\2\330\353\326\377b\257Y\377\3735\231" \
+  "*\377\1""5\231*\274\252\377\377\377\377\3\376\376\376\377\261\327\255" \
+  "\377D\241:\377\3715\231*\377\1""5\231*t\254\377\377\377\377\3\361\370" \
+  "\360\377\207\302\200\3777\232,\377\3675\231*\377\1""5\231*#\256\377\377" \
+  "\377\377\3\342\360\340\377\204\301}\3779\233/\377\3645\231*\377\2w\272" \
+  "p\352\377\377\377\0\260\377\377\377\377\3\351\364\350\377\215\305\207" \
+  "\377<\2352\377\3615\231*\377\3N\245D\377\362\370\361\313\377\377\377" \
+  "\0\262\377\377\377\377\3\357\367\356\377\230\313\222\377K\244B\377\356" \
+  "5\231*\377\4""6\231+\377\315\345\312\377\377\377\377\310\377\377\377" \
+  "\0\264\377\377\377\377\4\375\376\375\377\311\344\307\377\177\276x\377" \
+  ">\2354\377\3535\231*\377\4\220\307\212\377\377\377\377\377\377\377\377" \
+  "\310\377\377\377\0\267\377\377\377\377\4\366\372\365\377\266\332\262" \
+  "\377n\265f\377<\2352\377\3465\231*\377\6<\2352\377\247\322\242\377\375" \
+  "\376\375\377\377\377\377\377\377\377\377\310\377\377\377\0\272\377\377" \
+  "\377\377\5\372\374\371\377\315\345\312\377\230\313\223\377c\260[\377" \
+  "8\233.\377\3415\231*\377\2d\261\\\377\342\360\340\377\203\377\377\377" \
+  "\377\2\377\377\377\310\377\377\377\0\276\377\377\377\377\6\365\372\364" \
+  "\377\306\342\303\377\243\321\236\377\205\301~\377f\261]\377H\242>\377" \
+  "\3325\231*\377\3T\251K\377\250\323\243\377\375\376\375\377\204\377\377" \
+  "\377\377\2\377\377\377\310\377\377\377\0\304\377\377\377\377\11\363\371" \
+  "\362\377\325\351\322\377\300\337\275\377\266\332\262\377\253\324\246" \
+  "\377\240\317\233\377\225\311\217\377\213\304\205\377\201\277{\377\315" \
+  "\200\277y\377\4\206\302\200\377\233\315\226\377\262\330\255\377\341\360" \
+  "\340\377\207\377\377\377\377\2\377\377\377\310\377\377\377\0\377\377" \
+  "\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377\377\0\377" \
+  "\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377\377\0" \
+  "\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377\377" \
+  "\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377\377" \
+  "\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310\377" \
+  "\377\377\0\377\377\377\377\377\246\377\377\377\377\2\377\377\377\310" \
+  "\377\377\377\0")
+
+
diff --git a/psplash-write.c b/psplash-write.c
new file mode 100644 (file)
index 0000000..ebe0541
--- /dev/null
@@ -0,0 +1,58 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  Parts of this file based on 'usplash' copyright Matthew Garret.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "psplash.h"
+
+int main(int argc, char **argv) 
+{
+  char *tmpdir;
+  int   pipe_fd;
+
+  tmpdir = getenv("TMPDIR");
+
+  if (!tmpdir)
+    tmpdir = "/tmp";
+
+  if (argc!=2) 
+    {
+      fprintf(stderr, "Wrong number of arguments\n");
+      exit(-1);
+    }
+  
+  chdir(tmpdir);
+  
+  if ((pipe_fd = open (PSPLASH_FIFO,O_WRONLY|O_NONBLOCK)) == -1)
+    {
+      perror("Error unable to open fifo");
+      exit (-1);
+    }
+
+  write(pipe_fd, argv[1], strlen(argv[1])+1);
+
+  return 0;
+}
+
diff --git a/psplash.c b/psplash.c
new file mode 100644 (file)
index 0000000..30737c1
--- /dev/null
+++ b/psplash.c
@@ -0,0 +1,239 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  Parts of this file ( fifo handling ) based on 'usplash' copyright 
+ *  Matthew Garret.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#include "psplash.h"
+#include "psplash-image.h"
+
+void
+psplash_exit (int signum)
+{
+  DBG("mark");
+
+  psplash_console_reset ();
+}
+
+void
+psplash_draw_progress (PSplashFB *fb, int value)
+{
+  int x, y, width, height;
+
+  x      = fb->width/8;
+  y      = fb->height - (fb->height/8); 
+  width  = fb->width - (fb->width/4);
+  height = 16;
+
+  value = CLAMP(value,0,100);
+
+  DBG("total w: %i, val :%i, w: %i", 
+      width, value, (value * width) / 100);
+
+  psplash_fb_draw_rect (fb, x, y, width, height, 0xce, 0xce, 0xce);
+  psplash_fb_draw_rect (fb, x, y, 
+                       (value * width) / 100, 
+                       height, 0x5b, 0x8a, 0xb2);
+}
+
+static int 
+parse_command (PSplashFB *fb, char *string, int length) 
+{
+  char *command;
+  int   parsed=0;
+
+  parsed = strlen(string)+1;
+
+  DBG("got cmd %s", string);
+       
+  if (strcmp(string,"QUIT") == 0)
+    return 1;
+
+  command = strtok(string," ");
+
+  if (!strcmp(command,"TEXT")) 
+    {
+      char *line   = strtok(NULL,"\0");
+      int   length = strlen(line);             
+
+      while (length>50) 
+       {
+         // draw_text(line,50);
+         line+=50;
+         length-=50;
+       }
+
+      // draw_text(line,length);
+    } 
+  else if (!strcmp(command,"STATUS")) 
+    {
+      // draw_status(strtok(NULL,"\0"),0);
+    } 
+  else if (!strcmp(command,"SUCCESS")) 
+    {
+      // draw_status(strtok(NULL,"\0"),TEXT_FOREGROUND);
+    } 
+  else if (!strcmp(command,"FAILURE")) 
+    {
+      // draw_status(strtok(NULL,"\0"),RED);
+    } 
+  else if (!strcmp(command,"PROGRESS")) 
+    {
+      psplash_draw_progress (fb, atoi(strtok(NULL,"\0")));
+      // draw_progress(atoi(strtok(NULL,"\0")));
+    } 
+  else if (!strcmp(command,"CLEAR")) 
+    {
+      // text_clear();
+    } 
+  else if (!strcmp(command,"TIMEOUT")) 
+    {
+      // timeout=(atoi(strtok(NULL,"\0")));
+    } 
+  else if (!strcmp(command,"QUIT")) 
+    {
+      return 1;
+    }
+
+  return 0;
+}
+
+void 
+psplash_main (PSplashFB *fb, int pipe_fd, int timeout) 
+{
+  int            err;
+  ssize_t        length = 0;
+  fd_set         descriptors;
+  struct timeval tv;
+  char          *end;
+  char           command[2048];
+
+  tv.tv_sec = timeout;
+  tv.tv_usec = 0;
+
+  FD_ZERO(&descriptors);
+  FD_SET(pipe_fd, &descriptors);
+
+  end = command;
+
+  while (1) 
+    {
+      if (timeout != 0) 
+       err = select(pipe_fd+1, &descriptors, NULL, NULL, &tv);
+      else
+       err = select(pipe_fd+1, &descriptors, NULL, NULL, NULL);
+      
+      if (err <= 0) 
+       {
+         /*
+         if (errno == EINTR)
+           continue;
+         */
+         return;
+       }
+      
+      length += read (pipe_fd, end, sizeof(command) - (end - command));
+
+      if (length == 0) 
+       {
+         /* Reopen to see if there's anything more for us */
+         close(pipe_fd);
+         pipe_fd = open(PSPLASH_FIFO,O_RDONLY|O_NONBLOCK);
+         goto out;
+       }
+      
+      if (command[length-1] == '\0') 
+       {
+         if (parse_command(fb, command, strlen(command))) 
+           return;
+         length = 0;
+       } 
+    out:
+      end = &command[length];
+    
+      tv.tv_sec = timeout;
+      tv.tv_usec = 0;
+      
+      FD_ZERO(&descriptors);
+      FD_SET(pipe_fd,&descriptors);
+    }
+
+  return;
+}
+
+int 
+main (int argc, char** argv) 
+{
+  char      *tmpdir;
+  int        pipe_fd;
+  PSplashFB *fb;
+
+  signal(SIGHUP, psplash_exit);
+  signal(SIGINT, psplash_exit);
+  signal(SIGQUIT, psplash_exit);
+
+  psplash_console_switch ();
+
+  tmpdir = getenv("TMPDIR");
+
+  if (!tmpdir)
+    tmpdir = "/tmp";
+
+  chdir(tmpdir);
+
+  if (mkfifo(PSPLASH_FIFO, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP))
+    {
+      if (errno!=EEXIST) 
+       {
+         perror("mkfifo");
+         exit(-1);
+       }
+    }
+
+  pipe_fd = open (PSPLASH_FIFO,O_RDONLY|O_NONBLOCK);
+  
+  if (pipe_fd==-1) 
+    {
+      perror("pipe open");
+      exit(-2);
+    }
+
+  if ((fb = psplash_fb_new()) == NULL)
+    exit(-1);
+
+  DBG("rect to %ix%i", fb->width, fb->height);
+
+  psplash_fb_draw_rect (fb, 0, 0, fb->width, fb->height, 0xff, 0xff, 0xff);
+
+  psplash_fb_draw_image (fb, 
+                        (fb->width  - IMG_WIDTH)/2, 
+                        (fb->height - IMG_HEIGHT)/4, 
+                        IMG_WIDTH,
+                        IMG_HEIGHT,
+                        IMG_BYTES_PER_PIXEL,
+                        IMG_RLE_PIXEL_DATA);
+
+  psplash_draw_progress (fb, 50);
+
+  psplash_main (fb, pipe_fd, 0);
+
+  psplash_console_reset ();
+
+  psplash_fb_destroy (fb);
+
+  return 0;
+}
diff --git a/psplash.h b/psplash.h
new file mode 100644 (file)
index 0000000..aec24d6
--- /dev/null
+++ b/psplash.h
@@ -0,0 +1,65 @@
+/* 
+ *  pslash - a lightweight framebuffer splashscreen for embedded devices. 
+ *
+ *  Copyright (c) 2006 Matthew Allum <mallum@o-hand.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#ifndef _HAVE_PSPLASH_H
+#define _HAVE_PSPLASH_H
+
+#define _GNU_SOURCE 1
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <linux/fb.h>
+#include <linux/kd.h>
+#include <linux/vt.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined(__i386__) || defined(__alpha__)
+#include <sys/io.h>
+#endif
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <termios.h>
+#include <unistd.h>
+
+typedef unsigned char  uint8;
+typedef unsigned short uint16;
+
+#define PSPLASH_FIFO "psplash_fifo"
+
+#define CLAMP(x, low, high) \
+   (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
+
+#define DEBUG 1
+
+#if DEBUG
+#define DBG(x, a...) \
+   { printf ( __FILE__ ":%d,%s() " x "\n", __LINE__, __func__, ##a); }
+#else
+#define DBG(x, a...) do {} while (0)
+#endif
+
+#include "psplash-fb.h"
+#include "psplash-console.h"
+
+#endif