[hamradio-commits] [baycomepp] 01/02: Imported Upstream version 0.10

Colin Tuckley colint at moszumanska.debian.org
Sun May 10 17:35:48 UTC 2015


This is an automated email from the git hooks/post-receive script.

colint pushed a commit to branch master
in repository baycomepp.

commit 283b09f9ca1cfe446170a5b38e0e8ce07225f8c4
Author: Colin Tuckley <colin at tuckley.org>
Date:   Sun May 10 17:17:26 2015 +0100

    Imported Upstream version 0.10
---
 ABOUT-NLS                    |  226 ++
 AUTHORS                      |    1 +
 COPYING                      |  339 +++
 ChangeLog                    |    0
 INSTALL                      |  182 ++
 Makefile.am                  |    8 +
 Makefile.in                  |  400 +++
 NEWS                         |    8 +
 README                       |    8 +
 acconfig.h                   |   43 +
 aclocal.m4                   | 2006 ++++++++++++++
 baycomepp.spec               |   53 +
 cfgdos                       |   18 +
 cfgwindows                   |   20 +
 cfgwindowsnodebug            |   20 +
 config.guess                 | 1121 ++++++++
 config.h.in                  |  291 +++
 config.sub                   | 1232 +++++++++
 configure                    | 5905 ++++++++++++++++++++++++++++++++++++++++++
 configure.in                 |  245 ++
 directx/Makefile.am          |   27 +
 directx/Makefile.in          |  334 +++
 directx/deunion.pl           |   47 +
 directx/dinput.c             |  338 +++
 directx/fixdirectx.sh        |   17 +
 directx/include/directx.h    |   79 +
 directx/include/mmsystem.h   |  236 ++
 directx/libddraw.def         |    3 +
 directx/libdinput.def        |    2 +
 directx/libdplayx.def        |    2 +
 directx/libdsound.def        |    9 +
 eppdiag/Makefile.am          |   36 +
 eppdiag/Makefile.in          |  365 +++
 eppdiag/eppdiag.c            |  341 +++
 eppdiag/eppdiag.glade        |  485 ++++
 eppdiag/gladesig.h           |   31 +
 eppdiag/gladesrc.c           |  379 +++
 eppdiag/gladesrc.h           |   53 +
 eppfm/Makefile.am            |   44 +
 eppfm/Makefile.in            |  398 +++
 eppfm/audio.c                |  946 +++++++
 eppfm/callbacks.c            |   98 +
 eppfm/callbacks.h            |   53 +
 eppfm/costab.c               |   74 +
 eppfm/eppfm.h                |   54 +
 eppfm/gentbl.c               |   72 +
 eppfm/interface.c            |  711 +++++
 eppfm/interface.h            |    5 +
 eppfm/main.c                 |  179 ++
 eppfm/support.c              |  158 ++
 eppfm/support.h              |   34 +
 eppfm2/AUTHORS               |    1 +
 eppfm2/ChangeLog             |    0
 eppfm2/Makefile.am           |   15 +
 eppfm2/Makefile.in           |  332 +++
 eppfm2/NEWS                  |    0
 eppfm2/README                |    0
 eppfm2/configure             | 4114 +++++++++++++++++++++++++++++
 eppfm2/configure.in          |   57 +
 eppfm2/eppfm.glade           | 1643 ++++++++++++
 eppfm2/src/Makefile.am       |   60 +
 eppfm2/src/Makefile.in       |  424 +++
 eppfm2/src/audio.c           |  340 +++
 eppfm2/src/audiolinux.c      |  475 ++++
 eppfm2/src/audiowin32.c      |  654 +++++
 eppfm2/src/callbacks.h       |  158 ++
 eppfm2/src/coeff.m           |   30 +
 eppfm2/src/costab.c          |   74 +
 eppfm2/src/eppfm.h           |   80 +
 eppfm2/src/gentbl.c          |   72 +
 eppfm2/src/getopt.h          |  129 +
 eppfm2/src/interface.c       | 1194 +++++++++
 eppfm2/src/interface.h       |   10 +
 eppfm2/src/main.c            |  571 ++++
 eppfm2/src/support.c         |  158 ++
 eppfm2/src/support.h         |   57 +
 eppfm2/src/widgets.c         |  615 +++++
 eppfm2/src/widgets.h         |  102 +
 flexdrv/Makefile.am          |   30 +
 flexdrv/Makefile.in          |  333 +++
 flexdrv/bayeppflex.c         | 1520 +++++++++++
 flexdrv/bayeppflex.rc        |   76 +
 flexdrv/driver.c             |   74 +
 flexdrv/drv32.h              |   15 +
 flexdrv/flexdriv.def         |   11 +
 flexdrv/flexdrv.h            |  491 ++++
 flexdrv/resource.h           |   12 +
 install-sh                   |  250 ++
 intl/ChangeLog               | 1086 ++++++++
 intl/Makefile.in             |  214 ++
 intl/VERSION                 |    1 +
 intl/bindtextdom.c           |  203 ++
 intl/cat-compat.c            |  262 ++
 intl/dcgettext.c             |  655 +++++
 intl/dgettext.c              |   59 +
 intl/explodename.c           |  197 ++
 intl/finddomain.c            |  216 ++
 intl/gettext.c               |   70 +
 intl/gettext.h               |  105 +
 intl/gettextP.h              |   89 +
 intl/hash-string.h           |   59 +
 intl/intl-compat.c           |   76 +
 intl/l10nflist.c             |  411 +++
 intl/libgettext.h            |  182 ++
 intl/linux-msg.sed           |  100 +
 intl/loadinfo.h              |   78 +
 intl/loadmsgcat.c            |  220 ++
 intl/localealias.c           |  438 ++++
 intl/po2tbl.sed.in           |  102 +
 intl/textdomain.c            |  108 +
 intl/xopen-msg.sed           |  104 +
 main/Makefile.am             |   78 +
 main/Makefile.in             |  553 ++++
 main/configfpga.c            | 1032 ++++++++
 main/ecp_firmware.h          | 1617 ++++++++++++
 main/epp_firmware.h          | 1623 ++++++++++++
 main/epp_fpga.h              |  238 ++
 main/eppafsk_firmware.h      | 1551 +++++++++++
 main/eppchk_firmware.h       | 1531 +++++++++++
 main/eppfpga.8               |  129 +
 main/eppfpga.c               |  329 +++
 main/eppsamp_firmware.h      | 1545 +++++++++++
 main/fpga.h                  |  169 ++
 main/fpgatests.c             | 3151 ++++++++++++++++++++++
 main/getopt.c                |  731 ++++++
 main/getopt.h                |  129 +
 main/getopt1.c               |  176 ++
 main/openpty.c               |   88 +
 main/parport.h               |  217 ++
 main/ppdev.c                 |  235 ++
 main/ppdev.h                 |  102 +
 main/ppdevinit.c             |   97 +
 main/ppdirect.c              |  738 ++++++
 main/ppdirectinit.c          |  677 +++++
 main/ppkdrv.c                |  290 +++
 main/ppkdrvinit.c            |  114 +
 main/ppnt.c                  | 1023 ++++++++
 main/ppntddkgenport.c        |  813 ++++++
 main/ppntddkgenportinit.c    |  469 ++++
 main/ppntinit.c              |  587 +++++
 main/ppuser.c                |  450 ++++
 main/ppuser.h                |   48 +
 main/ppuserinit.c            |   80 +
 main/ppw9xring0.c            |  797 ++++++
 main/ppw9xring0init.c        |  681 +++++
 main/ppwin.c                 | 1010 ++++++++
 main/ppwininit.c             |  624 +++++
 main/snprintpkt.c            |  255 ++
 main/sppafsk_firmware.h      | 1551 +++++++++++
 main/sysdeps.h               |  244 ++
 main/syslog.c                |   70 +
 main/util.h                  |   70 +
 main/vsnprintf.c             |  194 ++
 missing                      |  188 ++
 mkinstalldirs                |   40 +
 ntdrv/Makefile.am            |    9 +
 ntdrv/Makefile.in            |  313 +++
 ntdrv/eppflex.c              |  428 +++
 ntdrv/eppflex.h              |   49 +
 ntdrv/eppflex.inf            |   57 +
 ntdrv/eppflex.rc             |   38 +
 ntdrv/eppflex.sys            |  Bin 0 -> 5581 bytes
 ntdrv/makefile               |    7 +
 ntdrv/sources                |    7 +
 ntdrv/testload.c             |  128 +
 po/ChangeLog                 |    0
 po/Makefile.in.in            |  248 ++
 po/POTFILES.in               |    7 +
 po/baycomepp.pot             |  281 ++
 po/cat-id-tbl.c              |   79 +
 po/stamp-cat-id              |    1 +
 stamp-h.in                   |    1 +
 udriver/Makefile.am          |   41 +
 udriver/Makefile.in          |  463 ++++
 udriver/baycomepp.8          |  140 +
 udriver/baycomepp.initscript |   63 +
 udriver/drv.h                |  172 ++
 udriver/drvinit.c            |  837 ++++++
 udriver/drvresident.c        | 1109 ++++++++
 w9xdrv/MAKEFILE              |   72 +
 w9xdrv/Makefile.am           |    1 +
 w9xdrv/Makefile.in           |  215 ++
 w9xdrv/SOURCES               |    8 +
 w9xdrv/eppfctrl.asm          |   54 +
 w9xdrv/eppflex.c             |  418 +++
 w9xdrv/eppflex.def           |   27 +
 w9xdrv/eppflex.h             |   49 +
 w9xdrv/eppflex.rc            |   38 +
 w9xdrv/eppflex.vxd           |  Bin 0 -> 9887 bytes
 189 files changed, 68642 insertions(+)

diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..28d38c7
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,226 @@
+Notes on the Free Translation Project
+*************************************
+
+   Free software is going international!  The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+   If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site.  But you do *not*
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+   When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used.  The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+One advise in advance
+=====================
+
+   If you want to exploit the full power of internationalization, you
+should configure it using
+
+     ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed.  So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias or message inheritance) as the
+implementation here.  It is also not possible to offer this additional
+functionality on top of a `catgets' implementation.  Future versions of
+GNU `gettext' will very likely convey even more functionality.  So it
+might be a good idea to change to GNU `gettext' as soon as possible.
+
+   So you need not provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+   Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'.  Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system provides
+usable `catgets' (if using this is selected by the installer) or
+`gettext' functions.  If neither is available, the GNU `gettext' own
+library will be used.  This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is *not* required.  Installers may use
+special options at configuration time for changing the default
+behaviour.  The commands:
+
+     ./configure --with-included-gettext
+     ./configure --with-catgets
+     ./configure --disable-nls
+
+will respectively bypass any pre-existing `catgets' or `gettext' to use
+the internationalizing routines provided within this package, enable
+the use of the `catgets' functions (if found on the locale system), or
+else, *totally* disable translation of messages.
+
+   When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this.  This might be not what is desirable.  You
+should use the more recent version of the GNU `gettext' library.  I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+     ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+   By default the configuration process will not test for the `catgets'
+function and therefore they will not be used.  The reasons are already
+given above: the emulation on top of `catgets' cannot provide all the
+extensions provided by the GNU `gettext' library.  If you nevertheless
+want to use the `catgets' functions use
+
+     ./configure --with-catgets
+
+to enable the test for `catgets' (this causes no harm if `catgets' is
+not available on your system).  If you really select this option we
+would like to hear about the reasons because we cannot think of any
+good one ourself.
+
+   Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+   As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+ISO 639 `LL' two-letter code prior to using the programs in the
+package.  For example, let's suppose that you speak German.  At the
+shell prompt, merely execute `setenv LANG de' (in `csh'),
+`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash').  This
+can be done from your `.login' or `.profile' file, once and for all.
+
+   An operating system might already offer message localization for
+many of its programs, while other programs have been installed locally
+with the full capabilities of GNU `gettext'.  Just using `gettext'
+extended syntax for `LANG' would break proper localization of already
+available operating system programs.  In this case, users should set
+both `LANGUAGE' and `LANG' variables in their environment, as programs
+using GNU `gettext' give preference to `LANGUAGE'.  For example, some
+Swedish users would rather read translations in German than English for
+when Swedish is not available.  This is easily accomplished by setting
+`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
+
+Translating Teams
+=================
+
+   For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list, courtesy of Linux
+International.  You may reach your translation team at the address
+`LL at li.org', replacing LL by the two-letter ISO 639 code for your
+language.  Language codes are *not* the same as the country codes given
+in ISO 3166.  The following translation teams exist, as of December
+1997:
+
+     Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
+     Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
+     `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
+     Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
+     `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
+     Swedish `sv', and Turkish `tr'.
+
+For example, you may reach the Chinese translation team by writing to
+`zh at li.org'.
+
+   If you'd like to volunteer to *work* at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is *not* the same as the list itself, it has
+`-request' appended.  For example, speakers of Swedish can send a
+message to `sv-request at li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate
+*actively* in translations, or at solving translational difficulties,
+rather than merely lurking around.  If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation at iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+   Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of December
+1997.  The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination.
+
+     Ready PO files    cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+                     .----------------------------------------------------.
+     bash            |       []          []          []                   |  3
+     bison           |       []          []          []                   |  3
+     clisp           |       [] [] []    []                               |  4
+     cpio            |       []    []    []       [] []    []             |  6
+     diffutils       |       []    []    []                []          [] |  5
+     enscript        |       []    [] [] []          []             []    |  6
+     fileutils       | []    []    []    []       [] []    [] []    [] [] | 10
+     findutils       |       []    []    [] []    [] []    []    []    [] |  9
+     flex            |             []    []       []                   [] |  4
+     gcal            |       []          []          []    []          [] |  5
+     gettext         |    [] []    []    []       [] [] [] [] []    [] [] | 12
+     grep            |       []    []    []       [] [] [] []    [] [] [] | 10
+     hello           |    [] []    []    []       [] [] [] [] []    [] [] | 11
+     id-utils        |       []          []                []             |  3
+     indent          |    [] []                   []       []    []       |  5
+     libc            |       []    []    []       [] []    []          [] |  7
+     m4              |       []          []    []    []          []    [] |  6
+     make            |       []    []    []       [] []    []             |  6
+     music           |                   []                []             |  2
+     ptx             |       []    []    []          [] [] [] []       [] |  8
+     recode          |    [] []    []    []          []    [] []    [] [] |  9
+     sh-utils        |       []    []    []          [] [] [] []       [] |  8
+     sharutils       | []    []    []    []          []                [] |  6
+     tar             | []    []          [] []    [] [] [] [] []    [] [] | 11
+     texinfo         | []    []          []                               |  3
+     textutils       | []    []    []    []       [] [] [] []          [] |  9
+     wdiff           | []    []    []    []          [] [] []          [] |  8
+                     `----------------------------------------------------'
+       17 languages    cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+       27 packages      6  4 25  1 18  1 26  2  1 12 20  9 19  7  4  7 17  179
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer.  There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+   If December 1997 seems to be old, you may fetch a more recent copy
+of this `ABOUT-NLS' file on most GNU archive sites.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..c1e0a1f
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Thomas Sailer, <sailer at ife.ee.ethz.ch>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..a43ea21
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+

+	Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    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 of the License, 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.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..b42a17a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f28ffce
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,8 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = intl po directx main udriver eppdiag eppfm eppfm2 flexdrv ntdrv w9xdrv
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+EXTRA_DIST = ABOUT-NLS baycomepp.spec cfgwindows cfgwindowsnodebug cfgdos
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..5493e20
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,400 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+SUBDIRS = intl po directx main udriver eppdiag eppfm eppfm2 flexdrv ntdrv w9xdrv
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+EXTRA_DIST = ABOUT-NLS baycomepp.spec cfgwindows cfgwindowsnodebug cfgdos
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \
+INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.guess \
+config.h.in config.sub configure configure.in install-sh missing \
+mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+	cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+	cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h
+	@if test ! -f $@; then \
+		rm -f stamp-h; \
+		$(MAKE) stamp-h; \
+	else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES= CONFIG_HEADERS=config.h \
+	     $(SHELL) ./config.status
+	@echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+	@if test ! -f $@; then \
+		rm -f $(srcdir)/stamp-h.in; \
+		$(MAKE) $(srcdir)/stamp-h.in; \
+	else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+	cd $(top_srcdir) && $(AUTOHEADER)
+	@echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+	-rm -f config.h
+
+maintainer-clean-hdr:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+ at SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+	  rev="$$subdir $$rev"; \
+	  test "$$subdir" != "." || dot_seen=yes; \
+	done; \
+	test "$$dot_seen" = "no" && rev=". $$rev"; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	-rm -rf $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+	mkdir $(distdir)/=build
+	mkdir $(distdir)/=inst
+	dc_install_base=`cd $(distdir)/=inst && pwd`; \
+	cd $(distdir)/=build \
+	  && ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist
+	-rm -rf $(distdir)
+	@banner="$(distdir).tar.gz is ready for distribution"; \
+	dashes=`echo "$$banner" | sed s/./=/g`; \
+	echo "$$dashes"; \
+	echo "$$banner"; \
+	echo "$$dashes"
+dist: distdir
+	-chmod -R a+r $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+	-rm -rf $(distdir)
+dist-all: distdir
+	-chmod -R a+r $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+	-rm -rf $(distdir)
+distdir: $(DISTFILES)
+	-rm -rf $(distdir)
+	mkdir $(distdir)
+	-chmod 777 $(distdir)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+	for subdir in $(SUBDIRS); do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    chmod 777 $(distdir)/$$subdir; \
+	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile config.h
+all-redirect: all-recursive-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+	-rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..2a4fa8b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,8 @@
+Version 0.4
+
+eppfpga:
+- new test "ppsig": checks for errors in the
+  parport related wiring
+
+baycomepp:
+- can now configure the interface (i.e. callsign, ip addrs)
diff --git a/README b/README
new file mode 100644
index 0000000..990d635
--- /dev/null
+++ b/README
@@ -0,0 +1,8 @@
+Compiling sources with RPM:
+
+rpm --rebuild baycomepp-0.7.src.rpm
+
+or
+
+rpm -ta baycomepp-0.7.tar.gz
+
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..8c2cf68
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,43 @@
+/* define if we want ppuser support */
+#undef HAVE_PPUSER
+
+/* define if we want kernel driver parport access support */
+#undef HAVE_PPKDRV
+
+/* define if int8_t and friends are available */
+#undef HAVE_BITTYPES
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_GETSYSTEMTIME
+
+/* define if inb and friends are available */
+#undef HAVE_IOFUNCS
+
+/* define if we have found the MKISS driver (line discipline) */
+#undef HAVE_MKISS
+
+/* define if M_PI is not defined by math.h */
+#undef M_PI
+
+/* define if M_LN10 is not defined by math.h */
+#undef M_LN10
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_IFRNEWNAME
+
+/* define if we have DirectX includes */
+#undef HAVE_DIRECTX
+
+/* define if National Language Support is requested */
+#undef ENABLE_NLS
+
+/* NLS stuff */
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+
+/* various directories */
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..592265c
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,2006 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN([AM_MISSING_PROG],
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN([AM_CONFIG_HEADER],
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated.  We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+  case " <<$>>CONFIG_HEADERS " in
+  *" <<$>>am_file "*<<)>>
+    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+# isc-posix.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it.  Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+#   configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+#   configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+  [
+    dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+    AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+  ]
+)
+
+
+# serial 1
+
+# @defmac AC_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so.  This macro tries various
+# options that select ANSI C on some system or another.  It considers the
+# compiler to be in ANSI C mode if it handles function prototypes correctly.
+#
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{am_cv_prog_cc_stdc} is set to @samp{no}.  If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+AC_DEFUN([AM_PROG_CC_STDC],
+[AC_REQUIRE([AC_PROG_CC])
+AC_BEFORE([$0], [AC_C_INLINE])
+AC_BEFORE([$0], [AC_C_CONST])
+dnl Force this before AC_PROG_CPP.  Some cpp's, eg on HPUX, require
+dnl a magic option to avoid problems with ANSI preprocessor commands
+dnl like #elif.
+dnl FIXME: can't do this because then AC_AIX won't work due to a
+dnl circular dependency.
+dnl AC_BEFORE([$0], [AC_PROG_CPP])
+AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(am_cv_prog_cc_stdc,
+[am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX			-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  AC_TRY_COMPILE(
+[#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+], [
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+],
+[am_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CC="$ac_save_CC"
+])
+if test -z "$am_cv_prog_cc_stdc"; then
+  AC_MSG_RESULT([none needed])
+else
+  AC_MSG_RESULT($am_cv_prog_cc_stdc)
+fi
+case "x$am_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+])
+
+# gettext.m4 serial 13 (gettext-0.11.1)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper at cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible at clisp.cons.org>, 2000-2002.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])
+  define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+  define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE(nls,
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT($USE_NLS)
+  AC_SUBST(USE_NLS)
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH(included-gettext,
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        dnl Add a version number to the cache macros.
+        define([gt_api_version], ifelse([$2], [need-ngettext], 2, 1))
+        define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+        define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+        AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+         [AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+            [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+            gt_cv_func_gnugettext_libc=yes,
+            gt_cv_func_gnugettext_libc=no)])
+
+        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            gt_cv_func_gnugettext_libintl,
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+              [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)],
+              gt_cv_func_gnugettext_libintl=yes,
+              gt_cv_func_gnugettext_libintl=no)
+            dnl Now see whether libintl exists and depends on libiconv.
+            if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+                [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)],
+               [LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext_libintl=yes
+               ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if test "$gt_cv_func_gnugettext_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+                && test "$PACKAGE" != gettext; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        INTLOBJS="\$(GETTOBJS)"
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE(HAVE_GETTEXT, 1,
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE(HAVE_DCGETTEXT, 1,
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(BUILD_INCLUDED_LIBINTL)
+    AC_SUBST(USE_INCLUDED_LIBINTL)
+    AC_SUBST(CATOBJEXT)
+    AC_SUBST(INTLOBJS)
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST(DATADIRNAME)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST(INSTOBJEXT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST(GENCAT)
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST(INTLLIBS)
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST(LIBINTL)
+  AC_SUBST(LTLIBINTL)
+  AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the po subdirectory,
+dnl except for USE_NLS.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+  dnl Search for GNU xgettext 0.11 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU msgfmt.
+  if test "$GMSGFMT" != ":"; then
+    dnl If it is no GNU msgfmt we define it as : so that the
+    dnl Makefiles still can work.
+    if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      AC_MSG_RESULT(
+        [found $GMSGFMT program is not GNU msgfmt; ignore it])
+      GMSGFMT=":"
+    fi
+  fi
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU xgettext.
+  if test "$XGETTEXT" != ":"; then
+    dnl If it is no GNU xgettext we define it as : so that the
+    dnl Makefiles still can work.
+    if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      AC_MSG_RESULT(
+        [found xgettext program is not GNU xgettext; ignore it])
+      XGETTEXT=":"
+    fi
+    dnl Remove leftover from FreeBSD xgettext call.
+    rm -f messages.po
+  fi
+
+  AC_OUTPUT_COMMANDS([
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+          fi
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done],
+   [# Capture the value of obsolete $ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([AC_ISC_POSIX])dnl
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_C_CONST])dnl
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_OFF_T])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([jm_GLIBC21])dnl
+
+  AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
+
+  AM_ICONV
+  AM_LANGINFO_CODESET
+  AM_LC_MESSAGES
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+  dnl compile.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+  dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+  dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+  dnl Try to locate is.
+  MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+  AC_SUBST(MKINSTALLDIRS)
+])
+
+# lib-link.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    LIBS="$LIBS $LIB[]NAME"
+    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L,
+dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH([lib$1-prefix],
+[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "X$found_dir" = "X/usr/lib"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+# lib-prefix.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/lib"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+# lib-ld.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 1996-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  acl_cv_prog_gnu_ld=yes
+else
+  acl_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	test "$with_gnu_ld" != no && break
+      else
+	test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
+
+# iconv.m4 serial AM3 (gettext-0.11)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      am_cv_func_iconv=yes)
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes)
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST(LIBICONV)
+  AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+  AC_REQUIRE([AM_ICONV_LINK])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL(am_cv_proto_iconv, [
+      AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([$]{ac_t:-
+         }[$]am_cv_proto_iconv)
+    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
+
+# progtest.m4 serial 2 (gettext-0.10.40)
+dnl Copyright (C) 1996-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper at cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  /*)
+  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in ifelse([$5], , $PATH, [$5]); do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if [$3]; then
+	ac_cv_path_$1="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+  ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+  [
+    AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+      ac_cv_gnu_library_2_1,
+      [AC_EGREP_CPP([Lucky GNU user],
+	[
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+	],
+	ac_cv_gnu_library_2_1=yes,
+	ac_cv_gnu_library_2_1=no)
+      ]
+    )
+    AC_SUBST(GLIBC21)
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
+
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+    [AC_TRY_LINK([#include <langinfo.h>],
+      [char* cs = nl_langinfo(CODESET);],
+      am_cv_langinfo_codeset=yes,
+      am_cv_langinfo_codeset=no)
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
+
+# lcmessage.m4 serial 2 (gettext-0.10.40)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper at cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+  [if test $ac_cv_header_locale_h = yes; then
+    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+    if test $am_cv_val_LC_MESSAGES = yes; then
+      AC_DEFINE(HAVE_LC_MESSAGES, 1,
+        [Define if your <locale.h> file defines LC_MESSAGES.])
+    fi
+  fi])
+
+# Configure paths for GTK+
+# Owen Taylor     97-11-3
+
+dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
+dnl
+AC_DEFUN(AM_PATH_GTK,
+[dnl 
+dnl Get the cflags and libraries from the gtk-config script
+dnl
+AC_ARG_WITH(gtk-prefix,[  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)],
+            gtk_config_prefix="$withval", gtk_config_prefix="")
+AC_ARG_WITH(gtk-exec-prefix,[  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
+            gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
+AC_ARG_ENABLE(gtktest, [  --disable-gtktest       Do not try to compile and run a test GTK program],
+		    , enable_gtktest=yes)
+
+  for module in . $4
+  do
+      case "$module" in
+         gthread) 
+             gtk_config_args="$gtk_config_args gthread"
+         ;;
+      esac
+  done
+
+  if test x$gtk_config_exec_prefix != x ; then
+     gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+     fi
+  fi
+  if test x$gtk_config_prefix != x ; then
+     gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+     fi
+  fi
+
+  AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
+  min_gtk_version=ifelse([$1], ,0.99.7,$1)
+  AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
+  no_gtk=""
+  if test "$GTK_CONFIG" = "no" ; then
+    no_gtk=yes
+  else
+    GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+    GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+    gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK is sufficiently new. (Also sanity
+dnl checks the results of gtk-config to some extent
+dnl
+      rm -f conf.gtktest
+      AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.gtktest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If gtk-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+      printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+	   (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+	     GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+        printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GTK_CONFIG" = "no" ; then
+       echo "*** The gtk-config script installed by GTK could not be found"
+       echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GTK_CONFIG environment variable to the"
+       echo "*** full path to gtk-config."
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK test program, checking why..."
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+],      [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK or finding the wrong"
+          echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+          echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+          echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+  rm -f conf.gtktest
+])
+
+# Define a conditional.
+
+AC_DEFUN([AM_CONDITIONAL],
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi])
+
diff --git a/baycomepp.spec b/baycomepp.spec
new file mode 100644
index 0000000..77278b7
--- /dev/null
+++ b/baycomepp.spec
@@ -0,0 +1,53 @@
+# Note that this is NOT a relocatable package
+%define ver      0.10
+%define rel      1
+%define prefix   /usr
+
+Summary: Driver and diagnostic utilities for the Baycom EPP modem family
+Name: baycomepp
+Version: %ver
+Release: %rel
+Copyright: GPL
+Group: Networking/Hamradio
+Source: baycomepp-%{ver}.tar.gz
+BuildRoot: /tmp/baycomepp-root
+Packager: Thomas Sailer <sailer at ife.ee.ethz.ch>
+Obsoletes: baycomfpga, eppconv
+Requires: /sbin/ifconfig /sbin/route /sbin/arp
+
+%description
+This package contains the driver and diagnostic utilities
+for the Baycom EPP modem family, specifically the
+conventional EPP modem (using the IDT 7213x FIFO's) and
+the EPPFLEX FPGA modem (using the Xilinx XCS10).
+
+%prep
+%setup
+
+%build
+mkdir obj
+cd obj
+../configure --prefix=%prefix --localstatedir=/var --enable-driver --enable-ppuser --enable-ppkdrv 
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+cd obj
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/var/run
+install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/etc/rc.d/init.d
+install -g root -o root -m 0755 ../udriver/baycomepp.initscript $RPM_BUILD_ROOT/etc/rc.d/init.d/baycomepp
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+
+%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
+%{prefix}/sbin/*
+%{prefix}/bin/*
+%{prefix}/man/*/*
+/var/run
+%{prefix}/libexec/*
+%config /etc/rc.d/init.d/baycomepp
diff --git a/cfgdos b/cfgdos
new file mode 100755
index 0000000..0743b6a
--- /dev/null
+++ b/cfgdos
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i386-go32; then
+  CROSSPATH=/usr/local/cross/i386-go32/
+else
+  CROSSPATH=/usr/local/go32/i386-go32/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i386-go32-gcc
+AR=i386-go32-ar
+AS=i386-go32-as
+LD=i386-go32-ld
+RANLIB=i386-go32-ranlib
+CFLAGS="-O2 -g"
+LDFLAGS=""
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i386-go32 --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/cfgwindows b/cfgwindows
new file mode 100755
index 0000000..a8faf30
--- /dev/null
+++ b/cfgwindows
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i686-pc-cygwin; then
+  CROSSPATH=/usr/local/cross/i686-pc-cygwin/
+else
+  CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i686-pc-cygwin-gcc
+AR=i686-pc-cygwin-ar
+AS=i686-pc-cygwin-as
+LD=i686-pc-cygwin-ld
+RANLIB=i686-pc-cygwin-ranlib
+DLLTOOL=i686-pc-cygwin-dlltool
+WINDRES=i686-pc-cygwin-windres
+CFLAGS="-O2 -g -I${CROSSPATH}/gtk/include -mno-cygwin -mpentium -fnative-struct"
+LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin"
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/cfgwindowsnodebug b/cfgwindowsnodebug
new file mode 100755
index 0000000..78789f9
--- /dev/null
+++ b/cfgwindowsnodebug
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i686-pc-cygwin; then
+  CROSSPATH=/usr/local/cross/i686-pc-cygwin/
+else
+  CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i686-pc-cygwin-gcc
+AR=i686-pc-cygwin-ar
+AS=i686-pc-cygwin-as
+LD=i686-pc-cygwin-ld
+RANLIB=i686-pc-cygwin-ranlib
+DLLTOOL=i686-pc-cygwin-dlltool
+WINDRES=i686-pc-cygwin-windres
+CFLAGS="-O2 -I${CROSSPATH}/gtk/include -mno-cygwin -mpentium -fnative-struct"
+LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin"
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..e1b5871
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1121 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
+#   Free Software Foundation, Inc.
+#
+# This file 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 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner at cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+# Please send patches to <autoconf-patches at gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# Use $HOST_CC if defined. $CC may point to a cross-compiler
+if test x"$CC_FOR_BUILD" = x; then
+  if test x"$HOST_CC" != x; then
+    CC_FOR_BUILD="$HOST_CC"
+  else
+    if test x"$CC" != x; then
+      CC_FOR_BUILD="$CC"
+    else
+      CC_FOR_BUILD=cc
+    fi
+  fi
+fi
+
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.globl main
+	.ent main
+main:
+	.frame \$30,0,\$26,0
+	.prologue 0
+	.long 0x47e03d80 # implver $0
+	lda \$2,259
+	.long 0x47e20c21 # amask $2,$1
+	srl \$1,8,\$2
+	sll \$2,2,\$2
+	sll \$0,3,\$0
+	addl \$1,\$0,\$0
+	addl \$2,\$0,\$0
+	ret \$31,(\$26),1
+	.end main
+EOF
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		./$dummy
+		case "$?" in
+			7)
+				UNAME_MACHINE="alpha"
+				;;
+			15)
+				UNAME_MACHINE="alphaev5"
+				;;
+			14)
+				UNAME_MACHINE="alphaev56"
+				;;
+			10)
+				UNAME_MACHINE="alphapca56"
+				;;
+			16)
+				UNAME_MACHINE="alphaev6"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-cbm-sysv4
+	exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    arm32:NetBSD:*:*)
+	echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    SR2?01:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:NetBSD:*:*)
+	echo m68k-atari-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor 
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:NetBSD:*:*)
+	echo m68k-sun-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:NetBSD:*:*)
+	echo m68k-apple-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    macppc:NetBSD:*:*)
+        echo powerpc-apple-netbsd${UNAME_RELEASE}
+        exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:4)
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              sed 's/^              //' << EOF >$dummy.c
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	rm -f $dummy.c $dummy
+	esac
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i?86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+	echo m68k-hp-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	if test -x /usr/bin/objformat; then
+	    if test "elf" = "`/usr/bin/objformat`"; then
+		echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+		exit 0
+	    fi
+	fi
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:NetBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_help_string=`cd /; ld --help 2>&1`
+	ld_supported_emulations=`echo $ld_help_string \
+			 | sed -ne '/supported emulations:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported emulations: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_emulations" in
+	  *ia64)
+		echo "${UNAME_MACHINE}-unknown-linux"
+		exit 0
+		;;
+	  i?86linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0
+		;;
+	  i?86coff)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0
+		;;
+	  sparclinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  armlinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  elf32arm*)
+		echo "${UNAME_MACHINE}-unknown-linux-gnu"
+		exit 0
+		;;
+	  armelf_linux*)
+		echo "${UNAME_MACHINE}-unknown-linux-gnu"
+		exit 0
+		;;
+	  m68klinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  elf32ppc)
+		# Determine Lib Version
+		cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#if defined(__GLIBC__)
+  printf("%s %s\n", __libc_version, __libc_release);
+#else
+  printf("unkown\n");
+#endif
+  return 0;
+}
+EOF
+		LIBC=""
+		$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+		if test "$?" = 0 ; then
+			./$dummy | grep 1\.99 > /dev/null
+			if test "$?" = 0 ; then
+				LIBC="libc1"
+			fi
+		fi	
+		rm -f $dummy.c $dummy
+		echo powerpc-unknown-linux-gnu${LIBC}
+		exit 0
+		;;
+	esac
+
+	if test "${UNAME_MACHINE}" = "alpha" ; then
+		sed 's/^	//'  <<EOF >$dummy.s
+		.globl main
+		.ent main
+	main:
+		.frame \$30,0,\$26,0
+		.prologue 0
+		.long 0x47e03d80 # implver $0
+		lda \$2,259
+		.long 0x47e20c21 # amask $2,$1
+		srl \$1,8,\$2
+		sll \$2,2,\$2
+		sll \$0,3,\$0
+		addl \$1,\$0,\$0
+		addl \$2,\$0,\$0
+		ret \$31,(\$26),1
+		.end main
+EOF
+		LIBC=""
+		$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+		if test "$?" = 0 ; then
+			./$dummy
+			case "$?" in
+			7)
+				UNAME_MACHINE="alpha"
+				;;
+			15)
+				UNAME_MACHINE="alphaev5"
+				;;
+			14)
+				UNAME_MACHINE="alphaev56"
+				;;
+			10)
+				UNAME_MACHINE="alphapca56"
+				;;
+			16)
+				UNAME_MACHINE="alphaev6"
+				;;
+			esac
+
+			objdump --private-headers $dummy | \
+			  grep ld.so.1 > /dev/null
+			if test "$?" = 0 ; then
+				LIBC="libc1"
+			fi
+		fi
+		rm -f $dummy.s $dummy
+		echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+	elif test "${UNAME_MACHINE}" = "mips" ; then
+	  cat >$dummy.c <<EOF
+#ifdef __cplusplus
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+	  rm -f $dummy.c $dummy
+	else
+	  # Either a pre-BFD a.out linker (linux-gnuoldld)
+	  # or one that does not give us useful --help.
+	  # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+	  # If ld does not provide *any* "supported emulations:"
+	  # that means it is gnuoldld.
+	  echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+	  test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+	  case "${UNAME_MACHINE}" in
+	  i?86)
+	    VENDOR=pc;
+	    ;;
+	  *)
+	    VENDOR=unknown;
+	    ;;
+	  esac
+	  # Determine whether the default compiler is a.out or elf
+	  cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+	  rm -f $dummy.c $dummy
+	fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i?86:*:5:7*)
+        # Fixed at (any) Pentium or better
+        UNAME_MACHINE=i586
+        if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+	    echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+	else
+	    echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i?86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    pc:*:*:*)
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel at ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:*:6*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-qnx-qnx${UNAME_VERSION}
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..fbc6acd
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,291 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if using alloca.c.  */
+#undef C_ALLOCA
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro.  */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+#undef HAVE_ALLOCA_H
+
+/* Define if you have a working `mmap' system call.  */
+#undef HAVE_MMAP
+
+/* Define as __inline if that's what the C compiler calls it.  */
+#undef inline
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* define if we want ppuser support */
+#undef HAVE_PPUSER
+
+/* define if we want kernel driver parport access support */
+#undef HAVE_PPKDRV
+
+/* define if int8_t and friends are available */
+#undef HAVE_BITTYPES
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_GETSYSTEMTIME
+
+/* define if inb and friends are available */
+#undef HAVE_IOFUNCS
+
+/* define if we have found the MKISS driver (line discipline) */
+#undef HAVE_MKISS
+
+/* define if M_PI is not defined by math.h */
+#undef M_PI
+
+/* define if M_LN10 is not defined by math.h */
+#undef M_LN10
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_IFRNEWNAME
+
+/* define if we have DirectX includes */
+#undef HAVE_DIRECTX
+
+/* various directories */
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
+
+/* Define if you have the __argz_count function.  */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the __argz_next function.  */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the __argz_stringify function.  */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define if you have the feof_unlocked function.  */
+#undef HAVE_FEOF_UNLOCKED
+
+/* Define if you have the fgets_unlocked function.  */
+#undef HAVE_FGETS_UNLOCKED
+
+/* Define if you have the getc_unlocked function.  */
+#undef HAVE_GETC_UNLOCKED
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETCWD
+
+/* Define if you have the getegid function.  */
+#undef HAVE_GETEGID
+
+/* Define if you have the geteuid function.  */
+#undef HAVE_GETEUID
+
+/* Define if you have the getgid function.  */
+#undef HAVE_GETGID
+
+/* Define if you have the getopt_long function.  */
+#undef HAVE_GETOPT_LONG
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the gettimeofday function.  */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the getuid function.  */
+#undef HAVE_GETUID
+
+/* Define if you have the iopl function.  */
+#undef HAVE_IOPL
+
+/* Define if you have the mempcpy function.  */
+#undef HAVE_MEMPCPY
+
+/* Define if you have the munmap function.  */
+#undef HAVE_MUNMAP
+
+/* Define if you have the openpty function.  */
+#undef HAVE_OPENPTY
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
+/* Define if you have the random function.  */
+#undef HAVE_RANDOM
+
+/* Define if you have the revoke function.  */
+#undef HAVE_REVOKE
+
+/* Define if you have the setenv function.  */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function.  */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the snprintf function.  */
+#undef HAVE_SNPRINTF
+
+/* Define if you have the stpcpy function.  */
+#undef HAVE_STPCPY
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strdup function.  */
+#undef HAVE_STRDUP
+
+/* Define if you have the strtoul function.  */
+#undef HAVE_STRTOUL
+
+/* Define if you have the syslog function.  */
+#undef HAVE_SYSLOG
+
+/* Define if you have the tsearch function.  */
+#undef HAVE_TSEARCH
+
+/* Define if you have the vsnprintf function.  */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the vsyslog function.  */
+#undef HAVE_VSYSLOG
+
+/* Define if you have the <argz.h> header file.  */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the <arpa/inet.h> header file.  */
+#undef HAVE_ARPA_INET_H
+
+/* Define if you have the <asm/io.h> header file.  */
+#undef HAVE_ASM_IO_H
+
+/* Define if you have the <getopt.h> header file.  */
+#undef HAVE_GETOPT_H
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <linux/ax25.h> header file.  */
+#undef HAVE_LINUX_AX25_H
+
+/* Define if you have the <linux/if.h> header file.  */
+#undef HAVE_LINUX_IF_H
+
+/* Define if you have the <linux/sockios.h> header file.  */
+#undef HAVE_LINUX_SOCKIOS_H
+
+/* Define if you have the <linux/soundcard.h> header file.  */
+#undef HAVE_LINUX_SOUNDCARD_H
+
+/* Define if you have the <locale.h> header file.  */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file.  */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <net/if.h> header file.  */
+#undef HAVE_NET_IF_H
+
+/* Define if you have the <netinet/in.h> header file.  */
+#undef HAVE_NETINET_IN_H
+
+/* Define if you have the <nl_types.h> header file.  */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <pty.h> header file.  */
+#undef HAVE_PTY_H
+
+/* Define if you have the <sched.h> header file.  */
+#undef HAVE_SCHED_H
+
+/* Define if you have the <stddef.h> header file.  */
+#undef HAVE_STDDEF_H
+
+/* Define if you have the <stdlib.h> header file.  */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/io.h> header file.  */
+#undef HAVE_SYS_IO_H
+
+/* Define if you have the <sys/param.h> header file.  */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/perm.h> header file.  */
+#undef HAVE_SYS_PERM_H
+
+/* Define if you have the <sys/socket.h> header file.  */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define if you have the <sys/stat.h> header file.  */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file.  */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <syslog.h> header file.  */
+#undef HAVE_SYSLOG_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <windows.h> header file.  */
+#undef HAVE_WINDOWS_H
+
+/* Define if you have the m library (-lm).  */
+#undef HAVE_LIBM
+
+/* Define if you have the util library (-lutil).  */
+#undef HAVE_LIBUTIL
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if translation of program messages to the user's native language
+   is requested. */
+#undef ENABLE_NLS
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define if the GNU dcgettext() function is already present or preinstalled. */
+#undef HAVE_DCGETTEXT
+
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..28426bb
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1232 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+	echo Configuration name missing. 1>&2
+	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+	echo "or     $0 ALIAS" 1>&2
+	echo where ALIAS is a recognized configuration type. 1>&2
+	exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+	*local*)
+		echo $1
+		exit 0
+		;;
+	*)
+	;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+		| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+		| 580 | i960 | h8300 \
+		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+		| alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+		| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+		| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
+		| mips64orion | mips64orionel | mipstx39 | mipstx39el \
+		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+		| mips64vr5000 | miprs64vr5000el | mcore \
+		| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
+		| thumb | d10v | fr30)
+		basic_machine=$basic_machine-unknown
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i[34567]86)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	# FIXME: clean up the formatting here.
+	vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+	      | xmp-* | ymp-* \
+	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+	      | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
+	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+	      | clipper-* | orion-* \
+	      | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+	      | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* \
+	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+	      | mipstx39-* | mipstx39el-* | mcore-* \
+	      | f301-* | armv*-* | t3e-* \
+	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+	      | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* )
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-cbm
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-cbm
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	cray2)
+		basic_machine=cray2-cray
+		os=-unicos
+		;;
+	[ctj]90-cray)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[34567]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i[34567]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i[34567]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i[34567]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	i386-go32 | go32)
+		basic_machine=i386-unknown
+		os=-go32
+		;;
+	i386-mingw32 | mingw32)
+		basic_machine=i386-unknown
+		os=-mingw32
+		;;
+	i386-qnx | qnx)
+		basic_machine=i386-qnx
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mipsel*-linux*)
+		basic_machine=mipsel-unknown
+		os=-linux-gnu
+		;;
+	mips*-linux*)
+		basic_machine=mips-unknown
+		os=-linux-gnu
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	msdos)
+		basic_machine=i386-unknown
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+        pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexen)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexen-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=rs6000-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+	        ;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+	        ;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sparclite-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=t3e-cray
+		os=-unicos
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	mips)
+		if [ x$os = x-linux-gnu ]; then
+			basic_machine=mips-unknown
+		else
+			basic_machine=mips-mips
+		fi
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sparc | sparcv9)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	c4x*)
+		basic_machine=c4x-none
+		os=-coff
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -macos* | -mpw* | -magic* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-ns2 )
+	        os=-nextstep2
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+        -qnx)
+		os=-qnx4
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+        -*mint | -*MiNT)
+	        os=-mint
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+        *-gould)
+		os=-sysv
+		;;
+        *-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+        *-sgi)
+		os=-irix
+		;;
+        *-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f301-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-vxsim* | -vxworks*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -*MiNT)
+				vendor=atari
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100755
index 0000000..6213354
--- /dev/null
+++ b/configure
@@ -0,0 +1,5905 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir"
+ac_help="$ac_help
+  --disable-nls           do not use Native Language Support"
+ac_help="$ac_help
+  --with-included-gettext use the GNU gettext library included here"
+ac_help="$ac_help
+  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
+  --without-libintl-prefix     don't search for libintl in includedir and libdir"
+ac_help="$ac_help
+  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)"
+ac_help="$ac_help
+  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
+ac_help="$ac_help
+  --disable-gtktest       Do not try to compile and run a test GTK program"
+ac_help="$ac_help
+  --enable-driver         Build user mode driver"
+ac_help="$ac_help
+  --disable-mkiss         Don not use the MKISS driver even if available"
+ac_help="$ac_help
+  --enable-ppuser         Enable PPUSER parport access method"
+ac_help="$ac_help
+  --enable-ppkdrv         Enable Linux Kernel driver parport access method"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=acconfig.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:562: checking for ld used by GCC" >&5
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:592: checking for GNU ld" >&5
+else
+  echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:595: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'acl_cv_path_LD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	test "$with_gnu_ld" != no && break
+      else
+	test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:630: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'acl_cv_prog_gnu_ld'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  acl_cv_prog_gnu_ld=yes
+else
+  acl_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$acl_cv_prog_gnu_ld" 1>&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+#    configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+#    same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+#    as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:694: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:715: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+  case $nonopt in
+  NONE) target_alias=$host_alias ;;
+  *) target_alias=$nonopt ;;
+  esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:733: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:768: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+	  if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:821: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:878: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=baycomepp
+
+VERSION=0.10
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:924: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:937: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:950: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:963: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:976: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:995: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+        echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
+echo "configure:1023: checking for strerror in -lcposix" >&5
+ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lcposix  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1031 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char strerror();
+
+int main() {
+strerror()
+; return 0; }
+EOF
+if { (eval echo configure:1042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIBS="$LIBS -lcposix"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1067: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1097: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+	continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1148: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1180: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1191 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1222: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1227: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1236: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1255: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1290: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX			-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 1306 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+
+int main() {
+
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+
+; return 0; }
+EOF
+if { (eval echo configure:1343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  am_cv_prog_cc_stdc="$ac_arg"; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CC="$ac_save_CC"
+
+fi
+
+if test -z "$am_cv_prog_cc_stdc"; then
+  echo "$ac_t""none needed" 1>&6
+else
+  echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6
+fi
+case "x$am_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1367: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1372 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1421: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1442: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat > conftest.$ac_ext <<EOF
+#line 1449 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+  inline | yes) ;;
+  no) cat >> confdefs.h <<\EOF
+#define inline 
+EOF
+ ;;
+  *)  cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1482: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1497 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1514 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1531 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1537: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1562: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1567 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1575: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1592 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1610 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1631 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1669: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1699: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_DLLTOOL="dlltool"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+  echo "$ac_t""$DLLTOOL" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1729: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AS"; then
+  ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="as"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AS="as"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+  echo "$ac_t""$AS" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1759: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="ar"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AR="ar"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1789: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$WINDRES"; then
+  ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_WINDRES="windres"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="i686-pc-cygwin-windres"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+  echo "$ac_t""$WINDRES" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:1818: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1823 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:1834: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_cygwin=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:1851: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1856 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:1863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mingw32=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:1882: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+  ac_cv_exeext=.exe
+else
+  rm -f conftest*
+  echo 'int main () { return 0; }' > conftest.$ac_ext
+  ac_cv_exeext=
+  if { (eval echo configure:1892: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+    for file in conftest.*; do
+      case $file in
+      *.c | *.o | *.obj) ;;
+      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+      esac
+    done
+  else
+    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+  fi
+  rm -f conftest*
+  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:1913: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:1919: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+if test x$ac_cv_mingw32 != xyes; then
+echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6
+echo "configure:1939: checking for cos in -lm" >&5
+ac_lib_var=`echo m'_'cos | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1947 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char cos();
+
+int main() {
+cos()
+; return 0; }
+EOF
+if { (eval echo configure:1958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lm $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+for ac_hdr in pty.h getopt.h sys/io.h asm/io.h windows.h sched.h sys/perm.h syslog.h sys/socket.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1990: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1995 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2000: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_hdr in net/if.h arpa/inet.h netinet/in.h linux/if.h linux/ax25.h linux/sockios.h linux/soundcard.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2030: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2035 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2040: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in snprintf gettimeofday iopl random syslog vsyslog revoke
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2069: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2074 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in vsnprintf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2124: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2129 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
+fi
+done
+
+
+for ac_func in getopt_long
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2181: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2186 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS getopt.o getopt1.o"
+fi
+done
+
+xlibs=$LIBS
+LIBS=
+echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6
+echo "configure:2237: checking for openpty in -lutil" >&5
+ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lutil  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2245 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char openpty();
+
+int main() {
+openpty()
+; return 0; }
+EOF
+if { (eval echo configure:2256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lutil $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+for ac_func in openpty
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2286: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2291 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ DRVLIBOBJS="$DRVLIBOBJS $LIBS"
+else
+  echo "$ac_t""no" 1>&6
+DRVLIBOBJS="$DRVLIBOBJS openpty.o"
+fi
+done
+
+LIBS=$xlibs
+
+ALL_LINGUAS=""
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+                                                echo $ac_n "checking for shared library run path origin""... $ac_c" 1>&6
+echo "configure:2360: checking for shared library run path origin" >&5
+if eval "test \"`echo '$''{'acl_cv_rpath'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  
+fi
+
+echo "$ac_t""$acl_cv_rpath" 1>&6
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
+
+
+        MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+  
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2397: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:2425: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2430 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_off_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+  cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:2458: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2463 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:2493: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2498 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_header_alloca_h=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:2526: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2531 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_func_alloca_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+  # that cause trouble.  Some versions do not even contain alloca or
+  # contain a buggy version.  If you still want to use their alloca,
+  # use ar to extract alloca.o from them instead of compiling alloca.c.
+  ALLOCA=alloca.${ac_objext}
+  cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2591: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2596 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "webecray" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_os_cray=yes
+else
+  rm -rf conftest*
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2621: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2626 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2649: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+  break
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:2676: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2684 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+  exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:2703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_c_stack_direction=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2728: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2733 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2767: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2772 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2795: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2820: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2828 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+	mmap private not fixed
+	mmap private fixed at somewhere currently unmapped
+	mmap private fixed at somewhere already mapped
+	mmap shared not fixed
+	mmap shared fixed at somewhere currently unmapped
+	mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the filesystem buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propogated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+
+/* Assume that all systems that can run configure have sys/param.h.  */
+# ifndef HAVE_SYS_PARAM_H
+#  define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192	/* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+	char *data, *data2, *data3;
+	int i, pagesize;
+	int fd;
+
+	pagesize = getpagesize();
+
+	/*
+	 * First, make a file with some known garbage in it.
+	 */
+	data = malloc(pagesize);
+	if (!data)
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		*(data + i) = rand();
+	umask(0);
+	fd = creat("conftestmmap", 0600);
+	if (fd < 0)
+		exit(1);
+	if (write(fd, data, pagesize) != pagesize)
+		exit(1);
+	close(fd);
+
+	/*
+	 * Next, try to mmap the file at a fixed address which
+	 * already has something else allocated at it.  If we can,
+	 * also make sure that we see the same garbage.
+	 */
+	fd = open("conftestmmap", O_RDWR);
+	if (fd < 0)
+		exit(1);
+	data2 = malloc(2 * pagesize);
+	if (!data2)
+		exit(1);
+	data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+	if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+	    MAP_PRIVATE | MAP_FIXED, fd, 0L))
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		if (*(data + i) != *(data2 + i))
+			exit(1);
+
+	/*
+	 * Finally, make sure that changes to the mapped area
+	 * do not percolate back to the file as seen by read().
+	 * (This is a bug on some variants of i386 svr4.0.)
+	 */
+	for (i = 0; i < pagesize; ++i)
+		*(data2 + i) = *(data2 + i) + 1;
+	data3 = malloc(pagesize);
+	if (!data3)
+		exit(1);
+	if (read(fd, data3, pagesize) != pagesize)
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		if (*(data + i) != *(data3 + i))
+			exit(1);
+	close(fd);
+	unlink("conftestmmap");
+	exit(0);
+}
+
+EOF
+if { (eval echo configure:2981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+
+    echo $ac_n "checking whether we are using the GNU C Library 2.1 or newer""... $ac_c" 1>&6
+echo "configure:3005: checking whether we are using the GNU C Library 2.1 or newer" >&5
+if eval "test \"`echo '$''{'ac_cv_gnu_library_2_1'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3010 "configure"
+#include "confdefs.h"
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+	
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "Lucky GNU user" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_gnu_library_2_1=yes
+else
+  rm -rf conftest*
+  ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+      
+    
+fi
+
+echo "$ac_t""$ac_cv_gnu_library_2_1" 1>&6
+    
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  
+
+
+    
+    
+  
+
+      
+  
+    use_additional=yes
+  
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+  # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+  withval="$with_libiconv_prefix"
+  
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+              
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "X$found_dir" = "X/usr/lib"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+                      
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+                    
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+                          
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+                          
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+  
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+      
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  echo $ac_n "checking for iconv""... $ac_c" 1>&6
+echo "configure:3425: checking for iconv" >&5
+if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat > conftest.$ac_ext <<EOF
+#line 3433 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int main() {
+iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);
+; return 0; }
+EOF
+if { (eval echo configure:3443: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  am_cv_func_iconv=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat > conftest.$ac_ext <<EOF
+#line 3455 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int main() {
+iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);
+; return 0; }
+EOF
+if { (eval echo configure:3465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+      LIBS="$am_save_LIBS"
+    fi
+  
+fi
+
+echo "$ac_t""$am_cv_func_iconv" 1>&6
+  if test "$am_cv_func_iconv" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_ICONV 1
+EOF
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    echo $ac_n "checking how to link with libiconv""... $ac_c" 1>&6
+echo "configure:3488: checking how to link with libiconv" >&5
+    echo "$ac_t""$LIBICONV" 1>&6
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  
+  
+
+
+      
+    
+        # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3504: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MSGFMT" in
+  /*)
+  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+  ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  echo "$ac_t""$MSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3539: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GMSGFMT" in
+  /*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+  echo "$ac_t""$GMSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+        # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3576: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$XGETTEXT" in
+  /*)
+  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+  ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  echo "$ac_t""$XGETTEXT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    rm -f messages.po
+
+    # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3613: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGMERGE'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MSGMERGE" in
+  /*)
+  ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+	ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+  ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  echo "$ac_t""$MSGMERGE" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+      if test "$GMSGFMT" != ":"; then
+            if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      echo "$ac_t""found $GMSGFMT program is not GNU msgfmt; ignore it" 1>&6
+      GMSGFMT=":"
+    fi
+  fi
+
+      if test "$XGETTEXT" != ":"; then
+            if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+      XGETTEXT=":"
+    fi
+        rm -f messages.po
+  fi
+
+  
+
+
+                            
+  for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:3676: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3681 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+  for ac_func in feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3717: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3722 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3745: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+  
+  
+  if test "$am_cv_func_iconv" = yes; then
+    echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
+echo "configure:3774: checking for iconv declaration" >&5
+    if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+      cat > conftest.$ac_ext <<EOF
+#line 3780 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  am_cv_proto_iconv_arg1=""
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  am_cv_proto_iconv_arg1="const"
+fi
+rm -f conftest*
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    echo "$ac_t""${ac_t:-
+         }$am_cv_proto_iconv" 1>&6
+    cat >> confdefs.h <<EOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+EOF
+
+  fi
+
+  
+  echo $ac_n "checking for nl_langinfo and CODESET""... $ac_c" 1>&6
+echo "configure:3823: checking for nl_langinfo and CODESET" >&5
+if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3828 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int main() {
+char* cs = nl_langinfo(CODESET);
+; return 0; }
+EOF
+if { (eval echo configure:3835: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  am_cv_langinfo_codeset=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  am_cv_langinfo_codeset=no
+fi
+rm -f conftest*
+    
+fi
+
+echo "$ac_t""$am_cv_langinfo_codeset" 1>&6
+  if test $am_cv_langinfo_codeset = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+  fi
+
+  if test $ac_cv_header_locale_h = yes; then
+    echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+echo "configure:3858: checking for LC_MESSAGES" >&5
+if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3863 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int main() {
+return LC_MESSAGES
+; return 0; }
+EOF
+if { (eval echo configure:3870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  am_cv_val_LC_MESSAGES=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
+    if test $am_cv_val_LC_MESSAGES = yes; then
+      cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+    fi
+  fi
+
+                      for ac_prog in bison
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3896: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_INTLBISON'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$INTLBISON"; then
+  ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_INTLBISON="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+INTLBISON="$ac_cv_prog_INTLBISON"
+if test -n "$INTLBISON"; then
+  echo "$ac_t""$INTLBISON" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$INTLBISON" && break
+done
+
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+        echo $ac_n "checking version of bison""... $ac_c" 1>&6
+echo "configure:3929: checking version of bison" >&5
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    echo "$ac_t""$ac_prog_version" 1>&6
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+
+
+    
+  
+  
+  
+
+    
+      
+
+    
+  
+
+  echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:3956: checking whether NLS is requested" >&5
+    # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval="$enable_nls"
+  USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  echo "$ac_t""$USE_NLS" 1>&6
+  
+
+  
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    
+      echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+echo "configure:3980: checking whether included gettext is requested" >&5
+      # Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+  withval="$with_included_gettext"
+  nls_cv_force_use_gnu_gettext=$withval
+else
+  nls_cv_force_use_gnu_gettext=no
+fi
+
+      echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    
+                        
+                
+        
+        
+
+        echo $ac_n "checking for GNU gettext in libc""... $ac_c" 1>&6
+echo "configure:4000: checking for GNU gettext in libc" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4005 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings
+; return 0; }
+EOF
+if { (eval echo configure:4015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  gt_cv_func_gnugettext1_libc=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  gt_cv_func_gnugettext1_libc=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gt_cv_func_gnugettext1_libc" 1>&6
+
+        if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
+                    
+                                                  
+  
+    use_additional=yes
+  
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+  # Check whether --with-libintl-prefix or --without-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then
+  withval="$with_libintl_prefix"
+  
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi
+
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+              
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "X$found_dir" = "X/usr/lib"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+                      
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+                    
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+                          
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+                          
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
+
+          echo $ac_n "checking for GNU gettext in libintl""... $ac_c" 1>&6
+echo "configure:4385: checking for GNU gettext in libintl" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libintl'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat > conftest.$ac_ext <<EOF
+#line 4394 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)
+; return 0; }
+EOF
+if { (eval echo configure:4409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  gt_cv_func_gnugettext1_libintl=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  gt_cv_func_gnugettext1_libintl=no
+fi
+rm -f conftest*
+                        if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat > conftest.$ac_ext <<EOF
+#line 4422 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)
+; return 0; }
+EOF
+if { (eval echo configure:4437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext1_libintl=yes
+               
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
+fi
+
+echo "$ac_t""$gt_cv_func_gnugettext1_libintl" 1>&6
+        fi
+
+                                        if test "$gt_cv_func_gnugettext1_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \
+                && test "$PACKAGE" != gettext; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+                              nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+                INTLOBJS="\$(GETTOBJS)"
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV"
+        LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                CATOBJEXT=.gmo
+      fi
+    
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      cat >> confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
+        echo $ac_n "checking how to link with libintl""... $ac_c" 1>&6
+echo "configure:4503: checking how to link with libintl" >&5
+        echo "$ac_t""$LIBINTL" 1>&6
+        
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
+      
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+      fi
+
+            cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+      cat >> confdefs.h <<\EOF
+#define HAVE_DCGETTEXT 1
+EOF
+
+    fi
+
+        POSUB=po
+  fi
+
+  
+            if test "$PACKAGE" = gettext; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+        
+    
+    
+    
+
+        nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+        DATADIRNAME=share
+    
+
+        INSTOBJEXT=.mo
+    
+
+        GENCAT=gencat
+    
+
+        INTL_LIBTOOL_SUFFIX_PREFIX=
+    
+  
+
+    INTLLIBS="$LIBINTL"
+  
+
+    
+  
+  
+
+
+echo $ac_n "checking for GetSystemTime""... $ac_c" 1>&6
+echo "configure:4578: checking for GetSystemTime" >&5
+getsystemtime=no
+cat > conftest.$ac_ext <<EOF
+#line 4581 "configure"
+#include "confdefs.h"
+#include <windows.h>
+int main() {
+ SYSTEMTIME tm; GetSystemTime(&tm); 
+; return 0; }
+EOF
+if { (eval echo configure:4588: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_GETSYSTEMTIME 1
+EOF
+ getsystemtime=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$getsystemtime" 1>&6
+
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:4603: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4608 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned int
+EOF
+
+fi
+
+
+echo $ac_n "checking for bittypes""... $ac_c" 1>&6
+echo "configure:4637: checking for bittypes" >&5
+bittypes=no
+cat > conftest.$ac_ext <<EOF
+#line 4640 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+ int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f; 
+; return 0; }
+EOF
+if { (eval echo configure:4647: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_BITTYPES 1
+EOF
+ bittypes=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$bittypes" 1>&6
+
+echo $ac_n "checking for IO functions such as inb""... $ac_c" 1>&6
+echo "configure:4661: checking for IO functions such as inb" >&5
+iofuncs=no
+cat > conftest.$ac_ext <<EOF
+#line 4664 "configure"
+#include "confdefs.h"
+#include <sys/io.h>
+int main() {
+ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); 
+; return 0; }
+EOF
+if { (eval echo configure:4671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_IOFUNCS 1
+EOF
+ iofuncs=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat > conftest.$ac_ext <<EOF
+#line 4682 "configure"
+#include "confdefs.h"
+#include <asm/io.h>
+int main() {
+ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); 
+; return 0; }
+EOF
+if { (eval echo configure:4689: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_IOFUNCS 1
+EOF
+ iofuncs=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+echo "$ac_t""$iofuncs" 1>&6
+
+echo $ac_n "checking for M_PI""... $ac_c" 1>&6
+echo "configure:4705: checking for M_PI" >&5
+mpi=no
+cat > conftest.$ac_ext <<EOF
+#line 4708 "configure"
+#include "confdefs.h"
+#include <math.h>
+int main() {
+ double f = M_PI; 
+; return 0; }
+EOF
+if { (eval echo configure:4715: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  mpi=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define M_PI 3.14159265358979323846
+EOF
+
+fi
+rm -f conftest*
+echo "$ac_t""$mpi" 1>&6
+
+echo $ac_n "checking for M_LN10""... $ac_c" 1>&6
+echo "configure:4731: checking for M_LN10" >&5
+mln10=no
+cat > conftest.$ac_ext <<EOF
+#line 4734 "configure"
+#include "confdefs.h"
+#include <math.h>
+int main() {
+ double f = M_LN10; 
+; return 0; }
+EOF
+if { (eval echo configure:4741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  mln10=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define M_LN10 2.30258509299404568402
+EOF
+
+fi
+rm -f conftest*
+echo "$ac_t""$mln10" 1>&6
+
+echo $ac_n "checking for MKISS (N_AX25 line discipline)""... $ac_c" 1>&6
+echo "configure:4757: checking for MKISS (N_AX25 line discipline)" >&5
+mkiss=no
+cat > conftest.$ac_ext <<EOF
+#line 4760 "configure"
+#include "confdefs.h"
+#include <sys/ioctl.h>
+     #ifdef N_AX25
+       yes
+     #endif
+     
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  mkiss=yes
+fi
+rm -f conftest*
+
+echo "$ac_t""$mkiss" 1>&6
+
+echo $ac_n "checking for ifr_newname in struct ifreq""... $ac_c" 1>&6
+echo "configure:4778: checking for ifr_newname in struct ifreq" >&5
+ifrnewname=no
+cat > conftest.$ac_ext <<EOF
+#line 4781 "configure"
+#include "confdefs.h"
+#include <linux/if.h>
+int main() {
+struct ifreq ifr; ifr.ifr_newname[0]=0; 
+; return 0; }
+EOF
+if { (eval echo configure:4788: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_IFRNEWNAME 1
+EOF
+ ifrnewname=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$ifrnewname" 1>&6
+
+if test x$ac_cv_prog_cc_cross = xyes; then
+  gtk=no
+  xlibs="$LIBS"
+  LIBS="$LIBS -L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+  echo $ac_n "checking for gtk_main in -lgtk""... $ac_c" 1>&6
+echo "configure:4806: checking for gtk_main in -lgtk" >&5
+ac_lib_var=`echo gtk'_'gtk_main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lgtk  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4814 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gtk_main();
+
+int main() {
+gtk_main()
+; return 0; }
+EOF
+if { (eval echo configure:4825: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  gtk=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  LIBS="$xlibs"
+  if test x$gtk = xyes; then
+    if test -f /usr/local/cygwin/i686-pc-cygwin/gtk/include/glib.h; then
+      GTK_CFLAGS="-I/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+      GTK_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+      PTHREAD_CFLAGS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+      PTHREAD_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib"
+    fi
+    if test -f /usr/local/cross/i686-pc-cygwin/gtk/include/glib.h; then
+      GTK_CFLAGS="-I/usr/local/cross/i686-pc-cygwin/gtk/include"
+      GTK_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+      PTHREAD_CFLAGS="-L/usr/local/cross/i686-pc-cygwin/gtk/include"
+      PTHREAD_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+    fi
+  fi
+else
+  # Check whether --with-gtk-prefix or --without-gtk-prefix was given.
+if test "${with_gtk_prefix+set}" = set; then
+  withval="$with_gtk_prefix"
+  gtk_config_prefix="$withval"
+else
+  gtk_config_prefix=""
+fi
+
+# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
+if test "${with_gtk_exec_prefix+set}" = set; then
+  withval="$with_gtk_exec_prefix"
+  gtk_config_exec_prefix="$withval"
+else
+  gtk_config_exec_prefix=""
+fi
+
+# Check whether --enable-gtktest or --disable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then
+  enableval="$enable_gtktest"
+  :
+else
+  enable_gtktest=yes
+fi
+
+
+  for module in . 
+  do
+      case "$module" in
+         gthread) 
+             gtk_config_args="$gtk_config_args gthread"
+         ;;
+      esac
+  done
+
+  if test x$gtk_config_exec_prefix != x ; then
+     gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+     fi
+  fi
+  if test x$gtk_config_prefix != x ; then
+     gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+     fi
+  fi
+
+  # Extract the first word of "gtk-config", so it can be a program name with args.
+set dummy gtk-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:4911: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GTK_CONFIG" in
+  /*)
+  ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
+  ;;
+esac
+fi
+GTK_CONFIG="$ac_cv_path_GTK_CONFIG"
+if test -n "$GTK_CONFIG"; then
+  echo "$ac_t""$GTK_CONFIG" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  min_gtk_version=1.2.0
+  echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
+echo "configure:4946: checking for GTK - version >= $min_gtk_version" >&5
+  no_gtk=""
+  if test "$GTK_CONFIG" = "no" ; then
+    no_gtk=yes
+  else
+    GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+    GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+    gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+      rm -f conf.gtktest
+      if test "$cross_compiling" = yes; then
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4969 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.gtktest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If gtk-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+      printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+	   (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+	     GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+        printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+EOF
+if { (eval echo configure:5047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  no_gtk=yes
+fi
+rm -fr conftest*
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     echo "$ac_t""yes" 1>&6
+     gtk=yes     
+  else
+     echo "$ac_t""no" 1>&6
+     if test "$GTK_CONFIG" = "no" ; then
+       echo "*** The gtk-config script installed by GTK could not be found"
+       echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GTK_CONFIG environment variable to the"
+       echo "*** full path to gtk-config."
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK test program, checking why..."
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          cat > conftest.$ac_ext <<EOF
+#line 5081 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int main() {
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); 
+; return 0; }
+EOF
+if { (eval echo configure:5091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK or finding the wrong"
+          echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" 
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+          echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+          echo "*** may want to edit the gtk-config script: $GTK_CONFIG" 
+fi
+rm -f conftest*
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; }
+  fi
+  
+  
+  rm -f conf.gtktest
+
+fi
+
+if test "x${prefix}" = "xNONE"; then
+  cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale"
+EOF
+
+else
+  cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale"
+EOF
+
+fi
+
+if test "x${datadir}" = 'x${prefix}/share'; then
+  if test "x${prefix}" = "xNONE"; then
+    cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}"
+EOF
+
+  else
+    cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}"
+EOF
+
+  fi
+else
+  cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}"
+EOF
+
+fi
+
+packagesrcdir=`cd $srcdir && pwd`
+cat >> confdefs.h <<EOF
+#define PACKAGE_SOURCE_DIR "${packagesrcdir}"
+EOF
+
+
+if test "x$GCC" = "xyes"; then
+  case " $CFLAGS " in
+  *[\ \	]-Wall[\ \	]*) ;;
+  *) CFLAGS="$CFLAGS -Wall" ;;
+  esac
+fi
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+  xcflags="$CFLAGS"
+  CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6"
+  echo $ac_n "checking for DirectX includes""... $ac_c" 1>&6
+echo "configure:5179: checking for DirectX includes" >&5
+  directx=no
+  cat > conftest.$ac_ext <<EOF
+#line 5182 "configure"
+#include "confdefs.h"
+#include <directx.h>
+int main() {
+ LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec; 
+; return 0; }
+EOF
+if { (eval echo configure:5189: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_DIRECTX 1
+EOF
+ directx=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+  echo "$ac_t""$directx" 1>&6
+  CFLAGS="$xcflags"
+fi
+
+# Check whether --enable-driver or --disable-driver was given.
+if test "${enable_driver+set}" = set; then
+  enableval="$enable_driver"
+  case "${enableval}" in
+  yes) baydrv=true ;;
+  no)  baydrv=false ;;
+  *) { echo "configure: error: bad value ${enableval} for --enable-driver" 1>&2; exit 1; } ;;
+esac
+else
+  baydrv=false
+fi
+
+
+# Check whether --enable-mkiss or --disable-mkiss was given.
+if test "${enable_mkiss+set}" = set; then
+  enableval="$enable_mkiss"
+  mkissena=false
+else
+  mkissena=true
+fi
+
+
+if test x$mkiss = xyes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_MKISS 1
+EOF
+
+fi
+
+# Check whether --enable-ppuser or --disable-ppuser was given.
+if test "${enable_ppuser+set}" = set; then
+  enableval="$enable_ppuser"
+  ppuser=true
+else
+  ppuser=false
+fi
+
+
+if test x$ppuser = xtrue; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_PPUSER 1
+EOF
+
+fi
+
+# Check whether --enable-ppkdrv or --disable-ppkdrv was given.
+if test "${enable_ppkdrv+set}" = set; then
+  enableval="$enable_ppkdrv"
+  ppkdrv=true
+else
+  ppkdrv=false
+fi
+
+
+if test x$ppkdrv = xtrue; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_PPKDRV 1
+EOF
+
+fi
+
+
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+  WIN32_TRUE=
+  WIN32_FALSE='#'
+else
+  WIN32_TRUE='#'
+  WIN32_FALSE=
+fi
+
+
+if test x$cross_compiling = xyes; then
+  CROSSCOMP_TRUE=
+  CROSSCOMP_FALSE='#'
+else
+  CROSSCOMP_TRUE='#'
+  CROSSCOMP_FALSE=
+fi
+
+
+if test x$cross_compiling = xno -a x$mkiss = xyes; then
+  BAYCOMDRV_TRUE=
+  BAYCOMDRV_FALSE='#'
+else
+  BAYCOMDRV_TRUE='#'
+  BAYCOMDRV_FALSE=
+fi
+
+
+if test x$gtk = xyes; then
+  HAVEGTK_TRUE=
+  HAVEGTK_FALSE='#'
+else
+  HAVEGTK_TRUE='#'
+  HAVEGTK_FALSE=
+fi
+
+
+if test x$ppuser = xtrue; then
+  PPUSER_TRUE=
+  PPUSER_FALSE='#'
+else
+  PPUSER_TRUE='#'
+  PPUSER_FALSE=
+fi
+
+
+if test x$ppkdrv = xtrue; then
+  PPKDRV_TRUE=
+  PPKDRV_FALSE='#'
+else
+  PPKDRV_TRUE='#'
+  PPKDRV_FALSE=
+fi
+
+
+if test x$directx = xyes; then
+  DIRECTX_TRUE=
+  DIRECTX_FALSE='#'
+else
+  DIRECTX_TRUE='#'
+  DIRECTX_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@RANLIB@%$RANLIB%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@AS@%$AS%g
+s%@AR@%$AR%g
+s%@WINDRES@%$WINDRES%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
+s%@LIBOBJS@%$LIBOBJS%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@MSGMERGE@%$MSGMERGE%g
+s%@ALLOCA@%$ALLOCA%g
+s%@GLIBC21@%$GLIBC21%g
+s%@LIBICONV@%$LIBICONV%g
+s%@LTLIBICONV@%$LTLIBICONV%g
+s%@INTLBISON@%$INTLBISON%g
+s%@USE_NLS@%$USE_NLS%g
+s%@BUILD_INCLUDED_LIBINTL@%$BUILD_INCLUDED_LIBINTL%g
+s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@INTLOBJS@%$INTLOBJS%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@GENCAT@%$GENCAT%g
+s%@INTL_LIBTOOL_SUFFIX_PREFIX@%$INTL_LIBTOOL_SUFFIX_PREFIX%g
+s%@INTLLIBS@%$INTLLIBS%g
+s%@LIBINTL@%$LIBINTL%g
+s%@LTLIBINTL@%$LTLIBINTL%g
+s%@POSUB@%$POSUB%g
+s%@GTK_CONFIG@%$GTK_CONFIG%g
+s%@GTK_CFLAGS@%$GTK_CFLAGS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@WIN32_TRUE@%$WIN32_TRUE%g
+s%@WIN32_FALSE@%$WIN32_FALSE%g
+s%@CROSSCOMP_TRUE@%$CROSSCOMP_TRUE%g
+s%@CROSSCOMP_FALSE@%$CROSSCOMP_FALSE%g
+s%@BAYCOMDRV_TRUE@%$BAYCOMDRV_TRUE%g
+s%@BAYCOMDRV_FALSE@%$BAYCOMDRV_FALSE%g
+s%@HAVEGTK_TRUE@%$HAVEGTK_TRUE%g
+s%@HAVEGTK_FALSE@%$HAVEGTK_FALSE%g
+s%@PPUSER_TRUE@%$PPUSER_TRUE%g
+s%@PPUSER_FALSE@%$PPUSER_FALSE%g
+s%@PPKDRV_TRUE@%$PPKDRV_TRUE%g
+s%@PPKDRV_FALSE@%$PPKDRV_FALSE%g
+s%@DIRECTX_TRUE@%$DIRECTX_TRUE%g
+s%@DIRECTX_FALSE@%$DIRECTX_FALSE%g
+s%@HAVE_MKISS@%$HAVE_MKISS%g
+s%@HAVE_IOFUNCS@%$HAVE_IOFUNCS%g
+s%@HAVE_BITTYPES@%$HAVE_BITTYPES%g
+s%@M_PI@%$M_PI%g
+s%@DRVLIBOBJS@%$DRVLIBOBJS%g
+s%@HAVE_IFRNEWNAME@%$HAVE_IFRNEWNAME%g
+s%@HAVE_PPUSER@%$HAVE_PPUSER%g
+s%@HAVE_PPKDRV@%$HAVE_PPKDRV%g
+s%@HAVE_DIRECTX@%$HAVE_DIRECTX%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='\([ 	]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Capture the value of obsolete $ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+          fi
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..bb2075f
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,245 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(acconfig.h)
+AC_CANONICAL_SYSTEM
+
+AM_INIT_AUTOMAKE(baycomepp, 0.10)
+AM_CONFIG_HEADER(config.h)
+
+dnl AC_CHECK_TOOL()
+
+AC_PROG_MAKE_SET
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+dnl AC_PROG_RANLIB
+AC_C_CONST
+AC_C_INLINE
+AC_HEADER_STDC
+
+AC_CHECK_PROG(RANLIB, ranlib, ranlib, :)
+AC_CHECK_PROG(DLLTOOL, dlltool, dlltool, dlltool)
+AC_CHECK_PROG(AS, as, as, as, as)
+AC_CHECK_PROG(AR, ar, ar, ar, ar)
+AC_CHECK_PROG(WINDRES, windres, windres, i686-pc-cygwin-windres)
+
+AC_CYGWIN
+AC_MINGW32
+AC_EXEEXT
+AC_OBJEXT
+
+if test x$ac_cv_mingw32 != xyes; then
+AC_CHECK_LIB(m,cos)
+fi
+AC_CHECK_HEADERS(pty.h getopt.h sys/io.h asm/io.h windows.h sched.h sys/perm.h syslog.h sys/socket.h)
+AC_CHECK_HEADERS(net/if.h arpa/inet.h netinet/in.h linux/if.h linux/ax25.h linux/sockios.h linux/soundcard.h)
+AC_CHECK_FUNCS(snprintf gettimeofday iopl random syslog vsyslog revoke)
+AC_REPLACE_FUNCS(vsnprintf)
+AC_CHECK_FUNCS(getopt_long,,LIBOBJS="$LIBOBJS getopt.o getopt1.o")
+xlibs=$LIBS
+LIBS=
+AC_CHECK_LIB(util,openpty)
+AC_CHECK_FUNCS(openpty,DRVLIBOBJS="$DRVLIBOBJS $LIBS",DRVLIBOBJS="$DRVLIBOBJS openpty.o")
+LIBS=$xlibs
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+AC_MSG_CHECKING(for GetSystemTime)
+getsystemtime=no
+AC_TRY_COMPILE([#include <windows.h>], 
+     [ SYSTEMTIME tm; GetSystemTime(&tm); ],
+     AC_DEFINE(HAVE_GETSYSTEMTIME) getsystemtime=yes)
+AC_MSG_RESULT($getsystemtime)
+
+dnl AC_CHECK_TYPE(int8_t,char)
+dnl AC_CHECK_TYPE(u_int8_t,unsigned char)
+dnl AC_CHECK_TYPE(int16_t,short)
+dnl AC_CHECK_TYPE(u_int16_t,unsigned short)
+dnl AC_CHECK_TYPE(int32_t,long)
+dnl AC_CHECK_TYPE(u_int32_t,unsigned long)
+
+AC_CHECK_TYPE(size_t,unsigned int)
+
+AC_MSG_CHECKING(for bittypes)
+bittypes=no
+AC_TRY_COMPILE([#include <sys/types.h>], 
+     [ int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f; ],
+     AC_DEFINE(HAVE_BITTYPES) bittypes=yes)
+AC_MSG_RESULT($bittypes)
+
+AC_MSG_CHECKING(for IO functions such as inb, outb)
+iofuncs=no
+AC_TRY_COMPILE([#include <sys/io.h>], 
+     [ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); ],
+     AC_DEFINE(HAVE_IOFUNCS) iofuncs=yes,
+     AC_TRY_COMPILE([#include <asm/io.h>], 
+         [ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); ],
+         AC_DEFINE(HAVE_IOFUNCS) iofuncs=yes))
+AC_MSG_RESULT($iofuncs)
+
+AC_MSG_CHECKING(for M_PI)
+mpi=no
+AC_TRY_COMPILE([#include <math.h>], 
+     [ double f = M_PI; ],
+     mpi=yes,AC_DEFINE(M_PI,3.14159265358979323846))
+AC_MSG_RESULT($mpi)
+
+AC_MSG_CHECKING(for M_LN10)
+mln10=no
+AC_TRY_COMPILE([#include <math.h>], 
+     [ double f = M_LN10; ],
+     mln10=yes,AC_DEFINE(M_LN10,2.30258509299404568402))
+AC_MSG_RESULT($mln10)
+
+AC_MSG_CHECKING(for MKISS (N_AX25 line discipline))
+mkiss=no
+AC_EGREP_CPP(yes,
+     [#include <sys/ioctl.h>
+     #ifdef N_AX25
+       yes
+     #endif
+     ], mkiss=yes)
+AC_MSG_RESULT($mkiss)
+
+AC_MSG_CHECKING(for ifr_newname in struct ifreq)
+ifrnewname=no
+AC_TRY_COMPILE([#include <linux/if.h>],
+     [struct ifreq ifr; ifr.ifr_newname[0]=0; ], AC_DEFINE(HAVE_IFRNEWNAME) ifrnewname=yes)
+AC_MSG_RESULT($ifrnewname)
+
+if test x$ac_cv_prog_cc_cross = xyes; then
+  gtk=no
+  xlibs="$LIBS"
+  LIBS="$LIBS -L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+  AC_CHECK_LIB(gtk,gtk_main,gtk=yes)
+  LIBS="$xlibs"
+  if test x$gtk = xyes; then
+    if test -f /usr/local/cygwin/i686-pc-cygwin/gtk/include/glib.h; then
+      GTK_CFLAGS="-I/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+      GTK_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+      PTHREAD_CFLAGS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+      PTHREAD_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib"
+    fi
+    if test -f /usr/local/cross/i686-pc-cygwin/gtk/include/glib.h; then
+      GTK_CFLAGS="-I/usr/local/cross/i686-pc-cygwin/gtk/include"
+      GTK_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+      PTHREAD_CFLAGS="-L/usr/local/cross/i686-pc-cygwin/gtk/include"
+      PTHREAD_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+    fi
+  fi
+else
+  AM_PATH_GTK(1.2.0,gtk=yes,AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+fi
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+dnl Set PACKAGE_DATA_DIR in config.h.
+if test "x${datadir}" = 'x${prefix}/share'; then
+  if test "x${prefix}" = "xNONE"; then
+    AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
+  else
+    AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
+  fi
+else
+  AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
+fi
+
+dnl Set PACKAGE_SOURCE_DIR in config.h.
+packagesrcdir=`cd $srcdir && pwd`
+AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
+
+dnl Use -Wall if we have gcc.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+  case " $CFLAGS " in
+  *[\ \	]-Wall[\ \	]*) ;;
+  *) CFLAGS="$CFLAGS -Wall" ;;
+  esac
+fi
+changequote([,])dnl
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+  xcflags="$CFLAGS"
+  CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6"
+  AC_MSG_CHECKING(for DirectX includes)
+  directx=no
+  AC_TRY_COMPILE([#include <directx.h>], 
+       [ LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec; ],
+       AC_DEFINE(HAVE_DIRECTX) directx=yes)
+  AC_MSG_RESULT($directx)
+  CFLAGS="$xcflags"
+fi
+
+AC_ARG_ENABLE(driver,
+[  --enable-driver         Build user mode driver],
+[case "${enableval}" in
+  yes) baydrv=true ;;
+  no)  baydrv=false ;;
+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-driver) ;;
+esac],[baydrv=false])
+
+AC_ARG_ENABLE(mkiss,
+[  --disable-mkiss         Don not use the MKISS driver even if available],
+[mkissena=false],[mkissena=true])
+
+if test x$mkiss = xyes; then
+    AC_DEFINE(HAVE_MKISS)
+fi
+
+AC_ARG_ENABLE(ppuser,
+[  --enable-ppuser         Enable PPUSER parport access method],
+[ppuser=true],[ppuser=false])
+
+if test x$ppuser = xtrue; then
+    AC_DEFINE(HAVE_PPUSER)
+fi
+
+AC_ARG_ENABLE(ppkdrv,
+[  --enable-ppkdrv         Enable Linux Kernel driver parport access method],
+[ppkdrv=true],[ppkdrv=false])
+
+if test x$ppkdrv = xtrue; then
+    AC_DEFINE(HAVE_PPKDRV)
+fi
+
+dnl AM_CONDITIONAL(BAYCOMDRV, test x$baydrv = xtrue)
+AM_CONDITIONAL(WIN32, test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes)
+AM_CONDITIONAL(CROSSCOMP, test x$cross_compiling = xyes)
+AM_CONDITIONAL(BAYCOMDRV, test x$cross_compiling = xno -a x$mkiss = xyes)
+AM_CONDITIONAL(HAVEGTK, test x$gtk = xyes)
+AM_CONDITIONAL(PPUSER, test x$ppuser = xtrue)
+AM_CONDITIONAL(PPKDRV, test x$ppkdrv = xtrue)
+AM_CONDITIONAL(DIRECTX, test x$directx = xyes)
+
+AC_SUBST(HAVE_MKISS)
+AC_SUBST(GTK_LIBS)
+AC_SUBST(GTK_CFLAGS)
+AC_SUBST(HAVE_IOFUNCS)
+AC_SUBST(HAVE_BITTYPES)
+AC_SUBST(M_PI)
+AC_SUBST(LIBOBJS)
+AC_SUBST(DRVLIBOBJS)
+AC_SUBST(HAVE_IFRNEWNAME)
+AC_SUBST(HAVE_PPUSER)
+AC_SUBST(HAVE_PPKDRV)
+AC_SUBST(HAVE_DIRECTX)
+AC_OUTPUT([Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile])
diff --git a/directx/Makefile.am b/directx/Makefile.am
new file mode 100644
index 0000000..ac3435f
--- /dev/null
+++ b/directx/Makefile.am
@@ -0,0 +1,27 @@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+if DIRECTX
+BUILT_SOURCES = libddraw.a libdsound.a libdinput.a libdplayx.a
+
+noinst_LIBRARIES = libdinput1.a
+libdinput1_a_SOURCES = dinput.c
+
+endif
+
+libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def
+	for i in ddraw dsound dplayx; do \
+	  $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \
+	done
+
+libdinput.a: libdinput1.a libdinput.def
+	$(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def
+	$(AR) xv libdinput1.a dinput.$(OBJEXT)
+	$(AR) rv $@ dinput.$(OBJEXT)
+	$(RM) -f $<
+
+EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c \
+	fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h
+
+CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a
diff --git a/directx/Makefile.in b/directx/Makefile.in
new file mode 100644
index 0000000..a0e6d60
--- /dev/null
+++ b/directx/Makefile.in
@@ -0,0 +1,334 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+
+ at DIRECTX_TRUE@BUILT_SOURCES = @DIRECTX_TRUE at libddraw.a libdsound.a libdinput.a libdplayx.a
+
+ at DIRECTX_TRUE@noinst_LIBRARIES = @DIRECTX_TRUE at libdinput1.a
+ at DIRECTX_TRUE@libdinput1_a_SOURCES = @DIRECTX_TRUE at dinput.c
+
+EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c \
+	fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h
+
+
+CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libdinput1_a_LIBADD = 
+ at DIRECTX_TRUE@libdinput1_a_OBJECTS =  dinput.$(OBJEXT)
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libdinput1_a_SOURCES)
+OBJECTS = $(libdinput1_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps directx/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libdinput1.a: $(libdinput1_a_OBJECTS) $(libdinput1_a_DEPENDENCIES)
+	-rm -f libdinput1.a
+	$(AR) cru libdinput1.a $(libdinput1_a_OBJECTS) $(libdinput1_a_LIBADD)
+	$(RANLIB) libdinput1.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = directx
+
+distdir: $(DISTFILES)
+	$(mkinstalldirs) $(distdir)/include
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+		mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+		mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+		distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def
+	for i in ddraw dsound dplayx; do \
+	  $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \
+	done
+
+libdinput.a: libdinput1.a libdinput.def
+	$(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def
+	$(AR) xv libdinput1.a dinput.$(OBJEXT)
+	$(AR) rv $@ dinput.$(OBJEXT)
+	$(RM) -f $<
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/directx/deunion.pl b/directx/deunion.pl
new file mode 100755
index 0000000..963ea89
--- /dev/null
+++ b/directx/deunion.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+#
+# Ack!  gcc doesn't support unnamed unions -- we have to fake them.
+#
+# Expected format:
+#
+#struct blah
+#{
+#	union
+#	{
+#		type1 blah1;
+#		type2 blah2;
+#	};
+#}
+
+$lineno = 0;
+$union = 0;
+$ucount = 1;
+while ( ($line = <STDIN>) ) {
+	++$lineno;
+
+	$line =~ s/\r//;
+	if ( $line =~ /\sunion\s/ ) {
+		if ( $union ) {
+			die("Nested union at line $lineno -- Exiting.\n");
+		}
+		$union = 1;
+	}
+	if ( $union ) {
+		if ( $line =~ /}/ ) {
+			if ( $line =~ /};/ ) {
+				chomp($line);
+				$gnuline = $line;
+				$gnuline =~ s/};/} u$ucount;/;
+				$line = 
+"#if defined(NONAMELESSUNION)\n$gnuline\n#else\n$line\n#endif\n";
+				$ucount++;
+			}
+			$union = 0;
+		}
+	} else {
+		if ( $line =~ /^}/ ) {
+			$ucount = 1;
+		}
+	}
+	print $line;
+}
diff --git a/directx/dinput.c b/directx/dinput.c
new file mode 100644
index 0000000..fb1c0b0
--- /dev/null
+++ b/directx/dinput.c
@@ -0,0 +1,338 @@
+
+#include <directx.h>
+
+/*
+ * This file contains experimentally determined values for the c_cfDI*
+ * constants used in DirectX 5.0
+ */
+
+/* Keyboard */
+
+static DIOBJECTDATAFORMAT KBD_fmt[] = {
+	{ &GUID_Key, 0, 0x8000000C, 0x00000000 },
+	{ &GUID_Key, 1, 0x8000010C, 0x00000000 },
+	{ &GUID_Key, 2, 0x8000020C, 0x00000000 },
+	{ &GUID_Key, 3, 0x8000030C, 0x00000000 },
+	{ &GUID_Key, 4, 0x8000040C, 0x00000000 },
+	{ &GUID_Key, 5, 0x8000050C, 0x00000000 },
+	{ &GUID_Key, 6, 0x8000060C, 0x00000000 },
+	{ &GUID_Key, 7, 0x8000070C, 0x00000000 },
+	{ &GUID_Key, 8, 0x8000080C, 0x00000000 },
+	{ &GUID_Key, 9, 0x8000090C, 0x00000000 },
+	{ &GUID_Key, 10, 0x80000A0C, 0x00000000 },
+	{ &GUID_Key, 11, 0x80000B0C, 0x00000000 },
+	{ &GUID_Key, 12, 0x80000C0C, 0x00000000 },
+	{ &GUID_Key, 13, 0x80000D0C, 0x00000000 },
+	{ &GUID_Key, 14, 0x80000E0C, 0x00000000 },
+	{ &GUID_Key, 15, 0x80000F0C, 0x00000000 },
+	{ &GUID_Key, 16, 0x8000100C, 0x00000000 },
+	{ &GUID_Key, 17, 0x8000110C, 0x00000000 },
+	{ &GUID_Key, 18, 0x8000120C, 0x00000000 },
+	{ &GUID_Key, 19, 0x8000130C, 0x00000000 },
+	{ &GUID_Key, 20, 0x8000140C, 0x00000000 },
+	{ &GUID_Key, 21, 0x8000150C, 0x00000000 },
+	{ &GUID_Key, 22, 0x8000160C, 0x00000000 },
+	{ &GUID_Key, 23, 0x8000170C, 0x00000000 },
+	{ &GUID_Key, 24, 0x8000180C, 0x00000000 },
+	{ &GUID_Key, 25, 0x8000190C, 0x00000000 },
+	{ &GUID_Key, 26, 0x80001A0C, 0x00000000 },
+	{ &GUID_Key, 27, 0x80001B0C, 0x00000000 },
+	{ &GUID_Key, 28, 0x80001C0C, 0x00000000 },
+	{ &GUID_Key, 29, 0x80001D0C, 0x00000000 },
+	{ &GUID_Key, 30, 0x80001E0C, 0x00000000 },
+	{ &GUID_Key, 31, 0x80001F0C, 0x00000000 },
+	{ &GUID_Key, 32, 0x8000200C, 0x00000000 },
+	{ &GUID_Key, 33, 0x8000210C, 0x00000000 },
+	{ &GUID_Key, 34, 0x8000220C, 0x00000000 },
+	{ &GUID_Key, 35, 0x8000230C, 0x00000000 },
+	{ &GUID_Key, 36, 0x8000240C, 0x00000000 },
+	{ &GUID_Key, 37, 0x8000250C, 0x00000000 },
+	{ &GUID_Key, 38, 0x8000260C, 0x00000000 },
+	{ &GUID_Key, 39, 0x8000270C, 0x00000000 },
+	{ &GUID_Key, 40, 0x8000280C, 0x00000000 },
+	{ &GUID_Key, 41, 0x8000290C, 0x00000000 },
+	{ &GUID_Key, 42, 0x80002A0C, 0x00000000 },
+	{ &GUID_Key, 43, 0x80002B0C, 0x00000000 },
+	{ &GUID_Key, 44, 0x80002C0C, 0x00000000 },
+	{ &GUID_Key, 45, 0x80002D0C, 0x00000000 },
+	{ &GUID_Key, 46, 0x80002E0C, 0x00000000 },
+	{ &GUID_Key, 47, 0x80002F0C, 0x00000000 },
+	{ &GUID_Key, 48, 0x8000300C, 0x00000000 },
+	{ &GUID_Key, 49, 0x8000310C, 0x00000000 },
+	{ &GUID_Key, 50, 0x8000320C, 0x00000000 },
+	{ &GUID_Key, 51, 0x8000330C, 0x00000000 },
+	{ &GUID_Key, 52, 0x8000340C, 0x00000000 },
+	{ &GUID_Key, 53, 0x8000350C, 0x00000000 },
+	{ &GUID_Key, 54, 0x8000360C, 0x00000000 },
+	{ &GUID_Key, 55, 0x8000370C, 0x00000000 },
+	{ &GUID_Key, 56, 0x8000380C, 0x00000000 },
+	{ &GUID_Key, 57, 0x8000390C, 0x00000000 },
+	{ &GUID_Key, 58, 0x80003A0C, 0x00000000 },
+	{ &GUID_Key, 59, 0x80003B0C, 0x00000000 },
+	{ &GUID_Key, 60, 0x80003C0C, 0x00000000 },
+	{ &GUID_Key, 61, 0x80003D0C, 0x00000000 },
+	{ &GUID_Key, 62, 0x80003E0C, 0x00000000 },
+	{ &GUID_Key, 63, 0x80003F0C, 0x00000000 },
+	{ &GUID_Key, 64, 0x8000400C, 0x00000000 },
+	{ &GUID_Key, 65, 0x8000410C, 0x00000000 },
+	{ &GUID_Key, 66, 0x8000420C, 0x00000000 },
+	{ &GUID_Key, 67, 0x8000430C, 0x00000000 },
+	{ &GUID_Key, 68, 0x8000440C, 0x00000000 },
+	{ &GUID_Key, 69, 0x8000450C, 0x00000000 },
+	{ &GUID_Key, 70, 0x8000460C, 0x00000000 },
+	{ &GUID_Key, 71, 0x8000470C, 0x00000000 },
+	{ &GUID_Key, 72, 0x8000480C, 0x00000000 },
+	{ &GUID_Key, 73, 0x8000490C, 0x00000000 },
+	{ &GUID_Key, 74, 0x80004A0C, 0x00000000 },
+	{ &GUID_Key, 75, 0x80004B0C, 0x00000000 },
+	{ &GUID_Key, 76, 0x80004C0C, 0x00000000 },
+	{ &GUID_Key, 77, 0x80004D0C, 0x00000000 },
+	{ &GUID_Key, 78, 0x80004E0C, 0x00000000 },
+	{ &GUID_Key, 79, 0x80004F0C, 0x00000000 },
+	{ &GUID_Key, 80, 0x8000500C, 0x00000000 },
+	{ &GUID_Key, 81, 0x8000510C, 0x00000000 },
+	{ &GUID_Key, 82, 0x8000520C, 0x00000000 },
+	{ &GUID_Key, 83, 0x8000530C, 0x00000000 },
+	{ &GUID_Key, 84, 0x8000540C, 0x00000000 },
+	{ &GUID_Key, 85, 0x8000550C, 0x00000000 },
+	{ &GUID_Key, 86, 0x8000560C, 0x00000000 },
+	{ &GUID_Key, 87, 0x8000570C, 0x00000000 },
+	{ &GUID_Key, 88, 0x8000580C, 0x00000000 },
+	{ &GUID_Key, 89, 0x8000590C, 0x00000000 },
+	{ &GUID_Key, 90, 0x80005A0C, 0x00000000 },
+	{ &GUID_Key, 91, 0x80005B0C, 0x00000000 },
+	{ &GUID_Key, 92, 0x80005C0C, 0x00000000 },
+	{ &GUID_Key, 93, 0x80005D0C, 0x00000000 },
+	{ &GUID_Key, 94, 0x80005E0C, 0x00000000 },
+	{ &GUID_Key, 95, 0x80005F0C, 0x00000000 },
+	{ &GUID_Key, 96, 0x8000600C, 0x00000000 },
+	{ &GUID_Key, 97, 0x8000610C, 0x00000000 },
+	{ &GUID_Key, 98, 0x8000620C, 0x00000000 },
+	{ &GUID_Key, 99, 0x8000630C, 0x00000000 },
+	{ &GUID_Key, 100, 0x8000640C, 0x00000000 },
+	{ &GUID_Key, 101, 0x8000650C, 0x00000000 },
+	{ &GUID_Key, 102, 0x8000660C, 0x00000000 },
+	{ &GUID_Key, 103, 0x8000670C, 0x00000000 },
+	{ &GUID_Key, 104, 0x8000680C, 0x00000000 },
+	{ &GUID_Key, 105, 0x8000690C, 0x00000000 },
+	{ &GUID_Key, 106, 0x80006A0C, 0x00000000 },
+	{ &GUID_Key, 107, 0x80006B0C, 0x00000000 },
+	{ &GUID_Key, 108, 0x80006C0C, 0x00000000 },
+	{ &GUID_Key, 109, 0x80006D0C, 0x00000000 },
+	{ &GUID_Key, 110, 0x80006E0C, 0x00000000 },
+	{ &GUID_Key, 111, 0x80006F0C, 0x00000000 },
+	{ &GUID_Key, 112, 0x8000700C, 0x00000000 },
+	{ &GUID_Key, 113, 0x8000710C, 0x00000000 },
+	{ &GUID_Key, 114, 0x8000720C, 0x00000000 },
+	{ &GUID_Key, 115, 0x8000730C, 0x00000000 },
+	{ &GUID_Key, 116, 0x8000740C, 0x00000000 },
+	{ &GUID_Key, 117, 0x8000750C, 0x00000000 },
+	{ &GUID_Key, 118, 0x8000760C, 0x00000000 },
+	{ &GUID_Key, 119, 0x8000770C, 0x00000000 },
+	{ &GUID_Key, 120, 0x8000780C, 0x00000000 },
+	{ &GUID_Key, 121, 0x8000790C, 0x00000000 },
+	{ &GUID_Key, 122, 0x80007A0C, 0x00000000 },
+	{ &GUID_Key, 123, 0x80007B0C, 0x00000000 },
+	{ &GUID_Key, 124, 0x80007C0C, 0x00000000 },
+	{ &GUID_Key, 125, 0x80007D0C, 0x00000000 },
+	{ &GUID_Key, 126, 0x80007E0C, 0x00000000 },
+	{ &GUID_Key, 127, 0x80007F0C, 0x00000000 },
+	{ &GUID_Key, 128, 0x8000800C, 0x00000000 },
+	{ &GUID_Key, 129, 0x8000810C, 0x00000000 },
+	{ &GUID_Key, 130, 0x8000820C, 0x00000000 },
+	{ &GUID_Key, 131, 0x8000830C, 0x00000000 },
+	{ &GUID_Key, 132, 0x8000840C, 0x00000000 },
+	{ &GUID_Key, 133, 0x8000850C, 0x00000000 },
+	{ &GUID_Key, 134, 0x8000860C, 0x00000000 },
+	{ &GUID_Key, 135, 0x8000870C, 0x00000000 },
+	{ &GUID_Key, 136, 0x8000880C, 0x00000000 },
+	{ &GUID_Key, 137, 0x8000890C, 0x00000000 },
+	{ &GUID_Key, 138, 0x80008A0C, 0x00000000 },
+	{ &GUID_Key, 139, 0x80008B0C, 0x00000000 },
+	{ &GUID_Key, 140, 0x80008C0C, 0x00000000 },
+	{ &GUID_Key, 141, 0x80008D0C, 0x00000000 },
+	{ &GUID_Key, 142, 0x80008E0C, 0x00000000 },
+	{ &GUID_Key, 143, 0x80008F0C, 0x00000000 },
+	{ &GUID_Key, 144, 0x8000900C, 0x00000000 },
+	{ &GUID_Key, 145, 0x8000910C, 0x00000000 },
+	{ &GUID_Key, 146, 0x8000920C, 0x00000000 },
+	{ &GUID_Key, 147, 0x8000930C, 0x00000000 },
+	{ &GUID_Key, 148, 0x8000940C, 0x00000000 },
+	{ &GUID_Key, 149, 0x8000950C, 0x00000000 },
+	{ &GUID_Key, 150, 0x8000960C, 0x00000000 },
+	{ &GUID_Key, 151, 0x8000970C, 0x00000000 },
+	{ &GUID_Key, 152, 0x8000980C, 0x00000000 },
+	{ &GUID_Key, 153, 0x8000990C, 0x00000000 },
+	{ &GUID_Key, 154, 0x80009A0C, 0x00000000 },
+	{ &GUID_Key, 155, 0x80009B0C, 0x00000000 },
+	{ &GUID_Key, 156, 0x80009C0C, 0x00000000 },
+	{ &GUID_Key, 157, 0x80009D0C, 0x00000000 },
+	{ &GUID_Key, 158, 0x80009E0C, 0x00000000 },
+	{ &GUID_Key, 159, 0x80009F0C, 0x00000000 },
+	{ &GUID_Key, 160, 0x8000A00C, 0x00000000 },
+	{ &GUID_Key, 161, 0x8000A10C, 0x00000000 },
+	{ &GUID_Key, 162, 0x8000A20C, 0x00000000 },
+	{ &GUID_Key, 163, 0x8000A30C, 0x00000000 },
+	{ &GUID_Key, 164, 0x8000A40C, 0x00000000 },
+	{ &GUID_Key, 165, 0x8000A50C, 0x00000000 },
+	{ &GUID_Key, 166, 0x8000A60C, 0x00000000 },
+	{ &GUID_Key, 167, 0x8000A70C, 0x00000000 },
+	{ &GUID_Key, 168, 0x8000A80C, 0x00000000 },
+	{ &GUID_Key, 169, 0x8000A90C, 0x00000000 },
+	{ &GUID_Key, 170, 0x8000AA0C, 0x00000000 },
+	{ &GUID_Key, 171, 0x8000AB0C, 0x00000000 },
+	{ &GUID_Key, 172, 0x8000AC0C, 0x00000000 },
+	{ &GUID_Key, 173, 0x8000AD0C, 0x00000000 },
+	{ &GUID_Key, 174, 0x8000AE0C, 0x00000000 },
+	{ &GUID_Key, 175, 0x8000AF0C, 0x00000000 },
+	{ &GUID_Key, 176, 0x8000B00C, 0x00000000 },
+	{ &GUID_Key, 177, 0x8000B10C, 0x00000000 },
+	{ &GUID_Key, 178, 0x8000B20C, 0x00000000 },
+	{ &GUID_Key, 179, 0x8000B30C, 0x00000000 },
+	{ &GUID_Key, 180, 0x8000B40C, 0x00000000 },
+	{ &GUID_Key, 181, 0x8000B50C, 0x00000000 },
+	{ &GUID_Key, 182, 0x8000B60C, 0x00000000 },
+	{ &GUID_Key, 183, 0x8000B70C, 0x00000000 },
+	{ &GUID_Key, 184, 0x8000B80C, 0x00000000 },
+	{ &GUID_Key, 185, 0x8000B90C, 0x00000000 },
+	{ &GUID_Key, 186, 0x8000BA0C, 0x00000000 },
+	{ &GUID_Key, 187, 0x8000BB0C, 0x00000000 },
+	{ &GUID_Key, 188, 0x8000BC0C, 0x00000000 },
+	{ &GUID_Key, 189, 0x8000BD0C, 0x00000000 },
+	{ &GUID_Key, 190, 0x8000BE0C, 0x00000000 },
+	{ &GUID_Key, 191, 0x8000BF0C, 0x00000000 },
+	{ &GUID_Key, 192, 0x8000C00C, 0x00000000 },
+	{ &GUID_Key, 193, 0x8000C10C, 0x00000000 },
+	{ &GUID_Key, 194, 0x8000C20C, 0x00000000 },
+	{ &GUID_Key, 195, 0x8000C30C, 0x00000000 },
+	{ &GUID_Key, 196, 0x8000C40C, 0x00000000 },
+	{ &GUID_Key, 197, 0x8000C50C, 0x00000000 },
+	{ &GUID_Key, 198, 0x8000C60C, 0x00000000 },
+	{ &GUID_Key, 199, 0x8000C70C, 0x00000000 },
+	{ &GUID_Key, 200, 0x8000C80C, 0x00000000 },
+	{ &GUID_Key, 201, 0x8000C90C, 0x00000000 },
+	{ &GUID_Key, 202, 0x8000CA0C, 0x00000000 },
+	{ &GUID_Key, 203, 0x8000CB0C, 0x00000000 },
+	{ &GUID_Key, 204, 0x8000CC0C, 0x00000000 },
+	{ &GUID_Key, 205, 0x8000CD0C, 0x00000000 },
+	{ &GUID_Key, 206, 0x8000CE0C, 0x00000000 },
+	{ &GUID_Key, 207, 0x8000CF0C, 0x00000000 },
+	{ &GUID_Key, 208, 0x8000D00C, 0x00000000 },
+	{ &GUID_Key, 209, 0x8000D10C, 0x00000000 },
+	{ &GUID_Key, 210, 0x8000D20C, 0x00000000 },
+	{ &GUID_Key, 211, 0x8000D30C, 0x00000000 },
+	{ &GUID_Key, 212, 0x8000D40C, 0x00000000 },
+	{ &GUID_Key, 213, 0x8000D50C, 0x00000000 },
+	{ &GUID_Key, 214, 0x8000D60C, 0x00000000 },
+	{ &GUID_Key, 215, 0x8000D70C, 0x00000000 },
+	{ &GUID_Key, 216, 0x8000D80C, 0x00000000 },
+	{ &GUID_Key, 217, 0x8000D90C, 0x00000000 },
+	{ &GUID_Key, 218, 0x8000DA0C, 0x00000000 },
+	{ &GUID_Key, 219, 0x8000DB0C, 0x00000000 },
+	{ &GUID_Key, 220, 0x8000DC0C, 0x00000000 },
+	{ &GUID_Key, 221, 0x8000DD0C, 0x00000000 },
+	{ &GUID_Key, 222, 0x8000DE0C, 0x00000000 },
+	{ &GUID_Key, 223, 0x8000DF0C, 0x00000000 },
+	{ &GUID_Key, 224, 0x8000E00C, 0x00000000 },
+	{ &GUID_Key, 225, 0x8000E10C, 0x00000000 },
+	{ &GUID_Key, 226, 0x8000E20C, 0x00000000 },
+	{ &GUID_Key, 227, 0x8000E30C, 0x00000000 },
+	{ &GUID_Key, 228, 0x8000E40C, 0x00000000 },
+	{ &GUID_Key, 229, 0x8000E50C, 0x00000000 },
+	{ &GUID_Key, 230, 0x8000E60C, 0x00000000 },
+	{ &GUID_Key, 231, 0x8000E70C, 0x00000000 },
+	{ &GUID_Key, 232, 0x8000E80C, 0x00000000 },
+	{ &GUID_Key, 233, 0x8000E90C, 0x00000000 },
+	{ &GUID_Key, 234, 0x8000EA0C, 0x00000000 },
+	{ &GUID_Key, 235, 0x8000EB0C, 0x00000000 },
+	{ &GUID_Key, 236, 0x8000EC0C, 0x00000000 },
+	{ &GUID_Key, 237, 0x8000ED0C, 0x00000000 },
+	{ &GUID_Key, 238, 0x8000EE0C, 0x00000000 },
+	{ &GUID_Key, 239, 0x8000EF0C, 0x00000000 },
+	{ &GUID_Key, 240, 0x8000F00C, 0x00000000 },
+	{ &GUID_Key, 241, 0x8000F10C, 0x00000000 },
+	{ &GUID_Key, 242, 0x8000F20C, 0x00000000 },
+	{ &GUID_Key, 243, 0x8000F30C, 0x00000000 },
+	{ &GUID_Key, 244, 0x8000F40C, 0x00000000 },
+	{ &GUID_Key, 245, 0x8000F50C, 0x00000000 },
+	{ &GUID_Key, 246, 0x8000F60C, 0x00000000 },
+	{ &GUID_Key, 247, 0x8000F70C, 0x00000000 },
+	{ &GUID_Key, 248, 0x8000F80C, 0x00000000 },
+	{ &GUID_Key, 249, 0x8000F90C, 0x00000000 },
+	{ &GUID_Key, 250, 0x8000FA0C, 0x00000000 },
+	{ &GUID_Key, 251, 0x8000FB0C, 0x00000000 },
+	{ &GUID_Key, 252, 0x8000FC0C, 0x00000000 },
+	{ &GUID_Key, 253, 0x8000FD0C, 0x00000000 },
+	{ &GUID_Key, 254, 0x8000FE0C, 0x00000000 },
+	{ &GUID_Key, 255, 0x8000FF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt };
+
+
+/* Mouse */
+
+static DIOBJECTDATAFORMAT PTR_fmt[] = {
+	{ &GUID_XAxis, 0, 0x00FFFF03, 0x00000000 },
+	{ &GUID_YAxis, 4, 0x00FFFF03, 0x00000000 },
+	{ &GUID_ZAxis, 8, 0x80FFFF03, 0x00000000 },
+	{ NULL, 12, 0x00FFFF0C, 0x00000000 },
+	{ NULL, 13, 0x00FFFF0C, 0x00000000 },
+	{ NULL, 14, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 15, 0x80FFFF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt };
+
+
+/* Joystick */
+
+static DIOBJECTDATAFORMAT JOY_fmt[] = {
+	{ &GUID_XAxis, 0, 0x80FFFF03, 0x00000100 },
+	{ &GUID_YAxis, 4, 0x80FFFF03, 0x00000100 },
+	{ &GUID_ZAxis, 8, 0x80FFFF03, 0x00000100 },
+	{ &GUID_RxAxis, 12, 0x80FFFF03, 0x00000100 },
+	{ &GUID_RyAxis, 16, 0x80FFFF03, 0x00000100 },
+	{ &GUID_RzAxis, 20, 0x80FFFF03, 0x00000100 },
+	{ &GUID_Slider, 24, 0x80FFFF03, 0x00000100 },
+	{ &GUID_Slider, 28, 0x80FFFF03, 0x00000100 },
+	{ &GUID_POV, 32, 0x80FFFF10, 0x00000000 },
+	{ &GUID_POV, 36, 0x80FFFF10, 0x00000000 },
+	{ &GUID_POV, 40, 0x80FFFF10, 0x00000000 },
+	{ &GUID_POV, 44, 0x80FFFF10, 0x00000000 },
+	{ NULL, 48, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 49, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 50, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 51, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 52, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 53, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 54, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 55, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 56, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 57, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 58, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 59, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 60, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 61, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 62, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 63, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 64, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 65, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 66, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 67, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 68, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 69, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 70, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 71, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 72, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 73, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 74, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 75, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 76, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 77, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 78, 0x80FFFF0C, 0x00000000 },
+	{ NULL, 79, 0x80FFFF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt };
+
diff --git a/directx/fixdirectx.sh b/directx/fixdirectx.sh
new file mode 100755
index 0000000..beed18b
--- /dev/null
+++ b/directx/fixdirectx.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# A script to fix the DirectX includes so that gcc can compile them...
+
+#cd `dirname $0`
+for file in include/directx6/*.h
+do echo "Stripping $file..."
+   tr -d '\r' <$file >$file.new && mv $file.new $file
+done
+
+# Fix the few remaining headers that have anonymous unions
+for file in include/directx6/d3dtypes.h
+do if [ -f $file ]; then
+     echo "Fixing $file..."
+     perl ./deunion.pl <$file >$file.new && mv $file.new $file
+   fi
+done
diff --git a/directx/include/directx.h b/directx/include/directx.h
new file mode 100644
index 0000000..cf31b01
--- /dev/null
+++ b/directx/include/directx.h
@@ -0,0 +1,79 @@
+
+#ifndef _directx_h_
+#define _directx_h
+
+/* Include all of the DirectX 5.0 headers and adds any necessary tweaks */
+
+#include <windows.h>
+#include <mmsystem.h>
+#ifndef WIN32
+#define WIN32
+#endif
+#undef  WINNT
+
+/* Far pointers don't exist in 32-bit code */
+#ifndef FAR
+#define FAR
+#endif
+
+/* Error codes not yet included in Win32 API header files */
+#ifndef MAKE_HRESULT
+#define MAKE_HRESULT(sev,fac,code) \
+	((HRESULT)(((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))
+#endif
+
+#ifndef S_OK
+#define S_OK		(HRESULT)0x00000000L
+#endif
+
+#ifndef SUCCEEDED
+#define SUCCEEDED(x)	((HRESULT)(x) >= 0)
+#endif
+#ifndef FAILED
+#define FAILED(x)	((HRESULT)(x)<0)
+#endif
+
+#ifndef E_FAIL
+#define E_FAIL		(HRESULT)0x80000008L
+#endif
+#ifndef E_NOINTERFACE
+#define E_NOINTERFACE	(HRESULT)0x80004002L
+#endif
+#ifndef E_OUTOFMEMORY
+#define E_OUTOFMEMORY	(HRESULT)0x8007000EL
+#endif
+#ifndef E_INVALIDARG
+#define E_INVALIDARG	(HRESULT)0x80070057L
+#endif
+#ifndef E_NOTIMPL
+#define E_NOTIMPL	(HRESULT)0x80004001L
+#endif
+#ifndef REGDB_E_CLASSNOTREG
+#define REGDB_E_CLASSNOTREG	(HRESULT)0x80040154L
+#endif
+
+/* Severity codes */
+#ifndef SEVERITY_ERROR
+#define SEVERITY_ERROR	1
+#endif
+
+/* Error facility codes */
+#ifndef FACILITY_WIN32
+#define FACILITY_WIN32	7
+#endif
+
+#ifndef FIELD_OFFSET
+#define FIELD_OFFSET(type, field)    ((LONG)&(((type *)0)->field))
+#endif
+
+/* DirectX 6.0 header includes
+   (if it isn't included, I haven't tested it yet)
+ */
+#ifdef __GNUC__
+#define NONAMELESSUNION
+#endif
+#include <ddraw.h>
+#include <dsound.h>
+#include <dinput.h>
+
+#endif /* _directx_h */
diff --git a/directx/include/mmsystem.h b/directx/include/mmsystem.h
new file mode 100644
index 0000000..6ad2933
--- /dev/null
+++ b/directx/include/mmsystem.h
@@ -0,0 +1,236 @@
+
+#ifndef _mmsystem_h
+#define _mmsystem_h
+
+/* Multimedia header file 
+    -- not really part of DirectX, but not included in the Win32 API headers.
+*/
+
+/* Result code definition */
+typedef UINT MMRESULT;
+typedef DWORD MCIERROR;
+
+/* Various error values */
+#define MAXERRORLENGTH		256	/* Maximum length of error message */
+#define MMSYSERR_NOERROR	0
+#define TIMERR_NOERROR		MMSYSERR_NOERROR
+#define TIMERR_NOCANDO		97
+
+/* Wave out device handle */
+typedef HANDLE HWAVEOUT;
+
+/* MCI device handle */
+typedef UINT MCIDEVICEID;
+
+/* Have the system choose a wave device */
+#define WAVE_MAPPER	((UINT)-1)
+
+/* Specify the type of wave event callback */
+#define CALLBACK_FUNCTION	0x00030000
+#define CALLBACK_EVENT		0x00050000
+
+/* Messages sent to the waveOut callback function */
+#define WOM_DONE	0x3BD
+
+/* The wave buffer header used by waveOut functions */
+typedef struct WAVEHDR {
+	LPSTR	lpData;
+	DWORD	dwBufferLength;
+	DWORD	dwBytesRecorded;
+	DWORD	dwUser;
+	DWORD	dwFlags;
+	DWORD	dwLoops;
+	struct WAVEHDR *lpNext;
+	DWORD	reserved;
+} WAVEHDR;
+
+/* WAVEHDR.dwFlags */
+#define WHDR_DONE	0x00000001
+#define WHDR_BEGINLOOP	0x00000004
+#define WHDR_ENDLOOP	0x00000008
+#define WHDR_INQUEUE	0x00000010
+
+/* Structure used in querying the capabilities of a wave device */
+typedef struct {
+	WORD	wMid;
+	WORD	wPid;
+	UINT	vDriverVersion;
+	CHAR	szPname[32];
+	DWORD	dwFormats;
+	WORD	wReserved1;
+	DWORD	dwSupport;
+} WAVEOUTCAPS;
+
+/* The only kind of sound data we handle here */
+#define WAVE_FORMAT_PCM	1
+
+/* Old wave format structure */
+typedef struct {
+	WORD    wFormatTag;
+	WORD    nChannels;
+	DWORD   nSamplesPerSec;
+	DWORD   nAvgBytesPerSec;
+	WORD    nBlockAlign;
+} WAVEFORMAT, *LPWAVEFORMAT;
+
+/* PCM wave format structure */
+typedef struct {
+	WAVEFORMAT  wf;
+	WORD        wBitsPerSample;
+} PCMWAVEFORMAT;
+
+/* Wave format structure (used by dsound.h) */
+typedef struct {
+	WORD  wFormatTag;
+	WORD  nChannels;
+	DWORD nSamplesPerSec;
+	DWORD nAvgBytesPerSec;
+	WORD  nBlockAlign;
+	WORD  wBitsPerSample;
+	WORD  cbSize;
+} WAVEFORMATEX, *LPWAVEFORMATEX;
+
+/* Constants used as arguments and flags to mciSendCommand() */
+
+/* CD device type */
+#define MCI_STRING_OFFSET	512
+#define MCI_DEVTYPE_CD_AUDIO	(MCI_STRING_OFFSET + 4)
+
+/* MCI commands */
+#define MCI_OPEN	0x0803
+#define MCI_CLOSE	0x0804
+#define MCI_PLAY	0x0806
+#define MCI_STOP	0x0808
+#define MCI_PAUSE	0x0809
+#define MCI_SET		0x080D
+#define MCI_STATUS	0x0814
+#define MCI_RESUME	0x0855
+
+/* Flags for MCI commands */
+#define MCI_NOTIFY			0x00000001
+#define MCI_WAIT			0x00000002
+#define MCI_FROM			0x00000004
+#define MCI_TO				0x00000008
+#define MCI_TRACK			0x00000010
+
+/* Flags for MCI Play command */
+#define MCI_OPEN_SHAREABLE		0x00000100
+#define MCI_OPEN_ELEMENT		0x00000200
+#define MCI_OPEN_TYPE_ID		0x00001000
+#define MCI_OPEN_TYPE			0x00002000
+
+/* Flags for MCI Status command */
+#define MCI_STATUS_ITEM			0x00000100
+#define MCI_STATUS_LENGTH		0x00000001
+#define MCI_STATUS_POSITION		0x00000002
+#define MCI_STATUS_NUMBER_OF_TRACKS	0x00000003
+#define MCI_STATUS_MODE			0x00000004
+#define MCI_STATUS_MEDIA_PRESENT	0x00000005
+#define MCI_STATUS_TIME_FORMAT		0x00000006
+#define MCI_STATUS_READY		0x00000007
+#define MCI_STATUS_CURRENT_TRACK	0x00000008
+
+/* Flags for MCI Set command */
+#define MCI_SET_DOOR_OPEN		0x00000100
+#define MCI_SET_DOOR_CLOSED		0x00000200
+#define MCI_SET_TIME_FORMAT		0x00000400
+
+/* MCI device status flags */
+#define MCI_MODE_NOT_READY	(MCI_STRING_OFFSET + 12)
+#define MCI_MODE_STOP		(MCI_STRING_OFFSET + 13)
+#define MCI_MODE_PLAY		(MCI_STRING_OFFSET + 14)
+#define MCI_MODE_RECORD		(MCI_STRING_OFFSET + 15)
+#define MCI_MODE_SEEK		(MCI_STRING_OFFSET + 16)
+#define MCI_MODE_PAUSE		(MCI_STRING_OFFSET + 17)
+#define MCI_MODE_OPEN		(MCI_STRING_OFFSET + 18)
+
+
+/* Constants used to specify MCI time formats */
+#define MCI_FORMAT_MILLISECONDS	0
+#define MCI_FORMAT_HMS		1
+#define MCI_FORMAT_MSF		2
+#define MCI_FORMAT_FRAMES	3
+#define MCI_FORMAT_BYTES	8
+#define MCI_FORMAT_SAMPLES	9
+#define MCI_FORMAT_TMSF		10
+
+#define MCI_MSF_MINUTE(msf)	((BYTE)(msf))
+#define MCI_MSF_SECOND(msf)	((BYTE)(((WORD)(msf)) >> 8))
+#define MCI_MSF_FRAME(msf)	((BYTE)((msf)>>16))
+
+#define MCI_MAKE_MSF(m, s, f)	\
+	((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16)))
+
+
+/* Structures passed as arguments to mciSendCommand() */
+typedef struct {
+	DWORD  dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCSTR lpstrDeviceType;
+	LPCSTR lpstrElementName;
+	LPCSTR lpstrAlias;
+} MCI_OPEN_PARMS;
+
+typedef struct {
+	DWORD dwCallback;
+	DWORD dwTimeFormat;
+	DWORD dwAudio;
+} MCI_SET_PARMS;
+
+typedef struct {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+} MCI_PLAY_PARMS;
+
+typedef struct {
+	DWORD dwCallback;
+	DWORD dwReturn;
+	DWORD dwItem;
+	DWORD dwTrack;
+} MCI_STATUS_PARMS;
+
+/* Convert a string to a 4 byte multimedia code */
+#ifndef mmioFOURCC
+#define mmioFOURCC(c0, c1, c2, c3)	\
+	((DWORD)(c0)|((DWORD)(c1)<<8)|((DWORD)(c2)<<16)|((DWORD)(c3)<<24))
+#endif
+
+/* timer callback function prototype */
+typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+/* What type of timer to set */
+#define TIME_ONESHOT    0x0000   /* program timer for single event */
+#define TIME_PERIODIC   0x0001   /* program for continuous periodic event */
+
+
+/* Multimedia timer function declarations */
+extern MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution,
+			TIMECALLBACK *fptc, DWORD dwUser, UINT fuEvent);
+extern MMRESULT WINAPI timeKillEvent(UINT uTimerID);
+extern MMRESULT WINAPI timeBeginPeriod(UINT uPeriod);
+extern MMRESULT WINAPI timeEndPeriod(UINT uPeriod);
+
+/* The waveOut* function declarations */
+extern MMRESULT WINAPI waveOutOpen(HWAVEOUT *phwo, UINT uDeviceID,
+	WAVEFORMATEX *pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
+extern MMRESULT WINAPI waveOutClose(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutPause(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutRestart(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutReset(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT hwo);
+#define waveOutGetDevCaps	waveOutGetDevCapsA
+extern MMRESULT WINAPI waveOutGetDevCapsA(UINT uDeviceID, WAVEOUTCAPS *pwoc, UINT cbwoc);
+#define waveOutGetErrorText	waveOutGetErrorTextA
+extern MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
+
+/* The MCI command interface */
+#define mciSendCommand		mciSendCommandA
+extern MCIERROR WINAPI mciSendCommandA(MCIDEVICEID mciId, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
+#define mciGetErrorString	mciGetErrorStringA
+extern int WINAPI mciGetErrorStringA(DWORD hErr, LPCSTR lpBuf, DWORD dwLen);
+
+#endif /* _mmsystem_h */
diff --git a/directx/libddraw.def b/directx/libddraw.def
new file mode 100644
index 0000000..5df0c3a
--- /dev/null
+++ b/directx/libddraw.def
@@ -0,0 +1,3 @@
+EXPORTS
+	DirectDrawCreate at 12
+	DirectDrawEnumerateA at 8
diff --git a/directx/libdinput.def b/directx/libdinput.def
new file mode 100644
index 0000000..f2f3f67
--- /dev/null
+++ b/directx/libdinput.def
@@ -0,0 +1,2 @@
+EXPORTS
+	DirectInputCreateA at 16
diff --git a/directx/libdplayx.def b/directx/libdplayx.def
new file mode 100644
index 0000000..1171d8f
--- /dev/null
+++ b/directx/libdplayx.def
@@ -0,0 +1,2 @@
+EXPORTS
+	DirectPlayLobbyCreateA at 20
diff --git a/directx/libdsound.def b/directx/libdsound.def
new file mode 100644
index 0000000..f698fa9
--- /dev/null
+++ b/directx/libdsound.def
@@ -0,0 +1,9 @@
+EXPORTS
+	DirectSoundCaptureEnumerateW at 8
+	DirectSoundCaptureEnumerateA at 8
+	DirectSoundCaptureCreate at 12
+	DllGetClassObject
+	DllCanUnloadNow
+	DirectSoundEnumerateW at 8
+	DirectSoundEnumerateA at 8
+	DirectSoundCreate at 12
diff --git a/eppdiag/Makefile.am b/eppdiag/Makefile.am
new file mode 100644
index 0000000..b0c7f84
--- /dev/null
+++ b/eppdiag/Makefile.am
@@ -0,0 +1,36 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+	-DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+##dnl man_MANS = eppdiag.8
+
+if HAVEGTK
+GTKPROGS = eppdiag
+else
+GTKPROGS =
+endif
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS = 
+endif
+
+sbin_PROGRAMS = $(GTKPROGS)
+
+eppdiag_SOURCES = \
+        gladesrc.c \
+	eppdiag.c
+
+eppdiag_LDADD = \
+	../main/libinit.a ../main/libresident.a ../main/libresident2.a \
+	$(GTK_LIBS) ../main/libmisc.a $(DIRECTXLIBS)
+
+CLEANFILES = 
+
+noinst_HEADERS =   \
+        gladesrc.h \
+        gladesig.h
+
+EXTRA_DIST = eppdiag.glade
diff --git a/eppdiag/Makefile.in b/eppdiag/Makefile.in
new file mode 100644
index 0000000..5c9f702
--- /dev/null
+++ b/eppdiag/Makefile.in
@@ -0,0 +1,365 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+	-DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+ at HAVEGTK_TRUE@GTKPROGS = @HAVEGTK_TRUE at eppdiag
+ at HAVEGTK_FALSE@GTKPROGS = 
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS = 
+
+sbin_PROGRAMS = $(GTKPROGS)
+
+eppdiag_SOURCES = \
+        gladesrc.c \
+	eppdiag.c
+
+
+eppdiag_LDADD = \
+	../main/libinit.a ../main/libresident.a ../main/libresident2.a \
+	$(GTK_LIBS) ../main/libmisc.a $(DIRECTXLIBS)
+
+
+CLEANFILES = 
+
+noinst_HEADERS = \
+        gladesrc.h \
+        gladesig.h
+
+
+EXTRA_DIST = eppdiag.glade
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+ at HAVEGTK_TRUE@sbin_PROGRAMS =  eppdiag$(EXEEXT)
+ at HAVEGTK_FALSE@sbin_PROGRAMS = 
+PROGRAMS =  $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+eppdiag_OBJECTS =  gladesrc.$(OBJEXT) eppdiag.$(OBJEXT)
+ at DIRECTX_TRUE@eppdiag_DEPENDENCIES =  ../main/libinit.a \
+ at DIRECTX_TRUE@../main/libresident.a ../main/libresident2.a \
+ at DIRECTX_TRUE@../main/libmisc.a
+ at DIRECTX_FALSE@eppdiag_DEPENDENCIES =  ../main/libinit.a \
+ at DIRECTX_FALSE@../main/libresident.a ../main/libresident2.a \
+ at DIRECTX_FALSE@../main/libmisc.a
+eppdiag_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppdiag_SOURCES)
+OBJECTS = $(eppdiag_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppdiag/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(sbindir)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	     $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppdiag$(EXEEXT): $(eppdiag_OBJECTS) $(eppdiag_DEPENDENCIES)
+	@rm -f eppdiag$(EXEEXT)
+	$(LINK) $(eppdiag_LDFLAGS) $(eppdiag_OBJECTS) $(eppdiag_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppdiag
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+eppdiag.o: eppdiag.c ../config.h ../main/getopt.h ../main/fpga.h \
+	../main/sysdeps.h ../main/parport.h gladesrc.h gladesig.h
+gladesrc.o: gladesrc.c ../main/getopt.h ../config.h gladesig.h \
+	gladesrc.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(sbindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-sbinPROGRAMS mostlyclean-compile \
+		mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-sbinPROGRAMS clean-compile clean-tags clean-generic \
+		mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-sbinPROGRAMS distclean-compile distclean-tags \
+		distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-sbinPROGRAMS \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \
+clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
+install-sbinPROGRAMS mostlyclean-compile distclean-compile \
+clean-compile maintainer-clean-compile tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppdiag/eppdiag.c b/eppdiag/eppdiag.c
new file mode 100644
index 0000000..b7b5ae9
--- /dev/null
+++ b/eppdiag/eppdiag.c
@@ -0,0 +1,341 @@
+/*****************************************************************************/
+
+/*
+ *      eppdiag.c  -- HDLC packet radio modem for EPP using FPGA GUI tool.
+ *
+ *      Copyright (C) 1998, 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include "fpga.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+#include "gladesrc.h"
+#include "gladesig.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+static int quit = 0;
+static GtkWidget *diag;
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+	char buf[256];
+        va_list ap;
+        int r;
+	char *cp;
+
+#if 0
+        if (vl > verboselevel)
+                return 0;
+#endif
+	va_start(ap, format);
+	r = vsnprintf(buf, sizeof(buf), format, ap);
+	va_end(ap);
+	while (cp = strchr(buf, '\r'))
+		*cp = '\n';
+	gtk_text_insert(GTK_TEXT(gtk_object_get_data(GTK_OBJECT(diag), "textl")), NULL, NULL, NULL, buf, r);
+        return r;
+}
+
+int tprintf(const char *format, ...)
+{
+	char buf[256];
+	va_list ap;
+	int r;
+	char *cp;
+
+        va_start(ap, format);
+	r = vsnprintf(buf, sizeof(buf), format, ap);
+        va_end(ap);
+	while (cp = strchr(buf, '\r'))
+		*cp = '\n';
+	gtk_text_insert(GTK_TEXT(gtk_object_get_data(GTK_OBJECT(diag), "textt")), NULL, NULL, NULL, buf, r);
+	return r;
+}
+
+int idle_callback(unsigned us_delay)
+{
+	while (gtk_events_pending())
+		gtk_main_iteration();
+	if (us_delay)
+		usleep(us_delay);
+	return quit;
+}
+
+void epp_error(const char *msg)
+{
+	lprintf(0, msg);
+	reset_modem();
+	exit(1);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void on_bquit_clicked(GtkButton *button, gpointer user_data)
+{
+	quit = 1;
+	gtk_main_quit();
+}
+
+void on_btest_clicked(GtkButton *button, gpointer user_data)
+{
+	static int test_run = 0;
+	const struct eppfpgatests *tst;
+	struct adapter_config cfg;
+	gchar *cp;
+
+	if (test_run) {
+		quit = 1;
+		return;
+	}
+	cp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "partest"))->entry));
+	for (tst = eppfpgatests; tst->name && strcmp(cp, tst->name); tst++);
+	if (!tst->name) {
+		g_error("Internal Error: test %s not found\n", cp);
+		return;
+	}
+	/*iobase = strtoul(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "paraddress"))->entry)), NULL, 0);*/
+	cfg.intclk = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parclk"))->active;
+	cfg.bitrate = strtoul(gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(diag), "parbitrate"))), NULL, 0);
+	cfg.fclk = strtoul(gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(diag), "parfclk"))), NULL, 0);
+	cfg.extmodem = !GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parmodem"))->active;
+	cfg.loopback = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parloopback"))->active;
+	cfg.extstat = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parstat"))->active;
+	cp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "parfilter"))->entry));
+	switch(cp[0]) {
+	default:
+		cfg.filtmode = 0;
+		break;
+	case 'A':
+		cfg.filtmode = 1;
+		break;
+	case 'L':
+		cfg.filtmode = 2;
+		break;
+	}
+	cfg.gain = 1;
+	test_run = 1;
+	quit = 0;
+	tst->func(&cfg);
+	test_run = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void initdiag(void)
+{
+	GList *items = NULL;
+	const struct eppfpgatests *tst;
+
+	diag = create_diag();
+	for (tst = eppfpgatests; tst->name; tst++)
+		items = g_list_append(items, tst->name);
+	gtk_combo_set_popdown_strings(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "partest")), items);
+	g_list_free(items);
+
+	gtk_widget_show(diag);
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+        static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+                { "ppuser", 1, 0, 0x400 },
+                { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+                { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+                { "ppgenport", 0, 0, 0x403 },
+                { "ppwin", 1, 0, 0x404 },
+                { "pplpt", 1, 0, 0x404 },
+                { "ppring0", 0, 0, 0x405 },
+#endif
+		{ "ppforcehwepp", 0, 0, 0x410 },
+		{ "ppswemulepp", 0, 0, 0x411 },
+		{ "ppswemulecp", 0, 0, 0x412 },
+		{ 0, 0, 0, 0 }
+        };
+	int c, err = 0;
+	unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+	const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+	gtk_set_locale();
+	gtk_init(&argc, &argv);
+	while ((c = getopt_long(argc, argv, "vp:", long_options, NULL)) != EOF) {
+		switch (c) {
+		case 0x400:
+			ppuser = optarg;
+			ppkdrv = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x401:
+			ppkdrv = optarg;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x402:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = optarg;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x403:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 1;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+                        break;
+
+		case 0x404:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = strtoul(optarg, NULL, 0);
+                        w9xring0 = 0;
+			break;
+
+		case 0x405:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 1;
+			break;
+
+		case 0x410:
+			ppflags |= PPFLAG_FORCEHWEPP;
+			break;
+
+		case 0x411:
+			ppflags |= PPFLAG_SWEMULEPP;
+			break;
+
+		case 0x412:
+			ppflags |= PPFLAG_SWEMULECP;
+			break;
+
+		case 'v':
+			verboselevel++;
+			break;
+
+		case 'p': 
+			iobase = strtoul(optarg, NULL, 0);
+			if (iobase <= 0 || iobase >= 0x3f8)
+				err++;
+			break;
+
+		default:
+			err++;
+			break;
+		}
+	}
+	if (err) {
+		lprintf(0, "usage: %s [-v] [-p <portaddr>]\n", argv[0]);
+		exit(1);
+	}
+#ifdef HAVE_PPUSER
+	if (ppkdrv) {
+		if (parport_init_ppkdrv(ppkdrv)) {
+			fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+			exit(1);
+		}
+	} else
+#endif
+#ifdef HAVE_PPUSER
+		if (ppdev) {
+			if (parport_init_ppdev(ppdev)) {
+				fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+				exit(1);
+			}
+		} else if (ppuser) {
+			if (parport_init_ppuser(ppuser)) {
+				fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+				exit(1);
+			}
+		} else
+#endif
+#ifdef WIN32
+                        if (ntdrv) {
+                                if (parport_init_win_flags(ntdrv-1, ppflags)) {
+                                        fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+                                        exit(1);
+                                }
+                        } else if (ntddkgenport) {
+                                if (parport_init_ntddkgenport()) {
+                                        fprintf(stderr, "no NTDDK genport.sys driver found\n");
+                                        exit(1);
+                                }
+                        } else if (w9xring0) {
+                                if (parport_init_w9xring0_flags(iobase, ppflags)) {
+                                        fprintf(stderr, "no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+                        } else
+#endif
+                                if (parport_init_direct_flags(iobase, ppflags)) {
+                                        fprintf(stderr, "no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+	initdiag();
+	gtk_main();
+	exit(0);
+}
diff --git a/eppdiag/eppdiag.glade b/eppdiag/eppdiag.glade
new file mode 100644
index 0000000..316a141
--- /dev/null
+++ b/eppdiag/eppdiag.glade
@@ -0,0 +1,485 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+  <name>eppdiag</name>
+  <directory></directory>
+  <source_directory></source_directory>
+  <pixmaps_directory>pixmaps</pixmaps_directory>
+  <language>C</language>
+  <gettext_support>False</gettext_support>
+  <use_widget_names>False</use_widget_names>
+  <main_source_file>gladesrc.c</main_source_file>
+  <main_header_file>gladesrc.h</main_header_file>
+  <handler_source_file>gladesig.c</handler_source_file>
+  <handler_header_file>gladesig.h</handler_header_file>
+</project>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>diag</name>
+  <title>EPP FPGA Modem Diagnostics</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>True</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkHBox</class>
+    <name>hbox1</name>
+    <homogeneous>False</homogeneous>
+    <spacing>0</spacing>
+
+    <widget>
+      <class>GtkVBox</class>
+      <name>vbox1</name>
+      <child>
+	<padding>0</padding>
+	<expand>False</expand>
+	<fill>False</fill>
+      </child>
+      <homogeneous>False</homogeneous>
+      <spacing>0</spacing>
+
+      <widget>
+	<class>GtkTable</class>
+	<name>table1</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<rows>5</rows>
+	<columns>2</columns>
+	<homogeneous>False</homogeneous>
+	<row_spacing>4</row_spacing>
+	<column_spacing>0</column_spacing>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label7</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Filter</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <xalign>0.05</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label6</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Bitrate</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <xalign>0.05</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label5</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Port Address</label>
+	  <justify>GTK_JUSTIFY_CENTER</justify>
+	  <xalign>0.05</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label4</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Test</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <xalign>0.05</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>parfilter</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>False</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>True</use_arrows_always>
+	  <items>Default
+Analog Filter Eq
+Linear Phase
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkSpinButton</class>
+	  <name>parbitrate</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <climb_rate>1</climb_rate>
+	  <digits>0</digits>
+	  <numeric>False</numeric>
+	  <update_policy>GTK_UPDATE_ALWAYS</update_policy>
+	  <snap>False</snap>
+	  <wrap>False</wrap>
+	  <hvalue>9600</hvalue>
+	  <hlower>4800</hlower>
+	  <hupper>1.5e+06</hupper>
+	  <hstep>4800</hstep>
+	  <hpage>115200</hpage>
+	  <hpage_size>115200</hpage_size>
+	</widget>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>paraddress</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>False</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>0x378
+0x278
+0x3bc
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>partest</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>False</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>True</use_arrows_always>
+	  <items></items>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label8</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>4</top_attach>
+	    <bottom_attach>5</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <label>FPGA clock</label>
+	  <justify>GTK_JUSTIFY_CENTER</justify>
+	  <xalign>0.05</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkSpinButton</class>
+	  <name>parfclk</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>4</top_attach>
+	    <bottom_attach>5</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <climb_rate>1</climb_rate>
+	  <digits>0</digits>
+	  <numeric>False</numeric>
+	  <update_policy>GTK_UPDATE_ALWAYS</update_policy>
+	  <snap>False</snap>
+	  <wrap>False</wrap>
+	  <hvalue>1.96666e+07</hvalue>
+	  <hlower>1e+06</hlower>
+	  <hupper>2.5e+07</hupper>
+	  <hstep>100000</hstep>
+	  <hpage>1e+06</hpage>
+	  <hpage_size>1e+06</hpage_size>
+	</widget>
+      </widget>
+
+      <widget>
+	<class>GtkCheckButton</class>
+	<name>parclk</name>
+	<child>
+	  <padding>2</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<width>60</width>
+	<can_focus>True</can_focus>
+	<label>Internal Clock</label>
+	<active>False</active>
+	<draw_indicator>True</draw_indicator>
+      </widget>
+
+      <widget>
+	<class>GtkHBox</class>
+	<name>hbox4</name>
+	<child>
+	  <padding>2</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<homogeneous>False</homogeneous>
+	<spacing>0</spacing>
+
+	<widget>
+	  <class>GtkCheckButton</class>
+	  <name>parmodem</name>
+	  <child>
+	    <padding>2</padding>
+	    <expand>False</expand>
+	    <fill>False</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <label>Internal Modem</label>
+	  <active>True</active>
+	  <draw_indicator>True</draw_indicator>
+	</widget>
+      </widget>
+
+      <widget>
+	<class>GtkCheckButton</class>
+	<name>parstat</name>
+	<child>
+	  <padding>2</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<can_focus>True</can_focus>
+	<label>Extended Status</label>
+	<active>True</active>
+	<draw_indicator>True</draw_indicator>
+      </widget>
+
+      <widget>
+	<class>GtkCheckButton</class>
+	<name>parloopback</name>
+	<child>
+	  <padding>2</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<can_focus>True</can_focus>
+	<label>Loopback</label>
+	<active>False</active>
+	<draw_indicator>True</draw_indicator>
+      </widget>
+
+      <widget>
+	<class>GtkHButtonBox</class>
+	<name>hbuttonbox1</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	  <pack>GTK_PACK_END</pack>
+	</child>
+	<layout_style>GTK_BUTTONBOX_SPREAD</layout_style>
+	<spacing>30</spacing>
+	<child_min_width>85</child_min_width>
+	<child_min_height>27</child_min_height>
+	<child_ipad_x>7</child_ipad_x>
+	<child_ipad_y>0</child_ipad_y>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>bquit</name>
+	  <border_width>5</border_width>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_bquit_clicked</handler>
+	    <last_modification_time>Tue, 08 Dec 1998 16:48:38 GMT</last_modification_time>
+	  </signal>
+	  <label>Quit</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>btest</name>
+	  <can_default>True</can_default>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_btest_clicked</handler>
+	    <last_modification_time>Tue, 08 Dec 1998 16:48:28 GMT</last_modification_time>
+	  </signal>
+	  <label>Test</label>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkVPaned</class>
+      <name>vpaned1</name>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <handle_size>10</handle_size>
+      <gutter_size>15</gutter_size>
+
+      <widget>
+	<class>GtkScrolledWindow</class>
+	<name>scrolledwindow1</name>
+	<hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
+	<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+	<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+	<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+	<widget>
+	  <class>GtkText</class>
+	  <name>textl</name>
+	  <can_focus>True</can_focus>
+	  <editable>False</editable>
+	  <text></text>
+	</widget>
+      </widget>
+
+      <widget>
+	<class>GtkScrolledWindow</class>
+	<name>scrolledwindow2</name>
+	<hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
+	<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+	<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+	<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+	<widget>
+	  <class>GtkText</class>
+	  <name>textt</name>
+	  <can_focus>True</can_focus>
+	  <editable>False</editable>
+	  <text></text>
+	</widget>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/eppdiag/gladesig.h b/eppdiag/gladesig.h
new file mode 100644
index 0000000..3e58a35
--- /dev/null
+++ b/eppdiag/gladesig.h
@@ -0,0 +1,31 @@
+/*  Note: You are free to use whatever license you want.
+    Eventually you will be able to edit it within Glade. */
+
+/*  project1
+ *  Copyright (C) <YEAR> <AUTHORS>
+ *
+ *  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 of the License, 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.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <gtk/gtk.h>
+
+
+void
+on_bquit_clicked                       (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_btest_clicked                       (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/eppdiag/gladesrc.c b/eppdiag/gladesrc.c
new file mode 100644
index 0000000..1f2c0c8
--- /dev/null
+++ b/eppdiag/gladesrc.c
@@ -0,0 +1,379 @@
+/*  Note: You are free to use whatever license you want.
+    Eventually you will be able to edit it within Glade. */
+
+/*  eppdiag
+ *  Copyright (C) <YEAR> <AUTHORS>
+ *
+ *  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 of the License, 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.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include "gladesig.h"
+#include "gladesrc.h"
+
+GtkWidget*
+get_widget                             (GtkWidget       *widget,
+                                        gchar           *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+                                                   widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+/* This is an internally used function to set notebook tab widgets. */
+void
+set_notebook_tab                       (GtkWidget       *notebook,
+                                        gint             page_num,
+                                        GtkWidget       *widget)
+{
+  GtkNotebookPage *page;
+  GtkWidget *notebook_page;
+
+  page = (GtkNotebookPage*) g_list_nth (GTK_NOTEBOOK (notebook)->children, page_num)->data;
+  notebook_page = page->child;
+  gtk_widget_ref (notebook_page);
+  gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), page_num);
+  gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), notebook_page,
+                            widget, page_num);
+  gtk_widget_unref (notebook_page);
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (gchar           *directory)
+{
+  pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory));
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+#ifndef G_DIR_SEPARATOR_S
+#define G_DIR_SEPARATOR_S "/"
+#endif
+gchar*
+check_file_exists                      (gchar           *directory,
+                                        gchar           *filename)
+{
+  gchar *full_filename;
+  struct stat s;
+  gint status;
+
+  full_filename = g_malloc (strlen (directory) + 1 + strlen (filename) + 1);
+  strcpy (full_filename, directory);
+  strcat (full_filename, G_DIR_SEPARATOR_S);
+  strcat (full_filename, filename);
+
+  status = stat (full_filename, &s);
+  if (status == 0 && S_ISREG (s.st_mode))
+    return full_filename;
+  g_free (full_filename);
+  return NULL;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        gchar           *filename)
+{
+  gchar *found_filename = NULL;
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+  GList *elem;
+
+  /* We first try any pixmaps directories set by the application. */
+  elem = pixmaps_directories;
+  while (elem)
+    {
+      found_filename = check_file_exists ((gchar*)elem->data, filename);
+      if (found_filename)
+        break;
+      elem = elem->next;
+    }
+
+  /* If we haven't found the pixmap, try the source directory. */
+  if (!found_filename)
+    {
+      found_filename = check_file_exists ("pixmaps", filename);
+    }
+
+  if (!found_filename)
+    {
+      g_print ("Couldn't find pixmap file: %s", filename);
+      return NULL;
+    }
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+                                                   NULL, found_filename);
+  g_free (found_filename);
+  if (gdkpixmap == NULL)
+    return NULL;
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+GtkWidget*
+create_diag ()
+{
+  GtkWidget *diag;
+  GtkWidget *hbox1;
+  GtkWidget *vbox1;
+  GtkWidget *table1;
+  GtkWidget *label7;
+  GtkWidget *label6;
+  GtkWidget *label5;
+  GtkWidget *label4;
+  GtkWidget *parfilter;
+  GList *parfilter_items = NULL;
+  GtkObject *parbitrate_adj;
+  GtkWidget *parbitrate;
+  GtkWidget *paraddress;
+  GList *paraddress_items = NULL;
+  GtkWidget *partest;
+  GtkWidget *label8;
+  GtkObject *parfclk_adj;
+  GtkWidget *parfclk;
+  GtkWidget *parclk;
+  GtkWidget *hbox4;
+  GtkWidget *parmodem;
+  GtkWidget *parstat;
+  GtkWidget *parloopback;
+  GtkWidget *hbuttonbox1;
+  GtkWidget *bquit;
+  GtkWidget *btest;
+  GtkWidget *vpaned1;
+  GtkWidget *scrolledwindow1;
+  GtkWidget *textl;
+  GtkWidget *scrolledwindow2;
+  GtkWidget *textt;
+
+  diag = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_object_set_data (GTK_OBJECT (diag), "diag", diag);
+  gtk_window_set_title (GTK_WINDOW (diag), "EPP FPGA Modem Diagnostics");
+  gtk_window_set_policy (GTK_WINDOW (diag), TRUE, TRUE, FALSE);
+
+  hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_object_set_data (GTK_OBJECT (diag), "hbox1", hbox1);
+  gtk_widget_show (hbox1);
+  gtk_container_add (GTK_CONTAINER (diag), hbox1);
+
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_object_set_data (GTK_OBJECT (diag), "vbox1", vbox1);
+  gtk_widget_show (vbox1);
+  gtk_box_pack_start (GTK_BOX (hbox1), vbox1, FALSE, FALSE, 0);
+
+  table1 = gtk_table_new (5, 2, FALSE);
+  gtk_object_set_data (GTK_OBJECT (diag), "table1", table1);
+  gtk_widget_show (table1);
+  gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table1), 4);
+
+  label7 = gtk_label_new ("Filter");
+  gtk_object_set_data (GTK_OBJECT (diag), "label7", label7);
+  gtk_widget_show (label7);
+  gtk_table_attach (GTK_TABLE (table1), label7, 0, 1, 3, 4,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label7), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label7), 0.05, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label7), 4, 0);
+
+  label6 = gtk_label_new ("Bitrate");
+  gtk_object_set_data (GTK_OBJECT (diag), "label6", label6);
+  gtk_widget_show (label6);
+  gtk_table_attach (GTK_TABLE (table1), label6, 0, 1, 2, 3,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label6), 0.05, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label6), 4, 0);
+
+  label5 = gtk_label_new ("Port Address");
+  gtk_object_set_data (GTK_OBJECT (diag), "label5", label5);
+  gtk_widget_show (label5);
+  gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 1, 2,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label5), 0.05, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label5), 4, 0);
+
+  label4 = gtk_label_new ("Test");
+  gtk_object_set_data (GTK_OBJECT (diag), "label4", label4);
+  gtk_widget_show (label4);
+  gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 0, 1,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label4), 0.05, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label4), 4, 0);
+
+  parfilter = gtk_combo_new ();
+  gtk_object_set_data (GTK_OBJECT (diag), "parfilter", parfilter);
+  gtk_widget_show (parfilter);
+  gtk_table_attach (GTK_TABLE (table1), parfilter, 1, 2, 3, 4,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_combo_set_use_arrows_always (GTK_COMBO (parfilter), TRUE);
+  parfilter_items = g_list_append (parfilter_items, "Default");
+  parfilter_items = g_list_append (parfilter_items, "Analog Filter Eq");
+  parfilter_items = g_list_append (parfilter_items, "Linear Phase");
+  gtk_combo_set_popdown_strings (GTK_COMBO (parfilter), parfilter_items);
+  g_list_free (parfilter_items);
+
+  parbitrate_adj = gtk_adjustment_new (9600, 4800, 1.5e+06, 4800, 115200, 115200);
+  parbitrate = gtk_spin_button_new (GTK_ADJUSTMENT (parbitrate_adj), 1, 0);
+  gtk_object_set_data (GTK_OBJECT (diag), "parbitrate", parbitrate);
+  gtk_widget_show (parbitrate);
+  gtk_table_attach (GTK_TABLE (table1), parbitrate, 1, 2, 2, 3,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+
+  paraddress = gtk_combo_new ();
+  gtk_object_set_data (GTK_OBJECT (diag), "paraddress", paraddress);
+  gtk_widget_show (paraddress);
+  gtk_table_attach (GTK_TABLE (table1), paraddress, 1, 2, 1, 2,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  paraddress_items = g_list_append (paraddress_items, "0x378");
+  paraddress_items = g_list_append (paraddress_items, "0x278");
+  paraddress_items = g_list_append (paraddress_items, "0x3bc");
+  gtk_combo_set_popdown_strings (GTK_COMBO (paraddress), paraddress_items);
+  g_list_free (paraddress_items);
+
+  partest = gtk_combo_new ();
+  gtk_object_set_data (GTK_OBJECT (diag), "partest", partest);
+  gtk_widget_show (partest);
+  gtk_table_attach (GTK_TABLE (table1), partest, 1, 2, 0, 1,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+  gtk_combo_set_use_arrows_always (GTK_COMBO (partest), TRUE);
+
+  label8 = gtk_label_new ("FPGA clock");
+  gtk_object_set_data (GTK_OBJECT (diag), "label8", label8);
+  gtk_widget_show (label8);
+  gtk_table_attach (GTK_TABLE (table1), label8, 0, 1, 4, 5,
+                    (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label8), 0.05, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label8), 4, 0);
+
+  parfclk_adj = gtk_adjustment_new (1.96666e+07, 1e+06, 2.5e+07, 100000, 1e+06, 1e+06);
+  parfclk = gtk_spin_button_new (GTK_ADJUSTMENT (parfclk_adj), 1, 0);
+  gtk_object_set_data (GTK_OBJECT (diag), "parfclk", parfclk);
+  gtk_widget_show (parfclk);
+  gtk_table_attach (GTK_TABLE (table1), parfclk, 1, 2, 4, 5,
+                    (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+
+  parclk = gtk_check_button_new_with_label ("Internal Clock");
+  gtk_object_set_data (GTK_OBJECT (diag), "parclk", parclk);
+  gtk_widget_show (parclk);
+  gtk_box_pack_start (GTK_BOX (vbox1), parclk, FALSE, FALSE, 2);
+  gtk_widget_set_usize (parclk, 60, -2);
+
+  hbox4 = gtk_hbox_new (FALSE, 0);
+  gtk_object_set_data (GTK_OBJECT (diag), "hbox4", hbox4);
+  gtk_widget_show (hbox4);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox4, FALSE, FALSE, 2);
+
+  parmodem = gtk_check_button_new_with_label ("Internal Modem");
+  gtk_object_set_data (GTK_OBJECT (diag), "parmodem", parmodem);
+  gtk_widget_show (parmodem);
+  gtk_box_pack_start (GTK_BOX (hbox4), parmodem, FALSE, FALSE, 2);
+  gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (parmodem), TRUE);
+
+  parstat = gtk_check_button_new_with_label ("Extended Status");
+  gtk_object_set_data (GTK_OBJECT (diag), "parstat", parstat);
+  gtk_widget_show (parstat);
+  gtk_box_pack_start (GTK_BOX (vbox1), parstat, FALSE, FALSE, 2);
+  gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (parstat), TRUE);
+
+  parloopback = gtk_check_button_new_with_label ("Loopback");
+  gtk_object_set_data (GTK_OBJECT (diag), "parloopback", parloopback);
+  gtk_widget_show (parloopback);
+  gtk_box_pack_start (GTK_BOX (vbox1), parloopback, FALSE, FALSE, 2);
+
+  hbuttonbox1 = gtk_hbutton_box_new ();
+  gtk_object_set_data (GTK_OBJECT (diag), "hbuttonbox1", hbuttonbox1);
+  gtk_widget_show (hbuttonbox1);
+  gtk_box_pack_end (GTK_BOX (vbox1), hbuttonbox1, FALSE, FALSE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);
+
+  bquit = gtk_button_new_with_label ("Quit");
+  gtk_object_set_data (GTK_OBJECT (diag), "bquit", bquit);
+  gtk_widget_show (bquit);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), bquit);
+  gtk_container_border_width (GTK_CONTAINER (bquit), 5);
+  gtk_signal_connect (GTK_OBJECT (bquit), "clicked",
+                      GTK_SIGNAL_FUNC (on_bquit_clicked),
+                      NULL);
+
+  btest = gtk_button_new_with_label ("Test");
+  gtk_object_set_data (GTK_OBJECT (diag), "btest", btest);
+  gtk_widget_show (btest);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), btest);
+  GTK_WIDGET_SET_FLAGS (btest, GTK_CAN_DEFAULT);
+  gtk_signal_connect (GTK_OBJECT (btest), "clicked",
+                      GTK_SIGNAL_FUNC (on_btest_clicked),
+                      NULL);
+
+  vpaned1 = gtk_vpaned_new ();
+  gtk_object_set_data (GTK_OBJECT (diag), "vpaned1", vpaned1);
+  gtk_widget_show (vpaned1);
+  gtk_box_pack_start (GTK_BOX (hbox1), vpaned1, TRUE, TRUE, 0);
+  gtk_paned_gutter_size (GTK_PANED (vpaned1), 15);
+
+  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_object_set_data (GTK_OBJECT (diag), "scrolledwindow1", scrolledwindow1);
+  gtk_widget_show (scrolledwindow1);
+  gtk_container_add (GTK_CONTAINER (vpaned1), scrolledwindow1);
+
+  textl = gtk_text_new (NULL, NULL);
+  gtk_object_set_data (GTK_OBJECT (diag), "textl", textl);
+  gtk_widget_show (textl);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow1), textl);
+
+  scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_object_set_data (GTK_OBJECT (diag), "scrolledwindow2", scrolledwindow2);
+  gtk_widget_show (scrolledwindow2);
+  gtk_container_add (GTK_CONTAINER (vpaned1), scrolledwindow2);
+
+  textt = gtk_text_new (NULL, NULL);
+  gtk_object_set_data (GTK_OBJECT (diag), "textt", textt);
+  gtk_widget_show (textt);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow2), textt);
+
+  return diag;
+}
+
diff --git a/eppdiag/gladesrc.h b/eppdiag/gladesrc.h
new file mode 100644
index 0000000..20c713a
--- /dev/null
+++ b/eppdiag/gladesrc.h
@@ -0,0 +1,53 @@
+/*  Note: You are free to use whatever license you want.
+    Eventually you will be able to edit it within Glade. */
+
+/*  eppdiag
+ *  Copyright (C) <YEAR> <AUTHORS>
+ *
+ *  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 of the License, 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.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <gtk/gtk.h>
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*
+get_widget                             (GtkWidget       *widget,
+                                        gchar           *widget_name);
+
+
+ /*
+  * This is an internally used function for setting notebook tabs. It is only
+  * included in this header file so you don't get compilation warnings
+  */
+void
+set_notebook_tab                       (GtkWidget       *notebook,
+                                        gint             page_num,
+                                        GtkWidget       *widget);
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (gchar           *directory);
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        gchar           *filename);
+
+GtkWidget* create_diag (void);
diff --git a/eppfm/Makefile.am b/eppfm/Makefile.am
new file mode 100644
index 0000000..5168e8e
--- /dev/null
+++ b/eppfm/Makefile.am
@@ -0,0 +1,44 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+	-DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS = 
+endif
+
+if HAVEGTK
+
+bin_PROGRAMS = eppfm
+
+endif
+
+EXTRA_DIST = costab.c gentbl.c
+
+if CROSSCOMP
+else
+
+gentbl_SOURCES = gentbl.c
+
+BUILT_SOURCES = costab.c
+
+noinst_PROGRAMS = gentbl
+
+$(srcdir)/costab.c:	gentbl
+		./gentbl $(srcdir)/costab.c
+
+endif
+
+eppfm_SOURCES = \
+	main.c audio.c eppfm.h costab.c \
+	support.c support.h \
+	interface.c interface.h \
+	callbacks.c callbacks.h
+
+eppfm_LDADD = \
+	$(top_builddir)/main/libinit.a $(top_builddir)/main/libresident.a \
+	$(GTK_LIBS) $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
diff --git a/eppfm/Makefile.in b/eppfm/Makefile.in
new file mode 100644
index 0000000..5f7cbe5
--- /dev/null
+++ b/eppfm/Makefile.in
@@ -0,0 +1,398 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+	-DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS = 
+
+ at HAVEGTK_TRUE@bin_PROGRAMS = @HAVEGTK_TRUE at eppfm
+
+EXTRA_DIST = costab.c gentbl.c
+
+ at CROSSCOMP_FALSE@gentbl_SOURCES = @CROSSCOMP_FALSE at gentbl.c
+
+ at CROSSCOMP_FALSE@BUILT_SOURCES = @CROSSCOMP_FALSE at costab.c
+
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = @CROSSCOMP_FALSE at gentbl
+
+eppfm_SOURCES = \
+	main.c audio.c eppfm.h costab.c \
+	support.c support.h \
+	interface.c interface.h \
+	callbacks.c callbacks.h
+
+
+eppfm_LDADD = \
+	$(top_builddir)/main/libinit.a $(top_builddir)/main/libresident.a \
+	$(GTK_LIBS) $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+ at HAVEGTK_TRUE@bin_PROGRAMS =  eppfm$(EXEEXT)
+ at CROSSCOMP_FALSE@noinst_PROGRAMS =  gentbl$(EXEEXT)
+PROGRAMS =  $(bin_PROGRAMS) $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+eppfm_OBJECTS =  main.$(OBJEXT) audio.$(OBJEXT) costab.$(OBJEXT) \
+support.$(OBJEXT) interface.$(OBJEXT) callbacks.$(OBJEXT)
+ at DIRECTX_TRUE@eppfm_DEPENDENCIES =  $(top_builddir)/main/libinit.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libmisc.a
+ at DIRECTX_FALSE@eppfm_DEPENDENCIES =  $(top_builddir)/main/libinit.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libmisc.a
+eppfm_LDFLAGS = 
+ at CROSSCOMP_FALSE@gentbl_OBJECTS =  gentbl.$(OBJEXT)
+gentbl_LDADD = $(LDADD)
+gentbl_DEPENDENCIES = 
+gentbl_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppfm_SOURCES) $(gentbl_SOURCES)
+OBJECTS = $(eppfm_OBJECTS) $(gentbl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(bindir)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	     $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppfm$(EXEEXT): $(eppfm_OBJECTS) $(eppfm_DEPENDENCIES)
+	@rm -f eppfm$(EXEEXT)
+	$(LINK) $(eppfm_LDFLAGS) $(eppfm_OBJECTS) $(eppfm_LDADD) $(LIBS)
+
+gentbl$(EXEEXT): $(gentbl_OBJECTS) $(gentbl_DEPENDENCIES)
+	@rm -f gentbl$(EXEEXT)
+	$(LINK) $(gentbl_LDFLAGS) $(gentbl_OBJECTS) $(gentbl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+audio.o: audio.c ../config.h ../main/getopt.h eppfm.h ../main/fpga.h \
+	../main/sysdeps.h ../main/parport.h
+callbacks.o: callbacks.c ../config.h eppfm.h ../main/fpga.h \
+	../main/sysdeps.h ../main/getopt.h ../main/parport.h \
+	callbacks.h interface.h support.h
+costab.o: costab.c eppfm.h ../main/fpga.h ../main/sysdeps.h ../config.h \
+	../main/getopt.h ../main/parport.h
+gentbl.o: gentbl.c
+interface.o: interface.c ../config.h ../main/getopt.h callbacks.h \
+	interface.h support.h
+main.o: main.c ../config.h ../main/getopt.h eppfm.h ../main/fpga.h \
+	../main/sysdeps.h ../main/parport.h interface.h support.h
+support.o: support.c ../config.h ../main/getopt.h support.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \
+		mostlyclean-compile mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-noinstPROGRAMS clean-compile \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-noinstPROGRAMS \
+		distclean-compile distclean-tags distclean-generic \
+		clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+		maintainer-clean-noinstPROGRAMS \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at CROSSCOMP_FALSE@$(srcdir)/costab.c:	gentbl
+ at CROSSCOMP_FALSE@		./gentbl $(srcdir)/costab.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm/audio.c b/eppfm/audio.c
new file mode 100644
index 0000000..fabd86a
--- /dev/null
+++ b/eppfm/audio.c
@@ -0,0 +1,946 @@
+/*****************************************************************************/
+
+/*
+ *      audio.c  --  Audio processing for "virtual transceiver".
+ *
+ *      Copyright (C) 1999-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#define G_LOG_DOMAIN "eppfm"
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+#include <linux/soundcard.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#endif	
+
+#ifdef HAVE_DIRECTX
+#include <directx.h>
+#endif
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+struct {
+	/* gtk timeout handle */
+	gint tmotag;
+	/* sampling rate conversion state */
+	unsigned phinceppdsp, phincdspepp, pheppdsp, phdspepp;
+	/* ptt state */
+	unsigned ptt_state;
+	/* control register */
+	unsigned char ctrlreg;
+	/* led blink counter */
+	unsigned ledcnt;
+	/* level counter */
+	unsigned lvlicnt, lvliaccum, lvli, lvlocnt, lvloaccum, lvlo;
+	/* frequency generators */
+	unsigned phase0, phase1, phase2, phase3;
+	unsigned freq0, freq1, freq2, freq3;
+	
+	/* low level driver specific data */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+	int fddsp;
+#endif	
+#ifdef HAVE_DIRECTX
+	LPDIRECTSOUND dsplay;
+	LPDIRECTSOUNDCAPTURE dsrec;
+	LPDIRECTSOUNDBUFFER playbuf;
+	LPDIRECTSOUNDCAPTUREBUFFER recbuf;
+	HANDLE hinst;
+	HWND hwnd;
+	DWORD playbufsz, recbufsz, playptr, recptr;
+#endif
+
+} state;
+
+#define SNDLATENCY 4000   /* approx 1/2 seconds */
+#define BUFSIZE    8192   /* must be significantly bigger than SNDLATENCY! */
+#define PHASEFRAC  12
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+	if (ptt)
+		state.ptt_state |= 1;
+	else
+		state.ptt_state &= ~1;
+}
+
+void audio_1750(int on)
+{
+	if (on) {
+		state.freq2 = (1750*65536+8000/2)/8000;
+	} else {
+		state.freq2 = 0;
+		state.phase2 = 0x4000;
+	}
+}
+
+/*
+ *
+ * DTMF frequencies
+ *
+ *      1209 1336 1477 1633
+ *  697   1    2    3    A
+ *  770   4    5    6    B
+ *  852   7    8    9    C
+ *  941   *    0    #    D
+ * 
+ */
+
+void audio_dtmf(int ch)
+{
+	switch (ch) {
+	case 0:
+		state.freq0 = (1336*65536+8000/2)/8000;
+		state.freq1 = (941*65536+8000/2)/8000;
+		break;
+
+	case 1:
+		state.freq0 = (1209*65536+8000/2)/8000;
+		state.freq1 = (697*65536+8000/2)/8000;
+		break;
+
+	case 2:
+		state.freq0 = (1336*65536+8000/2)/8000;
+		state.freq1 = (697*65536+8000/2)/8000;
+		break;
+
+	case 3:
+		state.freq0 = (1477*65536+8000/2)/8000;
+		state.freq1 = (697*65536+8000/2)/8000;
+		break;
+
+	case 4:
+		state.freq0 = (1209*65536+8000/2)/8000;
+		state.freq1 = (770*65536+8000/2)/8000;
+		break;
+
+	case 5:
+		state.freq0 = (1336*65536+8000/2)/8000;
+		state.freq1 = (770*65536+8000/2)/8000;
+		break;
+
+	case 6:
+		state.freq0 = (1477*65536+8000/2)/8000;
+		state.freq1 = (770*65536+8000/2)/8000;
+		break;
+
+	case 7:
+		state.freq0 = (1209*65536+8000/2)/8000;
+		state.freq1 = (852*65536+8000/2)/8000;
+		break;
+
+	case 8:
+		state.freq0 = (1336*65536+8000/2)/8000;
+		state.freq1 = (852*65536+8000/2)/8000;
+		break;
+
+	case 9:
+		state.freq0 = (1477*65536+8000/2)/8000;
+		state.freq1 = (852*65536+8000/2)/8000;
+		break;
+
+	case 10:
+		state.freq0 = (1633*65536+8000/2)/8000;
+		state.freq1 = (697*65536+8000/2)/8000;
+		break;
+
+	case 11:
+		state.freq0 = (1633*65536+8000/2)/8000;
+		state.freq1 = (770*65536+8000/2)/8000;
+		break;
+
+	case 12:
+		state.freq0 = (1633*65536+8000/2)/8000;
+		state.freq1 = (852*65536+8000/2)/8000;
+		break;
+
+	case 13:
+		state.freq0 = (1633*65536+8000/2)/8000;
+		state.freq1 = (941*65536+8000/2)/8000;
+		break;
+
+	case 14:
+		state.freq0 = (1209*65536+8000/2)/8000;
+		state.freq1 = (941*65536+8000/2)/8000;
+		break;
+
+	case 15:
+		state.freq0 = (1477*65536+8000/2)/8000;
+		state.freq1 = (941*65536+8000/2)/8000;
+		break;
+
+	default:
+		state.freq0 = state.freq1 = 0;
+		state.phase0 = state.phase1 = 0x4000;
+		break;
+	}
+}
+
+unsigned audio_getilevel(void)
+{
+	return state.lvli;
+}
+
+unsigned audio_getolevel(void)
+{
+	return state.lvlo;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define LEVELACCUM 2048
+
+static void process_input(int16_t *buf, unsigned cnt)
+{
+	unsigned i;
+
+	for (i = 0; i < cnt; i++) {
+		state.lvliaccum += ((int)buf[i] * (int)buf[i]) >> 16;
+		if ((++state.lvlicnt) >= LEVELACCUM) {
+			state.lvli = state.lvliaccum / LEVELACCUM;
+			state.lvlicnt = state.lvliaccum = 0;
+		}
+	}
+}
+
+static void process_output(int16_t *buf, unsigned cnt)
+{
+	unsigned i;
+	int acc;
+
+	for (i = 0; i < cnt; i++) {
+		acc = buf[i];
+		state.lvloaccum += (acc * acc) >> 16;
+		if ((++state.lvlocnt) >= LEVELACCUM) {
+			state.lvlo = state.lvloaccum / LEVELACCUM;
+			state.lvlocnt = state.lvloaccum = 0;
+		}
+		acc += (SIN(state.phase0) + SIN(state.phase1) + SIN(state.phase2) + SIN(state.phase3)) >> 1;
+		if (acc > 32767)
+			acc = 32767;
+		else if (acc < -32768)
+			acc = -32768;
+		buf[i] = acc;
+		state.phase0 += state.freq0;
+		state.phase1 += state.freq1;
+		state.phase2 += state.freq2;
+		state.phase3 += state.freq3;
+	}
+}
+
+static void initstate(void)
+{
+	state.pheppdsp = 0;
+	state.phdspepp = 0;
+	state.ptt_state = 0;
+	state.ctrlreg = 0;
+	state.ledcnt = 0;
+	state.lvlicnt = state.lvliaccum = state.lvli = 0;
+	state.lvlocnt = state.lvloaccum = state.lvlo = 0;
+	state.phase0 = state.phase1 = state.phase2 = state.phase3 = 0x4000;
+	state.freq0 = state.freq1 = state.freq2 = state.freq3 = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+void audio_stop(void)
+{
+	if (state.fddsp != -1) {
+		gtk_timeout_remove(state.tmotag);
+		close(state.fddsp);
+		state.fddsp = -1;
+		reset_modem();
+	}
+}
+
+static gint periodic(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	int apar, i, icnt, ocnt, cnt, ocnts, omax;
+
+	/* first do the epp->dsp direction */
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 1;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	icnt &= 0x7fff;
+	if (icnt > 0) {
+		if (icnt > BUFSIZE/2)
+			icnt = BUFSIZE/2;
+		if (parport_epp_read_data(buf.s, icnt) != icnt)
+			goto err;
+		state.pheppdsp &= 0xff;
+		cnt = 0;
+		while (state.pheppdsp < (icnt << PHASEFRAC)) {
+			sbuf[cnt] = buf.s[state.pheppdsp >> PHASEFRAC] << 8;
+			state.pheppdsp += state.phinceppdsp;
+			cnt++;
+		}
+		process_input(sbuf, cnt);
+		if ((i = write(state.fddsp, sbuf, 2*cnt)) != 2*cnt) {
+			lprintf(0, "write(%d) failed %i (%s)\n", 2*cnt, i, strerror(errno));
+			goto err;
+		}
+		if (ioctl(state.fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+			lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+			goto err;
+		}
+		apar >>= 1;
+		/* adjust speed */
+		lprintf(4, "icnt %d cnt %d odel %d\n", icnt, cnt, apar);
+		if (apar > SNDLATENCY)
+			state.phinceppdsp++;
+		else if (apar < SNDLATENCY)
+			state.phinceppdsp--;
+		if (state.phinceppdsp < (0x9 << (PHASEFRAC-4)) || state.phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+			lprintf(0, "phinceppdsp (0x%05x) out of range\n", state.phinceppdsp);
+			goto err;
+		}
+		/* play games with the LEDS */
+		state.ledcnt += icnt;
+		if (state.ledcnt >= 4000) {
+			state.ledcnt %= 4000;
+			state.ctrlreg += 0x40;
+		}
+	}
+	/* next do the dsp->epp direction */
+	/* read sound */
+	ocnts = read(state.fddsp, sbuf, 2*BUFSIZE/2);
+	if (ocnts == -1 && errno == EAGAIN)
+		ocnts = 0;
+	if (ocnts < 0) {
+		lprintf(0, "read(%d) failed %i (%s)\n", 2*BUFSIZE/2, ocnts, strerror(errno));
+		goto err;
+	}
+	ocnts >>= 1;
+	process_output(sbuf, ocnts);
+	if (state.ptt_state == 2) {
+		state.ptt_state = 0;
+		state.ctrlreg &= ~0x20;
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+	}
+	if (!state.ptt_state)
+		goto endper;
+	/* get FIFO count */
+	state.ctrlreg |= 0x20;
+	buf.u[0] = state.ctrlreg | 2;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	ocnt &= 0x7fff;
+	omax = 16384 - ocnt;
+	if (state.ptt_state == 1) {
+		if (ocnt < SNDLATENCY) {
+			memset(buf.s, 0, SNDLATENCY-ocnt);
+			if (parport_epp_write_data(buf.s, SNDLATENCY-ocnt) != SNDLATENCY-ocnt)
+				goto err;
+		}
+		state.ptt_state = 3;
+		goto endper;
+	}
+	if (ocnts > 0) {
+		state.phdspepp &= 0xff;
+		cnt = 0;
+		while (state.phdspepp < (ocnts << PHASEFRAC)) {
+			buf.s[cnt] = sbuf[state.phdspepp >> PHASEFRAC] >> 8;
+			state.phdspepp += state.phincdspepp;
+			cnt++;
+		}
+		if (cnt > omax) {
+			lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+			goto err;
+		}
+		if (parport_epp_write_data(buf.s, cnt) != cnt)
+			goto err;
+		/* reget the FIFO count */
+		buf.u[0] = state.ctrlreg | 2;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		if (parport_epp_read_addr(buf.u, 2) != 2)
+			goto err;
+		ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		ocnt &= 0x7fff;
+	}
+	/* adjust speed */
+	lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+	if (ocnt > SNDLATENCY)
+		state.phincdspepp++;
+	else if (ocnt < SNDLATENCY)
+		state.phincdspepp--;
+	if (state.phincdspepp < (0x9 << (PHASEFRAC-4)) || state.phincdspepp > (0x1f << (PHASEFRAC-4))) {
+		lprintf(0, "phincdspepp (0x%05x) out of range\n", state.phincdspepp);
+		goto err;
+	}
+endper:
+	lprintf(3, "phase increments: 0x%05x 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+	return TRUE;
+
+err:
+	lprintf(0, "EPP timeout\n");
+	close(state.fddsp);
+	state.fddsp = -1;
+	reset_modem();
+	return FALSE;
+}
+
+int audio_start(struct adapter_config *cfg)
+{
+	unsigned char buf[2];
+	int16_t sbuf[SNDLATENCY];
+	audio_buf_info aboinfo, abiinfo;
+	int apar;
+	unsigned srate;
+	int i;
+
+	initstate();
+	cfg->bitrate = 8000;
+	if ((i = adapter_start_eppsamp(cfg))) {
+		lprintf(0, "Cannot initialize the modem\n");
+		return i;
+	}
+	if ((state.fddsp = open("/dev/dsp", O_RDWR | O_NONBLOCK)) == -1) {
+		lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+		return -1;
+	}
+	fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+	if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_DUPLEX)) {
+		lprintf(0, "full duplex soundcard required\n");
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_TRIGGER)) {
+		lprintf(0, "soundcard does not support trigger\n");
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETDUPLEX, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETDUPLEX failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = AFMT_S16_LE;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = 0;
+	if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	srate = cfg->bitrate;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", 
+			strerror(errno), cfg->bitrate);
+		goto errsnd;
+	}
+	lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg->bitrate, srate);
+	if (abs(cfg->bitrate - srate) > cfg->bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg->bitrate, srate);
+		goto errsnd;
+	}
+	state.phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + srate / 2) / srate;
+	state.phincdspepp = ((1 << PHASEFRAC) * srate + cfg->bitrate / 2) / cfg->bitrate;
+	lprintf(2, "epp->dsp phase inc: 0x%05x  dsp->epp phase inc: 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETOSPACE, &aboinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETISPACE, &abiinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (aboinfo.fragstotal * aboinfo.fragsize < 2*SNDLATENCY*2 ||
+	    abiinfo.fragstotal * abiinfo.fragsize < 2*SNDLATENCY*2) {
+		lprintf(0, "soundcard buffers too small (%u,%u)\n", 
+			aboinfo.fragstotal * aboinfo.fragsize, 
+			abiinfo.fragstotal * abiinfo.fragsize);
+		goto errsnd;
+	}
+	lprintf(0, "Audio IO to Linux Soundcard\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = 0;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill to nominal queue size and stard soundcard */
+	memset(sbuf, 0, sizeof(sbuf));
+	if ((i = write(state.fddsp, sbuf, 2*SNDLATENCY)) != 2*SNDLATENCY) {
+		lprintf(0, "write(%d) failed %i (%s)\n", 2*SNDLATENCY, i, strerror(errno));
+		goto errsnd;
+	}
+	apar = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	state.tmotag = gtk_timeout_add(100, periodic, NULL);
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+errsnd:
+	close(state.fddsp);
+	return -1;
+}
+
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_DIRECTX
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+        lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+        return TRUE;
+}
+
+#if 0
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+	switch(umsg) {
+		/* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't 
+		   want to pass these messages along for default processing. */
+	case WM_CLOSE:
+		DestroyWindow(hwnd);
+		return 0;
+
+	case WM_DESTROY:
+		PostQuitMessage(0);
+		return 0;
+	}
+	return DefWindowProc(hwnd, umsg, wParam, lParam);
+}
+#endif
+
+void audio_stop(void)
+{
+	if (state.hwnd != NULL) {
+		gtk_timeout_remove(state.tmotag);
+		IDirectSoundBuffer_Stop(state.playbuf);
+		IDirectSoundCaptureBuffer_Stop(state.recbuf);
+		IDirectSoundBuffer_Release(state.playbuf);
+		IDirectSoundCaptureBuffer_Release(state.recbuf);
+		IDirectSoundCapture_Release(state.dsrec);
+		IDirectSound_Release(state.dsplay);
+#if 0
+		DestroyWindow(state.hwnd);
+		UnregisterClass("MyClass", state.hinst);
+#endif
+		state.hwnd = NULL;
+		reset_modem();
+	}
+}
+
+static gint periodic(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	int16_t *sptr1, *sptr2;
+	HRESULT res;
+	DWORD lockbytes1, lockbytes2, delay;
+	int icnt, ocnt, cnt, ocnts, omax;
+
+	/* first do the epp->dsp direction */
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 1;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	icnt &= 0x7fff;
+	if (icnt > 0) {
+		if (icnt > BUFSIZE/2)
+			icnt = BUFSIZE/2;
+		if (parport_epp_read_data(buf.s, icnt) != icnt)
+			goto err;
+		state.pheppdsp &= 0xff;
+		cnt = 0;
+		while (state.pheppdsp < (icnt << PHASEFRAC)) {
+			sbuf[cnt] = buf.s[state.pheppdsp >> PHASEFRAC] << 8;
+			state.pheppdsp += state.phinceppdsp;
+			cnt++;
+		}
+		process_input(sbuf, cnt);
+		if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, state.playptr, cnt*2, 
+							 (LPVOID)&sptr1, &lockbytes1,
+							 (LPVOID)&sptr2, &lockbytes2, 0))) {
+			lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+			goto err;
+		}
+		memcpy(sptr1, sbuf, lockbytes1);
+		if (lockbytes1 < 2*cnt)
+			memcpy(sptr2, sbuf + lockbytes1/2, 2*cnt - lockbytes1);
+		if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+			lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+			goto err;
+		}
+		state.playptr = (state.playptr + 2*cnt) % state.playbufsz;
+		/* get output delay */
+		if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(state.playbuf, &delay, NULL))) {
+			lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+			goto err;
+		}
+		delay = (state.playbufsz + state.playptr - delay) % state.playbufsz;
+		delay >>= 1;
+		/* adjust speed */
+		lprintf(4, "icnt %d cnt %d odel %u\n", icnt, cnt, delay);
+		if (delay > SNDLATENCY)
+			state.phinceppdsp++;
+		else if (delay < SNDLATENCY)
+			state.phinceppdsp--;
+		if (state.phinceppdsp < (0x9 << (PHASEFRAC-4)) || state.phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+			lprintf(0, "phinceppdsp (0x%05x) out of range\n", state.phinceppdsp);
+			goto err;
+		}
+		/* play games with the LEDS */
+		state.ledcnt += icnt;
+		if (state.ledcnt >= 4000) {
+			state.ledcnt %= 4000;
+			state.ctrlreg += 0x40;
+		}
+	}
+	/* next do the dsp->epp direction */
+	/* read sound */
+	if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(state.recbuf, &delay, NULL))) {
+		lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+		goto err;
+	}
+	ocnts = (state.recbufsz + delay - state.recptr) % state.recbufsz;
+	if (ocnts > 0) {
+		if (FAILED(res = IDirectSoundCaptureBuffer_Lock(state.recbuf, state.recptr, ocnts, 
+								(LPVOID)&sptr1, &lockbytes1,
+								(LPVOID)&sptr2, &lockbytes2, 0))) {
+			lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+			goto err;
+		}
+		memcpy(sbuf, sptr1, lockbytes1);
+		if (lockbytes1 < ocnts)
+			memcpy(sbuf + lockbytes1/2, sptr2, ocnts - lockbytes1);
+		state.recptr = (state.recptr + ocnts) % state.recbufsz;
+		if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(state.recbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+			lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+			goto err;
+		}
+	}
+	ocnts >>= 1;
+	process_output(sbuf, ocnts);
+	if (state.ptt_state == 2) {
+		state.ptt_state = 0;
+		state.ctrlreg &= ~0x20;
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+	}
+	if (!state.ptt_state)
+		goto endper;
+	/* get FIFO count */
+	state.ctrlreg |= 0x20;
+	buf.u[0] = state.ctrlreg | 2;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	ocnt &= 0x7fff;
+	omax = 16384 - ocnt;
+	if (state.ptt_state == 1) {
+		if (ocnt < SNDLATENCY) {
+			memset(buf.s, 0, SNDLATENCY-ocnt);
+			if (parport_epp_write_data(buf.s, SNDLATENCY-ocnt) != SNDLATENCY-ocnt)
+				goto err;
+		}
+		state.ptt_state = 3;
+		goto endper;
+	}
+	if (ocnts > 0) {
+		state.phdspepp &= 0xff;
+		cnt = 0;
+		while (state.phdspepp < (ocnts << PHASEFRAC)) {
+			buf.s[cnt] = sbuf[state.phdspepp >> PHASEFRAC] >> 8;
+			state.phdspepp += state.phincdspepp;
+			cnt++;
+		}
+		if (cnt > omax) {
+			lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+			goto err;
+		}
+		if (parport_epp_write_data(buf.s, cnt) != cnt)
+			goto err;
+		/* reget the FIFO count */
+		buf.u[0] = state.ctrlreg | 2;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		if (parport_epp_read_addr(buf.u, 2) != 2)
+			goto err;
+		ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		ocnt &= 0x7fff;
+	}
+	/* adjust speed */
+	lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+	if (ocnt > SNDLATENCY)
+		state.phincdspepp++;
+	else if (ocnt < SNDLATENCY)
+		state.phincdspepp--;
+	if (state.phincdspepp < (0x9 << (PHASEFRAC-4)) || state.phincdspepp > (0x1f << (PHASEFRAC-4))) {
+		lprintf(0, "phincdspepp (0x%05x) out of range\n", state.phincdspepp);
+		goto err;
+	}
+endper:
+	lprintf(3, "phase increments: 0x%05x 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+	return TRUE;
+
+err:
+	lprintf(0, "EPP timeout\n");
+	IDirectSoundBuffer_Stop(state.playbuf);
+	IDirectSoundCaptureBuffer_Stop(state.recbuf);
+	IDirectSoundBuffer_Release(state.playbuf);
+	IDirectSoundCaptureBuffer_Release(state.recbuf);
+	IDirectSoundCapture_Release(state.dsrec);
+	IDirectSound_Release(state.dsplay);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+	reset_modem();
+	return FALSE;
+}
+
+int audio_start(struct adapter_config *cfg)
+{
+	WNDCLASS wndclass;
+	HRESULT res;
+        WAVEFORMATEX waveformat;
+        DSBUFFERDESC bdesc;
+        DSCBUFFERDESC cbdesc;
+	DWORD lockbytes;
+	int16_t *sptr;
+	int retval = -1;
+	unsigned char buf[2];
+	int i;
+
+	state.dsplay = NULL;
+	state.dsrec = NULL;
+	state.playbuf = NULL;
+	state.recbuf = NULL;
+	state.hwnd = NULL;
+	state.hinst = GetModuleHandleA(0);
+	state.playptr = 0;
+	state.recptr = 0;
+	initstate();
+        lprintf(1, "DirectSound drivers\n");
+        DirectSoundEnumerateA(DSEnumProc, NULL);
+        lprintf(1, "DirectSoundCapture drivers\n");
+        DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+#if 0
+	wndclass.style = CS_HREDRAW | CS_VREDRAW;
+	wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+	wndclass.cbClsExtra = 0;
+	wndclass.cbWndExtra = 0;
+	wndclass.hIcon = NULL;
+	wndclass.hInstance = state.hinst;
+	wndclass.hCursor = NULL;
+	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+	wndclass.lpszMenuName = NULL;
+	wndclass.lpszClassName = "MyClass";
+	if (!RegisterClass(&wndclass)) {
+		lprintf(0, "RegisterClass error, %d\n", GetLastError());
+		return -1;
+	}
+	state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+				    0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+	if (!state.hwnd) {
+		lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+		goto errcreatewin;
+	}
+#else
+	state.hwnd = GetDesktopWindow();
+#endif
+        if (FAILED(res = DirectSoundCreate(NULL, &state.dsplay, NULL))) {
+                lprintf(0, "DirectSoundCreate error %lu\n", res);
+                goto errdscreate;
+        }
+        if (FAILED(res = IDirectSound_SetCooperativeLevel(state.dsplay, state.hwnd, DSSCL_NORMAL))) {
+                lprintf(0, "SetCooperativeLevel error %lu\n", res);
+                goto errdscreate1;
+        }
+        if (FAILED(res = DirectSoundCaptureCreate(NULL, &state.dsrec, NULL))) {
+                lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+                goto errdscreate1;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 8;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = 8000;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&cbdesc, 0, sizeof(cbdesc));
+        cbdesc.dwSize = sizeof(cbdesc);
+        cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+        state.recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        cbdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(state.dsrec, &cbdesc, &state.recbuf, NULL))) {
+                lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+                goto errdscreate2;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 8;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = 8000;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&bdesc, 0, sizeof(bdesc));
+        bdesc.dwSize = sizeof(bdesc);
+        bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+        state.playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        bdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSound_CreateSoundBuffer(state.dsplay, &bdesc, &state.playbuf, NULL))) {
+                lprintf(0, "CreateSoundBuffer error %lu\n", res);
+                goto errdscreate3;
+        }
+	cfg->bitrate = 8000;
+	if ((i = adapter_start_eppsamp(cfg))) {
+		retval = i;
+		lprintf(0, "Cannot initialize the modem\n");
+		goto errdscreate4;
+	}
+	state.phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + 8000 / 2) / 8000;
+	state.phincdspepp = ((1 << PHASEFRAC) * 8000 + cfg->bitrate / 2) / cfg->bitrate;
+	lprintf(2, "epp->dsp phase inc: 0x%05x  dsp->epp phase inc: 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+	lprintf(0, "Audio IO to DirectX\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = 0;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill to nominal queue size and stard soundcard */
+	if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, 0, 2*SNDLATENCY, (LPVOID)&sptr, &lockbytes, NULL, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+                goto errresmodem;
+        }
+	memset(sptr, 0, 2*SNDLATENCY);
+	if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr, lockbytes, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+                goto errresmodem;
+        }
+	state.playptr = SNDLATENCY;
+	if (FAILED(res = IDirectSoundBuffer_Play(state.playbuf, 0, 0, DSBPLAY_LOOPING))) {
+                lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+                goto errresmodem;
+        }
+	if (FAILED(res = IDirectSoundCaptureBuffer_Start(state.recbuf, DSCBSTART_LOOPING))) {
+                lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+                goto errresmodem;
+        }
+	state.tmotag = gtk_timeout_add(100, periodic, NULL);
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+errresmodem:
+	IDirectSoundBuffer_Stop(state.playbuf);
+	IDirectSoundCaptureBuffer_Stop(state.recbuf);
+	reset_modem();
+errdscreate4:
+	IDirectSoundBuffer_Release(state.playbuf);
+errdscreate3:
+	IDirectSoundCaptureBuffer_Release(state.recbuf);
+errdscreate2:
+	IDirectSoundCapture_Release(state.dsrec);
+errdscreate1:
+	IDirectSound_Release(state.dsplay);
+errdscreate:
+#if 0
+	DestroyWindow(state.hwnd);
+errcreatewin:
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	return -1;
+}
+
+#endif /* HAVE_DIRECTX */
+
+/* ---------------------------------------------------------------------- */
diff --git a/eppfm/callbacks.c b/eppfm/callbacks.c
new file mode 100644
index 0000000..c8ac8e3
--- /dev/null
+++ b/eppfm/callbacks.c
@@ -0,0 +1,98 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "eppfm.h"
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+void on_button1750_pressed(GtkButton *button, gpointer user_data)
+{
+	audio_1750(1);
+	audio_ptt(1);
+}
+
+void on_button1750_released(GtkButton *button, gpointer user_data)
+{
+	audio_1750(0);
+	audio_ptt(0);
+}
+
+void on_buttonptt_pressed(GtkButton *button, gpointer user_data)
+{
+	audio_ptt(1);
+}
+
+void on_buttonptt_released(GtkButton *button, gpointer user_data)
+{
+	audio_ptt(0);
+}
+
+void on_buttondtmf(GtkButton *button, gpointer user_data)
+{
+	unsigned int data = (unsigned int)user_data;
+
+	if (data >= 0x10)
+		audio_dtmf(data & 15);
+	else
+		audio_dtmf(-1);
+}
+
+void on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_main_quit();
+}
+
+void on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	printf("blah\n");
+}
+
+gboolean on_mainwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	return FALSE;
+}
+
+void on_mainwindow_destroy(GtkObject *object, gpointer user_data)
+{
+	gtk_main_quit();
+}
+
+gboolean on_mainwindow_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+	const char dtmfch[] = "0123456789ABCD*#";
+	char *cp;
+	unsigned v;
+
+	cp = strchr(dtmfch, event->keyval);
+	if (!cp)
+		return FALSE;
+	v = cp - dtmfch;
+	if (v >= 16)
+		return FALSE;
+	audio_dtmf(v);
+	return TRUE;
+	/*printf("key_press: keyval %u length %d\n", event->keyval, event->length);*/
+}
+
+gboolean on_mainwindow_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+	const char dtmfch[] = "0123456789ABCD*#";
+	char *cp;
+	unsigned v;
+
+	cp = strchr(dtmfch, event->keyval);
+	if (!cp)
+		return FALSE;
+	v = cp - dtmfch;
+	if (v >= 16)
+		return FALSE;
+	audio_dtmf(-1);
+	return TRUE;
+	/*printf("key_release: keyval %u length %d\n", event->keyval, event->length);*/
+}
diff --git a/eppfm/callbacks.h b/eppfm/callbacks.h
new file mode 100644
index 0000000..3e37178
--- /dev/null
+++ b/eppfm/callbacks.h
@@ -0,0 +1,53 @@
+#include <gtk/gtk.h>
+
+
+gboolean
+on_mainwindow_key_press_event          (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_key_release_event        (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_delete_event             (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+void
+on_mainwindow_destroy                  (GtkObject       *object,
+                                        gpointer         user_data);
+
+void
+on_exit_activate                       (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_about_activate                      (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_button1750_pressed                  (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_button1750_released                 (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_buttonptt_pressed                   (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_buttonptt_released                  (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_buttondtmf                          (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_buttondtmf                          (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/eppfm/costab.c b/eppfm/costab.c
new file mode 100644
index 0000000..8ad2ae1
--- /dev/null
+++ b/eppfm/costab.c
@@ -0,0 +1,74 @@
+#include <sys/types.h>
+#include "eppfm.h"
+
+/*
+ * cosine table
+ */
+
+const int16_t costab[512] = {
+	 32767,  32764,  32757,  32744,  32727,  32705,  32678,  32646, 
+	 32609,  32567,  32520,  32468,  32412,  32350,  32284,  32213, 
+	 32137,  32056,  31970,  31880,  31785,  31684,  31580,  31470, 
+	 31356,  31236,  31113,  30984,  30851,  30713,  30571,  30424, 
+	 30272,  30116,  29955,  29790,  29621,  29446,  29268,  29085, 
+	 28897,  28706,  28510,  28309,  28105,  27896,  27683,  27466, 
+	 27244,  27019,  26789,  26556,  26318,  26077,  25831,  25582, 
+	 25329,  25072,  24811,  24546,  24278,  24006,  23731,  23452, 
+	 23169,  22883,  22594,  22301,  22004,  21705,  21402,  21096, 
+	 20787,  20474,  20159,  19840,  19519,  19194,  18867,  18537, 
+	 18204,  17868,  17530,  17189,  16845,  16499,  16150,  15799, 
+	 15446,  15090,  14732,  14372,  14009,  13645,  13278,  12909, 
+	 12539,  12166,  11792,  11416,  11038,  10659,  10278,   9895, 
+	  9511,   9126,   8739,   8351,   7961,   7571,   7179,   6786, 
+	  6392,   5997,   5601,   5205,   4807,   4409,   4011,   3611, 
+	  3211,   2811,   2410,   2009,   1607,   1206,    804,    402, 
+	     0,   -402,   -804,  -1206,  -1607,  -2009,  -2410,  -2811, 
+	 -3211,  -3611,  -4011,  -4409,  -4807,  -5205,  -5601,  -5997, 
+	 -6392,  -6786,  -7179,  -7571,  -7961,  -8351,  -8739,  -9126, 
+	 -9511,  -9895, -10278, -10659, -11038, -11416, -11792, -12166, 
+	-12539, -12909, -13278, -13645, -14009, -14372, -14732, -15090, 
+	-15446, -15799, -16150, -16499, -16845, -17189, -17530, -17868, 
+	-18204, -18537, -18867, -19194, -19519, -19840, -20159, -20474, 
+	-20787, -21096, -21402, -21705, -22004, -22301, -22594, -22883, 
+	-23169, -23452, -23731, -24006, -24278, -24546, -24811, -25072, 
+	-25329, -25582, -25831, -26077, -26318, -26556, -26789, -27019, 
+	-27244, -27466, -27683, -27896, -28105, -28309, -28510, -28706, 
+	-28897, -29085, -29268, -29446, -29621, -29790, -29955, -30116, 
+	-30272, -30424, -30571, -30713, -30851, -30984, -31113, -31236, 
+	-31356, -31470, -31580, -31684, -31785, -31880, -31970, -32056, 
+	-32137, -32213, -32284, -32350, -32412, -32468, -32520, -32567, 
+	-32609, -32646, -32678, -32705, -32727, -32744, -32757, -32764, 
+	-32767, -32764, -32757, -32744, -32727, -32705, -32678, -32646, 
+	-32609, -32567, -32520, -32468, -32412, -32350, -32284, -32213, 
+	-32137, -32056, -31970, -31880, -31785, -31684, -31580, -31470, 
+	-31356, -31236, -31113, -30984, -30851, -30713, -30571, -30424, 
+	-30272, -30116, -29955, -29790, -29621, -29446, -29268, -29085, 
+	-28897, -28706, -28510, -28309, -28105, -27896, -27683, -27466, 
+	-27244, -27019, -26789, -26556, -26318, -26077, -25831, -25582, 
+	-25329, -25072, -24811, -24546, -24278, -24006, -23731, -23452, 
+	-23169, -22883, -22594, -22301, -22004, -21705, -21402, -21096, 
+	-20787, -20474, -20159, -19840, -19519, -19194, -18867, -18537, 
+	-18204, -17868, -17530, -17189, -16845, -16499, -16150, -15799, 
+	-15446, -15090, -14732, -14372, -14009, -13645, -13278, -12909, 
+	-12539, -12166, -11792, -11416, -11038, -10659, -10278,  -9895, 
+	 -9511,  -9126,  -8739,  -8351,  -7961,  -7571,  -7179,  -6786, 
+	 -6392,  -5997,  -5601,  -5205,  -4807,  -4409,  -4011,  -3611, 
+	 -3211,  -2811,  -2410,  -2009,  -1607,  -1206,   -804,   -402, 
+	     0,    402,    804,   1206,   1607,   2009,   2410,   2811, 
+	  3211,   3611,   4011,   4409,   4807,   5205,   5601,   5997, 
+	  6392,   6786,   7179,   7571,   7961,   8351,   8739,   9126, 
+	  9511,   9895,  10278,  10659,  11038,  11416,  11792,  12166, 
+	 12539,  12909,  13278,  13645,  14009,  14372,  14732,  15090, 
+	 15446,  15799,  16150,  16499,  16845,  17189,  17530,  17868, 
+	 18204,  18537,  18867,  19194,  19519,  19840,  20159,  20474, 
+	 20787,  21096,  21402,  21705,  22004,  22301,  22594,  22883, 
+	 23169,  23452,  23731,  24006,  24278,  24546,  24811,  25072, 
+	 25329,  25582,  25831,  26077,  26318,  26556,  26789,  27019, 
+	 27244,  27466,  27683,  27896,  28105,  28309,  28510,  28706, 
+	 28897,  29085,  29268,  29446,  29621,  29790,  29955,  30116, 
+	 30272,  30424,  30571,  30713,  30851,  30984,  31113,  31236, 
+	 31356,  31470,  31580,  31684,  31785,  31880,  31970,  32056, 
+	 32137,  32213,  32284,  32350,  32412,  32468,  32520,  32567, 
+	 32609,  32646,  32678,  32705,  32727,  32744,  32757,  32764
+};
+
diff --git a/eppfm/eppfm.h b/eppfm/eppfm.h
new file mode 100644
index 0000000..e8c5f30
--- /dev/null
+++ b/eppfm/eppfm.h
@@ -0,0 +1,54 @@
+/*****************************************************************************/
+
+/*
+ *      eppfm.h  --  Function prototypes for "virtual transceiver".
+ *
+ *      Copyright (C) 1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _EPPFM_H
+#define _EPPFM_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern const int16_t costab[512];
+#define COS(x) costab[((x)>>7)&0x1ff]
+#define SIN(x) COS((x)+0xc000)
+
+/* ---------------------------------------------------------------------- */
+
+extern void audio_ptt(int ptt);
+extern void audio_stop(void);
+extern int audio_start(struct adapter_config *cfg);
+extern void audio_1750(int on);
+extern void audio_dtmf(int ch);
+extern unsigned audio_getilevel(void);
+extern unsigned audio_getolevel(void);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _EPPFM_H */
diff --git a/eppfm/gentbl.c b/eppfm/gentbl.c
new file mode 100644
index 0000000..af75b98
--- /dev/null
+++ b/eppfm/gentbl.c
@@ -0,0 +1,72 @@
+/*****************************************************************************/
+
+/*
+ *      gentbl.c  -- Soundmodem table generator.
+ *
+ *      Copyright (C) 1996-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+/* -------------------------------------------------------------------- */
+
+static const char *progname;
+
+/* -------------------------------------------------------------------- */
+
+static void gen_costab(unsigned size, const char *fn)
+{
+	FILE *f;
+        int i;
+
+	if (!(f = fopen(fn, "w"))) {
+		fprintf(stderr, "cannot open file costab.c\n");
+		exit(1);
+	}
+	fprintf(f, "#include <sys/types.h>\n#include \"eppfm.h\"\n\n/*\n * cosine table\n */\n\n"
+		"const int16_t costab[%d] = {", size);
+        for (i = 0; i < size; i++) {
+                if (!(i & 7))
+                        fprintf(f, "\n\t");
+                fprintf(f, "%6d", (int)(32767.0*cos(i*(2.0*M_PI)/size)));
+                if (i != (size-1))
+                        fprintf(f, ", ");
+        }
+        fprintf(f, "\n};\n\n");
+}
+
+/* -------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+	progname = argv[0];
+	if (argc < 2) {
+		fprintf(stderr, "usage: gentbl <filename>\n");
+		exit(1);
+	}
+	gen_costab(512, argv[1]);
+	exit(0);
+}
+
+/* -------------------------------------------------------------------- */
diff --git a/eppfm/interface.c b/eppfm/interface.c
new file mode 100644
index 0000000..3f27f1e
--- /dev/null
+++ b/eppfm/interface.c
@@ -0,0 +1,711 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+GtkWidget*
+create_mainwindow ()
+{
+  GtkWidget *mainwindow;
+  GtkWidget *vbox1;
+  GtkWidget *handlebox1;
+  GtkWidget *menubar;
+  guint tmp_key;
+  GtkWidget *file;
+  GtkWidget *file_menu;
+  GtkAccelGroup *file_menu_accels;
+  GtkWidget *exit;
+  GtkWidget *help;
+  GtkWidget *help_menu;
+  GtkAccelGroup *help_menu_accels;
+  GtkWidget *about;
+  GtkWidget *hbox2;
+  GtkWidget *vbox2;
+  GtkWidget *button1750;
+  GtkWidget *buttonptt;
+  GtkWidget *frame1;
+  GtkWidget *table1;
+  GtkWidget *buttondtmf7;
+  GtkWidget *buttondtmf8;
+  GtkWidget *buttondtmf9;
+  GtkWidget *buttondtmf10;
+  GtkWidget *buttondtmf4;
+  GtkWidget *buttondtmf5;
+  GtkWidget *buttondtmf6;
+  GtkWidget *buttondtmf11;
+  GtkWidget *buttondtmf12;
+  GtkWidget *buttondtmf3;
+  GtkWidget *buttondtmf2;
+  GtkWidget *buttondtmf1;
+  GtkWidget *buttondtmf14;
+  GtkWidget *buttondtmf0;
+  GtkWidget *buttondtmf15;
+  GtkWidget *buttondtmf13;
+  GtkWidget *table2;
+  GtkWidget *label1;
+  GtkWidget *label2;
+  GtkWidget *hbox3;
+  GtkWidget *partxctcss;
+  GtkWidget *partxctcssfreq;
+  GList *partxctcssfreq_items = NULL;
+  GtkWidget *hbox4;
+  GtkWidget *parrxctcss;
+  GtkWidget *parrxctcssfreq;
+  GList *parrxctcssfreq_items = NULL;
+  GtkWidget *parsql;
+  GtkWidget *meterrx;
+  GtkWidget *metertx;
+  GtkWidget *metersql;
+  GtkAccelGroup *accel_group;
+
+  accel_group = gtk_accel_group_new ();
+
+  mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_ref (mainwindow);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "mainwindow", mainwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_set_usize (mainwindow, 512, 256);
+  gtk_widget_set_events (mainwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+  gtk_window_set_title (GTK_WINDOW (mainwindow), "EPP FM - Computer Aided Transceiver");
+
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox1", vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox1);
+  gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
+
+  handlebox1 = gtk_handle_box_new ();
+  gtk_widget_ref (handlebox1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox1", handlebox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (handlebox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
+
+  menubar = gtk_menu_bar_new ();
+  gtk_widget_ref (menubar);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "menubar", menubar,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (menubar);
+  gtk_container_add (GTK_CONTAINER (handlebox1), menubar);
+
+  file = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (file)->child),
+                                   "_File");
+  gtk_widget_add_accelerator (file, "activate_item", accel_group,
+                              tmp_key, GDK_MOD1_MASK, 0);
+  gtk_widget_ref (file);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file", file,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (file);
+  gtk_container_add (GTK_CONTAINER (menubar), file);
+
+  file_menu = gtk_menu_new ();
+  gtk_widget_ref (file_menu);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file_menu", file_menu,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu);
+  file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu));
+
+  exit = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (exit)->child),
+                                   "_Exit");
+  gtk_widget_add_accelerator (exit, "activate_item", file_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_ref (exit);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "exit", exit,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (exit);
+  gtk_container_add (GTK_CONTAINER (file_menu), exit);
+  gtk_widget_add_accelerator (exit, "activate", accel_group,
+                              GDK_Q, GDK_MOD1_MASK,
+                              GTK_ACCEL_VISIBLE);
+
+  help = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (help)->child),
+                                   "_Help");
+  gtk_widget_add_accelerator (help, "activate_item", accel_group,
+                              tmp_key, GDK_MOD1_MASK, 0);
+  gtk_widget_ref (help);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help", help,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (help);
+  gtk_container_add (GTK_CONTAINER (menubar), help);
+  gtk_menu_item_right_justify (GTK_MENU_ITEM (help));
+
+  help_menu = gtk_menu_new ();
+  gtk_widget_ref (help_menu);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help_menu", help_menu,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
+  help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu));
+
+  about = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (about)->child),
+                                   "_About");
+  gtk_widget_add_accelerator (about, "activate_item", help_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_ref (about);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "about", about,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (about);
+  gtk_container_add (GTK_CONTAINER (help_menu), about);
+  gtk_widget_add_accelerator (about, "activate", accel_group,
+                              GDK_A, GDK_MOD1_MASK,
+                              GTK_ACCEL_VISIBLE);
+
+  hbox2 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox2", hbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0);
+
+  vbox2 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (vbox2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox2", vbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox2);
+  gtk_box_pack_start (GTK_BOX (hbox2), vbox2, TRUE, TRUE, 0);
+
+  button1750 = gtk_button_new_with_label ("1750");
+  gtk_widget_ref (button1750);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "button1750", button1750,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (button1750);
+  gtk_box_pack_start (GTK_BOX (vbox2), button1750, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (button1750), 4);
+
+  buttonptt = gtk_button_new_with_label ("PTT");
+  gtk_widget_ref (buttonptt);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonptt", buttonptt,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonptt);
+  gtk_box_pack_start (GTK_BOX (vbox2), buttonptt, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttonptt), 4);
+
+  frame1 = gtk_frame_new ("DTMF Keypad");
+  gtk_widget_ref (frame1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame1", frame1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame1);
+  gtk_box_pack_start (GTK_BOX (hbox2), frame1, TRUE, TRUE, 0);
+
+  table1 = gtk_table_new (4, 4, FALSE);
+  gtk_widget_ref (table1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "table1", table1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table1);
+  gtk_container_add (GTK_CONTAINER (frame1), table1);
+
+  buttondtmf7 = gtk_button_new_with_label ("7");
+  gtk_widget_ref (buttondtmf7);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf7", buttondtmf7,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf7);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf7, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf7), 4);
+
+  buttondtmf8 = gtk_button_new_with_label ("8");
+  gtk_widget_ref (buttondtmf8);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf8", buttondtmf8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf8);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf8, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf8), 4);
+
+  buttondtmf9 = gtk_button_new_with_label ("9");
+  gtk_widget_ref (buttondtmf9);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf9", buttondtmf9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf9);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf9, 2, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf9), 4);
+
+  buttondtmf10 = gtk_button_new_with_label ("A");
+  gtk_widget_ref (buttondtmf10);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf10", buttondtmf10,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf10);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf10, 3, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf10), 4);
+
+  buttondtmf4 = gtk_button_new_with_label ("4");
+  gtk_widget_ref (buttondtmf4);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf4", buttondtmf4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf4);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf4, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf4), 4);
+
+  buttondtmf5 = gtk_button_new_with_label ("5");
+  gtk_widget_ref (buttondtmf5);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf5", buttondtmf5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf5);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf5, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf5), 4);
+
+  buttondtmf6 = gtk_button_new_with_label ("6");
+  gtk_widget_ref (buttondtmf6);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf6", buttondtmf6,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf6);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf6, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf6), 4);
+
+  buttondtmf11 = gtk_button_new_with_label ("B");
+  gtk_widget_ref (buttondtmf11);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf11", buttondtmf11,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf11);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf11, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf11), 4);
+
+  buttondtmf12 = gtk_button_new_with_label ("C");
+  gtk_widget_ref (buttondtmf12);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf12", buttondtmf12,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf12);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf12, 3, 4, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf12), 4);
+
+  buttondtmf3 = gtk_button_new_with_label ("3");
+  gtk_widget_ref (buttondtmf3);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf3", buttondtmf3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf3);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf3, 2, 3, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf3), 4);
+
+  buttondtmf2 = gtk_button_new_with_label ("2");
+  gtk_widget_ref (buttondtmf2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf2", buttondtmf2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf2);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf2, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf2), 4);
+
+  buttondtmf1 = gtk_button_new_with_label ("1");
+  gtk_widget_ref (buttondtmf1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf1", buttondtmf1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf1);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf1, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf1), 4);
+
+  buttondtmf14 = gtk_button_new_with_label ("*");
+  gtk_widget_ref (buttondtmf14);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf14", buttondtmf14,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf14);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf14, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf14), 4);
+
+  buttondtmf0 = gtk_button_new_with_label ("0");
+  gtk_widget_ref (buttondtmf0);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf0", buttondtmf0,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf0);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf0, 1, 2, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf0), 4);
+
+  buttondtmf15 = gtk_button_new_with_label ("#");
+  gtk_widget_ref (buttondtmf15);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf15", buttondtmf15,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf15);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf15, 2, 3, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf15), 4);
+
+  buttondtmf13 = gtk_button_new_with_label ("D");
+  gtk_widget_ref (buttondtmf13);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf13", buttondtmf13,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf13);
+  gtk_table_attach (GTK_TABLE (table1), buttondtmf13, 3, 4, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (buttondtmf13), 4);
+
+  table2 = gtk_table_new (7, 2, FALSE);
+  gtk_widget_ref (table2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "table2", table2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table2);
+  gtk_box_pack_start (GTK_BOX (hbox2), table2, TRUE, TRUE, 0);
+
+  label1 = gtk_label_new ("TX CTCSS");
+  gtk_widget_ref (label1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label1", label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label1);
+  gtk_table_attach (GTK_TABLE (table2), label1, 0, 1, 0, 1,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_misc_set_padding (GTK_MISC (label1), 3, 3);
+
+  label2 = gtk_label_new ("RX CTCSS");
+  gtk_widget_ref (label2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label2", label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label2);
+  gtk_table_attach (GTK_TABLE (table2), label2, 0, 1, 1, 2,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_misc_set_padding (GTK_MISC (label2), 3, 3);
+
+  hbox3 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox3);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox3", hbox3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox3);
+  gtk_table_attach (GTK_TABLE (table2), hbox3, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  partxctcss = gtk_check_button_new_with_label ("");
+  gtk_widget_ref (partxctcss);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "partxctcss", partxctcss,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (partxctcss);
+  gtk_box_pack_start (GTK_BOX (hbox3), partxctcss, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (partxctcss), 3);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (partxctcss), TRUE);
+
+  partxctcssfreq = gtk_combo_new ();
+  gtk_widget_ref (partxctcssfreq);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "partxctcssfreq", partxctcssfreq,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (partxctcssfreq);
+  gtk_box_pack_start (GTK_BOX (hbox3), partxctcssfreq, TRUE, TRUE, 0);
+  gtk_widget_set_usize (GTK_COMBO (partxctcssfreq)->entry, 34, -2);
+  gtk_widget_set_usize (partxctcssfreq, 50, -2);
+  gtk_container_set_border_width (GTK_CONTAINER (partxctcssfreq), 3);
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "67.0");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "69.3");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "71.9");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "74.4");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "77.0");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "79.7");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "82.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "85.4");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "88.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "91.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "94.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "97.4");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "100.0");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "103.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "107.2");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "110.9");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "114.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "118.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "123.0");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "127.3");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "131.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "136.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "141.3");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "146.2");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "151.4");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "156.7");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "162.2");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "167.9");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "173.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "179.9");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "186.2");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "192.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "203.5");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "210.7");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "218.1");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "225.7");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "233.6");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "241.8");
+  partxctcssfreq_items = g_list_append (partxctcssfreq_items, "250.3");
+  gtk_combo_set_popdown_strings (GTK_COMBO (partxctcssfreq), partxctcssfreq_items);
+  g_list_free (partxctcssfreq_items);
+
+  hbox4 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox4);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox4", hbox4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox4);
+  gtk_table_attach (GTK_TABLE (table2), hbox4, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  parrxctcss = gtk_check_button_new_with_label ("");
+  gtk_widget_ref (parrxctcss);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parrxctcss", parrxctcss,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (parrxctcss);
+  gtk_box_pack_start (GTK_BOX (hbox4), parrxctcss, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (parrxctcss), 3);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (parrxctcss), TRUE);
+
+  parrxctcssfreq = gtk_combo_new ();
+  gtk_widget_ref (parrxctcssfreq);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parrxctcssfreq", parrxctcssfreq,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (parrxctcssfreq);
+  gtk_box_pack_start (GTK_BOX (hbox4), parrxctcssfreq, TRUE, TRUE, 0);
+  gtk_widget_set_usize (GTK_COMBO (parrxctcssfreq)->entry, 34, -2);
+  gtk_widget_set_usize (parrxctcssfreq, 50, -2);
+  gtk_container_set_border_width (GTK_CONTAINER (parrxctcssfreq), 3);
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "67.0");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "69.3");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "71.9");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "74.4");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "77.0");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "79.7");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "82.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "85.4");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "88.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "91.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "94.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "97.4");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "100.0");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "103.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "107.2");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "110.9");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "114.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "118.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "123.0");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "127.3");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "131.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "136.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "141.3");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "146.2");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "151.4");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "156.7");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "162.2");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "167.9");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "173.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "179.9");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "186.2");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "192.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "203.5");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "210.7");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "218.1");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "225.7");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "233.6");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "241.8");
+  parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "250.3");
+  gtk_combo_set_popdown_strings (GTK_COMBO (parrxctcssfreq), parrxctcssfreq_items);
+  g_list_free (parrxctcssfreq_items);
+
+  parsql = gtk_check_button_new_with_label ("Squelch");
+  gtk_widget_ref (parsql);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parsql", parsql,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (parsql);
+  gtk_table_attach (GTK_TABLE (table2), parsql, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (parsql), 3);
+
+  meterrx = gtk_progress_bar_new ();
+  gtk_widget_ref (meterrx);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "meterrx", meterrx,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (meterrx);
+  gtk_box_pack_start (GTK_BOX (hbox2), meterrx, FALSE, FALSE, 0);
+  gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (meterrx), GTK_PROGRESS_BOTTOM_TO_TOP);
+  gtk_progress_set_show_text (GTK_PROGRESS (meterrx), TRUE);
+  gtk_progress_set_format_string (GTK_PROGRESS (meterrx), "%3V");
+
+  metertx = gtk_progress_bar_new ();
+  gtk_widget_ref (metertx);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "metertx", metertx,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (metertx);
+  gtk_box_pack_start (GTK_BOX (hbox2), metertx, FALSE, FALSE, 0);
+  gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (metertx), GTK_PROGRESS_BOTTOM_TO_TOP);
+  gtk_progress_set_show_text (GTK_PROGRESS (metertx), TRUE);
+  gtk_progress_set_format_string (GTK_PROGRESS (metertx), "%3V");
+
+  metersql = gtk_progress_bar_new ();
+  gtk_widget_ref (metersql);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "metersql", metersql,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (metersql);
+  gtk_box_pack_start (GTK_BOX (hbox2), metersql, FALSE, FALSE, 0);
+  gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (metersql), GTK_PROGRESS_BOTTOM_TO_TOP);
+  gtk_progress_set_show_text (GTK_PROGRESS (metersql), TRUE);
+  gtk_progress_set_format_string (GTK_PROGRESS (metersql), "%3V");
+
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_delete_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "destroy",
+                      GTK_SIGNAL_FUNC (on_mainwindow_destroy),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "key_press_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_key_press_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "key_release_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_key_release_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (exit), "activate",
+                      GTK_SIGNAL_FUNC (on_exit_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (about), "activate",
+                      GTK_SIGNAL_FUNC (on_about_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (button1750), "pressed",
+                      GTK_SIGNAL_FUNC (on_button1750_pressed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (button1750), "released",
+                      GTK_SIGNAL_FUNC (on_button1750_released),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonptt), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttonptt_pressed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonptt), "released",
+                      GTK_SIGNAL_FUNC (on_buttonptt_released),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf7), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x17);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf7), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x07);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf8), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x18);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf8), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x08);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf9), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x19);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf9), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x09);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf10), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1a);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf10), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0a);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf4), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x14);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf4), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x04);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf5), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x15);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf5), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x05);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf6), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x16);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf6), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x06);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf11), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1b);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf11), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0b);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf12), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1c);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf12), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0c);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf3), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x13);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf3), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x03);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf2), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x12);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf2), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x02);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf1), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x11);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf1), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x01);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf14), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1e);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf14), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0e);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf0), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x10);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf0), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x00);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf15), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1f);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf15), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0f);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf13), "pressed",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x1d);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf13), "released",
+                      GTK_SIGNAL_FUNC (on_buttondtmf),
+                      0x0d);
+
+  gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
+
+  return mainwindow;
+}
+
diff --git a/eppfm/interface.h b/eppfm/interface.h
new file mode 100644
index 0000000..6cb95d4
--- /dev/null
+++ b/eppfm/interface.h
@@ -0,0 +1,5 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_mainwindow (void);
diff --git a/eppfm/main.c b/eppfm/main.c
new file mode 100644
index 0000000..ff246cf
--- /dev/null
+++ b/eppfm/main.c
@@ -0,0 +1,179 @@
+/*****************************************************************************/
+
+/*
+ *      main.c  --  Main routines for "virtual transceiver".
+ *
+ *      Copyright (C) 1999-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "eppfm"
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include "eppfm.h"
+
+#include "interface.h"
+#include "support.h"
+
+/* ---------------------------------------------------------------------- */
+
+static struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+
+/* ---------------------------------------------------------------------- */
+
+/*OutputDebugStringA*/
+int lprintf(unsigned vl, const char *format, ...)
+{
+        va_list ap;
+        int r;
+
+        if (vl > verboselevel)
+                return 0;
+        va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+        if (syslogmsg) {
+                static const int logprio[] = { LOG_ERR, LOG_INFO };
+                vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+                r = 0;
+        } else
+#endif
+                r = vfprintf(stderr, format, ap);
+        va_end(ap);
+        return r;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic(gpointer data)
+{
+	GtkWidget *mainwindow = (GtkWidget *)data;
+	GtkWidget *meterrx;
+	GtkWidget *metertx;
+	unsigned ilvl, olvl;
+
+	ilvl = audio_getilevel();
+	olvl = audio_getolevel();
+	printf("ilvl %5u  log %6.2f\n", ilvl, log(ilvl ? ilvl : 1) * (1.0 / 11.09));
+	meterrx = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "meterrx"));
+	metertx = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "metertx"));
+	gtk_progress_set_percentage(GTK_PROGRESS(meterrx), log(ilvl ? ilvl : 1) * (1.0 / 11.09));
+	gtk_progress_set_percentage(GTK_PROGRESS(metertx), log(olvl ? olvl : 1) * (1.0 / 11.09));
+	return TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+	GtkWidget *mainwindow;
+	gint tmtag;
+        int c, err = 0;
+        unsigned iobase = 0x378;
+
+        printf("EPP virtual transceiver  (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+#if 0
+	bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
+	textdomain (PACKAGE);
+#endif
+
+	gtk_set_locale();
+	gtk_init(&argc, &argv);
+
+#if 0
+	add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps");
+	add_pixmap_directory(PACKAGE_SOURCE_DIR "/pixmaps");
+#endif
+
+        while ((c = getopt(argc, argv, "svp:m:")) != EOF) {
+                switch (c) {
+                case 'p': 
+                        iobase = strtoul(optarg, NULL, 0);
+                        if (iobase <= 0 || iobase >= 0x3f8)
+                                err++;
+                        break;
+
+		case 'm':
+			parseconfig(&cfg, optarg);
+			break;
+
+                case 'v':
+                        verboselevel++;
+                        break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+                case 's':
+                        if (syslogmsg)
+                                break;
+                        openlog("eppfpga", LOG_PID, LOG_USER);
+                        syslogmsg = 1;
+                        break;
+#endif
+
+                default:
+                        err++;
+                        break;
+                }
+        }
+        if (err) {
+                g_message("usage: %s [-v] [-p <portaddr>] [-m <modestr>]\n", argv[0]);
+                exit(1);
+        }
+        if (parport_init_direct(iobase)) {
+                g_error("no parport found at 0x%x\n", iobase);
+                exit(1);
+        }
+	if (audio_start(&cfg)) {
+		g_error("Cannot start audio services\n");
+                exit(1);
+	}
+	mainwindow = create_mainwindow();
+	gtk_widget_show(mainwindow);
+	tmtag = gtk_timeout_add(250, periodic, mainwindow);
+	gtk_main();
+	gtk_timeout_remove(tmtag);
+	audio_stop();
+	return 0;
+}
+
diff --git a/eppfm/support.c b/eppfm/support.c
new file mode 100644
index 0000000..00c43db
--- /dev/null
+++ b/eppfm/support.c
@@ -0,0 +1,158 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists        (const gchar     *directory,
+                                        const gchar     *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap  (GtkWidget       *widget);
+
+GtkWidget*
+lookup_widget                          (GtkWidget       *widget,
+                                        const gchar     *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+                                                   widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+"  c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap                    (GtkWidget       *widget)
+{
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+                                                     NULL, dummy_pixmap_xpm);
+  if (gdkpixmap == NULL)
+    g_error ("Couldn't create replacement pixmap.");
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (const gchar     *directory)
+{
+  pixmaps_directories = g_list_prepend (pixmaps_directories,
+                                        g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        const gchar     *filename)
+{
+  gchar *found_filename = NULL;
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+  GList *elem;
+
+  /* We first try any pixmaps directories set by the application. */
+  elem = pixmaps_directories;
+  while (elem)
+    {
+      found_filename = check_file_exists ((gchar*)elem->data, filename);
+      if (found_filename)
+        break;
+      elem = elem->next;
+    }
+
+  /* If we haven't found the pixmap, try the source directory. */
+  if (!found_filename)
+    {
+      found_filename = check_file_exists ("../pixmaps", filename);
+    }
+
+  if (!found_filename)
+    {
+      g_warning ("Couldn't find pixmap file: %s", filename);
+      return create_dummy_pixmap (widget);
+    }
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+                                                   NULL, found_filename);
+  if (gdkpixmap == NULL)
+    {
+      g_warning ("Error loading pixmap file: %s", found_filename);
+      g_free (found_filename);
+      return create_dummy_pixmap (widget);
+    }
+  g_free (found_filename);
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists                      (const gchar     *directory,
+                                        const gchar     *filename)
+{
+  gchar *full_filename;
+  struct stat s;
+  gint status;
+
+  full_filename = (gchar*) g_malloc (strlen (directory) + 1
+                                     + strlen (filename) + 1);
+  strcpy (full_filename, directory);
+  strcat (full_filename, G_DIR_SEPARATOR_S);
+  strcat (full_filename, filename);
+
+  status = stat (full_filename, &s);
+  if (status == 0 && S_ISREG (s.st_mode))
+    return full_filename;
+  g_free (full_filename);
+  return NULL;
+}
+
diff --git a/eppfm/support.h b/eppfm/support.h
new file mode 100644
index 0000000..61a78e2
--- /dev/null
+++ b/eppfm/support.h
@@ -0,0 +1,34 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#include <gtk/gtk.h>
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*  lookup_widget              (GtkWidget       *widget,
+                                        const gchar     *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void        add_pixmap_directory       (const gchar     *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget*  create_pixmap              (GtkWidget       *widget,
+                                        const gchar     *filename);
+
diff --git a/eppfm2/AUTHORS b/eppfm2/AUTHORS
new file mode 100644
index 0000000..c1e0a1f
--- /dev/null
+++ b/eppfm2/AUTHORS
@@ -0,0 +1 @@
+Thomas Sailer, <sailer at ife.ee.ethz.ch>
diff --git a/eppfm2/ChangeLog b/eppfm2/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/Makefile.am b/eppfm2/Makefile.am
new file mode 100644
index 0000000..a87fefc
--- /dev/null
+++ b/eppfm2/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = src
+
+#install-data-local:
+#	test -d $(srcdir)/pixmaps \
+#	&& install -d -m 0755 $(pkgdatadir)/pixmaps \
+#	&& install -m 0644 $(srcdir)/pixmaps/* $(pkgdatadir)/pixmaps
+
+#dist-hook:
+#	test -d pixmaps \
+#	&& mkdir $(distdir)/pixmaps \
+#	&& cp -p pixmaps/* $(distdir)/pixmaps
+
+EXTRA_DIST = eppfm.glade
diff --git a/eppfm2/Makefile.in b/eppfm2/Makefile.in
new file mode 100644
index 0000000..f9e273a
--- /dev/null
+++ b/eppfm2/Makefile.in
@@ -0,0 +1,332 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+SUBDIRS = src
+
+#install-data-local:
+#	test -d $(srcdir)/pixmaps \
+#	&& install -d -m 0755 $(pkgdatadir)/pixmaps \
+#	&& install -m 0644 $(srcdir)/pixmaps/* $(pkgdatadir)/pixmaps
+
+#dist-hook:
+#	test -d pixmaps \
+#	&& mkdir $(distdir)/pixmaps \
+#	&& cp -p pixmaps/* $(distdir)/pixmaps
+
+EXTRA_DIST = eppfm.glade
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  README AUTHORS ChangeLog Makefile.am Makefile.in NEWS \
+configure configure.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm2/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+ at SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+	  rev="$$subdir $$rev"; \
+	  test "$$subdir" != "." || dot_seen=yes; \
+	done; \
+	test "$$dot_seen" = "no" && rev=". $$rev"; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm2
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+	for subdir in $(SUBDIRS); do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    chmod 777 $(distdir)/$$subdir; \
+	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm2/NEWS b/eppfm2/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/README b/eppfm2/README
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/configure b/eppfm2/configure
new file mode 100755
index 0000000..adc156d
--- /dev/null
+++ b/eppfm2/configure
@@ -0,0 +1,4114 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)"
+ac_help="$ac_help
+  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
+ac_help="$ac_help
+  --disable-gtktest       Do not try to compile and run a test GTK program"
+ac_help="$ac_help
+  --disable-nls           do not use Native Language Support"
+ac_help="$ac_help
+  --with-included-gettext use the GNU gettext library included here"
+ac_help="$ac_help
+  --with-catgets          use catgets functions if available"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=configure.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:568: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+	  if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:621: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=eppfm
+
+VERSION=0.1
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:724: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:737: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:750: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:763: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:776: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:796: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:826: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+	continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:877: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:909: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 920 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:951: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:956: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:965: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:984: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1016: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+  grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+  echo "$ac_t""yes" 1>&6
+  ISC=yes # If later tests want to check for ISC.
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  if test "$GCC" = yes; then
+    CC="$CC -posix"
+  else
+    CC="$CC -Xp"
+  fi
+else
+  echo "$ac_t""no" 1>&6
+  ISC=
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1039: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1069: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+	continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1120: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1152: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1163 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1194: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1199: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1208: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1227: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1262: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX			-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 1278 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+
+int main() {
+
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+
+; return 0; }
+EOF
+if { (eval echo configure:1315: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  am_cv_prog_cc_stdc="$ac_arg"; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CC="$ac_save_CC"
+
+fi
+
+if test -z "$am_cv_prog_cc_stdc"; then
+  echo "$ac_t""none needed" 1>&6
+else
+  echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6
+fi
+case "x$am_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1339: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1354 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1360: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1371 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1388 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1394: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1419: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1424 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1449 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1467 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1488 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+# Check whether --with-gtk-prefix or --without-gtk-prefix was given.
+if test "${with_gtk_prefix+set}" = set; then
+  withval="$with_gtk_prefix"
+  gtk_config_prefix="$withval"
+else
+  gtk_config_prefix=""
+fi
+
+# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
+if test "${with_gtk_exec_prefix+set}" = set; then
+  withval="$with_gtk_exec_prefix"
+  gtk_config_exec_prefix="$withval"
+else
+  gtk_config_exec_prefix=""
+fi
+
+# Check whether --enable-gtktest or --disable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then
+  enableval="$enable_gtktest"
+  :
+else
+  enable_gtktest=yes
+fi
+
+
+  for module in . 
+  do
+      case "$module" in
+         gthread) 
+             gtk_config_args="$gtk_config_args gthread"
+         ;;
+      esac
+  done
+
+  if test x$gtk_config_exec_prefix != x ; then
+     gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+     fi
+  fi
+  if test x$gtk_config_prefix != x ; then
+     gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+     if test x${GTK_CONFIG+set} != xset ; then
+        GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+     fi
+  fi
+
+  # Extract the first word of "gtk-config", so it can be a program name with args.
+set dummy gtk-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1573: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GTK_CONFIG" in
+  /*)
+  ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
+  ;;
+esac
+fi
+GTK_CONFIG="$ac_cv_path_GTK_CONFIG"
+if test -n "$GTK_CONFIG"; then
+  echo "$ac_t""$GTK_CONFIG" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  min_gtk_version=1.2.0
+  echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
+echo "configure:1608: checking for GTK - version >= $min_gtk_version" >&5
+  no_gtk=""
+  if test "$GTK_CONFIG" = "no" ; then
+    no_gtk=yes
+  else
+    GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+    GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+    gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+      rm -f conf.gtktest
+      if test "$cross_compiling" = yes; then
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1631 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.gtktest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If gtk-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+      printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+	   (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+	     GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+        printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+EOF
+if { (eval echo configure:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  no_gtk=yes
+fi
+rm -fr conftest*
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     echo "$ac_t""yes" 1>&6
+     :     
+  else
+     echo "$ac_t""no" 1>&6
+     if test "$GTK_CONFIG" = "no" ; then
+       echo "*** The gtk-config script installed by GTK could not be found"
+       echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GTK_CONFIG environment variable to the"
+       echo "*** full path to gtk-config."
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK test program, checking why..."
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          cat > conftest.$ac_ext <<EOF
+#line 1743 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int main() {
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); 
+; return 0; }
+EOF
+if { (eval echo configure:1753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK or finding the wrong"
+          echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" 
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+          echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+          echo "*** may want to edit the gtk-config script: $GTK_CONFIG" 
+fi
+rm -f conftest*
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; }
+  fi
+  
+  
+  rm -f conf.gtktest
+
+
+ALL_LINGUAS=""
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1796: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1824: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1829 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1878: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1899: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat > conftest.$ac_ext <<EOF
+#line 1906 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1913: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+  inline | yes) ;;
+  no) cat >> confdefs.h <<\EOF
+#define inline 
+EOF
+ ;;
+  *)  cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1939: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1944 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_off_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+  cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1972: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1977 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:2007: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2012 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_header_alloca_h=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:2040: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2045 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_func_alloca_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+  # that cause trouble.  Some versions do not even contain alloca or
+  # contain a buggy version.  If you still want to use their alloca,
+  # use ar to extract alloca.o from them instead of compiling alloca.c.
+  ALLOCA=alloca.${ac_objext}
+  cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2105: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2110 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "webecray" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_os_cray=yes
+else
+  rm -rf conftest*
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2135: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2140 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+  break
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:2190: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2198 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+  exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:2217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_c_stack_direction=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2242: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2247 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2252: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2281: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2286 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2334: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2342 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+	mmap private not fixed
+	mmap private fixed at somewhere currently unmapped
+	mmap private fixed at somewhere already mapped
+	mmap shared not fixed
+	mmap shared fixed at somewhere currently unmapped
+	mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the filesystem buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propogated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h.  */
+# ifndef HAVE_SYS_PARAM_H
+#  define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192	/* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+	char *data, *data2, *data3;
+	int i, pagesize;
+	int fd;
+
+	pagesize = getpagesize();
+
+	/*
+	 * First, make a file with some known garbage in it.
+	 */
+	data = malloc(pagesize);
+	if (!data)
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		*(data + i) = rand();
+	umask(0);
+	fd = creat("conftestmmap", 0600);
+	if (fd < 0)
+		exit(1);
+	if (write(fd, data, pagesize) != pagesize)
+		exit(1);
+	close(fd);
+
+	/*
+	 * Next, try to mmap the file at a fixed address which
+	 * already has something else allocated at it.  If we can,
+	 * also make sure that we see the same garbage.
+	 */
+	fd = open("conftestmmap", O_RDWR);
+	if (fd < 0)
+		exit(1);
+	data2 = malloc(2 * pagesize);
+	if (!data2)
+		exit(1);
+	data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+	if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+	    MAP_PRIVATE | MAP_FIXED, fd, 0L))
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		if (*(data + i) != *(data2 + i))
+			exit(1);
+
+	/*
+	 * Finally, make sure that changes to the mapped area
+	 * do not percolate back to the file as seen by read().
+	 * (This is a bug on some variants of i386 svr4.0.)
+	 */
+	for (i = 0; i < pagesize; ++i)
+		*(data2 + i) = *(data2 + i) + 1;
+	data3 = malloc(pagesize);
+	if (!data3)
+		exit(1);
+	if (read(fd, data3, pagesize) != pagesize)
+		exit(1);
+	for (i = 0; i < pagesize; ++i)
+		if (*(data + i) != *(data3 + i))
+			exit(1);
+	close(fd);
+	unlink("conftestmmap");
+	exit(0);
+}
+
+EOF
+if { (eval echo configure:2482: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+                              
+   for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \
+unistd.h sys/param.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2510: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2515 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+   for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \
+strdup __argz_count __argz_stringify __argz_next
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2550: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2555 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+   if test "${ac_cv_func_stpcpy+set}" != "set"; then
+     for ac_func in stpcpy
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2607: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2612 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+   fi
+   if test "${ac_cv_func_stpcpy}" = "yes"; then
+     cat >> confdefs.h <<\EOF
+#define HAVE_STPCPY 1
+EOF
+
+   fi
+
+   if test $ac_cv_header_locale_h = yes; then
+    echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+echo "configure:2669: checking for LC_MESSAGES" >&5
+if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2674 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int main() {
+return LC_MESSAGES
+; return 0; }
+EOF
+if { (eval echo configure:2681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  am_cv_val_LC_MESSAGES=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
+    if test $am_cv_val_LC_MESSAGES = yes; then
+      cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+    fi
+  fi
+   echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:2702: checking whether NLS is requested" >&5
+        # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval="$enable_nls"
+  USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+    echo "$ac_t""$USE_NLS" 1>&6
+    
+
+    USE_INCLUDED_LIBINTL=no
+
+        if test "$USE_NLS" = "yes"; then
+      cat >> confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+      echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+echo "configure:2722: checking whether included gettext is requested" >&5
+      # Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+  withval="$with_included_gettext"
+  nls_cv_force_use_gnu_gettext=$withval
+else
+  nls_cv_force_use_gnu_gettext=no
+fi
+
+      echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+                        		nls_cv_header_intl=
+	nls_cv_header_libgt=
+	CATOBJEXT=NONE
+
+	ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
+echo "configure:2741: checking for libintl.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2746 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2751: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
+echo "configure:2768: checking for gettext in libc" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2773 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+int main() {
+return (int) gettext ("")
+; return 0; }
+EOF
+if { (eval echo configure:2780: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  gt_cv_func_gettext_libc=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  gt_cv_func_gettext_libc=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
+
+	   if test "$gt_cv_func_gettext_libc" != "yes"; then
+	     echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
+echo "configure:2796: checking for bindtextdomain in -lintl" >&5
+ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lintl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2804 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char bindtextdomain();
+
+int main() {
+bindtextdomain()
+; return 0; }
+EOF
+if { (eval echo configure:2815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
+echo "configure:2831: checking for gettext in libintl" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:2836: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lintl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2844 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:2855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  gt_cv_func_gettext_libintl=yes
+else
+  echo "$ac_t""no" 1>&6
+gt_cv_func_gettext_libintl=no
+fi
+
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	   fi
+
+	   if test "$gt_cv_func_gettext_libc" = "yes" \
+	      || test "$gt_cv_func_gettext_libintl" = "yes"; then
+	      cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+	      # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2894: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MSGFMT" in
+  /*)
+  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+  ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+  echo "$ac_t""$MSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+	      if test "$MSGFMT" != "no"; then
+		for ac_func in dcgettext
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2928: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2933 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+		# Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2983: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GMSGFMT" in
+  /*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+  echo "$ac_t""$GMSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+		# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3019: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$XGETTEXT" in
+  /*)
+  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+  ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+  echo "$ac_t""$XGETTEXT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+		cat > conftest.$ac_ext <<EOF
+#line 3051 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _nl_msg_cat_cntr;
+			       return _nl_msg_cat_cntr
+; return 0; }
+EOF
+if { (eval echo configure:3059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  CATOBJEXT=.gmo
+		   DATADIRNAME=share
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CATOBJEXT=.mo
+		   DATADIRNAME=lib
+fi
+rm -f conftest*
+		INSTOBJEXT=.mo
+	      fi
+	    fi
+	
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+        if test "$CATOBJEXT" = "NONE"; then
+	  echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
+echo "configure:3082: checking whether catgets can be used" >&5
+	  # Check whether --with-catgets or --without-catgets was given.
+if test "${with_catgets+set}" = set; then
+  withval="$with_catgets"
+  nls_cv_use_catgets=$withval
+else
+  nls_cv_use_catgets=no
+fi
+
+	  echo "$ac_t""$nls_cv_use_catgets" 1>&6
+
+	  if test "$nls_cv_use_catgets" = "yes"; then
+	    	    echo $ac_n "checking for main in -li""... $ac_c" 1>&6
+echo "configure:3095: checking for main in -li" >&5
+ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-li  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3103 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:3110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-li $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	    echo $ac_n "checking for catgets""... $ac_c" 1>&6
+echo "configure:3138: checking for catgets" >&5
+if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3143 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char catgets(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char catgets();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_catgets) || defined (__stub___catgets)
+choke me
+#else
+catgets();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_catgets=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_catgets=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_CATGETS 1
+EOF
+
+	       INTLOBJS="\$(CATOBJS)"
+	       # Extract the first word of "gencat", so it can be a program name with args.
+set dummy gencat; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3188: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GENCAT" in
+  /*)
+  ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GENCAT="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no"
+  ;;
+esac
+fi
+GENCAT="$ac_cv_path_GENCAT"
+if test -n "$GENCAT"; then
+  echo "$ac_t""$GENCAT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+	       if test "$GENCAT" != "no"; then
+		 # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3224: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GMSGFMT" in
+  /*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+  ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+  echo "$ac_t""$GMSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+		 if test "$GMSGFMT" = "no"; then
+		   # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3261: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GMSGFMT" in
+  /*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+	ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+  ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+  echo "$ac_t""$GMSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+		 fi
+		 # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3296: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$XGETTEXT" in
+  /*)
+  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+  ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+  echo "$ac_t""$XGETTEXT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+		 USE_INCLUDED_LIBINTL=yes
+		 CATOBJEXT=.cat
+		 INSTOBJEXT=.cat
+		 DATADIRNAME=lib
+		 INTLDEPS='$(top_builddir)/intl/libintl.a'
+		 INTLLIBS=$INTLDEPS
+		 LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+		 nls_cv_header_intl=intl/libintl.h
+		 nls_cv_header_libgt=intl/libgettext.h
+	       fi
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	  fi
+        fi
+
+        if test "$CATOBJEXT" = "NONE"; then
+	  	  	  nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+                INTLOBJS="\$(GETTOBJS)"
+        # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3354: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$MSGFMT" in
+  /*)
+  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt"
+  ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+  echo "$ac_t""$MSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+        # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3388: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$GMSGFMT" in
+  /*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+  echo "$ac_t""$GMSGFMT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+        # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3424: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$XGETTEXT" in
+  /*)
+  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+  ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+  echo "$ac_t""$XGETTEXT" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+        
+	USE_INCLUDED_LIBINTL=yes
+        CATOBJEXT=.gmo
+        INSTOBJEXT=.mo
+        DATADIRNAME=share
+	INTLDEPS='$(top_builddir)/intl/libintl.a'
+	INTLLIBS=$INTLDEPS
+	LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+        nls_cv_header_intl=intl/libintl.h
+        nls_cv_header_libgt=intl/libgettext.h
+      fi
+
+            if test "$XGETTEXT" != ":"; then
+			if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+	  : ;
+	else
+	  echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+	  XGETTEXT=":"
+	fi
+      fi
+
+      # We need to process the po/ directory.
+      POSUB=po
+    else
+      DATADIRNAME=share
+      nls_cv_header_intl=intl/libintl.h
+      nls_cv_header_libgt=intl/libgettext.h
+    fi
+    
+    
+
+
+    # If this is used in GNU gettext we have to set USE_NLS to `yes'
+    # because some of the sources are only built for this goal.
+    if test "$PACKAGE" = gettext; then
+      USE_NLS=yes
+      USE_INCLUDED_LIBINTL=yes
+    fi
+
+                for lang in $ALL_LINGUAS; do
+      GMOFILES="$GMOFILES $lang.gmo"
+      POFILES="$POFILES $lang.po"
+    done
+
+        
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+
+   if test "x$CATOBJEXT" != "x"; then
+     if test "x$ALL_LINGUAS" = "x"; then
+       LINGUAS=
+     else
+       echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
+echo "configure:3517: checking for catalogs to be installed" >&5
+       NEW_LINGUAS=
+       for lang in ${LINGUAS=$ALL_LINGUAS}; do
+         case "$ALL_LINGUAS" in
+          *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+         esac
+       done
+       LINGUAS=$NEW_LINGUAS
+       echo "$ac_t""$LINGUAS" 1>&6
+     fi
+
+          if test -n "$LINGUAS"; then
+       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+     fi
+   fi
+
+            if test $ac_cv_header_locale_h = yes; then
+     INCLUDE_LOCALE_H="#include <locale.h>"
+   else
+     INCLUDE_LOCALE_H="\
+/* The system does not provide the header <locale.h>.  Take care yourself.  */"
+   fi
+   
+
+            test -d intl || mkdir intl
+   if test "$CATOBJEXT" = ".cat"; then
+     ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
+echo "configure:3545: checking for linux/version.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3550 "configure"
+#include "confdefs.h"
+#include <linux/version.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3555: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  msgformat=linux
+else
+  echo "$ac_t""no" 1>&6
+msgformat=xopen
+fi
+
+
+               sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
+   fi
+      sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
+     $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
+
+            if test "$PACKAGE" = "gettext"; then
+     GT_NO="#NO#"
+     GT_YES=
+   else
+     GT_NO=
+     GT_YES="#YES#"
+   fi
+   
+   
+
+            MKINSTALLDIRS=
+   if test -n "$ac_aux_dir"; then
+     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+   fi
+   if test -z "$MKINSTALLDIRS"; then
+     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+   fi
+   
+
+      l=
+   
+
+         test -d po || mkdir po
+   if test "x$srcdir" != "x."; then
+     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+       posrcprefix="$srcdir/"
+     else
+       posrcprefix="../$srcdir/"
+     fi
+   else
+     posrcprefix="../"
+   fi
+   rm -f po/POTFILES
+   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+	< $srcdir/po/POTFILES.in > po/POTFILES
+  
+
+if test "x${prefix}" = "xNONE"; then
+  cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale"
+EOF
+
+else
+  cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale"
+EOF
+
+fi
+
+if test "x${datadir}" = 'x${prefix}/share'; then
+  if test "x${prefix}" = "xNONE"; then
+    cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}"
+EOF
+
+  else
+    cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}"
+EOF
+
+  fi
+else
+  cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}"
+EOF
+
+fi
+
+packagesrcdir=`cd $srcdir && pwd`
+cat >> confdefs.h <<EOF
+#define PACKAGE_SOURCE_DIR "${packagesrcdir}"
+EOF
+
+
+if test "x$GCC" = "xyes"; then
+  case " $CFLAGS " in
+  *[\ \	]-Wall[\ \	]*) ;;
+  *) CFLAGS="$CFLAGS -Wall" ;;
+  esac
+fi
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "
+Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+ config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@GTK_CONFIG@%$GTK_CONFIG%g
+s%@GTK_CFLAGS@%$GTK_CFLAGS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@RANLIB@%$RANLIB%g
+s%@ALLOCA@%$ALLOCA%g
+s%@USE_NLS@%$USE_NLS%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@GENCAT@%$GENCAT%g
+s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
+s%@CATALOGS@%$CATALOGS%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@GMOFILES@%$GMOFILES%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@INTLDEPS@%$INTLDEPS%g
+s%@INTLLIBS@%$INTLLIBS%g
+s%@INTLOBJS@%$INTLOBJS%g
+s%@POFILES@%$POFILES%g
+s%@POSUB@%$POSUB%g
+s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g
+s%@GT_NO@%$GT_NO%g
+s%@GT_YES@%$GT_YES%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@l@%$l%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='\([ 	]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+ac_sources="$nls_cv_header_libgt"
+ac_dests="$nls_cv_header_intl"
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+srcdir=$ac_given_srcdir
+while test -n "$ac_sources"; do
+  set $ac_dests; ac_dest=$1; shift; ac_dests=$*
+  set $ac_sources; ac_source=$1; shift; ac_sources=$*
+
+  echo "linking $srcdir/$ac_source to $ac_dest"
+
+  if test ! -r $srcdir/$ac_source; then
+    { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; }
+  fi
+  rm -f $ac_dest
+
+  # Make relative symlinks.
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then
+    # The dest file is in a subdirectory.
+    test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir"
+    ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dest_dir_suffix.
+    ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dest_dir_suffix= ac_dots=
+  fi
+
+  case "$srcdir" in
+  [/$]*) ac_rel_source="$srcdir/$ac_source" ;;
+  *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
+  esac
+
+  # Make a symlink if possible; otherwise try a hard link.
+  if ln -s $ac_rel_source $ac_dest 2>/dev/null ||
+    ln $srcdir/$ac_source $ac_dest; then :
+  else
+    { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; }
+  fi
+done
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+case "$CONFIG_FILES" in *po/Makefile.in*)
+        sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+      esac
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/eppfm2/configure.in b/eppfm2/configure.in
new file mode 100644
index 0000000..53ce3c5
--- /dev/null
+++ b/eppfm2/configure.in
@@ -0,0 +1,57 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(eppfm, 0.1)
+AM_CONFIG_HEADER(config.h)
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+
+AM_PATH_GTK(1.2.0, ,
+            AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+  AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+dnl Set PACKAGE_DATA_DIR in config.h.
+if test "x${datadir}" = 'x${prefix}/share'; then
+  if test "x${prefix}" = "xNONE"; then
+    AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
+  else
+    AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
+  fi
+else
+  AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
+fi
+
+dnl Set PACKAGE_SOURCE_DIR in config.h.
+packagesrcdir=`cd $srcdir && pwd`
+AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
+
+dnl Use -Wall if we have gcc.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+  case " $CFLAGS " in
+  *[\ \	]-Wall[\ \	]*) ;;
+  *) CFLAGS="$CFLAGS -Wall" ;;
+  esac
+fi
+changequote([,])dnl
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+])
+
diff --git a/eppfm2/eppfm.glade b/eppfm2/eppfm.glade
new file mode 100644
index 0000000..eadf84d
--- /dev/null
+++ b/eppfm2/eppfm.glade
@@ -0,0 +1,1643 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+  <name>eppfm</name>
+  <program_name>eppfm</program_name>
+  <directory></directory>
+  <source_directory>src</source_directory>
+  <pixmaps_directory>pixmaps</pixmaps_directory>
+  <language>C</language>
+  <gnome_support>False</gnome_support>
+  <gettext_support>True</gettext_support>
+  <use_widget_names>True</use_widget_names>
+  <output_main_file>True</output_main_file>
+  <output_support_files>True</output_support_files>
+  <output_build_files>True</output_build_files>
+  <backup_source_files>True</backup_source_files>
+  <main_source_file>interface.c</main_source_file>
+  <main_header_file>interface.h</main_header_file>
+  <handler_source_file>callbacks.c</handler_source_file>
+  <handler_header_file>callbacks.h</handler_header_file>
+  <support_source_file>support.c</support_source_file>
+  <support_header_file>support.h</support_header_file>
+  <translatable_strings_file></translatable_strings_file>
+</project>
+<style>
+  <style_name>aboutname</style_name>
+  <style_font>-adobe-helvetica-medium-r-normal-*-*-240-*-*-p-*-iso8859-1</style_font>
+</style>
+<style>
+  <style_name>aboutcall</style_name>
+  <style_font>-adobe-helvetica-medium-r-normal-*-*-180-*-*-p-*-iso8859-1</style_font>
+</style>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>ioconfiglinux</name>
+  <title>EPPFM Input/Output Configuration</title>
+  <type>GTK_WINDOW_DIALOG</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkVBox</class>
+    <name>vbox1</name>
+    <homogeneous>False</homogeneous>
+    <spacing>0</spacing>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame3</name>
+      <border_width>5</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <label>Soundcard Settings</label>
+      <label_xalign>0</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+	<class>GtkTable</class>
+	<name>table3</name>
+	<rows>2</rows>
+	<columns>2</columns>
+	<homogeneous>False</homogeneous>
+	<row_spacing>0</row_spacing>
+	<column_spacing>0</column_spacing>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>sndrecord</name>
+	  <border_width>3</border_width>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>True</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>/dev/dsp
+/dev/dsp1
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>sndplayback</name>
+	  <border_width>3</border_width>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>True</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>/dev/dsp
+/dev/dsp1
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label5</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Soundcard for Recording</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <wrap>False</wrap>
+	  <xalign>0</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>10</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label6</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>False</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Soundcard for Playback</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <wrap>False</wrap>
+	  <xalign>0</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>10</xpad>
+	  <ypad>0</ypad>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame1</name>
+      <border_width>5</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <label>Parallel Port Driver Settings</label>
+      <label_xalign>0</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+	<class>GtkTable</class>
+	<name>table2</name>
+	<rows>2</rows>
+	<columns>4</columns>
+	<homogeneous>False</homogeneous>
+	<row_spacing>0</row_spacing>
+	<column_spacing>0</column_spacing>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>ioaddr</name>
+	  <border_width>3</border_width>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <width>120</width>
+	  <case_sensitive>False</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>0x378
+0x278
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>devfile</name>
+	  <border_width>3</border_width>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <width>120</width>
+	  <case_sensitive>True</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>/dev/ppuser0
+/dev/ppuser1
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label2</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>IO Address</label>
+	  <justify>GTK_JUSTIFY_CENTER</justify>
+	  <wrap>False</wrap>
+	  <xalign>0</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label3</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>File</label>
+	  <justify>GTK_JUSTIFY_CENTER</justify>
+	  <wrap>False</wrap>
+	  <xalign>0</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>4</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label1</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>False</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>Driver Selection</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <wrap>False</wrap>
+	  <xalign>0.5</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>9</xpad>
+	  <ypad>0</ypad>
+	</widget>
+
+	<widget>
+	  <class>GtkRadioButton</class>
+	  <name>drvdirect</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <label>Direct Parport Access</label>
+	  <active>False</active>
+	  <draw_indicator>True</draw_indicator>
+	  <group>drivergroup</group>
+	</widget>
+
+	<widget>
+	  <class>GtkRadioButton</class>
+	  <name>drvppdev</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <label>ppdev Kernel Driver</label>
+	  <active>False</active>
+	  <draw_indicator>True</draw_indicator>
+	  <group>drivergroup</group>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame2</name>
+      <border_width>5</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <label>Modem Settings</label>
+      <label_xalign>0</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+	<class>GtkTable</class>
+	<name>table1</name>
+	<rows>1</rows>
+	<columns>2</columns>
+	<homogeneous>False</homogeneous>
+	<row_spacing>0</row_spacing>
+	<column_spacing>0</column_spacing>
+
+	<widget>
+	  <class>GtkCombo</class>
+	  <name>fpgaclk</name>
+	  <border_width>3</border_width>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <case_sensitive>False</case_sensitive>
+	  <use_arrows>True</use_arrows>
+	  <use_arrows_always>False</use_arrows_always>
+	  <items>19666600
+9830400
+</items>
+	</widget>
+
+	<widget>
+	  <class>GtkLabel</class>
+	  <name>label4</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>False</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>False</yfill>
+	  </child>
+	  <label>FPGA clock frequency</label>
+	  <justify>GTK_JUSTIFY_LEFT</justify>
+	  <wrap>False</wrap>
+	  <xalign>0</xalign>
+	  <yalign>0.5</yalign>
+	  <xpad>10</xpad>
+	  <ypad>0</ypad>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkHButtonBox</class>
+      <name>hbuttonbox1</name>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <layout_style>GTK_BUTTONBOX_SPREAD</layout_style>
+      <spacing>30</spacing>
+      <child_min_width>85</child_min_width>
+      <child_min_height>27</child_min_height>
+      <child_ipad_x>7</child_ipad_x>
+      <child_ipad_y>0</child_ipad_y>
+
+      <widget>
+	<class>GtkButton</class>
+	<name>buttonok</name>
+	<tooltip>Continue</tooltip>
+	<can_default>True</can_default>
+	<can_focus>True</can_focus>
+	<signal>
+	  <name>clicked</name>
+	  <handler>on_configok_clicked</handler>
+	  <last_modification_time>Wed, 14 Jul 1999 14:41:49 GMT</last_modification_time>
+	</signal>
+	<label>Ok</label>
+      </widget>
+
+      <widget>
+	<class>GtkButton</class>
+	<name>buttonquit</name>
+	<tooltip>Quit the application</tooltip>
+	<can_default>True</can_default>
+	<can_focus>True</can_focus>
+	<signal>
+	  <name>clicked</name>
+	  <handler>on_configquit_clicked</handler>
+	  <last_modification_time>Wed, 14 Jul 1999 14:42:03 GMT</last_modification_time>
+	</signal>
+	<label>Quit</label>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>mainwindow</name>
+  <events>GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</events>
+  <signal>
+    <name>delete_event</name>
+    <handler>on_mainwindow_delete_event</handler>
+    <last_modification_time>Wed, 14 Jul 1999 14:44:29 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>destroy</name>
+    <handler>on_mainwindow_destroy</handler>
+    <last_modification_time>Wed, 14 Jul 1999 14:44:45 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>key_press_event</name>
+    <handler>on_mainwindow_key_event</handler>
+    <last_modification_time>Thu, 15 Jul 1999 12:22:03 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>key_release_event</name>
+    <handler>on_mainwindow_key_event</handler>
+    <last_modification_time>Thu, 15 Jul 1999 12:22:07 GMT</last_modification_time>
+  </signal>
+  <title>EPPFM</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkVBox</class>
+    <name>vbox2</name>
+    <homogeneous>False</homogeneous>
+    <spacing>0</spacing>
+
+    <widget>
+      <class>GtkHandleBox</class>
+      <name>handlebox1</name>
+      <child>
+	<padding>0</padding>
+	<expand>False</expand>
+	<fill>True</fill>
+      </child>
+
+      <widget>
+	<class>GtkMenuBar</class>
+	<name>menubar1</name>
+
+	<widget>
+	  <class>GtkMenuItem</class>
+	  <name>file</name>
+	  <tooltip>File Menu</tooltip>
+	  <label>_File</label>
+	  <right_justify>False</right_justify>
+
+	  <widget>
+	    <class>GtkMenu</class>
+	    <name>file_menu</name>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>dtmf</name>
+	      <signal>
+		<name>activate</name>
+		<handler>on_dtmf_activate</handler>
+		<last_modification_time>Wed, 14 Jul 1999 13:06:53 GMT</last_modification_time>
+	      </signal>
+	      <label>_DTMF keypad...</label>
+	      <right_justify>False</right_justify>
+	    </widget>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>oscilloscope</name>
+	      <signal>
+		<name>activate</name>
+		<handler>on_oscilloscope_activate</handler>
+		<last_modification_time>Wed, 14 Jul 1999 13:07:14 GMT</last_modification_time>
+	      </signal>
+	      <label>_Oscilloscope display...</label>
+	      <right_justify>False</right_justify>
+	    </widget>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>spectrum</name>
+	      <signal>
+		<name>activate</name>
+		<handler>on_spectrum_activate</handler>
+		<last_modification_time>Wed, 14 Jul 1999 13:07:55 GMT</last_modification_time>
+	      </signal>
+	      <label>_Spectrum Display...</label>
+	      <right_justify>False</right_justify>
+	    </widget>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>separator1</name>
+	      <right_justify>False</right_justify>
+	    </widget>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>quit</name>
+	      <signal>
+		<name>activate</name>
+		<handler>on_quit_activate</handler>
+		<last_modification_time>Wed, 14 Jul 1999 13:08:05 GMT</last_modification_time>
+	      </signal>
+	      <label>_Quit</label>
+	      <right_justify>False</right_justify>
+	    </widget>
+	  </widget>
+	</widget>
+
+	<widget>
+	  <class>GtkMenuItem</class>
+	  <name>help</name>
+	  <label>_Help</label>
+	  <right_justify>True</right_justify>
+
+	  <widget>
+	    <class>GtkMenu</class>
+	    <name>help_menu</name>
+
+	    <widget>
+	      <class>GtkMenuItem</class>
+	      <name>about</name>
+	      <signal>
+		<name>activate</name>
+		<handler>on_about_activate</handler>
+		<last_modification_time>Wed, 14 Jul 1999 13:08:36 GMT</last_modification_time>
+	      </signal>
+	      <label>_About</label>
+	      <right_justify>False</right_justify>
+	    </widget>
+	  </widget>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkVBox</class>
+      <name>vbox3</name>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <homogeneous>False</homogeneous>
+      <spacing>0</spacing>
+
+      <widget>
+	<class>GtkProgressBar</class>
+	<name>progressbar1</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>True</expand>
+	  <fill>True</fill>
+	</child>
+	<value>-40</value>
+	<lower>-40</lower>
+	<upper>0</upper>
+	<bar_style>GTK_PROGRESS_CONTINUOUS</bar_style>
+	<orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation>
+	<activity_mode>False</activity_mode>
+	<show_text>True</show_text>
+	<format>%P %%</format>
+	<text_xalign>0.5</text_xalign>
+	<text_yalign>0.5</text_yalign>
+      </widget>
+
+      <widget>
+	<class>GtkProgressBar</class>
+	<name>progressbar2</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>True</expand>
+	  <fill>True</fill>
+	</child>
+	<value>-40</value>
+	<lower>-40</lower>
+	<upper>0</upper>
+	<bar_style>GTK_PROGRESS_CONTINUOUS</bar_style>
+	<orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation>
+	<activity_mode>False</activity_mode>
+	<show_text>True</show_text>
+	<format>%P %%</format>
+	<text_xalign>0.5</text_xalign>
+	<text_yalign>0.5</text_yalign>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkHandleBox</class>
+      <name>handlebox2</name>
+      <child>
+	<padding>0</padding>
+	<expand>False</expand>
+	<fill>True</fill>
+      </child>
+
+      <widget>
+	<class>GtkHBox</class>
+	<name>hbox1</name>
+	<homogeneous>True</homogeneous>
+	<spacing>0</spacing>
+
+	<widget>
+	  <class>GtkToggleButton</class>
+	  <name>buttonptt</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <width>70</width>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>toggled</name>
+	    <handler>on_mainptt_toggled</handler>
+	    <last_modification_time>Wed, 14 Jul 1999 14:42:29 GMT</last_modification_time>
+	  </signal>
+	  <label>PTT</label>
+	  <active>False</active>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>button1750</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_button1750_pressed</handler>
+	    <last_modification_time>Fri, 16 Jul 1999 08:23:22 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_button1750_released</handler>
+	    <last_modification_time>Fri, 16 Jul 1999 08:23:28 GMT</last_modification_time>
+	  </signal>
+	  <label>1750</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>buttonsquelch</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_buttonsquelch_clicked</handler>
+	    <last_modification_time>Fri, 16 Jul 1999 08:14:18 GMT</last_modification_time>
+	  </signal>
+	  <label>Squelch off</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>buttondtmf</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_maindtmf_clicked</handler>
+	    <last_modification_time>Wed, 14 Jul 1999 14:42:42 GMT</last_modification_time>
+	  </signal>
+	  <label>DTMF</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>buttonscope</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_mainscope_clicked</handler>
+	    <last_modification_time>Wed, 14 Jul 1999 14:42:52 GMT</last_modification_time>
+	  </signal>
+	  <label>Scope</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>buttonspectrum</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_mainspectrum_clicked</handler>
+	    <last_modification_time>Wed, 14 Jul 1999 14:43:12 GMT</last_modification_time>
+	  </signal>
+	  <label>Spectrum</label>
+	</widget>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkDialog</class>
+  <name>aboutdialog</name>
+  <signal>
+    <name>delete_event</name>
+    <handler>on_aboutdialog_delete_event</handler>
+    <last_modification_time>Wed, 14 Jul 1999 17:48:48 GMT</last_modification_time>
+  </signal>
+  <title>About</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>True</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkVBox</class>
+    <child_name>Dialog:vbox</child_name>
+    <name>dialog-vbox1</name>
+    <homogeneous>False</homogeneous>
+    <spacing>0</spacing>
+
+    <widget>
+      <class>GtkVBox</class>
+      <name>vbox5</name>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <homogeneous>False</homogeneous>
+      <spacing>0</spacing>
+
+      <widget>
+	<class>GtkLabel</class>
+	<name>label7</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<label>written by:</label>
+	<justify>GTK_JUSTIFY_CENTER</justify>
+	<wrap>False</wrap>
+	<xalign>0</xalign>
+	<yalign>0.5</yalign>
+	<xpad>4</xpad>
+	<ypad>3</ypad>
+      </widget>
+
+      <widget>
+	<class>GtkLabel</class>
+	<name>label8</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<label>Thomas Sailer</label>
+	<justify>GTK_JUSTIFY_CENTER</justify>
+	<wrap>False</wrap>
+	<xalign>0.5</xalign>
+	<yalign>0.5</yalign>
+	<xpad>4</xpad>
+	<ypad>4</ypad>
+      </widget>
+
+      <widget>
+	<class>GtkLabel</class>
+	<name>label9</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<label>HB9JNX/AE4WA</label>
+	<justify>GTK_JUSTIFY_CENTER</justify>
+	<wrap>False</wrap>
+	<xalign>0.5</xalign>
+	<yalign>0.5</yalign>
+	<xpad>4</xpad>
+	<ypad>4</ypad>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkHBox</class>
+      <child_name>Dialog:action_area</child_name>
+      <name>dialog-action_area1</name>
+      <border_width>10</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>False</expand>
+	<fill>True</fill>
+	<pack>GTK_PACK_END</pack>
+      </child>
+      <homogeneous>True</homogeneous>
+      <spacing>5</spacing>
+
+      <widget>
+	<class>GtkButton</class>
+	<name>buttonok</name>
+	<child>
+	  <padding>0</padding>
+	  <expand>False</expand>
+	  <fill>False</fill>
+	</child>
+	<width>80</width>
+	<height>27</height>
+	<can_focus>True</can_focus>
+	<signal>
+	  <name>clicked</name>
+	  <handler>on_aboutok_clicked</handler>
+	  <last_modification_time>Wed, 14 Jul 1999 17:54:16 GMT</last_modification_time>
+	</signal>
+	<label>Ok</label>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>dtmfwindow</name>
+  <events>GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</events>
+  <signal>
+    <name>key_press_event</name>
+    <handler>on_dtmfwindow_key_event</handler>
+    <last_modification_time>Thu, 15 Jul 1999 12:21:28 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>key_release_event</name>
+    <handler>on_dtmfwindow_key_event</handler>
+    <last_modification_time>Thu, 15 Jul 1999 12:21:38 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>delete_event</name>
+    <handler>on_dtmfwindow_delete_event</handler>
+    <last_modification_time>Wed, 14 Jul 1999 17:49:02 GMT</last_modification_time>
+  </signal>
+  <title>DTMF Keypad</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkVBox</class>
+    <name>vbox4</name>
+    <homogeneous>False</homogeneous>
+    <spacing>0</spacing>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame4</name>
+      <border_width>5</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>False</expand>
+	<fill>True</fill>
+      </child>
+      <label>Keys transmitted</label>
+      <label_xalign>0.01</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+	<class>GtkHBox</class>
+	<name>hbox2</name>
+	<homogeneous>False</homogeneous>
+	<spacing>0</spacing>
+
+	<widget>
+	  <class>GtkEntry</class>
+	  <name>dtmfentry</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>True</expand>
+	    <fill>True</fill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <editable>False</editable>
+	  <text_visible>True</text_visible>
+	  <text_max_length>0</text_max_length>
+	  <text></text>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>buttoncleardtmf</name>
+	  <child>
+	    <padding>0</padding>
+	    <expand>False</expand>
+	    <fill>False</fill>
+	  </child>
+	  <width>50</width>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>clicked</name>
+	    <handler>on_dtmfclear_clicked</handler>
+	    <last_modification_time>Wed, 14 Jul 1999 18:16:39 GMT</last_modification_time>
+	  </signal>
+	  <label>Clear</label>
+	</widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame5</name>
+      <border_width>5</border_width>
+      <child>
+	<padding>0</padding>
+	<expand>True</expand>
+	<fill>True</fill>
+      </child>
+      <label>Keypad</label>
+      <label_xalign>0.01</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+	<class>GtkTable</class>
+	<name>table4</name>
+	<rows>4</rows>
+	<columns>4</columns>
+	<homogeneous>False</homogeneous>
+	<row_spacing>0</row_spacing>
+	<column_spacing>0</column_spacing>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf8</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x18</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x08</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>8</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf9</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x19</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x09</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>9</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmfa</name>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1a</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0a</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>A</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf4</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x14</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x04</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>4</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf5</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x15</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x05</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>5</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf6</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x16</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x06</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>6</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmfb</name>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>1</top_attach>
+	    <bottom_attach>2</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1b</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0b</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>B</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf1</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x11</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x01</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>1</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf2</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x12</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x02</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>2</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf3</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x13</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x03</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>3</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmfc</name>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>2</top_attach>
+	    <bottom_attach>3</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1c</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0c</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>C</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmfe</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1e</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0e</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>*</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf0</name>
+	  <child>
+	    <left_attach>1</left_attach>
+	    <right_attach>2</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x10</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x00</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>0</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmff</name>
+	  <child>
+	    <left_attach>2</left_attach>
+	    <right_attach>3</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1f</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0f</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>#</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmfd</name>
+	  <child>
+	    <left_attach>3</left_attach>
+	    <right_attach>4</right_attach>
+	    <top_attach>3</top_attach>
+	    <bottom_attach>4</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x1d</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x0d</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>D</label>
+	</widget>
+
+	<widget>
+	  <class>GtkButton</class>
+	  <name>dtmf7</name>
+	  <child>
+	    <left_attach>0</left_attach>
+	    <right_attach>1</right_attach>
+	    <top_attach>0</top_attach>
+	    <bottom_attach>1</bottom_attach>
+	    <xpad>0</xpad>
+	    <ypad>0</ypad>
+	    <xexpand>True</xexpand>
+	    <yexpand>True</yexpand>
+	    <xshrink>False</xshrink>
+	    <yshrink>False</yshrink>
+	    <xfill>True</xfill>
+	    <yfill>True</yfill>
+	  </child>
+	  <can_focus>True</can_focus>
+	  <signal>
+	    <name>pressed</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x17</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+	  </signal>
+	  <signal>
+	    <name>released</name>
+	    <handler>on_dtmf_key</handler>
+	    <data>(gpointer)0x07</data>
+	    <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+	  </signal>
+	  <label>7</label>
+	</widget>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>scopewindow</name>
+  <signal>
+    <name>delete_event</name>
+    <handler>on_scopewindow_delete_event</handler>
+    <last_modification_time>Wed, 14 Jul 1999 17:49:17 GMT</last_modification_time>
+  </signal>
+  <title>Scope</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>Custom</class>
+    <name>scope</name>
+    <width>512</width>
+    <height>256</height>
+    <creation_function>scope_new</creation_function>
+    <int1>128</int1>
+    <int2>0</int2>
+    <last_modification_time>Wed, 14 Jul 1999 18:01:10 GMT</last_modification_time>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>spectrumwindow</name>
+  <signal>
+    <name>delete_event</name>
+    <handler>on_spectrumwindow_delete_event</handler>
+    <last_modification_time>Wed, 14 Jul 1999 17:49:32 GMT</last_modification_time>
+  </signal>
+  <title>Spectrum</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>Custom</class>
+    <name>spec</name>
+    <width>512</width>
+    <height>256</height>
+    <creation_function>spectrum_new</creation_function>
+    <int1>256</int1>
+    <int2>0</int2>
+    <last_modification_time>Wed, 14 Jul 1999 18:01:21 GMT</last_modification_time>
+  </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/eppfm2/src/Makefile.am b/eppfm2/src/Makefile.am
new file mode 100644
index 0000000..ebd95eb
--- /dev/null
+++ b/eppfm2/src/Makefile.am
@@ -0,0 +1,60 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+	-I$(top_srcdir)/intl \
+	-I$(top_srcdir)/main \
+	-I$(top_srcdir)/directx/include \
+	-I$(top_srcdir)/directx/include/directx6 \
+	@GTK_CFLAGS@
+
+if DIRECTX
+AUDIOSRC = audiowin32.c
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+AUDIOSRC = audiolinux.c
+DIRECTXLIBS = 
+endif
+
+if HAVEGTK
+
+bin_PROGRAMS = eppfm
+
+
+endif
+
+EXTRA_DIST = costab.c gentbl.c audiolinux.c audiowin32.c coeff.m
+
+if CROSSCOMP
+else
+
+gentbl_SOURCES = gentbl.c
+
+BUILT_SOURCES = costab.c
+
+noinst_PROGRAMS = gentbl
+
+$(srcdir)/costab.c:	gentbl
+			./gentbl $(srcdir)/costab.c
+
+endif
+
+eppfm_SOURCES = \
+	main.c costab.c audio.c $(AUDIOSRC) \
+	support.c support.h \
+	interface.c interface.h \
+	callbacks.h \
+	widgets.c widgets.h
+
+eppfm_LDADD = @GTK_LIBS@ $(INTLLIBS) \
+	$(top_builddir)/main/libinit.a \
+	$(top_builddir)/main/libresident.a \
+	$(top_builddir)/main/libresident2.a \
+	$(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+noinst_HEADERS =    \
+	eppfm.h     \
+	getopt.h    \
+	callbacks.h \
+	interface.h \
+	support.h   \
+	widgets.h
diff --git a/eppfm2/src/Makefile.in b/eppfm2/src/Makefile.in
new file mode 100644
index 0000000..84de84d
--- /dev/null
+++ b/eppfm2/src/Makefile.in
@@ -0,0 +1,424 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = \
+	-I$(top_srcdir)/intl \
+	-I$(top_srcdir)/main \
+	-I$(top_srcdir)/directx/include \
+	-I$(top_srcdir)/directx/include/directx6 \
+	@GTK_CFLAGS@
+
+ at DIRECTX_TRUE@AUDIOSRC = @DIRECTX_TRUE at audiowin32.c
+ at DIRECTX_FALSE@AUDIOSRC = @DIRECTX_FALSE at audiolinux.c
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS = 
+
+ at HAVEGTK_TRUE@bin_PROGRAMS = @HAVEGTK_TRUE at eppfm
+
+EXTRA_DIST = costab.c gentbl.c audiolinux.c audiowin32.c coeff.m
+
+ at CROSSCOMP_FALSE@gentbl_SOURCES = @CROSSCOMP_FALSE at gentbl.c
+
+ at CROSSCOMP_FALSE@BUILT_SOURCES = @CROSSCOMP_FALSE at costab.c
+
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = @CROSSCOMP_FALSE at gentbl
+
+eppfm_SOURCES = \
+	main.c costab.c audio.c $(AUDIOSRC) \
+	support.c support.h \
+	interface.c interface.h \
+	callbacks.h \
+	widgets.c widgets.h
+
+
+eppfm_LDADD = @GTK_LIBS@ $(INTLLIBS) \
+	$(top_builddir)/main/libinit.a \
+	$(top_builddir)/main/libresident.a \
+	$(top_builddir)/main/libresident2.a \
+	$(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+
+noinst_HEADERS = \
+	eppfm.h     \
+	getopt.h    \
+	callbacks.h \
+	interface.h \
+	support.h   \
+	widgets.h
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES = 
+ at HAVEGTK_TRUE@bin_PROGRAMS =  eppfm$(EXEEXT)
+ at CROSSCOMP_FALSE@noinst_PROGRAMS =  gentbl$(EXEEXT)
+PROGRAMS =  $(bin_PROGRAMS) $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+ at DIRECTX_TRUE@eppfm_OBJECTS =  main.$(OBJEXT) costab.$(OBJEXT) \
+ at DIRECTX_TRUE@audio.$(OBJEXT) audiowin32.$(OBJEXT) support.$(OBJEXT) \
+ at DIRECTX_TRUE@interface.$(OBJEXT) widgets.$(OBJEXT)
+ at DIRECTX_FALSE@eppfm_OBJECTS =  main.$(OBJEXT) costab.$(OBJEXT) \
+ at DIRECTX_FALSE@audio.$(OBJEXT) audiolinux.$(OBJEXT) support.$(OBJEXT) \
+ at DIRECTX_FALSE@interface.$(OBJEXT) widgets.$(OBJEXT)
+ at DIRECTX_TRUE@eppfm_DEPENDENCIES =  $(top_builddir)/main/libinit.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident2.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libmisc.a
+ at DIRECTX_FALSE@eppfm_DEPENDENCIES =  $(top_builddir)/main/libinit.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident2.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libmisc.a
+eppfm_LDFLAGS = 
+ at CROSSCOMP_FALSE@gentbl_OBJECTS =  gentbl.$(OBJEXT)
+gentbl_LDADD = $(LDADD)
+gentbl_DEPENDENCIES = 
+gentbl_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppfm_SOURCES) $(gentbl_SOURCES)
+OBJECTS = $(eppfm_OBJECTS) $(gentbl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm2/src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(bindir)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	     $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppfm$(EXEEXT): $(eppfm_OBJECTS) $(eppfm_DEPENDENCIES)
+	@rm -f eppfm$(EXEEXT)
+	$(LINK) $(eppfm_LDFLAGS) $(eppfm_OBJECTS) $(eppfm_LDADD) $(LIBS)
+
+gentbl$(EXEEXT): $(gentbl_OBJECTS) $(gentbl_DEPENDENCIES)
+	@rm -f gentbl$(EXEEXT)
+	$(LINK) $(gentbl_LDFLAGS) $(gentbl_OBJECTS) $(gentbl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm2/src
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+audio.o: audio.c ../../config.h eppfm.h ../../main/fpga.h \
+	../../main/sysdeps.h getopt.h ../../main/parport.h
+audiolinux.o: audiolinux.c ../../config.h getopt.h eppfm.h \
+	../../main/fpga.h ../../main/sysdeps.h ../../main/parport.h
+costab.o: costab.c eppfm.h ../../main/fpga.h ../../main/sysdeps.h \
+	../../config.h getopt.h ../../main/parport.h
+gentbl.o: gentbl.c
+interface.o: interface.c ../../config.h getopt.h callbacks.h interface.h \
+	support.h
+main.o: main.c ../../config.h getopt.h eppfm.h ../../main/fpga.h \
+	../../main/sysdeps.h ../../main/parport.h widgets.h callbacks.h \
+	interface.h support.h
+support.o: support.c ../../config.h getopt.h support.h
+widgets.o: widgets.c ../../config.h widgets.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \
+		mostlyclean-compile mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-noinstPROGRAMS clean-compile \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-noinstPROGRAMS \
+		distclean-compile distclean-tags distclean-generic \
+		clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+		maintainer-clean-noinstPROGRAMS \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at CROSSCOMP_FALSE@$(srcdir)/costab.c:	gentbl
+ at CROSSCOMP_FALSE@			./gentbl $(srcdir)/costab.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm2/src/audio.c b/eppfm2/src/audio.c
new file mode 100644
index 0000000..fa78b6e
--- /dev/null
+++ b/eppfm2/src/audio.c
@@ -0,0 +1,340 @@
+/*****************************************************************************/
+
+/*
+ *      audio.c  --  Audio processing for "virtual transceiver".
+ *
+ *      Copyright (C) 1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include "eppfm.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define PWRINTERVAL     4096         /* must be even */
+#define PWRINTERVAL2      64         /* must be even */
+#define PWRNOISECALIB   4096
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+	/* samling rates */
+	unsigned int srateepp, sratedsp;
+	/* sampling rate converter */
+	unsigned int ph, phinc;
+	/* power meter */
+	unsigned int pwrcnt;
+	unsigned int pwracc;
+	/* freqency generators */
+	unsigned int ph0, ph1, freq0, freq1;
+} istate;
+
+struct {
+	/* samling rates */
+	unsigned int srateepp, sratedsp;
+	/* sampling rate converter */
+	unsigned int ph, phinc;
+	/* power meter */
+	unsigned int pwrcnt, pwrcnt2;
+	unsigned int pwracc1;
+	int pwracc2, pwracc3;
+	float pwracc4;
+	/* carrier detect state */
+	unsigned int dcdparam, dcd;
+} ostate;
+
+/* ---------------------------------------------------------------------- */
+
+static const int16_t rxfilter[16][16] = {
+	{ 139,  -57, -451,  612,  1263, -2887, -2021, 13678, 24449, 12513, -2539, -2588, 1360,  498, -450, -31 },
+	{ 138,  -85, -445,  728,  1141, -3169, -1432, 14824, 24343, 11337, -2984, -2276, 1432,  385, -443,  -6 },
+	{ 137, -115, -432,  842,   993, -3427,  -772, 15942, 24131, 10160, -3358, -1956, 1480,  277, -430,  16 },
+	{ 134, -146, -410,  954,   820, -3657,   -42, 17022, 23817,  8989, -3661, -1632, 1504,  173, -412,  36 },
+	{ 130, -177, -380, 1061,   623, -3854,   753, 18058, 23401,  7832, -3895, -1309, 1507,   76, -390,  54 },
+	{ 124, -210, -341, 1161,   402, -4012,  1613, 19040, 22888,  6698, -4062,  -991, 1490,  -15, -365,  71 },
+	{ 117, -243, -294, 1253,   159, -4127,  2531, 19961, 22282,  5594, -4165,  -682, 1454,  -97, -337,  85 },
+	{ 108, -275, -237, 1333,  -105, -4194,  3505, 20813, 21589,  4528, -4208,  -386, 1401, -172, -307,  97 },
+	{  97, -307, -172, 1401,  -386, -4208,  4528, 21589, 20813,  3505, -4194,  -105, 1333, -237, -275, 108 },
+	{  85, -337,  -97, 1454,  -682, -4165,  5594, 22282, 19961,  2531, -4127,   159, 1253, -294, -243, 117 },
+	{  71, -365,  -15, 1490,  -991, -4062,  6698, 22888, 19040,  1613, -4012,   402, 1161, -341, -210, 124 },
+	{  54, -390,   76, 1507, -1309, -3895,  7832, 23401, 18058,   753, -3854,   623, 1061, -380, -177, 130 },
+	{  36, -412,  173, 1504, -1632, -3661,  8989, 23817, 17022,   -42, -3657,   820,  954, -410, -146, 134 },
+	{  16, -430,  277, 1480, -1956, -3358, 10160, 24131, 15942,  -772, -3427,   993,  842, -432, -115, 137 },
+	{  -6, -443,  385, 1432, -2276, -2984, 11337, 24343, 14824, -1432, -3169,  1141,  728, -445,  -85, 138 },
+	{ -31, -450,  498, 1360, -2588, -2539, 12513, 24449, 13678, -2021, -2887,  1263,  612, -451,  -57, 139 }
+};
+
+#define RXFPH(x)  (((x)>>(PHASEFRAC-4))&15)
+#define RXFLEN    16
+
+/* ---------------------------------------------------------------------- */
+
+void audio_1750(int on)
+{
+	if (on && istate.srateepp > 0)
+		istate.freq0 = (1750*65536 + istate.srateepp/2) / istate.srateepp;
+	else
+		istate.freq0 = 0;
+	istate.freq1 = 0;
+	istate.ph0 = 0;
+	istate.ph1 = 0;
+}
+
+/*
+ *
+ * DTMF frequencies
+ *
+ *      1209 1336 1477 1633
+ *  697   1    2    3    A
+ *  770   4    5    6    B
+ *  852   7    8    9    C
+ *  941   *    0    #    D
+ * 
+ */
+
+void audio_dtmf(int ch)
+{
+	static const unsigned char dtmftransl[0x10] = {
+		0x13, 0x00, 0x10, 0x20, 0x01, 0x11, 0x21, 0x02,
+		0x12, 0x22, 0x30, 0x31, 0x32, 0x33, 0x03, 0x23
+	};
+	static const unsigned int freqlogrp[4] = { 697, 770, 852, 941 };
+	static const unsigned int freqhigrp[4] = { 1209, 1336, 1477, 1633 };
+	unsigned int tr;
+
+	if (ch & 16 && istate.sratedsp > 0) {
+		tr = dtmftransl[ch & 15];
+		istate.freq0 = (freqlogrp[tr & 15]*65536+istate.srateepp/2)/istate.srateepp;
+		istate.freq1 = (freqhigrp[tr >> 4]*65536+istate.srateepp/2)/istate.srateepp;
+	} else {
+		istate.freq0 = 0;
+		istate.freq1 = 0;
+	}	
+	istate.ph0 = 0;
+	istate.ph1 = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_setsquelch(int sq)
+{
+	ostate.dcdparam = !!sq;
+}
+
+int audio_getsquelch(void)
+{
+	return ostate.dcd;
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline int calcfilter(const int16_t *coeff, const int8_t *data)
+{
+	unsigned cnt;
+	int sum = 0;
+	
+	for (cnt = 0; cnt < RXFLEN; cnt++)
+		sum += (*coeff++) * (*data--);
+	return sum >> 8;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_initinput(unsigned int srateepp, unsigned int sratedsp)
+{
+	memset(&istate, 0, sizeof(istate));
+	istate.srateepp = srateepp;
+	istate.sratedsp = sratedsp;
+	istate.phinc = ((1 << PHASEFRAC) * sratedsp + srateepp / 2) / srateepp;
+	lprintf(2, "rec phase inc: 0x%05x\n", istate.phinc);
+}
+
+unsigned int audio_convertinput(unsigned int num, const int16_t *ibuf, signed char *obuf)
+{
+	unsigned int cnt = 0;
+	unsigned int i;
+	float pw;
+	int s;
+	
+	for (i = 0; i < num; i++) {
+		istate.pwracc += ibuf[i] * ibuf[i];
+		if ((++istate.pwrcnt) >= PWRINTERVAL) {
+			pw = istate.pwracc;
+			istate.pwracc = 0;
+			istate.pwrcnt = 0;
+			pw *= (1.0 / PWRINTERVAL);
+			if (pw < 1.6384)
+				pw = -40;
+			else
+				pw = (10.0 / M_LN10) * log(pw) - 42.144;
+			gui_updatevu(pw, -40);
+		}
+	}
+	istate.ph &= PHASEMASK;
+	while (istate.ph < (num << PHASEFRAC)) {
+		s = ibuf[istate.ph >> PHASEFRAC] >> 8;
+		s += SIN(istate.ph0) >> 9;
+		s += SIN(istate.ph1) >> 9;
+		if (s > 127)
+			s = 127;
+		if (s < -128)
+			s = -128;
+		obuf[cnt] = s;
+		istate.ph += istate.phinc;
+		cnt++;
+		istate.ph0 += istate.freq0;
+		istate.ph1 += istate.freq1;
+	}
+	gui_addsamples(num, ibuf);
+	return cnt;
+}
+
+int audio_adjustinput(int eppcnt, int dspcnt, int eppdelay)
+{
+	lprintf(4, "eppcnt %d dspcnt %d eppdelay %d\n", eppcnt, dspcnt, eppdelay);
+	if (eppdelay > SNDLATENCY) {
+		istate.phinc++;
+		istate.ph += PHASEMASK >> 2;
+		if (istate.ph > PHASEMASK)
+			istate.ph = PHASEMASK;
+	} else if (eppdelay < SNDLATENCY) {
+		istate.phinc--;
+		istate.ph -= PHASEMASK >> 2;
+		if (istate.ph > PHASEMASK)
+			istate.ph = 0;
+	}
+	if (istate.phinc < (0x9 << (PHASEFRAC-4)) || istate.phinc > (0x1f << (PHASEFRAC-4))) {
+		lprintf(0, "phinc (0x%05x) out of range\n", istate.phinc);
+		return -1;
+	}
+	lprintf(3, "phase increment: 0x%05x\n", istate.phinc);
+	return 0;
+}
+
+void audio_initoutput(unsigned int srateepp, unsigned int sratedsp)
+{
+	memset(&ostate, 0, sizeof(ostate));
+	ostate.srateepp = srateepp;
+	ostate.sratedsp = sratedsp;
+	ostate.phinc = ((1 << PHASEFRAC) * srateepp + sratedsp / 2) / sratedsp;
+	lprintf(2, "play phase inc: 0x%05x\n", ostate.phinc);
+}
+
+unsigned int audio_convertoutput(unsigned int num, const signed char *ibuf, int16_t *obuf)
+{
+	unsigned int cnt = 0;
+	unsigned int i;
+	float pw1, pw2;
+	
+	for (i = 0; i < num; i++) {
+		ostate.pwracc1 += ibuf[i] * ibuf[i];
+		switch (ostate.pwrcnt2 & 3) {
+		case 0:
+			ostate.pwracc2 -= ibuf[i];
+			break;
+
+		case 1:
+			ostate.pwracc3 -= ibuf[i];
+			break;
+
+		case 2:
+			ostate.pwracc2 += ibuf[i];
+			break;
+
+		default:
+			ostate.pwracc3 += ibuf[i];
+			break;
+		}
+		if ((++ostate.pwrcnt2) >= PWRINTERVAL2) {
+			ostate.pwracc4 += ostate.pwracc2 * ostate.pwracc2 + ostate.pwracc3 * ostate.pwracc3;
+			ostate.pwracc2 = 0;
+			ostate.pwracc3 = 0;
+			ostate.pwrcnt2 = 0;			
+		}
+		if ((++ostate.pwrcnt) >= PWRINTERVAL) {
+			pw1 = ostate.pwracc1;
+			pw2 = ostate.pwracc4;
+			ostate.pwracc1 = 0;
+			ostate.pwracc4 = 0;
+			ostate.pwrcnt = 0;
+			pw1 *= (1.0 / PWRINTERVAL);
+			pw2 *= (1.0 / PWRINTERVAL / PWRINTERVAL) * PWRNOISECALIB;
+			if (pw1 < 1.6384)
+				pw1 = -40;
+			else
+				pw1 = (10.0 / M_LN10) * log(pw1) - 42.144;
+			if (pw2 < 1.6384)
+				pw2 = -40;
+			else
+				pw2 = (10.0 / M_LN10) * log(pw2) - 42.144;
+			if (pw2 > 0)
+				pw2 = 0;
+			gui_updatevu(pw1, pw2);
+			ostate.dcd = (pw1 > -30) && (pw2 < (pw1 / 2 - 20));
+		}
+	}
+	ostate.ph &= PHASEMASK;
+	while (ostate.ph < (num << PHASEFRAC)) {
+#if 0
+		obuf[cnt] = ibuf[ostate.ph >> PHASEFRAC] << 8;
+#else
+		obuf[cnt] = calcfilter(rxfilter[RXFPH(ostate.ph)], ibuf+(ostate.ph >> PHASEFRAC));
+#endif
+		ostate.ph += ostate.phinc;
+		cnt++;
+	}
+	gui_addsamples(cnt, obuf);
+	if (!ostate.dcd && ostate.dcdparam)
+		memset(obuf, 0, 2*cnt);
+	return cnt;
+}
+
+int audio_adjustoutput(int dspcnt, int eppcnt, int dspdelay)
+{
+	lprintf(4, "dspcnt %d eppcnt %d dspdelay %d\n", dspcnt, eppcnt, dspdelay);
+	ostate.ph &= PHASEMASK;
+	if (dspdelay > SNDLATENCY) {
+		ostate.phinc++;
+		ostate.ph += PHASEMASK >> 2;
+		if (ostate.ph > PHASEMASK)
+			ostate.ph = PHASEMASK;
+	} else if (dspdelay < SNDLATENCY) {
+		ostate.phinc--;
+		ostate.ph -= PHASEMASK >> 2;
+		if (ostate.ph > PHASEMASK)
+			ostate.ph = 0;
+	} if (ostate.phinc < (0x9 << (PHASEFRAC-4)) || ostate.phinc > (0x1f << (PHASEFRAC-4))) {
+		lprintf(0, "phinc (0x%05x) out of range\n", ostate.phinc);
+		return -1;
+	}
+	lprintf(3, "phase increment: 0x%05x\n", ostate.phinc);
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/eppfm2/src/audiolinux.c b/eppfm2/src/audiolinux.c
new file mode 100644
index 0000000..a15d9c5
--- /dev/null
+++ b/eppfm2/src/audiolinux.c
@@ -0,0 +1,475 @@
+/*****************************************************************************/
+
+/*
+ *      audio.c  --  Audio processing for "virtual transceiver", Linux IO.
+ *
+ *      Copyright (C) 1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+#include <sys/types.h>
+
+#include <linux/soundcard.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+/* ---------------------------------------------------------------------- */
+
+#define BUFSIZE    8192   /* must be significantly bigger than SNDLATENCY! */
+#define OVERLAP    32
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+	enum { st_mdmerr, st_off, st_play, st_rec } state;
+
+	/* gtk timeout handle */
+	gint tmotag;
+	/* sampling rate conversion state */
+	int16_t sample[OVERLAP];
+	/* control register */
+	unsigned char ctrlreg;
+	/* led blink counter */
+	unsigned ledcnt;
+	
+	/* low level driver specific data */
+	int fddsp;
+} state = { st_mdmerr, };
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic_play(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	int apar, i, icnt, cnt;
+
+	/* epp->dsp direction */
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 1;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	icnt &= 0x7fff;
+	if (icnt > 0) {
+		if (icnt > BUFSIZE/2)
+			icnt = BUFSIZE/2;
+		memcpy(buf.s, state.sample, OVERLAP);
+		if (parport_epp_read_data(buf.s+OVERLAP, icnt) != icnt)
+			goto err;
+		memcpy(state.sample, buf.s+icnt, OVERLAP);
+		cnt = audio_convertoutput(icnt, buf.s+OVERLAP, sbuf);
+		if ((i = write(state.fddsp, sbuf, 2*cnt)) != 2*cnt) {
+			lprintf(0, "write(%d) failed %i (%s)\n", 2*cnt, i, strerror(errno));
+			goto err;
+		}
+		if (ioctl(state.fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+			lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+			goto err;
+		}
+		apar >>= 1;
+		/* adjust speed */
+		if (audio_adjustoutput(cnt, icnt, apar))
+			goto err;
+		/* play games with the LEDS */
+		state.ledcnt += icnt;
+		if (state.ledcnt >= 4000) {
+			state.ledcnt %= 4000;
+			state.ctrlreg += 0x40;
+		}
+		/* DCD led */
+		if (audio_getsquelch())
+			state.ctrlreg |= 0x10;
+		else
+			state.ctrlreg &= ~0x10;
+	}
+	return TRUE;
+
+  err:
+	reset_modem();
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	close(state.fddsp);
+	return FALSE;
+}
+
+static gint periodic_rec(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	int ocnt, cnt, ocnts, omax;
+
+	/* dsp->epp direction */
+	/* read sound */
+	memcpy(sbuf, state.sample, OVERLAP*2);
+	ocnts = read(state.fddsp, sbuf+OVERLAP, 2*BUFSIZE/2);
+	if (ocnts == -1 && errno == EAGAIN)
+		ocnts = 0;
+	if (ocnts < 0) {
+		lprintf(0, "read(%d) failed %i (%s)\n", 2*BUFSIZE/2, ocnts, strerror(errno));
+		goto err;
+	}
+	ocnts >>= 1;
+	memcpy(state.sample, sbuf+ocnts, OVERLAP*2);
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 2;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	ocnt &= 0x7fff;
+	omax = 16384 - ocnt;
+	cnt = 0;
+	if (ocnts > 0) {
+		cnt = audio_convertinput(ocnts, sbuf+OVERLAP, buf.s);
+		if (cnt > omax) {
+			lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+			goto err;
+		}
+		if (parport_epp_write_data(buf.s, cnt) != cnt)
+			goto err;
+		/* reget the FIFO count */
+		buf.u[0] = state.ctrlreg | 2;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		if (parport_epp_read_addr(buf.u, 2) != 2)
+			goto err;
+		ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		ocnt &= 0x7fff;
+	}
+	/* adjust speed */
+	if (audio_adjustinput(cnt, ocnts, ocnt))
+		goto err;
+	return TRUE;
+
+  err:
+	reset_modem();
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	close(state.fddsp);
+	return FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void playstop(void)
+{
+	unsigned char buf;
+
+	if (state.state != st_play)
+		return;
+	gtk_timeout_remove(state.tmotag);
+	close(state.fddsp);
+	/* reset the EPP adapter */
+	buf = 7;
+	if (parport_epp_write_addr(&buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else
+		state.state = st_off;
+}
+
+static void recstop(void)
+{
+	unsigned char buf;
+
+	if (state.state != st_rec)
+		return;
+	gtk_timeout_remove(state.tmotag);
+	close(state.fddsp);	
+	/* reset the EPP adapter */
+	buf = 7;
+	if (parport_epp_write_addr(&buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else
+		state.state = st_off;
+}
+
+static void playstart(void)
+{
+	unsigned char buf[2];
+	int16_t sbuf[SNDLATENCY];
+	audio_buf_info abinfo;
+	int apar;
+	unsigned srate;
+	int i;
+
+	if (state.state == st_play)
+		playstop();
+	if (state.state == st_rec)
+		recstop();
+	state.ctrlreg = 0;
+	state.ledcnt = 0;
+	memset(state.sample, 0, sizeof(state.sample));
+	/* start modem if mdmerr */
+	if (state.state == st_mdmerr) {
+		cfg.bitrate = SAMPLINGRATE;
+		if ((i = adapter_start_eppsamp(&cfg))) {
+			lprintf(0, "Cannot initialize the modem\n");
+			return;
+		}
+	}
+	state.state = st_off;
+	if ((state.fddsp = open("/dev/dsp", O_WRONLY | O_NONBLOCK)) == -1) {
+		lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+		return;
+	}
+	fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+	if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_TRIGGER)) {
+		lprintf(0, "soundcard does not support trigger\n");
+		goto errsnd;
+	}
+	apar = AFMT_S16_LE;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = 0;
+	if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	srate = cfg.bitrate;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", 
+			strerror(errno), cfg.bitrate);
+		goto errsnd;
+	}
+	lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+	if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETOSPACE, &abinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) {
+		lprintf(0, "soundcard buffers too small (%u)\n", 
+			abinfo.fragstotal * abinfo.fragsize);
+		goto errsnd;
+	}
+	audio_initoutput(cfg.bitrate, srate);
+	lprintf(0, "Audio Output to Linux Soundcard\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = state.ctrlreg;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill to nominal queue size and start soundcard */
+	memset(sbuf, 0, sizeof(sbuf));
+	if ((i = write(state.fddsp, sbuf, 2*SNDLATENCY)) != 2*SNDLATENCY) {
+		lprintf(0, "write(%d) failed %i (%s)\n", 2*SNDLATENCY, i, strerror(errno));
+		goto errsnd;
+	}
+	apar = PCM_ENABLE_OUTPUT;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	state.tmotag = gtk_timeout_add(100, periodic_play, NULL);
+	state.state = st_play;
+	return;
+
+  errsnd:
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1)
+		goto errret;
+	state.state = st_off;
+	goto errclose;
+
+  errret:
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	reset_modem();
+  errclose:
+	close(state.fddsp);
+}
+
+static void recstart(void)
+{
+	unsigned char buf[SNDLATENCY];
+	audio_buf_info abinfo;
+	int apar;
+	unsigned srate;
+	int i;
+
+	if (state.state == st_play)
+		playstop();
+	if (state.state == st_rec)
+		recstop();
+	state.ctrlreg = 0x20;
+	state.ledcnt = 0;
+	memset(state.sample, 0, sizeof(state.sample));
+	/* start modem if mdmerr */
+	if (state.state == st_mdmerr) {
+		cfg.bitrate = SAMPLINGRATE;
+		if ((i = adapter_start_eppsamp(&cfg))) {
+			lprintf(0, "Cannot initialize the modem\n");
+			return;
+		}
+	}
+	state.state = st_off;
+	if ((state.fddsp = open("/dev/dsp", O_RDONLY | O_NONBLOCK)) == -1) {
+		lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+		return;
+	}
+	fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+	if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_TRIGGER)) {
+		lprintf(0, "soundcard does not support trigger\n");
+		goto errsnd;
+	}
+	apar = AFMT_S16_LE;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = 0;
+	if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	srate = cfg.bitrate;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", 
+			strerror(errno), cfg.bitrate);
+		goto errsnd;
+	}
+	lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+	if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+		goto errsnd;
+	}
+	if (ioctl(state.fddsp, SNDCTL_DSP_GETISPACE, &abinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) {
+		lprintf(0, "soundcard buffers too small (%u)\n", 
+			abinfo.fragstotal * abinfo.fragsize);
+		goto errsnd;
+	}
+	audio_initinput(cfg.bitrate, srate);
+	lprintf(0, "Audio Input from Linux Soundcard\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = state.ctrlreg;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill EPP adapter start soundcard */
+	memset(buf, 0, sizeof(buf));
+	if (parport_epp_write_data(buf, SNDLATENCY) != SNDLATENCY)
+		goto errret;
+	apar = PCM_ENABLE_INPUT;
+	if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	state.tmotag = gtk_timeout_add(100, periodic_rec, NULL);
+	state.state = st_rec;
+	return;
+
+  errsnd:
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1)
+		goto errret;
+	state.state = st_off;
+	goto errclose;
+	
+  errret:
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	reset_modem();
+  errclose:
+	close(state.fddsp);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+	if (ptt && state.state != st_rec)
+		recstart();
+	else if (!ptt && state.state != st_play)
+		playstart();
+}
+
+int audio_drvinit(const char *config)
+{
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
diff --git a/eppfm2/src/audiowin32.c b/eppfm2/src/audiowin32.c
new file mode 100644
index 0000000..c3621f9
--- /dev/null
+++ b/eppfm2/src/audiowin32.c
@@ -0,0 +1,654 @@
+/*****************************************************************************/
+
+/*
+ *      audiowin32.c  --  Audio processing for "virtual transceiver", win32 IO.
+ *
+ *      Copyright (C) 1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_DIRECTX
+
+#include "eppfm.h"
+
+#include <directx.h>
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+/* ---------------------------------------------------------------------- */
+
+#define BUFSIZE    8192   /* must be significantly bigger than SNDLATENCY! */
+#define OVERLAP    32
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+	enum { st_mdmerr, st_off, st_play, st_rec } state;
+
+	/* gtk timeout handle */
+	gint tmotag;
+	/* sampling rate conversion state */
+	int16_t sample[OVERLAP];
+	/* control register */
+	unsigned char ctrlreg;
+	/* led blink counter */
+	unsigned ledcnt;
+
+	/* low level driver specific data */
+	LPDIRECTSOUND dsplay;
+	LPDIRECTSOUNDCAPTURE dsrec;
+	LPDIRECTSOUNDBUFFER playbuf;
+	LPDIRECTSOUNDCAPTUREBUFFER recbuf;
+	HANDLE hinst;
+	HWND hwnd;
+	DWORD playbufsz, recbufsz, playptr, recptr;
+} state = { st_mdmerr, };
+
+/* ---------------------------------------------------------------------- */
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+        lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+        return TRUE;
+}
+
+#if 0
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+	switch(umsg) {
+		/* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't 
+		   want to pass these messages along for default processing. */
+	case WM_CLOSE:
+		DestroyWindow(hwnd);
+		return 0;
+
+	case WM_DESTROY:
+		PostQuitMessage(0);
+		return 0;
+	}
+	return DefWindowProc(hwnd, umsg, wParam, lParam);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic_play(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	HRESULT res;
+	DWORD lockbytes1, lockbytes2, delay;
+	int16_t *sptr1;
+	int16_t *sptr2;
+	int icnt, cnt;
+
+	/* epp->dsp direction */
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 1;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	icnt &= 0x7fff;
+	if (icnt > 0) {
+		if (icnt > BUFSIZE/2)
+			icnt = BUFSIZE/2;
+		memcpy(buf.s, state.sample, OVERLAP);
+		if (parport_epp_read_data(buf.s+OVERLAP, icnt) != icnt)
+			goto err;
+		memcpy(state.sample, buf.s+icnt, OVERLAP);
+		cnt = audio_convertoutput(icnt, buf.s+OVERLAP, sbuf);
+		if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, state.playptr, cnt*2, 
+							 (LPVOID)&sptr1, &lockbytes1,
+							 (LPVOID)&sptr2, &lockbytes2, 0))) {
+			lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+			goto err;
+		}
+		memcpy(sptr1, sbuf, lockbytes1);
+		if (lockbytes1 < 2*cnt)
+			memcpy(sptr2, sbuf + lockbytes1/2, 2*cnt - lockbytes1);
+		if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+			lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+			goto err;
+		}
+		state.playptr = (state.playptr + 2*cnt) % state.playbufsz;
+		/* get output delay */
+		if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(state.playbuf, &delay, NULL))) {
+			lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+			goto err;
+		}
+		delay = (state.playbufsz + state.playptr - delay) % state.playbufsz;
+		delay >>= 1;
+		/* adjust speed */
+		if (audio_adjustoutput(cnt, icnt, delay))
+			goto err;
+		/* play games with the LEDS */
+		state.ledcnt += icnt;
+		if (state.ledcnt >= 4000) {
+			state.ledcnt %= 4000;
+			state.ctrlreg += 0x40;
+		}
+		/* DCD led */
+		if (audio_getsquelch())
+			state.ctrlreg |= 0x10;
+		else
+			state.ctrlreg &= ~0x10;
+	}
+	return TRUE;
+
+err:
+	lprintf(0, "EPP timeout\n");
+	IDirectSoundBuffer_Stop(state.playbuf);
+	IDirectSoundBuffer_Release(state.playbuf);
+	IDirectSound_Release(state.dsplay);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+	reset_modem();
+	state.state = st_mdmerr;
+	return FALSE;
+}
+
+static gint periodic_rec(gpointer data)
+{
+	union {
+		unsigned char u[BUFSIZE];
+		signed char s[BUFSIZE];
+	} buf;
+	int16_t sbuf[BUFSIZE];
+	HRESULT res;
+	DWORD lockbytes1, lockbytes2, delay;
+	int16_t *sptr1;
+	int16_t *sptr2;
+	int ocnt, cnt, ocnts, omax;
+
+	/* dsp->epp direction */
+	/* read sound */
+	memcpy(sbuf, state.sample, OVERLAP*2);
+	/* read sound */
+	if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(state.recbuf, &delay, NULL))) {
+		lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+		goto err;
+	}
+	ocnts = (state.recbufsz + delay - state.recptr) % state.recbufsz;
+	ocnts &= ~1;
+	if (ocnts > 0) {
+		if (FAILED(res = IDirectSoundCaptureBuffer_Lock(state.recbuf, state.recptr, ocnts, 
+								(LPVOID)&sptr1, &lockbytes1,
+								(LPVOID)&sptr2, &lockbytes2, 0))) {
+			lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+			goto err;
+		}
+		memcpy(sbuf+OVERLAP, sptr1, lockbytes1);
+		if (lockbytes1 < ocnts)
+			memcpy(sbuf+OVERLAP+lockbytes1/2, sptr2, ocnts - lockbytes1);
+		if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(state.recbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+			lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+			goto err;
+		}
+		state.recptr = (state.recptr + ocnts) % state.recbufsz;
+	}
+	ocnts >>= 1;
+	memcpy(state.sample, sbuf+ocnts, OVERLAP*2);
+	/* get FIFO count */
+	buf.u[0] = state.ctrlreg | 2;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	if (parport_epp_read_addr(buf.u, 2) != 2)
+		goto err;
+	ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+	buf.u[0] = state.ctrlreg;
+	if (parport_epp_write_addr(buf.u, 1) != 1)
+		goto err;
+	ocnt &= 0x7fff;
+	omax = 16384 - ocnt;
+	cnt = 0;
+	if (ocnts > 0) {
+		cnt = audio_convertinput(ocnts, sbuf+OVERLAP, buf.s);
+		if (cnt > omax) {
+			lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+			goto err;
+		}
+		if (parport_epp_write_data(buf.s, cnt) != cnt)
+			goto err;
+		/* reget the FIFO count */
+		buf.u[0] = state.ctrlreg | 2;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		if (parport_epp_read_addr(buf.u, 2) != 2)
+			goto err;
+		ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+		buf.u[0] = state.ctrlreg;
+		if (parport_epp_write_addr(buf.u, 1) != 1)
+			goto err;
+		ocnt &= 0x7fff;
+	}
+	/* adjust speed */
+	if (audio_adjustinput(cnt, ocnts, ocnt))
+		goto err;
+	return TRUE;
+
+err:
+	lprintf(0, "EPP timeout\n");
+	IDirectSoundCaptureBuffer_Stop(state.recbuf);
+	IDirectSoundCaptureBuffer_Release(state.recbuf);
+	IDirectSoundCapture_Release(state.dsrec);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+	reset_modem();
+	state.state = st_mdmerr;
+	return FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void playstop(void)
+{
+	unsigned char buf;
+
+	if (state.state != st_play)
+		return;
+	gtk_timeout_remove(state.tmotag);
+	IDirectSoundBuffer_Stop(state.playbuf);
+	IDirectSoundBuffer_Release(state.playbuf);
+	IDirectSound_Release(state.dsplay);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+	/* reset the EPP adapter */
+	buf = 7;
+	if (parport_epp_write_addr(&buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else
+		state.state = st_off;
+}
+
+static void recstop(void)
+{
+	unsigned char buf;
+
+	if (state.state != st_rec)
+		return;
+	gtk_timeout_remove(state.tmotag);
+	IDirectSoundCaptureBuffer_Stop(state.recbuf);
+	IDirectSoundCaptureBuffer_Release(state.recbuf);
+	IDirectSoundCapture_Release(state.dsrec);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+	/* reset the EPP adapter */
+	buf = 7;
+	if (parport_epp_write_addr(&buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else
+		state.state = st_off;
+}
+
+static void playstart(void)
+{
+	WNDCLASS wndclass;
+	HRESULT res;
+        WAVEFORMATEX waveformat;
+        DSBUFFERDESC bdesc;
+	unsigned char buf[2];
+	DWORD lockbytes;
+	int16_t *sptr;
+	unsigned srate;
+	int i;
+
+	if (state.state == st_play)
+		playstop();
+	if (state.state == st_rec)
+		recstop();
+	state.ctrlreg = 0;
+	state.ledcnt = 0;
+	memset(state.sample, 0, sizeof(state.sample));
+	/* start modem if mdmerr */
+	if (state.state == st_mdmerr) {
+		cfg.bitrate = SAMPLINGRATE;
+		if ((i = adapter_start_eppsamp(&cfg))) {
+			lprintf(0, "Cannot initialize the modem\n");
+			return;
+		}
+	}
+	state.state = st_off;
+	state.dsplay = NULL;
+	state.playbuf = NULL;
+	state.playptr = 0;
+#if 0
+	wndclass.style = CS_HREDRAW | CS_VREDRAW;
+	wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+	wndclass.cbClsExtra = 0;
+	wndclass.cbWndExtra = 0;
+	wndclass.hIcon = NULL;
+	wndclass.hInstance = state.hinst;
+	wndclass.hCursor = NULL;
+	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+	wndclass.lpszMenuName = NULL;
+	wndclass.lpszClassName = "MyClass";
+	if (!RegisterClass(&wndclass)) {
+		lprintf(0, "RegisterClass error, %d\n", GetLastError());
+		goto errregcls;
+	}
+	state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+				    0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+	if (!state.hwnd) {
+		lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+		goto errwnd;
+	}
+#else
+	state.hwnd = GetDesktopWindow();
+#endif
+        if (FAILED(res = DirectSoundCreate(NULL, &state.dsplay, NULL))) {
+                lprintf(0, "DirectSoundCreate error %lu\n", res);
+                goto errdscreate;
+        }
+        if (FAILED(res = IDirectSound_SetCooperativeLevel(state.dsplay, state.hwnd, DSSCL_NORMAL))) {
+                lprintf(0, "SetCooperativeLevel error %lu\n", res);
+                goto errdsb;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 16;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = cfg.bitrate;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&bdesc, 0, sizeof(bdesc));
+        bdesc.dwSize = sizeof(bdesc);
+        bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+        state.playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        bdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSound_CreateSoundBuffer(state.dsplay, &bdesc, &state.playbuf, NULL))) {
+                lprintf(0, "CreateSoundBuffer error %lu\n", res);
+                goto errdsb;
+        }
+        if (FAILED(res = IDirectSoundBuffer_GetFormat(state.playbuf, &waveformat, sizeof(waveformat), NULL))) {
+                lprintf(0, "GetFormat error %lu\n", res);
+                goto errsnd;
+        }
+	srate = waveformat.nSamplesPerSec;
+	lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+	if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+		goto errsnd;
+	}
+	audio_initoutput(cfg.bitrate, srate);
+	lprintf(0, "Audio Output to Linux Soundcard\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = state.ctrlreg;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill to nominal queue size and start soundcard */
+	if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, 0, 2*SNDLATENCY, (LPVOID)&sptr, &lockbytes, NULL, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+                goto errsnd;
+        }
+	memset(sptr, 0, 2*SNDLATENCY);
+	if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr, lockbytes, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+                goto errsnd;
+        }
+	state.playptr = 2*SNDLATENCY;
+	if (FAILED(res = IDirectSoundBuffer_Play(state.playbuf, 0, 0, DSBPLAY_LOOPING))) {
+                lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+                goto errsnd;
+        }
+	state.tmotag = gtk_timeout_add(100, periodic_play, NULL);
+	state.state = st_play;
+	return;
+
+  errdsb:
+	IDirectSound_Release(state.dsplay);
+  errdscreate:
+#if 0
+	DestroyWindow(state.hwnd);
+  errwnd:
+	UnregisterClass("MyClass", state.hinst);
+#endif
+  errregcls:
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else		
+		state.state = st_off;
+	return;
+	
+  errsnd:
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1)
+		goto errret;
+	state.state = st_off;
+	goto errclose;
+
+  errret:
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	reset_modem();
+  errclose:
+	IDirectSoundBuffer_Stop(state.playbuf);
+	IDirectSoundBuffer_Release(state.playbuf);
+	IDirectSound_Release(state.dsplay);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+}
+
+static void recstart(void)
+{
+	WNDCLASS wndclass;
+	HRESULT res;
+        WAVEFORMATEX waveformat;
+        DSCBUFFERDESC cbdesc;
+	unsigned char buf[SNDLATENCY];
+	unsigned srate;
+	int i;
+
+	if (state.state == st_play)
+		playstop();
+	if (state.state == st_rec)
+		recstop();
+	state.ctrlreg = 0x20;
+	state.ledcnt = 0;
+	memset(state.sample, 0, sizeof(state.sample));
+	/* start modem if mdmerr */
+	if (state.state == st_mdmerr) {
+		cfg.bitrate = SAMPLINGRATE;
+		if ((i = adapter_start_eppsamp(&cfg))) {
+			lprintf(0, "Cannot initialize the modem\n");
+			return;
+		}
+	}
+	state.state = st_off;
+	state.dsrec = NULL;
+	state.recbuf = NULL;
+	state.recptr = 0;
+#if 0
+	wndclass.style = CS_HREDRAW | CS_VREDRAW;
+	wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+	wndclass.cbClsExtra = 0;
+	wndclass.cbWndExtra = 0;
+	wndclass.hIcon = NULL;
+	wndclass.hInstance = state.hinst;
+	wndclass.hCursor = NULL;
+	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+	wndclass.lpszMenuName = NULL;
+	wndclass.lpszClassName = "MyClass";
+	if (!RegisterClass(&wndclass)) {
+		lprintf(0, "RegisterClass error, %d\n", GetLastError());
+		goto errregcls;
+	}
+	state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+				    0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+	if (!state.hwnd) {
+		lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+		goto errwnd;
+	}
+#else
+	state.hwnd = GetDesktopWindow();
+#endif
+        if (FAILED(res = DirectSoundCaptureCreate(NULL, &state.dsrec, NULL))) {
+                lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+                goto errdscreate;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 16;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = cfg.bitrate;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&cbdesc, 0, sizeof(cbdesc));
+        cbdesc.dwSize = sizeof(cbdesc);
+        cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+        state.recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        cbdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(state.dsrec, &cbdesc, &state.recbuf, NULL))) {
+                lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+                goto errdsb;
+        }
+	/* kludge */ srate = cfg.bitrate;
+        if (FAILED(res = IDirectSoundCaptureBuffer_GetFormat(state.recbuf, &waveformat, sizeof(waveformat), NULL))) {
+                lprintf(0, "GetFormat error %lu\n", res);
+                goto errsnd;
+        }
+	srate = waveformat.nSamplesPerSec;
+	lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+	if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+		goto errsnd;
+	}
+	audio_initinput(cfg.bitrate, srate);
+	lprintf(0, "Audio Input from Linux Soundcard\n");
+	/* reset the EPP adapter */
+	buf[0] = 7;
+	buf[1] = state.ctrlreg;
+	if (parport_epp_write_addr(buf, 2) != 2)
+		goto errret;
+	/* prefill EPP adapter and start soundcard */
+	memset(buf, 0, sizeof(buf));
+	if (parport_epp_write_data(buf, SNDLATENCY) != SNDLATENCY)
+		goto errret;
+	if (FAILED(res = IDirectSoundCaptureBuffer_Start(state.recbuf, DSCBSTART_LOOPING))) {
+                lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+                goto errsnd;
+        }
+	state.tmotag = gtk_timeout_add(100, periodic_rec, NULL);
+	state.state = st_rec;
+	return;
+
+  errdsb:
+	IDirectSoundCapture_Release(state.dsrec);
+  errdscreate:
+#if 0
+	DestroyWindow(state.hwnd);
+  errwnd:
+	UnregisterClass("MyClass", state.hinst);
+  errregcls:
+#endif
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1) {
+		state.state = st_mdmerr;
+		reset_modem();
+	} else		
+		state.state = st_off;
+	return;
+	
+  errsnd:
+	buf[0] = 7;
+	if (parport_epp_write_addr(buf, 1) != 1)
+		goto errret;
+	state.state = st_off;
+	goto errclose;
+
+  errret:
+	lprintf(0, "EPP timeout\n");
+	state.state = st_mdmerr;
+	reset_modem();
+  errclose:
+	IDirectSoundCaptureBuffer_Stop(state.recbuf);
+	IDirectSoundCaptureBuffer_Release(state.recbuf);
+	IDirectSoundCapture_Release(state.dsrec);
+#if 0
+	DestroyWindow(state.hwnd);
+	UnregisterClass("MyClass", state.hinst);
+#endif
+	state.hwnd = NULL;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+	if (ptt && state.state != st_rec)
+		recstart();
+	else if (!ptt && state.state != st_play)
+		playstart();
+}
+
+int audio_drvinit(const char *config)
+{
+	state.dsplay = NULL;
+	state.dsrec = NULL;
+	state.playbuf = NULL;
+	state.recbuf = NULL;
+	state.hwnd = NULL;
+	state.hinst = GetModuleHandleA(0);
+	state.playptr = 0;
+	state.recptr = 0;
+        lprintf(1, "DirectSound drivers\n");
+        DirectSoundEnumerateA(DSEnumProc, NULL);
+        lprintf(1, "DirectSoundCapture drivers\n");
+        DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* HAVE_DIRECTX */
diff --git a/eppfm2/src/callbacks.h b/eppfm2/src/callbacks.h
new file mode 100644
index 0000000..26f25bc
--- /dev/null
+++ b/eppfm2/src/callbacks.h
@@ -0,0 +1,158 @@
+#include <gtk/gtk.h>
+
+
+void
+on_file_activate                       (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_dtmf_activate                       (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_oscilloscope_activate               (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_spectrum_activate                   (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_quit_activate                       (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+void
+on_about_activate                      (GtkMenuItem     *menuitem,
+                                        gpointer         user_data);
+
+gboolean
+on_dtmfwindow_key_press_event          (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_dtmfwindow_key_release_event        (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+void
+on_dtmf_key                            (GtkButton       *button,
+                                        gpointer         user_data);
+
+GtkWidget*
+eppfm_scope_new (gchar *widget_name, gchar *string1, gchar *string2,
+                gint int1, gint int2);
+
+GtkWidget*
+eppfm_spectrum_new (gchar *widget_name, gchar *string1, gchar *string2,
+                gint int1, gint int2);
+
+void
+on_configok_clicked                    (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_configquit_clicked                  (GtkButton       *button,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_delete_event             (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+void
+on_mainwindow_destroy                  (GtkObject       *object,
+                                        gpointer         user_data);
+
+void
+on_mainptt_toggled                     (GtkToggleButton *togglebutton,
+                                        gpointer         user_data);
+
+void
+on_maindtmf_clicked                    (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_mainscope_clicked                   (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_mainspectrum_clicked                (GtkButton       *button,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_key_press_event          (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_key_release_event        (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_aboutdialog_delete_event            (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+gboolean
+on_dtmfwindow_delete_event             (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+gboolean
+on_scopewindow_delete_event            (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+gboolean
+on_spectrumwindow_delete_event         (GtkWidget       *widget,
+                                        GdkEvent        *event,
+                                        gpointer         user_data);
+
+void
+on_aboutok_clicked                     (GtkButton       *button,
+                                        gpointer         user_data);
+
+GtkWidget*
+scope_new (gchar *widget_name, gchar *string1, gchar *string2,
+                gint int1, gint int2);
+
+GtkWidget*
+spectrum_new (gchar *widget_name, gchar *string1, gchar *string2,
+                gint int1, gint int2);
+
+void
+on_dtmfclear_clicked                   (GtkButton       *button,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_key_event                (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_dtmfwindow_key_event                (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+gboolean
+on_mainwindow_key_event                (GtkWidget       *widget,
+                                        GdkEventKey     *event,
+                                        gpointer         user_data);
+
+void
+on_button1750_clicked                  (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_buttonsquelch_clicked               (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_button1750_pressed                  (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+on_button1750_released                 (GtkButton       *button,
+                                        gpointer         user_data);
diff --git a/eppfm2/src/coeff.m b/eppfm2/src/coeff.m
new file mode 100644
index 0000000..5e93661
--- /dev/null
+++ b/eppfm2/src/coeff.m
@@ -0,0 +1,30 @@
+%
+fs=16000;
+overs=16;
+fg1=3500;
+fg2=4500;
+flen=16;
+
+%c=remez(overs*flen-1,[ 0 2*fg1/fs/overs 2*fg2/fs/overs 1 ], [ 1 1 0 0 ]);
+c=sinc((0.5-overs*flen/2:overs*flen/2-0.5)*(2*fg2/fs/overs)).*hamming(overs*flen)';
+
+for t=1:overs,
+  tt(t) = sum(abs(c(t:16:overs*flen)));
+end;
+
+c=c./max(tt);
+
+t1=fft(c);
+plot((0:overs*flen-1)*fs/flen,20*log10(abs(t1)));
+
+fid=fopen('filter.txt','w');
+fprintf(fid,'static const int16_t rxfilter[%d][%d] = {\n',overs,flen);
+for t=1:overs,
+  fprintf(fid,'\t{ ');
+  for tt=0:flen-1,
+    fprintf(fid, '%6d, ', round(c(tt*overs+t) * 65536));
+  end;
+  fprintf(fid,'},\n');
+end;
+fprintf(fid,'};');
+fclose(fid);
diff --git a/eppfm2/src/costab.c b/eppfm2/src/costab.c
new file mode 100644
index 0000000..8ad2ae1
--- /dev/null
+++ b/eppfm2/src/costab.c
@@ -0,0 +1,74 @@
+#include <sys/types.h>
+#include "eppfm.h"
+
+/*
+ * cosine table
+ */
+
+const int16_t costab[512] = {
+	 32767,  32764,  32757,  32744,  32727,  32705,  32678,  32646, 
+	 32609,  32567,  32520,  32468,  32412,  32350,  32284,  32213, 
+	 32137,  32056,  31970,  31880,  31785,  31684,  31580,  31470, 
+	 31356,  31236,  31113,  30984,  30851,  30713,  30571,  30424, 
+	 30272,  30116,  29955,  29790,  29621,  29446,  29268,  29085, 
+	 28897,  28706,  28510,  28309,  28105,  27896,  27683,  27466, 
+	 27244,  27019,  26789,  26556,  26318,  26077,  25831,  25582, 
+	 25329,  25072,  24811,  24546,  24278,  24006,  23731,  23452, 
+	 23169,  22883,  22594,  22301,  22004,  21705,  21402,  21096, 
+	 20787,  20474,  20159,  19840,  19519,  19194,  18867,  18537, 
+	 18204,  17868,  17530,  17189,  16845,  16499,  16150,  15799, 
+	 15446,  15090,  14732,  14372,  14009,  13645,  13278,  12909, 
+	 12539,  12166,  11792,  11416,  11038,  10659,  10278,   9895, 
+	  9511,   9126,   8739,   8351,   7961,   7571,   7179,   6786, 
+	  6392,   5997,   5601,   5205,   4807,   4409,   4011,   3611, 
+	  3211,   2811,   2410,   2009,   1607,   1206,    804,    402, 
+	     0,   -402,   -804,  -1206,  -1607,  -2009,  -2410,  -2811, 
+	 -3211,  -3611,  -4011,  -4409,  -4807,  -5205,  -5601,  -5997, 
+	 -6392,  -6786,  -7179,  -7571,  -7961,  -8351,  -8739,  -9126, 
+	 -9511,  -9895, -10278, -10659, -11038, -11416, -11792, -12166, 
+	-12539, -12909, -13278, -13645, -14009, -14372, -14732, -15090, 
+	-15446, -15799, -16150, -16499, -16845, -17189, -17530, -17868, 
+	-18204, -18537, -18867, -19194, -19519, -19840, -20159, -20474, 
+	-20787, -21096, -21402, -21705, -22004, -22301, -22594, -22883, 
+	-23169, -23452, -23731, -24006, -24278, -24546, -24811, -25072, 
+	-25329, -25582, -25831, -26077, -26318, -26556, -26789, -27019, 
+	-27244, -27466, -27683, -27896, -28105, -28309, -28510, -28706, 
+	-28897, -29085, -29268, -29446, -29621, -29790, -29955, -30116, 
+	-30272, -30424, -30571, -30713, -30851, -30984, -31113, -31236, 
+	-31356, -31470, -31580, -31684, -31785, -31880, -31970, -32056, 
+	-32137, -32213, -32284, -32350, -32412, -32468, -32520, -32567, 
+	-32609, -32646, -32678, -32705, -32727, -32744, -32757, -32764, 
+	-32767, -32764, -32757, -32744, -32727, -32705, -32678, -32646, 
+	-32609, -32567, -32520, -32468, -32412, -32350, -32284, -32213, 
+	-32137, -32056, -31970, -31880, -31785, -31684, -31580, -31470, 
+	-31356, -31236, -31113, -30984, -30851, -30713, -30571, -30424, 
+	-30272, -30116, -29955, -29790, -29621, -29446, -29268, -29085, 
+	-28897, -28706, -28510, -28309, -28105, -27896, -27683, -27466, 
+	-27244, -27019, -26789, -26556, -26318, -26077, -25831, -25582, 
+	-25329, -25072, -24811, -24546, -24278, -24006, -23731, -23452, 
+	-23169, -22883, -22594, -22301, -22004, -21705, -21402, -21096, 
+	-20787, -20474, -20159, -19840, -19519, -19194, -18867, -18537, 
+	-18204, -17868, -17530, -17189, -16845, -16499, -16150, -15799, 
+	-15446, -15090, -14732, -14372, -14009, -13645, -13278, -12909, 
+	-12539, -12166, -11792, -11416, -11038, -10659, -10278,  -9895, 
+	 -9511,  -9126,  -8739,  -8351,  -7961,  -7571,  -7179,  -6786, 
+	 -6392,  -5997,  -5601,  -5205,  -4807,  -4409,  -4011,  -3611, 
+	 -3211,  -2811,  -2410,  -2009,  -1607,  -1206,   -804,   -402, 
+	     0,    402,    804,   1206,   1607,   2009,   2410,   2811, 
+	  3211,   3611,   4011,   4409,   4807,   5205,   5601,   5997, 
+	  6392,   6786,   7179,   7571,   7961,   8351,   8739,   9126, 
+	  9511,   9895,  10278,  10659,  11038,  11416,  11792,  12166, 
+	 12539,  12909,  13278,  13645,  14009,  14372,  14732,  15090, 
+	 15446,  15799,  16150,  16499,  16845,  17189,  17530,  17868, 
+	 18204,  18537,  18867,  19194,  19519,  19840,  20159,  20474, 
+	 20787,  21096,  21402,  21705,  22004,  22301,  22594,  22883, 
+	 23169,  23452,  23731,  24006,  24278,  24546,  24811,  25072, 
+	 25329,  25582,  25831,  26077,  26318,  26556,  26789,  27019, 
+	 27244,  27466,  27683,  27896,  28105,  28309,  28510,  28706, 
+	 28897,  29085,  29268,  29446,  29621,  29790,  29955,  30116, 
+	 30272,  30424,  30571,  30713,  30851,  30984,  31113,  31236, 
+	 31356,  31470,  31580,  31684,  31785,  31880,  31970,  32056, 
+	 32137,  32213,  32284,  32350,  32412,  32468,  32520,  32567, 
+	 32609,  32646,  32678,  32705,  32727,  32744,  32757,  32764
+};
+
diff --git a/eppfm2/src/eppfm.h b/eppfm2/src/eppfm.h
new file mode 100644
index 0000000..182cc01
--- /dev/null
+++ b/eppfm2/src/eppfm.h
@@ -0,0 +1,80 @@
+/*****************************************************************************/
+
+/*
+ *      eppfm.h  --  Function prototypes for "virtual transceiver".
+ *
+ *      Copyright (C) 1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _EPPFM_H
+#define _EPPFM_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern const int16_t costab[512];
+#define COS(x) costab[((x)>>7)&0x1ff]
+#define SIN(x) COS((x)+0xc000)
+
+/* ---------------------------------------------------------------------- */
+
+extern struct adapter_config cfg;
+
+#define SAMPLINGRATE  16000
+#define SNDLATENCY    4000   /* approx 1/4 seconds */
+#define PHASEFRAC     12
+#define PHASEMASK     ((1<<PHASEFRAC)-1)
+
+/* ---------------------------------------------------------------------- */
+
+extern void gui_addsamples(unsigned int num, const int16_t *y);
+extern void gui_updatevu(float meter1, float meter2);
+
+extern void *audio_createdialog(void);
+extern int audio_dialogok(void *dlg);
+
+extern void audio_initinput(unsigned int srateepp, unsigned int sratedsp);
+extern void audio_initoutput(unsigned int srateepp, unsigned int sratedsp);
+extern unsigned int audio_convertinput(unsigned int num, const int16_t *ibuf, signed char *obuf);
+extern int audio_adjustinput(int eppcnt, int dspcnt, int eppdelay);
+extern unsigned int audio_convertoutput(unsigned int num, const signed char *ibuf, int16_t *obuf);
+extern int audio_adjustoutput(int dspcnt, int eppcnt, int dspdelay);
+
+extern int audio_drvinit(const char *config);
+extern void audio_ptt(int ptt);
+
+/* ---------------------------------------------------------------------- */
+
+extern void audio_1750(int on);
+extern void audio_dtmf(int ch);
+extern void audio_setsquelch(int sq);
+extern int audio_getsquelch(void);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _EPPFM_H */
+
+
diff --git a/eppfm2/src/gentbl.c b/eppfm2/src/gentbl.c
new file mode 100644
index 0000000..af75b98
--- /dev/null
+++ b/eppfm2/src/gentbl.c
@@ -0,0 +1,72 @@
+/*****************************************************************************/
+
+/*
+ *      gentbl.c  -- Soundmodem table generator.
+ *
+ *      Copyright (C) 1996-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+/* -------------------------------------------------------------------- */
+
+static const char *progname;
+
+/* -------------------------------------------------------------------- */
+
+static void gen_costab(unsigned size, const char *fn)
+{
+	FILE *f;
+        int i;
+
+	if (!(f = fopen(fn, "w"))) {
+		fprintf(stderr, "cannot open file costab.c\n");
+		exit(1);
+	}
+	fprintf(f, "#include <sys/types.h>\n#include \"eppfm.h\"\n\n/*\n * cosine table\n */\n\n"
+		"const int16_t costab[%d] = {", size);
+        for (i = 0; i < size; i++) {
+                if (!(i & 7))
+                        fprintf(f, "\n\t");
+                fprintf(f, "%6d", (int)(32767.0*cos(i*(2.0*M_PI)/size)));
+                if (i != (size-1))
+                        fprintf(f, ", ");
+        }
+        fprintf(f, "\n};\n\n");
+}
+
+/* -------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+	progname = argv[0];
+	if (argc < 2) {
+		fprintf(stderr, "usage: gentbl <filename>\n");
+		exit(1);
+	}
+	gen_costab(512, argv[1]);
+	exit(0);
+}
+
+/* -------------------------------------------------------------------- */
diff --git a/eppfm2/src/getopt.h b/eppfm2/src/getopt.h
new file mode 100644
index 0000000..45541f5
--- /dev/null
+++ b/eppfm2/src/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument		(or 0) if the option does not take an argument,
+   required_argument	(or 1) if the option requires an argument,
+   optional_argument 	(or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if	__STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define	no_argument		0
+#define required_argument	1
+#define optional_argument	2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+		        const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+			     const char *shortopts,
+		             const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+			     const char *shortopts,
+		             const struct option *longopts, int *longind,
+			     int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/eppfm2/src/interface.c b/eppfm2/src/interface.c
new file mode 100644
index 0000000..c79e019
--- /dev/null
+++ b/eppfm2/src/interface.c
@@ -0,0 +1,1194 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+GtkWidget*
+create_ioconfiglinux ()
+{
+  GtkWidget *ioconfiglinux;
+  GtkWidget *vbox1;
+  GtkWidget *frame3;
+  GtkWidget *table3;
+  GtkWidget *sndrecord;
+  GList *sndrecord_items = NULL;
+  GtkWidget *sndplayback;
+  GList *sndplayback_items = NULL;
+  GtkWidget *label5;
+  GtkWidget *label6;
+  GtkWidget *frame1;
+  GtkWidget *table2;
+  GtkWidget *ioaddr;
+  GList *ioaddr_items = NULL;
+  GtkWidget *devfile;
+  GList *devfile_items = NULL;
+  GtkWidget *label2;
+  GtkWidget *label3;
+  GtkWidget *label1;
+  GSList *drivergroup_group = NULL;
+  GtkWidget *drvdirect;
+  GtkWidget *drvppdev;
+  GtkWidget *frame2;
+  GtkWidget *table1;
+  GtkWidget *fpgaclk;
+  GList *fpgaclk_items = NULL;
+  GtkWidget *label4;
+  GtkWidget *hbuttonbox1;
+  GtkWidget *buttonok;
+  GtkWidget *buttonquit;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  ioconfiglinux = gtk_window_new (GTK_WINDOW_DIALOG);
+  gtk_widget_set_name (ioconfiglinux, "ioconfiglinux");
+  gtk_widget_ref (ioconfiglinux);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "ioconfiglinux", ioconfiglinux,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_window_set_title (GTK_WINDOW (ioconfiglinux), _("EPPFM Input/Output Configuration"));
+
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox1, "vbox1");
+  gtk_widget_ref (vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "vbox1", vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox1);
+  gtk_container_add (GTK_CONTAINER (ioconfiglinux), vbox1);
+
+  frame3 = gtk_frame_new (_("Soundcard Settings"));
+  gtk_widget_set_name (frame3, "frame3");
+  gtk_widget_ref (frame3);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame3", frame3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame3);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame3), 5);
+
+  table3 = gtk_table_new (2, 2, FALSE);
+  gtk_widget_set_name (table3, "table3");
+  gtk_widget_ref (table3);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table3", table3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table3);
+  gtk_container_add (GTK_CONTAINER (frame3), table3);
+
+  sndrecord = gtk_combo_new ();
+  gtk_widget_set_name (sndrecord, "sndrecord");
+  gtk_widget_ref (sndrecord);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "sndrecord", sndrecord,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (sndrecord);
+  gtk_table_attach (GTK_TABLE (table3), sndrecord, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (sndrecord), 3);
+  gtk_combo_set_case_sensitive (GTK_COMBO (sndrecord), TRUE);
+  sndrecord_items = g_list_append (sndrecord_items, _("/dev/dsp"));
+  sndrecord_items = g_list_append (sndrecord_items, _("/dev/dsp1"));
+  gtk_combo_set_popdown_strings (GTK_COMBO (sndrecord), sndrecord_items);
+  g_list_free (sndrecord_items);
+
+  sndplayback = gtk_combo_new ();
+  gtk_widget_set_name (sndplayback, "sndplayback");
+  gtk_widget_ref (sndplayback);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "sndplayback", sndplayback,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (sndplayback);
+  gtk_table_attach (GTK_TABLE (table3), sndplayback, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (sndplayback), 3);
+  gtk_combo_set_case_sensitive (GTK_COMBO (sndplayback), TRUE);
+  sndplayback_items = g_list_append (sndplayback_items, _("/dev/dsp"));
+  sndplayback_items = g_list_append (sndplayback_items, _("/dev/dsp1"));
+  gtk_combo_set_popdown_strings (GTK_COMBO (sndplayback), sndplayback_items);
+  g_list_free (sndplayback_items);
+
+  label5 = gtk_label_new (_("Soundcard for Recording"));
+  gtk_widget_set_name (label5, "label5");
+  gtk_widget_ref (label5);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label5", label5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label5);
+  gtk_table_attach (GTK_TABLE (table3), label5, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label5), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label5), 10, 0);
+
+  label6 = gtk_label_new (_("Soundcard for Playback"));
+  gtk_widget_set_name (label6, "label6");
+  gtk_widget_ref (label6);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label6", label6,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label6);
+  gtk_table_attach (GTK_TABLE (table3), label6, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label6), 10, 0);
+
+  frame1 = gtk_frame_new (_("Parallel Port Driver Settings"));
+  gtk_widget_set_name (frame1, "frame1");
+  gtk_widget_ref (frame1);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame1", frame1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame1);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame1), 5);
+
+  table2 = gtk_table_new (2, 4, FALSE);
+  gtk_widget_set_name (table2, "table2");
+  gtk_widget_ref (table2);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table2", table2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table2);
+  gtk_container_add (GTK_CONTAINER (frame1), table2);
+
+  ioaddr = gtk_combo_new ();
+  gtk_widget_set_name (ioaddr, "ioaddr");
+  gtk_widget_ref (ioaddr);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "ioaddr", ioaddr,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (ioaddr);
+  gtk_table_attach (GTK_TABLE (table2), ioaddr, 3, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_widget_set_usize (GTK_COMBO (ioaddr)->entry, 104, -2);
+  gtk_widget_set_usize (ioaddr, 120, -2);
+  gtk_container_set_border_width (GTK_CONTAINER (ioaddr), 3);
+  ioaddr_items = g_list_append (ioaddr_items, _("0x378"));
+  ioaddr_items = g_list_append (ioaddr_items, _("0x278"));
+  gtk_combo_set_popdown_strings (GTK_COMBO (ioaddr), ioaddr_items);
+  g_list_free (ioaddr_items);
+
+  devfile = gtk_combo_new ();
+  gtk_widget_set_name (devfile, "devfile");
+  gtk_widget_ref (devfile);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "devfile", devfile,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (devfile);
+  gtk_table_attach (GTK_TABLE (table2), devfile, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_widget_set_usize (GTK_COMBO (devfile)->entry, 104, -2);
+  gtk_widget_set_usize (devfile, 120, -2);
+  gtk_container_set_border_width (GTK_CONTAINER (devfile), 3);
+  gtk_combo_set_case_sensitive (GTK_COMBO (devfile), TRUE);
+  devfile_items = g_list_append (devfile_items, _("/dev/ppuser0"));
+  devfile_items = g_list_append (devfile_items, _("/dev/ppuser1"));
+  gtk_combo_set_popdown_strings (GTK_COMBO (devfile), devfile_items);
+  g_list_free (devfile_items);
+
+  label2 = gtk_label_new (_("IO Address"));
+  gtk_widget_set_name (label2, "label2");
+  gtk_widget_ref (label2);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label2", label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label2);
+  gtk_table_attach (GTK_TABLE (table2), label2, 2, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label2), 4, 0);
+
+  label3 = gtk_label_new (_("File"));
+  gtk_widget_set_name (label3, "label3");
+  gtk_widget_ref (label3);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label3", label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label3);
+  gtk_table_attach (GTK_TABLE (table2), label3, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label3), 4, 0);
+
+  label1 = gtk_label_new (_("Driver Selection"));
+  gtk_widget_set_name (label1, "label1");
+  gtk_widget_ref (label1);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label1", label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label1);
+  gtk_table_attach (GTK_TABLE (table2), label1, 0, 1, 0, 1,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_padding (GTK_MISC (label1), 9, 0);
+
+  drvdirect = gtk_radio_button_new_with_label (drivergroup_group, _("Direct Parport Access"));
+  drivergroup_group = gtk_radio_button_group (GTK_RADIO_BUTTON (drvdirect));
+  gtk_widget_set_name (drvdirect, "drvdirect");
+  gtk_widget_ref (drvdirect);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "drvdirect", drvdirect,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (drvdirect);
+  gtk_table_attach (GTK_TABLE (table2), drvdirect, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+
+  drvppdev = gtk_radio_button_new_with_label (drivergroup_group, _("ppdev Kernel Driver"));
+  drivergroup_group = gtk_radio_button_group (GTK_RADIO_BUTTON (drvppdev));
+  gtk_widget_set_name (drvppdev, "drvppdev");
+  gtk_widget_ref (drvppdev);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "drvppdev", drvppdev,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (drvppdev);
+  gtk_table_attach (GTK_TABLE (table2), drvppdev, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+
+  frame2 = gtk_frame_new (_("Modem Settings"));
+  gtk_widget_set_name (frame2, "frame2");
+  gtk_widget_ref (frame2);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame2", frame2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame2);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame2, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame2), 5);
+
+  table1 = gtk_table_new (1, 2, FALSE);
+  gtk_widget_set_name (table1, "table1");
+  gtk_widget_ref (table1);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table1", table1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table1);
+  gtk_container_add (GTK_CONTAINER (frame2), table1);
+
+  fpgaclk = gtk_combo_new ();
+  gtk_widget_set_name (fpgaclk, "fpgaclk");
+  gtk_widget_ref (fpgaclk);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "fpgaclk", fpgaclk,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (fpgaclk);
+  gtk_table_attach (GTK_TABLE (table1), fpgaclk, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (fpgaclk), 3);
+  fpgaclk_items = g_list_append (fpgaclk_items, _("19666600"));
+  fpgaclk_items = g_list_append (fpgaclk_items, _("9830400"));
+  gtk_combo_set_popdown_strings (GTK_COMBO (fpgaclk), fpgaclk_items);
+  g_list_free (fpgaclk_items);
+
+  label4 = gtk_label_new (_("FPGA clock frequency"));
+  gtk_widget_set_name (label4, "label4");
+  gtk_widget_ref (label4);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label4", label4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label4);
+  gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label4), 10, 0);
+
+  hbuttonbox1 = gtk_hbutton_box_new ();
+  gtk_widget_set_name (hbuttonbox1, "hbuttonbox1");
+  gtk_widget_ref (hbuttonbox1);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "hbuttonbox1", hbuttonbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbuttonbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, TRUE, TRUE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);
+
+  buttonok = gtk_button_new_with_label (_("Ok"));
+  gtk_widget_set_name (buttonok, "buttonok");
+  gtk_widget_ref (buttonok);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "buttonok", buttonok,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonok);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), buttonok);
+  GTK_WIDGET_SET_FLAGS (buttonok, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, buttonok, _("Continue"), NULL);
+
+  buttonquit = gtk_button_new_with_label (_("Quit"));
+  gtk_widget_set_name (buttonquit, "buttonquit");
+  gtk_widget_ref (buttonquit);
+  gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "buttonquit", buttonquit,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonquit);
+  gtk_container_add (GTK_CONTAINER (hbuttonbox1), buttonquit);
+  GTK_WIDGET_SET_FLAGS (buttonquit, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, buttonquit, _("Quit the application"), NULL);
+
+  gtk_signal_connect (GTK_OBJECT (buttonok), "clicked",
+                      GTK_SIGNAL_FUNC (on_configok_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonquit), "clicked",
+                      GTK_SIGNAL_FUNC (on_configquit_clicked),
+                      NULL);
+
+  gtk_object_set_data (GTK_OBJECT (ioconfiglinux), "tooltips", tooltips);
+
+  return ioconfiglinux;
+}
+
+GtkWidget*
+create_mainwindow ()
+{
+  GtkWidget *mainwindow;
+  GtkWidget *vbox2;
+  GtkWidget *handlebox1;
+  GtkWidget *menubar1;
+  guint tmp_key;
+  GtkWidget *file;
+  GtkWidget *file_menu;
+  GtkAccelGroup *file_menu_accels;
+  GtkWidget *dtmf;
+  GtkWidget *oscilloscope;
+  GtkWidget *spectrum;
+  GtkWidget *separator1;
+  GtkWidget *quit;
+  GtkWidget *help;
+  GtkWidget *help_menu;
+  GtkAccelGroup *help_menu_accels;
+  GtkWidget *about;
+  GtkWidget *vbox3;
+  GtkWidget *progressbar1;
+  GtkWidget *progressbar2;
+  GtkWidget *handlebox2;
+  GtkWidget *hbox1;
+  GtkWidget *buttonptt;
+  GtkWidget *button1750;
+  GtkWidget *buttonsquelch;
+  GtkWidget *buttondtmf;
+  GtkWidget *buttonscope;
+  GtkWidget *buttonspectrum;
+  GtkAccelGroup *accel_group;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  accel_group = gtk_accel_group_new ();
+
+  mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (mainwindow, "mainwindow");
+  gtk_widget_ref (mainwindow);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "mainwindow", mainwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_set_events (mainwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+  gtk_window_set_title (GTK_WINDOW (mainwindow), _("EPPFM"));
+
+  vbox2 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox2, "vbox2");
+  gtk_widget_ref (vbox2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox2", vbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox2);
+  gtk_container_add (GTK_CONTAINER (mainwindow), vbox2);
+
+  handlebox1 = gtk_handle_box_new ();
+  gtk_widget_set_name (handlebox1, "handlebox1");
+  gtk_widget_ref (handlebox1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox1", handlebox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (handlebox1);
+  gtk_box_pack_start (GTK_BOX (vbox2), handlebox1, FALSE, TRUE, 0);
+
+  menubar1 = gtk_menu_bar_new ();
+  gtk_widget_set_name (menubar1, "menubar1");
+  gtk_widget_ref (menubar1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "menubar1", menubar1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (menubar1);
+  gtk_container_add (GTK_CONTAINER (handlebox1), menubar1);
+
+  file = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (file)->child),
+                                   _("_File"));
+  gtk_widget_add_accelerator (file, "activate_item", accel_group,
+                              tmp_key, GDK_MOD1_MASK, 0);
+  gtk_widget_set_name (file, "file");
+  gtk_widget_ref (file);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file", file,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (file);
+  gtk_container_add (GTK_CONTAINER (menubar1), file);
+  gtk_tooltips_set_tip (tooltips, file, _("File Menu"), NULL);
+
+  file_menu = gtk_menu_new ();
+  gtk_widget_set_name (file_menu, "file_menu");
+  gtk_widget_ref (file_menu);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file_menu", file_menu,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu);
+  file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu));
+
+  dtmf = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (dtmf)->child),
+                                   _("_DTMF keypad..."));
+  gtk_widget_add_accelerator (dtmf, "activate_item", file_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_set_name (dtmf, "dtmf");
+  gtk_widget_ref (dtmf);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "dtmf", dtmf,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf);
+  gtk_container_add (GTK_CONTAINER (file_menu), dtmf);
+
+  oscilloscope = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (oscilloscope)->child),
+                                   _("_Oscilloscope display..."));
+  gtk_widget_add_accelerator (oscilloscope, "activate_item", file_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_set_name (oscilloscope, "oscilloscope");
+  gtk_widget_ref (oscilloscope);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "oscilloscope", oscilloscope,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (oscilloscope);
+  gtk_container_add (GTK_CONTAINER (file_menu), oscilloscope);
+
+  spectrum = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (spectrum)->child),
+                                   _("_Spectrum Display..."));
+  gtk_widget_add_accelerator (spectrum, "activate_item", file_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_set_name (spectrum, "spectrum");
+  gtk_widget_ref (spectrum);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "spectrum", spectrum,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (spectrum);
+  gtk_container_add (GTK_CONTAINER (file_menu), spectrum);
+
+  separator1 = gtk_menu_item_new ();
+  gtk_widget_set_name (separator1, "separator1");
+  gtk_widget_ref (separator1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "separator1", separator1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (separator1);
+  gtk_container_add (GTK_CONTAINER (file_menu), separator1);
+  gtk_widget_set_sensitive (separator1, FALSE);
+
+  quit = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (quit)->child),
+                                   _("_Quit"));
+  gtk_widget_add_accelerator (quit, "activate_item", file_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_set_name (quit, "quit");
+  gtk_widget_ref (quit);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "quit", quit,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (quit);
+  gtk_container_add (GTK_CONTAINER (file_menu), quit);
+
+  help = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (help)->child),
+                                   _("_Help"));
+  gtk_widget_add_accelerator (help, "activate_item", accel_group,
+                              tmp_key, GDK_MOD1_MASK, 0);
+  gtk_widget_set_name (help, "help");
+  gtk_widget_ref (help);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help", help,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (help);
+  gtk_container_add (GTK_CONTAINER (menubar1), help);
+  gtk_menu_item_right_justify (GTK_MENU_ITEM (help));
+
+  help_menu = gtk_menu_new ();
+  gtk_widget_set_name (help_menu, "help_menu");
+  gtk_widget_ref (help_menu);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help_menu", help_menu,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
+  help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu));
+
+  about = gtk_menu_item_new_with_label ("");
+  tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (about)->child),
+                                   _("_About"));
+  gtk_widget_add_accelerator (about, "activate_item", help_menu_accels,
+                              tmp_key, 0, 0);
+  gtk_widget_set_name (about, "about");
+  gtk_widget_ref (about);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "about", about,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (about);
+  gtk_container_add (GTK_CONTAINER (help_menu), about);
+
+  vbox3 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox3, "vbox3");
+  gtk_widget_ref (vbox3);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox3", vbox3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox3);
+  gtk_box_pack_start (GTK_BOX (vbox2), vbox3, TRUE, TRUE, 0);
+
+  progressbar1 = gtk_progress_bar_new ();
+  gtk_widget_set_name (progressbar1, "progressbar1");
+  gtk_widget_ref (progressbar1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "progressbar1", progressbar1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (progressbar1);
+  gtk_box_pack_start (GTK_BOX (vbox3), progressbar1, TRUE, TRUE, 0);
+  gtk_progress_configure (GTK_PROGRESS (progressbar1), -40, -40, 0);
+  gtk_progress_set_show_text (GTK_PROGRESS (progressbar1), TRUE);
+
+  progressbar2 = gtk_progress_bar_new ();
+  gtk_widget_set_name (progressbar2, "progressbar2");
+  gtk_widget_ref (progressbar2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "progressbar2", progressbar2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (progressbar2);
+  gtk_box_pack_start (GTK_BOX (vbox3), progressbar2, TRUE, TRUE, 0);
+  gtk_progress_configure (GTK_PROGRESS (progressbar2), -40, -40, 0);
+  gtk_progress_set_show_text (GTK_PROGRESS (progressbar2), TRUE);
+
+  handlebox2 = gtk_handle_box_new ();
+  gtk_widget_set_name (handlebox2, "handlebox2");
+  gtk_widget_ref (handlebox2);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox2", handlebox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (handlebox2);
+  gtk_box_pack_start (GTK_BOX (vbox2), handlebox2, FALSE, TRUE, 0);
+
+  hbox1 = gtk_hbox_new (TRUE, 0);
+  gtk_widget_set_name (hbox1, "hbox1");
+  gtk_widget_ref (hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox1", hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox1);
+  gtk_container_add (GTK_CONTAINER (handlebox2), hbox1);
+
+  buttonptt = gtk_toggle_button_new_with_label (_("PTT"));
+  gtk_widget_set_name (buttonptt, "buttonptt");
+  gtk_widget_ref (buttonptt);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonptt", buttonptt,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonptt);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttonptt, TRUE, TRUE, 0);
+  gtk_widget_set_usize (buttonptt, 70, -2);
+
+  button1750 = gtk_button_new_with_label (_("1750"));
+  gtk_widget_set_name (button1750, "button1750");
+  gtk_widget_ref (button1750);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "button1750", button1750,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (button1750);
+  gtk_box_pack_start (GTK_BOX (hbox1), button1750, TRUE, TRUE, 0);
+
+  buttonsquelch = gtk_button_new_with_label (_("Squelch off"));
+  gtk_widget_set_name (buttonsquelch, "buttonsquelch");
+  gtk_widget_ref (buttonsquelch);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonsquelch", buttonsquelch,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonsquelch);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttonsquelch, TRUE, TRUE, 0);
+
+  buttondtmf = gtk_button_new_with_label (_("DTMF"));
+  gtk_widget_set_name (buttondtmf, "buttondtmf");
+  gtk_widget_ref (buttondtmf);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf", buttondtmf,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttondtmf);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttondtmf, TRUE, TRUE, 0);
+
+  buttonscope = gtk_button_new_with_label (_("Scope"));
+  gtk_widget_set_name (buttonscope, "buttonscope");
+  gtk_widget_ref (buttonscope);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonscope", buttonscope,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonscope);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttonscope, TRUE, TRUE, 0);
+
+  buttonspectrum = gtk_button_new_with_label (_("Spectrum"));
+  gtk_widget_set_name (buttonspectrum, "buttonspectrum");
+  gtk_widget_ref (buttonspectrum);
+  gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonspectrum", buttonspectrum,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonspectrum);
+  gtk_box_pack_start (GTK_BOX (hbox1), buttonspectrum, TRUE, TRUE, 0);
+
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_delete_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "destroy",
+                      GTK_SIGNAL_FUNC (on_mainwindow_destroy),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "key_press_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_key_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (mainwindow), "key_release_event",
+                      GTK_SIGNAL_FUNC (on_mainwindow_key_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (dtmf), "activate",
+                      GTK_SIGNAL_FUNC (on_dtmf_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (oscilloscope), "activate",
+                      GTK_SIGNAL_FUNC (on_oscilloscope_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (spectrum), "activate",
+                      GTK_SIGNAL_FUNC (on_spectrum_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (quit), "activate",
+                      GTK_SIGNAL_FUNC (on_quit_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (about), "activate",
+                      GTK_SIGNAL_FUNC (on_about_activate),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonptt), "toggled",
+                      GTK_SIGNAL_FUNC (on_mainptt_toggled),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (button1750), "pressed",
+                      GTK_SIGNAL_FUNC (on_button1750_pressed),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (button1750), "released",
+                      GTK_SIGNAL_FUNC (on_button1750_released),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonsquelch), "clicked",
+                      GTK_SIGNAL_FUNC (on_buttonsquelch_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttondtmf), "clicked",
+                      GTK_SIGNAL_FUNC (on_maindtmf_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonscope), "clicked",
+                      GTK_SIGNAL_FUNC (on_mainscope_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonspectrum), "clicked",
+                      GTK_SIGNAL_FUNC (on_mainspectrum_clicked),
+                      NULL);
+
+  gtk_object_set_data (GTK_OBJECT (mainwindow), "tooltips", tooltips);
+
+  gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
+
+  return mainwindow;
+}
+
+GtkWidget*
+create_aboutdialog ()
+{
+  GtkWidget *aboutdialog;
+  GtkWidget *dialog_vbox1;
+  GtkWidget *vbox5;
+  GtkWidget *label7;
+  GtkWidget *label8;
+  GtkWidget *label9;
+  GtkWidget *dialog_action_area1;
+  GtkWidget *buttonok;
+
+  aboutdialog = gtk_dialog_new ();
+  gtk_widget_set_name (aboutdialog, "aboutdialog");
+  gtk_widget_ref (aboutdialog);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "aboutdialog", aboutdialog,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_window_set_title (GTK_WINDOW (aboutdialog), _("About"));
+  gtk_window_set_policy (GTK_WINDOW (aboutdialog), TRUE, TRUE, FALSE);
+
+  dialog_vbox1 = GTK_DIALOG (aboutdialog)->vbox;
+  gtk_widget_set_name (dialog_vbox1, "dialog_vbox1");
+  gtk_widget_ref (dialog_vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "dialog_vbox1", dialog_vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dialog_vbox1);
+
+  vbox5 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox5, "vbox5");
+  gtk_widget_ref (vbox5);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "vbox5", vbox5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox5);
+  gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox5, TRUE, TRUE, 0);
+
+  label7 = gtk_label_new (_("written by:"));
+  gtk_widget_set_name (label7, "label7");
+  gtk_widget_ref (label7);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label7", label7,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label7);
+  gtk_box_pack_start (GTK_BOX (vbox5), label7, FALSE, FALSE, 0);
+  gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
+  gtk_misc_set_padding (GTK_MISC (label7), 4, 3);
+
+  label8 = gtk_label_new (_("Thomas Sailer"));
+  gtk_widget_set_name (label8, "label8");
+  gtk_widget_ref (label8);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label8", label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label8);
+  gtk_box_pack_start (GTK_BOX (vbox5), label8, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label8), 4, 4);
+
+  label9 = gtk_label_new (_("HB9JNX/AE4WA"));
+  gtk_widget_set_name (label9, "label9");
+  gtk_widget_ref (label9);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label9", label9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label9);
+  gtk_box_pack_start (GTK_BOX (vbox5), label9, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label9), 4, 4);
+
+  dialog_action_area1 = GTK_DIALOG (aboutdialog)->action_area;
+  gtk_widget_set_name (dialog_action_area1, "dialog_action_area1");
+  gtk_widget_ref (dialog_action_area1);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "dialog_action_area1", dialog_action_area1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dialog_action_area1);
+  gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 10);
+
+  buttonok = gtk_button_new_with_label (_("Ok"));
+  gtk_widget_set_name (buttonok, "buttonok");
+  gtk_widget_ref (buttonok);
+  gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "buttonok", buttonok,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttonok);
+  gtk_box_pack_start (GTK_BOX (dialog_action_area1), buttonok, FALSE, FALSE, 0);
+  gtk_widget_set_usize (buttonok, 80, 27);
+
+  gtk_signal_connect (GTK_OBJECT (aboutdialog), "delete_event",
+                      GTK_SIGNAL_FUNC (on_aboutdialog_delete_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttonok), "clicked",
+                      GTK_SIGNAL_FUNC (on_aboutok_clicked),
+                      NULL);
+
+  return aboutdialog;
+}
+
+GtkWidget*
+create_dtmfwindow ()
+{
+  GtkWidget *dtmfwindow;
+  GtkWidget *vbox4;
+  GtkWidget *frame4;
+  GtkWidget *hbox2;
+  GtkWidget *dtmfentry;
+  GtkWidget *buttoncleardtmf;
+  GtkWidget *frame5;
+  GtkWidget *table4;
+  GtkWidget *dtmf8;
+  GtkWidget *dtmf9;
+  GtkWidget *dtmfa;
+  GtkWidget *dtmf4;
+  GtkWidget *dtmf5;
+  GtkWidget *dtmf6;
+  GtkWidget *dtmfb;
+  GtkWidget *dtmf1;
+  GtkWidget *dtmf2;
+  GtkWidget *dtmf3;
+  GtkWidget *dtmfc;
+  GtkWidget *dtmfe;
+  GtkWidget *dtmf0;
+  GtkWidget *dtmff;
+  GtkWidget *dtmfd;
+  GtkWidget *dtmf7;
+
+  dtmfwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (dtmfwindow, "dtmfwindow");
+  gtk_widget_ref (dtmfwindow);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfwindow", dtmfwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_set_events (dtmfwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+  gtk_window_set_title (GTK_WINDOW (dtmfwindow), _("DTMF Keypad"));
+
+  vbox4 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox4, "vbox4");
+  gtk_widget_ref (vbox4);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "vbox4", vbox4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox4);
+  gtk_container_add (GTK_CONTAINER (dtmfwindow), vbox4);
+
+  frame4 = gtk_frame_new (_("Keys transmitted"));
+  gtk_widget_set_name (frame4, "frame4");
+  gtk_widget_ref (frame4);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame4", frame4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame4);
+  gtk_box_pack_start (GTK_BOX (vbox4), frame4, FALSE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame4), 5);
+  gtk_frame_set_label_align (GTK_FRAME (frame4), 0.01, 0.5);
+
+  hbox2 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox2, "hbox2");
+  gtk_widget_ref (hbox2);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "hbox2", hbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox2);
+  gtk_container_add (GTK_CONTAINER (frame4), hbox2);
+
+  dtmfentry = gtk_entry_new ();
+  gtk_widget_set_name (dtmfentry, "dtmfentry");
+  gtk_widget_ref (dtmfentry);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfentry", dtmfentry,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfentry);
+  gtk_box_pack_start (GTK_BOX (hbox2), dtmfentry, TRUE, TRUE, 0);
+  gtk_entry_set_editable (GTK_ENTRY (dtmfentry), FALSE);
+
+  buttoncleardtmf = gtk_button_new_with_label (_("Clear"));
+  gtk_widget_set_name (buttoncleardtmf, "buttoncleardtmf");
+  gtk_widget_ref (buttoncleardtmf);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "buttoncleardtmf", buttoncleardtmf,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (buttoncleardtmf);
+  gtk_box_pack_start (GTK_BOX (hbox2), buttoncleardtmf, FALSE, FALSE, 0);
+  gtk_widget_set_usize (buttoncleardtmf, 50, -2);
+
+  frame5 = gtk_frame_new (_("Keypad"));
+  gtk_widget_set_name (frame5, "frame5");
+  gtk_widget_ref (frame5);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame5", frame5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame5);
+  gtk_box_pack_start (GTK_BOX (vbox4), frame5, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (frame5), 5);
+  gtk_frame_set_label_align (GTK_FRAME (frame5), 0.01, 0.5);
+
+  table4 = gtk_table_new (4, 4, FALSE);
+  gtk_widget_set_name (table4, "table4");
+  gtk_widget_ref (table4);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "table4", table4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (table4);
+  gtk_container_add (GTK_CONTAINER (frame5), table4);
+
+  dtmf8 = gtk_button_new_with_label (_("8"));
+  gtk_widget_set_name (dtmf8, "dtmf8");
+  gtk_widget_ref (dtmf8);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf8", dtmf8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf8);
+  gtk_table_attach (GTK_TABLE (table4), dtmf8, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf9 = gtk_button_new_with_label (_("9"));
+  gtk_widget_set_name (dtmf9, "dtmf9");
+  gtk_widget_ref (dtmf9);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf9", dtmf9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf9);
+  gtk_table_attach (GTK_TABLE (table4), dtmf9, 2, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmfa = gtk_button_new_with_label (_("A"));
+  gtk_widget_set_name (dtmfa, "dtmfa");
+  gtk_widget_ref (dtmfa);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfa", dtmfa,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfa);
+  gtk_table_attach (GTK_TABLE (table4), dtmfa, 3, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf4 = gtk_button_new_with_label (_("4"));
+  gtk_widget_set_name (dtmf4, "dtmf4");
+  gtk_widget_ref (dtmf4);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf4", dtmf4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf4);
+  gtk_table_attach (GTK_TABLE (table4), dtmf4, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf5 = gtk_button_new_with_label (_("5"));
+  gtk_widget_set_name (dtmf5, "dtmf5");
+  gtk_widget_ref (dtmf5);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf5", dtmf5,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf5);
+  gtk_table_attach (GTK_TABLE (table4), dtmf5, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf6 = gtk_button_new_with_label (_("6"));
+  gtk_widget_set_name (dtmf6, "dtmf6");
+  gtk_widget_ref (dtmf6);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf6", dtmf6,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf6);
+  gtk_table_attach (GTK_TABLE (table4), dtmf6, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmfb = gtk_button_new_with_label (_("B"));
+  gtk_widget_set_name (dtmfb, "dtmfb");
+  gtk_widget_ref (dtmfb);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfb", dtmfb,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfb);
+  gtk_table_attach (GTK_TABLE (table4), dtmfb, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf1 = gtk_button_new_with_label (_("1"));
+  gtk_widget_set_name (dtmf1, "dtmf1");
+  gtk_widget_ref (dtmf1);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf1", dtmf1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf1);
+  gtk_table_attach (GTK_TABLE (table4), dtmf1, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf2 = gtk_button_new_with_label (_("2"));
+  gtk_widget_set_name (dtmf2, "dtmf2");
+  gtk_widget_ref (dtmf2);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf2", dtmf2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf2);
+  gtk_table_attach (GTK_TABLE (table4), dtmf2, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf3 = gtk_button_new_with_label (_("3"));
+  gtk_widget_set_name (dtmf3, "dtmf3");
+  gtk_widget_ref (dtmf3);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf3", dtmf3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf3);
+  gtk_table_attach (GTK_TABLE (table4), dtmf3, 2, 3, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmfc = gtk_button_new_with_label (_("C"));
+  gtk_widget_set_name (dtmfc, "dtmfc");
+  gtk_widget_ref (dtmfc);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfc", dtmfc,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfc);
+  gtk_table_attach (GTK_TABLE (table4), dtmfc, 3, 4, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmfe = gtk_button_new_with_label (_("*"));
+  gtk_widget_set_name (dtmfe, "dtmfe");
+  gtk_widget_ref (dtmfe);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfe", dtmfe,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfe);
+  gtk_table_attach (GTK_TABLE (table4), dtmfe, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf0 = gtk_button_new_with_label (_("0"));
+  gtk_widget_set_name (dtmf0, "dtmf0");
+  gtk_widget_ref (dtmf0);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf0", dtmf0,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf0);
+  gtk_table_attach (GTK_TABLE (table4), dtmf0, 1, 2, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmff = gtk_button_new_with_label (_("#"));
+  gtk_widget_set_name (dtmff, "dtmff");
+  gtk_widget_ref (dtmff);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmff", dtmff,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmff);
+  gtk_table_attach (GTK_TABLE (table4), dtmff, 2, 3, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmfd = gtk_button_new_with_label (_("D"));
+  gtk_widget_set_name (dtmfd, "dtmfd");
+  gtk_widget_ref (dtmfd);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfd", dtmfd,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmfd);
+  gtk_table_attach (GTK_TABLE (table4), dtmfd, 3, 4, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  dtmf7 = gtk_button_new_with_label (_("7"));
+  gtk_widget_set_name (dtmf7, "dtmf7");
+  gtk_widget_ref (dtmf7);
+  gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf7", dtmf7,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (dtmf7);
+  gtk_table_attach (GTK_TABLE (table4), dtmf7, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_press_event",
+                      GTK_SIGNAL_FUNC (on_dtmfwindow_key_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_release_event",
+                      GTK_SIGNAL_FUNC (on_dtmfwindow_key_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (dtmfwindow), "delete_event",
+                      GTK_SIGNAL_FUNC (on_dtmfwindow_delete_event),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (buttoncleardtmf), "clicked",
+                      GTK_SIGNAL_FUNC (on_dtmfclear_clicked),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (dtmf8), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x18);
+  gtk_signal_connect (GTK_OBJECT (dtmf8), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x08);
+  gtk_signal_connect (GTK_OBJECT (dtmf9), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x19);
+  gtk_signal_connect (GTK_OBJECT (dtmf9), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x09);
+  gtk_signal_connect (GTK_OBJECT (dtmfa), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1a);
+  gtk_signal_connect (GTK_OBJECT (dtmfa), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0a);
+  gtk_signal_connect (GTK_OBJECT (dtmf4), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x14);
+  gtk_signal_connect (GTK_OBJECT (dtmf4), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x04);
+  gtk_signal_connect (GTK_OBJECT (dtmf5), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x15);
+  gtk_signal_connect (GTK_OBJECT (dtmf5), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x05);
+  gtk_signal_connect (GTK_OBJECT (dtmf6), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x16);
+  gtk_signal_connect (GTK_OBJECT (dtmf6), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x06);
+  gtk_signal_connect (GTK_OBJECT (dtmfb), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1b);
+  gtk_signal_connect (GTK_OBJECT (dtmfb), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0b);
+  gtk_signal_connect (GTK_OBJECT (dtmf1), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x11);
+  gtk_signal_connect (GTK_OBJECT (dtmf1), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x01);
+  gtk_signal_connect (GTK_OBJECT (dtmf2), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x12);
+  gtk_signal_connect (GTK_OBJECT (dtmf2), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x02);
+  gtk_signal_connect (GTK_OBJECT (dtmf3), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x13);
+  gtk_signal_connect (GTK_OBJECT (dtmf3), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x03);
+  gtk_signal_connect (GTK_OBJECT (dtmfc), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1c);
+  gtk_signal_connect (GTK_OBJECT (dtmfc), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0c);
+  gtk_signal_connect (GTK_OBJECT (dtmfe), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1e);
+  gtk_signal_connect (GTK_OBJECT (dtmfe), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0e);
+  gtk_signal_connect (GTK_OBJECT (dtmf0), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x10);
+  gtk_signal_connect (GTK_OBJECT (dtmf0), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x00);
+  gtk_signal_connect (GTK_OBJECT (dtmff), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1f);
+  gtk_signal_connect (GTK_OBJECT (dtmff), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0f);
+  gtk_signal_connect (GTK_OBJECT (dtmfd), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x1d);
+  gtk_signal_connect (GTK_OBJECT (dtmfd), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x0d);
+  gtk_signal_connect (GTK_OBJECT (dtmf7), "pressed",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x17);
+  gtk_signal_connect (GTK_OBJECT (dtmf7), "released",
+                      GTK_SIGNAL_FUNC (on_dtmf_key),
+                      (gpointer)0x07);
+
+  return dtmfwindow;
+}
+
+GtkWidget*
+create_scopewindow ()
+{
+  GtkWidget *scopewindow;
+  GtkWidget *scope;
+
+  scopewindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (scopewindow, "scopewindow");
+  gtk_widget_ref (scopewindow);
+  gtk_object_set_data_full (GTK_OBJECT (scopewindow), "scopewindow", scopewindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_window_set_title (GTK_WINDOW (scopewindow), _("Scope"));
+
+  scope = scope_new ("scope", NULL, NULL, 128, 0);
+  gtk_widget_set_name (scope, "scope");
+  gtk_widget_ref (scope);
+  gtk_object_set_data_full (GTK_OBJECT (scopewindow), "scope", scope,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scope);
+  gtk_container_add (GTK_CONTAINER (scopewindow), scope);
+  gtk_widget_set_usize (scope, 512, 256);
+  GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_FOCUS);
+  GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_DEFAULT);
+
+  gtk_signal_connect (GTK_OBJECT (scopewindow), "delete_event",
+                      GTK_SIGNAL_FUNC (on_scopewindow_delete_event),
+                      NULL);
+
+  return scopewindow;
+}
+
+GtkWidget*
+create_spectrumwindow ()
+{
+  GtkWidget *spectrumwindow;
+  GtkWidget *spec;
+
+  spectrumwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (spectrumwindow, "spectrumwindow");
+  gtk_widget_ref (spectrumwindow);
+  gtk_object_set_data_full (GTK_OBJECT (spectrumwindow), "spectrumwindow", spectrumwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_window_set_title (GTK_WINDOW (spectrumwindow), _("Spectrum"));
+
+  spec = spectrum_new ("spec", NULL, NULL, 256, 0);
+  gtk_widget_set_name (spec, "spec");
+  gtk_widget_ref (spec);
+  gtk_object_set_data_full (GTK_OBJECT (spectrumwindow), "spec", spec,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (spec);
+  gtk_container_add (GTK_CONTAINER (spectrumwindow), spec);
+  gtk_widget_set_usize (spec, 512, 256);
+  GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_FOCUS);
+  GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_DEFAULT);
+
+  gtk_signal_connect (GTK_OBJECT (spectrumwindow), "delete_event",
+                      GTK_SIGNAL_FUNC (on_spectrumwindow_delete_event),
+                      NULL);
+
+  return spectrumwindow;
+}
+
diff --git a/eppfm2/src/interface.h b/eppfm2/src/interface.h
new file mode 100644
index 0000000..a893e32
--- /dev/null
+++ b/eppfm2/src/interface.h
@@ -0,0 +1,10 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_ioconfiglinux (void);
+GtkWidget* create_mainwindow (void);
+GtkWidget* create_aboutdialog (void);
+GtkWidget* create_dtmfwindow (void);
+GtkWidget* create_scopewindow (void);
+GtkWidget* create_spectrumwindow (void);
diff --git a/eppfm2/src/main.c b/eppfm2/src/main.c
new file mode 100644
index 0000000..0cd2844
--- /dev/null
+++ b/eppfm2/src/main.c
@@ -0,0 +1,571 @@
+/*****************************************************************************/
+
+/*
+ *      eppfm.c  --  EPP modem virtual transceiver.
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+#include "getopt.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+
+#include "widgets.h"
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+/* ---------------------------------------------------------------------- */
+
+struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+
+static unsigned int ptt = 0;
+static unsigned int squelch = 0;
+
+/* ---------------------------------------------------------------------- */
+
+/*OutputDebugStringA*/
+int lprintf(unsigned vl, const char *format, ...)
+{
+        va_list ap;
+        int r;
+
+        if (vl > verboselevel)
+                return 0;
+        va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+        if (syslogmsg) {
+                static const int logprio[] = { LOG_ERR, LOG_INFO };
+                vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+                r = 0;
+        } else
+#endif
+                r = vfprintf(stderr, format, ap);
+        va_end(ap);
+        return r;
+}
+
+/* ---------------------------------------------------------------------- */
+
+GtkWidget *ioconfig;
+GtkWidget *mainwindow;
+GtkWidget *aboutdialog;
+GtkWidget *dtmfwindow;
+GtkWidget *scopewindow;
+GtkWidget *spectrumwindow;
+
+
+void gui_addsamples(unsigned int num, const int16_t *y)
+{
+	Scope *scope;
+	Spectrum *spec;
+
+	scope = SCOPE(gtk_object_get_data(GTK_OBJECT(scopewindow), "scope"));
+	spec = SPECTRUM(gtk_object_get_data(GTK_OBJECT(spectrumwindow), "spec"));
+	scope_addvalues(scope, num, NULL, y);
+	spectrum_addvalues(spec, num, y);
+}
+
+void gui_updatevu(float meter1, float meter2)
+{
+	GtkProgress *pb1, *pb2;
+
+	pb1 = GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "progressbar1"));
+	pb2 = GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "progressbar2"));
+	gtk_progress_set_value(pb1, meter1);
+	gtk_progress_set_value(pb2, meter2);
+}
+
+void on_dtmf_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_widget_show(dtmfwindow);
+}
+
+void on_oscilloscope_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_widget_show(scopewindow);
+}
+
+void on_spectrum_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_widget_show(spectrumwindow);
+}
+
+void on_quit_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_main_quit();
+}
+
+void on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gtk_widget_show(aboutdialog);
+}
+
+void on_dtmfclear_clicked(GtkButton *button, gpointer user_data)
+{
+	GtkEntry *entry;
+	
+	entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry"));
+	gtk_entry_set_text(entry, "");
+}
+
+static gint dtmfkeyfunc(gpointer data)
+{
+	return on_dtmfwindow_key_event(NULL, NULL, data);
+}
+
+gboolean on_dtmfwindow_key_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+	static const char dtmfkeys[] = "0123456789ABCD*#";
+	static guint tmo = 0;
+	static guint lastkey = -1;
+	static guint currentkey = 0;
+	GtkButton *but;
+	gchar bname[6] = "dtmf0";
+	char *cp, c;
+
+	if (!event) {
+		tmo = 0;
+		lastkey = currentkey;
+		bname[4] += lastkey & 15;
+		if ((lastkey & 15) >= 10)
+			bname[4] += 'a'-'0'-10;
+		but = GTK_BUTTON(gtk_object_get_data(GTK_OBJECT(dtmfwindow), bname));
+		if (lastkey & 16)
+			gtk_button_pressed(but);
+		else
+			gtk_button_released(but);
+		return FALSE;  /* don't get called again */
+	}
+	c = event->keyval;
+	if (c >= 'a' && c <= 'z')
+		c += 'A'-'a';
+	if (!(cp = strchr(dtmfkeys, c)))
+		return FALSE;
+	currentkey = cp - dtmfkeys + (event->type == GDK_KEY_PRESS ? 16 : 0);
+	if (tmo)
+		gtk_timeout_remove(tmo);
+	if (currentkey != lastkey)
+		tmo = gtk_timeout_add(10, dtmfkeyfunc, NULL);
+	return TRUE;
+}
+
+void on_dtmf_key(GtkButton *button, gpointer user_data)
+{
+	static const char dtmfkeys[] = "0123456789ABCD*#";
+	GtkEntry *entry;
+	gchar txt[2];
+	guint key = (guint)user_data;
+		
+	printf("DTMF key: %u\n", key);
+	if (key & 16)
+		ptt |= 2;
+	else 
+		ptt &= ~2;
+	audio_ptt(ptt);
+	audio_setsquelch(squelch);
+	audio_dtmf(key);
+	if (key < 0x10 || key > 0x1f)
+		return;
+	txt[0] = dtmfkeys[key & 0xf];
+	txt[1] = 0;
+	entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry"));
+	gtk_entry_append_text(entry, txt);
+}
+
+void on_configok_clicked(GtkButton *button, gpointer user_data)
+{
+	gtk_widget_show(mainwindow);
+	gtk_widget_hide(ioconfig);
+}
+
+void on_configquit_clicked(GtkButton *button, gpointer user_data)
+{
+	gtk_main_quit();
+}
+
+gboolean on_mainwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	return FALSE;
+}
+
+void on_mainwindow_destroy(GtkObject *object, gpointer user_data)
+{
+	gtk_main_quit();
+}
+
+static gint pttkeyfunc(gpointer data)
+{
+	return on_mainwindow_key_event(NULL, NULL, data);
+}
+
+gboolean on_mainwindow_key_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+	static guint tmo = 0;
+	static guint laststate = -1;
+	static guint currentstate = 0;
+	GtkToggleButton *ptt;
+
+	if (!event) {
+		tmo = 0;
+		laststate = currentstate;
+		ptt = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt"));
+		gtk_toggle_button_set_active(ptt, laststate);
+		printf("gtk_toggle_button_set_active: %d\n", laststate);
+		return FALSE;  /* don't get called again */
+	}
+	if (event->keyval == 32) {
+		currentstate = event->type == GDK_KEY_PRESS;
+		if (tmo)
+			gtk_timeout_remove(tmo);
+		if (currentstate != laststate)
+			tmo = gtk_timeout_add(100, pttkeyfunc, NULL);
+		return TRUE;
+	}
+	printf("Mainwindow key%s: time %u state %u keyval %u len %d\n",
+	       event->type == GDK_KEY_PRESS ? "press" : "release",
+	       event->time, event->state, event->keyval, event->length);
+	return FALSE;
+}
+
+void on_mainptt_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+	GtkToggleButton *pttb;
+	unsigned int ptts;
+
+	pttb = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt"));
+	ptts = gtk_toggle_button_get_active(pttb);
+	printf("Toggle button active: %d\n", ptts);
+	ptt = (ptt & ~1) | (ptts & 1);
+	audio_ptt(ptt);
+	audio_setsquelch(squelch);
+}
+
+void on_maindtmf_clicked(GtkButton *button, gpointer user_data)
+{
+	if (GTK_WIDGET_VISIBLE(dtmfwindow))
+		gtk_widget_hide(dtmfwindow);
+	else
+		gtk_widget_show(dtmfwindow);
+}
+
+void on_mainscope_clicked(GtkButton *button, gpointer user_data)
+{
+	if (GTK_WIDGET_VISIBLE(scopewindow))
+		gtk_widget_hide(scopewindow);
+	else
+		gtk_widget_show(scopewindow);
+}
+
+void on_mainspectrum_clicked(GtkButton *button, gpointer user_data)
+{
+	if (GTK_WIDGET_VISIBLE(spectrumwindow))
+		gtk_widget_hide(spectrumwindow);
+	else
+		gtk_widget_show(spectrumwindow);
+}
+
+void on_aboutok_clicked(GtkButton *button, gpointer user_data)
+{
+	gtk_widget_hide(aboutdialog);
+}
+
+gboolean on_aboutdialog_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	gtk_widget_hide(aboutdialog);
+	return TRUE;
+}
+
+gboolean on_dtmfwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	gtk_widget_hide(dtmfwindow);
+	return TRUE;
+}
+
+gboolean on_scopewindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	gtk_widget_hide(scopewindow);
+	return TRUE;
+}
+
+
+gboolean on_spectrumwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	gtk_widget_hide(spectrumwindow);
+	return TRUE;
+}
+
+void on_buttonsquelch_clicked(GtkButton *button, gpointer user_data)
+{
+	GtkWidget *sqbl;
+	
+	squelch++;
+	if (squelch > 1)
+		squelch = 0;
+	audio_setsquelch(squelch);
+	/* set label text */
+	sqbl = GTK_BIN(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonsquelch"))->child;
+	gtk_label_set_text(GTK_LABEL(sqbl), squelch ? _("Squelch on") : _("Squelch off") );	
+}
+
+void on_button1750_pressed(GtkButton *button, gpointer user_data)
+{
+	ptt |= 4;
+	audio_ptt(ptt);
+	audio_1750(1);
+	audio_setsquelch(squelch);
+}
+
+
+void on_button1750_released(GtkButton *button, gpointer user_data)
+{
+	ptt &= ~4;
+	audio_ptt(ptt);
+	audio_1750(0);
+	audio_setsquelch(squelch);
+}
+
+int main(int argc, char *argv[])
+{
+        static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+                { "ppuser", 1, 0, 0x400 },
+                { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+                { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+                { "ppgenport", 0, 0, 0x403 },
+                { "ppwin", 1, 0, 0x404 },
+                { "pplpt", 1, 0, 0x404 },
+                { "ppring0", 0, 0, 0x405 },
+#endif
+		{ "ppforcehwepp", 0, 0, 0x410 },
+		{ "ppswemulepp", 0, 0, 0x411 },
+		{ "ppswemulecp", 0, 0, 0x412 },
+		{ 0, 0, 0, 0 }
+        };
+        int c, err = 0;
+        unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+	const char *snd = NULL;
+	const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+        printf("EPP virtual transceiver  (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+	bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
+	textdomain(PACKAGE);
+
+	gtk_set_locale();
+	gtk_init(&argc, &argv);
+
+	add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps");
+	add_pixmap_directory(PACKAGE_SOURCE_DIR "/pixmaps");
+
+        while ((c = getopt_long(argc, argv, "svp:m:a:", long_options, NULL)) != EOF) {
+                switch (c) {
+		case 0x400:
+			ppuser = optarg;
+			ppkdrv = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x401:
+			ppkdrv = optarg;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x402:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = optarg;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x403:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 1;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+                        break;
+
+		case 0x404:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = strtoul(optarg, NULL, 0);
+                        w9xring0 = 0;
+			break;
+
+		case 0x405:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 1;
+			break;
+
+		case 0x410:
+			ppflags |= PPFLAG_FORCEHWEPP;
+			break;
+
+		case 0x411:
+			ppflags |= PPFLAG_SWEMULEPP;
+			break;
+
+		case 0x412:
+			ppflags |= PPFLAG_SWEMULECP;
+			break;
+
+		case 'a':
+			snd = optarg;
+			break;
+
+                case 'p': 
+                        iobase = strtoul(optarg, NULL, 0);
+                        if (iobase <= 0 || iobase >= 0x3f8)
+                                err++;
+                        break;
+
+                case 'm':
+                        parseconfig(&cfg, optarg);
+                        break;
+
+                case 'v':
+                        verboselevel++;
+                        break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+                case 's':
+                        if (syslogmsg)
+                                break;
+                        openlog("eppfpga", LOG_PID, LOG_USER);
+                        syslogmsg = 1;
+                        break;
+#endif
+
+                default:
+                        err++;
+                        break;
+                }
+        }
+        if (err) {
+                g_message("usage: %s [-v] [-p <portaddr>] [-m <modestr>]\n", argv[0]);
+                exit(1);
+        }
+	if (audio_drvinit(snd)) {
+                g_error("Sound Initialisation error\n");
+                exit(1);
+	}
+#ifdef HAVE_PPUSER
+	if (ppkdrv) {
+		if (parport_init_ppkdrv(ppkdrv)) {
+			fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+			exit(1);
+		}
+	} else
+#endif
+#ifdef HAVE_PPUSER
+		if (ppdev) {
+			if (parport_init_ppdev(ppdev)) {
+				fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+				exit(1);
+			}
+		} else if (ppuser) {
+			if (parport_init_ppuser(ppuser)) {
+				fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+				exit(1);
+			}
+		} else
+#endif
+#ifdef WIN32
+                        if (ntdrv) {
+                                if (parport_init_win_flags(ntdrv-1, ppflags)) {
+                                        fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+                                        exit(1);
+                                }
+                        } else if (ntddkgenport) {
+                                if (parport_init_ntddkgenport()) {
+                                        fprintf(stderr, "no NTDDK genport.sys driver found\n");
+                                        exit(1);
+                                }
+                        } else if (w9xring0) {
+                                if (parport_init_w9xring0_flags(iobase, ppflags)) {
+                                        fprintf(stderr, "no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+                        } else
+#endif
+                                if (parport_init_direct_flags(iobase, ppflags)) {
+                                        g_error("no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+	/*
+	 * The following code was added by Glade to create one of each component
+	 * (except popup menus), just so that you see something after building
+	 * the project. Delete any components that you don't want shown initially.
+	 */
+	aboutdialog = create_aboutdialog();
+	//ioconfig = create_ioconfiglinux();
+	mainwindow = create_mainwindow();
+	aboutdialog = create_aboutdialog();
+	dtmfwindow = create_dtmfwindow();
+	scopewindow = create_scopewindow();
+	spectrumwindow = create_spectrumwindow();
+	gtk_widget_show(mainwindow);
+	audio_ptt(ptt);
+	audio_setsquelch(squelch);
+	gtk_main();
+	reset_modem();
+	return 0;
+}
diff --git a/eppfm2/src/support.c b/eppfm2/src/support.c
new file mode 100644
index 0000000..ec73acc
--- /dev/null
+++ b/eppfm2/src/support.c
@@ -0,0 +1,158 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists        (const gchar     *directory,
+                                        const gchar     *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap  (GtkWidget       *widget);
+
+GtkWidget*
+lookup_widget                          (GtkWidget       *widget,
+                                        const gchar     *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+                                                   widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+"  c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap                    (GtkWidget       *widget)
+{
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+                                                     NULL, dummy_pixmap_xpm);
+  if (gdkpixmap == NULL)
+    g_error ("Couldn't create replacement pixmap.");
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (const gchar     *directory)
+{
+  pixmaps_directories = g_list_prepend (pixmaps_directories,
+                                        g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        const gchar     *filename)
+{
+  gchar *found_filename = NULL;
+  GdkColormap *colormap;
+  GdkPixmap *gdkpixmap;
+  GdkBitmap *mask;
+  GtkWidget *pixmap;
+  GList *elem;
+
+  /* We first try any pixmaps directories set by the application. */
+  elem = pixmaps_directories;
+  while (elem)
+    {
+      found_filename = check_file_exists ((gchar*)elem->data, filename);
+      if (found_filename)
+        break;
+      elem = elem->next;
+    }
+
+  /* If we haven't found the pixmap, try the source directory. */
+  if (!found_filename)
+    {
+      found_filename = check_file_exists ("../pixmaps", filename);
+    }
+
+  if (!found_filename)
+    {
+      g_warning (_("Couldn't find pixmap file: %s"), filename);
+      return create_dummy_pixmap (widget);
+    }
+
+  colormap = gtk_widget_get_colormap (widget);
+  gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+                                                   NULL, found_filename);
+  if (gdkpixmap == NULL)
+    {
+      g_warning (_("Error loading pixmap file: %s"), found_filename);
+      g_free (found_filename);
+      return create_dummy_pixmap (widget);
+    }
+  g_free (found_filename);
+  pixmap = gtk_pixmap_new (gdkpixmap, mask);
+  gdk_pixmap_unref (gdkpixmap);
+  gdk_bitmap_unref (mask);
+  return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists                      (const gchar     *directory,
+                                        const gchar     *filename)
+{
+  gchar *full_filename;
+  struct stat s;
+  gint status;
+
+  full_filename = (gchar*) g_malloc (strlen (directory) + 1
+                                     + strlen (filename) + 1);
+  strcpy (full_filename, directory);
+  strcat (full_filename, G_DIR_SEPARATOR_S);
+  strcat (full_filename, filename);
+
+  status = stat (full_filename, &s);
+  if (status == 0 && S_ISREG (s.st_mode))
+    return full_filename;
+  g_free (full_filename);
+  return NULL;
+}
+
diff --git a/eppfm2/src/support.h b/eppfm2/src/support.h
new file mode 100644
index 0000000..e8bfb5a
--- /dev/null
+++ b/eppfm2/src/support.h
@@ -0,0 +1,57 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+#  include <libintl.h>
+#  undef _
+#  define _(String) dgettext (PACKAGE, String)
+#  ifdef gettext_noop
+#    define N_(String) gettext_noop (String)
+#  else
+#    define N_(String) (String)
+#  endif
+#else
+#  define textdomain(String) (String)
+#  define gettext(String) (String)
+#  define dgettext(Domain,Message) (Message)
+#  define dcgettext(Domain,Message,Type) (Message)
+#  define bindtextdomain(Domain,Directory) (Domain)
+#  define _(String) (String)
+#  define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*  lookup_widget              (GtkWidget       *widget,
+                                        const gchar     *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void        add_pixmap_directory       (const gchar     *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget*  create_pixmap              (GtkWidget       *widget,
+                                        const gchar     *filename);
+
diff --git a/eppfm2/src/widgets.c b/eppfm2/src/widgets.c
new file mode 100644
index 0000000..39fa0fc
--- /dev/null
+++ b/eppfm2/src/widgets.c
@@ -0,0 +1,615 @@
+/* 
+ * Custom Widgets
+ * Copyright (C) 1999 Thomas Sailer <sailer at ife.ee.ethz.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+#include "widgets.h"
+#include <gtk/gtkgc.h>
+#include <gtk/gtkmain.h>
+
+#define SCOPEMAXPOINTS 512
+#define PRIO G_PRIORITY_LOW
+
+struct _ScopePoint {
+	guint16 dx;
+	guint16 y;
+};
+
+static void scope_class_init(ScopeClass *klass);
+static void scope_init(Scope *trace);
+static void scope_finalize(GtkObject *object);
+static gint scope_expose(GtkWidget *widget, GdkEventExpose *event);
+static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition);
+static gint scope_idle_callback(gpointer data);
+
+static GtkWidgetClass *scope_parent_class = NULL;
+static ScopeClass *scope_class = NULL;
+
+
+guint scope_get_type(void)
+{
+	static guint trace_type = 0;
+
+	if (!trace_type)
+	{
+		static const GtkTypeInfo trace_info =
+		{
+			"Scope",
+			sizeof(Scope),
+			sizeof(ScopeClass),
+			(GtkClassInitFunc) scope_class_init,
+			(GtkObjectInitFunc) scope_init,
+			/* reserved_1 */ NULL,
+			/* reserved_2 */ NULL,
+			(GtkClassInitFunc) NULL,
+		};
+		trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info);
+	}
+	return trace_type;
+}
+
+static void scope_class_init(ScopeClass *klass)
+{
+	GtkObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+
+	object_class = (GtkObjectClass*)klass;
+	widget_class = (GtkWidgetClass*)klass;
+
+	scope_parent_class = gtk_type_class(gtk_widget_get_type());
+	scope_class = klass;
+
+	object_class->finalize = scope_finalize;
+	widget_class->size_request = scope_size_request;
+	widget_class->expose_event = scope_expose;
+}
+
+static void scope_init(Scope *trace)
+{
+	GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW);
+
+	trace->idlefunc = 0;
+
+	/* initialize the colors */
+	trace->zerolinecol.red = 65535;
+	trace->zerolinecol.green = 13107;
+	trace->zerolinecol.blue = 0;
+	trace->samplingcol.red = 13763;
+	trace->samplingcol.green = 42598;
+	trace->samplingcol.blue = 5243;
+	trace->zeroline_gc = trace->sampling_gc = NULL;
+	/* initialize the trace history */
+	trace->ptnum = trace->ptptr = 0;
+	trace->pt = NULL;
+}
+
+
+static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+	Scope *trace;
+  
+	g_return_if_fail(widget != NULL);
+	g_return_if_fail(IS_SCOPE(widget));
+	g_return_if_fail(requisition != NULL);
+	trace = SCOPE(widget);
+	requisition->width = MIN(trace->ptnum * 4, 512);
+	requisition->height = 256;
+}
+
+
+GtkWidget* scope_new(char *name, char *str1, char *str2, gint int1, gint int2)
+{
+	Scope *trace;
+
+	trace = gtk_type_new(scope_get_type());
+	trace->ptnum = CLAMP(int1, 2, SCOPEMAXPOINTS);;
+	trace->pt = g_malloc0(trace->ptnum * sizeof(struct _ScopePoint));
+	return GTK_WIDGET(trace);
+}
+
+static void scope_finalize(GtkObject *object)
+{
+	Scope *trace;
+
+	g_return_if_fail(object != NULL);
+	g_return_if_fail(IS_SCOPE(object));
+	trace = SCOPE(object);
+	if (trace->idlefunc)
+		gtk_idle_remove(trace->idlefunc);
+	if (trace->zeroline_gc)
+		gtk_gc_release(trace->zeroline_gc);
+	if (trace->sampling_gc)
+		gtk_gc_release(trace->sampling_gc);
+	if (trace->pt)
+		g_free(trace->pt);
+	(*GTK_OBJECT_CLASS(scope_parent_class)->finalize)(object);
+}
+
+static gint scope_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+	Scope *trace;
+
+	g_return_val_if_fail(widget != NULL, FALSE);
+	g_return_val_if_fail(IS_SCOPE(widget), FALSE);
+	g_return_val_if_fail (event != NULL, FALSE);
+	if (GTK_WIDGET_DRAWABLE(widget)) {
+		trace = SCOPE(widget);
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+	}
+	return FALSE;
+}
+
+static void scope_draw(Scope *trace)
+{
+	GdkGCValues gc_values;
+	guint totx, idx, i, si;
+	guint32 mulx, muly, zeroy, x;
+	GdkPoint p[SCOPEMAXPOINTS+1];
+	GdkSegment s[SCOPEMAXPOINTS];
+
+	/* init gc's if necessary */
+	if (!trace->zeroline_gc) {
+		if (!gdk_color_alloc(trace->widget.style->colormap, &trace->zerolinecol))
+			g_warning("unable to allocate color: ( %d %d %d )",
+				  trace->zerolinecol.red, trace->zerolinecol.green, trace->zerolinecol.blue);
+		gc_values.foreground = trace->zerolinecol;
+		trace->zeroline_gc = gtk_gc_get(trace->widget.style->depth, 
+						trace->widget.style->colormap,
+						&gc_values, GDK_GC_FOREGROUND);
+	}
+	if (!trace->sampling_gc) {
+		if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol))
+			g_warning("unable to allocate color: ( %d %d %d )",
+				  trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue);
+		gc_values.foreground = trace->samplingcol;
+		trace->sampling_gc = gtk_gc_get(trace->widget.style->depth,
+						trace->widget.style->colormap,
+						&gc_values, GDK_GC_FOREGROUND);
+	}
+	/* first determine the total x size and calculate multiplication factors */
+	for (totx = 0, idx = trace->ptptr, i = 1; i < trace->ptnum; i++) {
+		idx++;
+		if (idx >= trace->ptnum)
+			idx = 0;
+		totx += trace->pt[idx].dx & 0x7fff;
+	}
+	mulx = (((guint32)trace->widget.allocation.width) << 16) / MAX(totx, 1);
+	muly = trace->widget.allocation.height;
+	zeroy = (0x8000 * muly) >> 16;
+	/* prepare sampling ticks and lines */
+	for (si = x = i = 0, idx = trace->ptptr; i < trace->ptnum; i++) {
+		p[i].x = trace->widget.allocation.x + ((x * mulx) >> 16);
+		p[i].y = trace->widget.allocation.y + ((trace->pt[idx].y * muly) >> 16);
+		if (trace->pt[idx].dx & 0x8000) {
+			s[si].x1 = s[si].x2 = p[i].x;
+			s[si].y1 = trace->widget.allocation.y + zeroy - 4;
+			s[si].y2 = trace->widget.allocation.y + zeroy + 4;
+			si++;
+		}
+		idx++;
+		if (idx >= trace->ptnum)
+			idx = 0;
+		x += trace->pt[idx].dx & 0x7fff;
+	}
+	/* now draw everything */
+	gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state],
+			   TRUE, trace->widget.allocation.x, trace->widget.allocation.y, 
+			   trace->widget.allocation.x+trace->widget.allocation.width, 
+			   trace->widget.allocation.y+trace->widget.allocation.height);
+	gdk_draw_line(trace->widget.window, trace->zeroline_gc, 
+		      trace->widget.allocation.x,
+		      trace->widget.allocation.y+zeroy, 
+		      trace->widget.allocation.x+trace->widget.allocation.width-1, 
+		      trace->widget.allocation.y+zeroy);
+	gdk_draw_segments(trace->widget.window, trace->sampling_gc, s, si);
+	gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state],
+		       p, trace->ptnum);
+}
+
+
+static gint scope_idle_callback(gpointer data)
+{
+	g_return_val_if_fail(data != NULL, FALSE);
+	g_return_val_if_fail(IS_SCOPE(data), FALSE);
+	SCOPE(data)->idlefunc = 0;
+	if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data)))
+		return FALSE;
+	if (!SCOPE(data)->pt || !SCOPE(data)->ptnum)
+		return FALSE;
+	scope_draw(SCOPE(data));
+	return FALSE;  /* don't call this callback again */
+}
+
+
+void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags)
+{
+	g_return_if_fail(trace != NULL);
+	g_return_if_fail(IS_SCOPE(trace));
+	trace->pt[trace->ptptr].y = 32767-y;
+	trace->pt[trace->ptptr].dx = deltax & 0x7fff;
+	if (flags)
+		trace->pt[trace->ptptr].dx |= 0x8000;
+	trace->ptptr++;
+	if (trace->ptptr >= trace->ptnum)
+		trace->ptptr = 0;
+	if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+	}
+}
+
+void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y)
+{
+	guint i;
+
+	g_return_if_fail(trace != NULL);
+	g_return_if_fail(IS_SCOPE(trace));
+	g_return_if_fail(y != NULL);
+	for (i = 0; i < num; i++) {
+		trace->pt[trace->ptptr].y = 32767-y[i];
+		trace->pt[trace->ptptr].dx = deltax ? (deltax[i] & 0x7fff) : 1;
+		trace->ptptr++;
+		if (trace->ptptr >= trace->ptnum)
+			trace->ptptr = 0;
+	}
+	if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+	}
+}
+
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * This fft routine is from ~gabriel/src/filters/fft/fft.c;
+ * I am unsure of the original source.  The file contains no
+ * copyright notice or description.
+ * The declaration is changed to the prototype form but the
+ * function body is unchanged.  (J. T. Buck)
+ */
+
+#define SWAP(a, b) tempr=(a); (a)=(b); (b)=tempr
+
+/*
+ * Replace data by its discrete Fourier transform, if isign is
+ * input as 1, or by its inverse discrete Fourier transform, if 
+ * "isign" is input as -1.  "data'"is a complex array of length "nn",
+ * input as a real array data[0..2*nn-1]. "nn" MUST be an integer
+ * power of 2 (this is not checked for!?)
+ */
+
+static void fft_rif(float *data, int nn, int isign) {
+        int n;
+        int mmax;
+        int m, j, istep, i;
+        float wtemp, wr, wpr, wpi, wi, theta;
+        float tempr, tempi;
+
+        data--;
+        n = nn << 1;
+        j = 1;
+
+        for (i = 1; i < n; i += 2) {
+                if(j > i) {
+                        SWAP(data[j], data[i]);
+                        SWAP(data[j+1], data[i+1]);
+                }
+                m= n >> 1;
+                while (m >= 2 && j >m) {
+                        j -= m;
+                        m >>= 1;
+                }
+                j += m;
+        }
+        mmax = 2;
+        while (n > mmax) {
+                istep = 2*mmax;
+                theta = -6.28318530717959/(isign*mmax);
+                wtemp = sin(0.5*theta);
+                wpr = -2.0*wtemp*wtemp;
+                wpi = sin(theta);
+                wr = 1.0;
+                wi = 0.0;
+                for (m = 1; m < mmax; m += 2) {
+                        for (i = m; i < n; i += istep) {
+                                j = i + mmax;
+                                tempr = wr*data[j] - wi*data[j+1];
+                                tempi = wr*data[j+1] + wi*data[j];
+                                data[j] = data[i] - tempr;
+                                data[j+1] = data[i+1] - tempi;
+                                data[i] += tempr;
+                                data[i+1] += tempi;
+                        }
+                        wr = (wtemp=wr)*wpr - wi*wpi+wr;
+                        wi = wi*wpr + wtemp*wpi + wi;
+                }
+                mmax = istep;
+        }
+}
+        
+#undef SWAP
+
+static inline float hamming(float x)
+{
+        return 0.54-0.46*cos(2*M_PI*x);
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SPECTRUMMAXPOINTS 1024
+
+static void spectrum_class_init(SpectrumClass *klass);
+static void spectrum_init(Spectrum *trace);
+static void spectrum_finalize(GtkObject *object);
+static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event);
+static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition);
+static gint spectrum_idle_callback(gpointer data);
+
+static GtkWidgetClass *spectrum_parent_class = NULL;
+static SpectrumClass *spectrum_class = NULL;
+
+
+guint spectrum_get_type(void)
+{
+	static guint trace_type = 0;
+
+	if (!trace_type)
+	{
+		static const GtkTypeInfo trace_info =
+		{
+			"Spectrum",
+			sizeof(Spectrum),
+			sizeof(SpectrumClass),
+			(GtkClassInitFunc) spectrum_class_init,
+			(GtkObjectInitFunc) spectrum_init,
+			/* reserved_1 */ NULL,
+			/* reserved_2 */ NULL,
+			(GtkClassInitFunc) NULL,
+		};
+		trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info);
+	}
+	return trace_type;
+}
+
+static void spectrum_class_init(SpectrumClass *klass)
+{
+	GtkObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+
+	object_class = (GtkObjectClass*)klass;
+	widget_class = (GtkWidgetClass*)klass;
+
+	spectrum_parent_class = gtk_type_class(gtk_widget_get_type());
+	spectrum_class = klass;
+
+	object_class->finalize = spectrum_finalize;
+	widget_class->size_request = spectrum_size_request;
+	widget_class->expose_event = spectrum_expose;
+}
+
+static void spectrum_init(Spectrum *trace)
+{
+	GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW);
+
+	trace->idlefunc = 0;
+
+	/* initialize the colors */
+	trace->gridcol.red = 65535;
+	trace->gridcol.green = 13107;
+	trace->gridcol.blue = 0;
+	trace->samplingcol.red = 13763;
+	trace->samplingcol.green = 42598;
+	trace->samplingcol.blue = 5243;
+	trace->grid_gc = trace->sampling_gc = NULL;
+	/* initialize the trace history */
+	trace->ptnum = trace->ptptr = 0;
+	trace->pt = NULL;
+}
+
+
+static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+	Spectrum *trace;
+  
+	g_return_if_fail(widget != NULL);
+	g_return_if_fail(IS_SPECTRUM(widget));
+	g_return_if_fail(requisition != NULL);
+	trace = SPECTRUM(widget);
+	requisition->width = MIN(trace->ptnum * 4, 512);
+	requisition->height = 256;
+}
+
+
+GtkWidget* spectrum_new(char *name, char *str1, char *str2, gint int1, gint int2)
+{
+	guint i, j;
+	Spectrum *trace;
+
+	trace = gtk_type_new(spectrum_get_type());
+	i = CLAMP(int1, 4, SPECTRUMMAXPOINTS);
+	j = 0;
+	while (i > 1) {
+		i >>= 1;
+		j++;
+	}
+	trace->ptnum = 1 << j;
+       	trace->pt = g_malloc0(trace->ptnum * sizeof(gint16));
+	return GTK_WIDGET(trace);
+}
+
+static void spectrum_finalize(GtkObject *object)
+{
+	Spectrum *trace;
+
+	g_return_if_fail(object != NULL);
+	g_return_if_fail(IS_SPECTRUM(object));
+	trace = SPECTRUM(object);
+	if (trace->idlefunc)
+		gtk_idle_remove(trace->idlefunc);
+	if (trace->grid_gc)
+		gtk_gc_release(trace->grid_gc);
+	if (trace->sampling_gc)
+		gtk_gc_release(trace->sampling_gc);
+	if (trace->pt)
+		g_free(trace->pt);
+	(*GTK_OBJECT_CLASS(spectrum_parent_class)->finalize)(object);
+}
+
+static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+	Spectrum *trace;
+
+	g_return_val_if_fail(widget != NULL, FALSE);
+	g_return_val_if_fail(IS_SPECTRUM(widget), FALSE);
+	g_return_val_if_fail (event != NULL, FALSE);
+	if (GTK_WIDGET_DRAWABLE(widget)) {
+		trace = SPECTRUM(widget);
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+	}
+	return FALSE;
+}
+
+static void spectrum_draw(Spectrum *trace)
+{
+	GdkGCValues gc_values;
+	guint idx, i;
+	guint32 mulx;
+	gint y;
+	GdkPoint p[SPECTRUMMAXPOINTS/2+1];
+	float f[2*SPECTRUMMAXPOINTS];
+	float ftmp1, ftmp2, ftmp3;
+
+	/* init gc's if necessary */
+	if (!trace->grid_gc) {
+		if (!gdk_color_alloc(trace->widget.style->colormap, &trace->gridcol))
+			g_warning("unable to allocate color: ( %d %d %d )",
+				  trace->gridcol.red, trace->gridcol.green, trace->gridcol.blue);
+		gc_values.foreground = trace->gridcol;
+		trace->grid_gc = gtk_gc_get(trace->widget.style->depth, 
+					    trace->widget.style->colormap,
+					    &gc_values, GDK_GC_FOREGROUND);
+	}
+	if (!trace->sampling_gc) {
+		if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol))
+			g_warning("unable to allocate color: ( %d %d %d )",
+				  trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue);
+		gc_values.foreground = trace->samplingcol;
+		trace->sampling_gc = gtk_gc_get(trace->widget.style->depth,
+						trace->widget.style->colormap,
+						&gc_values, GDK_GC_FOREGROUND);
+	}
+	/* first determine the total x size and calculate multiplication factors */
+	ftmp1 = 1.0 / (float)trace->ptnum;
+	for (idx = trace->ptptr, i = 0; i < trace->ptnum; i++) {
+		f[2*i] = trace->pt[idx] * hamming((float)i * ftmp1);
+		f[2*i+1] = 0;
+		idx++;
+		if (idx >= trace->ptnum)
+			idx = 0;
+	}
+	fft_rif(f, trace->ptnum, 1);
+	mulx = (((guint32)trace->widget.allocation.width) << 17) / trace->ptnum;
+	/* prepare sampling ticks and lines */
+	ftmp2 = trace->widget.allocation.height * 0.0723824136504;  /* 1/ln(10^6) */
+	ftmp3 = 21.4875015613 + 4.6;
+	for (i = 0; i < trace->ptnum / 2; i++) {
+		ftmp1 = f[2*i] * f[2*i] + f[2*i+1] * f[2*i+1];
+		if (ftmp1 < 2168)
+			p[i].y = trace->widget.allocation.y + trace->widget.allocation.height - 1;
+		else {
+			y = ftmp2 * (ftmp3 - log(ftmp1));
+			y = CLAMP(y, 0, trace->widget.allocation.height-1);
+			p[i].y = trace->widget.allocation.y + y;
+		}
+		p[i].x = trace->widget.allocation.x + ((i * mulx) >> 16);
+	}
+	/* now draw everything */
+	gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state],
+			   TRUE, trace->widget.allocation.x, trace->widget.allocation.y, 
+			   trace->widget.allocation.x+trace->widget.allocation.width, 
+			   trace->widget.allocation.y+trace->widget.allocation.height);
+	for (i = 0; i < 3; i++)
+		gdk_draw_line(trace->widget.window, trace->grid_gc, 
+			      trace->widget.allocation.x,
+			      trace->widget.allocation.y+i*(trace->widget.allocation.height/3), 
+			      trace->widget.allocation.x+trace->widget.allocation.width-1,
+			      trace->widget.allocation.y+i*(trace->widget.allocation.height/3));
+	gdk_draw_line(trace->widget.window, trace->grid_gc, 
+		      trace->widget.allocation.x,
+		      trace->widget.allocation.y+trace->widget.allocation.height-1, 
+		      trace->widget.allocation.x+trace->widget.allocation.width-1,
+		      trace->widget.allocation.y+trace->widget.allocation.height-1);
+	gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state],
+		       p, trace->ptnum / 2);
+}
+
+
+static gint spectrum_idle_callback(gpointer data)
+{
+	g_return_val_if_fail(data != NULL, FALSE);
+	g_return_val_if_fail(IS_SPECTRUM(data), FALSE);
+	SPECTRUM(data)->idlefunc = 0;
+	if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data)))
+		return FALSE;
+	if (!SPECTRUM(data)->pt || !SPECTRUM(data)->ptnum)
+		return FALSE;
+	spectrum_draw(SPECTRUM(data));
+	return FALSE;  /* don't call this callback again */
+}
+
+
+void spectrum_addvalue(Spectrum *trace, gint16 y)
+{
+	g_return_if_fail(trace != NULL);
+	g_return_if_fail(IS_SPECTRUM(trace));
+	trace->pt[trace->ptptr] = y;
+	trace->ptptr++;
+	if (trace->ptptr >= trace->ptnum)
+		trace->ptptr = 0;
+	if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+	}
+}
+
+void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y)
+{
+	guint i;
+
+	g_return_if_fail(trace != NULL);
+	g_return_if_fail(IS_SPECTRUM(trace));
+	g_return_if_fail(y != NULL);
+	for (i = 0; i < num; i++) {
+		trace->pt[trace->ptptr] = y[i];
+		trace->ptptr++;
+		if (trace->ptptr >= trace->ptnum)
+			trace->ptptr = 0;
+	}
+	if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+		if (!trace->idlefunc)
+			trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+	}
+}
diff --git a/eppfm2/src/widgets.h b/eppfm2/src/widgets.h
new file mode 100644
index 0000000..5172553
--- /dev/null
+++ b/eppfm2/src/widgets.h
@@ -0,0 +1,102 @@
+/* 
+ * Custom Widgets
+ * Copyright (C) 1999 Thomas Sailer <sailer at ife.ee.ethz.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __WIDGETS_H__
+#define __WIDGETS_H__
+
+#include <gdk/gdk.h>
+#include <gtk/gtkwidget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define SCOPE(obj)          GTK_CHECK_CAST(obj, scope_get_type(), Scope)
+#define SCOPE_CLASS(klass)  GTK_CHECK_CLASS_CAST(klass, scope_get_type(), ScopeClass)
+#define IS_SCOPE(obj)       GTK_CHECK_TYPE(obj, scope_get_type())
+
+typedef struct _Scope        Scope;
+typedef struct _ScopeClass   ScopeClass;
+
+struct _Scope
+{
+	GtkWidget widget;
+
+	guint idlefunc;
+	GdkGC *zeroline_gc;
+	GdkGC *sampling_gc;
+	GdkColor zerolinecol;
+	GdkColor samplingcol;
+
+	struct _ScopePoint *pt;
+	guint ptnum, ptptr;
+};
+
+struct _ScopeClass
+{
+	GtkWidgetClass parent_class;
+};
+
+
+guint scope_get_type(void);
+GtkWidget* scope_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2);
+void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags);
+void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y);
+
+
+#define SPECTRUM(obj)          GTK_CHECK_CAST(obj, spectrum_get_type(), Spectrum)
+#define SPECTRUM_CLASS(klass)  GTK_CHECK_CLASS_CAST(klass, spectrum_get_type(), SpectrumClass)
+#define IS_SPECTRUM(obj)       GTK_CHECK_TYPE(obj, spectrum_get_type())
+
+typedef struct _Spectrum        Spectrum;
+typedef struct _SpectrumClass   SpectrumClass;
+
+struct _Spectrum
+{
+	GtkWidget widget;
+
+	guint idlefunc;
+	GdkGC *grid_gc;
+	GdkGC *sampling_gc;
+	GdkColor gridcol;
+	GdkColor samplingcol;
+
+	gint16 *pt;
+	guint ptnum, ptptr;
+};
+
+struct _SpectrumClass
+{
+	GtkWidgetClass parent_class;
+};
+
+
+guint spectrum_get_type(void);
+GtkWidget* spectrum_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2);
+void spectrum_addvalue(Spectrum *trace, gint16 y);
+void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __WIDGETS_H__ */
diff --git a/flexdrv/Makefile.am b/flexdrv/Makefile.am
new file mode 100644
index 0000000..3676247
--- /dev/null
+++ b/flexdrv/Makefile.am
@@ -0,0 +1,30 @@
+EXTRA_DIST = bayeppflex.c bayeppflex.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h
+
+INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main
+
+
+if WIN32
+
+noinst_LIBRARIES = libflxdrv.a
+
+libflxdrv_a_SOURCES = driver.c bayeppflex.c
+
+bayeppflex.res:	bayeppflex.rc resource.h
+	        $(WINDRES) $< -O coff -o $@
+
+DLLNAME		= bayeppflex
+DLLOBJ		= driver.o bayeppflex.o bayeppflex.res ../main/libinit.a ../main/libresident.a ../main/libresident2.a ../main/libmisc.a
+DLLLDARGS	=
+DLLDEF		= --def $(srcdir)/flexdriv.def
+
+noinst_SCRIPTS = $(DLLNAME).dll
+
+$(DLLNAME).dll:	$(DLLOBJ)
+	$(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+	$(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+	$(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ)
+
+endif
diff --git a/flexdrv/Makefile.in b/flexdrv/Makefile.in
new file mode 100644
index 0000000..10d7539
--- /dev/null
+++ b/flexdrv/Makefile.in
@@ -0,0 +1,333 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = bayeppflex.c bayeppflex.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h
+
+INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main
+
+ at WIN32_TRUE@noinst_LIBRARIES = @WIN32_TRUE at libflxdrv.a
+
+ at WIN32_TRUE@libflxdrv_a_SOURCES = @WIN32_TRUE at driver.c bayeppflex.c
+
+ at WIN32_TRUE@DLLNAME = @WIN32_TRUE at bayeppflex
+ at WIN32_TRUE@DLLOBJ = @WIN32_TRUE at driver.o bayeppflex.o bayeppflex.res ../main/libinit.a ../main/libresident.a ../main/libresident2.a ../main/libmisc.a
+ at WIN32_TRUE@DLLLDARGS = 
+ at WIN32_TRUE@DLLDEF = @WIN32_TRUE at --def $(srcdir)/flexdriv.def
+
+ at WIN32_TRUE@noinst_SCRIPTS = @WIN32_TRUE@$(DLLNAME).dll
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libflxdrv_a_LIBADD = 
+ at WIN32_TRUE@libflxdrv_a_OBJECTS =  driver.$(OBJEXT) bayeppflex.$(OBJEXT)
+SCRIPTS =  $(noinst_SCRIPTS)
+
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libflxdrv_a_SOURCES)
+OBJECTS = $(libflxdrv_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps flexdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libflxdrv.a: $(libflxdrv_a_OBJECTS) $(libflxdrv_a_DEPENDENCIES)
+	-rm -f libflxdrv.a
+	$(AR) cru libflxdrv.a $(libflxdrv_a_OBJECTS) $(libflxdrv_a_LIBADD)
+	$(RANLIB) libflxdrv.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = flexdrv
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+		mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+		mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+		distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at WIN32_TRUE@bayeppflex.res:	bayeppflex.rc resource.h
+ at WIN32_TRUE@	        $(WINDRES) $< -O coff -o $@
+
+ at WIN32_TRUE@$(DLLNAME).dll:	$(DLLOBJ)
+ at WIN32_TRUE@	$(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ at WIN32_TRUE@	$(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ at WIN32_TRUE@	$(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@	$(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/flexdrv/bayeppflex.c b/flexdrv/bayeppflex.c
new file mode 100644
index 0000000..2e57f85
--- /dev/null
+++ b/flexdrv/bayeppflex.c
@@ -0,0 +1,1520 @@
+/*****************************************************************************/
+
+/*
+ *	bayeppflex.c  --  FlexNet driver for Baycom EPPFLEX modem.
+ *
+ *	Copyright (C) 1999-2001
+ *          Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *	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 of the License, 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.
+ *
+ *	You should have received a copy of the GNU General Public License
+ *	along with this program; if not, write to the Free Software
+ *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ *  History:
+ *   0.1  23.06.1999  Created
+ *   0.2  07.01.2000  Expanded to usbdevfs capabilities
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <windows.h>
+#include <windowsx.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "flexdrv.h"
+#include "resource.h"
+
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define DRIVER_NAME	"Baycom EPPFLEX"
+#define DRIVER_VERSION  "0.2"
+
+#define RXBUFFER_SIZE     ((MAXFLEN*6U/5U)+8U)
+#define TXBUFFER_SIZE     8192U  /* must be a power of 2 and >= MAXFLEN*6/5+8 */
+
+#define MODE_EPP     0
+#define MODE_ECP     1
+#define MODE_EPPAFSK 2
+#define MODE_EPPCONV 3  /* conventional modem */
+
+#define NRBIOSPORTS  4
+#define BIOSLPTADDR  0x408
+
+static struct state {
+	volatile unsigned int active;
+	volatile unsigned int terminate;
+	volatile unsigned int rxactive;
+
+	unsigned int verblevel;
+	unsigned int mode;
+	unsigned int ioaddr;
+        unsigned int isnt;
+        unsigned int w9xportmode;
+        unsigned int portflags;
+	struct adapter_config config;
+	unsigned int txdelay;
+	unsigned int fullduplex;
+	unsigned int calib;
+        unsigned int leds;
+        
+        byte baud;
+	byte flexmode;
+	byte status;
+
+	unsigned int scale;
+
+	HANDLE hdevlife;
+	HANDLE htxmutex;
+
+	L1FRAME txframe;
+	L1FRAME rxframe;
+	L1_STATISTICS stat;
+
+	unsigned char rxbuf[512];
+	unsigned int rxptr, rxlen;
+
+	struct {
+		unsigned rd, wr;
+		unsigned char buf[TXBUFFER_SIZE];
+	} htx;
+
+	struct {
+		unsigned int bitbuf, bitstream, numbits, state;
+		unsigned char *bufptr;
+		int bufcnt;
+		unsigned char buf[RXBUFFER_SIZE];
+	} hrx;
+
+	unsigned short biosports[NRBIOSPORTS];
+	HANDLE hlpt;
+} state = { 0, };
+
+#define REGISTRYPATH "SOFTWARE\\FlexNet\\BaycomUSB"
+#define REGHKEY      HKEY_LOCAL_MACHINE
+
+/* ------------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+        va_list ap;
+        char buf[512];
+        int r;
+
+	if (vl > state.verblevel)
+                return 0;
+	va_start(ap, format);
+        r = vsnprintf(buf, sizeof(buf), format, ap);
+	va_end(ap);
+        OutputDebugString(buf);
+        return r;
+}
+
+extern inline int iopl(unsigned int level)
+{
+        OSVERSIONINFO info;
+
+        info.dwOSVersionInfoSize = sizeof(info);
+        if (GetVersionEx(&info) &&
+            (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+             info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+                return 0;
+        return 1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+const u_int16_t crc_ccitt_table[0x100] = {
+        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* ---------------------------------------------------------------------- */
+
+static inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = 0xffff;
+
+        for (;len>0;len--)
+                crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+        crc ^= 0xffff;
+        return crc;
+}
+
+static inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        buffer[len] = crc;
+        buffer[len+1] = crc >> 8;
+}
+
+static inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * high performance HDLC encoder
+ * yes, it's ugly, but generates pretty good code
+ */
+
+#define ENCODEITERA(j)                         \
+({                                             \
+        if (!(notbitstream & (0x1f0 << j)))    \
+                goto stuff##j;                 \
+  encodeend##j:                                \
+})
+
+#define ENCODEITERB(j)                                          \
+({                                                              \
+  stuff##j:                                                     \
+        bitstream &= ~(0x100 << j);                             \
+        bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) |        \
+                ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1);  \
+        numbit++;                                               \
+        notbitstream = ~bitstream;                              \
+        goto encodeend##j;                                      \
+})
+
+static void hdlc_encode(unsigned char *pkt, unsigned int len)
+{
+        unsigned bitstream, notbitstream, bitbuf, numbit;
+        unsigned wr = state.htx.wr;
+
+        append_crc_ccitt(pkt, len);
+        len += 2;
+        bitstream = 0;
+        bitbuf = 0x7e;
+        numbit = 8; /* opening flag */
+        while (numbit >= 8) {
+                state.htx.buf[wr] = bitbuf;
+                wr = (wr + 1) % TXBUFFER_SIZE;
+                if (wr == state.htx.rd)
+                        *(int *)0 = 0;  /* must not happen! */
+                bitbuf >>= 8;
+                numbit -= 8;
+        }
+        for (; len > 0; len--, pkt++) {
+                bitstream >>= 8;
+                bitstream |= ((unsigned int)*pkt) << 8;
+                bitbuf |= ((unsigned int)*pkt) << numbit;
+                notbitstream = ~bitstream;
+                ENCODEITERA(0);
+                ENCODEITERA(1);
+                ENCODEITERA(2);
+                ENCODEITERA(3);
+                ENCODEITERA(4);
+                ENCODEITERA(5);
+                ENCODEITERA(6);
+                ENCODEITERA(7);
+                goto enditer;
+                ENCODEITERB(0);
+                ENCODEITERB(1);
+                ENCODEITERB(2);
+                ENCODEITERB(3);
+                ENCODEITERB(4);
+                ENCODEITERB(5);
+                ENCODEITERB(6);
+                ENCODEITERB(7);
+        enditer:
+                numbit += 8;
+                while (numbit >= 8) {
+                        state.htx.buf[wr] = bitbuf;
+                        wr = (wr + 1) % TXBUFFER_SIZE;
+                        if (wr == state.htx.rd)
+                                *(int *)0 = 0;  /* must not happen! */
+                        bitbuf >>= 8;
+                        numbit -= 8;
+                }
+        }
+        bitbuf |= 0x7e7e << numbit;
+        numbit += 16;
+        while (numbit >= 8) {
+                state.htx.buf[wr] = bitbuf;
+                wr = (wr + 1) % TXBUFFER_SIZE;
+                if (wr == state.htx.rd)
+                        *(int *)0 = 0;  /* must not happen! */
+                bitbuf >>= 8;
+                numbit -= 8;
+        }
+        state.htx.wr = wr;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static inline void do_rxpacket(void)
+{
+        if (state.hrx.bufcnt < 3 || state.hrx.bufcnt > MAXFLEN) 
+                return;
+        if (!check_crc_ccitt(state.hrx.buf, state.hrx.bufcnt)) 
+                return;
+        memcpy(state.rxframe.frame, state.hrx.buf, state.hrx.bufcnt-2);
+        state.rxframe.len = state.hrx.bufcnt-2;
+        state.rxframe.txdelay = 0;
+        state.rxframe.kanal = 0;
+        state.stat.rx_frames++;
+}
+
+#define DECODEITERA(j)                                                        \
+({                                                                            \
+        if (!(notbitstream & (0x0fc << j)))              /* flag or abort */  \
+                goto flgabrt##j;                                              \
+        if ((bitstream & (0x1f8 << j)) == (0xf8 << j))   /* stuffed bit */    \
+                goto stuff##j;                                                \
+  enditer##j:                                                                 \
+})
+
+#define DECODEITERB(j)                                                                 \
+({                                                                                     \
+  flgabrt##j:                                                                          \
+        if (!(notbitstream & (0x1fc << j))) {              /* abort received */        \
+                st = 0;                                                                \
+                goto enditer##j;                                                       \
+        }                                                                              \
+        if ((bitstream & (0x1fe << j)) != (0x0fc << j))   /* flag received */          \
+                goto enditer##j;                                                       \
+        if (st)                                                                        \
+                do_rxpacket();                                                         \
+        state.hrx.bufcnt = 0;                                                          \
+        state.hrx.bufptr = state.hrx.buf;                                              \
+        st = 1;                                                                        \
+        numbits = 7-j;                                                                 \
+        goto enditer##j;                                                               \
+  stuff##j:                                                                            \
+        numbits--;                                                                     \
+        bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);        \
+        goto enditer##j;                                                               \
+})
+        
+static inline void hdlc_receive(void)
+{
+        unsigned bits, bitbuf, notbitstream, bitstream, numbits, st;
+
+        /* start of HDLC decoder */
+        numbits = state.hrx.numbits;
+        st = state.hrx.state;
+        bitstream = state.hrx.bitstream;
+        bitbuf = state.hrx.bitbuf;
+        while (state.rxptr < state.rxlen && !state.rxframe.len) {
+                bits = state.rxbuf[state.rxptr++];
+                bitstream >>= 8;
+                bitstream |= ((unsigned int)bits) << 8;
+                bitbuf >>= 8;
+                bitbuf |= ((unsigned int)bits) << 8;
+                numbits += 8;
+                notbitstream = ~bitstream;
+                DECODEITERA(0);
+                DECODEITERA(1);
+                DECODEITERA(2);
+                DECODEITERA(3);
+                DECODEITERA(4);
+                DECODEITERA(5);
+                DECODEITERA(6);
+                DECODEITERA(7);
+                goto enddec;
+                DECODEITERB(0);
+                DECODEITERB(1);
+                DECODEITERB(2);
+                DECODEITERB(3);
+                DECODEITERB(4);
+                DECODEITERB(5);
+                DECODEITERB(6);
+                DECODEITERB(7);
+        enddec:
+                while (st && numbits >= 8) {
+                        if (state.hrx.bufcnt >= RXBUFFER_SIZE) {
+                                st = 0;
+                        } else {
+                                *(state.hrx.bufptr)++ = bitbuf >> (16-numbits);
+                                state.hrx.bufcnt++;
+                                numbits -= 8;
+                        }
+                }
+        }
+        state.hrx.numbits = numbits;
+        state.hrx.state = st;
+        state.hrx.bitstream = bitstream;
+        state.hrx.bitbuf = bitbuf;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/*
+ * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit()
+ * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern
+ * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal()
+ */
+
+static void saveparams(HKEY hKey)
+{
+	DWORD val;
+
+	val = state.verblevel; 
+	RegSetValueEx(hKey, "verblevel", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.mode; 
+	RegSetValueEx(hKey, "mode", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.ioaddr; 
+	RegSetValueEx(hKey, "ioaddr", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.portflags; 
+	RegSetValueEx(hKey, "portflags", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.w9xportmode; 
+	RegSetValueEx(hKey, "w9xportmode", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.fclk; 
+	RegSetValueEx(hKey, "fclk", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.bitrate; 
+	RegSetValueEx(hKey, "bitrate", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.intclk; 
+	RegSetValueEx(hKey, "intclk", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.extmodem; 
+	RegSetValueEx(hKey, "extmodem", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.loopback; 
+	RegSetValueEx(hKey, "loopback", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.extstat; 
+	RegSetValueEx(hKey, "extstat", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.pttmute; 
+	RegSetValueEx(hKey, "pttmute", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.filtmode; 
+	RegSetValueEx(hKey, "filtmode", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.config.gain; 
+	RegSetValueEx(hKey, "gain", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.txdelay; 
+	RegSetValueEx(hKey, "txdelay", 0, REG_DWORD, (void *)&val, sizeof(val));
+	val = state.fullduplex; 
+	RegSetValueEx(hKey, "fullduplex", 0, REG_DWORD, (void *)&val, sizeof(val));
+}
+
+int init_device(HKEY hKey)
+{
+	DWORD regtype, reglen, regval;
+	unsigned int i;
+	unsigned short baddr;
+	
+	/* read params from registry */
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "verblevel", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 10;
+	state.verblevel = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "mode", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = MODE_EPP;
+	state.mode = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "ioaddr", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.ioaddr = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "portflags", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.portflags = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "w9xportmode", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.w9xportmode = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "fclk", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 19666600;
+	state.config.fclk = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "bitrate", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 9600;
+	state.config.bitrate = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "intclk", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.config.intclk = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "extmodem", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.config.extmodem = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "loopback", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.config.loopback = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "extstat", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 1;
+	state.config.extstat = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "pttmute", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 1;
+	state.config.pttmute = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "filtmode", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.config.filtmode = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "gain", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 1;
+	state.config.gain = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "txdelay", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.txdelay = regval;
+	reglen = sizeof(regval);
+	if (RegQueryValueEx(hKey, "fullduplex", NULL, &regtype, (void *)&regval, &reglen) != ERROR_SUCCESS || regtype != REG_DWORD)
+		regval = 0;
+	state.fullduplex = regval;
+	/* save params to registry */
+	saveparams(hKey);
+	/* init hdlc */
+	memset(&state.htx, 0, sizeof(state.htx));
+	memset(&state.hrx, 0, sizeof(state.hrx));
+	state.terminate = state.rxactive = state.active = 0;
+        state.status = CH_DEAD;
+	state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State");
+	state.htxmutex = CreateMutex(NULL, FALSE, NULL);
+        state.isnt = iopl(3);
+	memset(state.biosports, 0, sizeof(state.biosports));
+	state.hlpt = INVALID_HANDLE_VALUE;
+	if (!state.isnt) {
+		for (i = 0; i < NRBIOSPORTS; i++) {
+			if (!ReadProcessMemory(GetCurrentProcess(), (void *)(BIOSLPTADDR+i*sizeof(baddr)), &baddr, sizeof(baddr), &reglen) ||
+			    reglen != sizeof(baddr))
+				break;
+			if (!baddr)
+				break;
+			state.biosports[i] = baddr;
+			lprintf(10, "BIOS Port %u: 0x%04x\n", i, baddr);
+		}
+#if 0
+		state.hlpt = CreateFile("\\\\.\\LPT1", GENERIC_READ | GENERIC_WRITE,
+					FILE_SHARE_READ | FILE_SHARE_WRITE,
+					NULL, OPEN_EXISTING, 0, NULL);
+#endif
+	}
+        state.leds = 0;
+        return 1;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void l1_exit(HKEY hKey)
+{
+	state.terminate = 1;
+	saveparams(hKey);
+	while (state.rxactive)
+		Sleep(10);
+	CloseHandle(state.hdevlife);
+	CloseHandle(state.htxmutex);
+        /* unload sys driver if NT */
+        if (state.isnt || !state.w9xportmode)
+                parport_stop_win();
+	if (state.hlpt != INVALID_HANDLE_VALUE)
+		CloseHandle(state.hlpt);
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte *config_info(byte kanal)
+{
+        if (state.active) {
+                switch (state.mode) {
+                case MODE_EPP:
+                        return "EPPFLEX (EPP)";
+                        
+                case MODE_ECP:
+                        return "EPPFLEX (ECP)";
+                        
+                case MODE_EPPAFSK:
+                        return "EPPFLEX (AFSK)";
+                        
+                case MODE_EPPCONV:
+                        return "EPP Conventional";
+                }
+        }
+	return "EPPFLEX (inactive/error)";
+}
+
+/* ------------------------------------------------------------------------- */
+
+static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+        HWND hcombo;
+        char buf[32];
+	unsigned int i, j;
+
+	switch (uMsg) {
+	case WM_INITDIALOG:
+                hcombo = GetDlgItem(hDlg, IDC_PORT);
+                if (state.isnt) {
+                        SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT1");
+                        SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT2");
+                        SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT3");
+                        if (state.ioaddr > 3) {
+                                snprintf(buf, sizeof(buf), "LPT%u", state.ioaddr);
+                                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+                                ComboBox_SetCurSel(hcombo, 3);
+                        } else
+                                ComboBox_SetCurSel(hcombo, state.ioaddr-1);
+                } else {
+			for (j = !!state.ioaddr, i = 0; i < NRBIOSPORTS; i++) {
+				if (!state.biosports[i])
+					break;
+				snprintf(buf, sizeof(buf), "LPT%u", i+1);
+				SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+				if ((state.ioaddr == state.biosports[i] && state.w9xportmode) ||
+                                    (state.ioaddr-1 == i && !state.w9xportmode)) {
+					j = 0;
+					ComboBox_SetCurSel(hcombo, i);
+				}
+			}
+			if (j) {
+                                if (state.w9xportmode)
+                                        snprintf(buf, sizeof(buf), "0x%x", state.ioaddr);
+                                else
+                                        snprintf(buf, sizeof(buf), "LPT%u", state.ioaddr);
+                                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+                                ComboBox_SetCurSel(hcombo, i);
+			}
+                }
+		hcombo = GetDlgItem(hDlg, IDC_MODE);
+                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPP");
+                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"ECP");
+                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPPAFSK");
+                SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPP Conventional");
+		ComboBox_SetCurSel(hcombo, state.mode);
+		snprintf(buf, sizeof(buf), "%d", state.txdelay);
+		SetDlgItemText(hDlg, IDC_TXDELAY, buf);
+		CheckDlgButton(hDlg, IDC_FULLDUPLEX, state.fullduplex ? BST_CHECKED : BST_UNCHECKED);
+		CheckDlgButton(hDlg, IDC_EXTMODEM, state.config.extmodem ? BST_CHECKED : BST_UNCHECKED);
+		snprintf(buf, sizeof(buf), "%d", state.config.bitrate);
+		SetDlgItemText(hDlg, IDC_BITRATE, buf);
+		CheckDlgButton(hDlg, IDC_PTTMUTE, state.config.pttmute ? BST_CHECKED : BST_UNCHECKED);
+		CheckDlgButton(hDlg, IDC_FORCEHWEPP, (state.portflags & PPFLAG_FORCEHWEPP) ? BST_CHECKED : BST_UNCHECKED);
+		CheckDlgButton(hDlg, IDC_SWEMULEPP, (state.portflags & PPFLAG_SWEMULEPP) ? BST_CHECKED : BST_UNCHECKED);
+		CheckDlgButton(hDlg, IDC_SWEMULECP, (state.portflags & PPFLAG_SWEMULECP) ? BST_CHECKED : BST_UNCHECKED);
+		SetWindowText(hDlg, DRIVER_NAME" Configuration");
+		break;
+                
+        case WM_COMMAND:
+                switch (GET_WM_COMMAND_ID(wParam, lParam)) {
+                case IDCANCEL:
+                        EndDialog(hDlg, 0);
+                        break;
+
+                case IDOK:
+                        GetDlgItemText(hDlg, IDC_PORT, buf, sizeof(buf));
+                        if (state.isnt) {
+                                if (strncmp(buf, "LPT", 3))
+                                        state.ioaddr = 0;
+                                else
+                                        state.ioaddr = strtoul(buf+3, NULL, 0);
+                        } else {
+				if (buf[0] == 'L' && buf[1] == 'P' && buf[2] == 'T' && buf[4] == 0 &&
+				    buf[3] >= '1' && buf[3] < '1' + NRBIOSPORTS) {
+                                        if(state.w9xportmode)
+                                                state.ioaddr = state.biosports[buf[3] - '1'];
+                                        else
+                                                state.ioaddr = buf[3] - '0';
+				} else if (state.w9xportmode)
+					state.ioaddr = strtoul(buf, NULL, 0);
+                                else
+                                        state.ioaddr = 0;
+			}
+                        GetDlgItemText(hDlg, IDC_MODE, buf, sizeof(buf));
+			if (!strcmp(buf, "EPP Conventional"))
+				state.mode = 3;
+			else if (!strcmp(buf, "EPPAFSK"))
+				state.mode = 2;
+			else if (!strcmp(buf, "ECP"))
+				state.mode = 1;
+			else 
+				state.mode = 0;
+                        GetDlgItemText(hDlg, IDC_TXDELAY, buf, sizeof(buf));
+			state.txdelay = strtoul(buf, NULL, 0);
+			state.fullduplex = IsDlgButtonChecked(hDlg, IDC_FULLDUPLEX) == BST_CHECKED;
+			state.config.extmodem = IsDlgButtonChecked(hDlg, IDC_EXTMODEM) == BST_CHECKED;
+                        GetDlgItemText(hDlg, IDC_BITRATE, buf, sizeof(buf));
+			state.config.bitrate = strtoul(buf, NULL, 0);
+			state.config.pttmute = IsDlgButtonChecked(hDlg, IDC_PTTMUTE) == BST_CHECKED;
+			if (IsDlgButtonChecked(hDlg, IDC_FORCEHWEPP) == BST_CHECKED)
+				state.portflags |= PPFLAG_FORCEHWEPP;
+			else
+				state.portflags &= ~PPFLAG_FORCEHWEPP;
+			if (IsDlgButtonChecked(hDlg, IDC_SWEMULEPP) == BST_CHECKED)
+				state.portflags |= PPFLAG_SWEMULEPP;
+			else
+				state.portflags &= ~PPFLAG_SWEMULEPP;
+			if (IsDlgButtonChecked(hDlg, IDC_SWEMULECP) == BST_CHECKED)
+				state.portflags |= PPFLAG_SWEMULECP;
+			else
+				state.portflags &= ~PPFLAG_SWEMULECP;
+			EndDialog(hDlg, 1);
+                        break;
+                        
+                default:	
+                        break;
+                }
+                break;
+	
+	default:
+		return FALSE;
+	}
+	return TRUE;
+}
+
+/* ------------------------------------------------------------------------- */
+
+int config_device(byte max_channels, HWND hDlg, byte channel)
+{
+	int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0);
+
+	if (restart)
+		state.active = 0;
+	return restart;
+}
+
+/* ------------------------------------------------------------------------- */
+
+u16 l1_get_ch_cnt(void)
+{
+	return 1;
+
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte get_txdelay(byte kanal)
+{
+	return state.txdelay / 10;
+}
+
+void set_txdelay(byte kanal, byte delay)
+{
+	state.txdelay = 10 * delay;
+}
+
+u16 get_mode(byte kanal)
+{
+	return (state.flexmode & ~MODE_d) | (state.fullduplex ? MODE_d : 0);
+}
+
+u16 get_baud(byte kanal)
+{
+	return state.baud;
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode)
+{
+	state.flexmode = chmode;
+	return (state.ioaddr != 0);
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_ch_active(byte kanal)
+{
+	return (state.ioaddr != 0);
+}
+
+/* ------------------------------------------------------------------------- */
+
+char far *l1_ident(byte kanal)
+{
+	return DRIVER_NAME;
+}
+
+/* ------------------------------------------------------------------------- */
+
+char far *l1_version(byte kanal)
+{
+	return DRIVER_VERSION;
+}
+
+/* ------------------------------------------------------------------------- */
+
+L1_STATISTICS far *l1_stat(byte kanal, byte delete)
+{
+	L1_STATISTICS *p = &state.stat;
+	
+	if (delete)
+		p->tx_error = p->rx_overrun = p->rx_bufferoverflow =
+		p->tx_frames = p->rx_frames = p->io_error = 0;
+	return p;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void set_led(byte kanal, byte ledcode)
+{
+        state.leds = ledcode;
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_ch_state(byte kanal)
+{
+	return state.status;
+}
+
+/* ------------------------------------------------------------------------- */
+
+u16 l1_scale(byte kanal)
+{
+	return state.scale;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void l1_tx_calib(byte kanal, byte minutes)
+{
+	state.calib = minutes * state.config.bitrate * 60 / 8;
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+L1FRAME far *l1_get_framebuf(byte kanal)
+{
+	return &state.txframe;
+}
+
+byte l1_tx_frame(void)
+{
+        unsigned int i;
+
+        if (state.txframe.kanal || !state.active)
+                return 1;
+	WaitForSingleObject(state.htxmutex, INFINITE);
+	if (state.htx.rd == state.htx.wr) {
+		/* need tx delay */
+		i = state.txframe.txdelay * state.config.bitrate / 800;
+		if (!i)
+			i = 1;
+		if (i > TXBUFFER_SIZE-1)
+			i = TXBUFFER_SIZE-1;
+		memset(state.htx.buf, 0x7e, i);
+		state.htx.rd = 0;
+		state.htx.wr = i;
+	}
+        i = (TXBUFFER_SIZE - 1 + state.htx.rd - state.htx.wr) % TXBUFFER_SIZE;
+        if (i < state.txframe.len*6/5+32) {
+                ReleaseMutex(state.htxmutex);
+                return 0;
+        }
+	/* remove tail if possible */
+	if (i < TXBUFFER_SIZE-8)
+		state.htx.wr = (state.htx.wr + TXBUFFER_SIZE-8) % TXBUFFER_SIZE;
+        hdlc_encode(state.txframe.frame, state.txframe.len);
+	/* add tail */
+	for (i = 0; i < 8; i++) {
+		state.htx.buf[state.htx.wr] = 0x7e;
+		state.htx.wr = (state.htx.wr + 1) % TXBUFFER_SIZE;
+	}
+	ReleaseMutex(state.htxmutex);
+        state.stat.tx_frames++;
+        return 1;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int hdlc_transmit(byte *pkt, int cnt)
+{
+	int totcnt = 0;
+	unsigned int xcnt;
+
+	WaitForSingleObject(state.htxmutex, INFINITE);
+	while (cnt > 0) {
+		if (state.htx.rd == state.htx.wr) {
+			if (!state.calib)
+				break;
+			xcnt = cnt;
+			if (xcnt > state.calib)
+				xcnt = state.calib;
+			memset(pkt, 0x7e, xcnt);
+			pkt += xcnt;
+			totcnt += xcnt;
+			cnt -= xcnt;
+			state.calib -= xcnt;
+			break;
+		}
+                if (state.htx.wr >= state.htx.rd)
+                        xcnt = state.htx.wr - state.htx.rd;
+                else
+                        xcnt = TXBUFFER_SIZE - state.htx.rd;
+                if (xcnt > cnt)
+                        xcnt = cnt;
+                if (!xcnt)
+                        break;
+                memcpy(pkt, &state.htx.buf[state.htx.rd], xcnt);
+                pkt += xcnt;
+		totcnt += xcnt;
+                cnt -= xcnt;
+                state.htx.rd = (state.htx.rd + xcnt) % TXBUFFER_SIZE;
+	}
+	ReleaseMutex(state.htxmutex);
+	return totcnt;
+}
+
+/*
+ * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn
+ * Handle zu oder Paket komplett
+ */
+
+L1FRAME far *l1_rx_frame(void)
+{
+	unsigned int i;
+	unsigned char eio[2048];
+        unsigned char ctreg;
+	byte stat;
+	byte statecp[6];
+        SYSTEMTIME tm1, tm2;
+	unsigned int msec, bitrate, bytecnt;
+	int cnt, icnt, ocnt, icntx, ocntx;
+
+	state.rxactive = 1;
+	state.rxframe.len = 0;
+	if (state.terminate) {
+		state.rxactive = 0;
+		return NULL;
+	}
+	/* check if startup is needed */
+	if (!state.active) {
+		if (!state.ioaddr)
+			goto errwait;
+		/* init parport; distinguish between NT and 9x case */
+                if (state.isnt || !state.w9xportmode)
+                        cnt = parport_init_win_flags(state.ioaddr-1, state.portflags);
+                else if (state.w9xportmode == 1)
+                        cnt = parport_init_w9xring0_flags(state.ioaddr, state.portflags);
+                else
+                        cnt = parport_init_direct_flags(state.ioaddr, state.portflags);
+                if (cnt) {
+			lprintf(10, "Cannot open Parport at address/number 0x%04x\n", state.ioaddr);
+			state.ioaddr = 0;
+			goto errwait;
+		}
+		bytecnt = 0;
+		/* autoprobe bitrate */
+		switch (state.mode) {
+		case MODE_EPP:
+			if (adapter_start_epp(&state.config)) {
+				lprintf(0, "Error configuring EPP mode\n");
+				goto errwait;
+			}
+			/* reset modem */
+			eio[0] = 0;
+			eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			GetSystemTime(&tm1);
+			for (;;) {
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* try to determine the FIFO count if in extended mode */
+				if (state.config.extstat) {
+					eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+					if (parport_epp_write_addr(eio, 1) != 1)
+						goto errparport;
+					if (parport_epp_read_addr(eio, 2) != 2)
+						goto errparport;
+					icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+					eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+					if (parport_epp_write_addr(eio, 1) != 1)
+						goto errparport;
+					icnt &= 0x7fff;
+				} else {
+				/* determine RX fifo size from status bits */
+					switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+					case EPP_NRHF:
+						icnt = 0;
+						break;
+						
+					case EPP_NRAEF:
+						icnt = 1025;
+						break;
+						
+					case 0:
+						icnt = 1793;
+						break;
+						
+					default:
+						icnt = 256;
+						break;
+					}
+				}
+				/* rx */
+				while (icnt > 0) {
+					cnt = icnt;
+					if (cnt > sizeof(eio))
+						cnt = sizeof(eio);
+					icnt -= cnt;
+					bytecnt += cnt;
+					if (parport_epp_read_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				GetSystemTime(&tm2);
+				msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+				if (msec >= 500)
+					break;
+				Sleep(10);
+				if (state.terminate) {
+					state.rxactive = 0;
+					return NULL;
+				}
+			}
+			/* reset modem */
+			eio[0] = 0;
+			eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			break;
+
+		case MODE_ECP:
+			if (adapter_start_ecp(&state.config)) {
+				lprintf(0, "Error configuring EPP mode\n");
+				goto errwait;
+			}
+			eio[0] = 0xaf;  /* reset register: all reset */
+			eio[1] = 0xa0;  /* reset register: terminate reset */
+			eio[2] = 0xb0;
+			if (parport_ecp_write_addr(eio, 3) != 3)
+				goto errparport;
+			GetSystemTime(&tm1);
+			for (;;) {
+				eio[0] = 0x81;
+				if (parport_ecp_write_addr(eio, 1) != 1)
+					goto errparport;
+				if (parport_ecp_read_data(statecp, 6) != 6)
+					goto errparport;
+				eio[0] = 0x80;
+				if (parport_ecp_write_addr(eio, 1) != 1)
+					goto errparport;
+				icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+				/* read */
+				while (icnt > 0) {
+					cnt = icnt;
+					if (cnt > sizeof(eio))
+						cnt = sizeof(eio);
+					icnt -= cnt;
+					bytecnt += cnt;
+					eio[0] = 0xc0 | (cnt & 0xf);
+					eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+					eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+					if (parport_ecp_write_addr(eio, 3) != 3)
+						goto errparport;
+					if (parport_ecp_read_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				GetSystemTime(&tm2);
+				msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+				if (msec >= 500)
+					break;
+				Sleep(10);
+				if (state.terminate) {
+					state.rxactive = 0;
+					return NULL;
+				}
+			}
+			eio[0] = 0xaf;  /* reset register: all reset */
+			eio[1] = 0xa0;  /* reset register: terminate reset */
+			eio[2] = 0xb0;
+			if (parport_ecp_write_addr(eio, 3) != 3)
+				goto errparport;
+			break;
+			
+		case MODE_EPPAFSK:
+			state.config.bitrate = 1200;
+			if (adapter_start_eppafsk(&state.config)) {
+				lprintf(0, "Error configuring EPP mode\n");
+				goto errwait;
+			}
+			/* reset modem */
+			eio[0] = 0x00;
+			eio[1] = 0x18;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			GetSystemTime(&tm1);
+			for (;;) {
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* determine the FIFO count */
+				eio[0] = 0x1a;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errparport;
+				if (parport_epp_read_addr(eio, 1) != 1)
+					goto errparport;
+				icnt = eio[0] & 0x1f;
+				eio[0] = 0x18;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errparport;
+				/* rx */
+				if (icnt > 0) {
+					if (parport_epp_read_data(eio, icnt) != icnt)
+						goto errparport;
+					bytecnt += icnt;
+				}
+				GetSystemTime(&tm2);
+				msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+				if (msec >= 500)
+					break;
+				Sleep(10);
+				if (state.terminate) {
+					state.rxactive = 0;
+					return NULL;
+				}
+			}
+			/* reset modem */
+			eio[0] = 0x00;
+			eio[1] = 0x18;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			break;
+
+		case MODE_EPPCONV:
+			/* reset modem */
+			eio[0] = 0;
+			eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			GetSystemTime(&tm1);
+			for (;;) {
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* try to determine the FIFO count if in extended mode */
+				/* determine RX fifo size from status bits */
+				switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+				case EPP_NRHF:
+					icnt = 0;
+					break;
+                        
+				case EPP_NRAEF:
+					icnt = 1025;
+					break;
+					
+				case 0:
+					icnt = 1793;
+					break;
+					
+				default:
+					icnt = 256;
+					break;
+				}
+				/* rx */
+				while (icnt > 0) {
+					cnt = icnt;
+					if (cnt > sizeof(eio))
+						cnt = sizeof(eio);
+					icnt -= cnt;
+					bytecnt += cnt;
+					if (parport_epp_read_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				GetSystemTime(&tm2);
+				msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+				if (msec >= 500)
+					break;
+				Sleep(10);
+				if (state.terminate) {
+					state.rxactive = 0;
+					return NULL;
+				}
+			}
+			for (icnt = 0; icnt < 256; icnt++) {
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				if (!(stat & EPP_NREF))
+					break;
+				if (parport_epp_read_data(eio, 1) != 1)
+					goto errparport;
+				bytecnt++;
+			}
+			/* reset modem */
+			eio[0] = 0;
+			eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 2) != 2)
+				goto errparport;
+			break;
+			
+		default:
+			lprintf(0, "Invalid mode requested\n");
+			goto errwait;
+		}
+		bitrate = (bytecnt * 8000U + msec / 2U) / msec;
+		lprintf(0, "Autoprobed bitrate: %u\n", bitrate);
+		/* set variables */
+		i = state.config.bitrate;
+		if (!i)
+			i = 1;
+		state.scale = 614400 / i;
+		state.baud = i / 100;
+		state.status = 0;
+		state.active = 1;
+		SetEvent(state.hdevlife);			
+	}
+	/* actual driver */
+	for (;;) {
+		/* do IO */
+		if (state.rxptr >= state.rxlen) {
+			state.rxptr = state.rxlen = 0;
+			switch (state.mode) {
+			case MODE_EPP:
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* determine TX fifo size from status bits */
+				switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+				case EPP_NTHF:
+					ocntx = 2048 - 256;
+					break;
+
+				case EPP_NTAEF:
+					ocntx = 2048 - 1793;
+					break;
+
+				case 0:
+					ocntx = 0;
+					break;
+
+				default:
+					ocntx = 2048 - 1025;
+					break;
+				}
+				/* determine RX fifo size from status bits */
+				switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+				case EPP_NRHF:
+					icntx = 0;
+					break;
+                
+				case EPP_NRAEF:
+					icntx = 1025;
+					break;
+                
+				case 0:
+					icntx = 1793;
+					break;
+                
+				default:
+					icntx = 256;
+					break;
+				}
+				/* try to determine the FIFO count if in extended mode */
+                                ctreg = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+                                if (state.leds & LED_CON)
+                                        ctreg |= 1 << 6;
+                                if (state.leds & LED_STA)
+                                        ctreg |= 1 << 7;
+				if (state.config.extstat) {
+					eio[0] = ctreg|1;
+					if (parport_epp_write_addr(eio, 1) != 1)
+						goto errparport;
+					if (parport_epp_read_addr(eio, 2) != 2)
+						goto errparport;
+					icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+					eio[0] = ctreg|2;
+					if (parport_epp_write_addr(eio, 1) != 1)
+						goto errparport;
+					if (parport_epp_read_addr(eio, 2) != 2)
+						goto errparport;
+					ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+					ocnt = 16384 - (ocnt & 0x7fff);
+					icnt &= 0x7fff;
+				} else {
+					ocnt = ocntx;
+					icnt = icntx;
+				}
+                                eio[0] = ctreg;
+                                if (parport_epp_write_addr(eio, 1) != 1)
+                                        goto errparport;
+				if (stat & EPP_DCDBIT)
+					state.status &= ~CH_DCD;
+				else
+					state.status |= CH_DCD;
+				if (stat & EPP_PTTBIT)
+					state.status |= CH_PTT;
+				else
+					state.status &= ~CH_PTT;
+				/* rx */
+				if (icnt > 0) {
+					if (icnt > sizeof(state.rxbuf))
+						icnt = sizeof(state.rxbuf);
+					if (parport_epp_read_data(state.rxbuf, icnt) != icnt)
+						goto errparport;
+					state.rxlen = icnt;
+				}
+				/* tx */
+				if (ocnt > 0) {
+					if (ocnt > sizeof(eio))
+						ocnt = sizeof(eio);
+					cnt = hdlc_transmit(eio, ocnt);
+					if (parport_epp_write_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				break;
+
+			case MODE_ECP:
+				eio[0] = 0x81;
+				if (parport_ecp_write_addr(eio, 1) != 1)
+					goto errparport;
+				if (parport_ecp_read_data(statecp, 6) != 6)
+					goto errparport;
+				eio[0] = 0x80;
+				if (parport_ecp_write_addr(eio, 1) != 1)
+					goto errparport;
+				eio[0] = 0xb0;
+                                if (state.leds & LED_CON)
+                                        eio[0] |= 1 << 0;
+                                if (state.leds & LED_STA)
+                                        eio[0] |= 1 << 1;
+				if (parport_ecp_write_addr(eio, 1) != 1)
+					goto errparport;
+				icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+				ocnt = ((unsigned)statecp[4] << 8) | statecp[3];
+				/* update status */
+				if (statecp[0] & 0x80)
+					state.status &= ~CH_DCD;
+				else
+					state.status |= CH_DCD;
+				if (statecp[0] & 0x40)
+					state.status &= ~CH_PTT;
+				else
+					state.status |= CH_PTT;
+				/* read */
+				if (icnt > 0) {
+					cnt = icnt;
+					if (cnt > sizeof(state.rxbuf))
+						cnt = sizeof(state.rxbuf);
+					icnt -= cnt;
+					eio[0] = 0xc0 | (cnt & 0xf);
+					eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+					eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+					if (parport_ecp_write_addr(eio, 3) != 3)
+						goto errparport;
+					if (parport_ecp_read_data(state.rxbuf, cnt) != cnt)
+						goto errparport;
+					state.rxlen = cnt;
+				}
+				/* write */
+				if (ocnt < 8192) { /* fixme */
+					cnt = 8192 - ocnt;
+					if (cnt > sizeof(eio))
+						cnt = sizeof(eio);
+					cnt = hdlc_transmit(eio, cnt);
+					if (parport_ecp_write_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				break;
+
+			case MODE_EPPAFSK:
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* determine the FIFO count */
+                                ctreg = 0x18;
+                                if (state.leds & LED_CON)
+                                        ctreg |= 1 << 6;
+                                if (state.leds & LED_STA)
+                                        ctreg |= 1 << 7;
+				eio[0] = ctreg | 1;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errparport;
+				if (parport_epp_read_addr(eio, 1) != 1)
+					goto errparport;
+				ocnt = 0x10 - (eio[0] & 0x1f);
+				eio[0] = ctreg | 2;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errparport;
+				if (parport_epp_read_addr(eio, 1) != 1)
+					goto errparport;
+				icnt = eio[0] & 0x1f;
+				eio[0] = ctreg;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errparport;
+				/* update status */
+				if (stat & 0x80)
+					state.status &= ~CH_DCD;
+				else
+					state.status |= CH_DCD;
+				if (stat & 0x40)
+					state.status &= ~CH_PTT;
+				else
+					state.status |= CH_PTT;
+				/* rx */
+				if (icnt > 0) {
+					if (parport_epp_read_data(state.rxbuf, icnt) != icnt)
+						goto errparport;
+					state.rxlen = icnt;
+				}
+				/* tx */
+				if (ocnt > 0) {
+					cnt = hdlc_transmit(eio, ocnt);
+					if (parport_epp_write_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				break;
+
+			case MODE_EPPCONV:
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errparport;
+				/* determine TX fifo size from status bits */
+				switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+				case EPP_NTHF:
+					ocnt = 2048 - 256;
+					break;
+
+				case EPP_NTAEF:
+					ocnt = 2048 - 1793;
+					break;
+
+				case 0:
+					ocnt = 0;
+					break;
+
+				default:
+					ocnt = 2048 - 1025;
+					break;
+				}
+				/* determine RX fifo size from status bits */
+				switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+				case EPP_NRHF:
+					icnt = 0;
+					break;
+                
+				case EPP_NRAEF:
+					icnt = 1025;
+					break;
+                
+				case 0:
+					icnt = 1793;
+					break;
+                
+				default:
+					icnt = 256;
+					break;
+				}
+				if (stat & EPP_DCDBIT)
+					state.status &= ~CH_DCD;
+				else
+					state.status |= CH_DCD;
+				if (stat & EPP_PTTBIT)
+					state.status |= CH_PTT;
+				else
+					state.status &= ~CH_PTT;
+                                /* set LEDs */
+                                ctreg = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+                                if (state.leds & LED_CON)
+                                        ctreg |= 1 << 6;
+                                if (state.leds & LED_STA)
+                                        ctreg |= 1 << 7;
+                                eio[0] = ctreg;
+                                if (parport_epp_write_addr(eio, 1) != 1)
+                                        goto errparport;                                
+				/* rx */
+				if (icnt == 0 && state.config.bitrate < 100000) {
+					i = (state.config.bitrate < 50000) ? 256 : 128;
+					while (i > 0 && state.rxlen < sizeof(state.rxbuf) && stat & EPP_NREF) {
+						if (parport_epp_read_data(state.rxbuf+state.rxlen, 1) != 1)
+							goto errparport;
+						state.rxlen++;
+						i--;
+						if (parport_epp_read_addr(&stat, 1) != 1)
+							goto errparport;
+					}
+				} else if (icnt > 0) {
+					cnt = icnt;
+					if (cnt > sizeof(state.rxbuf))
+						cnt = sizeof(state.rxbuf);
+					icnt -= cnt;
+					if (parport_epp_read_data(state.rxbuf, cnt) != cnt)
+						goto errparport;
+					state.rxlen = cnt;
+				}
+				/* tx */
+				if (ocnt > 0) {
+					if (ocnt > sizeof(eio))
+						ocnt = sizeof(eio);
+					cnt = hdlc_transmit(eio, ocnt);
+					if (parport_epp_write_data(eio, cnt) != cnt)
+						goto errparport;
+				}
+				break;
+			}
+		}
+		while (state.rxptr < state.rxlen) {
+			hdlc_receive();
+			if (state.rxframe.len) {
+				state.rxactive = 0;
+				return &state.rxframe;
+			}
+		}
+		if (state.terminate) {
+			state.rxactive = 0;
+			return NULL;
+		}
+		Sleep(10);
+	}
+
+  errparport:
+	lprintf(0, "Parport timeout\n");
+  errwait:
+	if (state.isnt || !state.w9xportmode)
+	  parport_stop_win();
+	state.stat.io_error++;
+	state.active = 0;
+	state.status = CH_DEAD;
+	SetEvent(state.hdevlife);			
+	for (i = 0; i < 30; i++) {
+		if (state.terminate)
+			break;
+		Sleep(100);
+	}
+	state.rxactive = 0;
+	return NULL;
+}
+
+/* ------------------------------------------------------------------------- */
diff --git a/flexdrv/bayeppflex.rc b/flexdrv/bayeppflex.rc
new file mode 100644
index 0000000..7d7210e
--- /dev/null
+++ b/flexdrv/bayeppflex.rc
@@ -0,0 +1,76 @@
+#include "resource.h"
+#include "windows.h"
+
+IDD_DIALOG1 DIALOGEX 0, 0, 232, 235
+STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,175,12,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,175,37,50,14
+    RTEXT           "Port",IDC_STATIC,50,15,25,8,0,WS_EX_RIGHT
+    COMBOBOX        IDC_PORT,77,12,50,145,CBS_DROPDOWN | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_MODE,77,34,50,145,CBS_DROPDOWNLIST | 
+                    CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Mode",IDC_STATIC,56,36,19,8
+    EDITTEXT        IDC_TXDELAY,77,56,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    RTEXT           "TxDelay",IDC_STATIC,47,58,27,8
+    LTEXT           "ms",IDC_STATIC,120,58,10,8
+    CONTROL         "Full Duplex",IDC_FULLDUPLEX,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,77,80,51,10
+    EDITTEXT        IDC_BITRATE,77,100,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    RTEXT           "Bitrate",IDC_STATIC,53,103,21,8
+    CONTROL         "External Modem",IDC_EXTMODEM,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,77,124,67,10
+    CONTROL         "Mute Audio when not transmitting",IDC_PTTMUTE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,77,144,121,10
+    CONTROL         "Force use of Hardware EPP",IDC_FORCEHWEPP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,77,164,121,10
+    CONTROL         "Software EPP Emulation",IDC_SWEMULEPP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,77,184,121,10
+    CONTROL         "Software ECP Emulation",IDC_SWEMULECP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,77,204,121,10
+    CONTROL         "Author: Thomas Sailer, HB9JNX/AE4WA",IDC_STATIC,"Static",
+                    SS_LEFTNOWORDWRAP | WS_GROUP,3,225,130,8
+END
+
+
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+            VALUE "FileDescription", "baycomeppflex\0"
+            VALUE "FileVersion", "1, 0, 0, 1\0"
+            VALUE "InternalName", "Baycom EPPFLEX FlexNet driver\0"
+            VALUE "LegalCopyright", "Copyright � 1999-2000\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "bayeppflex.dll\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "EPPFLEX\0"
+            VALUE "ProductVersion", "1.00a\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
diff --git a/flexdrv/driver.c b/flexdrv/driver.c
new file mode 100644
index 0000000..bfef886
--- /dev/null
+++ b/flexdrv/driver.c
@@ -0,0 +1,74 @@
+#define  STRICT
+#include <windows.h>
+#pragma hdrstop
+
+#include <process.h>
+#include "flexdrv.h" // der offizielle Header
+#include "drv32.h"
+
+HANDLE hInst;
+//--------------------------------------------------------------------
+// Einziger Treiberaufruf
+u32 flexnet_driver(int func, int kanal, int a, int b)
+	{	
+	static byte base_kanal;
+	static byte tx_kanal;
+	static L1FRAME *l1f;
+	L1FRAME *rxf;
+	switch (func)
+		{
+		case drv_interfaceversion:
+							return DRIVER_INTERFACE_VERSION;
+		case drv_ident:		return (u32)l1_ident((byte)(kanal-base_kanal));
+		case drv_version:	return (u32)l1_version((byte)(kanal - base_kanal));
+		case drv_config:	return config_device((byte)(kanal), (HWND)a, (byte)(b - base_kanal));
+		case drv_confinfo:	return (u32)config_info((byte)(kanal - base_kanal));
+		case drv_init_device:
+			base_kanal = kanal;
+			return init_device((HKEY)b);
+		case drv_get_ch_cnt:		return l1_get_ch_cnt();
+		case drv_exit:				l1_exit((HKEY)a); break;
+		case drv_ch_active:			return l1_ch_active((byte)(kanal - base_kanal));
+		case drv_init_kanal:		return l1_init_kanal((byte)(kanal - base_kanal), (u16)a, (u16)b);
+		case drv_stat:				return (u32)l1_stat((byte)(kanal - base_kanal), (byte)a);
+		case drv_ch_state:			return l1_ch_state((byte)(kanal - base_kanal));
+		case drv_scale:				return l1_scale((byte)(kanal - base_kanal));
+		case drv_tx_calib:			l1_tx_calib((byte)(kanal - base_kanal), (byte)a); break;
+		case drv_set_led:			set_led((byte)(kanal - base_kanal), (byte)a); break;
+		case drv_rx_frame:
+			if (rxf = l1_rx_frame())
+				rxf->kanal += base_kanal;
+			return (u32)rxf;
+		case drv_get_framebuf:		return (u32)(l1f = l1_get_framebuf(tx_kanal = (byte)(kanal - base_kanal)));
+		case drv_tx_frame:
+			if (l1f) l1f->kanal = tx_kanal;
+			return l1_tx_frame();
+		case drv_get_txdelay:	return get_txdelay((byte)(kanal - base_kanal));
+		case drv_get_mode:		return get_mode((byte)(kanal - base_kanal));
+		case  drv_get_baud:		return get_baud((byte)(kanal - base_kanal));
+		case drv_set_txdelay:	set_txdelay((byte)(kanal - base_kanal), (byte)a); break;
+		default:
+			return 0;
+		}
+	return 0;
+	}
+//--------------------------------------------------------------------
+BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
+	{
+	switch(dwFunction)
+		{
+		case DLL_PROCESS_ATTACH:
+			// hier evtl. noch Test ob mehrfach geladen, dazu brauchts aber Handle (mutex oder sowas)
+			hInst = hModule;
+			// kein break, auch neuer Prozess istn Thread
+		case DLL_THREAD_ATTACH:
+			break;
+		case DLL_PROCESS_DETACH:
+			// vor allem wenn harter Abbruch: Alles deinitialisieren!
+			break; // kein Durchfall, Prozessende gibt eh alles frei und schliesst pipes
+		case DLL_THREAD_DETACH:
+			break;
+		}
+	return 1;   // Indicate that the DLL was initialized successfully.
+	}
+//--------------------------------------------------------------------
diff --git a/flexdrv/drv32.h b/flexdrv/drv32.h
new file mode 100644
index 0000000..b0f750e
--- /dev/null
+++ b/flexdrv/drv32.h
@@ -0,0 +1,15 @@
+
+#define DRIVER_INTERFACE_VERSION 1
+
+enum drvc
+        {
+        drv_interfaceversion=1, drv_ident, drv_version,
+        drv_config, drv_confinfo, drv_init_device, drv_get_ch_cnt,
+        drv_exit, drv_ch_active, drv_init_kanal,
+        drv_stat, drv_ch_state, drv_scale,
+        drv_tx_calib, drv_set_led, drv_rx_frame,
+        drv_get_framebuf, drv_tx_frame,
+        drv_get_txdelay, drv_get_mode, drv_get_baud,
+        drv_set_txdelay
+        };
+
diff --git a/flexdrv/flexdriv.def b/flexdrv/flexdriv.def
new file mode 100644
index 0000000..b0f2138
--- /dev/null
+++ b/flexdrv/flexdriv.def
@@ -0,0 +1,11 @@
+;LIBRARY FLEXNET_DRIVER
+DESCRIPTION	"FlexNet Channel Driver"
+
+VERSION 	1.0
+
+CODE      READ SHARED EXECUTE
+DATA      READ WRITE
+
+EXPORTS
+
+flexnet_driver
diff --git a/flexdrv/flexdrv.h b/flexdrv/flexdrv.h
new file mode 100644
index 0000000..e2ee967
--- /dev/null
+++ b/flexdrv/flexdrv.h
@@ -0,0 +1,491 @@
+/***************************************************************
+
+  FlexNet / BayCom        Layer 1 Service Interface
+
+  (C) 7/1994 DK7WJ, DL8MBT
+  Translation by HB9JNX
+
+  Definitionen und Prototypes f�r Aufruf von Layer1-Funktionen
+  Definitions and prototypes for calling Layer1 functions
+
+
+  28.08.94   DK7WJ          Erste verteilte Version
+                            First distributed version
+  10.09.94   DK7WJ          Modebefehl geaendert
+                            Changed the mode command
+                            Prototypen neu f. Speichermodell MEDIUM
+                            New prototypes for the MEDIUM memory model
+  25.09.94   DK7WJ          FDX an Treiber uebergeben
+                            FDX now forwarded to the driver
+  20.02.95   DK7WJ          CH_TBY neu
+                            CH_TBY added
+  31.03.95   DK7WJ          Device-Versionkennungen
+                            Device version identifier
+  01.03.96   DK7WJ          Windows extensions, comments pending :-)
+  22.04.96   DK7WJ          .
+  25.03.97   HB9JNX         IO trapping changes
+
+  10.01.00   DK7WJ          WIN32 definitions
+
+  19.06.00   DK7WJ          CH_DEAD included
+ ***************************************************************/
+
+//#ifndef _FLEXTYPES_DEFINED
+//#define _FLEXTYPES_DEFINED
+typedef unsigned char   byte;
+typedef signed char     i8;
+typedef signed short      i16;
+typedef unsigned short    u16;
+typedef unsigned long   u32;
+#ifdef _WIN32
+#define far
+#define near
+#endif
+//#endif
+
+#ifdef _WIN32
+#pragma pack(push, flexdrv)
+#pragma pack(1)
+#endif
+
+
+#define MAXFLEN 400     /* Maximale Laenge eines Frames */
+                        /* maximum length of a frame */
+
+/* Struct f. Treiberkommunikation bei TX und RX */
+/* struct for communicating RX and TX packets to the driver */
+typedef struct
+    {
+    i16  len;               /* Laenge des Frames - length of the frame */
+    byte kanal;             /* Kanalnummer - channel number */
+    byte txdelay;           /* RX: Gemessenes TxDelay [*10ms],
+                                   0 wenn nicht unterstuetzt
+                               TX: Zu sendendes TxDelay */
+                            /* RX: measured transmitter keyup delay (TxDelay) in 10ms units,
+                                   0 if not supported
+                               TX: transmitter keyup delay (TxDelay) that should be sent */
+    byte frame[MAXFLEN];    /* L1-Frame (ohne CRC) - L1 frame without CRC */
+    } L1FRAME;
+
+/* Struct f. Kanalstatistik (wird noch erweitert) */
+/* struct for channel statistics (still being extended) */
+#ifndef _FLEXAPPL
+typedef struct
+    {
+    u32 tx_error;           /* Underrun oder anderes Problem - underrun or some other problem */
+    u32 rx_overrun;         /* Wenn Hardware das unterstuetzt - if supported by the hardware */
+    u32 rx_bufferoverflow;
+    u32 tx_frames;          /* Gesamt gesendete Frames - total number of sent frames */
+    u32 rx_frames;          /* Gesamt empfangene Frames - total number of received frames */
+    u32 io_error;           /* Reset von IO-Device - number of resets of the IO device */
+    u32 reserve[4];         /* f. Erweiterungen, erstmal 0 lassen! - reserved for extensions, leave 0! */
+    } L1_STATISTICS;
+#endif
+
+#ifdef _WIN32
+extern HANDLE hInst;
+#pragma pack(pop, flexdrv)
+#endif
+
+/* Masken f�r den Mode-Parameter - bitmasks for the mode parameter */
+#define MODE_d   0x0080
+#define MODE_r   0x0040
+#define MODE_t   0x0020
+#define MODE_z   0x0010
+#define MODE_p	 0x0004	  /* needs also MODE_d */
+#define MODE_c   0x0002
+#define MODE_off 0x0001   /* Special: Wenn 1, Kanal abgeschaltet */
+                          /* special: if one, the channel is switched off */
+
+/* Masken f�r den L1-Kanalstatus */
+/* masks for the L1 channel status */
+#define CH_DEAD 0x01
+#define CH_RXB  0x40
+#define CH_PTT  0x20
+#define CH_DCD  0x10
+#define CH_FDX  0x08
+#define CH_TBY  0x04
+
+#ifdef _WIN32
+// Konfiguration. Wenn geaendert, TRUE returnen, dann erfolgt exit() und Re-Init
+// max_channels: Maximal moegliche Kanalanzahl f. diesen Treiber
+int config_device(byte max_channels, HWND hParentWindow, byte channel);
+// Return: Anzahl belegte Kanaele!
+
+byte *config_info(byte channel);
+/* Liefert String der die treiberspezifische Konfiguration beschreibt, z.B. Resourcen-Name
+   Wenn keine treiberspezifische Konfiguration vorhanden (config_device() ist Dummy),
+	Nullpointer liefern */
+/* Returns a string describing the channel configuration, i.e. the name of hardware resource
+   If config_device() is a dummy, this call must return a null pointer
+*/
+int init_device(HKEY kHey);
+
+void far l1_exit(HKEY hKey);
+
+void set_txdelay(byte channel, byte txdel);
+byte get_txdelay(byte channel);
+u16 get_baud(byte channel);
+u16 get_mode(byte channel);
+#else
+u16 far init_device(int argc, char near *argv[]);
+/* Treiberinterner Aufruf aus Treiberkopf bei Installation: kann benutzt
+   werden um Command Line Parameter zu parsen
+   Return: 0=OK; sonst Exit mit Returnwert als Exit-Argument
+    ACHTUNG: Wenn Returnwert >0, erfolgt Abbruch, es duerfen dann also keine
+             aktiven oder umgelegten Interrupts verbleiben!
+*/
+/* This procedure is called from the driver stub at installation time. It
+   may be used to parse the command line
+   Return value: 0=OK; otherwise installation is cancelled and the value
+                 returned as exit argument
+    WARNING: If return value >0 the installation is cancelled, active or
+             patched interrupt vectors must not be left!
+*/
+void far l1_exit(void);
+/*  Wird bei Verlassen des Programms aufgerufen und kann zum Aufr�umen
+    verwendet werden (Interrupts und Schnittstellen abschalten)
+*/
+/*  Is called when the driver terminates and may be used to clean up everything
+    (switch off interrupts and interfaces)
+*/
+
+#endif
+
+u16 far l1_get_ch_cnt(void);
+/* Aufruf aus Treiberkopf bei Programmstart; muss Anzahl der im Treiber
+   definierten Kanaele liefern
+*/
+/* called from the driver stub at installation time; should return the number
+   of channels defined by the driver
+*/
+
+
+byte far l1_ch_active(byte kanal);
+/*  Zurueckliefern, ob Kanal im Prinzip funktionstuechtig ist.
+    Also immer, ausser wenn Dummykanal, >0 liefern!
+*/
+/* report if the channel could work in principle. Thus always return >0 if
+   not a dummy channel.
+*/
+
+byte far l1_init_kanal(byte kanal, u16 baud, u16 mode);
+/*
+    Kanalnummer: 0-15
+    Baud: Baudrate / 100, z.B. 115200 Baud wird als 1152 uebergeben
+    Mode: Kanalmodus, Bitflaggen, derzeit definiert:
+         0x0080   d   Vollduplex
+         0x0040   r   Externer RX-Takt
+         0x0020   t   Externer TX-Takt
+         0x0010   z   NRZ-Kodierung (Anstatt NRZI), nur f. HDLC
+         0x0002   c   Kanal macht immer CRC, nur f. KISS
+                         Baycom: Soft-DCD aktivieren
+         0x0001   -   Kanal per Modebefehl deaktiviert
+    Es sind noch weitere Bits definiert, die sind aber im L1-Treiber nicht
+    relevant!
+    Um eventuelle Verklemmungen zu beseitigen, sollte in diesem Modul der
+    Treiber soweit als moeglich (re)initialisiert werden!
+
+    Return: 1 wenn alles ok;
+            0 wenn Parameterfehler, dann Anzeige von '---' in der Modeliste
+
+    Aufruf erfolgt beim Programmstart sowie bei jeder Baud- oder Mode�nderung,
+    ausserdem wenn der Kanal seit 3 Minuten nichts mehr empfangen hat.
+*/
+/*
+    kanal: channel number (0-15)
+    baud:  the baud rate / 100, for example 115200 baud is specified as
+           baud = 1152
+    mode:  the channel mode, a bit field, currently the following bits are
+           defined:
+           0x0080   d   Full duplex
+           0x0040   r   External RX clock
+           0x0020   t   External TX clock
+           0x0010   z   NRZ coding (instead of NRZI) (only for HDLC)
+           0x0002   c   KISS: driver forces checksum
+                        Baycom: activate software DCD
+           0x0001   -   channel inactivated
+           There are some additional bits defined which are not relevant to the
+           L1 driver.
+
+    To recover from lockups, this function should (re)initialize as much of the
+    driver and the hardware as possible.
+
+    Return value: 1 if everything is ok;
+                  0 if a parameter error; '---' is then displayed in the ports
+                  list
+
+    This procedure is called at program start, at every baud rate or mode
+    change, or if the driver has not received anything for 3 minutes.
+*/
+
+L1FRAME far * far l1_rx_frame(void);
+/*
+    Wird zyklisch aufgerufen
+
+    Return: *Frame oder 0 wenn nichts empfangen
+            Der Frame mu� jeweils bis zum n�chsten Aufruf verf�gbar bleiben,
+            d.h. jeder Aufruf l�scht den zuletzt gemeldeten Frame
+*/
+/*
+    Is called periodically
+
+    Return value: *Frame or null pointer if nothing was received
+                  The frame has to be readable until the next call to this
+                  function, i.e. every call removes the frame returned by the
+                  last call.
+*/
+
+
+L1FRAME far * far l1_get_framebuf(byte kanal);
+/*  L2 fordert hiermit einen Sendepuffer an. Er mu� die Maximall�nge aufnehmen
+    k�nnen. Wenn erfolgreich, folgt vielleicht l1_tx_frame(), es kann aber
+    auch vorkommen dass ein weiterer Aufruf erfolgt! Also nicht dynamisch
+    allokieren, sondern nur einen Pointer liefern!
+    Return: *Frame, der Frame wird hier hineingebaut
+            0 wenn kein Platz verfuegbar
+*/
+/* L2 requests a transmitter buffer. The buffer must be able to store the
+   maximum length. If successful, a l1_tx_frame() probably follows, but
+   it may also happen that another call to l1_get_framebuf() follows!
+   Therefore, do not allocate dynamically, just return a pointer!
+   Return value: *Frame : the frame is stored here
+                 0      : no storage available
+*/
+
+
+byte far l1_tx_frame(void);
+/*  Aussenden des Frames in vorher mit l1_get_framebuf angefordeten Buffers;
+    Return: 1 wenn ok, sonst 0
+    Wenn der Sender aus ist, muss jetzt die Entscheidung fallen ob gesendet
+    werden kann!!!
+    ACHTUNG: Wenn die Sendung nicht moeglich ist, darf der Frame auf keinen
+    Fall gespeichert werden! Stattdessen den Frame verwerfen und 0 returnen.
+    DCD darf den Sender auch bei Halbduplex NICHT sperren! Dies ist Bedingung
+    fuer das Funktionieren des FlexNet-OPTIMA-Zugriffsverfahrens. Die DCD-
+    Verriegelung ist bereits in FlexNet enthalten!
+    Wenn der TX bereits an ist (PTT an) und es werden bereits Frames gesendet,
+    sollte der Frame zur Sendung zwischengespeichert werden, sofern der Puffer-
+    platz dafuer ausreicht. Wenn nicht, 0 returnen, dann erfolgt spaeter ein
+    neuer Versuch. In diesem Fall muss jedoch sichergestellt sein, dass der
+    Frame auf jeden Fall noch in DIESEM Durchgang gesendet wird!
+    Das Kanalzugriffstiming findet bereits im FlexNet-Kern statt!
+*/
+/*  Transmit the frame in the buffer that was returned by the last
+    l1_get_framebuf()
+    Return value: 1 if ok, 0 if not.
+    If the transmitter is off, then the decision must now be made if
+    transmission is possible!!!
+    WARNING: If transmission is not possible now, the frame MUST NOT be stored!
+    The frame should be thrown away and zero should be returned. DCD must not
+    inhibit the transmitter, not even in half duplex mode! This is a necessity
+    for the FlexNet-OPTIMA-Channel access algorithm. The Kernel already
+    contains the DCD transmitter inhibit.
+    If the transmitter is already on (PTT keyed) and frames are being sent,
+    then the frame should be stored if the buffer memory suffices. If not,
+    zero should be returned, the kernel will try again later. If the frame
+    is stored, it is important that it gets transmitted during the same
+    transmission!
+    The channel access timing is already handled by the FlexNet kernel!
+*/
+
+void far l1_tx_calib(byte kanal, byte minutes);
+/*  Sofern die Hardware es erlaubt, Sender in Calibrate-Modus schalten.
+    Minutes=0 stoppt den Calibrate-Mode sofort.
+*/
+/* If the hardware allows it, switch the transmitter into the calibrate mode
+   (i.e. start transmitting a calibration pattern)
+   minutes=0 should immediately stop the calibration mode.
+*/
+
+byte far l1_ch_state(byte kanal);
+/* Gibt verschiedene Kanalzust�nde zur�ck, Bits sind 1 wenn wahr:
+         0x40   RxB RxBuffer ist nicht leer
+         0x20   PTT Sender ist an
+         0x10   DCD Empf�nger ist aktiv
+         0x08   FDX Kanal ist Vollduplex, kann also immer empfangen
+         0x04   TBY Sender ist nicht bereit, z.B. wegen Calibrate
+
+Anmerkung: Die korrekte Bedienung dieser Flags ist essentiell fuer das
+Funktionieren des FlexNet-Kanalzugriffstimings incl. DAMA-Master und -Slave.
+
+Erlaeuterungen zu den Flags:
+
+RxB ist 1 wenn gueltige RX-Frames im Puffer liegen. Verriegelt u.a. den Sender
+    bei Halbduplex, da immer erst alle Frames verarbeitet werden sollen.
+    Waehrend des Empfangs muss dieses Flag mit DCD ueberlappend bedient werden,
+    d.h. sobald ein RX-Frame als gueltig erkannt wird, muss RxB spaetestens
+    1 werden, wenn DCD 0 wird!
+PTT 1 wenn der TX bereits an ist. Dann setzt FlexNet voraus dass uebergebene
+    Frames in diesem Durchgang noch gesendet werden koennen. Braucht nicht
+    bedient zu werden bei reinen Vollduplextreibern, also wenn FDX 1 ist.
+DCD 1 wenn der Kanal belegt ist. Darf im Treiber den Sender nicht blockieren,
+    die Entscheidung ob gesendet werden kann faellt stets im FlexNet-Kern!
+FDX Ist eine typabhaengige Konstante. Stets 0 bei Treibern die einen Halb-
+    duplexkanal bedienen koennen, also die PTT- und DCD-Flags korrekt
+    ansteuern. Treiber die kein Kanalzugriffstiming benoetigen (z.B. Ethernet,
+    SLIP, KISS f. reine Rechnerkopplung usw.), liefern hier 1.
+TBY Dient nur zur Beschleunigung des Kernels. Wenn 1, wird nichts gesendet.
+    Kann also z.B. waehrend Calibrate oder bei abgeschaltetem Kanal gesetzt
+    werden
+*/
+/* return different channel states. The following bits are one if true:
+         0x40   RxB RxBuffer is not empty
+         0x20   PTT Transmitter is keyed on
+         0x10   DCD Receiver is active
+         0x08   FDX Channel is full duplex, receiver can always receive
+         0x04   TBY Transmitter not ready, for example because of ongoing
+                    calibration
+
+Note: It is essential that these flags are services correctly. Otherwise,
+the channel access timing including DAMA master and slave will not work
+correctly.
+
+Explanation of the flags:
+
+RxB is 1 if valid RX frames are available in the buffer. Inhibits for example
+    the transmitter in half duplex mode, because all frames should be processed
+    before transmitting. During receipt this flag should overlap the DCD flag,
+    i.e. RxB should go to one before DCD transitions to zero!
+PTT 1 if the transmitter is already keyed up. In this case, FlexNet assumes
+    that frames passed are sent during the same transmission. Needs not be
+    serviced by full duplex drivers (i.e. if FDX is one)
+DCD 1 if the channel is busy. Must not inhibit the transmitter in the driver,
+    since the decision if one should transmit is made by the FlexNet kernel!
+FDX is a driver dependent constant. Always 0 for drivers that may service a
+    half duplex channel, i.e. that serve the PTT and DCD flags correctly.
+    Drivers that do not need a channel access timing (for example Ethernet,
+    SLIP, KISS for connecting PCs and so on), should return 1.
+TBY Speeds up the kernel. If 1, it will not try to send. May be set to one
+    for example during calibration or if the channel is switched off.
+*/
+
+u16 far l1_scale(byte kanal);
+/*  Baudratenabh�ngigen Faktor liefern, wird f�r diverse adaptive Parms
+    gebraucht, u.a. T2-Steuerung.
+
+    Return: 300 Baud:   2048
+            9600 Baud:    64
+
+        oder anders ausgedr�ckt: Return = 614400/[Baudrate]
+
+    Sollte die real moegliche Geschwindigkeit des Kanals liefern. Bei Treibern,
+    die die in init_kanal() uebergebene Baudrate verwenden, berechnen. Treiber,
+    die diese nicht verwenden, sollten einen Schaetzwert liefern. Bei sehr
+    schnellen Kanaelen (z.B. Ethernet) immer 0 liefern!
+*/
+/* Return a baud rate dependent factor. Is needed to calculate several adaptive
+   parameters, for example T2 control
+
+   Return value: 300 baud:    2048
+                 9600 baud:     64
+
+       or as a formula: Return value = 614400/[baud rate]
+
+  Should return the real speed of the channel. Drivers that use the baud rate
+  specified in init_kanal() should calculate the return value. Drivers that do
+  not use this parameter should estimate the speed of the channel. Drivers for
+  very fast channels (for example Ethernet) should always return 0!
+*/
+
+char far * far l1_ident(byte kanal);
+/*  Kennung f�r Kanalhardware bzw. Treibertyp zur�ckgeben.
+    Geliefert wird ein far-pointer auf einen null-terminierten String.
+    Der String f�r die Kanalhardware ist maximal 8 Zeichen lang,
+    z.B. "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", usw.
+*/
+/*  Return an identifier for the channel hardware or the driver type.
+    The return value must be a far pointer to a zero terminated string.
+    The string should be at most 8 characters long.
+    Examples are "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", etc.
+*/
+
+char far * far l1_version(byte kanal);
+/* Versionsnummernstring liefern. Maximal 5 Zeichen
+*/
+/* Return a version number string. At most 5 characters.
+*/
+
+L1_STATISTICS far * far l1_stat(byte kanal, byte delete);
+/*  Statistikwerte liefern
+    Delete = 1: Werte auf 0 zuruecksetzen!
+    Wenn nicht implementiert, Nullpointer liefern!
+*/
+/* Return the statistics.
+   Delete = 1: clear the statistics values!
+   If not implemented, return a null pointer!
+*/
+
+void set_led(byte kanal, byte ledcode);
+/* Falls der Kanal Status-LEDs hat (z.B. TNC), kommen hier die Zustaende
+   bei jeder Aenderung an; kann sicherlich meistens Dummy sein:
+    Bitmasken dazu: */
+/* If the channel hardware has status LEDs (for example a TNC), this procedure
+   may be used to drive them; in most cases, this procedure may be a dummy.
+    Bitmasks used: */
+#define LED_CON     2       /* Mindestens 1 Connect - at least one connect */
+#define LED_STA     4       /* Sendeseitig ausstehende Frames - frames in the transmitter buffer */
+
+/*---------------------------------------------------------------------------*/
+#ifndef _WIN32
+/* Pointer auf unsigned-Timertic, f. schnellen Zugriff wenn Zeitintervalle
+   geprueft werden muessen. Inkrementiert alle 100ms mit Phasenjitter */
+/* Pointer to an unsigned timer_tic, for fast access if timing intervals
+   need to be measured. Increments every 100ms with phase jitter */
+extern const volatile far u16 *timer_tic;
+
+/* Variable fuer externe Kommunikation zwischen Modulen
+   Koennen bei Bedarf besetzt werden */
+/* Variables for intermodule communications
+   May be used if needed */
+extern u16 device_type;     /* Bitte vor Vergabe DK7WJ konsultieren! */
+                            /* Please consult DK7WJ prior to usage! */
+extern u16 device_version;  /* Versionskennung - version identifier */
+extern void far *device_vector; /* Beliebiger Vektor, wird zurueckgeliefert */
+                                /* arbitrary vector returned by device_vec() */
+extern void far (*drv_cb)(void);
+typedef struct
+    {
+    u16 ds;
+    u16 es;
+    u16 cs;
+    u16 dsize;
+    u16 esize;
+    u16 csize;
+    u16 offset;
+    u16 irq;
+    u16 revision;
+    u16 ioport1;
+    u16 ioextent1;
+    u16 ioport2;
+    u16 ioextent2;
+    } defint;
+extern defint intsegs;
+
+#define DEFINT_REVISION 1
+
+/*---------------------------------------------------------------------------*/
+/*     Die folgenden Aufrufe werden durch den Treiberkern bereitgestellt     */
+/*        The following procedures are supplied by the driver library        */
+/*---------------------------------------------------------------------------*/
+/* Einige einfache Ausgaberoutinen, die die Verwendung von printf() ersparen */
+/* Nur waehrend der Initialisierung in init_device() verwenden!!             */
+/* Some simple console output routines, that make printf() unnecessary       */
+/* May only be used during initialisation, inside init_device()!!            */
+void far pch(byte character);
+/*  Gibt ein Zeichen auf die Konsole aus
+    Print a character onto the console
+*/
+void far pstr(byte near *string);
+/*  Gibt einen C-String auf die Konsole aus
+    Print a C string onto the console
+*/
+void far pnum(u16 num);
+/*  Gibt einen numerischen Wert dezimal aus
+    Print a decimal numerical value onto the console
+*/
+void far phex(u16 hex);
+/*  Gibt einen numerischen Wert hexadezimal aus
+    Print a hexadecimal numerical value onto the console
+*/
+#endif // _WIN32
diff --git a/flexdrv/resource.h b/flexdrv/resource.h
new file mode 100644
index 0000000..0e1095c
--- /dev/null
+++ b/flexdrv/resource.h
@@ -0,0 +1,12 @@
+#define IDD_DIALOG1                     101
+#define IDC_PORT                        1000
+#define IDC_MODE                        1001
+#define IDC_TXDELAY                     1002
+#define IDC_FULLDUPLEX                  1003
+#define IDC_EXTMODEM                    1004
+#define IDC_BITRATE                     1005
+#define IDC_PTTMUTE                     1006
+#define IDC_FORCEHWEPP                  1007
+#define IDC_SWEMULEPP                   1008
+#define IDC_SWEMULECP                   1009
+#define IDC_STATIC                      -1
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..e843669
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/intl/ChangeLog b/intl/ChangeLog
new file mode 100644
index 0000000..1989501
--- /dev/null
+++ b/intl/ChangeLog
@@ -0,0 +1,1086 @@
+1998-04-29  Ulrich Drepper  <drepper at cygnus.com>
+
+	* intl/localealias.c (read_alias_file): Use unsigned char for
+	local variables.  Remove unused variable tp.
+	* intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char *
+	for type of codeset.  For loosing Solaris systems.
+	* intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset.
+	* intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable
+	len if not needed.
+	Patches by Jim Meyering.
+
+1998-04-28  Ulrich Drepper  <drepper at cygnus.com>
+
+	* loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if
+	mmap is not supported.
+
+	* hash-string.h: Don't include <values.h>.
+
+1998-04-27  Ulrich Drepper  <drepper at cygnus.com>
+
+	* textdomain.c: Use strdup is available.
+
+	* localealias.c: Define HAVE_MEMPCPY so that we can use this
+	function.  Define and use semapahores to protect modfication of
+	global objects when compiling for glibc.  Add code to allow
+	freeing alias table.
+
+	* l10nflist.c: Don't assume stpcpy not being a macro.
+
+	* gettextP.h: Define internal_function macri if not already done.
+	Use glibc byte-swap macros instead of defining SWAP when compiled
+	for glibc.
+	(struct loaded_domain): Add elements to allow unloading.
+
+	* Makefile.in (distclean): Don't remove libintl.h here.
+
+	* bindtextdomain.c: Carry over changes from glibc.  Use strdup if
+	available.
+
+	* dcgettext.c: Don't assume stpcpy not being a macro.  Mark internal
+	functions.  Add memory freeing code for glibc.
+
+	* dgettext.c: Update copyright.
+
+	* explodename.c: Include stdlib.h and string.h only if they exist.
+	Use strings.h eventually.
+
+	* finddomain.c: Mark internal functions.  Use strdup if available.
+	Add memory freeing code for glibc.
+
+1997-10-10 20:00  Ulrich Drepper  <drepper at cygnus.com>
+
+	* libgettext.h: Fix dummy textdomain and bindtextdomain macros.
+	They should return reasonable values.
+	Reported by Tom Tromey <tromey at cygnus.com>.
+
+1997-09-16 03:33  Ulrich Drepper  <drepper at cygnus.com>
+
+	* libgettext.h: Define PARAMS also to `args' if __cplusplus is defined.
+	* intlh.inst.in: Likewise.
+	Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes at inria.fr>.
+
+	* libintl.glibc: Update from current glibc version.
+
+1997-09-06 02:10  Ulrich Drepper  <drepper at cygnus.com>
+
+	* intlh.inst.in: Reformat copyright.
+
+1997-08-19 15:22  Ulrich Drepper  <drepper at cygnus.com>
+
+	* dcgettext.c (DCGETTEXT): Remove wrong comment.
+
+1997-08-16 00:13  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (install-data): Don't change directory to install.
+
+1997-08-01 14:30  Ulrich Drepper  <drepper at cygnus.com>
+
+	* cat-compat.c: Fix copyright.
+
+	* localealias.c: Don't define strchr unless !HAVE_STRCHR.
+
+	* loadmsgcat.c: Update copyright.  Fix typos.
+
+	* l10nflist.c: Don't define strchr unless !HAVE_STRCHR.
+	(_nl_make_l10nflist): Handle sponsor and revision correctly.
+
+	* gettext.c: Update copyright.
+	* gettext.h: Likewise.
+	* hash-string.h: Likewise.
+
+	* finddomain.c: Remoave dead code.  Define strchr only if
+	!HAVE_STRCHR.
+
+	* explodename.c: Include <sys/types.h>.
+
+	* explodename.c: Reformat copyright text.
+	(_nl_explode_name): Fix typo.
+
+	* dcgettext.c: Define and use __set_errno.
+	(guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is
+	not defined.
+
+	* bindtextdom.c: Pretty printing.
+
+1997-05-01 02:25  Ulrich Drepper  <drepper at cygnus.com>
+
+	* dcgettext.c (guess_category_value): Don't depend on
+	HAVE_LC_MESSAGES.  We don't need the macro here.
+	Patch by Bruno Haible <haible at ilog.fr>.
+
+	* cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL
+	macro.  Instead use HAVE_LOCALE_NULL and define it when using
+	glibc, as in dcgettext.c.
+	Patch by Bruno Haible <haible at ilog.fr>.
+
+	* Makefile.in (CPPFLAGS): New variable.  Reported by Franc,ois
+	Pinard.
+
+Mon Mar 10 06:51:17 1997  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in: Implement handling of libtool.
+
+	* gettextP.h: Change data structures for use of generic lowlevel
+	i18n file handling.
+
+Wed Dec  4 20:21:18 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* textdomain.c: Put parentheses around arguments of memcpy macro
+	definition.
+	* localealias.c: Likewise.
+	* l10nflist.c: Likewise.
+	* finddomain.c: Likewise.
+	* bindtextdom.c: Likewise.
+	Reported by Thomas Esken.
+
+Mon Nov 25 22:57:51 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* textdomain.c: Move definition of `memcpy` macro to right
+	position.
+
+Fri Nov 22 04:01:58 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using
+ 	bcopy if not already defined.  Reported by Thomas Esken.
+	* bindtextdom.c: Likewise.
+	* l10nflist.c: Likewise.
+	* localealias.c: Likewise.
+	* textdomain.c: Likewise.
+
+Tue Oct 29 11:10:27 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (libdir): Change to use exec_prefix instead of
+ 	prefix.  Reported by Knut-H�vardAksnes <etokna at eto.ericsson.se>.
+
+Sat Aug 31 03:07:09 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* l10nflist.c (_nl_normalize_codeset): We convert to lower case,
+	so don't prepend uppercase `ISO' for only numeric arg.
+
+Fri Jul 19 00:15:46 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after
+	definition of _GNU_SOURCE.  Patch by Roland McGrath.
+
+	* Makefile.in (uninstall): Fix another bug with `for' loop and
+	empty arguments.  Patch by Jim Meyering.  Correct name os
+	uninstalled files: no intl- prefix anymore.
+
+	* Makefile.in (install-data): Again work around shells which
+	cannot handle mpty for list.  Reported by Jim Meyering.
+
+Sat Jul 13 18:11:35 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (install): Split goal.  Now depend on install-exec
+        and install-data.
+	(install-exec, install-data): New goals.  Created from former
+	install goal.
+	Reported by Karl Berry.
+
+Sat Jun 22 04:58:14 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (MKINSTALLDIRS): New variable.  Path to
+        mkinstalldirs script.
+	(install): use MKINSTALLDIRS variable or if the script is not present
+	try to find it in the $top_scrdir).
+
+Wed Jun 19 02:56:56 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* l10nflist.c: Linux libc *partly* includes the argz_* functions.
+	Grr.  Work around by renaming the static version and use macros
+	for renaming.
+
+Tue Jun 18 20:11:17 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* l10nflist.c: Correct presence test macros of __argz_* functions.
+
+	* l10nflist.c: Include <argz.h> based on test of it instead when
+	__argz_* functions are available.
+	Reported by Andreas Schwab.
+
+Thu Jun 13 15:17:44 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* explodename.c, l10nflist.c: Define NULL for dumb systems.
+
+Tue Jun 11 17:05:13 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* intlh.inst.in, libgettext.h (dcgettext): Rename local variable
+	result to __result to prevent name clash.
+
+	* l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to
+        get prototype for stpcpy and strcasecmp.
+
+	* intlh.inst.in, libgettext.h: Move declaration of
+	`_nl_msg_cat_cntr' outside __extension__ block to prevent warning
+	from gcc's -Wnested-extern option.
+
+Fri Jun  7 01:58:00 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (install): Remove comment.
+
+Thu Jun  6 17:28:17 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (install): Work around for another Buglix stupidity.
+	Always use an `else' close for `if's.  Reported by Nelson Beebe.
+
+	* Makefile.in (intlh.inst): Correct typo in phony rule.
+	Reported by Nelson Beebe.
+
+Thu Jun  6 01:49:52 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* dcgettext.c (read_alias_file): Rename variable alloca_list to
+	block_list as the macro calls assume.
+	Patch by Eric Backus.
+
+	* localealias.c [!HAVE_ALLOCA]: Define alloca as macro using
+        malloc.
+	(read_alias_file): Rename varriabe alloca_list to block_list as the
+	macro calls assume.
+	Patch by Eric Backus.
+
+	* l10nflist.c: Correct conditional for <argz.h> inclusion.
+	Reported by Roland McGrath.
+
+	* Makefile.in (all): Depend on all- at USE_INCLUDED_LIBINTL@, not
+        all- at USE_NLS@.
+
+	* Makefile.in (install): intlh.inst comes from local dir, not
+        $(srcdir).
+
+	* Makefile.in (intlh.inst): Special handling of this goal.  If
+	used in gettext, this is really a rul to construct this file.  If
+	used in any other package it is defined as a .PHONY rule with
+	empty body.
+
+	* finddomain.c: Extract locale file information handling into
+	l10nfile.c.  Rename local stpcpy__ function to stpcpy.
+
+	* dcgettext.c (stpcpy): Add local definition.
+
+	* l10nflist.c: Solve some portability problems.  Patches partly by
+	Thomas Esken.  Add local definition of stpcpy.
+
+Tue Jun  4 02:47:49 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* intlh.inst.in: Don't depend including <locale.h> on
+	HAVE_LOCALE_H.  Instead configure must rewrite this fiile
+	depending on the result of the configure run.
+
+	* Makefile.in (install): libintl.inst is now called intlh.inst.
+	Add rules for updating intlh.inst from intlh.inst.in.
+
+	* libintl.inst: Renamed to intlh.inst.in.
+
+	* localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1
+        because gcc has __buitlin_alloca.
+	Reported by Roland McGrath.
+
+Mon Jun  3 00:32:16 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* Makefile.in (installcheck): New goal to fulfill needs of
+        automake's distcheck.
+
+	* Makefile.in (install): Reorder commands so that VERSION is
+        found.
+
+	* Makefile.in (gettextsrcdir): Now use subdirectory intl/ in
+        @datadir@/gettext.
+	(COMSRCS): Add l10nfile.c.
+	(OBJECTS): Add l10nfile.o.
+	(DISTFILES): Rename to DISTFILE.normal.  Remove $(DISTFILES.common).
+	(DISTFILE.gettext): Remove $(DISTFILES.common).
+	(all-gettext): Remove goal.
+	(install): If $(PACKAGE) = gettext install, otherwose do nothing.  No
+	package but gettext itself should install libintl.h + headers.
+	(dist): Extend goal to work for gettext, too.
+	(dist-gettext): Remove goal.
+
+	* dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc.
+
+Sun Jun  2 17:33:06 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* loadmsgcat.c (_nl_load_domain): Parameter is now comes from
+        find_l10nfile.
+
+Sat Jun  1 02:23:03 1996  Ulrich Drepper  <drepper at cygnus.com>
+
+	* l10nflist.c (__argz_next): Add definition.
+
+	* dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca
+	code.  Use new l10nfile handling.
+
+	* localealias.c [!HAVE_ALLOCA]: Add code for handling missing
+        alloca code.
+
+	* l10nflist.c: Initial revision.
+
+Tue Apr  2 18:51:18 1996  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (all-gettext): New goal.  Same as all-yes.
+
+Thu Mar 28 23:01:22 1996  Karl Eichwalder  <ke at ke.central.de>
+
+	* Makefile.in (gettextsrcdir): Define using @datadir at .
+
+Tue Mar 26 12:39:14 1996  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c: Include <ctype.h>.  Reported by Roland McGrath.
+
+Sat Mar 23 02:00:35 1996  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing
+        with external declaration.
+
+Sat Mar  2 00:47:09 1996  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (all-no): Rename from all_no.
+
+Sat Feb 17 00:25:59 1996  Ulrich Drepper  <drepper at myware>
+
+	* gettextP.h [loaded_domain]: Array `successor' must now contain up
+        to 63 elements (because of codeset name normalization).
+
+	* finddomain.c: Implement codeset name normalization.
+
+Thu Feb 15 04:39:09 1996  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (all): Define to `all- at USE_NLS@'.
+	(all-yes, all_no): New goals.  `all-no' is noop, `all-yes'
+	is former all.
+
+Mon Jan 15 21:46:01 1996  Howard Gayle  <howard at hal.com>
+
+	* localealias.c (alias_compare): Increment string pointers in loop
+        of strcasecmp replacement.
+
+Fri Dec 29 21:16:34 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (install-src): Who commented this goal out ? :-)
+
+Fri Dec 29 15:08:16 1995  Ulrich Drepper  <drepper at myware>
+
+	* dcgettext.c (DCGETTEXT): Save `errno'.  Failing system calls
+	should not effect it because a missing catalog is no error.
+	Reported by Harald K<o:>nig <koenig at tat.physik.uni-tuebingen.de>.
+
+Tue Dec 19 22:09:13 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (Makefile): Explicitly use $(SHELL) for running
+        shell scripts.
+
+Fri Dec 15 17:34:59 1995  Andreas Schwab  <schwab at issan.informatik.uni-dortmund.de>
+
+	* Makefile.in (install-src): Only install library and header when
+	we use the own implementation.  Don't do it when using the
+	system's gettext or catgets functions.
+
+	* dcgettext.c (find_msg): Must not swap domain->hash_size here.
+
+Sat Dec  9 16:24:37 1995  Ulrich Drepper  <drepper at myware>
+
+	* localealias.c, libintl.inst, libgettext.h, hash-string.h,
+	gettextP.h, finddomain.c, dcgettext.c, cat-compat.c:
+	Use PARAMS instead of __P.  Suggested by Roland McGrath.
+
+Tue Dec  5 11:39:14 1995  Larry Schwimmer  <rosebud at cyclone.stanford.edu>
+
+	* libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if
+	!_LIBINTL_H' because Solaris defines _LIBINTL_H as empty.
+
+Mon Dec  4 15:42:07 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (install-src):
+	Install libintl.inst instead of libintl.h.install.
+
+Sat Dec  2 22:51:38 1995  Marcus Daniels  <marcus at sysc.pdx.edu>
+
+	* cat-compat.c (textdomain):
+	Reverse order in which files are tried you load.  First
+	try local file, when this failed absolute path.
+
+Wed Nov 29 02:03:53 1995  Nelson H. F. Beebe  <beebe at math.utah.edu>
+
+	* cat-compat.c (bindtextdomain): Add missing { }.
+
+Sun Nov 26 18:21:41 1995  Ulrich Drepper  <drepper at myware>
+
+	* libintl.inst: Add missing __P definition.  Reported by Nelson Beebe.
+
+	* Makefile.in:
+	Add dummy `all' and `dvi' goals.  Reported by Tom Tromey.
+
+Sat Nov 25 16:12:01 1995  Franc,ois Pinard  <pinard at iro.umontreal.ca>
+
+	* hash-string.h: Capitalize arguments of macros.
+
+Sat Nov 25 12:01:36 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (DISTFILES): Prevent files names longer than 13
+	characters.  libintl.h.glibc->libintl.glibc,
+	libintl.h.install->libintl.inst.  Reported by Joshua R. Poulson.
+
+Sat Nov 25 11:31:12 1995  Eric Backus  <ericb at lsid.hp.com>
+
+	* dcgettext.c: Fix bug in preprocessor conditionals.
+
+Sat Nov 25 02:35:27 1995  Nelson H. F. Beebe  <beebe at math.utah.edu>
+
+	* libgettext.h: Solaris cc does not understand
+	 #if !SYMBOL1 && !SYMBOL2.  Sad	but true.
+
+Thu Nov 23 16:22:14 1995  Ulrich Drepper  <drepper at myware>
+
+	* hash-string.h (hash_string):
+	Fix for machine with >32 bit `unsigned long's.
+
+	* dcgettext.c (DCGETTEXT):
+	Fix horrible bug in loop for alternative translation.
+
+Thu Nov 23 01:45:29 1995  Ulrich Drepper  <drepper at myware>
+
+	* po2tbl.sed.in, linux-msg.sed, xopen-msg.sed:
+	Some further simplifications in message number generation.
+
+Mon Nov 20 21:08:43 1995  Ulrich Drepper  <drepper at myware>
+
+	* libintl.h.glibc: Use __const instead of const in prototypes.
+
+	* Makefile.in (install-src):
+	Install libintl.h.install instead of libintl.h.  This
+	is a stripped-down version.  Suggested by Peter Miller.
+
+	* libintl.h.install, libintl.h.glibc: Initial revision.
+
+	* localealias.c (_nl_expand_alias, read_alias_file):
+	Protect prototypes in type casts by __P.
+
+Tue Nov 14 16:43:58 1995  Ulrich Drepper  <drepper at myware>
+
+	* hash-string.h: Correct prototype for hash_string.
+
+Sun Nov 12 12:42:30 1995  Ulrich Drepper  <drepper at myware>
+
+	* hash-string.h (hash_string): Add prototype.
+
+	* gettextP.h: Fix copyright.
+	(SWAP): Add prototype.
+
+Wed Nov  8 22:56:33 1995  Ulrich Drepper  <drepper at myware>
+
+	* localealias.c (read_alias_file): Forgot sizeof.
+	Avoid calling *printf function.  This introduces a big overhead.
+	Patch by Roland McGrath.
+
+Tue Nov  7 14:21:08 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy.
+
+	* finddomain.c (stpcpy):
+	Define substitution function local.  The macro was to flaky.
+
+	* cat-compat.c: Fix typo.
+
+	* xopen-msg.sed, linux-msg.sed:
+	While bringing message number to right place only accept digits.
+
+	* linux-msg.sed, xopen-msg.sed: Now that the counter does not have
+	leading 0s we don't need to remove them.  Reported by Marcus
+	Daniels.
+
+	* Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in
+	dependency.  Reported by Marcus Daniels.
+
+	* cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement.
+	Generally cleanup using #if instead of #ifndef.
+
+	* Makefile.in: Correct typos in comment.  By Franc,ois Pinard.
+
+Mon Nov  6 00:27:02 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (install-src): Don't install libintl.h and libintl.a
+	if we use an available gettext implementation.
+
+Sun Nov  5 22:02:08 1995  Ulrich Drepper  <drepper at myware>
+
+	* libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS.  Reported
+	by Franc,ois Pinard.
+
+	* libgettext.h: Use #if instead of #ifdef/#ifndef.
+
+	* finddomain.c:
+	Comments describing what has to be done should start with FIXME.
+
+Sun Nov  5 19:38:01 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (DISTFILES): Split.  Use DISTFILES with normal meaning.
+	DISTFILES.common names the files common to both dist goals.
+	DISTFILES.gettext are the files only distributed in GNU gettext.
+
+Sun Nov  5 17:32:54 1995  Ulrich Drepper  <drepper at myware>
+
+	* dcgettext.c (DCGETTEXT): Correct searching in derived locales.
+	This was necessary since a change in _nl_find_msg several weeks
+	ago.  I really don't know this is still not fixed.
+
+Sun Nov  5 12:43:12 1995  Ulrich Drepper  <drepper at myware>
+
+	* loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL.  This
+	might mark a special condition.
+
+	* finddomain.c (make_entry_rec): Don't make illegal entry as decided.
+
+	* Makefile.in (dist): Suppress error message when ln failed.
+	Get files from $(srcdir) explicitly.
+
+	* libgettext.h (gettext_const): Rename to gettext_noop.
+
+Fri Nov  3 07:36:50 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (make_entry_rec):
+	Protect against wrong locale names by testing mask.
+
+	* libgettext.h (gettext_const): Add macro definition.
+	Capitalize macro arguments.
+
+Thu Nov  2 23:15:51 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (_nl_find_domain):
+	Test for pointer != NULL before accessing value.
+	Reported by Tom Tromey.
+
+	* gettext.c (NULL):
+	Define as (void*)0 instad of 0.  Reported by Franc,ois Pinard.
+
+Mon Oct 30 21:28:52 1995  Ulrich Drepper  <drepper at myware>
+
+	* po2tbl.sed.in: Serious typo bug fixed by Jim Meyering.
+
+Sat Oct 28 23:20:47 1995  Ulrich Drepper  <drepper at myware>
+
+	* libgettext.h: Disable dcgettext optimization for Solaris 2.3.
+
+	* localealias.c (alias_compare):
+	Peter Miller reported that tolower in some systems is
+	even dumber than I thought.  Protect call by `isupper'.
+
+Fri Oct 27 22:22:51 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (libdir, includedir): New variables.
+	(install-src): Install libintl.a and libintl.h in correct dirs.
+
+Fri Oct 27 22:07:29 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c.
+
+	* po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques.
+
+	* localealias.c:
+	Fix typo and superflous test.  Reported by Christian von Roques.
+
+Fri Oct  6 11:52:05 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (_nl_find_domain):
+	Correct some remainder from the pre-CEN syntax.  Now
+	we don't have a constant number of successors anymore.
+
+Wed Sep 27 21:41:13 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (DISTFILES): Add libintl.h.glibc.
+
+	* Makefile.in (dist-libc): Add goal for packing sources for glibc.
+	(COMSRCS, COMHDRS): Splitted to separate sources shared with glibc.
+
+	* loadmsgcat.c: Forget to continue #if line.
+
+	* localealias.c:
+	[_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name
+	space clean.
+
+	* dcgettext.c, finddomain.c: Better comment to last change.
+
+	* loadmsgcat.c:
+	[_LIBC]: Rename fstat, open, close, read, mmap, and munmap to
+	__fstat, __open, __close, __read, __mmap, and __munmap resp
+	to keep ANSI C name space clean.
+
+	* finddomain.c:
+	[_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean.
+
+	* dcgettext.c:
+	[_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to
+	keep ANSI C name space clean.
+
+	* libgettext.h:
+	Include sys/types.h for those old SysV systems out there.
+	Reported by Francesco Potorti`.
+
+	* loadmsgcat.c (use_mmap): Define if compiled for glibc.
+
+	* bindtextdom.c: Include all those standard headers
+	unconditionally if _LIBC is defined.
+
+	* finddomain.c: Fix 2 times defiend -> defined.
+
+	* textdomain.c: Include libintl.h instead of libgettext.h when
+	compiling for glibc.  Include all those standard headers
+	unconditionally if _LIBC is defined.
+
+	* localealias.c, loadmsgcat.c: Prepare to be compiled in glibc.
+
+	* gettext.c:
+	Include libintl.h instead of libgettext.h when compiling for glibc.
+	Get NULL from stddef.h if we compile for glibc.
+
+	* finddomain.c: Include libintl.h instead of libgettext.h when
+	compiling for glibc.  Include all those standard headers
+	unconditionally if _LIBC is defined.
+
+	* dcgettext.c: Include all those standard headers unconditionally
+	if _LIBC is defined.
+
+	* dgettext.c: If compiled in glibc include libintl.h instead of
+	libgettext.h.
+	(locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc.
+
+	* dcgettext.c: If compiled in glibc include libintl.h instead of
+	libgettext.h.
+	(getcwd): Don't rely on HAVE_GETCWD when compiling for glibc.
+
+	* bindtextdom.c:
+	If compiled in glibc include libintl.h instead of libgettext.h.
+
+Mon Sep 25 22:23:06 1995  Ulrich Drepper  <drepper at myware>
+
+	* localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0.
+	Reported by Marcus Daniels.
+
+	* cat-compat.c (bindtextdomain):
+	String used in putenv must not be recycled.
+	Reported by Marcus Daniels.
+
+	* libgettext.h (__USE_GNU_GETTEXT):
+	Additional symbol to signal that we use GNU gettext
+	library.
+
+	* cat-compat.c (bindtextdomain):
+	Fix bug with the strange stpcpy replacement.
+	Reported by Nelson Beebe.
+
+Sat Sep 23 08:23:51 1995  Ulrich Drepper  <drepper at myware>
+
+	* cat-compat.c: Include <string.h> for stpcpy prototype.
+
+	* localealias.c (read_alias_file):
+	While expand strdup code temporary variable `cp' hided
+	higher level variable with same name.  Rename to `tp'.
+
+	* textdomain.c (textdomain):
+	Avoid warning by using temporary variable in strdup code.
+
+	* finddomain.c (_nl_find_domain): Remove unused variable `application'.
+
+Thu Sep 21 15:51:44 1995  Ulrich Drepper  <drepper at myware>
+
+	* localealias.c (alias_compare):
+	Use strcasecmp() only if available.  Else use
+	implementation in place.
+
+	* intl-compat.c:
+	Wrapper functions now call *__ functions instead of __*.
+
+	* libgettext.h: Declare prototypes for *__ functions instead for __*.
+
+	* cat-compat.c, loadmsgcat.c:
+	Don't use xmalloc, xstrdup, and stpcpy.  These functions are not part
+	of the standard libc and so prevent libintl.a from being used
+	standalone.
+
+	* bindtextdom.c:
+	Don't use xmalloc, xstrdup, and stpcpy.  These functions are not part
+	of the standard libc and so prevent libintl.a from being used
+	standalone.
+	Rename to bindtextdomain__ if not used in GNU C Library.
+
+	* dgettext.c:
+	Rename function to dgettext__ if not used in GNU C Library.
+
+	* gettext.c:
+	Don't use xmalloc, xstrdup, and stpcpy.  These functions are not part
+	of the standard libc and so prevent libintl.a from being used
+	standalone.
+	Functions now called gettext__ if not used in GNU C Library.
+
+	* dcgettext.c, localealias.c, textdomain.c, finddomain.c:
+	Don't use xmalloc, xstrdup, and stpcpy.  These functions are not part
+	of the standard libc and so prevent libintl.a from being used
+	standalone.
+
+Sun Sep 17 23:14:49 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c: Correct some bugs in handling of CEN standard
+ 	locale definitions.
+
+Thu Sep  7 01:49:28 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c: Implement CEN syntax.
+
+	* gettextP.h (loaded_domain): Extend number of successors to 31.
+
+Sat Aug 19 19:25:29 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (aliaspath): Remove path to X11 locale dir.
+
+	* Makefile.in: Make install-src depend on install.  This helps
+ 	gettext to install the sources and other packages can use the
+ 	install goal.
+
+Sat Aug 19 15:19:33 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (uninstall): Remove stuff installed by install-src.
+
+Tue Aug 15 13:13:53 1995  Ulrich Drepper  <drepper at myware>
+
+	* VERSION.in: Initial revision.
+
+	* Makefile.in (DISTFILES):
+	Add VERSION file.  This is not necessary for gettext, but
+	for other packages using this library.
+
+Tue Aug 15 06:16:44 1995  Ulrich Drepper  <drepper at myware>
+
+	* gettextP.h (_nl_find_domain):
+	New prototype after changing search strategy.
+
+	* finddomain.c (_nl_find_domain):
+	We now try only to find a specified catalog.  Fall back to other
+	catalogs listed in the locale list is now done in __dcgettext.
+
+	* dcgettext.c (__dcgettext):
+	Now we provide message fall back even to different languages.
+	I.e. if a message is not available in one language all the other
+ 	in the locale list a tried.  Formerly fall back was only possible
+ 	within one language.  Implemented by moving one loop from
+ 	_nl_find_domain to here.
+
+Mon Aug 14 23:45:50 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (gettextsrcdir):
+	Directory where source of GNU gettext library are made
+	available.
+	(INSTALL, INSTALL_DATA): Programs used for installing sources.
+	(gettext-src): New.  Rule to install GNU gettext sources for use in
+	gettextize shell script.
+
+Sun Aug 13 14:40:48 1995  Ulrich Drepper  <drepper at myware>
+
+	* loadmsgcat.c (_nl_load_domain):
+	Use mmap for loading only when munmap function is
+	also available.
+
+	* Makefile.in (install): Depend on `all' goal.
+
+Wed Aug  9 11:04:33 1995  Ulrich Drepper  <drepper at myware>
+
+	* localealias.c (read_alias_file):
+	Do not overwrite '\n' when terminating alias value string.
+
+	* localealias.c (read_alias_file):
+	Handle long lines.  Ignore the rest not fitting in
+	the buffer after the initial `fgets' call.
+
+Wed Aug  9 00:54:29 1995  Ulrich Drepper  <drepper at myware>
+
+	* gettextP.h (_nl_load_domain):
+	Add prototype, replacing prototype for _nl_load_msg_cat.
+
+	* finddomain.c (_nl_find_domain):
+	Remove unneeded variable filename and filename_len.
+	(expand_alias): Remove prototype because functions does not
+ 	exist anymore.
+
+	* localealias.c (read_alias_file):
+	Change type of fname_len parameter to int.
+	(xmalloc): Add prototype.
+
+	* loadmsgcat.c: Better prototypes for xmalloc.
+
+Tue Aug  8 22:30:39 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (_nl_find_domain):
+	Allow alias name to be constructed from the four components.
+
+	* Makefile.in (aliaspath): New variable.  Set to preliminary value.
+	(SOURCES): Add localealias.c.
+	(OBJECTS): Add localealias.o.
+
+	* gettextP.h: Add prototype for _nl_expand_alias.
+
+	* finddomain.c: Aliasing handled in intl/localealias.c.
+
+	* localealias.c: Aliasing for locale names.
+
+	* bindtextdom.c: Better prototypes for xmalloc and xstrdup.
+
+Mon Aug  7 23:47:42 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (DISTFILES): gettext.perl is now found in misc/.
+
+	* cat-compat.c (bindtextdomain):
+	Correct implementation.  dirname parameter was not used.
+	Reported by Marcus Daniels.
+
+	* gettextP.h (loaded_domain):
+	New fields `successor' and `decided' for oo, lazy
+	message handling implementation.
+
+	* dcgettext.c:
+	Adopt for oo, lazy message handliing.
+  	Now we can inherit translations from less specific locales.
+	(find_msg): New function.
+
+	* loadmsgcat.c, finddomain.c:
+	Complete rewrite.  Implement oo, lazy message handling :-).
+  	We now have an additional environment variable `LANGUAGE' with
+ 	a higher priority than LC_ALL for the LC_MESSAGE locale.
+  	Here we can set a colon separated list of specifications each
+ 	of the form `language[_territory[.codeset]][@modifier]'.
+
+Sat Aug  5 09:55:42 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (unistd.h):
+	Include to get _PC_PATH_MAX defined on system having it.
+
+Fri Aug  4 22:42:00 1995  Ulrich Drepper  <drepper at myware>
+
+	* finddomain.c (stpcpy): Include prototype.
+
+	* Makefile.in (dist): Remove `copying instead' message.
+
+Wed Aug  2 18:52:03 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (ID, TAGS): Do not use $^.
+
+Tue Aug  1 20:07:11 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (TAGS, ID): Use $^ as command argument.
+	(TAGS): Give etags -o option t write to current directory,
+ 	not $(srcdir).
+	(ID): Use $(srcdir) instead os $(top_srcdir)/src.
+	(distclean): Remove ID.
+
+Sun Jul 30 11:51:46 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (gnulocaledir):
+	New variable, always using share/ for data directory.
+	(DEFS): Add GNULOCALEDIR, used in finddomain.c.
+
+	* finddomain.c (_nl_default_dirname):
+	Set to GNULOCALEDIR, because it always has to point
+	to the directory where GNU gettext Library writes it to.
+
+	* intl-compat.c (textdomain, bindtextdomain):
+	Undefine macros before function definition.
+
+Sat Jul 22 01:10:02 1995  Ulrich Drepper  <drepper at myware>
+
+	* libgettext.h (_LIBINTL_H):
+	Protect definition in case where this file is included as
+	libgettext.h on Solaris machines.  Add comment about this.
+
+Wed Jul 19 02:36:42 1995  Ulrich Drepper  <drepper at myware>
+
+	* intl-compat.c (textdomain): Correct typo.
+
+Wed Jul 19 01:51:35 1995  Ulrich Drepper  <drepper at myware>
+
+	* dcgettext.c (dcgettext): Function now called __dcgettext.
+
+	* dgettext.c (dgettext): Now called __dgettext and calls
+ 	__dcgettext.
+
+	* gettext.c (gettext):
+	Function now called __gettext and calls __dgettext.
+
+	* textdomain.c (textdomain): Function now called __textdomain.
+
+	* bindtextdom.c (bindtextdomain): Function now called
+ 	__bindtextdomain.
+
+	* intl-compat.c: Initial revision.
+
+	* Makefile.in (SOURCES): Add intl-compat.c.
+	(OBJECTS): We always compile the GNU gettext library functions.
+  	OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o,
+ 	and intl-compat.o.
+  	(GETTOBJS): Contains now only intl-compat.o.
+
+	* libgettext.h:
+	Re-include protection matches dualistic character of libgettext.h.
+	For all functions in GNU gettext library define __ counter part.
+
+	* finddomain.c (strchr): Define as index if not found in C library.
+	(_nl_find_domain): For relative paths paste / in between.
+
+Tue Jul 18 16:37:45 1995  Ulrich Drepper  <drepper at myware>
+
+	* loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h.
+
+	* xopen-msg.sed: Fix bug with `msgstr ""' lines.
+	A little bit better comments.
+
+Tue Jul 18 01:18:27 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in:
+	po-mode.el, makelinks, combine-sh are now found in ../misc.
+
+	* po-mode.el, makelinks, combine-sh, elisp-comp:
+	Moved to ../misc/.
+
+	* libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__.
+
+Sun Jul 16 22:33:02 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (INSTALL, INSTALL_DATA): New variables.
+	(install-data, uninstall): Install/uninstall .elc file.
+
+	* po-mode.el (Installation comment):
+	Add .pox as possible extension of .po files.
+
+Sun Jul 16 13:23:27 1995  Ulrich Drepper  <drepper at myware>
+
+	* elisp-comp: Complete new version by Franc,ois: This does not
+ 	fail when not compiling in the source directory.
+
+Sun Jul 16 00:12:17 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (../po/cat-id-tbl.o):
+	Use $(MAKE) instead of make for recursive make.
+
+	* Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh.
+	(install-exec): Add missing dummy goal.
+	(install-data, uninstall): @ in multi-line shell command at
+ 	beginning, not in front of echo.  Reported by Eric Backus.
+
+Sat Jul 15 00:21:28 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (DISTFILES):
+	Rename libgettext.perl to gettext.perl to fit in 14 chars
+	file systems.
+
+	* gettext.perl:
+ 	Rename to gettext.perl to fit in 14 chars file systems.
+
+Thu Jul 13 23:17:20 1995  Ulrich Drepper  <drepper at myware>
+
+	* cat-compat.c: If !STDC_HEADERS try to include malloc.h.
+
+Thu Jul 13 20:55:02 1995  Ulrich Drepper  <drepper at myware>
+
+	* po2tbl.sed.in: Pretty printing.
+
+	* linux-msg.sed, xopen-msg.sed:
+	Correct bugs with handling substitute flags in branches.
+
+	* hash-string.h (hash_string):
+	Old K&R compilers don't under stand `unsigned char'.
+
+	* gettext.h (nls_uint32):
+	Some old K&R compilers (eg HP) don't understand `unsigned int'.
+
+	* cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes.
+
+Thu Jul 13 01:34:33 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (ELCFILES): New variable.
+	(DISTFILES): Add elisp-comp.
+	Add implicit rule for .el -> .elc compilation.
+	(install-data): install $ELCFILES
+	(clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp.
+
+	* elisp-comp: Initial revision
+
+Wed Jul 12 16:14:52 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in:
+	cat-id-tbl.c is now found in po/.  This enables us to use an identical
+	intl/ directory in all packages.
+
+	* dcgettext.c (dcgettext): hashing does not work for table size <= 2.
+
+	* textdomain.c: fix typo (#if def -> #if defined)
+
+Tue Jul 11 18:44:43 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in (stamp-cat-id): use top_srcdir to address source files
+	(DISTFILES,distclean): move tupdate.perl to src/
+
+	* po-to-tbl.sed.in:
+	add additional jump to clear change flag to recognize multiline strings
+
+Tue Jul 11 01:32:50 1995  Ulrich Drepper  <drepper at myware>
+
+	* textdomain.c: Protect inclusion of stdlib.h and string.h.
+
+	* loadmsgcat.c: Protect inclusion of stdlib.h.
+
+	* libgettext.h: Protect inclusion of locale.h.
+	Allow use in C++ programs.
+	Define NULL is not happened already.
+
+	* Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of
+	po-to-tbl.sed.
+	(distclean): remove po-to-tbl.sed and tupdate.perl.
+
+	* tupdate.perl.in: Substitute Perl path even in exec line.
+	Don't include entries without translation from old .po file.
+
+Tue Jul  4 00:41:51 1995  Ulrich Drepper  <drepper at myware>
+
+	* tupdate.perl.in: use "Updated: " in msgid "".
+
+	* cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR).
+ 	Define getenv if !__STDC__.
+
+	* bindtextdom.c: Protect stdlib.h and string.h inclusion.
+ 	Define free if !__STDC__.
+
+	* finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+ 	Define free if !__STDC__.
+
+	* cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+
+Mon Jul  3 23:56:30 1995  Ulrich Drepper  <drepper at myware>
+
+	* Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR.
+	Remove unneeded $(srcdir) from Makefile.in dependency.
+
+	* makelinks: Add copyright and short description.
+
+	* po-mode.el: Last version for 0.7.
+
+	* tupdate.perl.in: Fix die message.
+
+	* dcgettext.c: Protect include of string.h.
+
+	* gettext.c: Protect include of stdlib.h and further tries to get NULL.
+
+	* finddomain.c: Some corrections in includes.
+
+	* Makefile.in (INCLUDES): Prune list correct path to Makefile.in.
+
+	* po-to-tbl.sed: Adopt for new .po file format.
+
+	* linux-msg.sed, xopen-msg.sed: Adopt for new .po file format.
+
+Sun Jul  2 23:55:03 1995  Ulrich Drepper  <drepper at myware>
+
+	* tupdate.perl.in: Complete rewrite for new .po file format.
+
+Sun Jul  2 02:06:50 1995  Ulrich Drepper  <drepper at myware>
+
+	* First official release.  This directory contains all the code
+	needed to internationalize own packages.  It provides functions
+	which allow to use the X/Open catgets function with an interface
+	like the Uniforum gettext function.  For system which does not
+	have neither of those a complete implementation is provided.
diff --git a/intl/Makefile.in b/intl/Makefile.in
new file mode 100644
index 0000000..4bdb186
--- /dev/null
+++ b/intl/Makefile.in
@@ -0,0 +1,214 @@
+# Makefile for directory with message catalog handling in GNU NLS Utilities.
+# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = $(exec_prefix)/lib
+includedir = $(prefix)/include
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = @datadir@/gettext/intl
+aliaspath = $(localedir):.
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+
+l = @l@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
+-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = $(COMHDRS) libgettext.h loadinfo.h
+COMHDRS = gettext.h gettextP.h hash-string.h
+SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
+COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
+finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
+explodename.c
+OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
+finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
+explodename.$lo
+CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo
+GETTOBJS = intl-compat.$lo
+DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
+xopen-msg.sed $(HEADERS) $(SOURCES)
+DISTFILES.normal = VERSION
+DISTFILES.gettext = libintl.glibc intlh.inst.in
+
+.SUFFIXES:
+.SUFFIXES: .c .o .lo
+.c.o:
+	$(COMPILE) $<
+.c.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) $<
+
+INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib
+
+all: all- at USE_INCLUDED_LIBINTL@
+
+all-yes: libintl.$la intlh.inst
+all-no:
+
+libintl.a: $(OBJECTS)
+	rm -f $@
+	$(AR) cru $@ $(OBJECTS)
+	$(RANLIB) $@
+
+libintl.la: $(OBJECTS)
+	$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \
+		   -version-info 1:0 -rpath $(libdir)
+
+../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
+	cd ../po && $(MAKE) cat-id-tbl.$lo
+
+check: all
+
+# This installation goal is only used in GNU gettext.  Packages which
+# only use the library should use install instead.
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the gettext() function in its C library or in a
+# separate library or use the catgets interface.  A special case is
+# where configure found a previously installed GNU gettext library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+	if test "$(PACKAGE)" = "gettext" \
+	   && test '@INTLOBJS@' = '$(GETTOBJS)'; then \
+	  if test -r $(MKINSTALLDIRS); then \
+	    $(MKINSTALLDIRS) $(libdir) $(includedir); \
+	  else \
+	    $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \
+	  fi; \
+	  $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \
+	  $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
+	else \
+	  : ; \
+	fi
+install-data: all
+	if test "$(PACKAGE)" = "gettext"; then \
+	  if test -r $(MKINSTALLDIRS); then \
+	    $(MKINSTALLDIRS) $(gettextsrcdir); \
+	  else \
+	    $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+	  fi; \
+	  $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \
+	  dists="$(DISTFILES.common)"; \
+	  for file in $$dists; do \
+	    $(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+	dists="$(DISTFILES.common)"; \
+	for file in $$dists; do \
+	  rm -f $(gettextsrcdir)/$$file; \
+	done
+
+info dvi:
+
+$(OBJECTS): ../config.h libgettext.h
+bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
+dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+	here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+	here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+	rm -f *.a *.o *.lo core core.*
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile ID TAGS po2msg.sed po2tbl.sed
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile $(DISTFILES)
+	if test "$(PACKAGE)" = gettext; then \
+	  additional="$(DISTFILES.gettext)"; \
+	else \
+	  additional="$(DISTFILES.normal)"; \
+	fi; \
+	for file in $(DISTFILES.common) $$additional; do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	    || cp -p $(srcdir)/$$file $(distdir); \
+	done
+
+dist-libc:
+	tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
+
+Makefile: Makefile.in ../config.status
+	cd .. \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# The dependency for intlh.inst is different in gettext and all other
+# packages.  Because we cannot you GNU make features we have to solve
+# the problem while rewriting Makefile.in.
+ at GT_YES@intlh.inst: intlh.inst.in ../config.status
+ at GT_YES@	cd .. \
+ at GT_YES@	&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
+ at GT_YES@	  $(SHELL) ./config.status
+ at GT_NO@.PHONY: intlh.inst
+ at GT_NO@intlh.inst:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/intl/VERSION b/intl/VERSION
new file mode 100644
index 0000000..ee66b06
--- /dev/null
+++ b/intl/VERSION
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.10.35
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
new file mode 100644
index 0000000..d9c3f34
--- /dev/null
+++ b/intl/bindtextdom.c
@@ -0,0 +1,203 @@
+/* Implementation of the bindtextdomain(3) function
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+#  include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs.  */
+extern const char _nl_default_dirname[];
+
+/* List with bindings of specific domains.  */
+extern struct binding *_nl_domain_bindings;
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN bindtextdomain__
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+char *
+BINDTEXTDOMAIN (domainname, dirname)
+     const char *domainname;
+     const char *dirname;
+{
+  struct binding *binding;
+
+  /* Some sanity checks.  */
+  if (domainname == NULL || domainname[0] == '\0')
+    return NULL;
+
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+	/* We found it!  */
+	break;
+      if (compare < 0)
+	{
+	  /* It is not in the list.  */
+	  binding = NULL;
+	  break;
+	}
+    }
+
+  if (dirname == NULL)
+    /* The current binding has be to returned.  */
+    return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
+
+  if (binding != NULL)
+    {
+      /* The domain is already bound.  If the new value and the old
+	 one are equal we simply do nothing.  Otherwise replace the
+	 old binding.  */
+      if (strcmp (dirname, binding->dirname) != 0)
+	{
+	  char *new_dirname;
+
+	  if (strcmp (dirname, _nl_default_dirname) == 0)
+	    new_dirname = (char *) _nl_default_dirname;
+	  else
+	    {
+#if defined _LIBC || defined HAVE_STRDUP
+	      new_dirname = strdup (dirname);
+	      if (new_dirname == NULL)
+		return NULL;
+#else
+	      size_t len = strlen (dirname) + 1;
+	      new_dirname = (char *) malloc (len);
+	      if (new_dirname == NULL)
+		return NULL;
+
+	      memcpy (new_dirname, dirname, len);
+#endif
+	    }
+
+	  if (binding->dirname != _nl_default_dirname)
+	    free (binding->dirname);
+
+	  binding->dirname = new_dirname;
+	}
+    }
+  else
+    {
+      /* We have to create a new binding.  */
+#if !defined _LIBC && !defined HAVE_STRDUP
+      size_t len;
+#endif
+      struct binding *new_binding =
+	(struct binding *) malloc (sizeof (*new_binding));
+
+      if (new_binding == NULL)
+	return NULL;
+
+#if defined _LIBC || defined HAVE_STRDUP
+      new_binding->domainname = strdup (domainname);
+      if (new_binding->domainname == NULL)
+	return NULL;
+#else
+      len = strlen (domainname) + 1;
+      new_binding->domainname = (char *) malloc (len);
+      if (new_binding->domainname == NULL)
+	return NULL;
+      memcpy (new_binding->domainname, domainname, len);
+#endif
+
+      if (strcmp (dirname, _nl_default_dirname) == 0)
+	new_binding->dirname = (char *) _nl_default_dirname;
+      else
+	{
+#if defined _LIBC || defined HAVE_STRDUP
+	  new_binding->dirname = strdup (dirname);
+	  if (new_binding->dirname == NULL)
+	    return NULL;
+#else
+	  len = strlen (dirname) + 1;
+	  new_binding->dirname = (char *) malloc (len);
+	  if (new_binding->dirname == NULL)
+	    return NULL;
+	  memcpy (new_binding->dirname, dirname, len);
+#endif
+	}
+
+      /* Now enqueue it.  */
+      if (_nl_domain_bindings == NULL
+	  || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+	{
+	  new_binding->next = _nl_domain_bindings;
+	  _nl_domain_bindings = new_binding;
+	}
+      else
+	{
+	  binding = _nl_domain_bindings;
+	  while (binding->next != NULL
+		 && strcmp (domainname, binding->next->domainname) > 0)
+	    binding = binding->next;
+
+	  new_binding->next = binding->next;
+	  binding->next = new_binding;
+	}
+
+      binding = new_binding;
+    }
+
+  return binding->dirname;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__bindtextdomain, bindtextdomain);
+#endif
diff --git a/intl/cat-compat.c b/intl/cat-compat.c
new file mode 100644
index 0000000..867d901
--- /dev/null
+++ b/intl/cat-compat.c
@@ -0,0 +1,262 @@
+/* Compatibility code for gettext-using-catgets interface.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+#  include <malloc.h>
+# endif
+#endif
+
+#ifdef HAVE_NL_TYPES_H
+# include <nl_types.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+   ``Directs `setlocale()' to query `category' and return the current
+     setting of `local'.''
+   However it does not specify the exact format.  And even worse: POSIX
+   defines this not at all.  So we can use this feature only on selected
+   system (e.g. those using GNU C Library).  */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* The catalog descriptor.  */
+static nl_catd catalog = (nl_catd) -1;
+
+/* Name of the default catalog.  */
+static const char default_catalog_name[] = "messages";
+
+/* Name of currently used catalog.  */
+static const char *catalog_name = default_catalog_name;
+
+/* Get ID for given string.  If not found return -1.  */
+static int msg_to_cat_id PARAMS ((const char *msg));
+
+/* Substitution for systems lacking this function in their C library.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+#endif
+
+
+/* Set currently used domain/catalog.  */
+char *
+textdomain (domainname)
+     const char *domainname;
+{
+  nl_catd new_catalog;
+  char *new_name;
+  size_t new_name_len;
+  char *lang;
+
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
+    && defined HAVE_LOCALE_NULL
+  lang = setlocale (LC_MESSAGES, NULL);
+#else
+  lang = getenv ("LC_ALL");
+  if (lang == NULL || lang[0] == '\0')
+    {
+      lang = getenv ("LC_MESSAGES");
+      if (lang == NULL || lang[0] == '\0')
+	lang = getenv ("LANG");
+    }
+#endif
+  if (lang == NULL || lang[0] == '\0')
+    lang = "C";
+
+  /* See whether name of currently used domain is asked.  */
+  if (domainname == NULL)
+    return (char *) catalog_name;
+
+  if (domainname[0] == '\0')
+    domainname = default_catalog_name;
+
+  /* Compute length of added path element.  */
+  new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
+		 + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
+		 + sizeof (".cat");
+
+  new_name = (char *) malloc (new_name_len);
+  if (new_name == NULL)
+    return NULL;
+
+  strcpy (new_name, PACKAGE);
+  new_catalog = catopen (new_name, 0);
+
+  if (new_catalog == (nl_catd) -1)
+    {
+      /* NLSPATH search didn't work, try absolute path */
+      sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
+	       PACKAGE);
+      new_catalog = catopen (new_name, 0);
+
+      if (new_catalog == (nl_catd) -1)
+	{
+	  free (new_name);
+	  return (char *) catalog_name;
+	}
+    }
+
+  /* Close old catalog.  */
+  if (catalog != (nl_catd) -1)
+    catclose (catalog);
+  if (catalog_name != default_catalog_name)
+    free ((char *) catalog_name);
+
+  catalog = new_catalog;
+  catalog_name = new_name;
+
+  return (char *) catalog_name;
+}
+
+char *
+bindtextdomain (domainname, dirname)
+     const char *domainname;
+     const char *dirname;
+{
+#if HAVE_SETENV || HAVE_PUTENV
+  char *old_val, *new_val, *cp;
+  size_t new_val_len;
+
+  /* This does not make much sense here but to be compatible do it.  */
+  if (domainname == NULL)
+    return NULL;
+
+  /* Compute length of added path element.  If we use setenv we don't need
+     the first byts for NLSPATH=, but why complicate the code for this
+     peanuts.  */
+  new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
+		+ sizeof ("/%L/LC_MESSAGES/%N.cat");
+
+  old_val = getenv ("NLSPATH");
+  if (old_val == NULL || old_val[0] == '\0')
+    {
+      old_val = NULL;
+      new_val_len += 1 + sizeof (LOCALEDIR) - 1
+	             + sizeof ("/%L/LC_MESSAGES/%N.cat");
+    }
+  else
+    new_val_len += strlen (old_val);
+
+  new_val = (char *) malloc (new_val_len);
+  if (new_val == NULL)
+    return NULL;
+
+# if HAVE_SETENV
+  cp = new_val;
+# else
+  cp = stpcpy (new_val, "NLSPATH=");
+# endif
+
+  cp = stpcpy (cp, dirname);
+  cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
+
+  if (old_val == NULL)
+    {
+# if __STDC__
+      stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
+# else
+
+      cp = stpcpy (cp, LOCALEDIR);
+      stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
+# endif
+    }
+  else
+    stpcpy (cp, old_val);
+
+# if HAVE_SETENV
+  setenv ("NLSPATH", new_val, 1);
+  free (new_val);
+# else
+  putenv (new_val);
+  /* Do *not* free the environment entry we just entered.  It is used
+     from now on.   */
+# endif
+
+#endif
+
+  return (char *) domainname;
+}
+
+#undef gettext
+char *
+gettext (msg)
+     const char *msg;
+{
+  int msgid;
+
+  if (msg == NULL || catalog == (nl_catd) -1)
+    return (char *) msg;
+
+  /* Get the message from the catalog.  We always use set number 1.
+     The message ID is computed by the function `msg_to_cat_id'
+     which works on the table generated by `po-to-tbl'.  */
+  msgid = msg_to_cat_id (msg);
+  if (msgid == -1)
+    return (char *) msg;
+
+  return catgets (catalog, 1, msgid, (char *) msg);
+}
+
+/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
+   for the one equal to msg.  If it is found return the ID.  In case when
+   the string is not found return -1.  */
+static int
+msg_to_cat_id (msg)
+     const char *msg;
+{
+  int cnt;
+
+  for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
+    if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
+      return _msg_tbl[cnt]._msg_number;
+
+  return -1;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
diff --git a/intl/dcgettext.c b/intl/dcgettext.c
new file mode 100644
index 0000000..0f7bb48
--- /dev/null
+++ b/intl/dcgettext.c
@@ -0,0 +1,655 @@
+/* Implementation of the dcgettext(3) function.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined __GNUC__ && !defined C_ALLOCA
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if (defined HAVE_ALLOCA_H || defined _LIBC) && !defined C_ALLOCA
+#  include <alloca.h>
+# else
+#  ifdef _AIX
+ #pragma alloca
+#  else
+#   ifndef alloca
+char *alloca ();
+#   endif
+#  endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+#  include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE	1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+#  define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "hash-string.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define getcwd __getcwd
+# ifndef stpcpy
+#  define stpcpy __stpcpy
+# endif
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+#  define getcwd(buf, max) getwd (buf)
+# else
+char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try.  */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h.  */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+   PATH_MAX but might cause redefinition warnings when sys/param.h is
+   later included (as on MORE/BSD 4.3).  */
+#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been.  */
+#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
+# include <sys/param.h>
+#endif
+
+#if !defined(PATH_MAX) && defined(MAXPATHLEN)
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+   ``Directs `setlocale()' to query `category' and return the current
+     setting of `local'.''
+   However it does not specify the exact format.  And even worse: POSIX
+   defines this not at all.  So we can use this feature only on selected
+   system (e.g. those using GNU C Library).  */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+   textdomain(3).  The default value for this is "messages".  */
+const char _nl_default_default_domain[] = "messages";
+
+/* Value used as the default domain for gettext(3).  */
+const char *_nl_current_default_domain = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs.  */
+const char _nl_default_dirname[] = GNULOCALEDIR;
+
+/* List with bindings of specific domains created by bindtextdomain()
+   calls.  */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions.  */
+static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
+			       const char *msgid)) internal_function;
+static const char *category_to_name PARAMS ((int category)) internal_function;
+static const char *guess_category_value PARAMS ((int category,
+						 const char *categoryname))
+     internal_function;
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)						      \
+  do {									      \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to	      \
+       the list.  */							      \
+    if (newp != NULL) {							      \
+      newp->address = (addr);						      \
+      newp->next = (list);						      \
+      (list) = newp;							      \
+    }									      \
+  } while (0)
+# define FREE_BLOCKS(list)						      \
+  do {									      \
+    while (list != NULL) {						      \
+      struct block_list *old = list;					      \
+      list = list->next;						      \
+      free (old);							      \
+    }									      \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif	/* have alloca */
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+#else
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+   easier methods therefore we make a difference here.  */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+  if (enable_secure == 0)						      \
+    {									      \
+      if (getuid () != geteuid () || getgid () != getegid ())		      \
+	enable_secure = 1;						      \
+      else								      \
+	enable_secure = -1;						      \
+    }
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCGETTEXT (domainname, msgid, category)
+     const char *domainname;
+     const char *msgid;
+     int category;
+{
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  struct loaded_l10nfile *domain;
+  struct binding *binding;
+  const char *categoryname;
+  const char *categoryvalue;
+  char *dirname, *xdomainname;
+  char *single_locale;
+  char *retval;
+  int saved_errno = errno;
+
+  /* If no real MSGID is given return NULL.  */
+  if (msgid == NULL)
+    return NULL;
+
+  /* See whether this is a SUID binary or not.  */
+  DETERMINE_SECURE;
+
+  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
+     CATEGORY is not LC_MESSAGES this might not make much sense but the
+     definition left this undefined.  */
+  if (domainname == NULL)
+    domainname = _nl_current_default_domain;
+
+  /* First find matching binding.  */
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+	/* We found it!  */
+	break;
+      if (compare < 0)
+	{
+	  /* It is not in the list.  */
+	  binding = NULL;
+	  break;
+	}
+    }
+
+  if (binding == NULL)
+    dirname = (char *) _nl_default_dirname;
+  else if (binding->dirname[0] == '/')
+    dirname = binding->dirname;
+  else
+    {
+      /* We have a relative path.  Make it absolute now.  */
+      size_t dirname_len = strlen (binding->dirname) + 1;
+      size_t path_max;
+      char *ret;
+
+      path_max = (unsigned int) PATH_MAX;
+      path_max += 2;		/* The getcwd docs say to do this.  */
+
+      dirname = (char *) alloca (path_max + dirname_len);
+      ADD_BLOCK (block_list, dirname);
+
+      __set_errno (0);
+      while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
+	{
+	  path_max += PATH_INCR;
+	  dirname = (char *) alloca (path_max + dirname_len);
+	  ADD_BLOCK (block_list, dirname);
+	  __set_errno (0);
+	}
+
+      if (ret == NULL)
+	{
+	  /* We cannot get the current working directory.  Don't signal an
+	     error but simply return the default string.  */
+	  FREE_BLOCKS (block_list);
+	  __set_errno (saved_errno);
+	  return (char *) msgid;
+	}
+
+      stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+    }
+
+  /* Now determine the symbolic name of CATEGORY and its value.  */
+  categoryname = category_to_name (category);
+  categoryvalue = guess_category_value (category, categoryname);
+
+  xdomainname = (char *) alloca (strlen (categoryname)
+				 + strlen (domainname) + 5);
+  ADD_BLOCK (block_list, xdomainname);
+
+  stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+		  domainname),
+	  ".mo");
+
+  /* Creating working area.  */
+  single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+  ADD_BLOCK (block_list, single_locale);
+
+
+  /* Search for the given string.  This is a loop because we perhaps
+     got an ordered list of languages to consider for the translation.  */
+  while (1)
+    {
+      /* Make CATEGORYVALUE point to the next element of the list.  */
+      while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+	++categoryvalue;
+      if (categoryvalue[0] == '\0')
+	{
+	  /* The whole contents of CATEGORYVALUE has been searched but
+	     no valid entry has been found.  We solve this situation
+	     by implicitly appending a "C" entry, i.e. no translation
+	     will take place.  */
+	  single_locale[0] = 'C';
+	  single_locale[1] = '\0';
+	}
+      else
+	{
+	  char *cp = single_locale;
+	  while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+	    *cp++ = *categoryvalue++;
+	  *cp = '\0';
+
+	  /* When this is a SUID binary we must not allow accessing files
+	     outside the dedicated directories.  */
+	  if (ENABLE_SECURE
+	      && (memchr (single_locale, '/',
+			  _nl_find_language (single_locale) - single_locale)
+		  != NULL))
+	    /* Ingore this entry.  */
+	    continue;
+	}
+
+      /* If the current locale value is C (or POSIX) we don't load a
+	 domain.  Return the MSGID.  */
+      if (strcmp (single_locale, "C") == 0
+	  || strcmp (single_locale, "POSIX") == 0)
+	{
+	  FREE_BLOCKS (block_list);
+	  __set_errno (saved_errno);
+	  return (char *) msgid;
+	}
+
+
+      /* Find structure describing the message catalog matching the
+	 DOMAINNAME and CATEGORY.  */
+      domain = _nl_find_domain (dirname, single_locale, xdomainname);
+
+      if (domain != NULL)
+	{
+	  retval = find_msg (domain, msgid);
+
+	  if (retval == NULL)
+	    {
+	      int cnt;
+
+	      for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+		{
+		  retval = find_msg (domain->successor[cnt], msgid);
+
+		  if (retval != NULL)
+		    break;
+		}
+	    }
+
+	  if (retval != NULL)
+	    {
+	      FREE_BLOCKS (block_list);
+	      __set_errno (saved_errno);
+	      return retval;
+	    }
+	}
+    }
+  /* NOTREACHED */
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dcgettext, dcgettext);
+#endif
+
+
+static char *
+internal_function
+find_msg (domain_file, msgid)
+     struct loaded_l10nfile *domain_file;
+     const char *msgid;
+{
+  size_t act = 0;
+  size_t top, bottom;
+  struct loaded_domain *domain;
+
+  if (domain_file->decided == 0)
+    _nl_load_domain (domain_file);
+
+  if (domain_file->data == NULL)
+    return NULL;
+
+  domain = (struct loaded_domain *) domain_file->data;
+
+  /* Locate the MSGID and its translation.  */
+  if (domain->hash_size > 2 && domain->hash_tab != NULL)
+    {
+      /* Use the hashing table.  */
+      nls_uint32 len = strlen (msgid);
+      nls_uint32 hash_val = hash_string (msgid);
+      nls_uint32 idx = hash_val % domain->hash_size;
+      nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+      nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
+
+      if (nstr == 0)
+	/* Hash table entry is empty.  */
+	return NULL;
+
+      if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+	  && strcmp (msgid,
+		     domain->data + W (domain->must_swap,
+				       domain->orig_tab[nstr - 1].offset)) == 0)
+	return (char *) domain->data + W (domain->must_swap,
+					  domain->trans_tab[nstr - 1].offset);
+
+      while (1)
+	{
+	  if (idx >= domain->hash_size - incr)
+	    idx -= domain->hash_size - incr;
+	  else
+	    idx += incr;
+
+	  nstr = W (domain->must_swap, domain->hash_tab[idx]);
+	  if (nstr == 0)
+	    /* Hash table entry is empty.  */
+	    return NULL;
+
+	  if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+	      && strcmp (msgid,
+			 domain->data + W (domain->must_swap,
+					   domain->orig_tab[nstr - 1].offset))
+	         == 0)
+	    return (char *) domain->data
+	      + W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
+	}
+      /* NOTREACHED */
+    }
+
+  /* Now we try the default method:  binary search in the sorted
+     array of messages.  */
+  bottom = 0;
+  top = domain->nstrings;
+  while (bottom < top)
+    {
+      int cmp_val;
+
+      act = (bottom + top) / 2;
+      cmp_val = strcmp (msgid, domain->data
+			       + W (domain->must_swap,
+				    domain->orig_tab[act].offset));
+      if (cmp_val < 0)
+	top = act;
+      else if (cmp_val > 0)
+	bottom = act + 1;
+      else
+	break;
+    }
+
+  /* If an translation is found return this.  */
+  return bottom >= top ? NULL : (char *) domain->data
+                                + W (domain->must_swap,
+				     domain->trans_tab[act].offset);
+}
+
+
+/* Return string representation of locale CATEGORY.  */
+static const char *
+internal_function
+category_to_name (category)
+     int category;
+{
+  const char *retval;
+
+  switch (category)
+  {
+#ifdef LC_COLLATE
+  case LC_COLLATE:
+    retval = "LC_COLLATE";
+    break;
+#endif
+#ifdef LC_CTYPE
+  case LC_CTYPE:
+    retval = "LC_CTYPE";
+    break;
+#endif
+#ifdef LC_MONETARY
+  case LC_MONETARY:
+    retval = "LC_MONETARY";
+    break;
+#endif
+#ifdef LC_NUMERIC
+  case LC_NUMERIC:
+    retval = "LC_NUMERIC";
+    break;
+#endif
+#ifdef LC_TIME
+  case LC_TIME:
+    retval = "LC_TIME";
+    break;
+#endif
+#ifdef LC_MESSAGES
+  case LC_MESSAGES:
+    retval = "LC_MESSAGES";
+    break;
+#endif
+#ifdef LC_RESPONSE
+  case LC_RESPONSE:
+    retval = "LC_RESPONSE";
+    break;
+#endif
+#ifdef LC_ALL
+  case LC_ALL:
+    /* This might not make sense but is perhaps better than any other
+       value.  */
+    retval = "LC_ALL";
+    break;
+#endif
+  default:
+    /* If you have a better idea for a default value let me know.  */
+    retval = "LC_XXX";
+  }
+
+  return retval;
+}
+
+/* Guess value of current locale from value of the environment variables.  */
+static const char *
+internal_function
+guess_category_value (category, categoryname)
+     int category;
+     const char *categoryname;
+{
+  const char *retval;
+
+  /* The highest priority value is the `LANGUAGE' environment
+     variable.  This is a GNU extension.  */
+  retval = getenv ("LANGUAGE");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* `LANGUAGE' is not set.  So we have to proceed with the POSIX
+     methods of looking to `LC_ALL', `LC_xxx', and `LANG'.  On some
+     systems this can be done by the `setlocale' function itself.  */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+  return setlocale (category, NULL);
+#else
+  /* Setting of LC_ALL overwrites all other.  */
+  retval = getenv ("LC_ALL");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* Next comes the name of the desired category.  */
+  retval = getenv (categoryname);
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* Last possibility is the LANG environment variable.  */
+  retval = getenv ("LANG");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* We use C as the default domain.  POSIX says this is implementation
+     defined.  */
+  return "C";
+#endif
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+   program's end.  */
+static void __attribute__ ((unused))
+free_mem (void)
+{
+  struct binding *runp;
+
+  for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
+    {
+      free (runp->domainname);
+      if (runp->dirname != _nl_default_dirname)
+	/* Yes, this is a pointer comparison.  */
+	free (runp->dirname);
+    }
+
+  if (_nl_current_default_domain != _nl_default_default_domain)
+    /* Yes, again a pointer comparison.  */
+    free ((char *) _nl_current_default_domain);
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/dgettext.c b/intl/dgettext.c
new file mode 100644
index 0000000..0510c2b
--- /dev/null
+++ b/intl/dgettext.c
@@ -0,0 +1,59 @@
+/* Implementation of the dgettext(3) function
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined HAVE_LOCALE_H || defined _LIBC
+# include <locale.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT __dcgettext
+#else
+# define DGETTEXT dgettext__
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale.  */
+char *
+DGETTEXT (domainname, msgid)
+     const char *domainname;
+     const char *msgid;
+{
+  return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/intl/explodename.c b/intl/explodename.c
new file mode 100644
index 0000000..80a3111
--- /dev/null
+++ b/intl/explodename.c
@@ -0,0 +1,197 @@
+/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (const char *name)
+{
+  while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+	 && name[0] != '+' && name[0] != ',')
+    ++name;
+
+  return (char *) name;
+}
+
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+		  normalized_codeset, special, sponsor, revision)
+     char *name;
+     const char **language;
+     const char **modifier;
+     const char **territory;
+     const char **codeset;
+     const char **normalized_codeset;
+     const char **special;
+     const char **sponsor;
+     const char **revision;
+{
+  enum { undecided, xpg, cen } syntax;
+  char *cp;
+  int mask;
+
+  *modifier = NULL;
+  *territory = NULL;
+  *codeset = NULL;
+  *normalized_codeset = NULL;
+  *special = NULL;
+  *sponsor = NULL;
+  *revision = NULL;
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = 0;
+  syntax = undecided;
+  *language = cp = name;
+  cp = _nl_find_language (*language);
+
+  if (*language == cp)
+    /* This does not make sense: language has to be specified.  Use
+       this entry as it is without exploding.  Perhaps it is an alias.  */
+    cp = strchr (*language, '\0');
+  else if (cp[0] == '_')
+    {
+      /* Next is the territory.  */
+      cp[0] = '\0';
+      *territory = ++cp;
+
+      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+	     && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+	++cp;
+
+      mask |= TERRITORY;
+
+      if (cp[0] == '.')
+	{
+	  /* Next is the codeset.  */
+	  syntax = xpg;
+	  cp[0] = '\0';
+	  *codeset = ++cp;
+
+	  while (cp[0] != '\0' && cp[0] != '@')
+	    ++cp;
+
+	  mask |= XPG_CODESET;
+
+	  if (*codeset != cp && (*codeset)[0] != '\0')
+	    {
+	      *normalized_codeset = _nl_normalize_codeset (*codeset,
+							   cp - *codeset);
+	      if (strcmp (*codeset, *normalized_codeset) == 0)
+		free ((char *) *normalized_codeset);
+	      else
+		mask |= XPG_NORM_CODESET;
+	    }
+	}
+    }
+
+  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+    {
+      /* Next is the modifier.  */
+      syntax = cp[0] == '@' ? xpg : cen;
+      cp[0] = '\0';
+      *modifier = ++cp;
+
+      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+	     && cp[0] != ',' && cp[0] != '_')
+	++cp;
+
+      mask |= XPG_MODIFIER | CEN_AUDIENCE;
+    }
+
+  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+    {
+      syntax = cen;
+
+      if (cp[0] == '+')
+	{
+ 	  /* Next is special application (CEN syntax).  */
+	  cp[0] = '\0';
+	  *special = ++cp;
+
+	  while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+	    ++cp;
+
+	  mask |= CEN_SPECIAL;
+	}
+
+      if (cp[0] == ',')
+	{
+ 	  /* Next is sponsor (CEN syntax).  */
+	  cp[0] = '\0';
+	  *sponsor = ++cp;
+
+	  while (cp[0] != '\0' && cp[0] != '_')
+	    ++cp;
+
+	  mask |= CEN_SPONSOR;
+	}
+
+      if (cp[0] == '_')
+	{
+ 	  /* Next is revision (CEN syntax).  */
+	  cp[0] = '\0';
+	  *revision = ++cp;
+
+	  mask |= CEN_REVISION;
+	}
+    }
+
+  /* For CEN syntax values it might be important to have the
+     separator character in the file name, not for XPG syntax.  */
+  if (syntax == xpg)
+    {
+      if (*territory != NULL && (*territory)[0] == '\0')
+	mask &= ~TERRITORY;
+
+      if (*codeset != NULL && (*codeset)[0] == '\0')
+	mask &= ~XPG_CODESET;
+
+      if (*modifier != NULL && (*modifier)[0] == '\0')
+	mask &= ~XPG_MODIFIER;
+    }
+
+  return mask;
+}
diff --git a/intl/finddomain.c b/intl/finddomain.c
new file mode 100644
index 0000000..81ea29b
--- /dev/null
+++ b/intl/finddomain.c
@@ -0,0 +1,216 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+#  include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+#  define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains.  */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+   the DOMAINNAME and CATEGORY parameters with respect to the currently
+   established bindings.  */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (dirname, locale, domainname)
+     const char *dirname;
+     char *locale;
+     const char *domainname;
+{
+  struct loaded_l10nfile *retval;
+  const char *language;
+  const char *modifier;
+  const char *territory;
+  const char *codeset;
+  const char *normalized_codeset;
+  const char *special;
+  const char *sponsor;
+  const char *revision;
+  const char *alias_value;
+  int mask;
+
+  /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+		language[_territory[.codeset]][@modifier]
+
+     and six parts for the CEN syntax:
+
+	language[_territory][+audience][+special][,[sponsor][_revision]]
+
+     Beside the first part all of them are allowed to be missing.  If
+     the full specified locale is not found, the less specific one are
+     looked for.  The various parts will be stripped off according to
+     the following order:
+		(1) revision
+		(2) sponsor
+		(3) special
+		(4) codeset
+		(5) normalized codeset
+		(6) territory
+		(7) audience/modifier
+   */
+
+  /* If we have already tested for this locale entry there has to
+     be one data set in the list of loaded domains.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+			       strlen (dirname) + 1, 0, locale, NULL, NULL,
+			       NULL, NULL, NULL, NULL, NULL, domainname, 0);
+  if (retval != NULL)
+    {
+      /* We know something about this locale.  */
+      int cnt;
+
+      if (retval->decided == 0)
+	_nl_load_domain (retval);
+
+      if (retval->data != NULL)
+	return retval;
+
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+	{
+	  if (retval->successor[cnt]->decided == 0)
+	    _nl_load_domain (retval->successor[cnt]);
+
+	  if (retval->successor[cnt]->data != NULL)
+	    break;
+	}
+      return cnt >= 0 ? retval : NULL;
+      /* NOTREACHED */
+    }
+
+  /* See whether the locale value is an alias.  If yes its value
+     *overwrites* the alias name.  No test for the original value is
+     done.  */
+  alias_value = _nl_expand_alias (locale);
+  if (alias_value != NULL)
+    {
+#if defined _LIBC || defined HAVE_STRDUP
+      locale = strdup (alias_value);
+      if (locale == NULL)
+	return NULL;
+#else
+      size_t len = strlen (alias_value) + 1;
+      locale = (char *) malloc (len);
+      if (locale == NULL)
+	return NULL;
+
+      memcpy (locale, alias_value, len);
+#endif
+    }
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = _nl_explode_name (locale, &language, &modifier, &territory,
+			   &codeset, &normalized_codeset, &special,
+			   &sponsor, &revision);
+
+  /* Create all possible locale entries which might be interested in
+     generalization.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+			       strlen (dirname) + 1, mask, language, territory,
+			       codeset, normalized_codeset, modifier, special,
+			       sponsor, revision, domainname, 1);
+  if (retval == NULL)
+    /* This means we are out of core.  */
+    return NULL;
+
+  if (retval->decided == 0)
+    _nl_load_domain (retval);
+  if (retval->data == NULL)
+    {
+      int cnt;
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+	{
+	  if (retval->successor[cnt]->decided == 0)
+	    _nl_load_domain (retval->successor[cnt]);
+	  if (retval->successor[cnt]->data != NULL)
+	    break;
+	}
+    }
+
+  /* The room for an alias was dynamically allocated.  Free it now.  */
+  if (alias_value != NULL)
+    free (locale);
+
+  return retval;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+  struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+  while (runp != NULL)
+    {
+      struct loaded_l10nfile *here = runp;
+      if (runp->data != NULL)
+	_nl_unload_domain ((struct loaded_domain *) runp->data);
+      runp = runp->next;
+      free (here);
+    }
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/gettext.c b/intl/gettext.c
new file mode 100644
index 0000000..d929f98
--- /dev/null
+++ b/intl/gettext.c
@@ -0,0 +1,70 @@
+/* Implementation of gettext(3) function.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# ifdef STDC_HEADERS
+#  include <stdlib.h>		/* Just for NULL.  */
+# else
+#  ifdef HAVE_STRING_H
+#   include <string.h>
+#  else
+#   define NULL ((void *) 0)
+#  endif
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DGETTEXT __dgettext
+#else
+# define GETTEXT gettext__
+# define DGETTEXT dgettext__
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+GETTEXT (msgid)
+     const char *msgid;
+{
+  return DGETTEXT (NULL, msgid);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/intl/gettext.h b/intl/gettext.h
new file mode 100644
index 0000000..3cd23d7
--- /dev/null
+++ b/intl/gettext.h
@@ -0,0 +1,105 @@
+/* Internal header for GNU gettext internationalization functions.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <stdio.h>
+
+#if HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format.  */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format.  */
+#define MO_REVISION_NUMBER 0
+
+/* The following contortions are an attempt to use the C preprocessor
+   to determine an unsigned integral type that is 32 bits wide.  An
+   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+   doing that would require that the configure script compile and *run*
+   the resulting executable.  Locally running cross-compiled executables
+   is usually not possible.  */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+   This should be valid for all systems GNU cares about because
+   that doesn't include 16-bit systems, and only modern systems
+   (that certainly have <limits.h>) have 64+-bit integral types.  */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+#  if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+#  else
+  /* The following line is intended to throw an error.  Using #error is
+     not portable enough.  */
+  "Cannot determine unsigned 32-bit data type."
+#  endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format.  */
+struct mo_file_header
+{
+  /* The magic number.  */
+  nls_uint32 magic;
+  /* The revision number of the file format.  */
+  nls_uint32 revision;
+  /* The number of strings pairs.  */
+  nls_uint32 nstrings;
+  /* Offset of table with start offsets of original strings.  */
+  nls_uint32 orig_tab_offset;
+  /* Offset of table with start offsets of translation strings.  */
+  nls_uint32 trans_tab_offset;
+  /* Size of hashing table.  */
+  nls_uint32 hash_tab_size;
+  /* Offset of first hashing entry.  */
+  nls_uint32 hash_tab_offset;
+};
+
+struct string_desc
+{
+  /* Length of addressed string.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* @@ begin of epilog @@ */
+
+#endif	/* gettext.h  */
diff --git a/intl/gettextP.h b/intl/gettextP.h
new file mode 100644
index 0000000..00c5203
--- /dev/null
+++ b/intl/gettextP.h
@@ -0,0 +1,89 @@
+/* Header describing internals of gettext library
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include "loadinfo.h"
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static nls_uint32 SWAP PARAMS ((nls_uint32 i));
+
+static inline nls_uint32
+SWAP (i)
+     nls_uint32 i;
+{
+  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+struct loaded_domain
+{
+  const char *data;
+  int use_mmap;
+  size_t mmap_size;
+  int must_swap;
+  nls_uint32 nstrings;
+  struct string_desc *orig_tab;
+  struct string_desc *trans_tab;
+  nls_uint32 hash_size;
+  nls_uint32 *hash_tab;
+};
+
+struct binding
+{
+  struct binding *next;
+  char *domainname;
+  char *dirname;
+};
+
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+						 char *__locale,
+						 const char *__domainname))
+     internal_function;
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
+     internal_function;
+void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
+     internal_function;
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h  */
diff --git a/intl/hash-string.h b/intl/hash-string.h
new file mode 100644
index 0000000..939e958
--- /dev/null
+++ b/intl/hash-string.h
@@ -0,0 +1,59 @@
+/* Implements a string hashing function.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+#  define PARAMS(Args) Args
+# else
+#  define PARAMS(Args) ()
+# endif
+#endif
+
+/* We assume to have `unsigned long int' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+static unsigned long int hash_string PARAMS ((const char *__str_param));
+
+static inline unsigned long int
+hash_string (str_param)
+     const char *str_param;
+{
+  unsigned long int hval, g;
+  const char *str = str_param;
+
+  /* Compute the hash value for the given string.  */
+  hval = 0;
+  while (*str != '\0')
+    {
+      hval <<= 4;
+      hval += (unsigned long int) *str++;
+      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+      if (g != 0)
+	{
+	  hval ^= g >> (HASHWORDBITS - 8);
+	  hval ^= g;
+	}
+    }
+  return hval;
+}
diff --git a/intl/intl-compat.c b/intl/intl-compat.c
new file mode 100644
index 0000000..503efa0
--- /dev/null
+++ b/intl/intl-compat.c
@@ -0,0 +1,76 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+   Library.
+   Copyright (C) 1995 Software Foundation, Inc.
+
+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.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef textdomain
+#undef bindtextdomain
+
+
+char *
+bindtextdomain (domainname, dirname)
+     const char *domainname;
+     const char *dirname;
+{
+  return bindtextdomain__ (domainname, dirname);
+}
+
+
+char *
+dcgettext (domainname, msgid, category)
+     const char *domainname;
+     const char *msgid;
+     int category;
+{
+  return dcgettext__ (domainname, msgid, category);
+}
+
+
+char *
+dgettext (domainname, msgid)
+     const char *domainname;
+     const char *msgid;
+{
+  return dgettext__ (domainname, msgid);
+}
+
+
+char *
+gettext (msgid)
+     const char *msgid;
+{
+  return gettext__ (msgid);
+}
+
+
+char *
+textdomain (domainname)
+     const char *domainname;
+{
+  return textdomain__ (domainname);
+}
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
new file mode 100644
index 0000000..30f5f64
--- /dev/null
+++ b/intl/l10nflist.c
@@ -0,0 +1,411 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE	1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+#  define strchr index
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# ifndef stpcpy
+#  define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Define function which are usually not available.  */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ.  */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+     const char *argz;
+     size_t len;
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif	/* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+   except the last into the character SEP.  */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+     char *argz;
+     size_t len;
+     int sep;
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len;
+      len -= part_len + 1;
+      if (len > 0)
+	*argz++ = sep;
+    }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif	/* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+				  const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+     char *argz;
+     size_t argz_len;
+     const char *entry;
+{
+  if (entry)
+    {
+      if (entry < argz + argz_len)
+        entry = strchr (entry, '\0') + 1;
+
+      return entry >= argz + argz_len ? NULL : (char *) entry;
+    }
+  else
+    if (argz_len > 0)
+      return argz;
+    else
+      return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif	/* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X.  */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+     int x;
+{
+  /* We assume that no more than 16 bits are used.  */
+  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+  x = ((x >> 4) + x) & 0x0f0f;
+  x = ((x >> 8) + x) & 0xff;
+
+  return x;
+}
+
+

+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+		    territory, codeset, normalized_codeset, modifier, special,
+		    sponsor, revision, filename, do_allocate)
+     struct loaded_l10nfile **l10nfile_list;
+     const char *dirlist;
+     size_t dirlist_len;
+     int mask;
+     const char *language;
+     const char *territory;
+     const char *codeset;
+     const char *normalized_codeset;
+     const char *modifier;
+     const char *special;
+     const char *sponsor;
+     const char *revision;
+     const char *filename;
+     int do_allocate;
+{
+  char *abs_filename;
+  struct loaded_l10nfile *last = NULL;
+  struct loaded_l10nfile *retval;
+  char *cp;
+  size_t entries;
+  int cnt;
+
+  /* Allocate room for the full file name.  */
+  abs_filename = (char *) malloc (dirlist_len
+				  + strlen (language)
+				  + ((mask & TERRITORY) != 0
+				     ? strlen (territory) + 1 : 0)
+				  + ((mask & XPG_CODESET) != 0
+				     ? strlen (codeset) + 1 : 0)
+				  + ((mask & XPG_NORM_CODESET) != 0
+				     ? strlen (normalized_codeset) + 1 : 0)
+				  + (((mask & XPG_MODIFIER) != 0
+				      || (mask & CEN_AUDIENCE) != 0)
+				     ? strlen (modifier) + 1 : 0)
+				  + ((mask & CEN_SPECIAL) != 0
+				     ? strlen (special) + 1 : 0)
+				  + (((mask & CEN_SPONSOR) != 0
+				      || (mask & CEN_REVISION) != 0)
+				     ? (1 + ((mask & CEN_SPONSOR) != 0
+					     ? strlen (sponsor) + 1 : 0)
+					+ ((mask & CEN_REVISION) != 0
+					   ? strlen (revision) + 1 : 0)) : 0)
+				  + 1 + strlen (filename) + 1);
+
+  if (abs_filename == NULL)
+    return NULL;
+
+  retval = NULL;
+  last = NULL;
+
+  /* Construct file name.  */
+  memcpy (abs_filename, dirlist, dirlist_len);
+  __argz_stringify (abs_filename, dirlist_len, ':');
+  cp = abs_filename + (dirlist_len - 1);
+  *cp++ = '/';
+  cp = stpcpy (cp, language);
+
+  if ((mask & TERRITORY) != 0)
+    {
+      *cp++ = '_';
+      cp = stpcpy (cp, territory);
+    }
+  if ((mask & XPG_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, codeset);
+    }
+  if ((mask & XPG_NORM_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, normalized_codeset);
+    }
+  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+    {
+      /* This component can be part of both syntaces but has different
+	 leading characters.  For CEN we use `+', else `@'.  */
+      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+      cp = stpcpy (cp, modifier);
+    }
+  if ((mask & CEN_SPECIAL) != 0)
+    {
+      *cp++ = '+';
+      cp = stpcpy (cp, special);
+    }
+  if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+    {
+      *cp++ = ',';
+      if ((mask & CEN_SPONSOR) != 0)
+	cp = stpcpy (cp, sponsor);
+      if ((mask & CEN_REVISION) != 0)
+	{
+	  *cp++ = '_';
+	  cp = stpcpy (cp, revision);
+	}
+    }
+
+  *cp++ = '/';
+  stpcpy (cp, filename);
+
+  /* Look in list of already loaded domains whether it is already
+     available.  */
+  last = NULL;
+  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+    if (retval->filename != NULL)
+      {
+	int compare = strcmp (retval->filename, abs_filename);
+	if (compare == 0)
+	  /* We found it!  */
+	  break;
+	if (compare < 0)
+	  {
+	    /* It's not in the list.  */
+	    retval = NULL;
+	    break;
+	  }
+
+	last = retval;
+      }
+
+  if (retval != NULL || do_allocate == 0)
+    {
+      free (abs_filename);
+      return retval;
+    }
+
+  retval = (struct loaded_l10nfile *)
+    malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
+				* (1 << pop (mask))
+				* sizeof (struct loaded_l10nfile *)));
+  if (retval == NULL)
+    return NULL;
+
+  retval->filename = abs_filename;
+  retval->decided = (__argz_count (dirlist, dirlist_len) != 1
+		     || ((mask & XPG_CODESET) != 0
+			 && (mask & XPG_NORM_CODESET) != 0));
+  retval->data = NULL;
+
+  if (last == NULL)
+    {
+      retval->next = *l10nfile_list;
+      *l10nfile_list = retval;
+    }
+  else
+    {
+      retval->next = last->next;
+      last->next = retval;
+    }
+
+  entries = 0;
+  /* If the DIRLIST is a real list the RETVAL entry corresponds not to
+     a real file.  So we have to use the DIRLIST separation mechanism
+     of the inner loop.  */
+  cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
+  for (; cnt >= 0; --cnt)
+    if ((cnt & ~mask) == 0
+	&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+	&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+      {
+	/* Iterate over all elements of the DIRLIST.  */
+	char *dir = NULL;
+
+	while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+	       != NULL)
+	  retval->successor[entries++]
+	    = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
+				  language, territory, codeset,
+				  normalized_codeset, modifier, special,
+				  sponsor, revision, filename, 1);
+      }
+  retval->successor[entries] = NULL;
+
+  return retval;
+}
+

+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+     const char *codeset;
+     size_t name_len;
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum (codeset[cnt]))
+      {
+	++len;
+
+	if (isalpha (codeset[cnt]))
+	  only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+	wp = stpcpy (retval, "iso");
+      else
+	wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+	if (isalpha (codeset[cnt]))
+	  *wp++ = tolower (codeset[cnt]);
+	else if (isdigit (codeset[cnt]))
+	  *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
diff --git a/intl/libgettext.h b/intl/libgettext.h
new file mode 100644
index 0000000..3a92960
--- /dev/null
+++ b/intl/libgettext.h
@@ -0,0 +1,182 @@
+/* Message catalogs for internationalization.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* Because on some systems (e.g. Solaris) we sometimes have to include
+   the systems libintl.h as well as this file we have more complex
+   include protection above.  But the systems header might perhaps also
+   define _LIBINTL_H and therefore we have to protect the definition here.  */
+
+#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
+#ifndef _LIBINTL_H
+# define _LIBINTL_H	1
+#endif
+#define _LIBGETTEXT_H	1
+
+/* We define an additional symbol to signal that we use the GNU
+   implementation of gettext.  */
+#define __USE_GNU_GETTEXT 1
+
+#include <sys/types.h>
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __cplusplus
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef NULL
+# if !defined __cplusplus || defined __GNUC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL (0)
+# endif
+#endif
+
+#if !HAVE_LC_MESSAGES
+/* This value determines the behaviour of the gettext() and dgettext()
+   function.  But some system does not have this defined.  Define it
+   to a default value.  */
+# define LC_MESSAGES (-1)
+#endif
+
+
+/* Declarations for gettext-using-catgets interface.  Derived from
+   Jim Meyering's libintl.h.  */
+struct _msg_ent
+{
+  const char *_msg;
+  int _msg_number;
+};
+
+
+#if HAVE_CATGETS
+/* These two variables are defined in the automatically by po-to-tbl.sed
+   generated file `cat-id-tbl.c'.  */
+extern const struct _msg_ent _msg_tbl[];
+extern int _msg_tbl_length;
+#endif
+
+
+/* For automatical extraction of messages sometimes no real
+   translation is needed.  Instead the string itself is the result.  */
+#define gettext_noop(Str) (Str)
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+extern char *gettext PARAMS ((const char *__msgid));
+extern char *gettext__ PARAMS ((const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   LC_MESSAGES locale.  */
+extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
+extern char *dgettext__ PARAMS ((const char *__domainname,
+				 const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
+				int __category));
+extern char *dcgettext__ PARAMS ((const char *__domainname,
+				  const char *__msgid, int __category));
+
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+extern char *textdomain PARAMS ((const char *__domainname));
+extern char *textdomain__ PARAMS ((const char *__domainname));
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+extern char *bindtextdomain PARAMS ((const char *__domainname,
+				  const char *__dirname));
+extern char *bindtextdomain__ PARAMS ((const char *__domainname,
+				    const char *__dirname));
+
+#if ENABLE_NLS
+
+/* Solaris 2.3 has the gettext function but dcgettext is missing.
+   So we omit this optimization for Solaris 2.3.  BTW, Solaris 2.4
+   has dcgettext.  */
+# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
+
+#  define gettext(Msgid)						      \
+     dgettext (NULL, Msgid)
+
+#  define dgettext(Domainname, Msgid)					      \
+     dcgettext (Domainname, Msgid, LC_MESSAGES)
+
+#  if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
+/* This global variable is defined in loadmsgcat.c.  We need a sign,
+   whether a new catalog was loaded, which can be associated with all
+   translations.  */
+extern int _nl_msg_cat_cntr;
+
+#   define dcgettext(Domainname, Msgid, Category)			      \
+  (__extension__							      \
+   ({									      \
+     char *__result;							      \
+     if (__builtin_constant_p (Msgid))					      \
+       {								      \
+	 static char *__translation__;					      \
+	 static int __catalog_counter__;				      \
+	 if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr)    \
+	   {								      \
+	     __translation__ =						      \
+	       dcgettext__ (Domainname, Msgid, Category);		      \
+	     __catalog_counter__ = _nl_msg_cat_cntr;			      \
+	   }								      \
+	 __result = __translation__;					      \
+       }								      \
+     else								      \
+       __result = dcgettext__ (Domainname, Msgid, Category);		      \
+     __result;								      \
+    }))
+#  endif
+# endif
+
+#else
+
+# define gettext(Msgid) (Msgid)
+# define dgettext(Domainname, Msgid) (Msgid)
+# define dcgettext(Domainname, Msgid, Category) (Msgid)
+# define textdomain(Domainname) ((char *) Domainname)
+# define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
+
+#endif
+
+/* @@ begin of epilog @@ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/intl/linux-msg.sed b/intl/linux-msg.sed
new file mode 100644
index 0000000..5918e72
--- /dev/null
+++ b/intl/linux-msg.sed
@@ -0,0 +1,100 @@
+# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number.  We use always set number 1.
+#
+1 {
+  i\
+$set 1 # Automatically created by po2msg.sed
+  h
+  s/.*/0/
+  x
+}
+#
+# Mitch's old catalog format does not allow comments.
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+  s/msgid[ 	]*"//
+#
+# This does not work now with the new format.
+# /"$/! {
+#   s/\\$//
+#   s/$/ ... (more lines following)"/
+# }
+  x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+  td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+  :d
+  s/9\(_*\)$/_\1/
+  td
+# Assure at least one digit is available.
+  s/^\(_*\)$/0\1/
+# Increment the last digit.
+  s/8\(_*\)$/9\1/
+  s/7\(_*\)$/8\1/
+  s/6\(_*\)$/7\1/
+  s/5\(_*\)$/6\1/
+  s/4\(_*\)$/5\1/
+  s/3\(_*\)$/4\1/
+  s/2\(_*\)$/3\1/
+  s/1\(_*\)$/2\1/
+  s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+  s/_/0/g
+  x
+  G
+  s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID.  Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here.  (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+  s/msgstr[ 	]*"\(.*\)"/# \1/
+# Clear substitution flag.
+  tb
+# Append the next line.
+  :b
+  N
+# Look whether second part is continuation line.
+  s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+  ta
+  P
+  D
+# Note that D includes a jump to the start!!
+# We found a continuation line.  But before printing insert '\'.
+  :a
+  s/\(.*\)\(\n.*\)/\1\\\2/
+  P
+# We cannot use D here.
+  s/.*\n\(.*\)/\1/
+  tb
+}
+d
diff --git a/intl/loadinfo.h b/intl/loadinfo.h
new file mode 100644
index 0000000..1c4524a
--- /dev/null
+++ b/intl/loadinfo.h
@@ -0,0 +1,78 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper at cygnus.com>, 1996.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef PARAMS
+# if __STDC__
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+/* Encoding of locale name parts.  */
+#define CEN_REVISION		1
+#define CEN_SPONSOR		2
+#define CEN_SPECIAL		4
+#define XPG_NORM_CODESET	8
+#define XPG_CODESET		16
+#define TERRITORY		32
+#define CEN_AUDIENCE		64
+#define XPG_MODIFIER		128
+
+#define CEN_SPECIFIC	(CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC	(XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+  const char *filename;
+  int decided;
+
+  const void *data;
+
+  struct loaded_l10nfile *next;
+  struct loaded_l10nfile *successor[1];
+};
+
+
+extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
+						  size_t name_len));
+
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+			    const char *dirlist, size_t dirlist_len, int mask,
+			    const char *language, const char *territory,
+			    const char *codeset,
+			    const char *normalized_codeset,
+			    const char *modifier, const char *special,
+			    const char *sponsor, const char *revision,
+			    const char *filename, int do_allocate));
+
+
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+extern int _nl_explode_name PARAMS ((char *name, const char **language,
+				     const char **modifier,
+				     const char **territory,
+				     const char **codeset,
+				     const char **normalized_codeset,
+				     const char **special,
+				     const char **sponsor,
+				     const char **revision));
+
+extern char *_nl_find_language PARAMS ((const char *name));
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
new file mode 100644
index 0000000..2c6a565
--- /dev/null
+++ b/intl/loadmsgcat.c
@@ -0,0 +1,220 @@
+/* Load needed message catalogs.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+    || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP	1
+#else
+# undef HAVE_MMAP
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions.  This is required by the standard
+   because some ISO C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define open   __open
+# define close  __close
+# define read   __read
+# define mmap   __mmap
+# define munmap __munmap
+#endif
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+   with all translations.  This is important if the translations are
+   cached by one of GCC's features.  */
+int _nl_msg_cat_cntr = 0;
+
+
+/* Load the message catalogs specified by FILENAME.  If it is no valid
+   message catalog do nothing.  */
+void
+internal_function
+_nl_load_domain (domain_file)
+     struct loaded_l10nfile *domain_file;
+{
+  int fd;
+  size_t size;
+  struct stat st;
+  struct mo_file_header *data = (struct mo_file_header *) -1;
+  int use_mmap = 0;
+  struct loaded_domain *domain;
+
+  domain_file->decided = 1;
+  domain_file->data = NULL;
+
+  /* If the record does not represent a valid locale the FILENAME
+     might be NULL.  This can happen when according to the given
+     specification the locale file name is different for XPG and CEN
+     syntax.  */
+  if (domain_file->filename == NULL)
+    return;
+
+  /* Try to open the addressed file.  */
+  fd = open (domain_file->filename, O_RDONLY);
+  if (fd == -1)
+    return;
+
+  /* We must know about the size of the file.  */
+  if (fstat (fd, &st) != 0
+      || (size = (size_t) st.st_size) != st.st_size
+      || size < sizeof (struct mo_file_header))
+    {
+      /* Something went wrong.  */
+      close (fd);
+      return;
+    }
+
+#ifdef HAVE_MMAP
+  /* Now we are ready to load the file.  If mmap() is available we try
+     this first.  If not available or it failed we try to load it.  */
+  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+					 MAP_PRIVATE, fd, 0);
+
+  if (data != (struct mo_file_header *) -1)
+    {
+      /* mmap() call was successful.  */
+      close (fd);
+      use_mmap = 1;
+    }
+#endif
+
+  /* If the data is not yet available (i.e. mmap'ed) we try to load
+     it manually.  */
+  if (data == (struct mo_file_header *) -1)
+    {
+      size_t to_read;
+      char *read_ptr;
+
+      data = (struct mo_file_header *) malloc (size);
+      if (data == NULL)
+	return;
+
+      to_read = size;
+      read_ptr = (char *) data;
+      do
+	{
+	  long int nb = (long int) read (fd, read_ptr, to_read);
+	  if (nb == -1)
+	    {
+	      close (fd);
+	      return;
+	    }
+
+	  read_ptr += nb;
+	  to_read -= nb;
+	}
+      while (to_read > 0);
+
+      close (fd);
+    }
+
+  /* Using the magic number we can test whether it really is a message
+     catalog file.  */
+  if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
+    {
+      /* The magic number is wrong: not a message catalog file.  */
+#ifdef HAVE_MMAP
+      if (use_mmap)
+	munmap ((caddr_t) data, size);
+      else
+#endif
+	free (data);
+      return;
+    }
+
+  domain_file->data
+    = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+  if (domain_file->data == NULL)
+    return;
+
+  domain = (struct loaded_domain *) domain_file->data;
+  domain->data = (char *) data;
+  domain->use_mmap = use_mmap;
+  domain->mmap_size = size;
+  domain->must_swap = data->magic != _MAGIC;
+
+  /* Fill in the information about the available tables.  */
+  switch (W (domain->must_swap, data->revision))
+    {
+    case 0:
+      domain->nstrings = W (domain->must_swap, data->nstrings);
+      domain->orig_tab = (struct string_desc *)
+	((char *) data + W (domain->must_swap, data->orig_tab_offset));
+      domain->trans_tab = (struct string_desc *)
+	((char *) data + W (domain->must_swap, data->trans_tab_offset));
+      domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+      domain->hash_tab = (nls_uint32 *)
+	((char *) data + W (domain->must_swap, data->hash_tab_offset));
+      break;
+    default:
+      /* This is an invalid revision.  */
+#ifdef HAVE_MMAP
+      if (use_mmap)
+	munmap ((caddr_t) data, size);
+      else
+#endif
+	free (data);
+      free (domain);
+      domain_file->data = NULL;
+      return;
+    }
+
+  /* Show that one domain is changed.  This might make some cached
+     translations invalid.  */
+  ++_nl_msg_cat_cntr;
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (domain)
+     struct loaded_domain *domain;
+{
+#ifdef _POSIX_MAPPED_FILES
+  if (domain->use_mmap)
+    munmap ((caddr_t) domain->data, domain->mmap_size);
+  else
+#endif	/* _POSIX_MAPPED_FILES */
+    free ((void *) domain->data);
+
+  free (domain);
+}
+#endif
diff --git a/intl/localealias.c b/intl/localealias.c
new file mode 100644
index 0000000..861020d
--- /dev/null
+++ b/intl/localealias.c
@@ -0,0 +1,438 @@
+/* Handle aliases for locale names.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+#  include <alloca.h>
+# else
+#  ifdef _AIX
+ #pragma alloca
+#  else
+#   ifndef alloca
+char *alloca ();
+#   endif
+#  endif
+# endif
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+#  include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE	1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+#  define strchr index
+# endif
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+#  define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY	1
+
+/* We need locking here since we can be called from different places.  */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)						      \
+  do {									      \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to	      \
+       the list.  */							      \
+    if (newp != NULL) {							      \
+      newp->address = (addr);						      \
+      newp->next = (list);						      \
+      (list) = newp;							      \
+    }									      \
+  } while (0)
+# define FREE_BLOCKS(list)						      \
+  do {									      \
+    while (list != NULL) {						      \
+      struct block_list *old = list;					      \
+      list = list->next;						      \
+      free (old);							      \
+    }									      \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif	/* have alloca */
+
+#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+  const char *alias;
+  const char *value;
+};
+
+
+static char *string_space = NULL;
+static size_t string_space_act = 0;
+static size_t string_space_max = 0;
+static struct alias_map *map;
+static size_t nmap = 0;
+static size_t maxmap = 0;
+
+
+/* Prototypes for local functions.  */
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
+     internal_function;
+static void extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+				  const struct alias_map *map2));
+
+
+const char *
+_nl_expand_alias (name)
+    const char *name;
+{
+  static const char *locale_alias_path = LOCALE_ALIAS_PATH;
+  struct alias_map *retval;
+  const char *result = NULL;
+  size_t added;
+
+#ifdef _LIBC
+  __libc_lock_lock (lock);
+#endif
+
+  do
+    {
+      struct alias_map item;
+
+      item.alias = name;
+
+      if (nmap > 0)
+	retval = (struct alias_map *) bsearch (&item, map, nmap,
+					       sizeof (struct alias_map),
+					       (int (*) PARAMS ((const void *,
+								 const void *))
+						) alias_compare);
+      else
+	retval = NULL;
+
+      /* We really found an alias.  Return the value.  */
+      if (retval != NULL)
+	{
+	  result = retval->value;
+	  break;
+	}
+
+      /* Perhaps we can find another alias file.  */
+      added = 0;
+      while (added == 0 && locale_alias_path[0] != '\0')
+	{
+	  const char *start;
+
+	  while (locale_alias_path[0] == ':')
+	    ++locale_alias_path;
+	  start = locale_alias_path;
+
+	  while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':')
+	    ++locale_alias_path;
+
+	  if (start < locale_alias_path)
+	    added = read_alias_file (start, locale_alias_path - start);
+	}
+    }
+  while (added != 0);
+
+#ifdef _LIBC
+  __libc_lock_unlock (lock);
+#endif
+
+  return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (fname, fname_len)
+     const char *fname;
+     int fname_len;
+{
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  FILE *fp;
+  char *full_fname;
+  size_t added;
+  static const char aliasfile[] = "/locale.alias";
+
+  full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+  ADD_BLOCK (block_list, full_fname);
+#ifdef HAVE_MEMPCPY
+  mempcpy (mempcpy (full_fname, fname, fname_len),
+	   aliasfile, sizeof aliasfile);
+#else
+  memcpy (full_fname, fname, fname_len);
+  memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+  fp = fopen (full_fname, "r");
+  if (fp == NULL)
+    {
+      FREE_BLOCKS (block_list);
+      return 0;
+    }
+
+  added = 0;
+  while (!feof (fp))
+    {
+      /* It is a reasonable approach to use a fix buffer here because
+	 a) we are only interested in the first two fields
+	 b) these fields must be usable as file names and so must not
+	    be that long
+       */
+      char buf[BUFSIZ];
+      char *alias;
+      char *value;
+      char *cp;
+
+      if (fgets (buf, sizeof buf, fp) == NULL)
+	/* EOF reached.  */
+	break;
+
+      /* Possibly not the whole line fits into the buffer.  Ignore
+	 the rest of the line.  */
+      if (strchr (buf, '\n') == NULL)
+	{
+	  char altbuf[BUFSIZ];
+	  do
+	    if (fgets (altbuf, sizeof altbuf, fp) == NULL)
+	      /* Make sure the inner loop will be left.  The outer loop
+		 will exit at the `feof' test.  */
+	      break;
+	  while (strchr (altbuf, '\n') == NULL);
+	}
+
+      cp = buf;
+      /* Ignore leading white space.  */
+      while (isspace (cp[0]))
+	++cp;
+
+      /* A leading '#' signals a comment line.  */
+      if (cp[0] != '\0' && cp[0] != '#')
+	{
+	  alias = cp++;
+	  while (cp[0] != '\0' && !isspace (cp[0]))
+	    ++cp;
+	  /* Terminate alias name.  */
+	  if (cp[0] != '\0')
+	    *cp++ = '\0';
+
+	  /* Now look for the beginning of the value.  */
+	  while (isspace (cp[0]))
+	    ++cp;
+
+	  if (cp[0] != '\0')
+	    {
+	      size_t alias_len;
+	      size_t value_len;
+
+	      value = cp++;
+	      while (cp[0] != '\0' && !isspace (cp[0]))
+		++cp;
+	      /* Terminate value.  */
+	      if (cp[0] == '\n')
+		{
+		  /* This has to be done to make the following test
+		     for the end of line possible.  We are looking for
+		     the terminating '\n' which do not overwrite here.  */
+		  *cp++ = '\0';
+		  *cp = '\n';
+		}
+	      else if (cp[0] != '\0')
+		*cp++ = '\0';
+
+	      if (nmap >= maxmap)
+		extend_alias_table ();
+
+	      alias_len = strlen (alias) + 1;
+	      value_len = strlen (value) + 1;
+
+	      if (string_space_act + alias_len + value_len > string_space_max)
+		{
+		  /* Increase size of memory pool.  */
+		  size_t new_size = (string_space_max
+				     + (alias_len + value_len > 1024
+					? alias_len + value_len : 1024));
+		  char *new_pool = (char *) realloc (string_space, new_size);
+		  if (new_pool == NULL)
+		    {
+		      FREE_BLOCKS (block_list);
+		      return added;
+		    }
+		  string_space = new_pool;
+		  string_space_max = new_size;
+		}
+
+	      map[nmap].alias = memcpy (&string_space[string_space_act],
+					alias, alias_len);
+	      string_space_act += alias_len;
+
+	      map[nmap].value = memcpy (&string_space[string_space_act],
+					value, value_len);
+	      string_space_act += value_len;
+
+	      ++nmap;
+	      ++added;
+	    }
+	}
+    }
+
+  /* Should we test for ferror()?  I think we have to silently ignore
+     errors.  --drepper  */
+  fclose (fp);
+
+  if (added > 0)
+    qsort (map, nmap, sizeof (struct alias_map),
+	   (int (*) PARAMS ((const void *, const void *))) alias_compare);
+
+  FREE_BLOCKS (block_list);
+  return added;
+}
+
+
+static void
+extend_alias_table ()
+{
+  size_t new_size;
+  struct alias_map *new_map;
+
+  new_size = maxmap == 0 ? 100 : 2 * maxmap;
+  new_map = (struct alias_map *) realloc (map, (new_size
+						* sizeof (struct alias_map)));
+  if (new_map == NULL)
+    /* Simply don't extend: we don't have any more core.  */
+    return;
+
+  map = new_map;
+  maxmap = new_size;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+  if (string_space != NULL)
+    free (string_space);
+  if (map != NULL)
+    free (map);
+}
+text_set_element (__libc_subfreeres, free_mem);
+#endif
+
+
+static int
+alias_compare (map1, map2)
+     const struct alias_map *map1;
+     const struct alias_map *map2;
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+  return strcasecmp (map1->alias, map2->alias);
+#else
+  const unsigned char *p1 = (const unsigned char *) map1->alias;
+  const unsigned char *p2 = (const unsigned char *) map2->alias;
+  unsigned char c1, c2;
+
+  if (p1 == p2)
+    return 0;
+
+  do
+    {
+      /* I know this seems to be odd but the tolower() function in
+	 some systems libc cannot handle nonalpha characters.  */
+      c1 = isupper (*p1) ? tolower (*p1) : *p1;
+      c2 = isupper (*p2) ? tolower (*p2) : *p2;
+      if (c1 == '\0')
+	break;
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+#endif
+}
diff --git a/intl/po2tbl.sed.in b/intl/po2tbl.sed.in
new file mode 100644
index 0000000..b3bcca4
--- /dev/null
+++ b/intl/po2tbl.sed.in
@@ -0,0 +1,102 @@
+# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+1 {
+  i\
+/* Automatically generated by po2tbl.sed from @PACKAGE NAME at .pot.  */\
+\
+#if HAVE_CONFIG_H\
+# include <config.h>\
+#endif\
+\
+#include "libgettext.h"\
+\
+const struct _msg_ent _msg_tbl[] = {
+  h
+  s/.*/0/
+  x
+}
+#
+# Write msgid entries in C array form.
+#
+/^msgid/ {
+  s/msgid[ 	]*\(".*"\)/  {\1/
+  tb
+# Append the next line
+  :b
+  N
+# Look whether second part is continuation line.
+  s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
+# Yes, then branch.
+  ta
+# Because we assume that the input file correctly formed the line
+# just read cannot be again be a msgid line.  So it's safe to ignore
+# it.
+  s/\(.*\)\n.*/\1/
+  bc
+# We found a continuation line.  But before printing insert '\'.
+  :a
+  s/\(.*\)\(\n.*\)/\1\\\2/
+  P
+# We cannot use D here.
+  s/.*\n\(.*\)/\1/
+# Some buggy seds do not clear the `successful substitution since last ``t'''
+# flag on `N', so we do a `t' here to clear it.
+  tb
+# Not reached
+  :c
+  x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+  td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+  :d
+  s/9\(_*\)$/_\1/
+  td
+# Assure at least one digit is available.
+  s/^\(_*\)$/0\1/
+# Increment the last digit.
+  s/8\(_*\)$/9\1/
+  s/7\(_*\)$/8\1/
+  s/6\(_*\)$/7\1/
+  s/5\(_*\)$/6\1/
+  s/4\(_*\)$/5\1/
+  s/3\(_*\)$/4\1/
+  s/2\(_*\)$/3\1/
+  s/1\(_*\)$/2\1/
+  s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+  s/_/0/g
+  x
+  G
+  s/\(.*\)\n\([0-9]*\)/\1, \2},/
+  s/\(.*\)"$/\1/
+  p
+}
+#
+# Last line.
+#
+$ {
+  i\
+};\
+
+  g
+  s/0*\(.*\)/int _msg_tbl_length = \1;/p
+}
+d
diff --git a/intl/textdomain.c b/intl/textdomain.c
new file mode 100644
index 0000000..8855746
--- /dev/null
+++ b/intl/textdomain.c
@@ -0,0 +1,108 @@
+/* Implementation of the textdomain(3) function.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain.  */
+extern const char _nl_default_default_domain[];
+
+/* Default text domain in which entries for gettext(3) are to be found.  */
+extern const char *_nl_current_default_domain;
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN textdomain__
+#endif
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+char *
+TEXTDOMAIN (domainname)
+     const char *domainname;
+{
+  char *old;
+
+  /* A NULL pointer requests the current setting.  */
+  if (domainname == NULL)
+    return (char *) _nl_current_default_domain;
+
+  old = (char *) _nl_current_default_domain;
+
+  /* If domain name is the null string set to default domain "messages".  */
+  if (domainname[0] == '\0'
+      || strcmp (domainname, _nl_default_default_domain) == 0)
+    _nl_current_default_domain = _nl_default_default_domain;
+  else
+    {
+      /* If the following malloc fails `_nl_current_default_domain'
+	 will be NULL.  This value will be returned and so signals we
+	 are out of core.  */
+#if defined _LIBC || defined HAVE_STRDUP
+      _nl_current_default_domain = strdup (domainname);
+#else
+      size_t len = strlen (domainname) + 1;
+      char *cp = (char *) malloc (len);
+      if (cp != NULL)
+	memcpy (cp, domainname, len);
+      _nl_current_default_domain = cp;
+#endif
+    }
+
+  if (old != _nl_default_default_domain)
+    free (old);
+
+  return (char *) _nl_current_default_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/intl/xopen-msg.sed b/intl/xopen-msg.sed
new file mode 100644
index 0000000..b19c0bb
--- /dev/null
+++ b/intl/xopen-msg.sed
@@ -0,0 +1,104 @@
+# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number.  We use always set number 1.
+#
+1 {
+  i\
+$set 1 # Automatically created by po2msg.sed
+  h
+  s/.*/0/
+  x
+}
+#
+# We copy all comments into the .msg file.  Perhaps they can help.
+#
+/^#/ s/^#[ 	]*/$ /p
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+# Does not work now
+#  /"$/! {
+#    s/\\$//
+#    s/$/ ... (more lines following)"/
+#  }
+  s/^msgid[ 	]*"\(.*\)"$/$ Original Message: \1/
+  p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID.  Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here.  (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+  s/msgstr[ 	]*"\(.*\)"/\1/
+  x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+  td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+  :d
+  s/9\(_*\)$/_\1/
+  td
+# Assure at least one digit is available.
+  s/^\(_*\)$/0\1/
+# Increment the last digit.
+  s/8\(_*\)$/9\1/
+  s/7\(_*\)$/8\1/
+  s/6\(_*\)$/7\1/
+  s/5\(_*\)$/6\1/
+  s/4\(_*\)$/5\1/
+  s/3\(_*\)$/4\1/
+  s/2\(_*\)$/3\1/
+  s/1\(_*\)$/2\1/
+  s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+  s/_/0/g
+  x
+# Bring the line in the format `<number> <message>'
+  G
+  s/^[^\n]*$/& /
+  s/\(.*\)\n\([0-9]*\)/\2 \1/
+# Clear flag from last substitution.
+  tb
+# Append the next line.
+  :b
+  N
+# Look whether second part is a continuation line.
+  s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+  ta
+  P
+  D
+# Note that `D' includes a jump to the start!!
+# We found a continuation line.  But before printing insert '\'.
+  :a
+  s/\(.*\)\(\n.*\)/\1\\\2/
+  P
+# We cannot use the sed command `D' here
+  s/.*\n\(.*\)/\1/
+  tb
+}
+d
diff --git a/main/Makefile.am b/main/Makefile.am
new file mode 100644
index 0000000..ff26c2f
--- /dev/null
+++ b/main/Makefile.am
@@ -0,0 +1,78 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \
+	-I$(top_srcdir)/
+
+if PPUSER
+PPSRC1 = ppuser.c ppuserinit.c ppdev.c ppdevinit.c
+else
+PPSRC1 = 
+endif
+
+if PPKDRV
+PPSRC2 = ppkdrv.c ppkdrvinit.c
+else
+PPSRC2 = 
+endif
+
+if WIN32
+PPSRC3 = ppwin.c ppwininit.c ppntddkgenport.c ppntddkgenportinit.c ppw9xring0.c ppw9xring0init.c
+else
+PPSRC3 =
+endif
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS = 
+endif
+
+noinst_LIBRARIES = libinit.a libresident.a libresident2.a libmisc.a
+
+man_MANS = eppfpga.8
+
+libresident_a_SOURCES = \
+	ppdirect.c \
+	snprintpkt.c
+
+libresident2_a_SOURCES = \
+	$(PPSRC1) $(PPSRC2) $(PPSRC3)
+
+libinit_a_SOURCES = \
+	fpgatests.c \
+	configfpga.c \
+	ppdirectinit.c \
+	ecp_firmware.h \
+	epp_firmware.h \
+	eppafsk_firmware.h \
+	eppchk_firmware.h \
+	eppsamp_firmware.h \
+	sppafsk_firmware.h \
+	epp_fpga.h
+
+libmisc_a_SOURCES =
+libmisc_a_LIBADD = $(LIBOBJS)
+
+sbin_PROGRAMS = eppfpga
+
+eppfpga_SOURCES = \
+	eppfpga.c
+
+eppfpga_LDADD = \
+	libinit.a libresident.a libresident2.a libmisc.a $(DIRECTXLIBS)
+
+noinst_HEADERS =   \
+	fpga.h     \
+	sysdeps.h  \
+	util.h     \
+	parport.h  \
+	getopt.h   \
+	ppdev.h    \
+	ppuser.h
+
+EXTRA_DIST = getopt.c getopt1.c syslog.c vsnprintf.c \
+	eppfpga.8 openpty.c \
+	ppuser.c ppuserinit.c ppdev.c ppdevinit.c ppkdrv.c ppkdrvinit.c \
+	ppntddkgenport.c ppntddkgenportinit.c ppnt.c ppntinit.c \
+	ppw9xring0.c ppw9xring0init.c ppwin.c ppwininit.c
diff --git a/main/Makefile.in b/main/Makefile.in
new file mode 100644
index 0000000..3b3d7ce
--- /dev/null
+++ b/main/Makefile.in
@@ -0,0 +1,553 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+	-I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \
+	-I$(top_srcdir)/
+
+ at PPUSER_TRUE@PPSRC1 = @PPUSER_TRUE at ppuser.c ppuserinit.c ppdev.c ppdevinit.c
+ at PPUSER_FALSE@PPSRC1 = 
+ at PPKDRV_TRUE@PPSRC2 = @PPKDRV_TRUE at ppkdrv.c ppkdrvinit.c
+ at PPKDRV_FALSE@PPSRC2 = 
+ at WIN32_TRUE@PPSRC3 = @WIN32_TRUE at ppwin.c ppwininit.c ppntddkgenport.c ppntddkgenportinit.c ppw9xring0.c ppw9xring0init.c
+ at WIN32_FALSE@PPSRC3 = 
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS = 
+
+noinst_LIBRARIES = libinit.a libresident.a libresident2.a libmisc.a
+
+man_MANS = eppfpga.8
+
+libresident_a_SOURCES = \
+	ppdirect.c \
+	snprintpkt.c
+
+
+libresident2_a_SOURCES = \
+	$(PPSRC1) $(PPSRC2) $(PPSRC3)
+
+
+libinit_a_SOURCES = \
+	fpgatests.c \
+	configfpga.c \
+	ppdirectinit.c \
+	ecp_firmware.h \
+	epp_firmware.h \
+	eppafsk_firmware.h \
+	eppchk_firmware.h \
+	eppsamp_firmware.h \
+	sppafsk_firmware.h \
+	epp_fpga.h
+
+
+libmisc_a_SOURCES = 
+libmisc_a_LIBADD = $(LIBOBJS)
+
+sbin_PROGRAMS = eppfpga
+
+eppfpga_SOURCES = \
+	eppfpga.c
+
+
+eppfpga_LDADD = \
+	libinit.a libresident.a libresident2.a libmisc.a $(DIRECTXLIBS)
+
+
+noinst_HEADERS = \
+	fpga.h     \
+	sysdeps.h  \
+	util.h     \
+	parport.h  \
+	getopt.h   \
+	ppdev.h    \
+	ppuser.h
+
+
+EXTRA_DIST = getopt.c getopt1.c syslog.c vsnprintf.c \
+	eppfpga.8 openpty.c \
+	ppuser.c ppuserinit.c ppdev.c ppdevinit.c ppkdrv.c ppkdrvinit.c \
+	ppntddkgenport.c ppntddkgenportinit.c ppnt.c ppntinit.c \
+	ppw9xring0.c ppw9xring0init.c ppwin.c ppwininit.c
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libinit_a_LIBADD = 
+libinit_a_OBJECTS =  fpgatests.$(OBJEXT) configfpga.$(OBJEXT) \
+ppdirectinit.$(OBJEXT)
+libresident_a_LIBADD = 
+libresident_a_OBJECTS =  ppdirect.$(OBJEXT) snprintpkt.$(OBJEXT)
+libresident2_a_LIBADD = 
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at libresident2_a_OBJECTS =  \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppkdrvinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppwin.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppwininit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at libresident2_a_OBJECTS =  \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppkdrvinit.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_FALSE at libresident2_a_OBJECTS = 
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at libresident2_a_OBJECTS =  \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at ppkdrvinit.$(OBJEXT)
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at libresident2_a_OBJECTS =  \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppkdrvinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppwin.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppwininit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at libresident2_a_OBJECTS =  \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppwin.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppwininit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at libresident2_a_OBJECTS =  \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppwin.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppwininit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at libresident2_a_OBJECTS =  \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppdevinit.$(OBJEXT)
+libmisc_a_DEPENDENCIES =  @LIBOBJS@
+libmisc_a_OBJECTS = 
+sbin_PROGRAMS =  eppfpga$(EXEEXT)
+PROGRAMS =  $(sbin_PROGRAMS)
+
+eppfpga_OBJECTS =  eppfpga.$(OBJEXT)
+ at DIRECTX_TRUE@eppfpga_DEPENDENCIES =  libinit.a libresident.a \
+ at DIRECTX_TRUE@libresident2.a libmisc.a
+ at DIRECTX_FALSE@eppfpga_DEPENDENCIES =  libinit.a libresident.a \
+ at DIRECTX_FALSE@libresident2.a libmisc.a
+eppfpga_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man8dir = $(mandir)/man8
+MANS = $(man_MANS)
+
+NROFF = nroff
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in getopt.c getopt1.c vsnprintf.c
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libinit_a_SOURCES) $(libresident_a_SOURCES) $(libresident2_a_SOURCES) $(libmisc_a_SOURCES) $(eppfpga_SOURCES)
+OBJECTS = $(libinit_a_OBJECTS) $(libresident_a_OBJECTS) $(libresident2_a_OBJECTS) $(libmisc_a_OBJECTS) $(eppfpga_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps main/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libinit.a: $(libinit_a_OBJECTS) $(libinit_a_DEPENDENCIES)
+	-rm -f libinit.a
+	$(AR) cru libinit.a $(libinit_a_OBJECTS) $(libinit_a_LIBADD)
+	$(RANLIB) libinit.a
+
+libresident.a: $(libresident_a_OBJECTS) $(libresident_a_DEPENDENCIES)
+	-rm -f libresident.a
+	$(AR) cru libresident.a $(libresident_a_OBJECTS) $(libresident_a_LIBADD)
+	$(RANLIB) libresident.a
+
+libresident2.a: $(libresident2_a_OBJECTS) $(libresident2_a_DEPENDENCIES)
+	-rm -f libresident2.a
+	$(AR) cru libresident2.a $(libresident2_a_OBJECTS) $(libresident2_a_LIBADD)
+	$(RANLIB) libresident2.a
+
+libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES)
+	-rm -f libmisc.a
+	$(AR) cru libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD)
+	$(RANLIB) libmisc.a
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(sbindir)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	     $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+eppfpga$(EXEEXT): $(eppfpga_OBJECTS) $(eppfpga_DEPENDENCIES)
+	@rm -f eppfpga$(EXEEXT)
+	$(LINK) $(eppfpga_LDFLAGS) $(eppfpga_OBJECTS) $(eppfpga_LDADD) $(LIBS)
+
+install-man8:
+	$(mkinstalldirs) $(DESTDIR)$(man8dir)
+	@list='$(man8_MANS)'; \
+	l2='$(man_MANS)'; for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
+	done
+
+uninstall-man8:
+	@list='$(man8_MANS)'; \
+	l2='$(man_MANS)'; for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
+	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
+	done
+install-man: $(MANS)
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-man8
+uninstall-man:
+	@$(NORMAL_UNINSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = main
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+configfpga.o: configfpga.c ../config.h getopt.h parport.h sysdeps.h \
+	fpga.h util.h epp_fpga.h epp_firmware.h eppchk_firmware.h \
+	ecp_firmware.h eppafsk_firmware.h eppsamp_firmware.h \
+	sppafsk_firmware.h
+eppfpga.o: eppfpga.c ../config.h getopt.h parport.h sysdeps.h fpga.h
+fpgatests.o: fpgatests.c ../config.h getopt.h parport.h sysdeps.h fpga.h \
+	util.h epp_fpga.h
+ppdirect.o: ppdirect.c parport.h ../config.h sysdeps.h getopt.h fpga.h
+ppdirectinit.o: ppdirectinit.c parport.h ../config.h sysdeps.h getopt.h \
+	fpga.h
+snprintpkt.o: snprintpkt.c ../config.h fpga.h sysdeps.h getopt.h \
+	parport.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man8
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+		mostlyclean-sbinPROGRAMS mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-sbinPROGRAMS \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+		distclean-sbinPROGRAMS distclean-tags distclean-generic \
+		clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+		maintainer-clean-compile maintainer-clean-sbinPROGRAMS \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-sbinPROGRAMS \
+distclean-sbinPROGRAMS clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS \
+uninstall-sbinPROGRAMS install-sbinPROGRAMS install-man8 uninstall-man8 \
+install-man uninstall-man tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/main/configfpga.c b/main/configfpga.c
new file mode 100644
index 0000000..1ce7311
--- /dev/null
+++ b/main/configfpga.c
@@ -0,0 +1,1032 @@
+/*****************************************************************************/
+
+/*
+ *      configfpga.c  --  FPGA configuration routines.
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#ifdef HAVE_SYS_PERM_H
+#include <sys/perm.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+#include "util.h"
+
+/* ---------------------------------------------------------------------- */
+
+#include "epp_fpga.h"
+#include "epp_firmware.h"
+#include "eppchk_firmware.h"
+#include "ecp_firmware.h"
+#include "eppafsk_firmware.h"
+#include "eppsamp_firmware.h"
+#include "sppafsk_firmware.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT data register */
+#define LPTDATA_SHIFT_TDI     0
+#define LPTDATA_SHIFT_TMS     2
+#define LPTDATA_TDI           (1<<LPTDATA_SHIFT_TDI)
+#define LPTDATA_TCK           0x02
+#define LPTDATA_TMS           (1<<LPTDATA_SHIFT_TMS)
+#define LPTDATA_INITBIAS      0x80
+
+/* Xilinx 4k JTAG instructions */
+#define XC4K_IRLENGTH   3
+#define XC4K_EXTEST     0
+#define XC4K_PRELOAD    1
+#define XC4K_CONFIGURE  5
+#define XC4K_BYPASS     7
+
+/* ---------------------------------------------------------------------- */
+
+static void jtag_shiftout(unsigned num, unsigned tdi, unsigned tms, unsigned char eppdata)
+{
+	unsigned char v;
+
+	eppdata &= ~(LPTDATA_TDI | LPTDATA_TMS | LPTDATA_TCK);
+	v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) | ((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+	parport_write_data(v);
+	while (num > 0) {
+		parport_write_data(v | LPTDATA_TCK);
+		tdi >>= 1;
+		tms >>= 1;
+		v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+			((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+		parport_write_data(v);
+		num--;
+	}
+}
+
+static unsigned jtag_shift(unsigned num, unsigned tdi, unsigned tms, unsigned char eppdata)
+{
+	unsigned char v;
+	unsigned in = 0, mask = 2;
+
+	eppdata &= ~(LPTDATA_TDI | LPTDATA_TMS | LPTDATA_TCK);
+	v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+		((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+	parport_write_data(v);
+	if (parport_read_status() & LPTSTAT_NINTR)
+		in |= 1;
+	while (num > 0) {
+		parport_write_data(v | LPTDATA_TCK);
+		tdi >>= 1;
+		tms >>= 1;
+		v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+			((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+		parport_write_data(v);
+		num--;
+		if (parport_read_status() & LPTSTAT_NINTR)
+			in |= mask;
+		mask <<= 1;
+	}
+	return in;
+}
+
+extern inline void jtag_reset_tap(void)
+{
+	jtag_shiftout(5, 0, ~0, 0);
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * this routine expects the target TAP to be in RUNTEST/IDLE
+ * state and leaves it there at exit 
+ */
+
+void boundary(unsigned int blen, const unsigned char *in, unsigned char *out, unsigned char eppdata)
+{
+	
+	jtag_shiftout(3, 0, 1, eppdata);
+	while (blen > 8) {
+		*out++ = jtag_shift(8, *in++, 0, eppdata);
+		blen -= 8;
+	}
+	*out = jtag_shift(blen, *in, 1 << (blen-1), eppdata);
+	jtag_shiftout(2, 0, 1, eppdata);
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Modem detection routines (assume the LPT port is there)
+ */
+
+static int detect_modem(void)
+{
+	unsigned int i;
+	unsigned char val;
+	unsigned char bd[FPGA_BOUNDSIZE];
+
+	/* pulse PROGRAM low */
+	parport_write_control(LPTCTRL_ADDRSTB);
+	parport_write_data(LPTDATA_TMS);
+	usleep(10);
+	parport_write_control(LPTCTRL_PROGRAM);
+	/* check if EPP NINIT is low */
+	val = parport_read_status();
+	if (val & LPTSTAT_WAIT) {
+		lprintf(0, "cannot hold down INIT\n");
+		return -1;
+	}
+	if (val & LPTSTAT_DONE) {
+		lprintf(0, "DONE high\n");
+		return -1;
+	}
+	/* FPGA held in configuration state due to INITBIAS low */
+	jtag_reset_tap(); /* force TAP controller into reset state */
+	/* check instruction register length */
+	jtag_shiftout(5, 0, 6, 0);   /* enter Shift-IR state */
+	jtag_shiftout(32, 0, 0, 0);  /* assume max. 32bit IR */
+	i = jtag_shift(32, 1, 0, 0); /* shift in a single bit */
+	if (hweight32(i) != 1) {
+		lprintf(0, "unable to detect JTAG IR (val %#06x)\n", i);
+		return -1;
+	}
+	if (ffs(i) != XC4K_IRLENGTH+1) {
+		lprintf(0, "size of JTAG IR not %d bits (val %#06x)\n", XC4K_IRLENGTH, i);
+		return -1;
+	}
+	/* shift in PRELOAD insn, goto SHIFTDR state */
+	jtag_shiftout(XC4K_IRLENGTH+4, XC4K_PRELOAD, 7 << (XC4K_IRLENGTH-1), 0); 
+	for (i = 0; i < 1000; i++) {
+		parport_write_data(0);
+		parport_write_data(LPTDATA_TCK);
+	}
+	parport_write_data(LPTDATA_TDI);
+	parport_write_data(LPTDATA_TDI | LPTDATA_TCK);
+	i = 1;
+	parport_write_data(0);
+	while (!(parport_read_status() & LPTSTAT_NINTR)) {
+		if (i >= 1000) {
+			lprintf(0, "JTAG DR too long\n");
+			return -1;
+		}
+		parport_write_data(LPTDATA_TCK);
+		parport_write_data(0);
+		i++;
+	}
+	if (i != FPGA_BOUND) {
+		lprintf(0, "size of JTAG DR not %d bits (val %d)\n", FPGA_BOUND, i);
+		return -1;
+	}
+	for (i = 0; i < FPGA_BOUND-1; i++) {
+		val = ((fpga_safebound[i >> 3] >> (i & 3)) & 1) << LPTDATA_SHIFT_TDI;
+		parport_write_data(val);
+		parport_write_data(val | LPTDATA_TCK);
+	}
+	/* i = data->h.h.boundarylength-1; */
+	val = (((fpga_safebound[(FPGA_BOUND-1) >> 3] >> ((FPGA_BOUND-1) & 3)) & 1)
+	       << LPTDATA_SHIFT_TDI) | LPTDATA_TMS;
+	parport_write_data(val);
+	parport_write_data(val | LPTDATA_TCK);
+	/* shift in EXTEST insn, goto TESTRESET state */
+	jtag_shiftout(7 + XC4K_IRLENGTH, XC4K_EXTEST << 5, 7 | (0x30 << XC4K_IRLENGTH), 0);  
+	boundary(FPGA_BOUND, fpga_safebound, bd, 0);
+	lprintf(1, "Modem jumpers: %c %c%c%c%c %c%c%c%c %c%c%c%c\n",
+		'0' + readboundary(bd, FPGA_PIN_RAMA0_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA1_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA2_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA3_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA4_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA5_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA6_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA7_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA8_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA9_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA10_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA11_I),
+		'0' + readboundary(bd, FPGA_PIN_RAMA12_I));
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void printconfig(const struct adapter_config *cfg)
+{
+	lprintf(1, "configuration: %sclk,%smodem,fclk=%d,bitrate=%d%s,%sextstat,%spttmute,filter=%d,gain=%d\n", 
+		cfg->intclk ? "int" : "ext",
+		cfg->extmodem ? "ext" : "int", cfg->fclk, cfg->bitrate,
+		cfg->loopback ? ",loopback" : "", cfg->extstat ? "" : "no", cfg->pttmute ? "" : "no",
+		cfg->filtmode, cfg->gain);
+}
+
+void parseconfig(struct adapter_config *cfg, const char *modestr)
+{
+	const char *cp;
+	/* temporary hack to ease the transition to the new format */
+	unsigned hasbitrate = 0, divider = 0;
+
+	/* meaningful frequencies/bit rates */
+	if (!cfg->fclk)
+		cfg->fclk = 19666600;
+	if (!cfg->bitrate)
+		cfg->bitrate = 9600;
+	if (cfg->fclk < 1000000)
+		cfg->fclk = 1000000;
+	if (cfg->fclk > 25000000)
+		cfg->fclk = 25000000;
+	if (cfg->bitrate < 4096)
+		cfg->bitrate = 4096;
+	if (cfg->bitrate > 1500000)
+		cfg->bitrate = 1500000;
+	/* command line parsing */
+	if (strstr(modestr, "intclk"))
+		cfg->intclk = 1;
+	if (strstr(modestr, "extclk"))
+		cfg->intclk = 0;
+	if (strstr(modestr, "intmodem"))
+		cfg->extmodem = 0;
+	if (strstr(modestr, "extmodem"))
+		cfg->extmodem = 1;
+	if (strstr(modestr, "noloopback"))
+		cfg->loopback = 0;
+	else if (strstr(modestr, "loopback"))
+		cfg->loopback = 1;
+	if (strstr(modestr, "noextstat"))
+		cfg->extstat = 0;
+	else if (strstr(modestr, "extstat"))
+		cfg->extstat = 1;
+	if (strstr(modestr, "nopttmute"))
+		cfg->pttmute = 0;
+	else if (strstr(modestr, "pttmute"))
+		cfg->pttmute = 1;
+	if ((cp = strstr(modestr, "fclk="))) {
+		cfg->fclk = strtoul(cp+5, NULL, 0);
+		if (cfg->fclk < 1000000)
+			cfg->fclk = 1000000;
+		if (cfg->fclk > 25000000)
+			cfg->fclk = 25000000;
+	}
+	if ((cp = strstr(modestr, "bitrate="))) {
+		cfg->bitrate = strtoul(cp+8, NULL, 0);
+		if (cfg->bitrate < 4096)
+			cfg->bitrate = 4096;
+		if (cfg->bitrate > 1500000)
+			cfg->bitrate = 1500000;
+		hasbitrate = 1;
+	}
+	if ((cp = strstr(modestr, "filter="))) {
+		cfg->filtmode = strtoul(cp+7, NULL, 0);
+		if (cfg->filtmode > 2)
+			cfg->filtmode = 2;
+	}
+	if ((cp = strstr(modestr, "gain="))) {
+		cfg->gain = strtoul(cp+5, NULL, 0);
+		if (cfg->gain < 1)
+			cfg->gain = 1;
+		if (cfg->gain > 32)
+			cfg->gain = 32;
+	}
+	if ((cp = strstr(modestr, "divider="))) {
+		divider = strtoul(cp+8, NULL, 0);
+		if (divider < 1)
+			divider = 1;
+		if (divider > 1024)
+			divider = 1024;
+	}
+	/* set bitrate if there was a divider= but no bitrate= */
+	if (!hasbitrate && divider) {
+		cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+		if (cfg->bitrate < 4096)
+			cfg->bitrate = 4096;
+		if (cfg->bitrate > 1500000)
+			cfg->bitrate = 1500000;
+	}		
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 0
+static void calc_crc(const unsigned char *data, unsigned int frame)
+{
+	unsigned int ptr = frame * FPGA_FRAMELEN + 41, i, creg = ~0, creg2 = creg;
+	unsigned char b1[8], b2[8], b3[8], *s1 = b1, *s2 = b2, *s3 = b3;
+
+	for (i = 0; i < FPGA_FRAMELEN-5; i++, ptr++) {
+		creg <<= 1;
+		creg |= ((data[ptr >> 3] >> ((~ptr) & 7)) ^ (creg >> 16) ^ (creg >> 1) ^ (creg >> 14)) & 1;
+		creg2 <<= 1;
+		if (((data[ptr >> 3] >> ((~ptr) & 7)) ^ (creg2 >> 16)) & 1)
+			creg2 ^= (1 << 0) | (1 << 2) | (1 << 15);
+	}
+	for (i = 0; i < 4; i++, ptr++) {
+		*s1++ = '0' + ((data[ptr >> 3]>> ((~ptr) & 7)) & 1);
+		creg <<= 1;
+		creg |= ((creg >> 16) ^ (creg >> 1) ^ (creg >> 14)) & 1;
+		*s2++ = '0' + ((creg >> 16) & 1);
+		creg2 <<= 1;
+		if (creg2 & (1 << 16))
+			creg2 ^= (1 << 0) | (1 << 2) | (1 << 15);
+		*s3++ = '0' + ((creg2 >> 16) & 1);
+	}
+	*s1 = *s2 = *s3 = 0;
+	printf("Frame %3d CRC file %s calc %s %s  ptr %5d\n", frame, b1, b2, b3, ptr);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int configure(const unsigned char *data, unsigned cfgsz)
+{
+	struct timeval time1, time2;
+	unsigned i, j, dt;
+	unsigned char val;
+	unsigned char lpstat;
+	unsigned char cfgbuf[16];
+	unsigned char *bp;
+	
+#if 0
+	for (i = 0; i < EPP_FPGANUMFRAMES; i++)
+		calc_crc(cfgdata, i);
+#endif
+	parport_write_data(0);
+	/* pulse PROGRAM low */
+	parport_write_control(LPTCTRL_ADDRSTB);
+	usleep(100);
+	parport_write_control(LPTCTRL_PROGRAM);
+	if (parport_read_status() & LPTSTAT_WAIT) {
+		lprintf(0, "FPGA configuration error (INIT prematurely high)\n");
+		return -1;
+	}
+	jtag_shiftout(12 + XC4K_IRLENGTH, XC4K_CONFIGURE << 10, 
+		      0xdf | (0x600 << XC4K_IRLENGTH), 0);
+	/* we are now in RUNTEST/IDLE state */
+	/* set initbias high; poll for init going high */
+	parport_write_data(LPTDATA_INITBIAS);
+	gettime(&time1);
+	while (!(parport_read_status() & LPTSTAT_WAIT)) {
+		gettime(&time2);
+		if (((time2.tv_sec - time1.tv_sec) * 1000000UL + 
+		     (time2.tv_usec - time1.tv_usec)) >= 500000) {
+			lprintf(0, "during configure: INIT stuck low\n");
+			return -1;
+		}
+	}
+	gettime(&time2);
+	lprintf(2, "Init was down for %ld us\n", (time2.tv_sec - time1.tv_sec) * 1000000UL +
+	       time2.tv_usec - time1.tv_usec);
+	jtag_shiftout(3, ~0, 1, LPTDATA_INITBIAS); /* advance to SHIFT-DR state */
+	for (i = 0; i < cfgsz; i++) {
+		dt = data[i];
+		bp = cfgbuf;
+		for (j = 0; j < 8; j++, dt >>= 1) {
+			val = LPTDATA_INITBIAS | ((dt << LPTDATA_SHIFT_TDI) & LPTDATA_TDI);
+			*bp++ = val;
+			*bp++ = val | LPTDATA_TCK;
+		}
+		if (parport_fpgaconfig_write(cfgbuf, 16) != 16) {
+			lprintf(0, "FPGA configuration write error\n");
+			return -1;
+		}
+		lpstat = parport_read_status();
+		if (lpstat & LPTSTAT_DONE) {
+			if (i >= cfgsz-1)
+				break;
+			lprintf(0, "FPGA configuration error (DONE prematurely high)\n");
+			return -1;
+		}
+		if (!(lpstat & LPTSTAT_WAIT)) {
+			lprintf(0, "FPGA configuration error (INIT down)\n");
+			return -1;
+		}
+	}
+	for (i = 0; ; ) {
+		lpstat = parport_read_status();
+		if (lpstat & LPTSTAT_DONE) 
+			break;
+		if (!(lpstat & LPTSTAT_WAIT)) {
+			lprintf(0, "FPGA configuration error (INIT down) (2)!!\n");
+			return -1;
+		}
+		parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI);
+		parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI | LPTDATA_TCK);
+		if ((++i) > 1000) {
+			lprintf(0, "DONE stuck low\n");
+			return -1;
+		}
+	}
+	/* generate a few additional clock cycles to ensure proper startup */
+	for (i = 0; i < 16; i++) {
+		parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI);
+		parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI | LPTDATA_TCK);
+	}
+	lprintf(1, "FPGA configuration completed successfully\n");
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned int readconfigrom(const unsigned char *firmware, const unsigned long rom[16])
+{
+	unsigned ret = 0, mask = 1, i, j;
+
+	for (i = 0; i < 16; i++, mask <<= 1) {
+		j = rom[i];
+		if (!(firmware[j >> 3] & (1 << (j & 7))))
+			ret |= mask;
+	}
+	return ret & 0xffff;
+}
+
+/* warning: if used, don't use CRC bitstream, there's currently no code to recalc the CRC */
+static void writeconfigrom(unsigned char *firmware, const unsigned long rom[16], unsigned val)
+{
+	unsigned mask = 1, i, j;
+
+	for (i = 0; i < 16; i++, mask <<= 1) {
+		j = rom[i];
+		if (val & mask) 
+			firmware[j >> 3] &= ~(1 << (j & 7));
+		else
+			firmware[j >> 3] |= 1 << (j & 7);
+	}
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Filter calc routines
+ */
+
+static const float filt_comp[32] = {
+   -0.0000,   -0.0071,   -0.0144,   -0.0160,
+   -0.0028,    0.0279,    0.0617,    0.0683,
+    0.0208,   -0.0765,   -0.1732,   -0.1877,
+   -0.0525,    0.2365,    0.5993,    0.9000,
+    1.0122,    0.8857,    0.5741,    0.2060,
+   -0.0825,   -0.2130,   -0.1919,   -0.0888,
+    0.0138,    0.0649,    0.0606,    0.0281,
+   -0.0021,   -0.0152,   -0.0139,   -0.0070
+};
+
+/* -------------------------------------------------------------------- */
+
+#define HAMMING(x) (0.54-0.46*cos(2*M_PI*(x)));
+
+extern inline float hamming(float x)
+{
+        return 0.54-0.46*cos(2*M_PI*x);
+}
+
+extern inline float sinc(float x)
+{
+        if (x == 0)
+                return 1;
+        x *= M_PI;
+        return sin(x)/x;
+}
+
+/* -------------------------------------------------------------------- */
+
+#if 0
+static void filt_printfcoeff(const float coeff[32])
+{
+	int i;
+
+	lprintf(3, "filter coefficients:");
+	for (i = 0; i < 32; i++) {
+		if (!(i & 7))
+			lprintf(3, "\n  ");
+		lprintf(3, "%6.2f", coeff[i]);
+	}
+	lprintf(3, '\n');
+}
+
+static void filt_printicoeff(const int coeff[32])
+{
+	int i;
+
+	lprintf(3, "filter coefficients:");
+	for (i = 0; i < 32; i++) {
+		if (!(i & 7))
+			lprintf(3, "\n  ");
+		lprintf(3, "%5i", coeff[i]);
+	}
+	lprintf(3, '\n');
+}
+#endif
+
+/* -------------------------------------------------------------------- */
+
+static void filt_genideal(float coeff[32])
+{
+	int i;
+
+	for (i = 0; i < 32; i++)
+		coeff[i] = hamming(i / 31.0) * sinc((i - 15.5) / 4.0);
+}
+
+/* -------------------------------------------------------------------- */
+
+static void filt_rom(const float coeff[32], unsigned rom[16])
+{
+	float max = 0.000001, s;
+	int ocoeff[32];
+	int i, j;
+
+	/* scale filter values */
+	for(i = 0; i < 4; i++) {
+		for(s = 0, j = i; j < 32; j += 4)
+			s += fabs(coeff[j]);
+		if (s > max)
+			max = s;
+	}
+	s = 126.0 / max;
+	for(i = 0; i < 32; i++)
+		ocoeff[i] = s * coeff[i];
+	/* convert to internal ROM representation */
+	memset(rom, 0, sizeof(rom[0])*16);
+	for (i = 0; i < 8; i++)
+		for (j = 0; j < 16; j++) {
+			if ((1 << i) & ocoeff[j])
+				rom[i] |= 1 << (((j + 1) & 3) | (j & 12));
+			if ((1 << i) & ocoeff[j+16])
+				rom[i+8] |= 1 << j;
+		}
+}
+
+/* ---------------------------------------------------------------------- */
+
+int adapter_start_no_firmware(void)
+{
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	return 0;
+}
+
+int adapter_start_eppchk(void)
+{
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	if (configure(eppchk_firmware, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	parport_write_control(LPTCTRL_PROGRAM);
+	return 0;
+}
+
+int adapter_start_epp(struct adapter_config *cfg)
+{
+	unsigned char cfgdata[FPGA_CONFIGSIZE];
+	float fcoeff[32];
+	unsigned filtrom[16];
+	int i;
+	unsigned char null = 0;
+	unsigned divider;
+
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	/* calculate the divider */
+	divider = (cfg->fclk + 8 * cfg->bitrate) / (16 * cfg->bitrate);
+	if (divider < 1)
+		divider = 1;
+	if (divider > 1024)
+		divider = 1024;
+	cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+	/* print configuration */
+	printconfig(cfg);
+	memcpy(cfgdata, epp_firmware, FPGA_CONFIGSIZE);
+	/* patch configuration ROM's */
+	if (cfg->intclk)
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_CLKSELROM, 0);
+	writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+	writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+	writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+	if (!cfg->extstat) {
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_STIROM, 0);
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_STOROM, 0);
+	}
+	if (cfg->loopback) {
+		writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID, 0xf0f0);
+		writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC, 0xff00); /* modem output clock */
+	} else if (cfg->extmodem) {
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID, 0xcccc);
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOC, 0x3030); /* TxC: falling edge */
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMDCD, 0x3333); /* DCD: inverted */
+		/* switch off scrambler and differential */
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOE, 0xaaaa);
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOS, 0xaaaa);
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIE, 0xaaaa);
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIS, 0xaaaa);
+        }
+        if (!cfg->pttmute)
+                writeconfigrom(cfgdata, epp_roms+EPP_ROM_PTTMUTEROM, 0xffff); 
+	if (cfg->filtmode == 1) {
+		filt_rom(filt_comp, filtrom);
+		for (i = 0; i < 16; i++)
+			writeconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0+16*i, filtrom[i]);
+	} else if (cfg->filtmode == 2) {
+		filt_genideal(fcoeff);
+		filt_rom(fcoeff, filtrom);
+		for (i = 0; i < 16; i++)
+			writeconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0+16*i, filtrom[i]);
+	}
+	/* print configuration ROM's (mainly a debugging action) */
+	lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n"
+		"config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n",
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_1),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_2),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_3),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_4),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_5),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_6),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_7),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_0),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_1),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_2),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_3),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_4),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_5),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_6),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_7));
+	lprintf(2, "config: ClkSel: %04x  PTT mute: %04x\n", 
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_CLKSELROM),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_PTTMUTEROM));
+	lprintf(2, "config: Div: %04x %04x %04x\n", 
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM0),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM1),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM2));
+	lprintf(2, "config: DCD: %04x\n", 
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMDCD));
+	lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n",
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIE),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIS));
+	lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n", 
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOC),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOE),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOS));
+	lprintf(2, "config: StI: %04x StO: %04x\n", 
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_STIROM),
+		readconfigrom(cfgdata, epp_roms+EPP_ROM_STOROM));
+	/* finally download code to FPGA */
+	if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	parport_write_control(LPTCTRL_PROGRAM);
+	if (parport_epp_write_addr(&null, 1) != 1) { /* reset modem */
+		lprintf(0, "EPP timeout\n");
+		return -1;
+	}
+	return 0;
+}
+
+int adapter_start_ecp(struct adapter_config *cfg)
+{
+	unsigned char cfgdata[FPGA_CONFIGSIZE];
+	float fcoeff[32];
+	unsigned filtrom[16];
+	int i;
+	unsigned divider;
+
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	/* calculate the divider */
+	divider = (cfg->fclk + 8 * cfg->bitrate) / (16 * cfg->bitrate);
+	if (divider < 1)
+		divider = 1;
+	if (divider > 1024)
+		divider = 1024;
+	cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+	/* print configuration */
+	printconfig(cfg);
+	memcpy(cfgdata, ecp_firmware, FPGA_CONFIGSIZE);
+	/* patch configuration ROM's */
+	if (cfg->intclk)
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CLKSELROM, 0);
+	writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+	writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+	writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+	if (cfg->loopback) {
+		writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID, 0xf0f0);
+		writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC, 0xff00); /* modem output clock */
+	} else if (cfg->extmodem) {
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID, 0xcccc);
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOC, 0x3030); /* TxC: falling edge */
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMDCD, 0x3333); /* DCD: inverted */
+		/* switch off scrambler and differential */
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOE, 0xaaaa);
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOS, 0xaaaa);
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIE, 0xaaaa);
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIS, 0xaaaa);
+        }
+        if (!cfg->pttmute)
+                writeconfigrom(cfgdata, ecp_roms+ECP_ROM_PTTMUTEROM, 0xffff); 
+	if (cfg->filtmode == 1) {
+		filt_rom(filt_comp, filtrom);
+		for (i = 0; i < 16; i++)
+			writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0+16*i, filtrom[i]);
+	} else if (cfg->filtmode == 2) {
+		filt_genideal(fcoeff);
+		filt_rom(fcoeff, filtrom);
+		for (i = 0; i < 16; i++)
+			writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0+16*i, filtrom[i]);
+	}
+	/* print configuration ROM's (mainly a debugging action) */
+	lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n"
+		"config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n",
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_1),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_2),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_3),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_4),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_5),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_6),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_7),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_0),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_1),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_2),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_3),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_4),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_5),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_6),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_7));
+	lprintf(2, "config: ClkSel: %04x  PTT mute: %04x\n", 
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_CLKSELROM),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_PTTMUTEROM));
+	lprintf(2, "config: Div: %04x %04x %04x\n", 
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM0),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM1),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM2));
+	lprintf(2, "config: DCD: %04x\n", 
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMDCD));
+	lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n",
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIE),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIS));
+	lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n", 
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOC),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOE),
+		readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOS));
+	/* finally download code to FPGA */
+	if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	return 0;
+}
+
+int adapter_start_eppafsk(struct adapter_config *cfg)
+{
+	unsigned char cfgdata[FPGA_CONFIGSIZE];
+	unsigned char null = 0;
+	unsigned divider;
+
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	/* calculate the divider */
+	divider = (cfg->fclk + 32 * cfg->bitrate) / (64 * cfg->bitrate);
+	if (divider < 1)
+		divider = 1;
+	if (divider > 1024)
+		divider = 1024;
+	cfg->bitrate = (cfg->fclk + 32 * divider) / (64 * divider);
+	/* print configuration */
+	printconfig(cfg);
+	memcpy(cfgdata, eppafsk_firmware, FPGA_CONFIGSIZE);
+	/* patch configuration ROM's */
+	if (cfg->intclk)
+                writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_CLKSELROM, 0);
+        if (!cfg->pttmute)
+                writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_PTTMUTEROM, 0xffff); 
+	writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+	writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+	writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+	/* print configuration ROM's (mainly a debugging action) */
+	lprintf(2, "config: ClkSel: %04x  PTT mute: %04x\n", 
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_CLKSELROM),
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_PTTMUTEROM));
+	lprintf(2, "config: Div: %04x %04x %04x\n", 
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM0),
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM1),
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM2));
+	lprintf(2, "config: IE: %04x OE: %04x\n",
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_SWROMIE),
+		readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_SWROMOE));
+	/* finally download code to FPGA */
+	if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	parport_write_control(LPTCTRL_PROGRAM);
+	if (parport_epp_write_addr(&null, 1) != 1) {  /* reset modem */
+		lprintf(0, "EPP timeout\n");
+		return -1;
+	}
+	return 0;
+}
+
+int adapter_start_sppafsk(struct adapter_config *cfg)
+{
+	unsigned char cfgdata[FPGA_CONFIGSIZE];
+	unsigned divider;
+
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	/* calculate the divider */
+	divider = (cfg->fclk + 32 * cfg->bitrate) / (64 * cfg->bitrate);
+	if (divider < 1)
+		divider = 1;
+	if (divider > 1024)
+		divider = 1024;
+	cfg->bitrate = (cfg->fclk + 32 * divider) / (64 * divider);
+	/* print configuration */
+	printconfig(cfg);
+	memcpy(cfgdata, sppafsk_firmware, FPGA_CONFIGSIZE);
+	/* patch configuration ROM's */
+	if (cfg->intclk)
+                writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_CLKSELROM, 0);
+        if (!cfg->pttmute)
+                writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_PTTMUTEROM, 0xffff); 
+	writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+	writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+	writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+	/* print configuration ROM's (mainly a debugging action) */
+	lprintf(2, "config: ClkSel: %04x  PTT mute: %04x\n", 
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_CLKSELROM),
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_PTTMUTEROM));
+	lprintf(2, "config: Div: %04x %04x %04x\n", 
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM0),
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM1),
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM2));
+	lprintf(2, "config: IE: %04x OE: %04x\n",
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_SWROMIE),
+		readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_SWROMOE));
+	/* finally download code to FPGA */
+	if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	parport_write_control(LPTCTRL_PROGRAM);
+	sppafsk_wrcmd(0x00);
+	return 0;
+}
+
+int adapter_start_eppsamp(struct adapter_config *cfg)
+{
+	unsigned char cfgdata[FPGA_CONFIGSIZE];
+	int i;
+	unsigned char buf;
+	unsigned divider;
+
+	if (FPGA_CONFIGSIZE != sizeof(epp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppchk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(ecp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) || 
+	    FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+		abort();
+	if (detect_modem())
+		return -3;
+	/* calculate the divider */
+	divider = (cfg->fclk + cfg->bitrate / 2) / cfg->bitrate;
+	if (divider < 1)
+		divider = 1;
+	if (divider > 4096)
+		divider = 4096;
+	cfg->bitrate = (cfg->fclk + divider / 2) / divider;
+	/* print configuration */
+	printconfig(cfg);
+	memcpy(cfgdata, eppsamp_firmware, FPGA_CONFIGSIZE);
+	/* patch configuration ROM's */
+	if (cfg->intclk)
+                writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_CLKSELROM, 0);
+	writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+	writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+	writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM2, 1 << (((divider-1) >> 8) & 0xf));
+	/* calculate the gain */
+	i = (cfg->gain << 24) / divider;
+	if (i > 65535)
+		i = 65535;
+	if (i < 1)
+		i = 1;
+	writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_MULROM, i);
+       	/* print configuration ROM's (mainly a debugging action) */
+	lprintf(2, "config: ClkSel: %04x  InputGain: %04x\n", 
+		readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_CLKSELROM),
+		readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_MULROM));
+	lprintf(2, "config: Div: %04x %04x %04x\n", 
+		readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM0),
+		readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM1),
+		readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM2));
+	/* finally download code to FPGA */
+	if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+		reset_modem();
+		return -4;
+	}
+	parport_write_control(LPTCTRL_PROGRAM);
+	/* set Modem Disconnect Data Output register to 0x1f */
+	buf = 6;
+	if (parport_epp_write_addr(&buf, 1) != 1)
+		goto epperr;
+	buf = 0x1f;
+	if (parport_epp_write_data(&buf, 1) != 1)
+		goto epperr;
+	/* set Modem Disconnect Tristate register to 0x17 */
+	buf = 6;
+	if (parport_epp_write_addr(&buf, 1) != 1)
+		goto epperr;
+	buf = 0x17;
+	if (parport_epp_write_data(&buf, 1) != 1)
+		goto epperr;
+	/* reset modem */
+	buf = 0x1f;
+	if (parport_epp_write_addr(&buf, 1) != 1)
+		goto epperr;
+	return 0;
+
+epperr:
+	lprintf(0, "EPP timeout\n");
+	return -1;	
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ecp_firmware.h b/main/ecp_firmware.h
new file mode 100644
index 0000000..d6d8d7a
--- /dev/null
+++ b/main/ecp_firmware.h
@@ -0,0 +1,1617 @@
+/*****************************************************************************/
+
+/*
+ *      ecp_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define ECP_FIRMWAREDATE "20000402"
+
+/* firmware */
+static const unsigned char ecp_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xde, 
+	0xfd, 0xed, 0x57, 0xdf, 0xde, 0xbd, 0xed, 0x7d, 
+	0xef, 0xfe, 0xfe, 0xee, 0xef, 0xef, 0xfe, 0xfe, 
+	0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xdb, 
+	0xff, 0xaf, 0xef, 0x7f, 0xfe, 0xd7, 0xff, 0x7f, 
+	0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xb9, 0xff, 0xfc, 0xed, 0xcf, 
+	0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6, 
+	0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f, 
+	0xde, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77, 
+	0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda, 
+	0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xfd, 
+	0xf5, 0xd3, 0x5f, 0x3f, 0xfd, 0xf5, 0xd3, 0x9f, 
+	0xfe, 0x7a, 0xe9, 0xaf, 0x9f, 0xfe, 0xfa, 0xe9, 
+	0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9d, 0x7f, 0xde, 0xf9, 0xbf, 0xf9, 0xff, 
+	0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff, 
+	0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 
+	0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xba, 0xaf, 0xae, 
+	0xfa, 0xfa, 0xfa, 0xaf, 0xad, 0x7b, 0xdd, 0x57, 
+	0xd7, 0x7f, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b, 
+	0xff, 0xff, 0xee, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0x7e, 0xff, 0xfd, 0xf7, 0xdf, 0x6f, 
+	0xff, 0xfd, 0xf6, 0xff, 0xc6, 0xff, 0xdd, 0x7f, 
+	0xff, 0x3d, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 
+	0xbd, 0xff, 0xbe, 0xfb, 0xef, 0xbb, 0xff, 0xfe, 
+	0xbd, 0xf9, 0xff, 0x9f, 0x7f, 0xfb, 0xfd, 0xf7, 
+	0x9f, 0x7f, 0xff, 0x99, 0xcf, 0xbf, 0xfd, 0xfc, 
+	0xfb, 0xcf, 0xbe, 0xff, 0xfc, 0x6f, 0xf4, 0xff, 
+	0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xde, 
+	0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xff, 0x9b, 0xfb, 0x7f, 0xff, 0xfd, 0xc7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xef, 0xfe, 
+	0xf3, 0xef, 0xbf, 0xff, 0xfe, 0xbb, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xdf, 0xfd, 0xc7, 0xdd, 0x7f, 
+	0xcf, 0xfd, 0xef, 0xbf, 0xfe, 0xfc, 0xf3, 0xcf, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0x73, 
+	0xcf, 0x1f, 0xff, 0xbc, 0xf3, 0xcf, 0x7d, 0x96, 
+	0xb8, 0xe7, 0x9f, 0x3f, 0xfe, 0xf9, 0x67, 0xff, 
+	0x6e, 0xde, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xdd, 0xf7, 0xdf, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 
+	0xff, 0xfc, 0xeb, 0xef, 0xbf, 0x9b, 0xdd, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0xcd, 0x3f, 0xdb, 0xec, 
+	0xe7, 0x9f, 0x7f, 0xde, 0x79, 0xe7, 0x9e, 0x7d, 
+	0xfe, 0xcd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xe7, 0x5e, 0xaf, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0x7d, 0xf7, 0xff, 0x6f, 0xfe, 0x9f, 0xfd, 0xd6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0xdf, 0x7e, 
+	0x7b, 0xad, 0xb7, 0xdf, 0x3e, 0xeb, 0xed, 0xff, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xf9, 0xff, 0xff, 0xfd, 0xfe, 0xfb, 0xef, 
+	0xff, 0xff, 0xfe, 0xff, 0xee, 0xe6, 0xff, 0x7f, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbb, 0xff, 0xff, 0xe5, 0xff, 0xdb, 0xff, 
+	0xeb, 0xaf, 0xb9, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x6f, 0xf6, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 
+	0xfd, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xfe, 0x9a, 0xff, 0x7f, 0xff, 0xfd, 
+	0xf7, 0x5f, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x7b, 0xbd, 
+	0xe6, 0xff, 0xd3, 0xfd, 0xff, 0xff, 0xff, 0xcb, 
+	0xff, 0xaf, 0xfc, 0xab, 0xff, 0x5f, 0xfe, 0x7f, 
+	0xe5, 0xfd, 0xdf, 0xdd, 0xbf, 0xf9, 0xff, 0x7f, 
+	0xff, 0xff, 0xef, 0xd7, 0xff, 0xfe, 0xdb, 0xbf, 
+	0xfb, 0xff, 0xf5, 0xff, 0xff, 0xfe, 0xff, 0xf7, 
+	0x7f, 0x6f, 0xf6, 0x7f, 0xf7, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x9b, 0xfd, 
+	0xfd, 0xff, 0xef, 0xbf, 0xfd, 0xfd, 0xff, 0xfd, 
+	0xbf, 0xfd, 0xef, 0xbf, 0xff, 0xef, 0xfb, 0xef, 
+	0xfb, 0x7f, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7b, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbd, 
+	0xf9, 0xff, 0xfa, 0xff, 0xef, 0xfb, 0xff, 0xe8, 
+	0xbf, 0xaf, 0x7d, 0xfb, 0xef, 0x7f, 0xff, 0xff, 
+	0xf7, 0x7f, 0xff, 0xf7, 0x6f, 0xfe, 0xbf, 0xfe, 
+	0xff, 0xef, 0xff, 0xbe, 0xff, 0xff, 0xdb, 0xf5, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xfd, 0xdd, 0xfe, 0xff, 0xff, 
+	0xf6, 0xff, 0xd6, 0xff, 0xdf, 0x7f, 0xf7, 0x7d, 
+	0xb7, 0xdf, 0x7f, 0xff, 0xff, 0xb7, 0xe6, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0x3a, 0xdf, 0xff, 0xff, 
+	0xfd, 0xff, 0xbf, 0xef, 0xfb, 0xff, 0xff, 0x7f, 
+	0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xef, 0xfb, 0xef, 
+	0xbf, 0xff, 0xf6, 0xfb, 0xef, 0xff, 0xff, 0x6e, 
+	0xfe, 0xff, 0xbf, 0xff, 0xff, 0x6f, 0xff, 0xff, 
+	0x7d, 0x73, 0xfd, 0xfe, 0x7b, 0xef, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0x9b, 0xff, 0xfe, 0xff, 
+	0x7f, 0xff, 0xbb, 0xff, 0x7b, 0xff, 0xfc, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 
+	0xff, 0xe6, 0xf7, 0xff, 0xff, 0xbf, 0xfe, 0xfb, 
+	0xff, 0xff, 0xff, 0x3f, 0x8f, 0xbf, 0x5f, 0xfe, 
+	0xb9, 0xe7, 0x3c, 0xfb, 0xeb, 0xbf, 0xf9, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfd, 0xfe, 
+	0xff, 0xf7, 0xff, 0xff, 0x3f, 0xe7, 0xfc, 0xff, 
+	0xfb, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xf7, 
+	0xaf, 0xf5, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 
+	0xbf, 0xdf, 0x7d, 0xff, 0xff, 0xff, 0xff, 0x9b, 
+	0xf2, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0x6f, 0xff, 
+	0xf0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xfd, 0xbf, 0xe6, 0xff, 0xff, 0xef, 
+	0xbf, 0xff, 0xfb, 0xeb, 0xbf, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 
+	0xb7, 0x69, 0xff, 0x7f, 0xf9, 0xed, 0xfd, 0x5f, 
+	0xfa, 0xfb, 0xff, 0xd7, 0xbd, 0xf6, 0xdf, 0x6b, 
+	0xaf, 0xbd, 0xf6, 0xdf, 0xfe, 0x6f, 0xdc, 0xff, 
+	0xdf, 0x7e, 0xed, 0xbf, 0xbf, 0xff, 0xfe, 0xff, 
+	0x7c, 0xe7, 0xfd, 0x7f, 0xde, 0x79, 0xe7, 0xfd, 
+	0xff, 0x5f, 0x99, 0xfb, 0xf5, 0xaf, 0xff, 0xfb, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xf7, 0xde, 0x7b, 
+	0xcd, 0xbc, 0xf7, 0xde, 0x7b, 0xcd, 0xee, 0xc6, 
+	0xfe, 0xff, 0xef, 0x9f, 0xfb, 0xef, 0xab, 0xf7, 
+	0xfe, 0xff, 0x9d, 0x77, 0xde, 0x31, 0xe7, 0x9d, 
+	0x77, 0xde, 0xb1, 0x93, 0xb9, 0xff, 0x3f, 0xfb, 
+	0xeb, 0xff, 0xf7, 0x7a, 0xea, 0xff, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff, 
+	0x66, 0xec, 0xff, 0x5f, 0x7f, 0xed, 0xff, 0xbf, 
+	0x8f, 0xfa, 0xff, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7, 
+	0x5f, 0x7f, 0xfd, 0xfd, 0xbf, 0x19, 0xf7, 0xfe, 
+	0xff, 0xef, 0xfe, 0xff, 0xf6, 0xdb, 0xff, 0xff, 
+	0xfb, 0xf9, 0xe7, 0xff, 0x7f, 0xfe, 0xf9, 0xe7, 
+	0xdf, 0x76, 0xa6, 0x7d, 0xfd, 0xbf, 0xf2, 0xff, 
+	0x5f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xfb, 
+	0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xad, 0xb9, 
+	0xee, 0xfb, 0xef, 0xaf, 0xff, 0xb6, 0x7b, 0xed, 
+	0xbf, 0xd7, 0x7d, 0xf7, 0xd9, 0x7f, 0xdb, 0x7d, 
+	0xf6, 0xd9, 0xab, 0x6e, 0xee, 0xff, 0xff, 0xff, 
+	0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xbf, 
+	0x7f, 0xfe, 0xff, 0xff, 0x9f, 0x7f, 0xfe, 0x3b, 
+	0x9b, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 
+	0xff, 0xff, 0xbf, 0xff, 0xf7, 0xef, 0xff, 0xff, 
+	0xff, 0xf7, 0xef, 0xdf, 0xef, 0xe6, 0xf6, 0xff, 
+	0xff, 0xfd, 0xff, 0x7b, 0xfd, 0xaf, 0xdf, 0xff, 
+	0xf5, 0xd7, 0x7f, 0x7f, 0xfd, 0xf5, 0xdf, 0x5f, 
+	0x7f, 0xbb, 0x61, 0xff, 0xff, 0x9f, 0x7e, 0xff, 
+	0xfa, 0xf7, 0xcb, 0x7d, 0x5f, 0xf1, 0xc5, 0x17, 
+	0x5f, 0x7c, 0xf1, 0xcd, 0x13, 0x7f, 0x6f, 0xfa, 
+	0xff, 0xdf, 0xfa, 0xff, 0xaf, 0xbb, 0xef, 0xfa, 
+	0xff, 0x7f, 0xff, 0xfd, 0xf6, 0xdf, 0x7f, 0xaf, 
+	0xfd, 0xf7, 0xff, 0x9b, 0xfe, 0xff, 0x8f, 0x3e, 
+	0xff, 0xe8, 0xb3, 0x8f, 0x3e, 0xff, 0xf4, 0xc7, 
+	0x1f, 0x7d, 0xf6, 0xd9, 0xc7, 0x1f, 0x7f, 0xfe, 
+	0xe6, 0xff, 0x9f, 0xaf, 0xbf, 0xfe, 0xf7, 0xdf, 
+	0x2f, 0xbf, 0xfc, 0xfd, 0xf7, 0xff, 0x7f, 0xff, 
+	0xfd, 0xd7, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xff, 
+	0xeb, 0xaf, 0xff, 0xfd, 0xff, 0xcf, 0x2f, 0xff, 
+	0xfd, 0xf7, 0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xef, 0xeb, 0xaf, 
+	0xfe, 0xfd, 0xfa, 0xeb, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xd7, 0xff, 0x1b, 0xf6, 
+	0x7f, 0xff, 0xff, 0xfa, 0xcb, 0x7f, 0xff, 0xfc, 
+	0xf2, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x3f, 0xfd, 
+	0xff, 0xfe, 0xfb, 0xef, 0xfe, 0xf7, 0xfc, 0x97, 
+	0xde, 0x7f, 0xf9, 0xfd, 0x97, 0xdf, 0xff, 0xbf, 
+	0x39, 0xff, 0x8f, 0xbf, 0xfe, 0x78, 0xab, 0x2e, 
+	0xbe, 0xfe, 0xba, 0x56, 0x5a, 0x6f, 0xb5, 0xd5, 
+	0x56, 0x5b, 0x6d, 0xed, 0x6d, 0x3e, 0xff, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfe, 0xee, 0xe1, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xbf, 
+	0xe7, 0x9b, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xb7, 0xff, 0xae, 0x6f, 0xbf, 0xff, 0xdf, 0xff, 
+	0xfe, 0x7f, 0xee, 0xbf, 0xff, 0xbf, 0xe6, 0xfd, 
+	0xfd, 0xf7, 0xcf, 0xff, 0xff, 0xfe, 0xe7, 0xff, 
+	0xd7, 0xef, 0xfb, 0xef, 0xfd, 0xff, 0xff, 0x7f, 
+	0xef, 0xbf, 0xbf, 0xf1, 0xff, 0xff, 0xaf, 0xaf, 
+	0xbf, 0xfb, 0xfa, 0xeb, 0x29, 0xff, 0xfd, 0xf9, 
+	0xe7, 0x7f, 0xef, 0xfd, 0xfd, 0xe7, 0xfd, 0x67, 
+	0xfc, 0xff, 0xff, 0xff, 0xeb, 0xbf, 0xff, 0xfa, 
+	0xf7, 0xe7, 0xf7, 0xe7, 0xff, 0xbf, 0xfb, 0xff, 
+	0xff, 0xdb, 0xff, 0x7f, 0x98, 0xf7, 0xfc, 0xbf, 
+	0xff, 0xf9, 0xff, 0xac, 0xbf, 0xee, 0xff, 0xd3, 
+	0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0xc6, 0xef, 0xdf, 0x7f, 0xbf, 0xf4, 0xff, 
+	0x7f, 0x4f, 0xf3, 0x7f, 0xf9, 0xff, 0xff, 0xef, 
+	0xfb, 0xdf, 0xff, 0xff, 0xbb, 0x9f, 0xb1, 0xfd, 
+	0xff, 0xff, 0xff, 0xdf, 0xbf, 0xf7, 0xad, 0xff, 
+	0xf7, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0x6f, 0xfc, 0xff, 0xff, 0xef, 0xbf, 
+	0xdf, 0xff, 0xef, 0xcf, 0xff, 0x5f, 0x1f, 0xf5, 
+	0xb8, 0xe7, 0x9f, 0x77, 0xfe, 0x79, 0xff, 0x98, 
+	0xff, 0xfe, 0xff, 0x9f, 0xff, 0xf7, 0xfb, 0xfe, 
+	0xf3, 0xdf, 0xff, 0xff, 0xef, 0xfb, 0xce, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xff, 0x26, 0xfe, 0xff, 0xbe, 
+	0xff, 0xfd, 0xff, 0xdf, 0xf9, 0xbf, 0xda, 0xff, 
+	0xff, 0xbf, 0xff, 0xbc, 0xfb, 0xef, 0xbf, 0xff, 
+	0xab, 0xf9, 0xff, 0xff, 0xe7, 0xaf, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xde, 0xef, 0xef, 0xbf, 0xbf, 
+	0xfd, 0xff, 0xff, 0xbf, 0xff, 0x6f, 0xf6, 0xff, 
+	0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0x7f, 0x1b, 0xfe, 0x6c, 0xfe, 0xfe, 0x5f, 
+	0x3a, 0xaf, 0xbd, 0x5e, 0x27, 0x7f, 0xf3, 0xcd, 
+	0x35, 0xd7, 0x7a, 0x6b, 0xe5, 0xf7, 0x3f, 0x66, 
+	0x7f, 0xfa, 0xef, 0xff, 0xff, 0xee, 0xeb, 0xaf, 
+	0xe7, 0xcb, 0xef, 0x7c, 0xd8, 0x4e, 0x9b, 0x6f, 
+	0xb6, 0xff, 0xfa, 0xb7, 0xf9, 0x9f, 0x6e, 0xfb, 
+	0xff, 0xbf, 0x5f, 0xfb, 0xeb, 0x7f, 0xff, 0xbb, 
+	0xf4, 0x9f, 0x7f, 0xfe, 0xfb, 0xe7, 0x94, 0xff, 
+	0x6f, 0xd6, 0xa7, 0x5f, 0xfb, 0xff, 0xef, 0xf7, 
+	0xfe, 0xfa, 0xd7, 0xff, 0x7d, 0xfd, 0xfd, 0x77, 
+	0xff, 0x7d, 0xf7, 0xd5, 0x5f, 0x9b, 0xfb, 0xef, 
+	0xdb, 0x6e, 0x9a, 0x79, 0xab, 0xfd, 0x55, 0xf7, 
+	0xd7, 0xfe, 0xfb, 0xe5, 0xb6, 0xfb, 0x7e, 0xb3, 
+	0xef, 0xed, 0x66, 0xfe, 0xfb, 0xe7, 0xbe, 0xf6, 
+	0xee, 0x6b, 0x36, 0xd7, 0xff, 0xd5, 0x7f, 0xdf, 
+	0x1d, 0x37, 0xfe, 0x77, 0xff, 0xfd, 0xb3, 0xb1, 
+	0xfe, 0xfe, 0xfa, 0xaf, 0xb5, 0xff, 0xfb, 0x5f, 
+	0xfc, 0x73, 0x9d, 0xf5, 0xdf, 0x71, 0xef, 0xf7, 
+	0xd7, 0x56, 0xff, 0x66, 0xee, 0xff, 0xff, 0xfb, 
+	0x6f, 0xeb, 0xbc, 0xfe, 0x6f, 0xff, 0x5c, 0x79, 
+	0xa5, 0x9d, 0x72, 0xf6, 0x7b, 0x6f, 0xb5, 0x3a, 
+	0x9b, 0xf7, 0xff, 0xbb, 0xff, 0x3f, 0xdf, 0xff, 
+	0xdb, 0xbf, 0xff, 0xbb, 0xfe, 0xd2, 0x8b, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0xb7, 0xe6, 0xfd, 0xaf, 
+	0xfc, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xfe, 0xf9, 
+	0xcf, 0x3f, 0xeb, 0xcc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xbd, 0x91, 0xff, 0xfb, 0xeb, 0xb5, 0xff, 
+	0xfc, 0x7b, 0x8d, 0x37, 0xfe, 0xe9, 0xe7, 0x9d, 
+	0x7f, 0xfe, 0xf1, 0xc7, 0x1f, 0xef, 0x66, 0xe6, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x7f, 0xbf, 
+	0xff, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x3f, 0x3f, 0x9b, 0xfb, 0xff, 0xbf, 0xff, 
+	0xff, 0xbf, 0xfb, 0xef, 0xff, 0xff, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xa6, 0xfe, 0x7f, 0xff, 0xf7, 0xf7, 0x47, 0xeb, 
+	0x2d, 0xbe, 0xf8, 0x85, 0x17, 0x5e, 0xfa, 0xe1, 
+	0x8f, 0x3f, 0xfe, 0xf8, 0xab, 0x79, 0xdf, 0xa7, 
+	0xdf, 0xbd, 0xf6, 0xfb, 0x6b, 0x8b, 0x2f, 0x7e, 
+	0xf1, 0xc5, 0x13, 0x6f, 0xfc, 0xf7, 0xdf, 0x7f, 
+	0x7f, 0x6f, 0xfe, 0xb7, 0xce, 0x7f, 0xef, 0xff, 
+	0xff, 0xef, 0x6a, 0xa9, 0x5f, 0xff, 0xff, 0xff, 
+	0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 
+	0xaf, 0xcf, 0x3f, 0xfb, 0xdc, 0xe3, 0x87, 0x3e, 
+	0x7a, 0x94, 0xe1, 0x86, 0x1f, 0x76, 0xf8, 0xe1, 
+	0x87, 0x1f, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 0xff, 
+	0xfe, 0xf7, 0xeb, 0xe7, 0xbf, 0xfe, 0xcf, 0x17, 
+	0x5f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xef, 0xfa, 0xeb, 0xbf, 0xff, 0xfd, 0x7b, 
+	0xef, 0xff, 0xdf, 0xbf, 0xf4, 0xd2, 0x6d, 0xaf, 
+	0xdf, 0x7e, 0xfb, 0xeb, 0x6f, 0xfe, 0xff, 0xfb, 
+	0xf2, 0xaf, 0xff, 0xfe, 0xfb, 0xee, 0xab, 0xfd, 
+	0xd5, 0x57, 0xdf, 0x5c, 0xf5, 0xcd, 0x37, 0x5f, 
+	0x7d, 0x1b, 0xfe, 0xff, 0xbf, 0xfc, 0xfb, 0xff, 
+	0xef, 0xf7, 0xfe, 0xff, 0xfd, 0xe3, 0x8f, 0x5f, 
+	0xf6, 0xf8, 0xe5, 0x97, 0x3f, 0x3e, 0xe6, 0xfe, 
+	0xd3, 0xff, 0xbf, 0xfd, 0x5f, 0xdf, 0x6f, 0xfc, 
+	0xff, 0x9e, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xb7, 0xe9, 0xff, 0xae, 0xbf, 0xee, 
+	0xe2, 0x8b, 0x0f, 0xbb, 0xfc, 0xf2, 0xd7, 0x5f, 
+	0x7d, 0xfd, 0xd5, 0xd7, 0x5f, 0x7e, 0xed, 0x6f, 
+	0xfe, 0xff, 0xef, 0xf3, 0xfb, 0x3e, 0xbf, 0xfb, 
+	0xfe, 0xcf, 0x77, 0xfe, 0xd9, 0x77, 0xdf, 0x7f, 
+	0xfa, 0xd9, 0x67, 0xff, 0x1b, 0xff, 0xf7, 0xaf, 
+	0xbe, 0xb7, 0xf9, 0xfb, 0xf3, 0xaf, 0xcb, 0x6d, 
+	0xaf, 0xff, 0x6f, 0xfe, 0xeb, 0xb7, 0xe7, 0x4e, 
+	0x7f, 0xe6, 0x7f, 0xff, 0x7f, 0xff, 0xbf, 0xfb, 
+	0x7d, 0xfb, 0xbd, 0x7d, 0xf7, 0xde, 0x7f, 0xff, 
+	0xfd, 0xd7, 0xdf, 0x7f, 0xff, 0xbf, 0xd9, 0xff, 
+	0xfc, 0xe3, 0xcf, 0xef, 0xdd, 0xff, 0xed, 0xb7, 
+	0x7d, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0x7f, 0xfc, 0x67, 0xfe, 0xff, 0xbf, 0xfe, 0xfe, 
+	0xff, 0xff, 0xfb, 0xff, 0xff, 0xda, 0xfe, 0xff, 
+	0xff, 0xfc, 0xef, 0xef, 0xff, 0x7f, 0xff, 0x9a, 
+	0xff, 0x1f, 0xff, 0xcf, 0xf9, 0xff, 0xbf, 0x3b, 
+	0xee, 0xf8, 0xdf, 0xfd, 0xfe, 0xdf, 0x7f, 0xff, 
+	0x7b, 0xff, 0xff, 0xff, 0x66, 0xff, 0xfb, 0xff, 
+	0xbf, 0xee, 0xff, 0xf3, 0x67, 0xaf, 0xf7, 0xed, 
+	0xff, 0xff, 0xf6, 0xfb, 0xef, 0xaf, 0xff, 0xff, 
+	0xb7, 0xf9, 0xdf, 0xeb, 0xff, 0xff, 0xfd, 0xd7, 
+	0x7e, 0x6f, 0xef, 0x95, 0xc9, 0x7f, 0x7f, 0xff, 
+	0xff, 0x2f, 0xbf, 0xff, 0xfb, 0x6e, 0xfe, 0xdf, 
+	0xdf, 0xf6, 0xe3, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xfa, 0xc2, 0x8f, 0x37, 0xfe, 
+	0xf8, 0xff, 0x9b, 0xf7, 0xff, 0x9e, 0xfb, 0xfd, 
+	0xff, 0xff, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xed, 
+	0xed, 0xee, 0xb7, 0xdf, 0x7e, 0xed, 0xfc, 0xa6, 
+	0xfe, 0x6a, 0xff, 0xff, 0x7e, 0x77, 0xff, 0xbe, 
+	0xff, 0xcf, 0xf7, 0xfc, 0xee, 0xf7, 0xff, 0xfe, 
+	0xff, 0xef, 0xff, 0x9f, 0xf1, 0xff, 0xf3, 0xff, 
+	0x3f, 0xef, 0xb7, 0x5f, 0x47, 0xb7, 0x7d, 0x7c, 
+	0xfe, 0x7d, 0xff, 0xdd, 0xff, 0xd7, 0xfe, 0xff, 
+	0x6b, 0xf6, 0x7f, 0xff, 0xbf, 0xf3, 0xff, 0xfd, 
+	0xdf, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0x9b, 0xfe, 0xbc, 
+	0xe4, 0xf7, 0x6f, 0xae, 0xff, 0xfe, 0xff, 0x6f, 
+	0x76, 0x7f, 0x66, 0x27, 0xdf, 0x7a, 0x4b, 0xe5, 
+	0xf7, 0xbf, 0x66, 0x7f, 0xfa, 0xfc, 0xff, 0xcb, 
+	0x7f, 0xfd, 0xef, 0xbf, 0xcb, 0xff, 0xf7, 0xcb, 
+	0xe7, 0x9f, 0x6f, 0xb6, 0xff, 0xfd, 0xb7, 0x49, 
+	0x9f, 0xeb, 0xff, 0x79, 0x97, 0xfa, 0xef, 0xff, 
+	0xf5, 0x7f, 0xf7, 0xf7, 0x37, 0x5f, 0x4c, 0x99, 
+	0xe5, 0xff, 0xeb, 0x6f, 0xd4, 0xa7, 0xff, 0x7f, 
+	0xf6, 0xed, 0x7f, 0xdf, 0x7f, 0xfb, 0xff, 0x7f, 
+	0xff, 0x5d, 0xd6, 0x59, 0x7d, 0xf5, 0xff, 0x5e, 
+	0x99, 0xfb, 0xb7, 0xfd, 0xf7, 0x8f, 0x6c, 0x7f, 
+	0xcd, 0x27, 0xf7, 0xd5, 0x6b, 0x37, 0xef, 0x9f, 
+	0xff, 0x5e, 0xbb, 0x6f, 0xef, 0x06, 0x7e, 0x78, 
+	0xf6, 0xff, 0xf5, 0xdf, 0xdf, 0xf1, 0x9d, 0x3d, 
+	0xfd, 0x77, 0xcb, 0xfd, 0xf7, 0xdf, 0x57, 0xe3, 
+	0xfd, 0x93, 0x99, 0xff, 0xfb, 0xff, 0xfd, 0xb7, 
+	0xfe, 0xd7, 0xff, 0xab, 0x6f, 0xfd, 0xb7, 0x72, 
+	0x5f, 0x7d, 0xf5, 0xd5, 0xfe, 0xfe, 0x66, 0xe4, 
+	0xff, 0xf7, 0x0f, 0x7a, 0xe1, 0xbd, 0xf9, 0xff, 
+	0xcb, 0xdf, 0x7b, 0x9f, 0xbd, 0xd6, 0x5e, 0x7b, 
+	0x6d, 0x1f, 0x3e, 0x18, 0xf6, 0xff, 0xf3, 0xfd, 
+	0x37, 0xff, 0xfc, 0xdb, 0xcf, 0xb7, 0xf9, 0xff, 
+	0xff, 0x6b, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x77, 
+	0xe6, 0xfd, 0xff, 0x7f, 0xfe, 0xfb, 0xff, 0x1f, 
+	0xfd, 0xe7, 0xfb, 0xdf, 0xfe, 0xff, 0xfc, 0xf3, 
+	0xcf, 0x3f, 0xfb, 0xfc, 0xbd, 0xb9, 0x7e, 0xfb, 
+	0xcf, 0x3f, 0xfe, 0xfe, 0xbb, 0xed, 0x37, 0xfe, 
+	0x7d, 0xf7, 0x1f, 0x7f, 0xbc, 0xf1, 0x46, 0x9f, 
+	0xbf, 0x6e, 0xee, 0xcf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6b, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xec, 0x9b, 0xef, 0xbf, 0x3b, 0x9b, 0xf9, 
+	0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf7, 
+	0xff, 0x77, 0xef, 0xe6, 0xf6, 0x7f, 0x2f, 0xf4, 
+	0xf0, 0xda, 0x7f, 0xfd, 0xff, 0xf4, 0xb7, 0xff, 
+	0x4f, 0xf8, 0xeb, 0x87, 0x17, 0xfa, 0x78, 0xbb, 
+	0x79, 0xdf, 0xeb, 0x8b, 0x7f, 0xb6, 0xda, 0xa7, 
+	0xbf, 0xbd, 0xfe, 0xd5, 0xee, 0x17, 0xfb, 0x7d, 
+	0xf3, 0xc4, 0x7f, 0x7f, 0x6f, 0xfa, 0xff, 0xfe, 
+	0xf2, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xef, 0xff, 0xe5, 0xff, 0x79, 0x75, 0xd5, 0xdf, 
+	0xff, 0x9b, 0xfe, 0xbf, 0x8f, 0x3e, 0xff, 0xfc, 
+	0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0xe5, 0x0f, 0x1d, 
+	0x7e, 0xf0, 0x41, 0x87, 0x5f, 0xfe, 0xe6, 0xff, 
+	0xef, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xef, 0xff, 
+	0xfe, 0xf5, 0x97, 0xfb, 0xfc, 0xfb, 0xf7, 0xd7, 
+	0xff, 0xff, 0xbf, 0xe1, 0xff, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xff, 0xef, 0x5f, 0xfd, 0xf4, 
+	0xfb, 0xeb, 0x36, 0xdf, 0x74, 0xfb, 0xef, 0x6f, 
+	0xfe, 0xdf, 0xfa, 0xef, 0xbf, 0xbf, 0xfe, 0xfa, 
+	0xef, 0xbf, 0xff, 0x55, 0x79, 0x5f, 0x7d, 0x73, 
+	0xcd, 0x35, 0x5f, 0xfd, 0x1b, 0xfa, 0xbf, 0xff, 
+	0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0x7f, 0xf9, 
+	0x41, 0x96, 0x3f, 0x7e, 0xf1, 0x45, 0x97, 0x1f, 
+	0xfe, 0xe6, 0xff, 0xcf, 0xfb, 0xf5, 0xbc, 0xf4, 
+	0xdb, 0xef, 0xbf, 0xfd, 0xc4, 0xff, 0xdf, 0xfe, 
+	0xef, 0xdf, 0xb7, 0xff, 0xfb, 0xbf, 0xf9, 0xff, 
+	0x8f, 0xbe, 0xfa, 0x5a, 0xeb, 0xae, 0xb6, 0xfe, 
+	0xf2, 0xd6, 0x5e, 0x6d, 0xfd, 0xd5, 0xc7, 0x5e, 
+	0x7f, 0xe9, 0x6f, 0x36, 0xff, 0xfb, 0xef, 0xcf, 
+	0xfe, 0x9f, 0xfd, 0xbf, 0xc3, 0xff, 0xfd, 0xd9, 
+	0x75, 0x3d, 0x7f, 0x7a, 0xf0, 0xef, 0xff, 0x9b, 
+	0xff, 0xfb, 0xff, 0x7b, 0xe9, 0xfe, 0xdd, 0xde, 
+	0xf7, 0xbe, 0xfe, 0x57, 0xbf, 0xff, 0xfa, 0x2f, 
+	0xb7, 0x6e, 0xff, 0x5f, 0xe6, 0x7f, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xff, 0xd7, 0x36, 0xef, 
+	0xfb, 0x7a, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xd6, 
+	0x9f, 0xf1, 0xff, 0xfb, 0xe2, 0x7d, 0xf7, 0xd6, 
+	0xfa, 0x7b, 0xaf, 0x7f, 0xfa, 0xe5, 0x83, 0xef, 
+	0xdb, 0xbf, 0xe1, 0xff, 0xfd, 0x67, 0xfc, 0xef, 
+	0xff, 0xff, 0xff, 0xde, 0xff, 0xee, 0xfb, 0xd7, 
+	0xfb, 0xe5, 0xfc, 0xfb, 0xfe, 0xff, 0xef, 0xfe, 
+	0xff, 0x7f, 0x99, 0xf7, 0xe6, 0xbb, 0xfe, 0xfb, 
+	0xcf, 0x8f, 0xef, 0xf0, 0xfb, 0xdf, 0x3f, 0xff, 
+	0xed, 0xf3, 0xcf, 0x3a, 0xef, 0xdf, 0x7f, 0xc6, 
+	0xef, 0xdb, 0xcd, 0x3f, 0xff, 0xec, 0x7b, 0xcf, 
+	0xbf, 0xf7, 0xfa, 0x97, 0xdf, 0x7f, 0xfb, 0xf5, 
+	0x7f, 0xf8, 0xfe, 0xbd, 0xf1, 0xcd, 0xfe, 0xef, 
+	0xef, 0xb3, 0x7f, 0xfe, 0x7a, 0x3d, 0xdd, 0xcf, 
+	0x9f, 0x9e, 0x7f, 0xd7, 0xef, 0xbe, 0xfb, 0xfe, 
+	0x6f, 0xfc, 0x3f, 0x7c, 0xff, 0xff, 0xff, 0x37, 
+	0xeb, 0xff, 0xe3, 0xf5, 0x6f, 0xd6, 0xf9, 0xbb, 
+	0xe7, 0x67, 0xde, 0xfb, 0xff, 0x9a, 0xff, 0xdf, 
+	0xff, 0xf7, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xfb, 
+	0xff, 0x6f, 0x7f, 0xbb, 0xff, 0xff, 0xdf, 0xee, 
+	0xfd, 0xef, 0xe6, 0xff, 0xcf, 0xfe, 0xbf, 0x7e, 
+	0xb2, 0xa3, 0xbd, 0xdf, 0xfc, 0xf7, 0x47, 0x69, 
+	0x77, 0xfd, 0xfe, 0xdf, 0xf7, 0xbf, 0xbf, 0xe9, 
+	0xff, 0xf9, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0xab, 
+	0x9f, 0xef, 0xdc, 0xf7, 0xd7, 0x7e, 0xdf, 0xef, 
+	0xb6, 0xff, 0xff, 0x6d, 0xfe, 0x7f, 0xdf, 0xff, 
+	0xff, 0xff, 0xdf, 0xfe, 0xee, 0xed, 0x7f, 0xff, 
+	0xfe, 0x1d, 0xef, 0xff, 0x7b, 0xfd, 0xff, 0xff, 
+	0x1b, 0xfe, 0xf9, 0xe7, 0xf1, 0x5b, 0xbe, 0x2f, 
+	0xfe, 0xfc, 0x67, 0x3d, 0x5f, 0x4c, 0x31, 0x9f, 
+	0x7f, 0x59, 0xa9, 0xf7, 0xbf, 0x66, 0xff, 0xff, 
+	0xf9, 0xbd, 0xcf, 0xff, 0xab, 0xaf, 0xff, 0x9d, 
+	0xff, 0xf2, 0xd3, 0xe7, 0xff, 0xef, 0xf2, 0xf8, 
+	0xfe, 0x97, 0xf9, 0x9f, 0xdf, 0xbf, 0xbf, 0xbf, 
+	0x5a, 0x7a, 0xed, 0xb9, 0xf3, 0xb5, 0xc4, 0x17, 
+	0x5f, 0x65, 0x3f, 0xc5, 0x92, 0xff, 0x6f, 0xd6, 
+	0x67, 0xff, 0xff, 0xfb, 0xac, 0x27, 0x9e, 0x7e, 
+	0xfb, 0xd9, 0x4f, 0xb5, 0x75, 0xd6, 0xd9, 0x4f, 
+	0xfd, 0xe5, 0x5e, 0x9b, 0xfb, 0xff, 0x99, 0xfe, 
+	0x7f, 0xed, 0xe6, 0x9f, 0x2e, 0xf6, 0xb5, 0x4f, 
+	0x5f, 0xf5, 0xbc, 0xd7, 0x5e, 0xf9, 0x7f, 0xef, 
+	0x66, 0xfe, 0xbf, 0xa5, 0xfe, 0x6f, 0x7e, 0xe9, 
+	0xa3, 0x9e, 0x3d, 0xed, 0xd1, 0x4d, 0x1f, 0xef, 
+	0xb5, 0x57, 0xeb, 0xfd, 0xb3, 0xb1, 0xff, 0x57, 
+	0xe9, 0xaf, 0xf7, 0xfe, 0xd7, 0x6a, 0xa1, 0x6f, 
+	0x7d, 0xe5, 0x97, 0xd0, 0x7f, 0xff, 0xd5, 0xd2, 
+	0xff, 0x66, 0xee, 0xbf, 0x5b, 0xfa, 0x6b, 0xeb, 
+	0xfd, 0xcf, 0x3a, 0xdb, 0xdf, 0x7e, 0xfd, 0xf5, 
+	0xf2, 0xde, 0x7b, 0x8d, 0xf5, 0xbf, 0x9b, 0xf7, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 
+	0xf7, 0xbb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf9, 
+	0xb2, 0xdf, 0x77, 0xe6, 0xfd, 0x1f, 0xff, 0xff, 
+	0xfb, 0xef, 0x9f, 0xfd, 0xf7, 0xdb, 0xdf, 0x7e, 
+	0xeb, 0xed, 0xff, 0xff, 0x3c, 0x7f, 0xe7, 0xbd, 
+	0xb1, 0x5f, 0x53, 0xed, 0xb7, 0xff, 0x7e, 0xf3, 
+	0xee, 0x36, 0xda, 0xd1, 0xd7, 0x58, 0x67, 0xbf, 
+	0xbd, 0xc6, 0xdb, 0xff, 0x60, 0xe6, 0xdf, 0xff, 
+	0xff, 0xfc, 0xff, 0xef, 0xfb, 0xef, 0xfe, 0xf6, 
+	0xbf, 0xe7, 0x9e, 0xf9, 0xed, 0xbf, 0xcf, 0xbe, 
+	0x3f, 0x9b, 0xfb, 0xfd, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf7, 0x7f, 
+	0xff, 0xfd, 0xfd, 0xf7, 0xff, 0xef, 0xa6, 0xfe, 
+	0x19, 0xa7, 0xff, 0xf6, 0xdb, 0xbb, 0xaf, 0xff, 
+	0xf4, 0xa7, 0x57, 0x5f, 0xfd, 0xed, 0xb5, 0x17, 
+	0xde, 0xfb, 0xbb, 0x79, 0xff, 0xa7, 0xdb, 0xaf, 
+	0xb2, 0xea, 0xa2, 0xab, 0xbf, 0x7e, 0xb7, 0xd5, 
+	0x56, 0xdf, 0x7d, 0xb5, 0xc5, 0x1e, 0x7f, 0x6f, 
+	0xfe, 0xbf, 0xff, 0x7a, 0xef, 0xbf, 0xd7, 0xda, 
+	0xfa, 0xff, 0xff, 0x7f, 0xd9, 0xe5, 0xdf, 0xdf, 
+	0x7f, 0xf9, 0xf7, 0xff, 0x9a, 0xff, 0x7f, 0x8f, 
+	0x3f, 0xfa, 0xe8, 0xa3, 0x8f, 0x3e, 0xfb, 0xf4, 
+	0x47, 0x17, 0x7d, 0xf6, 0xd9, 0x47, 0x07, 0x5f, 
+	0xbe, 0xe6, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 
+	0xfb, 0xaf, 0xff, 0xfe, 0xf7, 0xd7, 0x5f, 0xff, 
+	0xfd, 0xf7, 0x97, 0x7f, 0xf7, 0xbf, 0xf9, 0xff, 
+	0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xef, 0xff, 
+	0xdf, 0xff, 0xf4, 0xd3, 0xcf, 0x3f, 0xff, 0x74, 
+	0xf3, 0xef, 0x6f, 0xfe, 0xff, 0xfb, 0xfa, 0xbf, 
+	0xff, 0xfe, 0xfa, 0xef, 0xbf, 0xff, 0xdd, 0x55, 
+	0xd7, 0x5d, 0xf7, 0xdd, 0x31, 0xdd, 0xfd, 0x9b, 
+	0xff, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xff, 
+	0xff, 0x7f, 0xf9, 0x41, 0x07, 0x1d, 0x76, 0xf8, 
+	0x41, 0x97, 0x3d, 0xfe, 0x66, 0xfe, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xd3, 0x5f, 0xff, 0xd7, 0xfe, 
+	0xb7, 0xff, 0xfe, 0xfb, 0xef, 0xa7, 0xff, 0xff, 
+	0xbf, 0xe9, 0xbf, 0xaf, 0xbe, 0xfc, 0xe0, 0x6b, 
+	0x2d, 0xbf, 0xfe, 0xe2, 0xd7, 0x5b, 0x7e, 0xfd, 
+	0xf1, 0xd7, 0x5b, 0x7f, 0xf9, 0x69, 0xfe, 0xff, 
+	0xeb, 0xff, 0xff, 0xff, 0xff, 0x75, 0x7f, 0xff, 
+	0xff, 0x7b, 0xd9, 0x7d, 0xf3, 0xdf, 0xff, 0xf1, 
+	0x7f, 0xff, 0x1b, 0xff, 0xf7, 0xff, 0xcf, 0xff, 
+	0xdd, 0x57, 0xf7, 0xcf, 0xf7, 0xfd, 0xcf, 0xbe, 
+	0xdb, 0xef, 0xfb, 0x4d, 0xdd, 0xff, 0x7a, 0xe6, 
+	0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xeb, 0xed, 0xef, 0x7f, 0xdf, 
+	0x7d, 0xff, 0xfb, 0xbf, 0xf9, 0xff, 0xfb, 0xff, 
+	0xad, 0xb7, 0xfe, 0xff, 0xcb, 0x8a, 0xef, 0xb7, 
+	0xf5, 0xdf, 0xf7, 0xfd, 0xbd, 0xd5, 0x97, 0xff, 
+	0x6d, 0xf6, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 
+	0xbf, 0xf6, 0xf7, 0xf6, 0x5f, 0xfb, 0xff, 0xff, 
+	0xfd, 0x75, 0xdb, 0x6a, 0xff, 0x9b, 0xff, 0xef, 
+	0xfa, 0xef, 0xfe, 0xf9, 0xba, 0xfd, 0x6f, 0xfb, 
+	0x9b, 0x3a, 0x77, 0xdd, 0xf7, 0x96, 0x7f, 0xef, 
+	0xfd, 0xff, 0x66, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 
+	0xff, 0xbf, 0xff, 0xbf, 0x47, 0xd1, 0xff, 0x9f, 
+	0x7f, 0xfc, 0xf1, 0xc3, 0x16, 0xff, 0xbf, 0xe9, 
+	0xff, 0xff, 0xfe, 0xff, 0xf7, 0xdf, 0x67, 0xff, 
+	0x6f, 0xfd, 0x2f, 0xbf, 0xdf, 0xef, 0xbb, 0xef, 
+	0xff, 0xfe, 0xff, 0x6b, 0xfe, 0xf7, 0xef, 0xbc, 
+	0xe3, 0x8f, 0x3f, 0xfa, 0x7f, 0xff, 0xfe, 0x7f, 
+	0x7e, 0xfe, 0xff, 0xff, 0xef, 0xfb, 0xc9, 0xff, 
+	0x9b, 0xfb, 0xfe, 0x3e, 0xf7, 0xf7, 0xef, 0x7f, 
+	0xff, 0xf7, 0x7f, 0xff, 0xe5, 0xf6, 0xaf, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xff, 
+	0xbe, 0xfb, 0x79, 0xf7, 0xcd, 0xba, 0xdf, 0xee, 
+	0xff, 0xc7, 0x4f, 0xf7, 0xbd, 0xf7, 0xdb, 0x37, 
+	0xbf, 0xbb, 0xf1, 0xff, 0xff, 0xff, 0xfd, 0xff, 
+	0xff, 0xd9, 0xd7, 0xdf, 0x5d, 0xdd, 0x37, 0xdf, 
+	0x0e, 0x7e, 0x98, 0xf1, 0xc7, 0xff, 0x66, 0xf6, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 
+	0xbf, 0xff, 0xfd, 0xfe, 0xf7, 0xfb, 0xfe, 0xef, 
+	0xdf, 0xff, 0xff, 0x9b, 0xfe, 0xff, 0xff, 0x9d, 
+	0xef, 0xbf, 0x7c, 0xbc, 0xfa, 0x6f, 0x75, 0xdf, 
+	0x7d, 0x97, 0xdd, 0x77, 0xdf, 0x7d, 0xff, 0xbf, 
+	0x66, 0xff, 0xff, 0xff, 0xff, 0x9d, 0x77, 0xfe, 
+	0xaf, 0xfe, 0x5b, 0x97, 0x5f, 0x7f, 0xad, 0xf5, 
+	0xd7, 0x5f, 0x7f, 0xfb, 0xb7, 0x49, 0xff, 0xff, 
+	0xff, 0xff, 0xa7, 0xfe, 0x0f, 0x6b, 0xbf, 0xf7, 
+	0xb9, 0xb7, 0x9e, 0x7a, 0xee, 0xb9, 0xa7, 0xde, 
+	0xf2, 0x6f, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xa9, 
+	0xff, 0xdf, 0x3a, 0xfb, 0xd5, 0x2e, 0xbf, 0xfc, 
+	0xb2, 0xcb, 0x2f, 0xbf, 0xfc, 0x5c, 0x99, 0xfb, 
+	0xf5, 0xff, 0xff, 0xdf, 0x7f, 0xaf, 0xaf, 0xfe, 
+	0xf6, 0xdd, 0x6d, 0xb7, 0xf5, 0x76, 0x5b, 0x6d, 
+	0xb1, 0xfd, 0x6e, 0x06, 0xbe, 0xfd, 0xff, 0xff, 
+	0xff, 0xef, 0xab, 0xaf, 0xbe, 0x3d, 0x5d, 0x73, 
+	0xcd, 0x0d, 0xd7, 0x5c, 0x73, 0xcc, 0x8d, 0xb3, 
+	0x99, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xde, 0xda, 
+	0xfb, 0xaf, 0x6f, 0xff, 0xfd, 0xf7, 0xd9, 0x7f, 
+	0xbf, 0xbd, 0xf2, 0xfa, 0x66, 0xe4, 0xff, 0xff, 
+	0x7f, 0x3d, 0xaf, 0x84, 0xfe, 0xfb, 0xdb, 0x7f, 
+	0xfb, 0xed, 0xb7, 0xda, 0x7e, 0x8b, 0x8d, 0xb7, 
+	0x3d, 0x1b, 0xf5, 0xff, 0xff, 0xff, 0xf7, 0xdf, 
+	0xff, 0xff, 0xef, 0xb7, 0xf1, 0xde, 0x73, 0xcf, 
+	0x3d, 0xf7, 0xdc, 0x73, 0xcf, 0x57, 0xe6, 0xfd, 
+	0xff, 0xff, 0xff, 0xd9, 0xe7, 0xff, 0xff, 0xd7, 
+	0x9b, 0xdd, 0x77, 0xd9, 0x65, 0x97, 0x5d, 0xf6, 
+	0xd9, 0xe5, 0x9d, 0xa9, 0xfe, 0xfb, 0xef, 0x3f, 
+	0xd3, 0xfc, 0x7b, 0xed, 0x33, 0x7e, 0xfd, 0xf5, 
+	0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 0xff, 0x66, 
+	0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xbf, 0xff, 0xdf, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 
+	0x7b, 0xef, 0xbd, 0x3b, 0x9b, 0xf9, 0xff, 0xff, 
+	0xff, 0xef, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xf7, 
+	0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0x7b, 
+	0xef, 0xe6, 0xf6, 0xff, 0xbf, 0xbf, 0xf0, 0xc3, 
+	0xfb, 0xbf, 0xbd, 0xf4, 0xbf, 0xf7, 0xde, 0x7b, 
+	0xef, 0xbd, 0xf7, 0xce, 0xfb, 0xbb, 0x79, 0xff, 
+	0x7f, 0xcf, 0x2f, 0xbe, 0xf9, 0xf6, 0xab, 0xbf, 
+	0xde, 0xd3, 0x4d, 0x37, 0xcd, 0x74, 0xd3, 0xcc, 
+	0x33, 0x7d, 0x6f, 0xfa, 0xff, 0xff, 0xfb, 0xff, 
+	0xbd, 0xbf, 0xff, 0x7f, 0xef, 0xff, 0xbf, 0xfd, 
+	0xf7, 0xdb, 0x6f, 0xe7, 0xbd, 0xf7, 0xdf, 0x9b, 
+	0xfe, 0xff, 0xcb, 0x0e, 0x77, 0xd8, 0xe2, 0xcf, 
+	0x3e, 0xff, 0xfc, 0x61, 0x87, 0x1d, 0x76, 0xd8, 
+	0x65, 0x87, 0x5d, 0xfe, 0xe6, 0xff, 0xff, 0x37, 
+	0x9f, 0x5c, 0xa3, 0xdb, 0xbf, 0xff, 0x7f, 0xf5, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 
+	0xbd, 0xe1, 0xff, 0xff, 0xcc, 0xa3, 0x9f, 0xbf, 
+	0xf6, 0xea, 0xff, 0x5f, 0x3d, 0xf6, 0xd8, 0x65, 
+	0x8f, 0x7d, 0xf6, 0xd9, 0xe7, 0x6f, 0xfe, 0xff, 
+	0xaf, 0x3b, 0x9e, 0xbf, 0xae, 0xbf, 0xef, 0xbf, 
+	0x5f, 0x55, 0x57, 0xdd, 0x74, 0xd5, 0x55, 0x17, 
+	0x5d, 0xfd, 0x9b, 0xff, 0xff, 0xf3, 0xdc, 0x7f, 
+	0xfb, 0x6f, 0xfb, 0xfe, 0x7f, 0xd3, 0xdb, 0x6f, 
+	0xdf, 0xfd, 0xf6, 0xd9, 0x67, 0x9f, 0xff, 0xe6, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xff, 
+	0xbd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, 
+	0xff, 0xff, 0xef, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 
+	0xfe, 0xda, 0xeb, 0x2f, 0x9d, 0xde, 0xda, 0xd7, 
+	0x5e, 0x7b, 0xfd, 0xd5, 0xd7, 0x5f, 0x7d, 0xfd, 
+	0x6f, 0x3e, 0xef, 0xef, 0xff, 0xcf, 0xfe, 0xff, 
+	0xff, 0xeb, 0xee, 0xfc, 0xf6, 0xdd, 0xef, 0xda, 
+	0x7e, 0xde, 0xd9, 0xff, 0xfe, 0x9b, 0xf9, 0xfe, 
+	0xeb, 0x6f, 0xbd, 0xfe, 0x7c, 0xef, 0xb7, 0xff, 
+	0xf7, 0xff, 0x5b, 0xff, 0xff, 0xcf, 0x2d, 0xf7, 
+	0xff, 0x7e, 0xe6, 0xfd, 0x7f, 0xff, 0x5f, 0xff, 
+	0xbf, 0xff, 0x3e, 0xde, 0x7e, 0xbf, 0xe9, 0xff, 
+	0xfd, 0xd6, 0xbe, 0xff, 0xfe, 0xfd, 0x9f, 0x31, 
+	0x7f, 0xff, 0x7f, 0x7f, 0xe6, 0xff, 0xff, 0xff, 
+	0xcf, 0x7d, 0xb1, 0xf5, 0xe7, 0x5e, 0x67, 0xb9, 
+	0xf4, 0xa5, 0xff, 0x65, 0xfc, 0xff, 0xbf, 0xff, 
+	0xbf, 0xfe, 0xeb, 0xbf, 0xff, 0x7f, 0xfb, 0xde, 
+	0xeb, 0xfe, 0xbd, 0xff, 0xfe, 0xdb, 0x5e, 0xff, 
+	0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xdb, 0xdf, 0xf9, 0xd5, 0x4d, 0xbf, 0xcd, 0x74, 
+	0xf3, 0xc5, 0xbf, 0x7d, 0x5f, 0x86, 0xdf, 0xdf, 
+	0xfb, 0xf6, 0xff, 0xdf, 0xd3, 0x7e, 0xbf, 0xfc, 
+	0xe5, 0x96, 0x5f, 0x7f, 0xf9, 0xff, 0xff, 0x5d, 
+	0xef, 0xaf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xfe, 0xfe, 0xfd, 0xb7, 0xeb, 0xef, 0xbf, 
+	0xff, 0xfe, 0xbf, 0xff, 0xbf, 0xfd, 0x6f, 0xf4, 
+	0x3f, 0xef, 0xf8, 0xf3, 0xff, 0xfe, 0xff, 0xfc, 
+	0xf7, 0x9f, 0x25, 0xde, 0x98, 0x61, 0xce, 0xbc, 
+	0xf6, 0x79, 0xff, 0x9b, 0xff, 0x6f, 0xff, 0xfa, 
+	0x76, 0xff, 0xfa, 0xde, 0xee, 0xdb, 0xb5, 0xdf, 
+	0x6a, 0xbb, 0xed, 0xf6, 0xbf, 0x1f, 0xf6, 0xee, 
+	0xe6, 0xbe, 0xde, 0xfc, 0xbf, 0x7c, 0x77, 0xeb, 
+	0xdf, 0xff, 0xd7, 0xf7, 0xdb, 0x6f, 0xbf, 0xfd, 
+	0xbf, 0xff, 0x7f, 0xff, 0xbf, 0xb9, 0xff, 0x7f, 
+	0xff, 0xaf, 0xff, 0xf7, 0xc7, 0x7f, 0xff, 0x7b, 
+	0xfd, 0xd5, 0xd7, 0x5b, 0xff, 0x7b, 0x9f, 0xd5, 
+	0xfe, 0x6d, 0xfa, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xdf, 0xff, 0xff, 0xfd, 0xdd, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0x1b, 0xfe, 
+	0xfc, 0xfe, 0xfb, 0x7b, 0xfe, 0xef, 0xbd, 0xf3, 
+	0x2a, 0x7f, 0xf3, 0xcd, 0x37, 0xdd, 0x5c, 0x6b, 
+	0xc9, 0xf7, 0x3f, 0x66, 0x7f, 0xfe, 0xff, 0xb2, 
+	0x5f, 0xff, 0xfb, 0xe5, 0xbf, 0xcc, 0xe7, 0xbc, 
+	0xf9, 0xce, 0x39, 0xed, 0xb2, 0xd9, 0xff, 0xb7, 
+	0xf9, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xfd, 0x3e, 
+	0xaf, 0xaf, 0x57, 0x9b, 0xef, 0xba, 0xf9, 0xfe, 
+	0xf9, 0xe7, 0x57, 0xff, 0x6f, 0xd6, 0xff, 0xff, 
+	0xff, 0xfb, 0xdf, 0xbe, 0xff, 0xfe, 0xeb, 0x7f, 
+	0xef, 0xb7, 0xf7, 0x7f, 0xdf, 0x7f, 0x3b, 0xff, 
+	0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0xf7, 0xdb, 0x5f, 
+	0xbf, 0x9d, 0x77, 0xfe, 0x7d, 0x42, 0x1b, 0xe7, 
+	0xbc, 0x5a, 0x6a, 0xb3, 0xcf, 0xee, 0x66, 0xfa, 
+	0xff, 0xff, 0xbf, 0x6b, 0xff, 0xbb, 0xeb, 0x8a, 
+	0x3f, 0xd5, 0x52, 0x45, 0x15, 0xf5, 0x5d, 0x73, 
+	0xff, 0xfd, 0xb3, 0xb1, 0xff, 0xef, 0xff, 0xbd, 
+	0xf3, 0xdb, 0xeb, 0xaf, 0xaf, 0x6f, 0xf5, 0xd5, 
+	0x57, 0x5f, 0xfd, 0xb5, 0xf6, 0xd7, 0xf9, 0x66, 
+	0xe2, 0xff, 0x57, 0x4f, 0x38, 0xff, 0xa7, 0x57, 
+	0xde, 0x7b, 0xff, 0xeb, 0xaf, 0xb7, 0xde, 0xca, 
+	0x2b, 0x87, 0x9f, 0xbf, 0x9b, 0xf7, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x78, 0xf3, 0xcd, 0xbf, 0xbb, 
+	0xf0, 0xd2, 0x4b, 0x2f, 0xbb, 0xfe, 0xfa, 0x8b, 
+	0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xf9, 0xf7, 
+	0x9f, 0x7f, 0xfe, 0x1b, 0xcf, 0x3e, 0xef, 0xbc, 
+	0xb3, 0xcf, 0x3e, 0xff, 0xfc, 0xbd, 0xb1, 0xff, 
+	0xe3, 0xcf, 0x3f, 0xff, 0xf4, 0xe3, 0x8d, 0xb5, 
+	0xff, 0x91, 0xc6, 0x1b, 0x6f, 0xf4, 0xd1, 0xe7, 
+	0x9a, 0xeb, 0x66, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xef, 0xff, 0xfd, 0xf7, 0xbb, 0x6f, 
+	0x3e, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0x3f, 0x9b, 
+	0xfb, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 
+	0xef, 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xf5, 0xf7, 0xef, 0xa6, 0xfe, 0x1f, 0x7f, 
+	0xfc, 0x70, 0xe2, 0x4b, 0x27, 0xbc, 0xf6, 0x87, 
+	0x37, 0x7e, 0xfa, 0xe3, 0x84, 0x17, 0x5e, 0xfa, 
+	0xab, 0x79, 0xff, 0xef, 0xbf, 0x35, 0x9e, 0xf8, 
+	0xe2, 0x8b, 0xaf, 0xfa, 0xf1, 0xcd, 0x17, 0x5f, 
+	0x7c, 0xf1, 0xc4, 0x17, 0x7f, 0x6f, 0xfe, 0xff, 
+	0xfd, 0xaf, 0xef, 0xae, 0xfe, 0xfe, 0xf3, 0xeb, 
+	0xfe, 0xff, 0xfd, 0xff, 0xf7, 0xfb, 0x7f, 0xf5, 
+	0xf6, 0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3f, 0xb3, 
+	0xe9, 0xb3, 0x8f, 0x3f, 0xfb, 0xb4, 0xe1, 0x06, 
+	0x1f, 0x64, 0xb8, 0x41, 0x97, 0x1f, 0xfe, 0xe6, 
+	0xff, 0x9f, 0x7f, 0xff, 0xfc, 0xff, 0xfb, 0x6f, 
+	0xbf, 0x7e, 0xef, 0x1b, 0xcf, 0xbf, 0xf3, 0x64, 
+	0xbb, 0xef, 0xbc, 0xbf, 0xf9, 0xff, 0xff, 0xdf, 
+	0x3f, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0x5f, 0x5f, 
+	0x7c, 0xf1, 0xc3, 0x17, 0x7d, 0xfe, 0xf9, 0xe5, 
+	0x6f, 0xfe, 0xff, 0xfb, 0xef, 0xaf, 0xfa, 0xfe, 
+	0xfb, 0xe7, 0xab, 0xdf, 0x4c, 0x37, 0x5d, 0x75, 
+	0xf3, 0xcc, 0x53, 0xdd, 0xfc, 0x1b, 0xfe, 0xff, 
+	0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xdd, 0xf7, 0xbf, 0x7f, 0xff, 0xfb, 0xe7, 
+	0xdd, 0x3f, 0x66, 0x7f, 0xff, 0xff, 0xfd, 0xff, 
+	0xff, 0xda, 0x6f, 0xbf, 0xfd, 0xaa, 0x2f, 0xbf, 
+	0xfa, 0xfa, 0xff, 0xff, 0xbf, 0xfe, 0xbf, 0xf9, 
+	0xff, 0xaf, 0xbe, 0xfa, 0xea, 0xe9, 0xaf, 0xbf, 
+	0xd8, 0xe2, 0x97, 0x5f, 0x7f, 0xfd, 0xd1, 0x57, 
+	0x1f, 0x7e, 0xcd, 0x6f, 0xfa, 0xdf, 0xfb, 0xff, 
+	0xbf, 0x3a, 0x3f, 0xe8, 0xe4, 0xfb, 0x7e, 0xfe, 
+	0xdb, 0x37, 0x9f, 0xf7, 0xfe, 0xf9, 0x66, 0xff, 
+	0x1b, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xf7, 0xed, 
+	0x5f, 0x7f, 0xff, 0xdf, 0xbb, 0xb7, 0x77, 0xcd, 
+	0xef, 0xcf, 0xeb, 0xf8, 0x7f, 0xa6, 0xff, 0x5f, 
+	0xff, 0xff, 0x77, 0xfd, 0x6d, 0xf7, 0xff, 0xe9, 
+	0xad, 0xff, 0x6e, 0xe7, 0xd6, 0xbf, 0xef, 0xff, 
+	0xff, 0xbb, 0xf9, 0xf7, 0x77, 0xff, 0xff, 0xbf, 
+	0xfe, 0xf3, 0xdb, 0xad, 0x7f, 0x3c, 0xf1, 0xc7, 
+	0x91, 0xff, 0xf7, 0xf1, 0xc6, 0xff, 0x67, 0xfe, 
+	0xff, 0xaf, 0xff, 0xff, 0x7b, 0xb7, 0xbf, 0xe7, 
+	0xd6, 0xdb, 0x77, 0x3f, 0x7d, 0xfb, 0xf7, 0xdf, 
+	0x7f, 0xbd, 0x7b, 0x9b, 0xfe, 0xff, 0xff, 0xfd, 
+	0xbf, 0x7b, 0x7f, 0xf7, 0xef, 0xbb, 0xcb, 0x3f, 
+	0xf7, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xaf, 0xff, 
+	0xa6, 0xff, 0x3f, 0xff, 0xe9, 0xff, 0x7f, 0xfb, 
+	0x7f, 0x3f, 0xfe, 0xdd, 0xfe, 0xff, 0xfb, 0x7f, 
+	0xef, 0xee, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xfd, 0xf7, 0xb7, 0xfb, 0xff, 0xff, 0xbf, 
+	0xfd, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0x7f, 
+	0xef, 0x6f, 0xfe, 0x7f, 0xff, 0xbc, 0xb7, 0xcf, 
+	0xfa, 0xfb, 0xbe, 0xf7, 0x15, 0xe9, 0xf7, 0xe0, 
+	0xe7, 0xfd, 0x6b, 0xee, 0xf1, 0xfd, 0x9b, 0xfb, 
+	0xdf, 0x3f, 0xbf, 0xfd, 0xb3, 0xff, 0xbf, 0xff, 
+	0xf7, 0xef, 0xf6, 0xff, 0x7b, 0xec, 0xff, 0x5e, 
+	0xff, 0xeb, 0xff, 0xe6, 0x9d, 0xaf, 0xfe, 0xf9, 
+	0xf7, 0xff, 0xef, 0xf6, 0xfa, 0x5f, 0xe7, 0xfb, 
+	0xef, 0xef, 0x35, 0xf5, 0xdf, 0x4f, 0xff, 0x9d, 
+	0xd1, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xfb, 0xd9, 
+	0xbf, 0x77, 0xff, 0x74, 0x77, 0x7f, 0xff, 0x1b, 
+	0xdd, 0x63, 0x57, 0xfb, 0x6f, 0xfe, 0x3f, 0xff, 
+	0xef, 0xff, 0xfd, 0xff, 0xfe, 0xbf, 0xff, 0x7f, 
+	0xbf, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0x9b, 0xfe, 0xff, 0xe6, 0xfb, 0xef, 0xaf, 
+	0xb9, 0xd4, 0x9e, 0xee, 0x37, 0xf9, 0xcf, 0x97, 
+	0xff, 0xdf, 0x79, 0xad, 0xf1, 0xbf, 0x66, 0xff, 
+	0xdf, 0x7f, 0xe7, 0x93, 0xee, 0xbf, 0xe5, 0xe7, 
+	0xfa, 0xe7, 0xfa, 0xd9, 0xfe, 0xff, 0xb7, 0xff, 
+	0xd9, 0xff, 0xb7, 0x49, 0xff, 0xff, 0xff, 0xaf, 
+	0xff, 0xfe, 0xdb, 0xcf, 0xef, 0xf3, 0x9f, 0x77, 
+	0xb6, 0xdf, 0xfe, 0xad, 0x96, 0x5f, 0xf9, 0x6f, 
+	0xd4, 0xff, 0xff, 0x3f, 0xeb, 0xef, 0xff, 0xff, 
+	0x2c, 0xe7, 0xfd, 0xe7, 0x9f, 0x7d, 0xb6, 0x7f, 
+	0x4f, 0xff, 0xfd, 0x5e, 0x9b, 0xeb, 0xf5, 0xff, 
+	0xf7, 0xdf, 0x6f, 0xa5, 0xd9, 0x56, 0xde, 0xfc, 
+	0xed, 0xba, 0xe7, 0xbe, 0xdf, 0x7f, 0xbb, 0x7d, 
+	0xeb, 0x06, 0xbe, 0xfd, 0xff, 0xff, 0xfb, 0xee, 
+	0xb9, 0xef, 0xdf, 0xb4, 0xcf, 0xbb, 0xc5, 0x8d, 
+	0xf7, 0xd7, 0x77, 0xc3, 0xad, 0xb3, 0x99, 0xff, 
+	0xff, 0xbf, 0xaf, 0xfe, 0xb2, 0x7a, 0x0f, 0x6b, 
+	0xd5, 0x3b, 0xf5, 0xf6, 0x5f, 0xff, 0xed, 0xd7, 
+	0xdf, 0xff, 0x66, 0xe4, 0xff, 0xf7, 0xdf, 0x6b, 
+	0xef, 0xbd, 0x83, 0x5e, 0x6f, 0xfc, 0x0f, 0x27, 
+	0x9d, 0x56, 0x7a, 0xff, 0xef, 0xfd, 0x3f, 0x1a, 
+	0xf5, 0xfe, 0xf3, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0x2d, 0x3f, 0xfb, 0xff, 0xde, 0x4b, 0xaf, 0xfd, 
+	0xff, 0xf2, 0xff, 0x77, 0xa6, 0x7d, 0xbd, 0x79, 
+	0xfe, 0xf9, 0xe7, 0x9f, 0x79, 0xf4, 0x9d, 0xef, 
+	0xfe, 0xff, 0xac, 0xf3, 0xbf, 0x3f, 0xeb, 0xff, 
+	0xbd, 0xb9, 0xee, 0xfb, 0x8f, 0x3f, 0xfe, 0xf8, 
+	0xf3, 0xcd, 0x33, 0xd7, 0xd9, 0xe6, 0x9b, 0x69, 
+	0xfe, 0xfd, 0x46, 0xdf, 0xff, 0x62, 0xee, 0xdf, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xbf, 0xfd, 
+	0xff, 0xb7, 0xdf, 0xbf, 0xfb, 0xfe, 0xdd, 0xef, 
+	0xff, 0x3b, 0x9b, 0xf9, 0xfe, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xee, 0xbf, 0xff, 0xff, 0xf7, 0xff, 
+	0xd7, 0xdf, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xe6, 
+	0xf6, 0x6b, 0x7f, 0xfc, 0xf1, 0xc7, 0x0f, 0x7f, 
+	0xbe, 0xf8, 0xc5, 0x37, 0x7f, 0xfa, 0xa1, 0xf7, 
+	0x3f, 0xde, 0xff, 0xbb, 0x61, 0xff, 0xe7, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xe3, 0x9f, 0xae, 0x5e, 0xff, 
+	0xcf, 0x37, 0xdf, 0xfc, 0xf5, 0xc7, 0xb3, 0x7f, 
+	0x6f, 0xfe, 0xfb, 0xff, 0xff, 0xdf, 0x7f, 0xbf, 
+	0xde, 0xf6, 0xbb, 0x5f, 0x7e, 0xfb, 0xf7, 0x9f, 
+	0x7f, 0x7f, 0xb5, 0xfd, 0xff, 0x9b, 0xff, 0xaf, 
+	0xc3, 0x0d, 0x3f, 0xfc, 0x22, 0xcb, 0x1e, 0xbb, 
+	0xd4, 0xe1, 0x0f, 0x1f, 0x7c, 0xd8, 0xc1, 0x07, 
+	0x3f, 0xfe, 0xe6, 0xff, 0xcb, 0x7f, 0xff, 0xff, 
+	0xff, 0x8f, 0xff, 0x9f, 0xfe, 0xc5, 0xff, 0x7f, 
+	0xff, 0xf9, 0xff, 0xbf, 0xdf, 0xfe, 0xbf, 0xe1, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0xd7, 0xef, 0xfb, 0xff, 
+	0xad, 0x4b, 0xff, 0xf6, 0xf2, 0xed, 0xaf, 0xff, 
+	0x7e, 0xb3, 0xef, 0x6f, 0xfe, 0xdf, 0x99, 0x67, 
+	0xbe, 0xfa, 0xee, 0xab, 0xef, 0xab, 0x5f, 0xc7, 
+	0x77, 0xdf, 0x1c, 0xf5, 0x45, 0x31, 0xfd, 0x7c, 
+	0x1b, 0xfe, 0xaf, 0xcb, 0x2f, 0x7f, 0xfc, 0xfa, 
+	0xeb, 0xdf, 0xb2, 0x95, 0x61, 0x86, 0x5f, 0xfe, 
+	0xf8, 0xe1, 0x17, 0x1b, 0xfe, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xd3, 0xfb, 0x3f, 0xbd, 
+	0xbe, 0xb5, 0x9f, 0x7e, 0xfb, 0xe5, 0x97, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0x2f, 0xbf, 0xf8, 0xfa, 
+	0xeb, 0xad, 0x9e, 0xfa, 0xfa, 0xd7, 0x5f, 0x7c, 
+	0xd1, 0x55, 0xc7, 0x5e, 0x7f, 0xfd, 0x6f, 0x1e, 
+	0xff, 0xec, 0xf3, 0xcf, 0x36, 0xdf, 0xf0, 0x2b, 
+	0xc7, 0xf7, 0x7f, 0x7e, 0x63, 0xd7, 0xfe, 0xff, 
+	0xda, 0x7e, 0xff, 0x9b, 0xeb, 0xaf, 0x5f, 0x7e, 
+	0xbe, 0xfb, 0xef, 0xdf, 0x7b, 0xbe, 0xff, 0xfb, 
+	0xbd, 0xdc, 0xdf, 0xfb, 0xbf, 0xff, 0xfb, 0x6e, 
+	0xe6, 0x7d, 0x7e, 0x77, 0x5f, 0x77, 0xfd, 0x6f, 
+	0xbe, 0x7e, 0xff, 0x8f, 0xbf, 0xe7, 0xfb, 0xea, 
+	0xfe, 0xff, 0xfd, 0xff, 0xbf, 0x31, 0xf7, 0x7b, 
+	0xff, 0xfd, 0xfe, 0xcf, 0xfb, 0xeb, 0xbf, 0xff, 
+	0xbb, 0x97, 0xe6, 0x9f, 0x7e, 0xb1, 0xf5, 0xfe, 
+	0xfd, 0x67, 0xf4, 0x7f, 0xbb, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xbf, 0x7f, 0xff, 
+	0xfd, 0x35, 0xdf, 0x7a, 0xff, 0xfe, 0x9b, 0xff, 
+	0xff, 0xfb, 0x7f, 0x7f, 0x5f, 0xef, 0xeb, 0xef, 
+	0x6b, 0xff, 0x5d, 0xfb, 0xdd, 0xd7, 0xff, 0x7d, 
+	0xfe, 0xed, 0xdf, 0x46, 0xef, 0xfd, 0x7f, 0xff, 
+	0xb7, 0x6f, 0xff, 0x7f, 0x37, 0xdf, 0xff, 0x76, 
+	0x5f, 0x5e, 0xed, 0xef, 0xf5, 0xd9, 0xff, 0xbf, 
+	0xf1, 0xe7, 0xff, 0xff, 0xfc, 0xf1, 0xff, 0xff, 
+	0xbe, 0xbf, 0xfb, 0xef, 0xe6, 0xbb, 0xfe, 0xb8, 
+	0xaf, 0xed, 0xb5, 0xef, 0x6b, 0xfc, 0xef, 0xf3, 
+	0xdc, 0xf3, 0xff, 0x15, 0xff, 0xbc, 0xe3, 0x17, 
+	0xe7, 0x9e, 0xfd, 0xe3, 0x1f, 0xf7, 0xff, 0xff, 
+	0xff, 0x9b, 0xfb, 0xff, 0xb7, 0xfd, 0xf6, 0xff, 
+	0x6f, 0xae, 0xfd, 0xfb, 0xef, 0xff, 0x7e, 0xd7, 
+	0x79, 0xee, 0xef, 0xe5, 0xaf, 0xff, 0xe6, 0xfe, 
+	0xdf, 0x7b, 0xfe, 0xfd, 0xab, 0xdf, 0x2e, 0xf9, 
+	0xff, 0xf7, 0xdf, 0x7f, 0x9d, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xa9, 0x3f, 0xff, 0xfe, 0xff, 
+	0xcf, 0xfb, 0xdf, 0xff, 0xf7, 0xe4, 0xef, 0xb6, 
+	0xd3, 0x56, 0x3b, 0xfd, 0xf7, 0xdb, 0xff, 0x6d, 
+	0xfe, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xff, 0x77, 
+	0xff, 0xff, 0xdf, 0x7d, 0xfe, 0xfd, 0xf6, 0xff, 
+	0xff, 0xfe, 0xfb, 0xfb, 0x9a, 0xfb, 0x72, 0xe7, 
+	0xff, 0xd7, 0x9f, 0x79, 0xf9, 0xd7, 0xff, 0xff, 
+	0xfb, 0xfa, 0x7f, 0xff, 0xfe, 0xfe, 0xce, 0x0b, 
+	0x3f, 0xa6, 0xff, 0xbf, 0xff, 0xff, 0xcb, 0xee, 
+	0xbf, 0xe5, 0xe4, 0xf2, 0xdf, 0xdf, 0xd9, 0xe5, 
+	0x3f, 0x8f, 0x7a, 0xff, 0xf9, 0x8f, 0xd9, 0xcf, 
+	0x7f, 0xfe, 0xf9, 0xf1, 0x9f, 0x3f, 0xfb, 0x65, 
+	0xf3, 0xfb, 0x7d, 0x5e, 0xff, 0xcf, 0x9f, 0xf5, 
+	0x57, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0x7f, 0xa9, 
+	0xe9, 0xfe, 0xfb, 0x66, 0xfe, 0xdc, 0xaf, 0xfd, 
+	0x67, 0xb6, 0x4b, 0x6d, 0xb5, 0xf5, 0xff, 0x1a, 
+	0xf5, 0xff, 0xff, 0xcf, 0x3a, 0xff, 0xff, 0x3f, 
+	0xff, 0x3f, 0xf7, 0xd9, 0xcf, 0x9f, 0x6d, 0xd6, 
+	0xeb, 0xaf, 0xff, 0x57, 0xe6, 0xb6, 0x7d, 0xff, 
+	0xfd, 0xf7, 0xf3, 0x7f, 0xef, 0xfc, 0x66, 0xaf, 
+	0x9f, 0xef, 0x39, 0xef, 0xff, 0xd7, 0x5e, 0xfb, 
+	0xbb, 0x91, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x5c, 
+	0xff, 0x7b, 0xef, 0xfe, 0xeb, 0xdd, 0x75, 0xc3, 
+	0xfd, 0xf7, 0xbf, 0xfb, 0xea, 0x6c, 0xec, 0xff, 
+	0xdf, 0x3f, 0xab, 0xff, 0xf7, 0xfb, 0x76, 0xe9, 
+	0xdf, 0xfa, 0xbd, 0xfd, 0xf7, 0x5f, 0xff, 0x7f, 
+	0xff, 0xbf, 0x19, 0xfb, 0xff, 0xec, 0xc3, 0xda, 
+	0xdf, 0xf1, 0xbd, 0xcf, 0xca, 0xb7, 0xdf, 0xc6, 
+	0xa5, 0x9d, 0xd6, 0x5f, 0x7b, 0xed, 0x6f, 0xc6, 
+	0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 
+	0xff, 0xfd, 0x6e, 0xbf, 0xed, 0xd2, 0x4b, 0xfe, 
+	0xff, 0xdd, 0xf7, 0xbd, 0x79, 0xdf, 0xe7, 0x9f, 
+	0x7f, 0xfe, 0xfb, 0xe7, 0xbf, 0x7f, 0xf6, 0x27, 
+	0xce, 0x3f, 0xeb, 0xec, 0xff, 0x7f, 0xfe, 0x79, 
+	0x6f, 0xaa, 0xef, 0xfc, 0xf3, 0x8f, 0x3f, 0xff, 
+	0x78, 0xfb, 0xcd, 0x73, 0xbf, 0xb5, 0x66, 0x9b, 
+	0x76, 0x7f, 0xbd, 0xf4, 0xbf, 0x99, 0xf8, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xdb, 0x3b, 0xbf, 
+	0xfd, 0xed, 0xbf, 0xcf, 0xbe, 0xff, 0xdf, 0x3e, 
+	0xfb, 0xee, 0xe6, 0xfe, 0xbf, 0xff, 0xfe, 0xef, 
+	0xef, 0xff, 0xfe, 0xfa, 0xeb, 0xdf, 0xfd, 0xfd, 
+	0xdd, 0xf7, 0xff, 0xb7, 0xdb, 0xde, 0xbb, 0xb9, 
+	0xfd, 0x57, 0x1f, 0x27, 0xfc, 0xf5, 0xc2, 0x2f, 
+	0x2f, 0xfd, 0xa3, 0x87, 0x36, 0x7a, 0xba, 0xfd, 
+	0xb5, 0xd7, 0xfe, 0x6e, 0xde, 0xff, 0xfb, 0xef, 
+	0x8b, 0xff, 0xb6, 0xf8, 0xea, 0x8b, 0xf7, 0x7c, 
+	0xf7, 0xc7, 0x17, 0x7f, 0xfe, 0xf7, 0xdf, 0xdf, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xfb, 0x2f, 
+	0xff, 0xfc, 0xfe, 0xff, 0x7f, 0xfe, 0xdd, 0xff, 
+	0xdf, 0xff, 0xf7, 0xff, 0xff, 0xe6, 0xfd, 0xff, 
+	0x73, 0x8f, 0x3e, 0xff, 0xe8, 0xa3, 0xcf, 0x3e, 
+	0xef, 0xf9, 0x47, 0x96, 0x7f, 0xf6, 0xd1, 0x47, 
+	0x9f, 0xbf, 0xf9, 0xff, 0xe7, 0xdf, 0x7f, 0xff, 
+	0xf8, 0xf7, 0xcb, 0xbf, 0xff, 0xfd, 0xff, 0xbf, 
+	0x7d, 0xfe, 0xf9, 0xff, 0xff, 0xff, 0x6f, 0xfe, 
+	0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xfa, 
+	0xfb, 0xff, 0x7f, 0xff, 0xed, 0x95, 0x77, 0x7e, 
+	0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xf7, 0xfe, 0xfb, 
+	0xe7, 0xbb, 0x7f, 0xbe, 0xf8, 0xef, 0x7f, 0xff, 
+	0x7d, 0xf7, 0xdf, 0xdf, 0x5f, 0x7d, 0xf5, 0xff, 
+	0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xaf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xdf, 
+	0xe7, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xfd, 0xbf, 0xfd, 0xff, 0xdb, 0xfd, 0x7f, 
+	0xfa, 0xa5, 0x37, 0xff, 0xee, 0x7f, 0xed, 0xaf, 
+	0xfb, 0x6f, 0xfe, 0xff, 0xa3, 0xaf, 0xbf, 0xea, 
+	0xea, 0xab, 0x2f, 0xbf, 0xba, 0x55, 0xd3, 0x5d, 
+	0x7f, 0xf5, 0xd5, 0xc7, 0x5f, 0xfb, 0x9b, 0x8f, 
+	0x3d, 0xf6, 0xff, 0xb3, 0x3b, 0x3f, 0x3b, 0x28, 
+	0xe3, 0xff, 0xff, 0x7f, 0xd9, 0xe5, 0x7e, 0x9b, 
+	0xef, 0x9b, 0xff, 0xa6, 0xff, 0xf9, 0xff, 0x6f, 
+	0xec, 0xff, 0x9b, 0xdf, 0xf7, 0xfe, 0xff, 0xff, 
+	0x36, 0x5d, 0xd3, 0xfe, 0xfb, 0xaf, 0xff, 0x9f, 
+	0xf9, 0xf7, 0xfd, 0xbf, 0xf3, 0xff, 0xdb, 0xfd, 
+	0xef, 0xe7, 0xdf, 0xbb, 0xfe, 0xff, 0xae, 0xb7, 
+	0xff, 0xbf, 0xff, 0xff, 0x6b, 0xf8, 0xff, 0xff, 
+	0xff, 0xe3, 0x3d, 0xff, 0xee, 0xf3, 0xef, 0x7f, 
+	0xfe, 0xaf, 0xf9, 0xfe, 0xfd, 0x3e, 0xfc, 0xf5, 
+	0xeb, 0x19, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0xff, 
+	0xef, 0xbf, 0xff, 0x6f, 0xf6, 0xf7, 0xdf, 0xff, 
+	0xff, 0xfd, 0xbf, 0x5f, 0xfd, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xbf, 0xbf, 0xfe, 0xfd, 0x7b, 0xbf, 
+	0xff, 0x3f, 0xff, 0x3d, 0xf7, 0xeb, 0xfe, 0xdb, 
+	0x6f, 0xf7, 0xaf, 0xf1, 0xff, 0xcf, 0x7f, 0xff, 
+	0xff, 0xff, 0xdf, 0xdf, 0x7f, 0xf7, 0xff, 0xff, 
+	0xfe, 0xfb, 0x7f, 0xb3, 0x3d, 0xf3, 0xff, 0x6f, 
+	0xfa, 0xfb, 0x57, 0xdf, 0x7f, 0xff, 0xec, 0xff, 
+	0x7f, 0xff, 0xef, 0xfb, 0xf7, 0xbf, 0xff, 0x7f, 
+	0xff, 0xd9, 0xa7, 0xfe, 0x1b, 0xff, 0xff, 0x3f, 
+	0xbf, 0xf4, 0xf2, 0xf7, 0x3f, 0x77, 0x6c, 0xe5, 
+	0x8b, 0x37, 0xfe, 0xf9, 0xfd, 0xfb, 0xfb, 0xff, 
+	0xff, 0xe6, 0xff, 0xff, 0x6f, 0x37, 0xc7, 0xfa, 
+	0x7f, 0x6f, 0xbf, 0xfd, 0xed, 0xb7, 0x7d, 0x1f, 
+	0xdb, 0x7f, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0x7f, 
+	0xb3, 0x9f, 0x3f, 0xff, 0xdb, 0x73, 0xef, 0xb6, 
+	0xdb, 0xff, 0xf6, 0x49, 0xff, 0x7b, 0xfd, 0xe5, 
+	0xd2, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xdf, 0xe7, 
+	0xf7, 0xbb, 0xfe, 0xaa, 0x6b, 0x7f, 0xf3, 0xad, 
+	0x5b, 0xff, 0x5d, 0x7a, 0xf9, 0xf5, 0xff, 0x9b, 
+	0xef, 0xef, 0xff, 0xdf, 0xed, 0xfd, 0xef, 0xbf, 
+	0xff, 0xbe, 0x5f, 0x5d, 0xff, 0xff, 0xff, 0xfe, 
+	0xfd, 0xfd, 0xf7, 0xff, 0x86, 0xff, 0xbf, 0xbf, 
+	0xff, 0xce, 0xef, 0xef, 0xbc, 0xe4, 0x92, 0xd7, 
+	0x74, 0xf9, 0x7d, 0xfb, 0xfd, 0x7f, 0xfe, 0xff, 
+	0x8f, 0xd9, 0xff, 0xf7, 0xfb, 0xef, 0xf3, 0xff, 
+	0xde, 0xdb, 0x6c, 0x65, 0x8b, 0x6d, 0xb6, 0xdf, 
+	0x7f, 0xff, 0xd5, 0xd7, 0xff, 0x6d, 0xfe, 0xff, 
+	0xff, 0xfb, 0x6f, 0xa5, 0xb6, 0xdf, 0x76, 0xdb, 
+	0xdd, 0xee, 0x99, 0xe7, 0xf7, 0xd2, 0x6b, 0xbd, 
+	0xf5, 0xff, 0x9b, 0xf5, 0xff, 0xbf, 0xff, 0x3e, 
+	0xeb, 0xb5, 0xd7, 0x5c, 0x6b, 0x9d, 0x6b, 0x65, 
+	0xf7, 0xfd, 0xf7, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 
+	0xfe, 0x7f, 0xbf, 0xdd, 0x76, 0xdf, 0x6f, 0xbf, 
+	0xd5, 0x66, 0x37, 0xf3, 0x7e, 0x2b, 0xff, 0x7d, 
+	0xd3, 0x4d, 0xaf, 0xbb, 0x99, 0xff, 0xff, 0xbb, 
+	0xe2, 0xce, 0xfb, 0xee, 0xb9, 0xef, 0x5e, 0xf7, 
+	0xdc, 0x57, 0xdf, 0x7d, 0xf5, 0xff, 0xfb, 0xed, 
+	0x6c, 0xec, 0xff, 0xdf, 0x2b, 0xaf, 0xab, 0xbc, 
+	0x8b, 0x7e, 0xb9, 0xd1, 0xcd, 0xb5, 0xd7, 0xf6, 
+	0xdf, 0xff, 0x7f, 0xff, 0xbe, 0x99, 0xfb, 0xff, 
+	0x84, 0xc7, 0xde, 0x6b, 0xbf, 0xf5, 0xf2, 0x5b, 
+	0xdf, 0x72, 0x5b, 0x2f, 0xfc, 0xf7, 0x5b, 0x7b, 
+	0x2d, 0xee, 0xe6, 0xfd, 0xdf, 0x7f, 0xff, 0x6f, 
+	0xf7, 0xdb, 0x6b, 0xb9, 0xa5, 0x2c, 0xbd, 0xfc, 
+	0xfa, 0xdf, 0xfe, 0xf5, 0xdd, 0xf7, 0xbd, 0x79, 
+	0xff, 0xe7, 0x9f, 0xff, 0xf7, 0xf9, 0xe6, 0x9b, 
+	0x6c, 0x72, 0x93, 0x4d, 0x3e, 0xff, 0x7f, 0xff, 
+	0x5d, 0x76, 0x79, 0x6f, 0xec, 0xff, 0xfc, 0xe3, 
+	0xef, 0x3e, 0xbe, 0xf8, 0xf2, 0x8b, 0x5f, 0x7c, 
+	0xf1, 0xc6, 0xdf, 0x5f, 0x3f, 0xfd, 0xf5, 0xbf, 
+	0x99, 0xf9, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 
+	0xbf, 0xf7, 0xde, 0xf7, 0xde, 0xb3, 0xef, 0xff, 
+	0x7f, 0xd7, 0x7e, 0xfb, 0xcf, 0xa6, 0xfe, 0xbf, 
+	0xff, 0xef, 0xff, 0xff, 0xfb, 0x6f, 0xbe, 0xfd, 
+	0xed, 0xb7, 0xf7, 0xff, 0xff, 0xff, 0xb7, 0xdf, 
+	0xfe, 0xab, 0xb9, 0xff, 0xd3, 0x1f, 0xbf, 0xf5, 
+	0xf1, 0x47, 0x5f, 0x7d, 0xfc, 0xe3, 0x8f, 0x1f, 
+	0xfa, 0xff, 0xef, 0xb5, 0xd7, 0xfe, 0x6e, 0xd8, 
+	0xff, 0xd8, 0xef, 0xbb, 0xff, 0xf6, 0xf9, 0xe7, 
+	0x9f, 0xfd, 0xec, 0xf3, 0xc7, 0xba, 0xff, 0xed, 
+	0xd7, 0x5f, 0xdf, 0x98, 0xff, 0xbe, 0xff, 0xfd, 
+	0xfb, 0xdf, 0xff, 0xbf, 0x7e, 0xfa, 0x57, 0x4d, 
+	0xed, 0xf5, 0x75, 0xfe, 0xfb, 0xff, 0xdf, 0xff, 
+	0xe6, 0xff, 0xef, 0xf3, 0x8f, 0x3f, 0xff, 0xdc, 
+	0xa2, 0x8f, 0x3c, 0xf5, 0xd1, 0x63, 0x1f, 0x7d, 
+	0xfe, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xe3, 
+	0xdf, 0x6f, 0xff, 0xfd, 0xf2, 0x8b, 0x2f, 0x7e, 
+	0xf9, 0xf5, 0xda, 0xff, 0x7e, 0xfd, 0xff, 0xff, 
+	0xff, 0x6f, 0xf8, 0xdf, 0xfe, 0xff, 0xcf, 0xff, 
+	0xbf, 0xbe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xff, 
+	0xbf, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 
+	0xbf, 0xfe, 0xf9, 0xee, 0x9f, 0x2f, 0xfa, 0xfb, 
+	0xef, 0x3f, 0xff, 0xfd, 0xf5, 0xf5, 0x57, 0x5f, 
+	0x7d, 0xf5, 0xff, 0xe6, 0xfe, 0xef, 0xff, 0xff, 
+	0xfe, 0xff, 0xeb, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xf9, 0xf5, 0xff, 0xff, 0xff, 0xb7, 
+	0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 
+	0xff, 0xff, 0xfe, 0xff, 0xfd, 0x97, 0x9f, 0xfa, 
+	0xfb, 0xfd, 0xb7, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 
+	0xaf, 0xbe, 0x7e, 0xf8, 0xcb, 0x2f, 0xbe, 0xfc, 
+	0x55, 0x97, 0x0b, 0x6d, 0xf9, 0xd5, 0xc6, 0x1b, 
+	0xff, 0x9a, 0xff, 0xff, 0xff, 0xf4, 0xef, 0x0f, 
+	0xbf, 0xff, 0xee, 0xb3, 0xbf, 0x7d, 0xf6, 0xb9, 
+	0xff, 0xf7, 0xfb, 0x3e, 0xf7, 0xde, 0xc6, 0xff, 
+	0xfe, 0x97, 0xff, 0xff, 0x7d, 0xff, 0xfb, 0xbb, 
+	0x6f, 0x7b, 0xf7, 0xd5, 0xb5, 0xbb, 0x7f, 0xaf, 
+	0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xd3, 0xf5, 0xd7, 0xdd, 0xff, 0xbb, 
+	0xef, 0xfe, 0xfe, 0x7f, 0xff, 0xff, 0xef, 0x6b, 
+	0xfe, 0xd7, 0xff, 0xff, 0xf3, 0xfd, 0xaf, 0xfb, 
+	0xfa, 0xeb, 0x5c, 0xfb, 0xfd, 0xed, 0xff, 0x7f, 
+	0xfc, 0xbd, 0x57, 0xff, 0x9b, 0xfd, 0xff, 0xff, 
+	0xff, 0xaf, 0xfd, 0xbd, 0xff, 0xfe, 0xf9, 0xdf, 
+	0xbf, 0xff, 0xfb, 0xdf, 0xf1, 0xaf, 0xff, 0x7e, 
+	0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf3, 
+	0xcf, 0xef, 0x7a, 0xfe, 0xec, 0xff, 0xff, 0xeb, 
+	0xdf, 0x73, 0x9f, 0x3f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xf7, 0xbf, 0xff, 0xbf, 0xbe, 0xfa, 0xfb, 0x7f, 
+	0x9f, 0xff, 0xef, 0xfe, 0x5f, 0x7c, 0xdf, 0xf1, 
+	0xff, 0xf7, 0x6f, 0xee, 0xff, 0xb7, 0xdf, 0xff, 
+	0x7f, 0xff, 0xed, 0x7e, 0xff, 0xff, 0xf9, 0xf7, 
+	0x7f, 0xfe, 0xdb, 0xf7, 0xff, 0xfe, 0x7e, 0x9b, 
+	0xff, 0xff, 0xfe, 0xef, 0xbf, 0xfe, 0xdf, 0xdf, 
+	0xfb, 0xff, 0xfd, 0xff, 0x76, 0xfe, 0xd1, 0xef, 
+	0x1f, 0x7f, 0xec, 0xff, 0xa6, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xb7, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0x7f, 0xff, 0xfb, 0xb7, 0xbf, 0x7d, 0xf7, 
+	0xbb, 0xd9, 0x7f, 0xef, 0xdf, 0xff, 0xdf, 0xb6, 
+	0x7b, 0x4f, 0x3d, 0xd7, 0xbd, 0xf7, 0xef, 0x7b, 
+	0xff, 0xf5, 0xe7, 0xd7, 0xff, 0x6f, 0xfc, 0xff, 
+	0xfd, 0xff, 0xcf, 0xad, 0xdf, 0xff, 0xf9, 0x67, 
+	0x3e, 0xb3, 0xf4, 0xff, 0x57, 0xb6, 0xff, 0xec, 
+	0xe7, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xfb, 0xef, 0xff, 0xfe, 0xfb, 0xdf, 0xbf, 0xff, 
+	0xdf, 0xfc, 0xff, 0x6f, 0xff, 0xfe, 0xfe, 0xa6, 
+	0x7f, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0x77, 0xbe, 0xf9, 0xe5, 0x95, 0xd7, 
+	0x7c, 0xd9, 0xfd, 0xad, 0xd9, 0xcf, 0xfe, 0xff, 
+	0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 
+	0xff, 0xfa, 0xf3, 0xfe, 0xf9, 0x6d, 0x9e, 0xff, 
+	0x6c, 0xfe, 0xff, 0xfe, 0x7f, 0xfa, 0xf9, 0xe7, 
+	0xfe, 0xff, 0xff, 0x7f, 0xff, 0xeb, 0x4f, 0x96, 
+	0x6b, 0x2e, 0x8b, 0xef, 0xff, 0x9b, 0xf5, 0xef, 
+	0xff, 0xdf, 0x3b, 0xff, 0xb9, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xfe, 0x9f, 0x5d, 0x96, 0xd3, 0xfd, 
+	0xf7, 0x57, 0xe6, 0xfe, 0x6d, 0xf6, 0xed, 0x57, 
+	0xf7, 0x7f, 0xbf, 0xfd, 0xf6, 0xb7, 0xff, 0xff, 
+	0xf9, 0xef, 0xbf, 0xf3, 0x5e, 0xaf, 0xbb, 0x99, 
+	0x2f, 0xae, 0xfd, 0xff, 0xd9, 0x6c, 0xef, 0x6f, 
+	0xbf, 0xfd, 0xcf, 0xfe, 0xff, 0xff, 0x7d, 0x35, 
+	0xd4, 0x52, 0xff, 0x6c, 0xec, 0xff, 0x5e, 0x3f, 
+	0x7b, 0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xfb, 
+	0xff, 0xff, 0xd2, 0x5e, 0x6f, 0xbf, 0xf5, 0xbf, 
+	0x99, 0xfb, 0xef, 0xfc, 0xc3, 0xfb, 0xcf, 0xfc, 
+	0xfe, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xe7, 0x95, 
+	0x5f, 0xd2, 0x59, 0xfd, 0x6f, 0xc6, 0xbd, 0xdd, 
+	0x7f, 0xdb, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xff, 
+	0xfe, 0xff, 0xed, 0xf2, 0x8b, 0x2f, 0xbd, 0xec, 
+	0xff, 0xbd, 0x59, 0x9f, 0xe7, 0x9f, 0xfd, 0xf7, 
+	0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x3c, 
+	0xeb, 0xfc, 0xb3, 0xce, 0x7e, 0x7f, 0x6f, 0xec, 
+	0xff, 0xf4, 0xf3, 0xee, 0x3b, 0xd7, 0xfc, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xe6, 0x99, 0x6f, 0xb6, 
+	0x99, 0xf6, 0xbf, 0x99, 0xf9, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x9f, 0xcf, 0xbe, 0xf9, 0xe6, 0xbb, 0xe7, 0xce, 
+	0xe6, 0xfe, 0xbf, 0xff, 0xfe, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xed, 0xb7, 
+	0xdf, 0x7e, 0xf7, 0xed, 0xbb, 0xb9, 0xff, 0xd7, 
+	0x4b, 0xff, 0xff, 0xfd, 0x6a, 0xff, 0xff, 0xf7, 
+	0xff, 0xc7, 0x3b, 0x5a, 0x28, 0xe3, 0x85, 0xdf, 
+	0xfe, 0x6e, 0xde, 0xff, 0xfb, 0xe2, 0xbf, 0xbf, 
+	0xb7, 0xd8, 0xef, 0xbf, 0xff, 0xfd, 0xf9, 0xcf, 
+	0x13, 0xff, 0x7c, 0xf1, 0xcd, 0xdf, 0x9b, 0xff, 
+	0xff, 0xdb, 0xff, 0xbb, 0xff, 0x2f, 0xfb, 0xff, 
+	0xff, 0xff, 0xfb, 0xfd, 0xd9, 0xdf, 0x77, 0x7d, 
+	0xaf, 0xfd, 0xf7, 0xe6, 0xff, 0xff, 0xf3, 0xcf, 
+	0x3e, 0xfb, 0xe8, 0xf3, 0xcf, 0x3f, 0xff, 0xf9, 
+	0xc7, 0x9f, 0x7f, 0xfc, 0x91, 0xc7, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xf9, 0xfa, 
+	0xef, 0xbf, 0xff, 0xfd, 0xef, 0x97, 0x7f, 0xff, 
+	0xfb, 0xcf, 0xdf, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xfa, 0xff, 0xff, 0xbf, 0xfe, 0xfb, 0xef, 0x7f, 
+	0xff, 0xff, 0xf5, 0xd7, 0xdf, 0xff, 0xff, 0xfd, 
+	0xff, 0x9b, 0xff, 0xff, 0xfe, 0xfb, 0xeb, 0xfb, 
+	0xaf, 0xfe, 0xfa, 0xeb, 0x5f, 0xff, 0xfe, 0xf1, 
+	0xdf, 0x17, 0xff, 0xfd, 0xf5, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xf6, 0xeb, 0xbf, 0xff, 
+	0xfe, 0xf7, 0xbf, 0xdf, 0x7f, 0xff, 0xff, 0xdf, 
+	0x7f, 0xff, 0xbd, 0xd9, 0xff, 0xff, 0xbf, 0xff, 
+	0xbf, 0xfc, 0xf2, 0xd3, 0x4f, 0x3f, 0xfa, 0xff, 
+	0xff, 0xbb, 0xfe, 0xba, 0xfd, 0xff, 0xff, 0x6f, 
+	0xfe, 0xff, 0xab, 0xaf, 0xbf, 0xfe, 0xea, 0xab, 
+	0xad, 0x17, 0xa4, 0xf1, 0xd3, 0x5e, 0x7f, 0xfd, 
+	0x75, 0x47, 0x5f, 0x1f, 0x9b, 0xcf, 0xff, 0xff, 
+	0xef, 0xef, 0xf7, 0xde, 0xff, 0xef, 0xef, 0x7f, 
+	0xff, 0xfa, 0xb9, 0x67, 0xbf, 0x7e, 0xfe, 0xf9, 
+	0xff, 0xa6, 0xfe, 0xfd, 0xff, 0xef, 0xcf, 0xbf, 
+	0xbd, 0xff, 0xeb, 0xbf, 0xff, 0x76, 0xdb, 0x6e, 
+	0x7d, 0xfb, 0x54, 0xcf, 0xff, 0x9f, 0xb9, 0x7f, 
+	0xdf, 0xfd, 0xf7, 0xdf, 0xff, 0xd7, 0xff, 0xf7, 
+	0xdd, 0xff, 0xbf, 0xef, 0xff, 0xf7, 0xff, 0xbf, 
+	0xdf, 0xff, 0x6f, 0xcc, 0xf7, 0xef, 0xff, 0xff, 
+	0xaf, 0xb7, 0xfc, 0xf3, 0xcf, 0x7d, 0x7b, 0xbc, 
+	0xff, 0xc7, 0x1b, 0x63, 0xad, 0xd7, 0xff, 0x19, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0x57, 0xaf, 0x6d, 
+	0xff, 0xfd, 0x6f, 0xdf, 0xbf, 0x7f, 0xfd, 0xf5, 
+	0x5f, 0xdf, 0xfe, 0xdf, 0xe6, 0xff, 0xff, 0xff, 
+	0xfb, 0xf1, 0xbf, 0xe7, 0x9e, 0xf7, 0x7f, 0xf7, 
+	0x3f, 0x6f, 0xff, 0xfc, 0xf7, 0xdd, 0x7d, 0xe9, 
+	0xbf, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xaf, 0xfd, 
+	0xba, 0xdf, 0x7f, 0x67, 0xba, 0xed, 0xa7, 0xff, 
+	0x5f, 0xf6, 0xfd, 0xe7, 0xfd, 0x6b, 0xec, 0xff, 
+	0xff, 0x9f, 0xff, 0xbf, 0xfd, 0xdf, 0x7f, 0xff, 
+	0xd3, 0x9b, 0xbd, 0xf7, 0xfe, 0x7a, 0xfb, 0xe9, 
+	0xfc, 0xfa, 0x1b, 0xff, 0x8f, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x3f, 0xfc, 0x7c, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x0d, 0x67, 0xfc, 0xff, 0xe6, 
+	0xff, 0xdf, 0xff, 0xef, 0x7f, 0xef, 0xbf, 0xde, 
+	0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xdf, 0xff, 
+	0xee, 0x7f, 0xfb, 0xbf, 0xa9, 0xff, 0xff, 0xff, 
+	0xaf, 0xff, 0x6d, 0xf7, 0xcf, 0xda, 0xfb, 0xd3, 
+	0xf5, 0xd7, 0x4f, 0x3f, 0x79, 0xf5, 0x97, 0xff, 
+	0x6f, 0xfe, 0xff, 0xf9, 0xf7, 0x4f, 0x7f, 0xfd, 
+	0x73, 0xfb, 0xed, 0xfd, 0xff, 0x7d, 0x77, 0xde, 
+	0x7d, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xf7, 
+	0xfb, 0xff, 0xdb, 0xff, 0xff, 0xbf, 0xfe, 0xfd, 
+	0xff, 0xbf, 0xff, 0xf5, 0xfb, 0xdf, 0xff, 0xfd, 
+	0xdf, 0xff, 0x86, 0xff, 0xef, 0xfc, 0xff, 0xcb, 
+	0x6a, 0xaa, 0xaf, 0xe7, 0xf2, 0xfd, 0xd2, 0xfe, 
+	0xcf, 0xe7, 0xff, 0x7f, 0xf8, 0xff, 0x8f, 0xd9, 
+	0xff, 0x3e, 0xff, 0xff, 0xbe, 0x9e, 0xea, 0xeb, 
+	0xac, 0x7f, 0x3f, 0xb7, 0xd7, 0x4b, 0x7f, 0xfd, 
+	0xe5, 0xf7, 0xff, 0x6d, 0xfe, 0xff, 0xfe, 0xff, 
+	0xff, 0xaf, 0xa6, 0x9e, 0xfa, 0xab, 0xdf, 0x7a, 
+	0xbd, 0xf5, 0x56, 0x5b, 0x6f, 0x9d, 0xf7, 0xff, 
+	0x9b, 0xf5, 0xef, 0xff, 0xff, 0x7f, 0xeb, 0xac, 
+	0xbf, 0x9e, 0xfa, 0x67, 0x53, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0x67, 0xfd, 0xd7, 0xe6, 0xfe, 0x6f, 
+	0xf6, 0xfd, 0xbf, 0x9a, 0x69, 0xa5, 0x99, 0x76, 
+	0xbf, 0xf7, 0x4a, 0x2b, 0xfd, 0x35, 0xd3, 0x7e, 
+	0xab, 0xbb, 0x99, 0xff, 0x6e, 0xfd, 0xff, 0xbf, 
+	0x7a, 0xaa, 0xa9, 0xa6, 0xca, 0xef, 0x57, 0xfb, 
+	0xea, 0xbf, 0xef, 0x3e, 0x73, 0xed, 0x6c, 0xec, 
+	0xff, 0x56, 0x3f, 0xff, 0xaf, 0xa7, 0xfa, 0x2e, 
+	0xeb, 0xf5, 0x2e, 0xf5, 0xff, 0xfe, 0xf7, 0x8f, 
+	0xff, 0xd7, 0xbe, 0x99, 0xf9, 0xef, 0xfc, 0xc3, 
+	0xff, 0x2b, 0xa9, 0xfd, 0xf6, 0x0a, 0xff, 0x4b, 
+	0x7f, 0x2d, 0xb4, 0xd7, 0x58, 0x7b, 0x2f, 0xef, 
+	0xa6, 0xfd, 0xdf, 0x7f, 0xff, 0xcf, 0xf7, 0xde, 
+	0x76, 0xf3, 0xed, 0x7e, 0xff, 0xdf, 0x77, 0xdf, 
+	0x7d, 0xff, 0xfd, 0xc2, 0xbd, 0x79, 0xff, 0xe7, 
+	0x9f, 0xff, 0xf7, 0xf9, 0x67, 0x9e, 0x7d, 0xc6, 
+	0xbb, 0xfc, 0xf7, 0xd9, 0x65, 0x9f, 0x7d, 0x3e, 
+	0x73, 0x6b, 0xec, 0xff, 0xfc, 0x73, 0xed, 0x33, 
+	0xdd, 0xf8, 0xc3, 0x4c, 0x77, 0x76, 0xfd, 0xf4, 
+	0xd3, 0x4f, 0x3f, 0xbd, 0xc6, 0xbf, 0x99, 0xf9, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xdf, 0xbf, 
+	0xff, 0xfc, 0xff, 0x77, 0x7b, 0x6d, 0xb3, 0xc7, 
+	0xbe, 0xef, 0xcf, 0xe6, 0xfe, 0xbf, 0xff, 0xfe, 
+	0xff, 0xef, 0xfe, 0xfd, 0xff, 0xdb, 0xff, 0xff, 
+	0xdf, 0x7e, 0xdb, 0x6d, 0xb7, 0xfd, 0xff, 0xbb, 
+	0xa9, 0x7f, 0xd2, 0x5f, 0xbf, 0xbd, 0xf1, 0xc6, 
+	0x5f, 0x2f, 0xfc, 0xf7, 0xff, 0xd7, 0x5e, 0x7b, 
+	0xad, 0xb5, 0x17, 0xfe, 0x6a, 0xd8, 0xbf, 0xf8, 
+	0xef, 0xbb, 0x2f, 0xbe, 0xf8, 0x62, 0x8b, 0xf7, 
+	0xfc, 0xf7, 0xdf, 0x7f, 0xfd, 0xfd, 0xf7, 0xc4, 
+	0xdf, 0x9b, 0xff, 0xaf, 0xff, 0xff, 0xfe, 0xab, 
+	0xad, 0xbf, 0xfe, 0x6a, 0x7d, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xff, 0xff, 0xef, 0xe6, 0xbf, 
+	0xeb, 0xf3, 0xcf, 0x3e, 0xfe, 0xcc, 0xa3, 0x8f, 
+	0x3e, 0xff, 0xf9, 0x47, 0x0f, 0x7d, 0xf4, 0xd1, 
+	0xe7, 0x9e, 0xbf, 0xf9, 0xff, 0xf2, 0xff, 0xef, 
+	0xbf, 0xfc, 0xf2, 0xcb, 0x3f, 0x7f, 0xf3, 0xb5, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x6f, 
+	0xfe, 0xbf, 0xfc, 0xff, 0xef, 0xbf, 0xbf, 0xfd, 
+	0xf2, 0xcf, 0x7f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xdf, 0x9b, 0xff, 0xaf, 0xfe, 
+	0xfb, 0xeb, 0x8f, 0xbf, 0xfe, 0xfb, 0xeb, 0x7f, 
+	0x5f, 0x7f, 0xb5, 0xd5, 0x57, 0x5f, 0xfd, 0xf3, 
+	0xff, 0xe6, 0xff, 0xeb, 0xff, 0xbf, 0xff, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0xef, 0xd7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xfc, 0xf6, 0xff, 0xef, 
+	0x7d, 0xf3, 0xe9, 0xf6, 0x97, 0x7e, 0xfa, 0xc9, 
+	0xfe, 0xff, 0x6d, 0xfa, 0xff, 0xeb, 0xa7, 0xbe, 
+	0xde, 0x7a, 0x6b, 0xaf, 0xbe, 0xd4, 0xe1, 0xd6, 
+	0x5f, 0x7a, 0xbd, 0x55, 0xc7, 0x1f, 0xfc, 0x9a, 
+	0xff, 0xff, 0xff, 0xff, 0x3b, 0x6f, 0xed, 0xff, 
+	0xfc, 0xfd, 0x97, 0xff, 0xf7, 0xfe, 0x7b, 0x7a, 
+	0xff, 0xff, 0xfd, 0xef, 0xc6, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xeb, 0xfd, 0xda, 0xff, 0xfb, 0xfb, 
+	0xff, 0xff, 0xff, 0xbb, 0x6f, 0xff, 0xfd, 0xff, 
+	0x9f, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xf7, 
+	0x3f, 0xce, 0xf7, 0xfc, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xbf, 0xef, 0xff, 0x6f, 0xfe, 0xff, 
+	0x7f, 0xff, 0xeb, 0x6f, 0x9f, 0xbe, 0xfe, 0xcb, 
+	0x5e, 0x66, 0xbd, 0xb5, 0x53, 0x5f, 0xff, 0xbd, 
+	0xf5, 0x7f, 0x9b, 0xff, 0xff, 0xff, 0xfb, 0xfb, 
+	0xef, 0x9f, 0xdf, 0xde, 0xf7, 0xbf, 0xdf, 0x76, 
+	0xfd, 0xf7, 0xdd, 0xb7, 0x5f, 0xdd, 0xff, 0xe6, 
+	0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xef, 0xbf, 
+	0x3f, 0xfc, 0xb1, 0xff, 0xf7, 0x7f, 0xbb, 0xfd, 
+	0xff, 0xff, 0xbf, 0xbf, 0xf9, 0xf7, 0xff, 0x9f, 
+	0xfd, 0xff, 0xf7, 0xdc, 0xfb, 0xf5, 0x3b, 0xbd, 
+	0xff, 0xf7, 0xff, 0xfd, 0xdb, 0xff, 0xfe, 0xff, 
+	0x6f, 0xee, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xfc, 
+	0xfe, 0xf3, 0xff, 0xe7, 0xff, 0xb7, 0xfd, 0xff, 
+	0xf7, 0xf9, 0xf7, 0xfe, 0x7f, 0x9b, 0xff, 0xff, 
+	0xff, 0xff, 0xfc, 0xf7, 0xcf, 0x53, 0x6f, 0xff, 
+	0xe7, 0x9e, 0x7e, 0x7c, 0xbf, 0xff, 0xed, 0x7f, 
+	0x7c, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xbf, 0xbd, 
+	0xfd, 0xad, 0xbf, 0xfe, 0xff, 0xef, 0xdf, 0x7f, 
+	0xdf, 0xff, 0xff, 0xfe, 0xfd, 0xfe, 0xbb, 0xf9, 
+	0xff, 0xfb, 0xeb, 0x7f, 0xff, 0xff, 0xbd, 0xef, 
+	0xb3, 0xf6, 0xdc, 0xf2, 0xff, 0xff, 0xbf, 0xdd, 
+	0xf7, 0xfe, 0xfd, 0x6e, 0xf4, 0x7f, 0xfd, 0xe3, 
+	0x5f, 0x7f, 0xfa, 0xff, 0xdb, 0x6a, 0xfb, 0xff, 
+	0xff, 0x27, 0xff, 0x3f, 0xff, 0xbc, 0xff, 0xbf, 
+	0x99, 0xff, 0xff, 0xff, 0xfe, 0xef, 0x7f, 0xff, 
+	0x3f, 0xfb, 0x7e, 0xf7, 0xdf, 0xef, 0xfd, 0xdf, 
+	0xdf, 0x7f, 0xff, 0xf7, 0xff, 0xa6, 0x7f, 0x7e, 
+	0x7f, 0xff, 0xff, 0xde, 0xab, 0x7c, 0xfc, 0xfb, 
+	0x75, 0x5e, 0xf8, 0x7d, 0xe3, 0xbd, 0x5a, 0xf3, 
+	0xfd, 0xaf, 0xd9, 0x9f, 0xff, 0xff, 0xf9, 0xbf, 
+	0xff, 0xfe, 0xff, 0x7f, 0x7f, 0xbf, 0xee, 0xfa, 
+	0xcb, 0x7d, 0x9f, 0xfd, 0xfc, 0xfe, 0x6d, 0xfe, 
+	0xff, 0x9f, 0xfa, 0xff, 0xef, 0xbf, 0x92, 0x6f, 
+	0x79, 0x5f, 0xe7, 0x9f, 0xc5, 0xf7, 0x7b, 0x6f, 
+	0xf7, 0xcf, 0xdf, 0x1b, 0xf5, 0xff, 0xbf, 0xfe, 
+	0xff, 0xfb, 0xa9, 0xbf, 0xff, 0x7f, 0xd7, 0xff, 
+	0x67, 0xfd, 0xfd, 0xda, 0x6b, 0xff, 0xf7, 0x57, 
+	0xc6, 0xfe, 0x7d, 0xff, 0xff, 0xf7, 0xde, 0x6b, 
+	0xb7, 0xdb, 0x37, 0xbd, 0xb7, 0xde, 0x79, 0xff, 
+	0xbd, 0xdf, 0x4f, 0xfb, 0xbb, 0x99, 0xbf, 0xff, 
+	0xbf, 0xff, 0xbe, 0xfb, 0x6a, 0xec, 0xf7, 0x46, 
+	0xf7, 0xe6, 0x5f, 0xcb, 0x7d, 0xef, 0x7d, 0xd1, 
+	0xfe, 0x6c, 0xec, 0xff, 0x5b, 0x3a, 0xbf, 0xef, 
+	0xb3, 0xfa, 0x73, 0x3e, 0xd5, 0xdd, 0xff, 0x9d, 
+	0xf2, 0x7e, 0x2f, 0xef, 0xf5, 0xbe, 0x99, 0xf9, 
+	0xff, 0xbd, 0xce, 0xdf, 0x3b, 0xa5, 0xbd, 0x9e, 
+	0x1f, 0xd7, 0x7a, 0xfc, 0xed, 0xfd, 0xdf, 0x78, 
+	0x7b, 0x0d, 0x6f, 0x46, 0xfd, 0xff, 0xf6, 0xff, 
+	0xfd, 0xb7, 0xdf, 0xfe, 0xe3, 0x6d, 0x6e, 0xfd, 
+	0xed, 0xb2, 0xdf, 0x7f, 0xf7, 0xff, 0xf3, 0xbd, 
+	0x71, 0xff, 0x7f, 0xff, 0x7d, 0xfe, 0x59, 0x67, 
+	0xfd, 0x7f, 0xf6, 0xb3, 0xde, 0x3e, 0xfb, 0xaf, 
+	0x9f, 0xdf, 0x3f, 0x6b, 0x6b, 0xec, 0xd7, 0x3e, 
+	0xbb, 0x0f, 0x3f, 0xcd, 0x68, 0xdb, 0x8d, 0x7b, 
+	0xb0, 0x7d, 0x07, 0xdf, 0x57, 0x7f, 0xfd, 0x67, 
+	0xbb, 0x99, 0xf9, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xf6, 0xfb, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xef, 
+	0xff, 0xf7, 0xdf, 0xff, 0xcf, 0xce, 0xe6, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xed, 0xf7, 
+	0xff, 0xed, 0xbb, 0xb9, 0xdf, 0xdb, 0x6b, 0x7f, 
+	0x9c, 0xd4, 0xd3, 0xbf, 0x2f, 0xfd, 0xa9, 0xb7, 
+	0x3f, 0x5a, 0xff, 0xef, 0xbf, 0x7f, 0xfe, 0x6e, 
+	0xde, 0xff, 0x5a, 0xe2, 0xbf, 0x2f, 0x9e, 0xf9, 
+	0x7f, 0x8b, 0xdf, 0x7c, 0xf1, 0xcf, 0x97, 0xfb, 
+	0xed, 0xd7, 0xcf, 0xdf, 0x9b, 0xff, 0xef, 0xbf, 
+	0xfe, 0xf7, 0xff, 0xbf, 0xf7, 0xfd, 0x7a, 0xd7, 
+	0xdf, 0x77, 0xf9, 0xfe, 0xd7, 0xfb, 0x7f, 0xf5, 
+	0xff, 0xe6, 0xff, 0xfb, 0xa3, 0xcb, 0x3f, 0xff, 
+	0xf8, 0xf1, 0x8f, 0x3e, 0xfd, 0xf8, 0x47, 0x9f, 
+	0x7f, 0x74, 0xf9, 0x45, 0x87, 0xbf, 0xf9, 0xff, 
+	0xfb, 0xff, 0xff, 0xbf, 0xfc, 0xf3, 0x9d, 0x2f, 
+	0xfe, 0xf9, 0xf6, 0x9f, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0x97, 0xef, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 
+	0x2f, 0xbf, 0xfc, 0xff, 0xeb, 0xdf, 0x7e, 0xfd, 
+	0xf7, 0xd7, 0x5f, 0x5f, 0x7d, 0x65, 0xfd, 0x9b, 
+	0xff, 0xee, 0xfe, 0xeb, 0xef, 0xbf, 0xbf, 0xb6, 
+	0xff, 0xeb, 0x5f, 0xdb, 0xfd, 0xf1, 0xff, 0x7f, 
+	0x5d, 0xf5, 0xb7, 0xff, 0x86, 0xff, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0x7f, 0xbf, 0xfe, 0xfc, 
+	0xfe, 0x7f, 0xff, 0xfb, 0xff, 0xd7, 0xff, 0xf7, 
+	0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 
+	0xfe, 0xfb, 0x6f, 0x7f, 0xf9, 0xe9, 0xff, 0x9e, 
+	0x7e, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf6, 0xff, 
+	0xcb, 0xaf, 0xbf, 0xda, 0xba, 0x6b, 0x8f, 0xbe, 
+	0xae, 0xd0, 0x07, 0x5f, 0x75, 0xfc, 0xb5, 0xd7, 
+	0x5e, 0xff, 0x9b, 0xfe, 0xff, 0xff, 0xdf, 0xaf, 
+	0x8f, 0x3e, 0x7d, 0xf7, 0xd0, 0x9e, 0xbe, 0xfa, 
+	0xfd, 0xef, 0x6f, 0xff, 0xff, 0xbb, 0xff, 0xc6, 
+	0xfb, 0xff, 0xfb, 0xdb, 0x7f, 0x3e, 0xbb, 0xfb, 
+	0xff, 0xdf, 0xff, 0xef, 0x6f, 0xff, 0x6e, 0xff, 
+	0xfd, 0xb7, 0xfd, 0x9f, 0xf9, 0xef, 0xff, 0x7f, 
+	0xff, 0x77, 0xff, 0x7d, 0xff, 0xab, 0x7f, 0xad, 
+	0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xfe, 0x3f, 0xde, 0xf8, 0xff, 0x7f, 0x3f, 
+	0xba, 0x72, 0xd3, 0x55, 0xbb, 0xbf, 0xc6, 0xff, 
+	0x6f, 0x6e, 0x71, 0x59, 0xff, 0x99, 0x7f, 0xdf, 
+	0xbf, 0xff, 0xff, 0xfd, 0xfd, 0xbf, 0xf9, 0xff, 
+	0xbf, 0xef, 0xfd, 0x7e, 0xff, 0xff, 0xff, 0xfe, 
+	0xef, 0xff, 0xe6, 0xef, 0xdf, 0xff, 0xff, 0xff, 
+	0xb9, 0xfa, 0xbe, 0xff, 0xbc, 0xb0, 0xfe, 0x7f, 
+	0xfa, 0xff, 0xb5, 0xc1, 0xff, 0xfb, 0xb7, 0xf9, 
+	0xff, 0xff, 0x7f, 0x7f, 0xbf, 0x7d, 0xff, 0x73, 
+	0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0x77, 0xfe, 
+	0xdf, 0xfd, 0xff, 0x6d, 0xf6, 0xff, 0xfb, 0x7f, 
+	0xff, 0xef, 0xf7, 0xdb, 0xee, 0xdd, 0xfb, 0xfd, 
+	0x6f, 0xcf, 0xff, 0xdf, 0xf7, 0xff, 0x1f, 0xff, 
+	0x9a, 0x5f, 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xfe, 
+	0x3f, 0xcf, 0xaf, 0x55, 0x9b, 0xf7, 0xff, 0xf9, 
+	0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfe, 0xff, 
+	0xcf, 0xff, 0xf7, 0xfb, 0xbf, 0xbe, 0xfe, 0xff, 
+	0xff, 0x51, 0xe7, 0x6d, 0x5e, 0xef, 0xfe, 0xff, 
+	0xfd, 0xbf, 0xf9, 0xef, 0xba, 0xeb, 0xfe, 0x79, 
+	0xed, 0xdb, 0xe3, 0xfe, 0xd5, 0xfd, 0xf5, 0x9e, 
+	0xff, 0x7f, 0xf9, 0xf5, 0xd7, 0xf7, 0x6a, 0xf4, 
+	0xff, 0xfe, 0xfb, 0xff, 0xfd, 0xdf, 0x6f, 0x7f, 
+	0xeb, 0xff, 0xdf, 0xff, 0xeb, 0xfd, 0x5f, 0xfe, 
+	0xf1, 0xf7, 0xfd, 0x9b, 0xff, 0xdf, 0x7f, 0xff, 
+	0xff, 0x7f, 0xef, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0xf7, 0x7f, 0xff, 0xbb, 0xff, 0xfd, 0xff, 
+	0x86, 0xff, 0xbb, 0xff, 0xb1, 0x5f, 0x6a, 0xea, 
+	0xaf, 0xe7, 0x5b, 0xd5, 0xff, 0xf3, 0x4f, 0xfd, 
+	0xcf, 0x3a, 0xdf, 0xfd, 0x8f, 0xd9, 0xff, 0xee, 
+	0xff, 0xec, 0xd7, 0xfb, 0xfa, 0xeb, 0xff, 0x64, 
+	0xf5, 0x7f, 0xfe, 0xd3, 0xff, 0x9b, 0xff, 0xf7, 
+	0xff, 0x6d, 0xfe, 0xf7, 0xfc, 0xff, 0x7b, 0xa9, 
+	0xe5, 0xff, 0xfb, 0xff, 0xfc, 0xe6, 0x2b, 0xff, 
+	0xf2, 0x53, 0x4b, 0xf5, 0xdf, 0xff, 0x9b, 0xf5, 
+	0xb5, 0xff, 0xff, 0x7e, 0xeb, 0xff, 0xa7, 0xce, 
+	0xff, 0xff, 0x9f, 0xcf, 0xff, 0x7f, 0xd6, 0x59, 
+	0x7f, 0xff, 0xd7, 0xe6, 0xfe, 0xbb, 0xff, 0xbd, 
+	0xb7, 0xda, 0x69, 0xff, 0xd5, 0x77, 0x85, 0x3f, 
+	0x6a, 0x2f, 0xed, 0xf5, 0xff, 0x7f, 0xfb, 0xbb, 
+	0x99, 0xff, 0xfe, 0xbf, 0xef, 0xbe, 0x2a, 0xea, 
+	0xbf, 0xf7, 0x46, 0xd9, 0x5e, 0x5b, 0xcd, 0xad, 
+	0xb7, 0xd4, 0x1f, 0xff, 0x6c, 0xec, 0xff, 0xd6, 
+	0x3f, 0xfb, 0xaf, 0xfe, 0xdf, 0x4f, 0xfa, 0xfd, 
+	0xeb, 0xeb, 0xfd, 0x77, 0x5b, 0xff, 0xef, 0xd7, 
+	0xbf, 0x99, 0xf8, 0xbf, 0xed, 0x53, 0xce, 0x7f, 
+	0xff, 0xc4, 0xb7, 0x4f, 0x36, 0xf1, 0xe4, 0xfd, 
+	0x3f, 0xfc, 0x5f, 0xff, 0xeb, 0xef, 0xe6, 0xfd, 
+	0x7f, 0x7e, 0xff, 0xfd, 0xb7, 0xdd, 0xff, 0xff, 
+	0x2d, 0x7e, 0xbf, 0xff, 0xe7, 0xcb, 0x7e, 0xfb, 
+	0xed, 0xe7, 0xbd, 0x79, 0xff, 0x2e, 0x9f, 0x7f, 
+	0xfe, 0xd9, 0x67, 0xff, 0x7d, 0xfe, 0xb7, 0x8e, 
+	0xfe, 0xf3, 0xec, 0xb7, 0xff, 0x3e, 0x73, 0x6f, 
+	0xec, 0xbf, 0xfe, 0xd3, 0xcf, 0x3f, 0xda, 0xbc, 
+	0x1b, 0xcd, 0x7f, 0xf6, 0xd9, 0xf7, 0x1f, 0x6c, 
+	0xdf, 0x2d, 0xd6, 0xbf, 0x99, 0xf9, 0xef, 0xfd, 
+	0xff, 0xff, 0xfd, 0xfe, 0xdf, 0x7f, 0xff, 0xff, 
+	0xee, 0xbf, 0xff, 0xbe, 0xf9, 0xef, 0xff, 0xff, 
+	0xcf, 0xa6, 0xfe, 0xdb, 0xff, 0xfe, 0xeb, 0xff, 
+	0xbf, 0xfe, 0xef, 0xfb, 0xdf, 0x7d, 0xfd, 0xf7, 
+	0x7f, 0xdf, 0xfd, 0xff, 0xff, 0xbb, 0xb9, 0xdf, 
+	0xdf, 0x4f, 0x2f, 0xbd, 0xf1, 0xd7, 0xff, 0x7f, 
+	0xfc, 0xa3, 0xc5, 0xf7, 0xdf, 0x7a, 0xfd, 0xb5, 
+	0x97, 0xfe, 0x6a, 0xd8, 0xfd, 0xeb, 0xe3, 0x8b, 
+	0x2d, 0x96, 0xf8, 0xe7, 0x9d, 0xfd, 0x6c, 0xf5, 
+	0xdd, 0x1b, 0x5f, 0xec, 0xf5, 0xcd, 0xdf, 0x9b, 
+	0xff, 0xaf, 0xff, 0xfe, 0xfa, 0xeb, 0xaf, 0xff, 
+	0xdf, 0xff, 0xbd, 0x5f, 0xee, 0xbf, 0xf5, 0xfe, 
+	0x5f, 0xef, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xb3, 
+	0x87, 0x0e, 0xf6, 0xe8, 0xf3, 0xcf, 0x1d, 0x7f, 
+	0xd1, 0xc7, 0x1f, 0x3d, 0xfe, 0xd0, 0xe7, 0x9f, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xcf, 0xa7, 0x9f, 0xfc, 
+	0xfa, 0xcf, 0x7f, 0xde, 0xff, 0xe7, 0xf7, 0xdf, 
+	0x3f, 0xb9, 0xf6, 0xb7, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xfe, 0xf3, 0xeb, 0x3b, 0xbf, 0xfe, 0xf7, 0xfe, 
+	0xff, 0x5f, 0xff, 0xfd, 0xdf, 0x5f, 0x7f, 0xff, 
+	0xe5, 0xff, 0x98, 0xff, 0xff, 0xfe, 0xda, 0x2a, 
+	0xaf, 0xff, 0xfe, 0xfb, 0x6f, 0x5f, 0x5d, 0xfc, 
+	0xf7, 0xdf, 0x3e, 0xff, 0xfd, 0xf7, 0xff, 0xe6, 
+	0xff, 0xff, 0xbf, 0xb7, 0xee, 0xfa, 0xeb, 0xff, 
+	0xbb, 0xff, 0xf7, 0xf7, 0xff, 0xfe, 0xff, 0xff, 
+	0xfe, 0xff, 0xff, 0x8f, 0xf9, 0xff, 0xe6, 0xff, 
+	0xef, 0xbf, 0xff, 0xff, 0xca, 0xeb, 0x3f, 0xfa, 
+	0xe5, 0x97, 0xdf, 0x7d, 0xf7, 0xad, 0xb5, 0xff, 
+	0x6f, 0xfa, 0xff, 0xab, 0xaf, 0xbf, 0xe6, 0xfa, 
+	0x63, 0x2e, 0xb6, 0xce, 0x75, 0xc7, 0x5d, 0x75, 
+	0xfd, 0xe1, 0x87, 0x5f, 0xef, 0x9a, 0xbf, 0x0f, 
+	0xfe, 0xf8, 0xe1, 0x4f, 0x37, 0xfd, 0xef, 0xbb, 
+	0xdd, 0x7d, 0xfa, 0xff, 0xef, 0x8f, 0x8f, 0x7d, 
+	0xde, 0xff, 0xc6, 0xff, 0x6b, 0xef, 0xb7, 0xbb, 
+	0xff, 0xeb, 0x7f, 0xdb, 0xcc, 0x7f, 0x7e, 0xfb, 
+	0x77, 0xdf, 0xf6, 0xff, 0xff, 0xb3, 0x9f, 0xe9, 
+	0xff, 0xff, 0x77, 0xdf, 0xbf, 0xf6, 0xff, 0xff, 
+	0xf7, 0xfe, 0xfd, 0xf5, 0xfd, 0xef, 0x3f, 0xf7, 
+	0xff, 0xfb, 0xbf, 0x6b, 0xfe, 0xff, 0xde, 0xff, 
+	0xdf, 0x0f, 0x37, 0xf6, 0xfa, 0xeb, 0x1c, 0x7e, 
+	0x9d, 0xf5, 0xf7, 0x5b, 0xef, 0xf5, 0xf5, 0xff, 
+	0x9b, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xdf, 
+	0x7f, 0xfe, 0xfb, 0xff, 0x3f, 0xff, 0x5c, 0xf7, 
+	0xad, 0xff, 0xff, 0x73, 0xff, 0x66, 0xbf, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x3b, 0xbd, 0xff, 
+	0x71, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xc7, 0xdd, 
+	0xff, 0xbf, 0xd9, 0xfb, 0xf7, 0xff, 0xff, 0xfc, 
+	0xff, 0xdf, 0xf3, 0xee, 0xdd, 0xfb, 0xfe, 0xfe, 
+	0xff, 0xfe, 0x7f, 0xef, 0xff, 0xfd, 0x6f, 0xfe, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xbb, 
+	0xbb, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xef, 
+	0xbf, 0x1f, 0xf3, 0x9b, 0xff, 0x8f, 0xff, 0xff, 
+	0xbf, 0xbf, 0x77, 0xeb, 0xb9, 0xff, 0xef, 0x0f, 
+	0x77, 0xdc, 0xf0, 0xff, 0xff, 0x7f, 0xfc, 0xff, 
+	0xe6, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 
+	0xfd, 0xf6, 0xff, 0xef, 0xbf, 0x6f, 0xff, 0x3b, 
+	0xff, 0xfb, 0xb7, 0xed, 0xbb, 0xf9, 0xb7, 0xfa, 
+	0xe9, 0xaf, 0xb3, 0xce, 0xb2, 0xed, 0xff, 0xd3, 
+	0xff, 0x7e, 0x97, 0x4d, 0xff, 0x7f, 0xf6, 0x9f, 
+	0xff, 0x6f, 0xfc, 0xff, 0xfe, 0x7b, 0xee, 0xff, 
+	0xfd, 0xff, 0xd3, 0xe9, 0xff, 0xdb, 0xfd, 0xf7, 
+	0xdf, 0xfd, 0xfd, 0xfd, 0xee, 0xff, 0x99, 0xfd, 
+	0xbf, 0x7d, 0xff, 0xfb, 0xff, 0xff, 0x3f, 0xfb, 
+	0xff, 0xff, 0xbf, 0xfb, 0xfe, 0xf7, 0xff, 0x9f, 
+	0x7f, 0xff, 0xfd, 0xa6, 0xff, 0xaf, 0xb9, 0xe6, 
+	0xfa, 0xfb, 0x6f, 0x79, 0xf0, 0x9b, 0xdf, 0x57, 
+	0x5f, 0x7d, 0xf5, 0xed, 0xba, 0xdf, 0xfd, 0x8d, 
+	0xd9, 0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0x3e, 
+	0xff, 0xfc, 0xd7, 0xeb, 0xef, 0xbf, 0xff, 0x7e, 
+	0x9f, 0xbd, 0xb7, 0xff, 0x6d, 0xfe, 0xb7, 0xdd, 
+	0x66, 0xbb, 0xed, 0xb7, 0xff, 0x4f, 0x3e, 0xf5, 
+	0xef, 0xbf, 0xff, 0xfe, 0x79, 0xff, 0xfb, 0xfd, 
+	0xbf, 0x9b, 0xf7, 0xb5, 0xd7, 0x5e, 0x7b, 0xed, 
+	0xb5, 0xff, 0xcf, 0xff, 0xff, 0x4b, 0x2f, 0xbd, 
+	0x74, 0xde, 0x9f, 0x7d, 0xff, 0xd7, 0xe6, 0xbe, 
+	0x2d, 0xb6, 0xd4, 0x66, 0x5b, 0x6d, 0xa6, 0xbf, 
+	0xf7, 0xbf, 0xd7, 0x4e, 0x2f, 0xfd, 0xfc, 0xd7, 
+	0x6f, 0x2b, 0xbb, 0xb9, 0x5f, 0x5e, 0x79, 0xe7, 
+	0x95, 0x77, 0xde, 0xab, 0xff, 0x5e, 0xb7, 0xbe, 
+	0xf8, 0xed, 0x17, 0xf7, 0x5d, 0xd9, 0xec, 0x6c, 
+	0xee, 0xbf, 0xdf, 0x5e, 0xfa, 0xef, 0xa5, 0xf7, 
+	0xfa, 0xbf, 0xf9, 0xf9, 0xef, 0xff, 0xff, 0x7f, 
+	0x2f, 0xad, 0xff, 0xbf, 0x99, 0xfb, 0xbf, 0xed, 
+	0xb6, 0xdb, 0x6f, 0xb8, 0xb5, 0xfe, 0x1f, 0xfe, 
+	0x58, 0x7b, 0xed, 0xb5, 0xdf, 0xd9, 0x47, 0xed, 
+	0xcf, 0xc6, 0x3d, 0x7b, 0xee, 0xb9, 0xe7, 0x9e, 
+	0x7b, 0xfb, 0xff, 0x6d, 0x6e, 0xf7, 0xdd, 0x77, 
+	0xdf, 0x7f, 0xff, 0xed, 0xff, 0xb5, 0x79, 0xdf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff, 0x7f, 
+	0x66, 0xf3, 0x7c, 0x76, 0xd9, 0x65, 0x9d, 0xff, 
+	0xfe, 0x7b, 0x6f, 0xe4, 0xbb, 0xfe, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xfb, 0x8f, 0x57, 0x2c, 0xbd, 
+	0xf4, 0xd3, 0x7f, 0xff, 0x3d, 0xf6, 0xbd, 0x99, 
+	0xf9, 0xef, 0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xfd, 
+	0x7f, 0xbf, 0xf5, 0xcf, 0x7e, 0x7b, 0xec, 0xff, 
+	0xff, 0xff, 0xff, 0x4f, 0xe6, 0xde, 0xdb, 0x6f, 
+	0xbf, 0xfd, 0xf6, 0xfb, 0xff, 0xf7, 0xbf, 0xff, 
+	0xb5, 0xdf, 0x5e, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xbb, 0xb9, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7, 
+	0xdf, 0xef, 0x77, 0x7d, 0xe1, 0xb7, 0xdf, 0x7a, 
+	0xfb, 0xef, 0xc7, 0xff, 0xee, 0x68, 0xde, 0xf7, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0x73, 0x8f, 
+	0x5f, 0x7c, 0xf7, 0x5d, 0x76, 0xf9, 0xbd, 0xfd, 
+	0xd5, 0xce, 0x9b, 0xff, 0xaf, 0xbb, 0xfe, 0xba, 
+	0xeb, 0xfd, 0xdf, 0xfe, 0x7f, 0xd7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xd7, 0xef, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xeb, 0xa3, 0x8f, 0x3e, 0xfa, 0xfc, 0xb3, 
+	0xc7, 0x3f, 0xe5, 0xd9, 0x67, 0x9f, 0x7d, 0xf4, 
+	0xb9, 0xe7, 0x9f, 0xbd, 0xf9, 0xff, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0x7e, 0xfa, 0xcf, 0x77, 0x7e, 0xf1, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xfd, 0xff, 0xd7, 0xdf, 
+	0x6f, 0xfe, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xaf, 
+	0xfe, 0xfb, 0xff, 0x5f, 0xff, 0x7d, 0xf7, 0xdf, 
+	0x5f, 0xff, 0xff, 0xff, 0xff, 0x98, 0xff, 0xf7, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xaf, 0xfe, 0xdc, 0xef, 
+	0x57, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f, 0xff, 0x7f, 
+	0xf5, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x3f, 0xeb, 0x3f, 0xf7, 0xff, 0xf4, 0xf7, 0xdd, 
+	0x7f, 0xff, 0xff, 0xff, 0x5f, 0xff, 0x8b, 0xf9, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0x3f, 0x7f, 0xad, 0x3d, 0x5e, 0x5c, 0xbb, 
+	0xfd, 0xb7, 0xff, 0x6f, 0xfe, 0xef, 0xab, 0xaf, 
+	0xbf, 0xf8, 0xf8, 0x8b, 0xaf, 0xbe, 0xce, 0xc1, 
+	0xd7, 0x5f, 0x6f, 0xfd, 0xb5, 0xd6, 0x1c, 0x7f, 
+	0x9a, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xf7, 
+	0xff, 0x78, 0x71, 0xff, 0x9f, 0x7f, 0xf7, 0xff, 
+	0x67, 0x7b, 0x7f, 0x77, 0xff, 0xc6, 0xfe, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0x7f, 0xd7, 0x7b, 0xee, 
+	0xbf, 0xbb, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xff, 
+	0xff, 0x9f, 0xe9, 0xff, 0xff, 0xfe, 0xff, 0xdf, 
+	0x5f, 0xff, 0xed, 0xf7, 0xdf, 0xff, 0x7f, 0xff, 
+	0xf7, 0xff, 0xff, 0xbb, 0xff, 0xfc, 0x6d, 0xbc, 
+	0x3f, 0xff, 0xfb, 0xed, 0x4f, 0x3f, 0xff, 0xdf, 
+	0x6b, 0x9f, 0xff, 0xfd, 0xf4, 0xd7, 0xd3, 0x7e, 
+	0xf9, 0xf7, 0xfe, 0x9b, 0xef, 0xff, 0xbf, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xfe, 0xd7, 
+	0xf7, 0xfd, 0xf7, 0xdf, 0x5d, 0x7f, 0xff, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xbf, 0xff, 
+	0xbf, 0xbb, 0xde, 0xbf, 0xff, 0xdf, 0x3f, 0xef, 
+	0xf7, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0xfe, 0xff, 
+	0xfd, 0xfb, 0xfd, 0xdf, 0xf7, 0xff, 0x4f, 0x7f, 
+	0x7f, 0xff, 0xbb, 0xff, 0x7f, 0x74, 0xef, 0xff, 
+	0xfc, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xbf, 0xff, 
+	0xff, 0xdf, 0x77, 0xbb, 0xda, 0xab, 0xff, 0xfe, 
+	0xff, 0xff, 0xfd, 0xdf, 0xbf, 0xbd, 0x9b, 0xfb, 
+	0xff, 0xf7, 0x7f, 0xbf, 0xff, 0xfd, 0xfb, 0xff, 
+	0xff, 0xfd, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf7, 
+	0xdf, 0xff, 0xdf, 0xe6, 0xfe, 0xff, 0xfb, 0xe7, 
+	0x7f, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xdf, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xbb, 0xdf, 0xb9, 0xff, 0xfc, 0xff, 0xed, 
+	0xfd, 0xff, 0xff, 0xff, 0x6f, 0xde, 0xff, 0xfd, 
+	0xff, 0xff, 0x7f, 0xff, 0xfd, 0xdf, 0x6f, 0xbd, 
+	0x9f, 0x9b, 0xf6, 0xbf, 0x3c, 0xf3, 0xef, 0xff, 
+	0xff, 0x99, 0xfb, 0xff, 0xff, 0x6b, 0xaf, 0xff, 
+	0xfe, 0xfb, 0xf7, 0xfa, 0xff, 0xfb, 0xff, 0xfe, 
+	0xff, 0xef, 0xff, 0xff, 0xe7, 0xbf, 0x66, 0xff, 
+	0xc3, 0x3f, 0xff, 0x7c, 0xe3, 0xcd, 0x3f, 0xff, 
+	0xbc, 0xc9, 0x9d, 0xef, 0xfa, 0xf9, 0xef, 0x9f, 
+	0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf5, 0xdf, 0x3f, 
+	0xff, 0xfd, 0xf3, 0xcf, 0x7b, 0xff, 0xfe, 0xef, 
+	0xff, 0xff, 0xfe, 0xfd, 0xef, 0xbd, 0xff, 0x6f, 
+	0xfe, 0xff, 0x76, 0xfb, 0xef, 0xbf, 0xfd, 0xfe, 
+	0xcb, 0xc7, 0x7d, 0xb7, 0xbd, 0xff, 0xdb, 0xff, 
+	0xfb, 0xbd, 0xf6, 0xff, 0x9b, 0xff, 0xff, 0xff, 
+	0xf7, 0x9b, 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff, 
+	0xff, 0xf5, 0xff, 0xbf, 0xbf, 0xef, 0xbb, 0xff, 
+	0xff, 0xa6, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xcf, 0xbf, 0xff, 0xd7, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xde, 0x7e, 0xfd, 0xbf, 0xf9, 0xff, 
+	0xfc, 0x73, 0xcf, 0x3d, 0xff, 0xdc, 0xf1, 0xdf, 
+	0x45, 0xee, 0xf9, 0xe7, 0x9f, 0x3b, 0xfe, 0xf9, 
+	0x65, 0xff, 0x6f, 0xfe, 0xbb, 0xfb, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xaf, 0xde, 0xfb, 0xdf, 0x7c, 0xef, 
+	0xf5, 0xf7, 0x5f, 0x7f, 0x7f, 0xfd, 0xff, 0x9b, 
+	0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 
+	0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf, 
+	0x6f, 0xef, 0xfd, 0x77, 0xdf, 0x77, 0xfb, 0xfb, 
+	0xed, 0xbe, 0xff, 0xfe, 0x7b, 0x6f, 0xbf, 0xfb, 
+	0xbf, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0x6f, 0xfe, 0xcf, 
+	0xff, 0xf5, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xbf, 0xbe, 0xfe, 0xbb, 0xaf, 0xb7, 0xff, 0xff, 
+	0x7b, 0xff, 0x9b, 0xdf, 0xdf, 0xff, 0x7f, 0xcf, 
+	0xff, 0xf7, 0xfe, 0xff, 0xf7, 0xfc, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xbf, 0xff, 0xef, 0xff, 0xe6, 
+	0xff, 0x59, 0x7f, 0xdf, 0xfd, 0xd7, 0xdf, 0x7f, 
+	0xff, 0x79, 0xcf, 0xbf, 0xef, 0xfa, 0xfb, 0xcf, 
+	0xaf, 0xef, 0xee, 0xbf, 0xf9, 0xff, 0x36, 0xdf, 
+	0x7e, 0xf3, 0xed, 0xb7, 0xdf, 0x7e, 0xeb, 0xdb, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0x5b, 0x6f, 0xbf, 0xf9, 
+	0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xfb, 0xfd, 
+	0x75, 0xdf, 0x7f, 0xbb, 0xfb, 0x6f, 0xbf, 0xfd, 
+	0xfe, 0x9b, 0xef, 0xae, 0xfd, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xa6, 0xef, 0xbe, 0xfb, 0xef, 0xbf, 0xf7, 0xfe, 
+	0x7b, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xbb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xf7, 
+	0xdd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 
+	0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0xeb, 0xaf, 0xbf, 
+	0xff, 0xda, 0xd7, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7, 
+	0xdf, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xcf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9e, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x1f, 0x7f, 0xfd, 0xf1, 
+	0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 
+	0xf2, 0xeb, 0xaf, 0xbf, 0xde, 0xf8, 0x6f, 0xee, 
+	0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xdb, 
+	0x6f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdb, 0x7f, 0xf9, 
+	0xed, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xbf, 
+	0xfd, 0xf7, 0xff, 0x7b, 0xff, 0xef, 0xff, 0xff, 
+	0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xfd, 0xe5, 0x7f, 0xb7, 0xff, 0x77, 0xdf, 
+	0x3f, 0xb7, 0xde, 0xff, 0xbf, 0xf9, 0xbf, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0x1d, 0xf3, 
+	0x9c, 0xef, 0xcb, 0xbd, 0xe7, 0x9c, 0xeb, 0xeb, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define ECP_ROM_CROM0_R_0            0
+#define ECP_ROM_CROM0_R_1            16
+#define ECP_ROM_CROM0_R_2            32
+#define ECP_ROM_CROM0_R_3            48
+#define ECP_ROM_CROM0_R_4            64
+#define ECP_ROM_CROM0_R_5            80
+#define ECP_ROM_CROM0_R_6            96
+#define ECP_ROM_CROM0_R_7            112
+#define ECP_ROM_CROM1_R_0            128
+#define ECP_ROM_CROM1_R_1            144
+#define ECP_ROM_CROM1_R_2            160
+#define ECP_ROM_CROM1_R_3            176
+#define ECP_ROM_CROM1_R_4            192
+#define ECP_ROM_CROM1_R_5            208
+#define ECP_ROM_CROM1_R_6            224
+#define ECP_ROM_CROM1_R_7            240
+#define ECP_ROM_DIVROM0              256
+#define ECP_ROM_DIVROM1              272
+#define ECP_ROM_DIVROM2              288
+#define ECP_ROM_SWROMID              304
+#define ECP_ROM_SWROMIE              320
+#define ECP_ROM_SWROMIS              336
+#define ECP_ROM_SWROMOE              352
+#define ECP_ROM_SWROMOS              368
+#define ECP_ROM_SWROMIC              384
+#define ECP_ROM_SWROMOC              400
+#define ECP_ROM_SWROMDCD             416
+#define ECP_ROM_CLKSELROM            432
+#define ECP_ROM_PTTMUTEROM           448
+
+
+/* rom locations */
+static const unsigned long ecp_roms[464] = {
+	 52103,  52269,  51771,  51937,  52271,  52105,  51939,  51773,
+	 51439,  51605,  51107,  51273,  51607,  51441,  51275,  51109,
+	 64075,  64243,  64241,  64077,  63743,  63911,  63909,  63745,
+	 63411,  63579,  63577,  63413,  63079,  63247,  63245,  63081,
+	 40025,  39361,  39693,  39029,  40193,  39529,  39861,  39197,
+	 40191,  39527,  39859,  39195,  40027,  39363,  39695,  39031,
+	 39965,  39301,  40131,  39467,  40133,  39469,  39967,  39303,
+	 39633,  38969,  39799,  39135,  39801,  39137,  39635,  38971,
+	 39975,  39311,  39643,  38979,  40143,  39479,  39811,  39147,
+	 40141,  39477,  39809,  39145,  39977,  39313,  39645,  38981,
+	 39985,  39321,  40151,  39487,  40153,  39489,  39987,  39323,
+	 39653,  38989,  39819,  39155,  39821,  39157,  39655,  38991,
+	 39995,  39663,  40161,  39829,  40163,  39831,  39997,  39665,
+	 39331,  38999,  39497,  39165,  39499,  39167,  39333,  39001,
+	 45991,  46159,  46157,  45993,  45659,  45827,  45825,  45661,
+	 45327,  45495,  45493,  45329,  44995,  45163,  45161,  44997,
+	 49117,  49449,  48951,  49283,  49781,  50113,  49615,  49947,
+	 48949,  49281,  49115,  49447,  49613,  49945,  49779,  50111,
+	 61089,  61753,  61421,  62085,  60923,  61587,  61255,  61919,
+	 60921,  61585,  61253,  61917,  61087,  61751,  61419,  62083,
+	 37039,  36871,  36873,  37037,  37703,  37535,  37537,  37701,
+	 37371,  37203,  37205,  37369,  38035,  37867,  37869,  38033,
+	 36979,  36811,  37311,  37143,  37643,  37475,  37975,  37807,
+	 36813,  36977,  37145,  37309,  37477,  37641,  37809,  37973,
+	 36989,  36821,  36823,  36987,  37653,  37485,  37487,  37651,
+	 37321,  37153,  37155,  37319,  37985,  37817,  37819,  37983,
+	 36999,  36831,  37331,  37163,  37663,  37495,  37995,  37827,
+	 36833,  36997,  37165,  37329,  37497,  37661,  37829,  37993,
+	 37009,  36841,  37341,  37173,  37673,  37505,  38005,  37837,
+	 36843,  37007,  37175,  37339,  37507,  37671,  37839,  38003,
+	 43005,  43669,  43337,  44001,  42839,  43503,  43171,  43835,
+	 42837,  43501,  43169,  43833,  43003,  43667,  43335,  43999,
+	 66994,  66828,  66826,  66992,  67326,  67160,  67158,  67324,
+	 67658,  67492,  67490,  67656,  67990,  67824,  67822,  67988,
+	 66984,  67316,  66818,  67150,  66816,  67148,  66982,  67314,
+	 67648,  67980,  67482,  67814,  67480,  67812,  67646,  67978,
+	 64004,  64172,  63672,  63840,  63340,  63508,  63008,  63176,
+	 64170,  64006,  63838,  63674,  63506,  63342,  63174,  63010,
+	 75926,  75262,  76092,  75428,  76094,  75430,  75928,  75264,
+	 75594,  74930,  75760,  75096,  75762,  75098,  75596,  74932,
+	 75916,  76084,  75584,  75752,  75252,  75420,  74920,  75088,
+	 76082,  75918,  75750,  75586,  75418,  75254,  75086,  74922,
+	 45870,  46036,  45538,  45704,  46038,  45872,  45706,  45540,
+	 45206,  45372,  44874,  45040,  45374,  45208,  45042,  44876,
+	 58008,  58174,  57344,  57510,  58176,  58010,  57512,  57346,
+	 57676,  57842,  57012,  57178,  57844,  57678,  57180,  57014,
+	 69960,  70126,  69296,  69462,  69628,  69794,  68964,  69130,
+	 70128,  69962,  69464,  69298,  69796,  69630,  69132,  68966,
+	 82003,  81671,  81339,  81007,  82169,  81837,  81505,  81173,
+	 82171,  81839,  81507,  81175,  82005,  81673,  81341,  81009,
+	 39924,  39260,  40090,  39426,  40092,  39428,  39926,  39262,
+	 39592,  38928,  39758,  39094,  39760,  39096,  39594,  38930,
+	 49107,  48941,  49439,  49273,  48939,  49105,  49271,  49437,
+	 49771,  49605,  50103,  49937,  49603,  49769,  49935,  50101,
+	 87939,  87275,  88105,  87441,  88107,  87443,  87941,  87277,
+	 87607,  86943,  87773,  87109,  87775,  87111,  87609,  86945,
+	 42944,  42778,  42776,  42942,  43276,  43110,  43108,  43274,
+	 43608,  43442,  43440,  43606,  43940,  43774,  43772,  43938
+};
+
diff --git a/main/epp_firmware.h b/main/epp_firmware.h
new file mode 100644
index 0000000..a5ee029
--- /dev/null
+++ b/main/epp_firmware.h
@@ -0,0 +1,1623 @@
+/*****************************************************************************/
+
+/*
+ *      epp_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPP_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char epp_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xde, 
+	0xfd, 0xfd, 0xd7, 0xdb, 0xdf, 0xfd, 0xed, 0x7d, 
+	0xef, 0xfe, 0xfe, 0xae, 0x6f, 0xef, 0xfe, 0xfe, 
+	0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xfb, 
+	0xfe, 0xaf, 0xff, 0x7f, 0xfe, 0xd7, 0xff, 0x7f, 
+	0xed, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xb9, 0xff, 0xfc, 0xed, 0xcf, 
+	0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6, 
+	0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f, 
+	0xfe, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77, 
+	0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda, 
+	0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xfd, 
+	0xf5, 0xd2, 0x5f, 0x2f, 0xfd, 0xf5, 0xd3, 0x9f, 
+	0xfe, 0x7a, 0xe9, 0xaf, 0x9f, 0xfe, 0x7a, 0xe9, 
+	0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 
+	0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff, 
+	0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 
+	0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xba, 0xaf, 0xae, 
+	0xfa, 0xfe, 0xfa, 0xaf, 0xae, 0x7f, 0xfd, 0xd7, 
+	0xd7, 0x7d, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b, 
+	0xff, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7b, 
+	0xff, 0xbd, 0xf7, 0xdd, 0x7f, 0xef, 0xfd, 0xef, 
+	0xbf, 0xff, 0xde, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xff, 0x9f, 0x7f, 0xff, 0xfd, 0xf7, 
+	0x9f, 0x7f, 0xff, 0xf9, 0xcf, 0xbf, 0xfb, 0xfc, 
+	0xfb, 0xcf, 0xbf, 0xfb, 0xfc, 0x6f, 0xf4, 0xff, 
+	0xed, 0xb7, 0xdd, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 
+	0xfe, 0xb6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xfe, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xfd, 0x7d, 0xf7, 0xbf, 0xff, 0xfe, 
+	0xf3, 0xef, 0xbf, 0xfe, 0xfe, 0xfb, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbb, 0xff, 0xbe, 0xfb, 0xee, 
+	0xbb, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 
+	0xce, 0x3b, 0x7f, 0xfc, 0xf3, 0xce, 0x7f, 0xfe, 
+	0xf9, 0xe7, 0x9f, 0x7e, 0xfe, 0xf9, 0xe7, 0xf7, 
+	0x6f, 0xfe, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0x77, 0xdf, 0xff, 0xfc, 0xfb, 0xee, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf, 
+	0x3d, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xbf, 0x7c, 
+	0xe7, 0x9f, 0x7f, 0xee, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xbe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xf7, 0xfe, 0xfa, 0xef, 0xbc, 0xef, 0xbe, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0x7d, 0xf6, 
+	0x5b, 0x67, 0xbf, 0x7d, 0xf6, 0xdb, 0xdf, 0x3e, 
+	0xfb, 0xec, 0xb7, 0xdf, 0x3e, 0xfb, 0xed, 0xfd, 
+	0x9b, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x9f, 0xff, 
+	0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7b, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xfe, 
+	0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xdf, 0xbf, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0x9b, 0xfe, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xfd, 0xf5, 0xf7, 0xbf, 0xef, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xe6, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xde, 
+	0xfb, 0xbf, 0xfc, 0xe5, 0xff, 0xdf, 0xff, 0xf7, 
+	0xed, 0xff, 0xdb, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0xef, 0x6f, 
+	0xff, 0xff, 0xed, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 
+	0xff, 0x6f, 0xfc, 0x7f, 0xff, 0xff, 0xfd, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x7f, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xf7, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0x7d, 0xcf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x7b, 
+	0xff, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xef, 0xbd, 
+	0xf9, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xff, 0xef, 
+	0xff, 0xaf, 0xfb, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 
+	0xdd, 0xff, 0xff, 0x7f, 0x6f, 0xfe, 0x7f, 0x7d, 
+	0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xdf, 0xfd, 
+	0xf7, 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, 
+	0x9f, 0xff, 0xff, 0xfe, 0xfb, 0x7f, 0xff, 0xfd, 
+	0x77, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xa6, 0x7f, 
+	0x7d, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x6f, 0xff, 
+	0xfb, 0xfe, 0xff, 0xff, 0xf5, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0x7f, 
+	0xfd, 0xff, 0xdf, 0xef, 0xff, 0xbd, 0xff, 0xef, 
+	0xbf, 0xff, 0xff, 0xcb, 0xef, 0x7f, 0xff, 0x6e, 
+	0xea, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xff, 
+	0x7f, 0xff, 0xfe, 0xdf, 0xff, 0x7f, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xbf, 
+	0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 
+	0xff, 0xe6, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7b, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xff, 0xef, 0xbf, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xfe, 0x7b, 0xed, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xc3, 0xfb, 0x6f, 0xfe, 0xff, 0xef, 0xff, 0xff, 
+	0xcf, 0x3f, 0xff, 0xfb, 0xff, 0xfe, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x9b, 
+	0xfe, 0xf9, 0xf3, 0xfb, 0xfa, 0xff, 0xff, 0xbf, 
+	0xf6, 0xff, 0xdf, 0xff, 0xff, 0x3f, 0xf5, 0xff, 
+	0xff, 0xff, 0xfd, 0xbf, 0x66, 0xff, 0xff, 0xf5, 
+	0xbf, 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xf7, 0xfd, 
+	0xff, 0xff, 0x4b, 0xfd, 0xff, 0xff, 0xff, 0xff, 
+	0xb7, 0x49, 0xff, 0xff, 0xbf, 0xa5, 0xff, 0xfc, 
+	0x7f, 0xed, 0xb5, 0x67, 0xbf, 0xfc, 0xf2, 0xf9, 
+	0xaf, 0xbd, 0xf6, 0xdf, 0xfe, 0x6f, 0xd4, 0xff, 
+	0xff, 0xff, 0xeb, 0xdc, 0xbe, 0x9e, 0x3b, 0xeb, 
+	0xdc, 0xe7, 0x9d, 0xf7, 0xdf, 0x79, 0xe7, 0xfd, 
+	0xff, 0x5f, 0x99, 0xdb, 0xf7, 0xfd, 0xf7, 0xf6, 
+	0xff, 0xef, 0xbf, 0x56, 0x5f, 0xdd, 0x6d, 0xfb, 
+	0xed, 0xa5, 0xf7, 0xde, 0x7b, 0xcd, 0xee, 0x06, 
+	0x7e, 0xfc, 0xff, 0xff, 0x6e, 0xe6, 0xb9, 0xaf, 
+	0x9d, 0x73, 0x5d, 0x73, 0xde, 0x79, 0xb9, 0x9c, 
+	0x77, 0xde, 0xb1, 0x93, 0x99, 0xff, 0x0f, 0xff, 
+	0x7f, 0xff, 0x9e, 0xfe, 0x6f, 0xbb, 0x6d, 0xff, 
+	0xf5, 0xd7, 0xff, 0x7e, 0xfd, 0xf5, 0xd7, 0xff, 
+	0x66, 0xec, 0xff, 0x57, 0xcf, 0xcf, 0xef, 0xaf, 
+	0xff, 0xfa, 0xeb, 0xdf, 0x7f, 0xfd, 0xf5, 0x7f, 
+	0x5f, 0x7f, 0xfd, 0xfd, 0xbf, 0x19, 0xf7, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xf6, 0xdb, 0xcf, 0x3f, 
+	0xfb, 0xed, 0xe7, 0x9f, 0xff, 0xff, 0xf9, 0xe7, 
+	0xff, 0x77, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xdd, 
+	0xf7, 0xff, 0xfd, 0xff, 0xdf, 0xdf, 0xfe, 0xfb, 
+	0xef, 0xf7, 0xff, 0xfe, 0xfb, 0xff, 0xbd, 0xb9, 
+	0xfe, 0xe3, 0xcf, 0xb5, 0xd1, 0xfc, 0xfb, 0xee, 
+	0xb7, 0xcf, 0x6d, 0xf7, 0xd9, 0x63, 0xbc, 0x2d, 
+	0xf6, 0xd9, 0xaf, 0x6e, 0xee, 0xff, 0xff, 0xff, 
+	0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xbf, 
+	0x7f, 0xfe, 0xfb, 0xed, 0xbf, 0x7f, 0xfe, 0x3d, 
+	0x9b, 0xf9, 0xff, 0xff, 0xeb, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xfb, 0xdf, 0xdf, 0x7f, 
+	0xff, 0xf7, 0xef, 0xff, 0xef, 0xe6, 0xf6, 0x1f, 
+	0x7d, 0xfd, 0xfc, 0xeb, 0xeb, 0xbf, 0xbf, 0x7e, 
+	0xf7, 0xd3, 0x6f, 0x2f, 0xf1, 0xf5, 0xd7, 0x7f, 
+	0x7f, 0xbb, 0x79, 0xff, 0xef, 0xbf, 0xef, 0xff, 
+	0xfe, 0x72, 0xaf, 0x2f, 0xfe, 0xd1, 0xc5, 0x37, 
+	0x5f, 0x7c, 0xf1, 0xc5, 0x13, 0x7f, 0x6f, 0xea, 
+	0xff, 0xff, 0xff, 0xef, 0xf7, 0xfe, 0xfe, 0xbe, 
+	0xef, 0x7f, 0xff, 0xbd, 0xf7, 0xd7, 0x7f, 0xbf, 
+	0xfd, 0xf7, 0xff, 0x9b, 0xf6, 0x7f, 0xcf, 0x3f, 
+	0xfe, 0xfc, 0xb3, 0x8f, 0x3f, 0xfe, 0xf4, 0xc7, 
+	0x1f, 0x7f, 0xe4, 0xf1, 0xc7, 0x1f, 0x7d, 0xfe, 
+	0xe6, 0xff, 0xdf, 0x7f, 0xbf, 0xfe, 0xfb, 0xeb, 
+	0xbf, 0xbf, 0xff, 0xf7, 0xf7, 0x5f, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xff, 0xff, 0xbf, 0x61, 0xff, 0xff, 
+	0xdf, 0xaf, 0xbf, 0xfe, 0xfa, 0xef, 0xbf, 0xff, 
+	0xfd, 0xf7, 0xd7, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 
+	0xff, 0x6f, 0xfe, 0xdf, 0xf9, 0xef, 0xef, 0xbf, 
+	0xbf, 0xfe, 0xeb, 0xbf, 0x7f, 0xfd, 0xf7, 0xdf, 
+	0x77, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0xfe, 
+	0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0x7f, 0xff, 0xdf, 0xe6, 0xff, 0xff, 0xff, 0xbf, 
+	0xfd, 0xf2, 0xd3, 0x2d, 0xbf, 0xff, 0xec, 0xff, 
+	0xff, 0x7f, 0xbb, 0xe7, 0xf7, 0xd7, 0xff, 0xbf, 
+	0xf9, 0xff, 0x2f, 0xbf, 0xdc, 0x7a, 0xeb, 0xae, 
+	0xb7, 0xfe, 0xf2, 0x97, 0x5f, 0x7e, 0xfd, 0xf5, 
+	0x97, 0x4d, 0x77, 0xf5, 0x6f, 0x2e, 0xff, 0xff, 
+	0xf3, 0xfb, 0x3f, 0xff, 0xf7, 0xef, 0xb7, 0x9f, 
+	0xfd, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0xff, 
+	0xe7, 0x9b, 0xff, 0x7f, 0x7f, 0xff, 0x7f, 0xe8, 
+	0xfb, 0xf6, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0x6f, 
+	0xff, 0x7f, 0xf6, 0xdf, 0xff, 0xbf, 0xa6, 0x7d, 
+	0xfd, 0xd3, 0xff, 0x9f, 0xdf, 0x7d, 0xff, 0xf5, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xf7, 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0xad, 
+	0xdf, 0xef, 0xe0, 0x91, 0x3f, 0xff, 0xf3, 0xc9, 
+	0xd7, 0x1f, 0x5d, 0xfe, 0xb8, 0x67, 0xff, 0x67, 
+	0xfc, 0xff, 0xbf, 0xff, 0xeb, 0xf7, 0x6f, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6e, 0xff, 
+	0xff, 0xff, 0xfe, 0xff, 0x99, 0xf7, 0x7e, 0xff, 
+	0x2e, 0xdf, 0xef, 0xfe, 0x7b, 0xfe, 0xfa, 0xdb, 
+	0x7f, 0x7f, 0xfd, 0xb7, 0xde, 0x6f, 0xaf, 0xff, 
+	0xff, 0x46, 0xef, 0xff, 0x7f, 0xff, 0xdf, 0xf7, 
+	0x8b, 0xef, 0x3f, 0xfd, 0xd9, 0xa7, 0x9f, 0x5b, 
+	0xfc, 0xe1, 0xc7, 0xdf, 0xfe, 0x9f, 0xb1, 0xdb, 
+	0xff, 0xdf, 0xff, 0xff, 0xf9, 0xdf, 0xef, 0xef, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xbf, 0xbf, 
+	0xf7, 0xff, 0x6f, 0xfc, 0x7f, 0xff, 0xff, 0xf5, 
+	0xff, 0xbf, 0xfb, 0xff, 0x9f, 0xff, 0xbf, 0xff, 
+	0xff, 0xe7, 0x9f, 0x3e, 0xfe, 0xfe, 0xff, 0x98, 
+	0xff, 0x7f, 0xff, 0xff, 0xfd, 0x7d, 0xef, 0xff, 
+	0xcf, 0xff, 0xfe, 0xf7, 0x9f, 0xff, 0xee, 0xbf, 
+	0x7f, 0xff, 0xff, 0xef, 0x66, 0x7d, 0xff, 0xff, 
+	0xef, 0xfa, 0xf7, 0xed, 0xaf, 0xbf, 0xe6, 0xf5, 
+	0xd7, 0x7f, 0xbf, 0xac, 0xf3, 0xce, 0xfb, 0xff, 
+	0xbf, 0xf9, 0xf7, 0xd7, 0x6f, 0xbf, 0xff, 0xff, 
+	0xbd, 0xcf, 0xfd, 0xfe, 0xdf, 0xef, 0xc7, 0x1f, 
+	0x1f, 0xf8, 0xa1, 0x3f, 0xfb, 0x6f, 0xfe, 0xf7, 
+	0xff, 0xfb, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xef, 
+	0xff, 0xff, 0x1b, 0xfe, 0xaf, 0xfe, 0xc1, 0x0e, 
+	0xeb, 0xb5, 0xfe, 0xff, 0xee, 0x77, 0xdf, 0x7d, 
+	0x37, 0xdd, 0x74, 0xdf, 0xfd, 0xff, 0x3f, 0x66, 
+	0xff, 0x2b, 0xbf, 0xb2, 0xf7, 0x3a, 0xcb, 0xbf, 
+	0xff, 0x52, 0xd7, 0x5f, 0x6b, 0xa9, 0xb9, 0xe6, 
+	0x9f, 0x7f, 0xff, 0xb7, 0xf9, 0x9f, 0x7f, 0xee, 
+	0x6f, 0xa6, 0x9f, 0x7a, 0xea, 0x3d, 0xf5, 0xa9, 
+	0xa7, 0x9e, 0x7b, 0xee, 0xa9, 0xa7, 0xba, 0xff, 
+	0x6f, 0xd6, 0xff, 0xcf, 0xfa, 0xb3, 0xef, 0xb7, 
+	0xde, 0x7a, 0xf9, 0xd5, 0x2e, 0xbf, 0xec, 0xb2, 
+	0xcb, 0x2e, 0xbf, 0xdf, 0x5f, 0x9b, 0xfb, 0xaf, 
+	0xfd, 0xff, 0xde, 0x4b, 0xa3, 0xad, 0x7e, 0xab, 
+	0xdd, 0x6f, 0xb5, 0xdd, 0xf6, 0xda, 0x6c, 0x9d, 
+	0xff, 0xef, 0x66, 0xfe, 0xab, 0x3f, 0x9a, 0xfd, 
+	0x72, 0xa8, 0xa5, 0xae, 0x6b, 0xdd, 0x70, 0xcd, 
+	0x35, 0xd7, 0x1c, 0x73, 0xe3, 0xbd, 0xb3, 0xb1, 
+	0xff, 0xef, 0xdf, 0x6f, 0xb6, 0x58, 0x6a, 0xe9, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xef, 
+	0xbd, 0xff, 0xf7, 0x66, 0xee, 0xff, 0xf7, 0xfb, 
+	0x5b, 0xeb, 0xb5, 0xd6, 0xfa, 0x6f, 0x75, 0xfb, 
+	0xad, 0xb6, 0xdf, 0x7e, 0xfb, 0xad, 0xfe, 0x3a, 
+	0x9b, 0xf7, 0x7f, 0xff, 0x6d, 0xb7, 0xdd, 0x72, 
+	0xef, 0xff, 0xde, 0xf3, 0xdc, 0x73, 0xcf, 0x3d, 
+	0xf7, 0xdc, 0xf3, 0xdf, 0xb7, 0xe6, 0xdd, 0x9f, 
+	0x79, 0xff, 0xd9, 0x67, 0x9f, 0xff, 0xb7, 0xfb, 
+	0x5d, 0x76, 0xd9, 0x65, 0x97, 0x7d, 0x76, 0x59, 
+	0xe7, 0xbd, 0xa1, 0xff, 0xe3, 0x4f, 0x3f, 0xfb, 
+	0xb8, 0xe3, 0xef, 0xab, 0x7f, 0xed, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xfd, 0xf5, 0xda, 0xff, 0x66, 0xe6, 
+	0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 
+	0x7b, 0xdf, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 0x7b, 
+	0xef, 0xbe, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0xfb, 0xef, 0xff, 0xfe, 0xb7, 0xdf, 
+	0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xde, 0xff, 0xef, 
+	0xa6, 0xfe, 0x1d, 0x2f, 0xff, 0x71, 0xe2, 0x1f, 
+	0xaf, 0xff, 0x77, 0xbd, 0xf7, 0xde, 0x7b, 0xef, 
+	0xbd, 0xf7, 0xde, 0xfb, 0xab, 0x79, 0xff, 0xe7, 
+	0xeb, 0x7d, 0xb2, 0xf8, 0xe6, 0xcb, 0x77, 0x5a, 
+	0xd3, 0x4c, 0x37, 0xdd, 0x74, 0xb3, 0x4c, 0x1e, 
+	0x7f, 0x6f, 0xfe, 0xbf, 0xfc, 0xfa, 0xbb, 0xef, 
+	0xfb, 0xfb, 0xfa, 0xfd, 0x7f, 0xff, 0xfd, 0xf6, 
+	0xdf, 0x6b, 0xef, 0xbd, 0xf7, 0xff, 0x9b, 0xff, 
+	0xaf, 0x83, 0x1e, 0x7e, 0xcc, 0xe3, 0xc3, 0x3f, 
+	0x3f, 0xdc, 0x61, 0x87, 0x1d, 0x76, 0xd9, 0x61, 
+	0x17, 0x7f, 0xfe, 0xe6, 0xff, 0x9f, 0xaf, 0xff, 
+	0xfd, 0xf2, 0xff, 0x2f, 0xbf, 0xfe, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 
+	0xf9, 0xff, 0x7f, 0xe9, 0x77, 0x9f, 0xfe, 0xba, 
+	0xe9, 0xaf, 0xd7, 0xdd, 0xf6, 0xda, 0x6b, 0x9f, 
+	0xfd, 0xf6, 0xf3, 0xef, 0x6f, 0xf6, 0xbf, 0xaa, 
+	0x7a, 0xbe, 0x29, 0xfe, 0x9b, 0xf2, 0xab, 0xda, 
+	0x4d, 0x57, 0x5d, 0x75, 0xdd, 0x45, 0x57, 0xdd, 
+	0xfd, 0x9b, 0xff, 0xaf, 0x87, 0x0f, 0x3f, 0xe8, 
+	0xaf, 0xcb, 0xfd, 0x7a, 0xf4, 0xc5, 0x0f, 0x3f, 
+	0xfc, 0xf2, 0xc1, 0x87, 0x1d, 0xfe, 0xe6, 0xff, 
+	0xff, 0x2f, 0xbf, 0xfc, 0x76, 0xbb, 0x3f, 0xfe, 
+	0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xef, 0xbf, 0xe9, 0xff, 0xa7, 0xb7, 0xfa, 
+	0xda, 0xeb, 0xae, 0xbf, 0xf6, 0xd8, 0x47, 0x1f, 
+	0x7f, 0xf5, 0xf5, 0x57, 0x5f, 0x76, 0xfd, 0x69, 
+	0xfe, 0xff, 0xfc, 0xfb, 0xc5, 0x0e, 0xff, 0xef, 
+	0xcb, 0x4f, 0x7f, 0xea, 0xf9, 0xe7, 0xfd, 0xf3, 
+	0xf7, 0xdf, 0xef, 0xff, 0x1b, 0xff, 0x96, 0xdb, 
+	0xef, 0xb9, 0xea, 0x75, 0xdb, 0xbb, 0xea, 0xf7, 
+	0x5f, 0x7d, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 
+	0x7f, 0x66, 0xff, 0x7e, 0xd7, 0xf7, 0x7b, 0xdf, 
+	0xff, 0xbf, 0xfd, 0xef, 0xf7, 0xff, 0x7d, 0xbf, 
+	0xef, 0xbf, 0xff, 0xef, 0xff, 0xbf, 0xf9, 0xff, 
+	0xff, 0x6b, 0x67, 0xf7, 0x9c, 0xfb, 0xfe, 0xad, 
+	0x73, 0xfe, 0xf5, 0xd7, 0x53, 0x5f, 0xf9, 0xf9, 
+	0x97, 0xfb, 0x6f, 0xfe, 0xff, 0xaf, 0x7b, 0xdf, 
+	0xef, 0x7f, 0xdb, 0xff, 0xdf, 0xff, 0xff, 0xfb, 
+	0x6f, 0xbf, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0x9b, 
+	0xff, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0x97, 0xff, 
+	0x75, 0xfe, 0xfd, 0xcd, 0x3b, 0xff, 0xb1, 0xf3, 
+	0xff, 0xfb, 0xff, 0xff, 0xe6, 0xbf, 0xfb, 0x2f, 
+	0x7f, 0xff, 0xf7, 0xeb, 0xfe, 0xff, 0xf7, 0xef, 
+	0xff, 0xf7, 0xfe, 0xf3, 0xbf, 0xfc, 0xfb, 0xf7, 
+	0xbf, 0xb9, 0xdf, 0xfb, 0xff, 0xff, 0xf7, 0xfd, 
+	0x5f, 0xbf, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0xab, 0xff, 0xdf, 0xff, 0xf7, 0x6b, 0xfe, 0x3f, 
+	0xee, 0xef, 0xf3, 0xfe, 0x37, 0xfe, 0xbf, 0xff, 
+	0x9e, 0x7f, 0xfe, 0x59, 0xff, 0x1f, 0x7d, 0xe4, 
+	0xf1, 0xfe, 0x9b, 0xff, 0x7f, 0xe7, 0x5f, 0xcb, 
+	0xfe, 0xbf, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xdc, 
+	0xfb, 0xde, 0xdf, 0xff, 0xfe, 0xf6, 0xfe, 0x66, 
+	0xfe, 0x7f, 0xaf, 0x7f, 0xce, 0xf2, 0xad, 0xfb, 
+	0xdf, 0x7f, 0xfb, 0xeb, 0xbf, 0x3d, 0xfd, 0xdf, 
+	0xfb, 0xfd, 0xff, 0xbf, 0xb1, 0x6f, 0xff, 0xaf, 
+	0x93, 0x9f, 0x72, 0xed, 0x6f, 0xff, 0xf9, 0xef, 
+	0xff, 0xff, 0x6f, 0xde, 0x7f, 0xff, 0xff, 0x7f, 
+	0x65, 0x7e, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b, 0xf2, 0x7f, 
+	0xfe, 0xf1, 0x6f, 0xf9, 0xa9, 0xbf, 0x5e, 0x6f, 
+	0x7e, 0xf3, 0xad, 0xf7, 0xf5, 0x5c, 0xf2, 0xe5, 
+	0xff, 0xbf, 0x66, 0xff, 0xcf, 0xff, 0xbe, 0x5b, 
+	0xff, 0xfb, 0xaf, 0xd7, 0x9f, 0xef, 0xbc, 0xf9, 
+	0x7e, 0x3d, 0x2d, 0xbe, 0xff, 0xff, 0xb7, 0xc9, 
+	0x9f, 0x5b, 0x7e, 0xa5, 0xb3, 0x9e, 0xfa, 0xeb, 
+	0x7f, 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfa, 0xf9, 
+	0xef, 0xff, 0xff, 0x6f, 0xd4, 0x37, 0x9f, 0x7f, 
+	0xeb, 0xef, 0xa7, 0xff, 0xfa, 0xff, 0xff, 0xff, 
+	0xff, 0xef, 0x46, 0xdf, 0xfd, 0xf7, 0xff, 0x5f, 
+	0x99, 0xfb, 0xf1, 0xd7, 0xbd, 0xdf, 0x5f, 0x65, 
+	0xfd, 0xff, 0xcf, 0x7f, 0xfe, 0xf9, 0x6f, 0xaf, 
+	0xda, 0xec, 0xfb, 0xef, 0xef, 0x06, 0xfe, 0xbf, 
+	0x76, 0xfe, 0xfb, 0xa7, 0x59, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xcf, 0xdc, 0xff, 0xff, 
+	0xff, 0x93, 0x99, 0xff, 0x7a, 0xdf, 0xac, 0xff, 
+	0xc8, 0xd2, 0xff, 0xff, 0xd7, 0xbf, 0xfe, 0xfa, 
+	0x79, 0xe3, 0xfd, 0xff, 0x7f, 0xeb, 0x66, 0xec, 
+	0xbf, 0x1f, 0x7b, 0x29, 0x6c, 0x97, 0xfd, 0xff, 
+	0x3f, 0xfc, 0xe1, 0x87, 0x9f, 0xf7, 0xd9, 0xe9, 
+	0xa7, 0xbf, 0xba, 0x19, 0xf7, 0xfe, 0xff, 0x6f, 
+	0xb7, 0xdd, 0x7e, 0xdb, 0xff, 0xd7, 0xbb, 0xfe, 
+	0xf2, 0xeb, 0xff, 0xbf, 0xf6, 0xda, 0xeb, 0x77, 
+	0xe6, 0x7d, 0xfd, 0x7d, 0xf7, 0xd9, 0xef, 0x7d, 
+	0xff, 0xe6, 0xf9, 0xcf, 0x3f, 0xe3, 0xfc, 0xa3, 
+	0xcf, 0x3f, 0xff, 0xfc, 0xbd, 0xb9, 0xee, 0xfb, 
+	0xce, 0x31, 0xcf, 0xf8, 0x7b, 0xed, 0x3f, 0xff, 
+	0xf9, 0xe7, 0x9f, 0x6f, 0xdc, 0xf9, 0xe7, 0x1f, 
+	0xab, 0x6e, 0xee, 0xdf, 0xff, 0xff, 0xfd, 0xf6, 
+	0xdf, 0xff, 0xef, 0x7f, 0xff, 0xfb, 0xef, 0x3f, 
+	0xfb, 0xff, 0xfb, 0xef, 0xbf, 0x3b, 0x9b, 0xf9, 
+	0xfb, 0xff, 0xbf, 0xef, 0xfe, 0xfd, 0xff, 0xff, 
+	0xef, 0x7f, 0xff, 0xfd, 0xb7, 0xff, 0x7f, 0xff, 
+	0xfd, 0xbf, 0xef, 0xe6, 0xf6, 0x9f, 0xef, 0xfe, 
+	0xd0, 0xe2, 0x9d, 0xff, 0xfd, 0xf1, 0x8f, 0x17, 
+	0xfe, 0x38, 0xf1, 0x8f, 0x3e, 0xfe, 0x78, 0xbb, 
+	0x61, 0x7f, 0xff, 0xfb, 0x7d, 0xfe, 0xfa, 0x63, 
+	0xbf, 0xfe, 0xfe, 0xf7, 0xc5, 0x7f, 0x4f, 0xfc, 
+	0xf7, 0xdf, 0x7f, 0x7f, 0x6f, 0xfe, 0xff, 0xeb, 
+	0xea, 0xcd, 0xee, 0xfb, 0xfd, 0xbf, 0xdf, 0xff, 
+	0xff, 0xff, 0xdf, 0x57, 0xff, 0xfd, 0xf7, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0x8f, 0x3e, 0xfe, 0xcc, 
+	0xf3, 0xcf, 0x3f, 0x3f, 0xbc, 0xe1, 0x86, 0x1f, 
+	0xfe, 0xf9, 0xe5, 0x8f, 0x1b, 0xfe, 0xe6, 0xff, 
+	0xfb, 0xef, 0xff, 0xf8, 0xe2, 0xff, 0xff, 0xff, 
+	0xfd, 0xef, 0x97, 0xff, 0x7e, 0xfd, 0xff, 0xff, 
+	0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfb, 0xfb, 0xff, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xdb, 0xbf, 0x74, 
+	0xfb, 0x4d, 0xbf, 0xff, 0xfe, 0xfb, 0xed, 0x6f, 
+	0xfe, 0xff, 0xff, 0xfe, 0xbf, 0xef, 0xfe, 0xfb, 
+	0xef, 0x9f, 0xf9, 0xd4, 0x33, 0xcf, 0x54, 0xff, 
+	0xd5, 0x37, 0xcf, 0xfc, 0x1b, 0xfe, 0xfe, 0xbf, 
+	0xff, 0xff, 0xef, 0x7f, 0xbf, 0xff, 0xbf, 0xfc, 
+	0xe3, 0x97, 0x5f, 0xfe, 0xfb, 0xe1, 0x87, 0x5f, 
+	0xfe, 0x66, 0xff, 0xdb, 0x7b, 0xbf, 0xfd, 0xc2, 
+	0xcf, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xbf, 
+	0xad, 0xbe, 0xfa, 0x72, 0xcb, 0xaf, 0x9f, 0xfe, 
+	0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xe5, 0x97, 0x5f, 
+	0x7f, 0xfc, 0x6f, 0x3e, 0x9f, 0xef, 0xb2, 0xe3, 
+	0xff, 0xff, 0xef, 0xbf, 0xcd, 0x7f, 0xb6, 0xf9, 
+	0xe6, 0xbb, 0x7f, 0xf6, 0xd9, 0xf7, 0xfb, 0x9b, 
+	0xff, 0xff, 0xbf, 0xab, 0xb3, 0xfd, 0xf7, 0xfe, 
+	0x77, 0xfa, 0xcd, 0x2f, 0x3f, 0xbd, 0xfd, 0xdf, 
+	0x78, 0xb7, 0xff, 0x7f, 0xe6, 0xff, 0x7f, 0xdf, 
+	0xf5, 0xfd, 0xdf, 0xfd, 0xf7, 0xff, 0xf5, 0xff, 
+	0xff, 0xfe, 0xff, 0xfb, 0xfd, 0xf7, 0x7f, 0xff, 
+	0x97, 0xf1, 0xff, 0xbb, 0x2a, 0xb7, 0xff, 0xf9, 
+	0xfc, 0x63, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xf8, 0xbf, 
+	0x77, 0xf7, 0xfb, 0xfb, 0xeb, 0xff, 0xed, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0x99, 0x75, 0x7f, 0xbd, 0xef, 0xfb, 
+	0xef, 0xff, 0xfb, 0xfa, 0xbf, 0xfb, 0xff, 0xf7, 
+	0xff, 0xfe, 0xff, 0x7f, 0xf7, 0xdf, 0x7f, 0xc6, 
+	0xff, 0xbf, 0x6f, 0x2f, 0xfd, 0xbf, 0xfd, 0x49, 
+	0xfd, 0xfd, 0xce, 0xfe, 0xff, 0xfe, 0xff, 0xff, 
+	0xe7, 0xef, 0xdf, 0xbf, 0xb1, 0xcd, 0xff, 0xba, 
+	0xee, 0xf7, 0x7d, 0xcf, 0xfb, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xf3, 0xf7, 0xff, 0xf7, 0xff, 0xff, 
+	0x6f, 0xfc, 0x3f, 0xeb, 0xff, 0xff, 0x8f, 0xff, 
+	0xdf, 0xff, 0xf3, 0x9e, 0x77, 0xfe, 0x79, 0x07, 
+	0x9b, 0x6f, 0xfe, 0xb9, 0xff, 0x9b, 0xfb, 0x6f, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xef, 0x3f, 0xf7, 
+	0xe4, 0xe7, 0xfc, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 
+	0xfb, 0xef, 0xe6, 0xdf, 0xdf, 0xbe, 0xd7, 0xce, 
+	0x77, 0xff, 0xaf, 0x73, 0xcf, 0x7f, 0xef, 0xbf, 
+	0xff, 0xf7, 0x7b, 0xeb, 0xbf, 0x9f, 0xbf, 0xf9, 
+	0xf7, 0xff, 0x7f, 0xdb, 0x9d, 0xbe, 0xd7, 0xcf, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0x6f, 0xf6, 0xff, 0xff, 0x9e, 
+	0xff, 0xff, 0xfe, 0x7f, 0xdd, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0x1b, 0xfe, 0xff, 0xb1, 0x9b, 0xea, 0xbf, 0xbc, 
+	0xfe, 0xcf, 0x2f, 0x7f, 0xf3, 0xad, 0x37, 0xdf, 
+	0x7c, 0xf3, 0xe5, 0xf7, 0x3f, 0x66, 0xff, 0xff, 
+	0xe5, 0x97, 0xf7, 0x2f, 0x6f, 0xef, 0xff, 0xcd, 
+	0xff, 0xbf, 0xf9, 0xce, 0xbf, 0xee, 0xbf, 0xff, 
+	0xfe, 0xb7, 0xf9, 0xff, 0xff, 0xab, 0xac, 0xd6, 
+	0xf7, 0x6b, 0xfe, 0x7f, 0xff, 0xf3, 0xef, 0xbf, 
+	0xff, 0xfc, 0xfb, 0xef, 0xbf, 0xff, 0x6f, 0xd6, 
+	0xff, 0xff, 0x7e, 0xfa, 0xff, 0xff, 0xde, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfe, 
+	0xf7, 0xdf, 0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0x57, 
+	0x92, 0xf9, 0xbf, 0xed, 0x6f, 0xcf, 0x7f, 0xfe, 
+	0xf9, 0xef, 0xbf, 0xff, 0x5e, 0xfb, 0xef, 0xef, 
+	0x66, 0xfe, 0xff, 0xff, 0x9e, 0x7b, 0xaf, 0xad, 
+	0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x57, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0x3f, 
+	0x7f, 0xe1, 0xef, 0xff, 0x6b, 0x7d, 0xff, 0xd6, 
+	0xb7, 0xde, 0x7a, 0xf9, 0xfb, 0xff, 0xf5, 0xff, 
+	0xff, 0x66, 0xee, 0xff, 0x53, 0x6f, 0x19, 0xff, 
+	0xff, 0xc6, 0xff, 0x7f, 0xfc, 0xe3, 0x8f, 0xbf, 
+	0x7f, 0xf8, 0x69, 0x85, 0x9f, 0xbf, 0x9b, 0xf7, 
+	0x7f, 0xff, 0x6d, 0xf7, 0xff, 0x76, 0xff, 0x6f, 
+	0xd7, 0xbb, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xf6, 
+	0xfa, 0xeb, 0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xe6, 
+	0x9b, 0x6f, 0x9e, 0xff, 0xf4, 0xf9, 0xcf, 0x3f, 
+	0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xbd, 
+	0xa1, 0xff, 0xf3, 0xcd, 0xb5, 0xdf, 0xfe, 0xe3, 
+	0xef, 0x3e, 0xfe, 0xf1, 0xc7, 0x1f, 0x7f, 0xfe, 
+	0xf9, 0xe7, 0x9f, 0xff, 0x66, 0xe6, 0xff, 0x6f, 
+	0xff, 0xfd, 0xf6, 0xff, 0x7f, 0xff, 0x7f, 0xff, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0x3f, 0x9b, 0x7b, 0xff, 0xf6, 0xbb, 0xef, 0xbe, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xef, 0xa6, 0x7e, 
+	0x5f, 0x2f, 0x9d, 0xf4, 0xda, 0x1d, 0xff, 0xff, 
+	0xf1, 0x85, 0x3f, 0xfe, 0xf8, 0xe3, 0x8f, 0x3f, 
+	0xfe, 0xf8, 0xab, 0x79, 0xff, 0xef, 0x8b, 0x7f, 
+	0xbe, 0xfa, 0xe7, 0xaf, 0xfe, 0x7e, 0xf1, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x7f, 0x6f, 
+	0xfe, 0xff, 0xdf, 0xba, 0xeb, 0xaf, 0xff, 0xdb, 
+	0xfa, 0xff, 0x5f, 0xfe, 0xff, 0xdf, 0xbe, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x8b, 
+	0x1e, 0x3f, 0xe8, 0xf3, 0x8b, 0x1e, 0x37, 0xd4, 
+	0xe1, 0x86, 0x1f, 0xfe, 0xf9, 0xe1, 0x86, 0x1b, 
+	0xfe, 0xe6, 0xff, 0xdf, 0x2f, 0xfe, 0xfd, 0xf3, 
+	0xcb, 0xef, 0xdf, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 
+	0xf3, 0xef, 0x3f, 0xff, 0xfc, 0xbf, 0xf9, 0xff, 
+	0xf7, 0xe9, 0xa7, 0x97, 0xfd, 0xfa, 0xed, 0xfd, 
+	0xd7, 0xdf, 0xfe, 0xfa, 0xeb, 0xbf, 0xdf, 0x7e, 
+	0xfb, 0xeb, 0x6f, 0xfe, 0xff, 0xab, 0x6e, 0x9e, 
+	0xaa, 0xbe, 0xa8, 0xea, 0x9f, 0xfa, 0xcc, 0x53, 
+	0x4f, 0x7d, 0xff, 0xcc, 0x37, 0x5f, 0xfd, 0x9b, 
+	0xfd, 0xff, 0x83, 0x0e, 0x7a, 0xf8, 0xaf, 0x83, 
+	0xde, 0x7f, 0xfc, 0xe5, 0x8f, 0x3f, 0xfe, 0xfb, 
+	0xe5, 0x97, 0x3f, 0xfe, 0xe6, 0xff, 0xff, 0x6f, 
+	0xbe, 0xdc, 0xd6, 0xfb, 0x6f, 0xfd, 0xff, 0xfe, 
+	0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfb, 
+	0xbf, 0xe9, 0xbf, 0xaf, 0x3f, 0xde, 0x72, 0xc9, 
+	0x2e, 0xbf, 0xf6, 0xba, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7d, 0xfd, 0x6b, 0xf6, 0xff, 
+	0x6c, 0xd0, 0xed, 0xa6, 0xef, 0xfd, 0xfc, 0xcf, 
+	0x7f, 0xf6, 0xfd, 0xb7, 0x9f, 0x7f, 0xf7, 0xdb, 
+	0xef, 0xff, 0x1b, 0xef, 0x9f, 0xf7, 0xfb, 0xb7, 
+	0x6f, 0xe7, 0xdf, 0xff, 0xdd, 0x6f, 0xff, 0xff, 
+	0xff, 0xed, 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xe6, 
+	0xff, 0xff, 0xae, 0x5f, 0x6f, 0xff, 0xdf, 0xff, 
+	0x7f, 0xdb, 0xd7, 0xef, 0x7e, 0xff, 0xfe, 0xf7, 
+	0xbb, 0xef, 0xff, 0xbf, 0xc9, 0xff, 0xff, 0xde, 
+	0xef, 0x3f, 0xfe, 0xea, 0xef, 0xff, 0x77, 0xf8, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x6d, 0xfe, 0xdf, 0xff, 0x7f, 0xef, 0xfb, 0x6b, 
+	0xbe, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 
+	0xff, 0xff, 0xbb, 0xeb, 0xff, 0xfd, 0xbf, 0xd7, 
+	0xf7, 0xfd, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0xf7, 
+	0xef, 0xff, 0x66, 0xfd, 0xff, 0xff, 0xf5, 0xbf, 
+	0xfe, 0xab, 0x7e, 0xff, 0xff, 0xee, 0xfb, 0xfb, 
+	0xfe, 0xfb, 0xef, 0xbd, 0xff, 0xff, 0xb7, 0xf9, 
+	0xbf, 0x7f, 0xff, 0x7e, 0xde, 0xec, 0xdf, 0xff, 
+	0xfd, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xff, 0xff, 0x6e, 0xfe, 0xff, 0xef, 0xf7, 
+	0xff, 0x5b, 0xff, 0x7b, 0xff, 0xd3, 0x9e, 0x77, 
+	0xde, 0x79, 0xff, 0x9f, 0x5f, 0xfe, 0xf9, 0xff, 
+	0x9b, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xef, 0xfd, 
+	0xfb, 0xff, 0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 
+	0xdf, 0x77, 0xbf, 0xfd, 0xff, 0xe6, 0xfe, 0xdf, 
+	0xfd, 0xef, 0xff, 0xff, 0xef, 0x7f, 0x5f, 0x7f, 
+	0xfb, 0xeb, 0xbf, 0xff, 0xff, 0xfb, 0xef, 0xbf, 
+	0xbf, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0xfb, 0xfe, 
+	0x7f, 0xd3, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x6e, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xb6, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff, 0xeb, 
+	0xff, 0xff, 0xfb, 0x9b, 0xfe, 0xf5, 0xff, 0xf6, 
+	0x2e, 0xab, 0xaf, 0xa6, 0x5e, 0x6f, 0x7e, 0xf3, 
+	0xcd, 0xf7, 0xc5, 0x5f, 0xf3, 0xcd, 0xf7, 0xbf, 
+	0x66, 0x7f, 0xfe, 0xef, 0xff, 0x5a, 0xf2, 0xab, 
+	0xaf, 0xe7, 0x9d, 0xef, 0xbc, 0xf3, 0x7e, 0x35, 
+	0xad, 0xbc, 0xf9, 0xfe, 0xb7, 0x49, 0xff, 0x7f, 
+	0xfd, 0xef, 0x97, 0xfe, 0xfa, 0xcb, 0x25, 0x67, 
+	0xf9, 0xef, 0xbf, 0x5f, 0xff, 0xf9, 0xef, 0xbf, 
+	0xeb, 0x6f, 0xd4, 0xff, 0x9f, 0x7f, 0xff, 0xaf, 
+	0xbf, 0xfe, 0xf0, 0xab, 0x5c, 0xfd, 0xf7, 0xdf, 
+	0xd7, 0xdf, 0xfe, 0xf7, 0xdf, 0x5e, 0x99, 0xfb, 
+	0xf5, 0xfd, 0xbe, 0xde, 0x69, 0xf5, 0xff, 0xf5, 
+	0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xf5, 0xdf, 0xec, 
+	0xfb, 0x6f, 0x6f, 0x06, 0xfe, 0xff, 0xef, 0xff, 
+	0xba, 0xea, 0xbd, 0x7f, 0xff, 0xfb, 0xdf, 0xff, 
+	0xff, 0x7f, 0xf5, 0xdd, 0xfb, 0xff, 0xff, 0xb3, 
+	0x99, 0xff, 0x2f, 0xff, 0xef, 0xbf, 0xba, 0x5f, 
+	0x5f, 0xad, 0x76, 0xb5, 0x5f, 0x7e, 0x59, 0xff, 
+	0x7d, 0xff, 0xff, 0xff, 0x66, 0xec, 0xff, 0x57, 
+	0xff, 0x2f, 0xaf, 0xfd, 0x1f, 0x27, 0x6a, 0x5b, 
+	0xdb, 0xaf, 0xbf, 0xd7, 0xdf, 0xe9, 0xa7, 0x9e, 
+	0x3e, 0x1a, 0xf7, 0x7e, 0xff, 0xcf, 0xb7, 0xdf, 
+	0xff, 0xff, 0xef, 0xd7, 0xbb, 0xfe, 0xda, 0xeb, 
+	0xff, 0xbf, 0xf6, 0xfa, 0x6b, 0x77, 0xe6, 0x7d, 
+	0x9d, 0xff, 0xe6, 0x59, 0xe7, 0x3f, 0x7f, 0xc4, 
+	0xf9, 0xcf, 0x3f, 0xff, 0xfc, 0xff, 0xcf, 0x3f, 
+	0xff, 0xfc, 0x9d, 0xa9, 0xee, 0xe3, 0xed, 0x35, 
+	0xef, 0xf8, 0xfb, 0xef, 0x3f, 0xfe, 0xf1, 0xc7, 
+	0x1f, 0x7f, 0xff, 0xf9, 0xe7, 0x9f, 0xff, 0x64, 
+	0xee, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0xdf, 0x7f, 
+	0xff, 0x7d, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xff, 
+	0xfb, 0xef, 0xbf, 0x3f, 0x9b, 0xf9, 0xff, 0xff, 
+	0xef, 0xef, 0xff, 0xfd, 0xf6, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xef, 0xe6, 0xf6, 0x5f, 0xef, 0xff, 0xf0, 0xc7, 
+	0x6f, 0xff, 0xde, 0xf0, 0x8f, 0x3f, 0xfe, 0xf8, 
+	0xff, 0x8f, 0x3f, 0xfe, 0xf8, 0xbb, 0x61, 0xff, 
+	0xef, 0xaf, 0x3c, 0xfe, 0xf9, 0xef, 0x9f, 0x6e, 
+	0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 
+	0x7f, 0x7f, 0x6f, 0xfa, 0xf7, 0xff, 0xff, 0xab, 
+	0xff, 0xff, 0xfe, 0xef, 0xef, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xfd, 0xfd, 0xff, 0xdf, 0xff, 0x9b, 
+	0xfe, 0xff, 0xcf, 0x3f, 0xfa, 0xdc, 0xf0, 0xcf, 
+	0x2f, 0x36, 0xbc, 0xe1, 0x86, 0x1f, 0xfe, 0xf8, 
+	0xe1, 0x86, 0x1f, 0xfe, 0xe6, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xb2, 0x8d, 0xff, 0xff, 0xf8, 0xcf, 
+	0x3f, 0xff, 0xff, 0xbf, 0xef, 0x3f, 0xff, 0xff, 
+	0xbf, 0xe1, 0xff, 0xff, 0xef, 0xbf, 0xbf, 0xbe, 
+	0xff, 0xff, 0xea, 0xd7, 0xdf, 0xfe, 0xfa, 0xeb, 
+	0xbf, 0xdf, 0x7e, 0xfb, 0xeb, 0x6f, 0xfe, 0xff, 
+	0xfb, 0xef, 0xab, 0x2f, 0xf6, 0xfa, 0xeb, 0xaf, 
+	0xfa, 0xcd, 0x57, 0x5f, 0xfd, 0xff, 0xcc, 0x37, 
+	0x5f, 0xfd, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xfa, 
+	0xeb, 0xff, 0xbf, 0xef, 0x7e, 0xfc, 0xe5, 0x8f, 
+	0x3f, 0xfe, 0xfb, 0xe5, 0x97, 0x3f, 0xfe, 0xe6, 
+	0xff, 0xff, 0xfd, 0xbc, 0xbf, 0xf6, 0xff, 0xff, 
+	0xfe, 0xf7, 0xfe, 0xff, 0xf6, 0xfd, 0xff, 0x9f, 
+	0x7d, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0x2f, 0xbf, 
+	0xde, 0x90, 0xa9, 0xaf, 0xbe, 0xfe, 0xba, 0x17, 
+	0x5f, 0x7f, 0xfc, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0x6f, 0x3e, 0xff, 0xfc, 0xff, 0x6f, 0xaf, 0xfb, 
+	0xfa, 0xaf, 0xef, 0xf7, 0xf6, 0xfd, 0xef, 0xdf, 
+	0x7f, 0xbf, 0xdd, 0xef, 0xff, 0x9b, 0xff, 0x1f, 
+	0xf7, 0xcf, 0xf3, 0xfd, 0xbe, 0xff, 0xab, 0x3f, 
+	0xf7, 0xfd, 0x67, 0xdf, 0x7e, 0xfd, 0xfb, 0x3f, 
+	0xff, 0x7f, 0x66, 0x7f, 0xdf, 0xf7, 0xf4, 0xef, 
+	0xdb, 0x7f, 0xf7, 0x4d, 0x7f, 0xff, 0x6f, 0xee, 
+	0x9b, 0xfe, 0xf7, 0xef, 0xff, 0xff, 0x9f, 0xe1, 
+	0xbf, 0x7f, 0xdf, 0xfe, 0xaf, 0xff, 0x7f, 0xd3, 
+	0x7d, 0xf7, 0xfb, 0xee, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xff, 0xef, 0xef, 0xff, 0xfa, 0xff, 
+	0x9f, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0x7f, 0xff, 
+	0x99, 0xb5, 0xbf, 0xd9, 0xef, 0xff, 0xff, 0xfb, 
+	0xff, 0xf7, 0xff, 0xdf, 0xfe, 0xff, 0xef, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0x7f, 0xc6, 0xff, 0xab, 
+	0xff, 0xff, 0xef, 0xf7, 0xff, 0x77, 0xff, 0xfd, 
+	0xe5, 0xbf, 0xef, 0x76, 0xfb, 0xef, 0xbf, 0xff, 
+	0xff, 0xbf, 0xb1, 0xef, 0xf7, 0xfe, 0xfd, 0xfd, 
+	0xd3, 0x5f, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 
+	0x7f, 0xff, 0x37, 0xff, 0xff, 0xfb, 0x6f, 0xfc, 
+	0xff, 0xff, 0xbd, 0xa3, 0xf7, 0xff, 0xef, 0xfc, 
+	0xf3, 0x9e, 0x7f, 0xdd, 0x79, 0xe7, 0x9f, 0x77, 
+	0xfe, 0xf1, 0xff, 0x9b, 0xff, 0xff, 0x7f, 0xbf, 
+	0xf7, 0xbf, 0xf7, 0xbf, 0xfd, 0xfb, 0xdf, 0xff, 
+	0xbf, 0xbd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 
+	0xe6, 0xfe, 0xef, 0xbf, 0xfb, 0xce, 0xfb, 0xef, 
+	0x77, 0x53, 0xe5, 0x6b, 0xff, 0xbd, 0xf7, 0xfe, 
+	0xfb, 0xef, 0xef, 0xbf, 0xbb, 0xf9, 0x77, 0xdd, 
+	0x47, 0x9f, 0x7f, 0xb6, 0xd9, 0x4f, 0xff, 0xde, 
+	0xdf, 0xff, 0xff, 0x7f, 0xdd, 0xff, 0xff, 0xff, 
+	0xff, 0x6d, 0xaa, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x76, 0xdf, 0xed, 0x7f, 0xff, 0xfb, 0xff, 0xff, 
+	0xdf, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0x1b, 0xfe, 
+	0xbf, 0xd5, 0xfa, 0xfb, 0xef, 0xb9, 0x94, 0x5f, 
+	0x2a, 0x7f, 0xff, 0xe4, 0xf7, 0xc5, 0x7f, 0xf9, 
+	0xf9, 0xff, 0x3f, 0x66, 0xff, 0xfb, 0xec, 0xbe, 
+	0x57, 0xfe, 0xbb, 0xe9, 0x97, 0xfc, 0xaf, 0x7f, 
+	0xff, 0x7e, 0x9b, 0xef, 0xbf, 0xff, 0xff, 0xb7, 
+	0xf9, 0xff, 0x7b, 0xfb, 0xed, 0xb7, 0xd7, 0x5e, 
+	0xef, 0x2f, 0xff, 0xfb, 0xff, 0xbf, 0x4b, 0xfe, 
+	0xfb, 0x6f, 0xd6, 0xff, 0x6f, 0xd6, 0xbf, 0x5f, 
+	0x7b, 0xed, 0xb5, 0xd7, 0x5e, 0xfb, 0xeb, 0xff, 
+	0xfe, 0xfe, 0xef, 0xd4, 0xff, 0xfe, 0xbb, 0xf5, 
+	0x5f, 0x9b, 0xfb, 0xff, 0xd7, 0x66, 0xdb, 0x6d, 
+	0xb6, 0xbd, 0xf7, 0xca, 0xd7, 0xfe, 0xff, 0xef, 
+	0xd5, 0xfa, 0xfe, 0xdb, 0xff, 0xef, 0x66, 0xfe, 
+	0xff, 0xe6, 0xbe, 0x2b, 0xee, 0xbb, 0xe7, 0xbe, 
+	0xfa, 0xd5, 0xff, 0xff, 0x7f, 0xf5, 0xfe, 0xff, 
+	0xff, 0xfd, 0xb3, 0xb1, 0xff, 0xff, 0xbb, 0xef, 
+	0xb5, 0xdb, 0x6e, 0xae, 0xaf, 0x7d, 0xfd, 0xef, 
+	0xff, 0x59, 0xc7, 0x97, 0xdf, 0xd2, 0xff, 0x66, 
+	0xee, 0xff, 0xff, 0xdb, 0x2f, 0xb1, 0xc5, 0x16, 
+	0xdb, 0x2b, 0x5d, 0xe1, 0xff, 0x9f, 0xd7, 0xff, 
+	0xfb, 0xaf, 0xf5, 0xbf, 0x9b, 0xf7, 0xff, 0xbb, 
+	0xfd, 0xb6, 0xdb, 0x6e, 0xfb, 0xed, 0x97, 0xb8, 
+	0xfe, 0xfe, 0xeb, 0x7f, 0xbb, 0xfe, 0xda, 0xff, 
+	0xf7, 0xe6, 0xfd, 0xbf, 0x65, 0xbe, 0xc9, 0x26, 
+	0x9b, 0x6c, 0xf2, 0xd9, 0xcf, 0xbc, 0xff, 0xfc, 
+	0x37, 0xcf, 0x3f, 0xff, 0xff, 0xbd, 0xb1, 0xff, 
+	0xbb, 0x8b, 0x2f, 0xbf, 0xf8, 0xe2, 0x0b, 0x3f, 
+	0xef, 0xf9, 0xe7, 0x9f, 0x6b, 0xff, 0xf1, 0xc7, 
+	0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0x7d, 0xff, 0xfb, 0xff, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x3f, 0x9b, 
+	0xfb, 0xff, 0xbf, 0xff, 0xe6, 0xdb, 0x6f, 0xbf, 
+	0xed, 0xef, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0x7f, 
+	0xfc, 0xf1, 0xc7, 0x1f, 0x7f, 0xbc, 0xf4, 0x85, 
+	0xbf, 0xff, 0x78, 0xed, 0x8f, 0x3e, 0xfe, 0xff, 
+	0xab, 0x61, 0xff, 0x2f, 0x9f, 0x7f, 0xde, 0x79, 
+	0xe7, 0x9f, 0x2f, 0x7e, 0xb1, 0xee, 0x7f, 0x4f, 
+	0xec, 0xf7, 0xdf, 0xff, 0x7f, 0x6f, 0xfe, 0xff, 
+	0xfe, 0x7f, 0xcb, 0xaf, 0xb7, 0xfe, 0x72, 0xeb, 
+	0xf7, 0xfd, 0xdf, 0xdf, 0xd7, 0xfd, 0xfd, 0xb7, 
+	0xff, 0xff, 0x9b, 0xff, 0xbf, 0xcf, 0x3d, 0xfa, 
+	0xc8, 0x23, 0x8f, 0x3e, 0x3a, 0xfc, 0xe1, 0x87, 
+	0x1f, 0xf4, 0xf8, 0xe1, 0x87, 0x5f, 0xfe, 0xe6, 
+	0xff, 0xff, 0x2f, 0xbf, 0xfc, 0xf2, 0x8b, 0xaf, 
+	0xbf, 0xfe, 0xe5, 0xb7, 0xff, 0xfe, 0xf9, 0xef, 
+	0xbf, 0xff, 0xf6, 0xbf, 0xf9, 0xff, 0xff, 0xcb, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x5b, 0xbd, 
+	0xfc, 0xfb, 0xed, 0xaf, 0xbf, 0xfe, 0xba, 0xef, 
+	0x6f, 0xfe, 0xff, 0xfa, 0xea, 0x9f, 0x7f, 0xfe, 
+	0xfb, 0xef, 0xaf, 0xf9, 0xd4, 0x1b, 0xcf, 0x3c, 
+	0xff, 0xd4, 0x53, 0xff, 0xfd, 0x9b, 0xff, 0xbf, 
+	0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 
+	0xfc, 0xe3, 0x86, 0x5f, 0xfe, 0xfa, 0xe3, 0x8f, 
+	0x3b, 0xfe, 0x66, 0xff, 0x7f, 0xff, 0xf7, 0xff, 
+	0xdf, 0xbf, 0xef, 0xfe, 0xff, 0xfe, 0xff, 0xff, 
+	0x7f, 0xfb, 0xdf, 0x7f, 0xff, 0xff, 0xbf, 0xe9, 
+	0xff, 0xaf, 0xbf, 0x7c, 0xfa, 0xab, 0xaf, 0xbb, 
+	0xfe, 0xfa, 0xd3, 0x5f, 0x7f, 0xdd, 0xe5, 0x57, 
+	0x5f, 0x7e, 0xfd, 0x6b, 0xfe, 0xff, 0x7b, 0xbb, 
+	0xce, 0x36, 0xff, 0xee, 0xbf, 0xff, 0x7f, 0xfe, 
+	0xf9, 0x77, 0xb7, 0x7e, 0xff, 0x75, 0xff, 0xff, 
+	0x1b, 0xff, 0xfd, 0xf3, 0xcc, 0x7b, 0x7b, 0xf7, 
+	0xdf, 0x7f, 0x6f, 0xef, 0xdb, 0xef, 0x7f, 0xed, 
+	0xfb, 0xed, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff, 
+	0xfd, 0x9f, 0xff, 0xfd, 0x75, 0xf7, 0xff, 0x17, 
+	0xa7, 0xdf, 0x7a, 0xfb, 0xff, 0xb7, 0xab, 0xef, 
+	0xff, 0xbf, 0xd9, 0xff, 0xff, 0xff, 0xbf, 0xd5, 
+	0xfe, 0x7c, 0xe3, 0x27, 0xf2, 0xfb, 0xe0, 0xbf, 
+	0x9b, 0xcf, 0xfb, 0x6f, 0xff, 0xff, 0x6f, 0xfe, 
+	0xfd, 0xbf, 0xff, 0xff, 0xdd, 0xff, 0xbb, 0xfe, 
+	0xdb, 0xfb, 0x7f, 0xbf, 0xff, 0xfb, 0xef, 0xe7, 
+	0xdf, 0xfe, 0xfe, 0x9b, 0xff, 0x75, 0xfe, 0xff, 
+	0xba, 0xfe, 0x1b, 0xfd, 0xef, 0xd7, 0xff, 0xff, 
+	0xff, 0xef, 0x73, 0xff, 0xff, 0xf7, 0xdc, 0xbf, 
+	0x66, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xfe, 0xff, 0xef, 0xff, 0xff, 0x7d, 0xff, 
+	0xfd, 0xff, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0x7f, 
+	0xff, 0x7e, 0xdf, 0xeb, 0xff, 0x6d, 0xfd, 0xbf, 
+	0xdf, 0xdf, 0xff, 0xdb, 0xcd, 0xfd, 0xdf, 0xff, 
+	0xeb, 0x6f, 0x3e, 0x3f, 0xee, 0xf7, 0xff, 0xda, 
+	0xff, 0xef, 0xff, 0xe3, 0x1f, 0x7e, 0xfa, 0xf9, 
+	0xd7, 0xff, 0xef, 0xff, 0xf9, 0xff, 0x9b, 0xff, 
+	0x7a, 0xfd, 0xdb, 0xef, 0xf7, 0xff, 0xff, 0xeb, 
+	0xfd, 0xef, 0x9b, 0xf5, 0xfd, 0xff, 0xff, 0xff, 
+	0x7f, 0xfe, 0xff, 0x66, 0xff, 0xdf, 0xfe, 0xff, 
+	0xee, 0xdb, 0xfe, 0x7f, 0xdf, 0xff, 0xbf, 0xfb, 
+	0x26, 0x2f, 0xad, 0xff, 0xbf, 0x6d, 0xfe, 0xbf, 
+	0xf1, 0xff, 0xff, 0xeb, 0xff, 0xff, 0x5c, 0xdf, 
+	0x8b, 0xfe, 0xf9, 0x7b, 0xff, 0xbf, 0x7f, 0xde, 
+	0xd7, 0xdf, 0x9f, 0xff, 0x67, 0xfe, 0xff, 0xff, 
+	0x7f, 0xfb, 0xaf, 0xff, 0xff, 0xbf, 0xbf, 0xff, 
+	0xbf, 0xff, 0x1d, 0xdf, 0xff, 0xfb, 0xff, 0xf5, 
+	0xfb, 0x9b, 0xfe, 0xe5, 0xd7, 0xf1, 0xff, 0xff, 
+	0xff, 0xb1, 0xff, 0x4f, 0xfd, 0xff, 0xe5, 0x2f, 
+	0x45, 0x7e, 0x4a, 0x4d, 0xe5, 0xbf, 0x66, 0x7f, 
+	0xfa, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xec, 0xe7, 
+	0x5f, 0xff, 0xfc, 0xf9, 0x4f, 0x9f, 0x5f, 0x56, 
+	0xd9, 0xf9, 0xb7, 0x49, 0xff, 0xfe, 0xbf, 0xff, 
+	0xff, 0xff, 0x7f, 0xfd, 0xaf, 0xfe, 0xff, 0xcf, 
+	0xbf, 0x4b, 0x65, 0x39, 0xef, 0x92, 0xf3, 0x6f, 
+	0xd4, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0xf3, 0x9f, 
+	0x3f, 0xeb, 0xff, 0xff, 0xff, 0xdf, 0xd6, 0x7b, 
+	0xe7, 0x3b, 0xf5, 0x5e, 0x9b, 0xfb, 0xe7, 0xfd, 
+	0xff, 0xde, 0xed, 0xaf, 0xbf, 0xff, 0xdf, 0xff, 
+	0xfe, 0xf9, 0x6f, 0xf5, 0x79, 0x4e, 0x7b, 0x45, 
+	0xee, 0x06, 0x7e, 0xb8, 0xff, 0xfe, 0x16, 0xeb, 
+	0xeb, 0xef, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f, 
+	0x7d, 0x5f, 0x51, 0x5f, 0xfd, 0xb3, 0x99, 0xff, 
+	0xee, 0xff, 0xef, 0xfd, 0xff, 0xff, 0xeb, 0xaf, 
+	0xf7, 0xff, 0xff, 0xfe, 0x5f, 0xee, 0xbd, 0xde, 
+	0x57, 0xfb, 0x66, 0xec, 0xbf, 0xf7, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xfa, 0x2b, 0xf1, 0xe1, 0x27, 
+	0x1e, 0xd6, 0x63, 0xe1, 0xaf, 0xb4, 0xb8, 0x1b, 
+	0xf7, 0x7f, 0xff, 0x6f, 0xff, 0xff, 0xf6, 0xf3, 
+	0xff, 0xd7, 0xbb, 0xfe, 0xfa, 0xeb, 0x7f, 0xbe, 
+	0xfe, 0xb2, 0xcb, 0x77, 0x66, 0xfd, 0x9f, 0xff, 
+	0xf7, 0xff, 0x67, 0xbf, 0xf9, 0xf7, 0xf9, 0xcf, 
+	0x3f, 0xff, 0xfc, 0x3f, 0xcf, 0x3f, 0xff, 0xac, 
+	0xbd, 0xb9, 0xfe, 0x43, 0xed, 0xbe, 0xdf, 0x40, 
+	0xfb, 0xef, 0x3e, 0xff, 0xf9, 0xe7, 0x9f, 0x6b, 
+	0xff, 0xf9, 0xc6, 0x1b, 0xfd, 0x66, 0xee, 0xff, 
+	0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, 0x7f, 
+	0xff, 0xfb, 0xef, 0xbf, 0xfb, 0xef, 0x9b, 0x6f, 
+	0xbe, 0x3b, 0x9b, 0xf9, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xfb, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfd, 
+	0xd7, 0xff, 0x7e, 0xf7, 0xdf, 0xbf, 0xef, 0xe6, 
+	0xf6, 0x0b, 0xaf, 0xbf, 0x7f, 0xea, 0xfb, 0xed, 
+	0xff, 0xf5, 0xa5, 0x12, 0x7e, 0x78, 0xf5, 0x8d, 
+	0x17, 0x4e, 0xf8, 0xbb, 0x61, 0xff, 0xe2, 0xcb, 
+	0xef, 0xb6, 0xd8, 0xab, 0xbb, 0xff, 0x5e, 0xf1, 
+	0xc5, 0x1f, 0x5f, 0xff, 0xb1, 0xc5, 0x17, 0x7f, 
+	0x6f, 0xfe, 0xb7, 0xfc, 0x7a, 0xff, 0x2f, 0xfb, 
+	0xff, 0xff, 0xff, 0x5d, 0x77, 0x99, 0xe7, 0x97, 
+	0xdf, 0xee, 0xbb, 0xe5, 0xff, 0x9b, 0xff, 0xaf, 
+	0x8f, 0x3e, 0xff, 0xe8, 0xf3, 0xcf, 0x3f, 0x3f, 
+	0xd5, 0x41, 0x87, 0x1d, 0xf4, 0xd8, 0xe1, 0x07, 
+	0x1d, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 0xbf, 0xff, 
+	0xfa, 0xfb, 0xef, 0xff, 0xf9, 0xff, 0xbf, 0x7f, 
+	0x7f, 0xf1, 0xfd, 0x1f, 0x5f, 0xff, 0xbf, 0xe1, 
+	0xff, 0xfa, 0xeb, 0xef, 0xbf, 0xfe, 0xfb, 0xfb, 
+	0xff, 0xdb, 0xbf, 0x7e, 0xdb, 0x4d, 0xaf, 0xdd, 
+	0xf4, 0xd2, 0xed, 0x6f, 0xfe, 0xbf, 0xfa, 0xf2, 
+	0xbf, 0xaf, 0xfe, 0xfb, 0xef, 0xbf, 0xf1, 0xd5, 
+	0x33, 0xd7, 0xdc, 0xdf, 0xcd, 0x57, 0xd7, 0xfc, 
+	0x9b, 0xfb, 0xaf, 0xbf, 0xfc, 0xff, 0xeb, 0xff, 
+	0xff, 0xfd, 0xbf, 0xfb, 0xe3, 0x97, 0x5d, 0xe4, 
+	0xda, 0xe5, 0x0f, 0x5d, 0xfe, 0xe6, 0xff, 0xca, 
+	0xff, 0xff, 0xff, 0xd4, 0x7f, 0x3f, 0xf7, 0xfb, 
+	0xdf, 0xff, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xdf, 
+	0xfe, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xfe, 0x7a, 
+	0xeb, 0xaf, 0xbf, 0xfa, 0xfa, 0xd7, 0x5f, 0x7b, 
+	0xfd, 0x31, 0x57, 0x5f, 0x77, 0xfd, 0x6f, 0x36, 
+	0x7f, 0xbf, 0xfb, 0xfd, 0xf6, 0xdf, 0xbf, 0xbf, 
+	0xff, 0x7f, 0xbc, 0xf9, 0xef, 0xff, 0x5e, 0xfd, 
+	0xfb, 0xf5, 0xff, 0x9b, 0xbf, 0xff, 0xdf, 0xff, 
+	0x3f, 0xff, 0xfd, 0xef, 0x7f, 0xff, 0xd7, 0xbd, 
+	0xd3, 0xb6, 0xff, 0x7f, 0xcf, 0xfd, 0xff, 0x7e, 
+	0xe6, 0xff, 0xbf, 0x3f, 0xff, 0xff, 0xb7, 0xfd, 
+	0xff, 0xdb, 0xf7, 0x3f, 0xed, 0xf7, 0xea, 0xf7, 
+	0xbb, 0xfd, 0xaf, 0xf7, 0xaf, 0x71, 0xff, 0xdf, 
+	0xeb, 0xff, 0x2f, 0xdf, 0x7f, 0xdd, 0xff, 0xdb, 
+	0xbd, 0xb7, 0xfe, 0x5f, 0xa9, 0xbf, 0xe9, 0xc7, 
+	0xf3, 0x67, 0xec, 0xdf, 0xbb, 0xfa, 0xff, 0xf6, 
+	0xff, 0xf7, 0xff, 0xfe, 0xbf, 0x7d, 0x5f, 0xfe, 
+	0xad, 0xfd, 0xdf, 0x3f, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xbc, 0xff, 0xff, 0x9e, 0xef, 0xff, 
+	0xfb, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xbf, 0xc6, 0x5f, 0x7f, 0xcf, 0xff, 
+	0xff, 0xf6, 0xff, 0xfd, 0x3f, 0xe3, 0xcf, 0xf7, 
+	0xdf, 0xef, 0xef, 0x6f, 0xbf, 0xff, 0xbf, 0xbf, 
+	0xd1, 0xff, 0xcf, 0xef, 0xff, 0xfe, 0x1e, 0xff, 
+	0x7f, 0xec, 0x97, 0xff, 0xfd, 0xf6, 0xfe, 0xed, 
+	0xbf, 0xde, 0xff, 0xfe, 0x6f, 0xfc, 0x3d, 0xe7, 
+	0xac, 0xd0, 0x57, 0x3e, 0xef, 0xfc, 0xff, 0x9e, 
+	0xee, 0xdf, 0x6f, 0x6b, 0xec, 0xff, 0xff, 0x7f, 
+	0xff, 0x9b, 0xfa, 0xaf, 0xfe, 0xd6, 0xfa, 0xdf, 
+	0x7e, 0x9f, 0xfd, 0xdf, 0xb7, 0xfd, 0x9f, 0xbf, 
+	0xfb, 0xff, 0xfe, 0xff, 0xbf, 0xbf, 0xe6, 0xfe, 
+	0xab, 0x5f, 0xfb, 0xef, 0x7f, 0x67, 0x7e, 0x9f, 
+	0xfe, 0xa7, 0xbb, 0x59, 0xbe, 0x7f, 0x76, 0x7f, 
+	0xfd, 0xbf, 0xbf, 0xf9, 0xbf, 0xfb, 0xdf, 0xff, 
+	0xfe, 0x7a, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 
+	0x9f, 0xfb, 0xff, 0xf9, 0xf7, 0xff, 0xff, 0x6f, 
+	0xee, 0xfd, 0xfe, 0xff, 0xff, 0xbf, 0xbb, 0xee, 
+	0xff, 0xbf, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0x5f, 
+	0xff, 0xfd, 0xdf, 0xff, 0x1b, 0x7e, 0x75, 0xf7, 
+	0x95, 0x7f, 0x7f, 0xfd, 0xf1, 0xb5, 0xd7, 0xbe, 
+	0xf6, 0xda, 0xfb, 0xff, 0xbe, 0xf7, 0xdf, 0x0b, 
+	0xef, 0xa6, 0xff, 0xaf, 0xff, 0xb3, 0x5b, 0xcf, 
+	0x6b, 0xff, 0xd7, 0xc3, 0xf7, 0xf7, 0x53, 0x2f, 
+	0xf5, 0xb7, 0x72, 0xff, 0xff, 0xbf, 0xd9, 0xff, 
+	0xee, 0xff, 0xec, 0xff, 0xfd, 0xfe, 0x7f, 0xf5, 
+	0x7c, 0xff, 0xfd, 0xf2, 0x4b, 0x7e, 0x9f, 0xfd, 
+	0xff, 0xff, 0x6d, 0xfe, 0xb7, 0x5f, 0xff, 0xbb, 
+	0xff, 0xbf, 0xfc, 0xff, 0xff, 0xdd, 0x4f, 0xff, 
+	0xe5, 0x97, 0xdb, 0xef, 0xf5, 0xff, 0x7f, 0x1b, 
+	0xf5, 0xb5, 0xe7, 0xff, 0x7e, 0xfe, 0x8f, 0xff, 
+	0xff, 0x7f, 0xdd, 0xd3, 0x6f, 0xf9, 0xf5, 0xda, 
+	0x6b, 0xff, 0xff, 0x57, 0xe6, 0xbe, 0x6d, 0xff, 
+	0x95, 0xf7, 0xdb, 0x0b, 0xf5, 0xfd, 0xf6, 0x37, 
+	0xf3, 0x44, 0x33, 0xe5, 0x37, 0xf3, 0xfe, 0xff, 
+	0xbb, 0x91, 0xff, 0xee, 0x7f, 0xe7, 0xfe, 0x5b, 
+	0xfe, 0xbd, 0xbf, 0x7e, 0xf7, 0xbd, 0xd3, 0x4f, 
+	0x7d, 0xef, 0xbd, 0xff, 0xff, 0x6c, 0xec, 0xbf, 
+	0xcb, 0xff, 0xfa, 0xfd, 0x97, 0xbe, 0x3f, 0xff, 
+	0xdf, 0x6d, 0x7f, 0x65, 0xd4, 0xdf, 0xab, 0xed, 
+	0xff, 0xbf, 0x19, 0xf9, 0xbf, 0xbd, 0x57, 0x4e, 
+	0x3c, 0xec, 0xfe, 0xc3, 0xcf, 0xdf, 0xf2, 0x7b, 
+	0xf5, 0x15, 0xde, 0x78, 0xfb, 0xff, 0x6f, 0x86, 
+	0xbd, 0xd9, 0xff, 0xfb, 0xfd, 0xb7, 0xfd, 0x7e, 
+	0xdb, 0xfd, 0xec, 0xfd, 0xfd, 0xb3, 0xeb, 0xfd, 
+	0xff, 0xfd, 0xff, 0xbd, 0x79, 0x9f, 0xe6, 0x6b, 
+	0x7c, 0xfe, 0xd9, 0x67, 0x9c, 0x79, 0x7e, 0xf3, 
+	0x55, 0xfe, 0xf2, 0x7c, 0xff, 0x7d, 0xfe, 0x7f, 
+	0x6d, 0xa6, 0xbf, 0xf8, 0xfb, 0xcf, 0x35, 0xd3, 
+	0xfc, 0x73, 0xcd, 0x5f, 0xfc, 0xfd, 0xf6, 0x9f, 
+	0x5f, 0x7f, 0xfd, 0xf7, 0xbf, 0x99, 0xf8, 0xef, 
+	0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0x9f, 0xff, 0xbf, 0xf7, 0xdf, 0xff, 
+	0xff, 0xee, 0xe6, 0xfe, 0xfb, 0xff, 0xff, 0xeb, 
+	0x6f, 0xff, 0xff, 0xfe, 0xfb, 0xfd, 0xff, 0xf7, 
+	0xff, 0xf7, 0xfd, 0xb7, 0xff, 0xdf, 0xbb, 0xb9, 
+	0xfd, 0x47, 0xff, 0x2d, 0xdc, 0xd1, 0xe7, 0x4b, 
+	0x7f, 0xfc, 0xe3, 0xbf, 0xd7, 0xff, 0xf8, 0xef, 
+	0xbf, 0xff, 0xff, 0x6e, 0xde, 0xff, 0xf9, 0xe7, 
+	0x8b, 0x7f, 0xd6, 0xc9, 0xe2, 0x9d, 0xfd, 0xec, 
+	0xd3, 0xd5, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xdf, 
+	0x9b, 0xff, 0x7f, 0xbb, 0xfe, 0xea, 0xfb, 0x6f, 
+	0xff, 0xff, 0xff, 0xbf, 0x5f, 0x7f, 0xbd, 0xff, 
+	0xfe, 0x5d, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xa3, 0x8f, 0x2e, 0xf7, 0xfc, 0xfb, 0xcf, 0x3d, 
+	0x7f, 0xd4, 0x55, 0xd7, 0x1b, 0x7f, 0xd1, 0xe1, 
+	0x9f, 0xbf, 0xf9, 0xff, 0xe2, 0xcb, 0x7f, 0xfb, 
+	0xf9, 0xfe, 0xcb, 0x6f, 0x7e, 0xdd, 0xf5, 0x15, 
+	0xf7, 0x5e, 0xfd, 0xf5, 0xfb, 0xef, 0x6f, 0xfe, 
+	0xbf, 0xfe, 0xf2, 0xdf, 0xfb, 0xff, 0x7f, 0xf2, 
+	0xff, 0x5f, 0x1f, 0xfd, 0x74, 0xfb, 0x4b, 0x57, 
+	0x3d, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xee, 0x57, 0xfb, 
+	0xd5, 0x75, 0x4f, 0x55, 0xff, 0xf5, 0xff, 0xff, 
+	0xe6, 0xff, 0xeb, 0x7f, 0xff, 0xef, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xf4, 0xfe, 0x59, 0xe6, 0xbf, 
+	0x75, 0xff, 0xfb, 0xef, 0xbf, 0xf9, 0xbf, 0xff, 
+	0xdb, 0x4f, 0xbf, 0xfd, 0xfe, 0xff, 0xef, 0xbf, 
+	0xff, 0xe7, 0x27, 0xf7, 0xff, 0xe7, 0xe9, 0xff, 
+	0xff, 0x6f, 0xf6, 0xff, 0xeb, 0xa6, 0xba, 0xde, 
+	0x7a, 0xe3, 0xa7, 0x37, 0xfe, 0xe5, 0xd3, 0x5d, 
+	0x7f, 0xec, 0xd5, 0xd6, 0x5f, 0xfb, 0x9b, 0xff, 
+	0xb7, 0xbe, 0xff, 0xbf, 0xf9, 0xff, 0xd7, 0x6c, 
+	0xdb, 0xff, 0xff, 0xf7, 0xe9, 0xbf, 0x7e, 0xff, 
+	0xff, 0xff, 0xff, 0xc6, 0xff, 0xff, 0xfe, 0xf9, 
+	0xef, 0x3f, 0xff, 0x1e, 0xf2, 0x7d, 0xff, 0xbd, 
+	0x6f, 0xbf, 0x6f, 0x7f, 0xfb, 0xfe, 0xfb, 0x9f, 
+	0xf9, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xfd, 0xb5, 0xd3, 0xef, 0xfe, 0xf3, 0xee, 0xff, 
+	0xe7, 0xff, 0xff, 0xff, 0x6f, 0xf8, 0x3e, 0xe7, 
+	0xfa, 0x63, 0xfd, 0x37, 0xf9, 0xff, 0xbb, 0x7f, 
+	0x6e, 0xbd, 0xf5, 0xff, 0x7f, 0xff, 0xbd, 0xff, 
+	0xfe, 0x99, 0xff, 0xf9, 0xef, 0xfd, 0xfd, 0x7f, 
+	0xf6, 0xff, 0xbf, 0x7b, 0xff, 0x77, 0x5b, 0x7d, 
+	0xff, 0x7b, 0xd7, 0xdf, 0xff, 0xff, 0xe6, 0xff, 
+	0xef, 0xad, 0xff, 0xef, 0xb3, 0xdd, 0xff, 0x7f, 
+	0xf4, 0xe5, 0xd3, 0x3f, 0xff, 0xbf, 0xf5, 0xcf, 
+	0xff, 0xf7, 0xbf, 0xf9, 0xeb, 0xff, 0xdf, 0x7f, 
+	0x0f, 0xff, 0xff, 0x7f, 0xef, 0xfa, 0xff, 0xeb, 
+	0xbf, 0xf9, 0x7e, 0xfd, 0xe5, 0x7f, 0xff, 0x6f, 
+	0xfa, 0xee, 0x75, 0xe7, 0xff, 0xef, 0xf5, 0xdf, 
+	0xbf, 0xaf, 0xfd, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 
+	0xee, 0xff, 0xbf, 0xf9, 0x9a, 0xff, 0xff, 0x7f, 
+	0xc3, 0x7f, 0xdf, 0xfe, 0xfb, 0xdf, 0xf8, 0x7f, 
+	0xfd, 0x7d, 0xf8, 0x6d, 0xe7, 0xef, 0xfb, 0xff, 
+	0xff, 0xe6, 0xff, 0xbf, 0x7e, 0xdf, 0xef, 0xff, 
+	0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x56, 
+	0x7f, 0xb5, 0xff, 0xff, 0xff, 0xbf, 0xb9, 0xf7, 
+	0xe2, 0xcf, 0xff, 0xfe, 0x7d, 0xf7, 0x48, 0xbf, 
+	0xf7, 0x9b, 0xf4, 0x5f, 0xff, 0xfd, 0xff, 0xc7, 
+	0xfd, 0xff, 0x6e, 0xee, 0xff, 0xbe, 0xf9, 0x7f, 
+	0x7f, 0xff, 0xfd, 0xfb, 0xef, 0x57, 0x7f, 0xdd, 
+	0xf3, 0x7f, 0x7f, 0xff, 0x71, 0xfe, 0xff, 0x9b, 
+	0xfd, 0xbf, 0x7f, 0xdf, 0xbf, 0xff, 0xfe, 0xff, 
+	0xfe, 0xea, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xdf, 
+	0x9f, 0xf5, 0xff, 0xef, 0x86, 0xff, 0xff, 0xb9, 
+	0xf2, 0xf2, 0xef, 0x6f, 0xff, 0xb2, 0xca, 0x9f, 
+	0xf7, 0x5f, 0xcf, 0x93, 0x5d, 0x36, 0xeb, 0xfc, 
+	0x8f, 0xd9, 0xff, 0x3f, 0xfb, 0xf9, 0xff, 0xfb, 
+	0xfe, 0xff, 0xfc, 0xf3, 0x3f, 0xff, 0xd4, 0xf3, 
+	0xe7, 0xb7, 0x76, 0xfe, 0xff, 0x6d, 0xfe, 0xa7, 
+	0xce, 0x23, 0xab, 0xbf, 0x97, 0xff, 0x6f, 0x9e, 
+	0x55, 0x7d, 0xfb, 0xf5, 0x7c, 0xeb, 0xae, 0xf7, 
+	0xdf, 0xff, 0x9b, 0xf5, 0xa9, 0x3f, 0xff, 0x3e, 
+	0xef, 0xec, 0xff, 0xcf, 0x38, 0xd7, 0xbf, 0x7d, 
+	0x3c, 0xff, 0xfe, 0xf9, 0xff, 0xff, 0xd7, 0xe6, 
+	0xfe, 0x7f, 0x37, 0xd8, 0xfe, 0xde, 0xef, 0xf6, 
+	0xbd, 0x52, 0xbf, 0xd7, 0xeb, 0xfb, 0x7f, 0x94, 
+	0xf2, 0xed, 0xff, 0xbb, 0x99, 0xff, 0x5f, 0x78, 
+	0xff, 0xbf, 0xf7, 0xee, 0xff, 0xff, 0xfd, 0xaf, 
+	0xfc, 0xff, 0xff, 0x5f, 0xd7, 0xd4, 0xff, 0xff, 
+	0x6c, 0xec, 0xbf, 0xd6, 0x7b, 0xe9, 0xaf, 0xbf, 
+	0x5f, 0xef, 0xdf, 0x5f, 0x7f, 0xf9, 0xaf, 0xbf, 
+	0x59, 0x6f, 0xfd, 0xff, 0xbf, 0x99, 0xfb, 0xbf, 
+	0xed, 0x57, 0xde, 0x6b, 0xef, 0xf7, 0xc7, 0x1a, 
+	0xdf, 0xde, 0xaf, 0xf7, 0xed, 0x57, 0x76, 0xff, 
+	0xff, 0xef, 0xe6, 0xfd, 0xff, 0x7f, 0xff, 0x6f, 
+	0xbf, 0xfd, 0x78, 0xff, 0xff, 0x7e, 0xfb, 0xfd, 
+	0xfe, 0xdf, 0xaf, 0xff, 0xff, 0xff, 0xbd, 0x79, 
+	0xff, 0x7f, 0x9f, 0xff, 0xe6, 0xff, 0x6f, 0x9f, 
+	0x7f, 0xe7, 0xbf, 0xdf, 0x38, 0xfa, 0xaf, 0xb3, 
+	0xff, 0xff, 0x7f, 0x6f, 0xec, 0xd7, 0x6e, 0xd3, 
+	0xed, 0xbf, 0xff, 0xbe, 0x63, 0xcd, 0x7f, 0xf7, 
+	0xfd, 0x66, 0xdf, 0x63, 0x9e, 0xfd, 0xf7, 0xbf, 
+	0x99, 0xf9, 0xf7, 0xcf, 0x3f, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xfd, 0xef, 0x9f, 0xff, 0xff, 
+	0xff, 0xec, 0xff, 0xff, 0xcf, 0xe6, 0xbe, 0xff, 
+	0xfb, 0xee, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xdf, 
+	0xff, 0xfe, 0xf7, 0xff, 0xff, 0xdf, 0xfe, 0xff, 
+	0xff, 0xbb, 0xa9, 0xff, 0xdf, 0x8f, 0xaf, 0xbd, 
+	0xf6, 0xda, 0x0f, 0xef, 0xfe, 0xef, 0x95, 0x37, 
+	0xff, 0x7d, 0xe1, 0xfd, 0xff, 0xff, 0x6a, 0xde, 
+	0xff, 0x7a, 0xe3, 0xab, 0xac, 0xfe, 0xfa, 0x63, 
+	0x8b, 0x7f, 0x7d, 0x95, 0x4f, 0xb7, 0x4f, 0x7c, 
+	0xfb, 0xff, 0xdf, 0x9b, 0xff, 0xbf, 0xd3, 0xcc, 
+	0xff, 0xff, 0xbd, 0xdf, 0xfa, 0xf3, 0xdf, 0x5f, 
+	0xaf, 0xff, 0xdf, 0xdf, 0xff, 0xff, 0xdf, 0xff, 
+	0xe6, 0xff, 0xef, 0xb3, 0xc7, 0x3f, 0xff, 0xfc, 
+	0xb3, 0x8f, 0x2e, 0xf7, 0xb0, 0xef, 0xa6, 0xbf, 
+	0xe4, 0xf1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xcf, 0xb5, 0xff, 0xfe, 0xf2, 0xcf, 0x67, 0xff, 
+	0xfd, 0xf5, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfb, 0xfb, 0xbf, 
+	0xff, 0x7e, 0xfb, 0xeb, 0x7b, 0x3f, 0xfd, 0xfe, 
+	0xbb, 0xef, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xbf, 0xfe, 0xf8, 0xeb, 0xaf, 0x3f, 0xde, 0xf8, 
+	0xa3, 0x5f, 0x4b, 0x9d, 0x17, 0xfe, 0x78, 0x5f, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xbf, 0xb7, 
+	0xff, 0xfb, 0xff, 0xbd, 0xb7, 0xfc, 0xf7, 0xf6, 
+	0xf9, 0xe7, 0xdb, 0xf7, 0xf6, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xf6, 0x5b, 0xef, 0xa7, 0xff, 0xf3, 
+	0xff, 0xef, 0x7e, 0xfb, 0xe5, 0xff, 0x5f, 0x7e, 
+	0xf9, 0xed, 0x7f, 0xff, 0x6f, 0xfa, 0xff, 0xe9, 
+	0xaf, 0xbe, 0xf8, 0xea, 0xeb, 0xaf, 0xbe, 0xfe, 
+	0xf5, 0xc7, 0x5f, 0x74, 0xbd, 0x35, 0xd7, 0x5f, 
+	0xfb, 0x9a, 0xbd, 0xc7, 0x1e, 0xff, 0xbd, 0xe7, 
+	0x7b, 0xff, 0xff, 0xd9, 0x67, 0x37, 0xfe, 0xdf, 
+	0x7f, 0xdf, 0xdf, 0xef, 0xff, 0xff, 0xc6, 0xff, 
+	0xdf, 0xfe, 0xff, 0x7f, 0xdf, 0xd7, 0xf7, 0xff, 
+	0xbe, 0x7f, 0xde, 0xef, 0xff, 0x77, 0xff, 0x7f, 
+	0xf7, 0xff, 0x9f, 0xf9, 0xff, 0xff, 0x7f, 0x7f, 
+	0x7d, 0xdb, 0xff, 0xff, 0x7e, 0xdf, 0xaf, 0xbd, 
+	0xfe, 0xf7, 0xff, 0xf2, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0x3f, 0xdf, 0x74, 0xe9, 0xa9, 0xef, 0x7f, 
+	0xff, 0xfd, 0x7e, 0xdd, 0xff, 0xff, 0x94, 0x53, 
+	0x7b, 0xfd, 0x5f, 0xfe, 0x9b, 0xff, 0xff, 0xff, 
+	0xf7, 0xb7, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xef, 0x73, 0xb3, 0xf7, 0xfe, 0xf7, 
+	0xff, 0xe6, 0xef, 0xff, 0xbb, 0x37, 0xfe, 0xf6, 
+	0xff, 0xfb, 0x73, 0xfe, 0x7d, 0xdf, 0xff, 0xff, 
+	0xfd, 0x7f, 0xc7, 0x7f, 0xfb, 0xbf, 0xf9, 0x7f, 
+	0xf7, 0xd3, 0xef, 0xbf, 0xff, 0xff, 0x9f, 0x6f, 
+	0xfb, 0xfb, 0xf4, 0x97, 0x1f, 0x7d, 0xfb, 0xe5, 
+	0xf7, 0xfd, 0x6f, 0xf6, 0xfe, 0xff, 0xfe, 0xfb, 
+	0xb7, 0xfd, 0xbf, 0x8f, 0x7b, 0xff, 0xef, 0xfb, 
+	0xff, 0xff, 0x73, 0xff, 0xff, 0xe6, 0xff, 0x9b, 
+	0xfd, 0xfb, 0xff, 0x73, 0xbf, 0xff, 0xc7, 0x0b, 
+	0x7f, 0x2f, 0xfd, 0xef, 0xb5, 0x9f, 0xee, 0xff, 
+	0xd7, 0xf7, 0xee, 0xff, 0x66, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0x7f, 0xeb, 0xaf, 0xff, 0xfb, 0x7f, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 
+	0xbf, 0xf9, 0xff, 0xff, 0xcf, 0xa6, 0xff, 0xbe, 
+	0xff, 0xbd, 0xb7, 0xdf, 0xbf, 0xd7, 0xde, 0x5c, 
+	0xab, 0x7f, 0xa6, 0xff, 0xff, 0x6f, 0xfc, 0xfb, 
+	0xed, 0xf9, 0xff, 0xb7, 0xfb, 0xff, 0xd7, 0x8f, 
+	0xff, 0xf7, 0xf8, 0xfb, 0x9f, 0xff, 0xff, 0xdd, 
+	0xff, 0xff, 0x98, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xf3, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xbf, 0xff, 
+	0xff, 0xf7, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xa6, 
+	0xfc, 0xfb, 0xf9, 0xf2, 0x93, 0x6f, 0xfa, 0xfc, 
+	0xfe, 0xff, 0xdd, 0x5f, 0xff, 0xfd, 0xf7, 0xff, 
+	0x5c, 0xd9, 0xfd, 0xaf, 0xd9, 0xff, 0x7f, 0xfe, 
+	0xf9, 0xff, 0x9d, 0x3f, 0xff, 0xff, 0xff, 0xf5, 
+	0xdf, 0x77, 0xff, 0xfd, 0xff, 0x6d, 0xb6, 0xff, 
+	0x6d, 0xde, 0xa7, 0x56, 0x6f, 0x9a, 0xff, 0xbf, 
+	0xff, 0x2f, 0xff, 0x5f, 0xff, 0xfd, 0x7f, 0xde, 
+	0xeb, 0x7f, 0x8b, 0xe7, 0xdf, 0x1b, 0xf5, 0xbd, 
+	0xe7, 0x9f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xd7, 0xff, 0x7f, 0xff, 0xf7, 0xfe, 0xd3, 0x4f, 
+	0xf7, 0x57, 0xe6, 0xfe, 0xfa, 0xff, 0xdb, 0xf0, 
+	0xd2, 0x7b, 0xff, 0xfd, 0xb7, 0xfd, 0x97, 0x7e, 
+	0x32, 0x6b, 0x77, 0x73, 0x6a, 0xb3, 0xbb, 0x99, 
+	0xff, 0xef, 0xfd, 0xb7, 0xbf, 0xf4, 0xef, 0xff, 
+	0xff, 0xfe, 0xd5, 0xbc, 0xd3, 0xce, 0x7b, 0xb7, 
+	0xdc, 0x73, 0xff, 0x6c, 0xec, 0xbf, 0xbe, 0xff, 
+	0xea, 0x2f, 0xbd, 0xc7, 0xff, 0xbf, 0x5d, 0x7b, 
+	0x7d, 0xf7, 0xd5, 0x5f, 0x7f, 0x37, 0xd7, 0xbf, 
+	0x19, 0xf8, 0xbf, 0xbf, 0xf7, 0x0a, 0x4b, 0xff, 
+	0xfc, 0xf3, 0x3e, 0xd6, 0xdb, 0x7a, 0xe9, 0xa5, 
+	0xd7, 0xcb, 0x5b, 0xef, 0x6f, 0xe6, 0x3d, 0xff, 
+	0xf6, 0xfb, 0xff, 0x3f, 0xdf, 0x7f, 0xff, 0xff, 
+	0x7e, 0xb9, 0xff, 0xb6, 0xdb, 0xff, 0xbf, 0xfc, 
+	0xfb, 0xbd, 0x79, 0xdf, 0x7f, 0xbe, 0x75, 0xfe, 
+	0xf9, 0x67, 0x9f, 0xff, 0xe6, 0xe7, 0xdf, 0x7f, 
+	0xff, 0xad, 0xbf, 0xcf, 0xfa, 0x7e, 0x6f, 0xec, 
+	0xfb, 0xfe, 0x3b, 0xcd, 0x37, 0xd7, 0xe4, 0xf3, 
+	0x6f, 0x77, 0xff, 0xf5, 0xd7, 0x5f, 0x63, 0xa7, 
+	0xd1, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xff, 0xff, 
+	0xbf, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfc, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xce, 
+	0xe6, 0x7e, 0xff, 0xff, 0xff, 0xbf, 0xaf, 0xbf, 
+	0xff, 0xfe, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xef, 0xbb, 0xb9, 0xff, 0xff, 
+	0x6f, 0x37, 0xf5, 0xf7, 0xc2, 0x5f, 0xaf, 0xfd, 
+	0xed, 0xa7, 0x97, 0x7e, 0x7a, 0xfd, 0xa4, 0xff, 
+	0xff, 0x6e, 0xde, 0xff, 0xfd, 0xab, 0x9f, 0x7e, 
+	0x96, 0xf8, 0xe7, 0x8b, 0xde, 0xfd, 0xf5, 0xd5, 
+	0x5f, 0x5f, 0x7e, 0xf1, 0xce, 0xdf, 0x9b, 0xff, 
+	0xaf, 0xbf, 0xde, 0xfb, 0xff, 0x3f, 0xff, 0xff, 
+	0xff, 0xff, 0x5f, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xa3, 0xcf, 
+	0x3f, 0xff, 0xf8, 0xf3, 0xcf, 0x3f, 0xff, 0xd0, 
+	0xe1, 0x87, 0x1d, 0xfc, 0xd1, 0xe7, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfa, 
+	0xdf, 0x2f, 0xff, 0xf1, 0xf7, 0xdf, 0x5f, 0xff, 
+	0xf3, 0xfd, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 
+	0xfb, 0xff, 0xff, 0xbf, 0xfe, 0xf7, 0xeb, 0xdf, 
+	0xbf, 0xbd, 0xf6, 0xd2, 0xed, 0xff, 0xff, 0xf5, 
+	0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0xbf, 
+	0xaf, 0xfe, 0xfb, 0xe7, 0x7f, 0xfb, 0xd5, 0x55, 
+	0xdf, 0xfc, 0xff, 0x7d, 0xf5, 0xff, 0xe6, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xfb, 0xeb, 0xff, 0xff, 
+	0xff, 0xff, 0xfa, 0x63, 0x8f, 0x5f, 0xee, 0xff, 
+	0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xf5, 0x9b, 0x3f, 
+	0xff, 0xff, 0xfe, 0xff, 0x6f, 0xbe, 0xff, 0xe5, 
+	0x97, 0x5f, 0xde, 0xff, 0xe7, 0x97, 0xff, 0x6f, 
+	0xfe, 0xff, 0xeb, 0xad, 0xbf, 0xfe, 0xf2, 0xeb, 
+	0xaf, 0x3f, 0xee, 0xe5, 0xd7, 0x5f, 0x7d, 0xfd, 
+	0xb5, 0xc7, 0x5b, 0xff, 0x9b, 0xcd, 0xf7, 0xbb, 
+	0xff, 0xbb, 0xcf, 0xdf, 0xfd, 0xf8, 0xd8, 0x5f, 
+	0x3d, 0xfb, 0xba, 0xf3, 0x7e, 0x7e, 0xdf, 0xfd, 
+	0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xdd, 
+	0xff, 0x27, 0xde, 0x7a, 0xff, 0xff, 0xdf, 0xf7, 
+	0x5f, 0xde, 0xff, 0xf7, 0xfb, 0x9f, 0xf9, 0xff, 
+	0xbf, 0xfd, 0xdf, 0xff, 0xfe, 0xff, 0xbd, 0xfa, 
+	0xf4, 0xdd, 0xba, 0xfb, 0xaf, 0xff, 0xef, 0xb7, 
+	0xdf, 0xff, 0x6f, 0xfc, 0x3f, 0xfe, 0xf8, 0xeb, 
+	0xbc, 0xbf, 0xf6, 0x7f, 0x6b, 0xff, 0x77, 0xff, 
+	0xf5, 0xd7, 0xdf, 0xef, 0xbf, 0xf1, 0xff, 0x19, 
+	0xff, 0xef, 0xff, 0xef, 0xfb, 0xbb, 0x76, 0xef, 
+	0xbf, 0x7a, 0xff, 0xff, 0xf6, 0xda, 0xeb, 0xbd, 
+	0xef, 0xff, 0xff, 0xff, 0xe6, 0xed, 0xff, 0xef, 
+	0xbf, 0xff, 0xb9, 0xdb, 0xff, 0xfb, 0xff, 0xff, 
+	0x7f, 0x3f, 0xff, 0xfc, 0xf3, 0xdf, 0x5f, 0xfb, 
+	0xbf, 0xf1, 0xbf, 0xff, 0x7f, 0xff, 0xb9, 0xfb, 
+	0xff, 0xff, 0x7f, 0xef, 0xfb, 0xef, 0xf3, 0xdf, 
+	0xfb, 0xff, 0xf9, 0xf7, 0xff, 0x6f, 0xfc, 0xff, 
+	0xff, 0xdf, 0xfe, 0xbe, 0xf6, 0xf7, 0xef, 0xfd, 
+	0xff, 0xfb, 0xb7, 0x9d, 0x77, 0xf2, 0xff, 0xed, 
+	0xe6, 0xfb, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xee, 
+	0x33, 0xce, 0x1f, 0xfd, 0xa7, 0xff, 0xf7, 0xfb, 
+	0xdf, 0xff, 0xff, 0xff, 0xf7, 0xf6, 0xff, 0xe6, 
+	0xff, 0xfe, 0xff, 0xa7, 0xff, 0xf7, 0xdb, 0xaf, 
+	0xff, 0x5f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0x7f, 0xff, 0xb7, 0xf9, 0xf7, 0xf7, 0xff, 
+	0xfb, 0x5d, 0x7f, 0x57, 0xfd, 0xad, 0xff, 0xfd, 
+	0xe7, 0xdf, 0x7f, 0x3f, 0xed, 0xf5, 0x97, 0xff, 
+	0x6f, 0xf6, 0xbf, 0xf6, 0xfa, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xe9, 0x3f, 0xb3, 0xfc, 0xfb, 0xef, 
+	0x7f, 0xff, 0xfd, 0xf5, 0xfb, 0x9b, 0xfe, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xef, 
+	0xef, 0x6f, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xfd, 
+	0xff, 0xfb, 0x86, 0xff, 0xab, 0xaf, 0xbf, 0xc9, 
+	0x2f, 0xbf, 0xfc, 0xe4, 0x9b, 0xbf, 0xf7, 0xff, 
+	0xcb, 0xe7, 0x9f, 0x7f, 0x7e, 0xff, 0x8f, 0xd9, 
+	0x5f, 0xff, 0xff, 0x6f, 0xf1, 0x95, 0x3f, 0xff, 
+	0xf9, 0xf2, 0xff, 0xfd, 0xd7, 0x4b, 0x7f, 0xf5, 
+	0xd5, 0xf4, 0xff, 0x6d, 0xfe, 0xf7, 0xdb, 0x3f, 
+	0xef, 0x7f, 0xbf, 0xfa, 0xef, 0xff, 0x5f, 0xe3, 
+	0xbd, 0xf5, 0x56, 0x5b, 0x6f, 0x9d, 0xbd, 0xff, 
+	0x9b, 0xf5, 0xa5, 0x97, 0xce, 0xfb, 0xff, 0xac, 
+	0xff, 0xff, 0x3b, 0xd7, 0x7f, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0x4f, 0xff, 0xd7, 0xe6, 0xfe, 0x6b, 
+	0xa5, 0x9f, 0xff, 0xc7, 0x7f, 0xff, 0xfd, 0x77, 
+	0xff, 0xf7, 0x5f, 0x3b, 0xdd, 0x34, 0xd3, 0xde, 
+	0xab, 0xbb, 0x99, 0xff, 0xdf, 0xfd, 0xe2, 0xfe, 
+	0x58, 0xef, 0xbf, 0xef, 0xca, 0xf7, 0xfd, 0xff, 
+	0xf6, 0xbf, 0xef, 0x3e, 0x73, 0xef, 0x6c, 0xec, 
+	0xff, 0xbf, 0xff, 0x6f, 0xff, 0x95, 0xfe, 0xff, 
+	0x9f, 0x5f, 0xef, 0xfd, 0xff, 0xfe, 0xf7, 0xdf, 
+	0xff, 0xfd, 0xbd, 0x99, 0xf9, 0xaf, 0xbd, 0x56, 
+	0xfb, 0x17, 0xad, 0xf4, 0x53, 0x52, 0xd7, 0x70, 
+	0x7f, 0x2d, 0xb4, 0xd7, 0x5e, 0x7b, 0x87, 0xef, 
+	0x66, 0xfd, 0xfb, 0xee, 0xfb, 0xef, 0xdf, 0xde, 
+	0x7b, 0xff, 0xbf, 0x7e, 0xfb, 0xdf, 0x77, 0xdf, 
+	0x7d, 0xff, 0xfd, 0xb2, 0xbd, 0x79, 0xff, 0x3e, 
+	0xbb, 0xac, 0xf3, 0xd1, 0xe7, 0x9f, 0xff, 0xf7, 
+	0xbf, 0xdd, 0xf7, 0xd9, 0x65, 0x9f, 0x7d, 0x3e, 
+	0x7b, 0x6f, 0xec, 0x9f, 0x7e, 0xfa, 0xef, 0xbf, 
+	0xec, 0xf4, 0xf3, 0xed, 0x73, 0x77, 0xfd, 0xf5, 
+	0xd7, 0x4f, 0x3f, 0xfd, 0xe6, 0xbd, 0x99, 0xf9, 
+	0x66, 0x8f, 0xfd, 0xff, 0x3f, 0xff, 0xff, 0xef, 
+	0xbf, 0xfd, 0xcf, 0x3f, 0xfb, 0x6c, 0xb3, 0xdd, 
+	0xb6, 0xef, 0xcf, 0xe6, 0xfe, 0xda, 0x6e, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xfe, 0xdf, 0xff, 0xfe, 
+	0xdd, 0x76, 0xbb, 0xed, 0xb7, 0xfd, 0xfd, 0xab, 
+	0xa9, 0xdf, 0x5b, 0x6f, 0xfd, 0xfd, 0xd7, 0xc2, 
+	0x1f, 0xbf, 0xfc, 0xbf, 0xff, 0xd7, 0x5e, 0x7b, 
+	0xad, 0xb5, 0x97, 0xfe, 0x6e, 0xd8, 0xbf, 0xfb, 
+	0x2e, 0xbf, 0x77, 0xbe, 0xf8, 0xef, 0xad, 0xfd, 
+	0x7d, 0x95, 0xdf, 0x7f, 0xfd, 0xed, 0xf7, 0xc5, 
+	0xdf, 0x98, 0xff, 0xef, 0xbf, 0xff, 0xfa, 0xeb, 
+	0xaf, 0xfe, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff, 
+	0xef, 0xb3, 0x8f, 0x3e, 0xfa, 0xe8, 0xf3, 0xcf, 
+	0x3c, 0xff, 0xd1, 0x47, 0x1f, 0x7d, 0xf4, 0xd1, 
+	0x47, 0x9f, 0xbf, 0xf9, 0xef, 0xfe, 0xfb, 0xaf, 
+	0xbf, 0xfe, 0xf2, 0xdf, 0x6f, 0x7e, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x6f, 
+	0xf8, 0xff, 0xfe, 0xfb, 0xeb, 0xaf, 0xbf, 0xfc, 
+	0xf7, 0xfb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 
+	0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xfe, 
+	0xfa, 0xef, 0xab, 0xaf, 0xfe, 0xfb, 0xee, 0x57, 
+	0xff, 0x7d, 0xf5, 0xd5, 0x57, 0x5f, 0xfd, 0xf7, 
+	0xff, 0xe6, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xfa, 
+	0xeb, 0xff, 0xbf, 0xff, 0xe4, 0xd7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xde, 0xfb, 0x6f, 0xff, 0xfc, 0xff, 0xff, 0xeb, 
+	0xbf, 0xff, 0xef, 0xf6, 0x9f, 0x7c, 0xff, 0xfd, 
+	0xa7, 0xf7, 0x6f, 0xfa, 0xff, 0xab, 0xae, 0xbb, 
+	0xfe, 0xfa, 0xe9, 0x8f, 0xb7, 0xfa, 0xe5, 0x93, 
+	0x5d, 0x6f, 0xad, 0x75, 0xd7, 0x1d, 0xff, 0x9a, 
+	0xff, 0xdf, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 
+	0xd3, 0xbb, 0xff, 0xdf, 0xf7, 0xff, 0xff, 0x9f, 
+	0x7f, 0xfe, 0xfd, 0xff, 0xc6, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xfe, 0x7d, 0xf7, 0xdf, 0xef, 0x7f, 
+	0xff, 0xfa, 0xff, 0x7f, 0x75, 0xf6, 0xfd, 0xfb, 
+	0x9f, 0xf9, 0xff, 0xf7, 0xff, 0xff, 0x7d, 0xff, 
+	0xff, 0xbf, 0xbf, 0xfd, 0xff, 0xbf, 0xff, 0xff, 
+	0xf6, 0xbf, 0xb7, 0xee, 0xff, 0x6f, 0xfe, 0xff, 
+	0xfe, 0xbb, 0xeb, 0xbf, 0xff, 0xf7, 0xf7, 0xd3, 
+	0x7d, 0xbb, 0x75, 0xfd, 0xd7, 0x5f, 0x7b, 0xf9, 
+	0xb7, 0xff, 0x9b, 0xff, 0xff, 0xf7, 0xfb, 0xfb, 
+	0xff, 0xff, 0xff, 0xaf, 0xff, 0xef, 0xff, 0xff, 
+	0x7d, 0xf7, 0xb5, 0xfb, 0x76, 0xef, 0xff, 0xe6, 
+	0xff, 0xfb, 0xef, 0xbf, 0xf7, 0xfe, 0xef, 0xfb, 
+	0xff, 0xae, 0x7f, 0xc7, 0xff, 0x7d, 0xdd, 0xf6, 
+	0xd7, 0x7f, 0xff, 0xbf, 0xf9, 0xe7, 0xdf, 0x7f, 
+	0xff, 0xff, 0xed, 0xec, 0xff, 0xcf, 0xff, 0xff, 
+	0xed, 0xff, 0x9f, 0xff, 0xda, 0xeb, 0x6b, 0xff, 
+	0x6f, 0xfe, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xbf, 
+	0xbf, 0xcf, 0x2f, 0xed, 0x7f, 0xbf, 0xdf, 0xdf, 
+	0xeb, 0xff, 0xff, 0x5f, 0x7f, 0x9b, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0x6b, 0x7f, 0xfd, 
+	0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe7, 
+	0xf7, 0xff, 0xe6, 0xdf, 0xff, 0xf7, 0xdf, 0xff, 
+	0xff, 0x3f, 0xbb, 0xff, 0x6e, 0xef, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xea, 0xbf, 0xbf, 0x7e, 0xff, 0xff, 
+	0xbf, 0xff, 0x7b, 0x77, 0xdf, 0x5f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0xff, 0x6f, 0xfc, 0x9f, 0xfe, 0xb3, 
+	0x4d, 0xbf, 0xff, 0xfb, 0xdf, 0xdf, 0xfe, 0x77, 
+	0xfd, 0xf3, 0xdf, 0x2f, 0xfb, 0xec, 0xe3, 0xfd, 
+	0x99, 0xfe, 0xff, 0xff, 0xfe, 0xda, 0xf7, 0xff, 
+	0xff, 0xfb, 0xfe, 0x7d, 0xdb, 0xfd, 0xfd, 0xd7, 
+	0x6f, 0xbf, 0xff, 0xde, 0xff, 0xa6, 0xff, 0xab, 
+	0xbf, 0xbd, 0xfb, 0xda, 0x7b, 0xff, 0xd6, 0x93, 
+	0xdf, 0xf7, 0xff, 0xff, 0x3f, 0xdf, 0x7f, 0xf3, 
+	0xfd, 0xaf, 0xd9, 0xff, 0xef, 0xef, 0xe9, 0xff, 
+	0xff, 0x7e, 0xdd, 0x7c, 0x57, 0xfb, 0xff, 0xff, 
+	0x5f, 0x7f, 0xfd, 0xe5, 0xd7, 0xff, 0x6d, 0xfe, 
+	0xf7, 0xff, 0x7b, 0xaf, 0xfd, 0xa7, 0xfd, 0xfa, 
+	0xff, 0xff, 0xe7, 0xbf, 0xf6, 0xd6, 0x5b, 0x6d, 
+	0xbd, 0x55, 0xfe, 0x1b, 0xf5, 0xa5, 0xff, 0x5e, 
+	0x7b, 0xe9, 0xed, 0xbf, 0xfe, 0xff, 0xf7, 0xff, 
+	0xe7, 0xbd, 0xfe, 0xfa, 0xeb, 0xaf, 0x9f, 0xd7, 
+	0xc6, 0xbe, 0xe9, 0xb6, 0xfd, 0xf6, 0x9a, 0x38, 
+	0xff, 0xbd, 0xf4, 0x37, 0xd3, 0xcf, 0x7b, 0xed, 
+	0xb5, 0xd7, 0x5e, 0xff, 0xbb, 0x99, 0xff, 0xff, 
+	0x6f, 0xbf, 0xfd, 0xf7, 0xee, 0xbf, 0xaf, 0x7f, 
+	0xf5, 0x5d, 0xf1, 0xfe, 0xab, 0xaf, 0xbe, 0xfa, 
+	0xff, 0x6c, 0xec, 0xff, 0xf7, 0xdb, 0xfb, 0xff, 
+	0xbf, 0x51, 0xea, 0xab, 0x7f, 0x7d, 0xfd, 0xf5, 
+	0xff, 0xfb, 0xfb, 0xef, 0xff, 0xbf, 0x99, 0xf9, 
+	0xaf, 0xfd, 0xfe, 0xde, 0x6b, 0x6c, 0xbf, 0xf6, 
+	0xd2, 0xd7, 0x5e, 0x7f, 0xfd, 0x35, 0xd4, 0x5e, 
+	0x7b, 0xed, 0xef, 0x46, 0xfd, 0xfb, 0xfe, 0xdb, 
+	0xef, 0xbe, 0x5f, 0x7f, 0xff, 0xed, 0xee, 0xff, 
+	0xff, 0x7f, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0x9d, 
+	0x71, 0xff, 0x2f, 0xbf, 0xff, 0xf3, 0xcf, 0xc7, 
+	0x9f, 0x7f, 0xde, 0xf3, 0xff, 0xf4, 0xdf, 0x67, 
+	0x9f, 0x7d, 0x76, 0x79, 0x6f, 0xec, 0x9f, 0xfe, 
+	0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xe3, 0x4d, 0x7f, 
+	0xf8, 0xfd, 0xf5, 0xd2, 0x4b, 0x7f, 0xbd, 0xf4, 
+	0xbb, 0x99, 0xf9, 0x6b, 0x9f, 0xff, 0xf6, 0xd9, 
+	0xef, 0xfc, 0xef, 0xff, 0xff, 0xff, 0x3f, 0xff, 
+	0xec, 0xb7, 0xcf, 0x3e, 0xdb, 0xce, 0xe6, 0xfe, 
+	0xdb, 0xfd, 0xbe, 0xbd, 0xf6, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0x77, 0xfb, 0xed, 0xb5, 
+	0xdb, 0xee, 0xbb, 0xb9, 0xff, 0xdb, 0xeb, 0xbf, 
+	0xfd, 0xf6, 0xff, 0x1f, 0x6f, 0xf4, 0xe1, 0xf5, 
+	0xdf, 0x5f, 0x6b, 0xed, 0xb5, 0xd6, 0xfe, 0x6e, 
+	0xde, 0xbf, 0xeb, 0xe2, 0xbb, 0xef, 0xfe, 0xfb, 
+	0xef, 0x8f, 0x7e, 0x7c, 0xf9, 0xd5, 0x7f, 0xff, 
+	0xfd, 0xf7, 0x5f, 0xdf, 0x9b, 0xff, 0xef, 0xbf, 
+	0xfe, 0xbe, 0xfb, 0xfe, 0xff, 0x7f, 0xfb, 0xdf, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 
+	0xff, 0xe6, 0xff, 0xef, 0xa3, 0xcf, 0x3e, 0xfb, 
+	0xfc, 0x71, 0xcf, 0x3d, 0xe7, 0xd8, 0x6d, 0x37, 
+	0x9d, 0xf4, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 
+	0xfe, 0x0b, 0xef, 0xbf, 0xff, 0x77, 0xdf, 0x7f, 
+	0x7f, 0xf9, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfa, 0xef, 
+	0xbf, 0xff, 0x7f, 0xff, 0xff, 0x5f, 0xbf, 0xff, 
+	0xf4, 0xd3, 0x4f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 
+	0xff, 0xbf, 0xbe, 0xfe, 0xeb, 0xaf, 0x7f, 0xde, 
+	0xf9, 0xe3, 0x3f, 0xeb, 0x97, 0x57, 0x54, 0x50, 
+	0x5f, 0x7d, 0xf5, 0xff, 0xe6, 0xff, 0xfb, 0xaf, 
+	0xbf, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xfe, 
+	0xfe, 0x79, 0xe7, 0x9f, 0xff, 0xff, 0xff, 0xff, 
+	0xbf, 0xb9, 0xff, 0xfe, 0xdb, 0x6f, 0xbf, 0xff, 
+	0xf2, 0xff, 0xff, 0x7f, 0xe9, 0xed, 0x9f, 0xdf, 
+	0x7e, 0xba, 0xe9, 0x97, 0xfe, 0x6f, 0xfa, 0xef, 
+	0xcb, 0xaf, 0xb5, 0xd2, 0xfa, 0xeb, 0xaf, 0xbf, 
+	0xbe, 0xa5, 0xd7, 0x5f, 0x2d, 0xd9, 0x35, 0x57, 
+	0x5b, 0xff, 0x9b, 0x3f, 0x5f, 0x3a, 0xf3, 0xee, 
+	0xfe, 0x9f, 0xdb, 0xe8, 0xe3, 0xdf, 0x9f, 0xf7, 
+	0x7f, 0x5d, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0x46, 
+	0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xfd, 0xe7, 
+	0x9d, 0xbf, 0xf7, 0xff, 0xed, 0xb7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9f, 0xe9, 0xff, 0x5f, 0xff, 
+	0xff, 0xdd, 0xfb, 0xfb, 0xb7, 0x5f, 0xf4, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xdf, 0x7f, 0xff, 
+	0x6f, 0xfe, 0xbe, 0xfc, 0xee, 0xaf, 0x4f, 0x37, 
+	0xec, 0xff, 0xaf, 0xdf, 0xfb, 0xf5, 0xe5, 0xc7, 
+	0x6f, 0x7d, 0xfd, 0xf5, 0xff, 0x99, 0xff, 0xbf, 
+	0xff, 0xce, 0xfe, 0xbf, 0xdf, 0xdf, 0xef, 0x5f, 
+	0xbf, 0xfe, 0xff, 0x7b, 0xfb, 0xef, 0x7b, 0xef, 
+	0xf5, 0xff, 0xe6, 0xef, 0xfb, 0xbb, 0x6f, 0xee, 
+	0xdb, 0xff, 0xbd, 0xaf, 0xef, 0xaf, 0xd7, 0x5f, 
+	0xfb, 0xdf, 0xbe, 0xd1, 0x56, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xf6, 0xff, 0x7c, 0xff, 0xff, 0xf3, 
+	0xfc, 0xff, 0xff, 0xed, 0xf7, 0xff, 0xff, 0xff, 
+	0x5d, 0xb7, 0xff, 0x6f, 0xfe, 0xdf, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xef, 0xf3, 
+	0xf1, 0xc7, 0xff, 0xf3, 0xff, 0xf9, 0xe7, 0xff, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 
+	0x5b, 0x7d, 0xbc, 0xfd, 0x8f, 0xbf, 0xff, 0xbe, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xe6, 0xfc, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xee, 0xbf, 0xbf, 0xfe, 
+	0xdf, 0x5f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0x7f, 0xef, 0xa7, 0xbf, 
+	0xf6, 0x3f, 0xeb, 0xba, 0xd3, 0xff, 0x31, 0xd3, 
+	0x6f, 0xb7, 0xf5, 0xf7, 0xd7, 0xef, 0x6f, 0xf8, 
+	0xdf, 0xff, 0xfa, 0xef, 0x3f, 0xff, 0xfc, 0xfa, 
+	0xef, 0xff, 0x6f, 0xbd, 0x65, 0xff, 0xff, 0xbf, 
+	0xf8, 0xf4, 0xff, 0x9b, 0xff, 0xff, 0xb7, 0x7f, 
+	0xed, 0xef, 0xdf, 0xff, 0xff, 0x7a, 0xff, 0xff, 
+	0xef, 0xbf, 0xbd, 0xf6, 0x7f, 0xfd, 0xff, 0xff, 
+	0x86, 0xff, 0xfb, 0xac, 0xbe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x9f, 0x37, 0x3e, 0x7f, 0xfc, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0x8f, 0xd9, 0xff, 0x7f, 
+	0xed, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65, 
+	0xef, 0xff, 0xda, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6d, 0xfe, 0xa7, 0xf6, 0x6b, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xd5, 0xcf, 0xb7, 0xdc, 
+	0xd4, 0xf8, 0x4f, 0x9f, 0xfd, 0xff, 0x9b, 0xf5, 
+	0xbd, 0xb7, 0x9e, 0x7b, 0xf3, 0xff, 0xff, 0xff, 
+	0xed, 0xf7, 0xfb, 0xcf, 0xbf, 0x7f, 0xfe, 0xdf, 
+	0x4f, 0xff, 0xd7, 0xe6, 0xfe, 0xfa, 0xeb, 0x9b, 
+	0x1f, 0xbf, 0xdd, 0xaf, 0xfd, 0xff, 0xb7, 0xdd, 
+	0xcf, 0x97, 0xbf, 0xfc, 0xf3, 0xdf, 0xff, 0xbb, 
+	0x99, 0xff, 0xaf, 0xa9, 0xe7, 0xda, 0x5b, 0xf7, 
+	0xcb, 0xff, 0x7f, 0xf7, 0xd5, 0x70, 0xdf, 0x7d, 
+	0x75, 0xdc, 0x77, 0xff, 0x6c, 0xec, 0xbf, 0xfe, 
+	0xfa, 0xee, 0xbf, 0xff, 0x5d, 0x62, 0xff, 0xdc, 
+	0x2f, 0xfd, 0xf7, 0xf7, 0x5f, 0x5f, 0xff, 0x3d, 
+	0xbe, 0x99, 0xfb, 0xbf, 0xbf, 0xf7, 0xfb, 0xff, 
+	0x7f, 0xbf, 0xb6, 0x3f, 0x77, 0x7a, 0xff, 0xff, 
+	0xff, 0xdf, 0xdf, 0x7f, 0x9f, 0xef, 0xe6, 0xfd, 
+	0xff, 0xf6, 0xfb, 0xff, 0xff, 0xdf, 0xff, 0xf3, 
+	0xef, 0x6e, 0xf9, 0xfd, 0xe7, 0xff, 0x7f, 0xff, 
+	0xff, 0xff, 0xbd, 0x79, 0xff, 0xff, 0xff, 0xf7, 
+	0xf7, 0xdf, 0xff, 0xbf, 0xff, 0xde, 0xb3, 0xff, 
+	0xfa, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0x7b, 0x6f, 
+	0xec, 0xd7, 0xfe, 0xfb, 0xef, 0xb3, 0xcf, 0x7e, 
+	0xdb, 0xef, 0x7f, 0xf6, 0xdd, 0xb6, 0xdf, 0x6f, 
+	0xbf, 0xfd, 0xf6, 0xbd, 0x99, 0xf9, 0xff, 0xdf, 
+	0xff, 0xbf, 0xfd, 0xfe, 0xef, 0xff, 0xff, 0xfd, 
+	0xef, 0xdf, 0xff, 0x7e, 0xfb, 0xf7, 0xb7, 0xff, 
+	0xcf, 0xa6, 0xfe, 0xff, 0xfe, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xeb, 0xdf, 0xfd, 0xff, 0xdf, 
+	0x7f, 0xff, 0xff, 0xfd, 0xff, 0xbb, 0xb9, 0xff, 
+	0xff, 0xeb, 0xbf, 0xff, 0x78, 0xe3, 0x6f, 0x3f, 
+	0x7c, 0xa9, 0xfd, 0xf7, 0x7f, 0x7f, 0xff, 0xf7, 
+	0xdf, 0xff, 0x6a, 0xde, 0xff, 0xfd, 0xe2, 0xcf, 
+	0xff, 0xff, 0xfd, 0x27, 0x8d, 0x5f, 0x7c, 0xf9, 
+	0xe7, 0x97, 0xcf, 0xbe, 0xf9, 0xe4, 0xdf, 0x9b, 
+	0xfe, 0xaf, 0xbf, 0x6e, 0xfe, 0xff, 0x3f, 0xff, 
+	0xde, 0xf7, 0xdf, 0x5f, 0xbf, 0xff, 0xfe, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xa6, 0xff, 0xeb, 0xa3, 
+	0x8f, 0x3f, 0xf7, 0xfc, 0xf3, 0xcf, 0x3f, 0xfd, 
+	0xf9, 0xc7, 0x9f, 0x7f, 0xfc, 0xd9, 0xe7, 0x9f, 
+	0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xfe, 
+	0xe7, 0xdb, 0xff, 0x7f, 0xff, 0xef, 0xdf, 0x7f, 
+	0x7f, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xf6, 0xff, 
+	0x7f, 0x7f, 0xfb, 0xf5, 0xf7, 0xff, 0xff, 0xff, 
+	0xf5, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfb, 0xfe, 
+	0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0x86, 
+	0xbf, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xdb, 0xff, 
+	0xff, 0xff, 0xfe, 0xbf, 0x7f, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf2, 0xcb, 
+	0x2b, 0xbf, 0xfc, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xfd, 0x97, 0x7f, 0x7e, 0xf7, 0xcf, 0xbe, 0xff, 
+	0x6f, 0xfe, 0x7f, 0x6b, 0xae, 0xb9, 0x6c, 0xf2, 
+	0x8b, 0x2f, 0xbf, 0xe6, 0xf5, 0x46, 0x5f, 0x7e, 
+	0xb5, 0xe5, 0xd7, 0x5f, 0xff, 0x9a, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xf7, 0xfb, 0xec, 0xf3, 
+	0x9f, 0xfb, 0xbf, 0xfe, 0xfe, 0xff, 0xdf, 0x7f, 
+	0xdf, 0xff, 0xc6, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xcf, 0xff, 0x97, 0xeb, 0xee, 0x5d, 0xfd, 0xff, 
+	0xff, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9f, 0xf9, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xe7, 0xc7, 0xfd, 0x7f, 0xff, 0xff, 0xf9, 0xff, 
+	0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0x5a, 
+	0xff, 0xff, 0xbf, 0xfe, 0x7b, 0xef, 0x9f, 0x7e, 
+	0xff, 0xf4, 0xd7, 0x55, 0x7f, 0xfd, 0xff, 0xef, 
+	0x9b, 0xff, 0x7f, 0x7f, 0xfe, 0xdf, 0xff, 0x9f, 
+	0xff, 0xbf, 0x3f, 0xff, 0x7d, 0xff, 0x7a, 0x6d, 
+	0xdf, 0xdf, 0xfe, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xdb, 0xff, 0xff, 0xff, 0xea, 0xbb, 0xfe, 
+	0xfe, 0xfd, 0x7b, 0xbf, 0xfd, 0xe0, 0xbf, 0xff, 
+	0xff, 0xbf, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0xf7, 0xdf, 0xdf, 0xdf, 0xff, 0xef, 0xff, 
+	0xdf, 0x7f, 0xff, 0xdf, 0xff, 0xfd, 0x6f, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xef, 0xff, 0xff, 0xef, 0x9f, 0x75, 0xff, 
+	0xff, 0xff, 0xfb, 0x9b, 0xff, 0x7f, 0xfe, 0xdf, 
+	0xff, 0xff, 0x8f, 0x7f, 0xfb, 0xfd, 0xff, 0xf5, 
+	0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xe6, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xdf, 
+	0xbd, 0xff, 0xbd, 0xff, 0x79, 0xff, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0x7e, 0xfb, 
+	0xeb, 0xa7, 0xff, 0xff, 0xff, 0xeb, 0xf7, 0xf5, 
+	0x6f, 0xff, 0x9b, 0x4f, 0xff, 0xc9, 0xf7, 0xd7, 
+	0xff, 0x6f, 0x7c, 0xff, 0xfe, 0xfb, 0xaf, 0xff, 
+	0xff, 0x7f, 0xf2, 0xfe, 0xff, 0xfe, 0xff, 0xf7, 
+	0xd7, 0x3e, 0xfb, 0xdf, 0xf4, 0xff, 0x99, 0xef, 
+	0xaf, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xfe, 0xdf, 
+	0xff, 0xff, 0xfb, 0x7f, 0xfd, 0xfe, 0xdf, 0xdf, 
+	0xfb, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xfc, 0xfe, 
+	0x5f, 0x27, 0xbf, 0xe9, 0xfd, 0x52, 0x8f, 0xf7, 
+	0xdf, 0x7f, 0xfd, 0xed, 0xbf, 0xff, 0xff, 0x8d, 
+	0xd9, 0xff, 0x7f, 0xfd, 0xff, 0xf3, 0x9f, 0xff, 
+	0xfb, 0x79, 0xd5, 0xff, 0xfd, 0xf7, 0x5f, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x6d, 0xfe, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xfe, 0xfb, 0xde, 0xef, 0xff, 
+	0xcd, 0x3d, 0xff, 0xff, 0xeb, 0xaf, 0xff, 0xff, 
+	0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xff, 0xff, 0xff, 0xd9, 0xe7, 0x9f, 
+	0x7d, 0xd6, 0x79, 0xff, 0xff, 0xd7, 0xe6, 0xfe, 
+	0xfd, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0x6f, 0xbd, 
+	0x66, 0xff, 0xf7, 0xcc, 0xfb, 0xfd, 0x7c, 0xf3, 
+	0xed, 0xff, 0xba, 0xb9, 0x3f, 0xef, 0xff, 0xff, 
+	0xfe, 0xff, 0xff, 0x7b, 0xef, 0xd6, 0xff, 0xbd, 
+	0xf2, 0x5e, 0x8d, 0xf7, 0xd5, 0xff, 0xff, 0x6c, 
+	0xee, 0xef, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xfb, 
+	0x7e, 0xeb, 0xff, 0xff, 0xfd, 0xf5, 0xd7, 0x5f, 
+	0x2f, 0x9d, 0xff, 0xbf, 0x99, 0xf9, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xff, 0xbd, 0xb5, 0xce, 0xff, 
+	0xdf, 0x7f, 0xfd, 0xff, 0xff, 0x7f, 0xaf, 0xff, 
+	0xef, 0x86, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0x7f, 0xff, 0xcd, 0xfe, 0xff, 0xfd, 0xe7, 
+	0xdf, 0x7f, 0xfe, 0xf9, 0xe7, 0xbd, 0x79, 0x57, 
+	0x7f, 0xfe, 0xfd, 0xe7, 0xff, 0xe7, 0x9f, 0x7f, 
+	0xe6, 0xff, 0xff, 0xfa, 0xfb, 0xaf, 0xff, 0xff, 
+	0xfe, 0x73, 0x6f, 0xec, 0xfb, 0x76, 0xfb, 0x6e, 
+	0xbf, 0xff, 0x58, 0xf3, 0xcd, 0x7f, 0xff, 0xdd, 
+	0xf7, 0xd8, 0x6d, 0xab, 0x6d, 0xf6, 0xbf, 0x99, 
+	0xf9, 0xf7, 0xdb, 0x7f, 0xff, 0xff, 0xff, 0xdf, 
+	0x3f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xf9, 
+	0xef, 0xb7, 0xff, 0x4f, 0xe6, 0xbe, 0xff, 0xfd, 
+	0xef, 0xff, 0xff, 0xff, 0xfb, 0xee, 0xfb, 0xff, 
+	0xfe, 0xff, 0xdf, 0xbf, 0xff, 0xfd, 0xfd, 0xff, 
+	0xbb, 0xb9, 0xff, 0xfe, 0x6f, 0xb7, 0xff, 0xff, 
+	0xc7, 0x1f, 0x3f, 0xfc, 0xff, 0xf5, 0xd7, 0xdf, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0xfb, 0x68, 0xde, 0x9f, 
+	0xdc, 0xeb, 0xcd, 0xff, 0xff, 0x7b, 0xe2, 0x9b, 
+	0xff, 0x7f, 0xb5, 0xdd, 0xbb, 0xff, 0x7e, 0xfb, 
+	0xe4, 0xcf, 0x9b, 0xff, 0xff, 0xbf, 0xef, 0xfb, 
+	0xff, 0x7f, 0xfb, 0xdd, 0xfb, 0xff, 0x7f, 0xf7, 
+	0xfd, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xe6, 
+	0xff, 0xfb, 0xe3, 0x8f, 0x3f, 0x7f, 0xfc, 0xb3, 
+	0x8f, 0x3d, 0xff, 0xf1, 0xe7, 0x9f, 0x7f, 0xf6, 
+	0xf1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfe, 0xcf, 
+	0xbf, 0xff, 0x7f, 0xf7, 0xff, 0x2f, 0xff, 0xff, 
+	0xfd, 0xd7, 0xff, 0xff, 0xfd, 0xf7, 0xd7, 0xdf, 
+	0x6f, 0xfe, 0x9f, 0xfe, 0xfb, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xeb, 0xff, 0xff, 0xfd, 0xfd, 0xd7, 
+	0xff, 0xff, 0xff, 0xf5, 0xff, 0x9b, 0xff, 0xff, 
+	0xbf, 0xf9, 0xfb, 0xff, 0x7d, 0xfe, 0xfb, 0xe7, 
+	0xff, 0xff, 0xfd, 0xf5, 0xf5, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xff, 0xe6, 0xfd, 0xfb, 0xef, 0xff, 0xfe, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0x79, 
+	0xdf, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xef, 0x7a, 
+	0xef, 0xff, 0xbf, 0xed, 0xb7, 0x5f, 0x6e, 0xff, 
+	0xed, 0xfe, 0xff, 0x6f, 0xee, 0xff, 0xeb, 0xaf, 
+	0xbe, 0xfe, 0xda, 0xa9, 0x2f, 0xb7, 0xf6, 0x75, 
+	0xd7, 0x5d, 0x7f, 0xfd, 0x65, 0x57, 0x5f, 0xff, 
+	0x9a, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0x7f, 0x7f, 0xf3, 0xff, 0xdf, 0x7d, 0xff, 0xfb, 
+	0xef, 0xdf, 0xff, 0xff, 0xfe, 0xc6, 0xff, 0xff, 
+	0xe7, 0xff, 0xfb, 0xf7, 0xff, 0x77, 0xff, 0xfe, 
+	0x7f, 0xbf, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 
+	0xff, 0x9b, 0xe9, 0xff, 0xff, 0x7f, 0xf3, 0xff, 
+	0xbf, 0xf7, 0xfe, 0x65, 0xdf, 0xdf, 0xfe, 0x7b, 
+	0xff, 0xef, 0x7f, 0xff, 0xfd, 0xf3, 0x6c, 0xfc, 
+	0xff, 0xfb, 0xf2, 0xe3, 0xff, 0xff, 0x7d, 0xfc, 
+	0xdb, 0xff, 0xff, 0xfd, 0xff, 0xd7, 0x5f, 0x7d, 
+	0xdd, 0xfe, 0xfb, 0x9b, 0xff, 0xff, 0xff, 0xf6, 
+	0xfe, 0xff, 0xff, 0xff, 0xaf, 0xeb, 0xff, 0xf6, 
+	0xf7, 0xff, 0x6b, 0xbf, 0xff, 0xfe, 0xf7, 0xff, 
+	0xa6, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x5f, 0xfc, 0xef, 0xf7, 0xff, 0xf7, 0xff, 
+	0xf5, 0xf3, 0xff, 0xbf, 0xbf, 0xf9, 0xdb, 0xff, 
+	0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xee, 0xff, 
+	0xff, 0xbf, 0xbf, 0xff, 0x7f, 0xff, 0xdf, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xff, 0xef, 0xef, 0xff, 0xff, 0xfe, 
+	0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xfe, 0xef, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 
+	0xf9, 0xff, 0xdf, 0x9f, 0xfe, 0xf9, 0xfb, 0xff, 
+	0xff, 0xfb, 0xff, 0x5f, 0xff, 0xd7, 0xfd, 0x7f, 
+	0xfd, 0xff, 0x7f, 0xff, 0x6f, 0xfe, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xf9, 0xf7, 0x6f, 0x5e, 
+	0xfd, 0xff, 0xff, 0xff, 0x7e, 0xf9, 0xdf, 0xff, 
+	0xff, 0x99, 0xfd, 0xff, 0xff, 0xfb, 0x7f, 0xff, 
+	0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xdf, 0xfd, 0xbb, 0xff, 0xff, 0x66, 0xff, 
+	0xcf, 0x3f, 0xdf, 0xfc, 0xf3, 0xc3, 0x3f, 0xff, 
+	0xfc, 0xef, 0x9e, 0xfb, 0xee, 0xf9, 0xef, 0x9f, 
+	0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xcf, 0x7f, 
+	0xdf, 0xfd, 0xf1, 0x8f, 0x3f, 0xdb, 0xdd, 0xef, 
+	0xff, 0x7f, 0xfe, 0xff, 0xef, 0xbf, 0xf7, 0x6f, 
+	0xfe, 0xdf, 0xfe, 0xfb, 0xef, 0x9f, 0x1b, 0xfe, 
+	0xfb, 0xcf, 0x6f, 0xbf, 0xfd, 0x77, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xfd, 
+	0xfd, 0xdf, 0x7f, 0xb7, 0xfd, 0x7d, 0xd7, 0xff, 
+	0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xa6, 0xff, 0xee, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xe7, 0xbf, 0xff, 0xfb, 0xe6, 0xdf, 0x7f, 0xef, 
+	0xf9, 0xb7, 0xde, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 
+	0x7c, 0xf3, 0xcf, 0x7f, 0xff, 0xfd, 0xf3, 0xcf, 
+	0x7f, 0xfe, 0xf9, 0xe3, 0x8f, 0x7f, 0xfe, 0xb9, 
+	0x67, 0xf7, 0x6f, 0xfe, 0xbf, 0xfb, 0xbe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xdb, 0x76, 0xff, 
+	0xed, 0xf7, 0xdd, 0x7a, 0xff, 0xbd, 0xff, 0x9b, 
+	0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 
+	0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xfb, 0xfd, 0xf7, 0xde, 0x7d, 0xef, 0x9b, 
+	0xef, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xbf, 0xff, 
+	0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0x7f, 0xff, 0xf3, 0xff, 0xbf, 0xef, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 
+	0xff, 0xfd, 0xff, 0xdf, 0x7e, 0xff, 0xf5, 0xfe, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x7e, 
+	0xfb, 0xff, 0x9b, 0xff, 0xff, 0xdf, 0xff, 0xfc, 
+	0xfd, 0xff, 0xf7, 0x7f, 0xf5, 0xfd, 0xfb, 0xab, 
+	0xb7, 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0x9f, 0x75, 
+	0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf, 
+	0x6e, 0xf3, 0xed, 0xb7, 0xdf, 0x4e, 0xfb, 0xdb, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0x5b, 0x6f, 0xbf, 0xf9, 
+	0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 
+	0xb5, 0xdf, 0x7e, 0xef, 0xfb, 0xef, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xf7, 
+	0xbf, 0xef, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xbe, 
+	0xfb, 0xee, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xfb, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 
+	0xff, 0x2f, 0xbf, 0xff, 0xf2, 0xfb, 0xaf, 0xbf, 
+	0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9f, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbb, 0xfe, 0xba, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x1f, 0x7f, 0xfd, 0xf1, 
+	0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0x2f, 0xbf, 0xfe, 
+	0xf2, 0xeb, 0xaf, 0xbf, 0xfe, 0xf8, 0x6f, 0xee, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xaf, 0x7f, 0xbf, 0xfd, 0xb7, 0xdb, 0x7f, 0xfb, 
+	0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xe6, 0xfe, 0xdb, 0xef, 0xbb, 0xff, 0xbe, 0xfb, 
+	0xee, 0xbf, 0xed, 0x6d, 0xf7, 0xdf, 0x72, 0xff, 
+	0xad, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xf5, 
+	0xf5, 0xd6, 0x5f, 0x6f, 0xbd, 0xf5, 0x17, 0xd3, 
+	0xd8, 0xfa, 0x8b, 0xad, 0xbf, 0xb8, 0xfa, 0xeb, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPP_ROM_CROM0_R_0            0
+#define EPP_ROM_CROM0_R_1            16
+#define EPP_ROM_CROM0_R_2            32
+#define EPP_ROM_CROM0_R_3            48
+#define EPP_ROM_CROM0_R_4            64
+#define EPP_ROM_CROM0_R_5            80
+#define EPP_ROM_CROM0_R_6            96
+#define EPP_ROM_CROM0_R_7            112
+#define EPP_ROM_CROM1_R_0            128
+#define EPP_ROM_CROM1_R_1            144
+#define EPP_ROM_CROM1_R_2            160
+#define EPP_ROM_CROM1_R_3            176
+#define EPP_ROM_CROM1_R_4            192
+#define EPP_ROM_CROM1_R_5            208
+#define EPP_ROM_CROM1_R_6            224
+#define EPP_ROM_CROM1_R_7            240
+#define EPP_ROM_DIVROM0              256
+#define EPP_ROM_DIVROM1              272
+#define EPP_ROM_DIVROM2              288
+#define EPP_ROM_SWROMID              304
+#define EPP_ROM_SWROMIE              320
+#define EPP_ROM_SWROMIS              336
+#define EPP_ROM_SWROMOE              352
+#define EPP_ROM_SWROMOS              368
+#define EPP_ROM_SWROMIC              384
+#define EPP_ROM_SWROMOC              400
+#define EPP_ROM_SWROMDCD             416
+#define EPP_ROM_CLKSELROM            432
+#define EPP_ROM_PTTMUTEROM           448
+#define EPP_ROM_STIROM               464
+#define EPP_ROM_STOROM               480
+
+
+/* rom locations */
+static const unsigned long epp_roms[496] = {
+	 81983,  81319,  82149,  81485,  82151,  81487,  81985,  81321,
+	 81651,  80987,  81817,  81153,  81819,  81155,  81653,  80989,
+	 87969,  87305,  87637,  86973,  88137,  87473,  87805,  87141,
+	 88135,  87471,  87803,  87139,  87971,  87307,  87639,  86975,
+	 81993,  81661,  82159,  81827,  82161,  81829,  81995,  81663,
+	 81329,  80997,  81495,  81163,  81497,  81165,  81331,  80999,
+	 87979,  88147,  87315,  87483,  88145,  87981,  87481,  87317,
+	 87647,  87815,  86983,  87151,  87813,  87649,  87149,  86985,
+	 81973,  82139,  81641,  81807,  82141,  81975,  81809,  81643,
+	 81309,  81475,  80977,  81143,  81477,  81311,  81145,  80979,
+	 87989,  87657,  87325,  86993,  88157,  87825,  87493,  87161,
+	 88155,  87823,  87491,  87159,  87991,  87659,  87327,  86995,
+	 58109,  57777,  57445,  57113,  58277,  57945,  57613,  57281,
+	 58275,  57943,  57611,  57279,  58111,  57779,  57447,  57115,
+	 82003,  82169,  81339,  81505,  82171,  82005,  81507,  81341,
+	 81671,  81837,  81007,  81173,  81839,  81673,  81175,  81009,
+	 78997,  78829,  79329,  79161,  79661,  79493,  79993,  79825,
+	 78831,  78995,  79163,  79327,  79495,  79659,  79827,  79991,
+	 84983,  84815,  84817,  84981,  85647,  85479,  85481,  85645,
+	 85315,  85147,  85149,  85313,  85979,  85811,  85813,  85977,
+	 79007,  78841,  79339,  79173,  79671,  79505,  80003,  79837,
+	 78839,  79005,  79171,  79337,  79503,  79669,  79835,  80001,
+	 84993,  85657,  84825,  85489,  85325,  85989,  85157,  85821,
+	 84827,  85491,  84991,  85655,  85159,  85823,  85323,  85987,
+	 78987,  79319,  78821,  79153,  79651,  79983,  79485,  79817,
+	 78819,  79151,  78985,  79317,  79483,  79815,  79649,  79981,
+	 85003,  84835,  85335,  85167,  85667,  85499,  85999,  85831,
+	 84837,  85001,  85169,  85333,  85501,  85665,  85833,  85997,
+	 55123,  54955,  55455,  55287,  55787,  55619,  56119,  55951,
+	 54957,  55121,  55289,  55453,  55621,  55785,  55953,  56117,
+	 79017,  79349,  78849,  79181,  79681,  80013,  79513,  79845,
+	 78851,  79183,  79015,  79347,  79515,  79847,  79679,  80011,
+	 45880,  45548,  46048,  45716,  46046,  45714,  45882,  45550,
+	 45216,  44884,  45384,  45052,  45382,  45050,  45218,  44886,
+	 30962,  30796,  31626,  31460,  30794,  30960,  31458,  31624,
+	 31294,  31128,  31958,  31792,  31126,  31292,  31790,  31956,
+	 45900,  45568,  46068,  45736,  45236,  44904,  45404,  45072,
+	 46066,  45734,  45902,  45570,  45402,  45070,  45238,  44906,
+	 81902,  81238,  82068,  81404,  82070,  81406,  81904,  81240,
+	 81570,  80906,  81736,  81072,  81738,  81074,  81572,  80908,
+	 87878,  87546,  88046,  87714,  87214,  86882,  87382,  87050,
+	 88044,  87712,  87880,  87548,  87380,  87048,  87216,  86884,
+	 27962,  28130,  28128,  27964,  27298,  27466,  27464,  27300,
+	 27630,  27798,  27796,  27632,  26966,  27134,  27132,  26968,
+	 70000,  70168,  69336,  69504,  70166,  70002,  69502,  69338,
+	 69668,  69836,  69004,  69172,  69834,  69670,  69170,  69006,
+	 55062,  54896,  55394,  55228,  54894,  55060,  55226,  55392,
+	 55726,  55560,  56058,  55892,  55558,  55724,  55890,  56056,
+	 64024,  63692,  63360,  63028,  64192,  63860,  63528,  63196,
+	 64190,  63858,  63526,  63194,  64026,  63694,  63362,  63030,
+	 57998,  58166,  57334,  57502,  58164,  58000,  57500,  57336,
+	 57666,  57834,  57002,  57170,  57832,  57668,  57168,  57004,
+	 72970,  72802,  73302,  73134,  73634,  73466,  73966,  73798,
+	 72804,  72968,  73136,  73300,  73468,  73632,  73800,  73964,
+	 75926,  75262,  76092,  75428,  76094,  75430,  75928,  75264,
+	 75594,  74930,  75760,  75096,  75762,  75098,  75596,  74932,
+	 70011,  69347,  70177,  69513,  70179,  69515,  70013,  69349,
+	 69679,  69015,  69845,  69181,  69847,  69183,  69681,  69017,
+	 66984,  67648,  67316,  67980,  66816,  67480,  67148,  67812,
+	 66818,  67482,  67150,  67814,  66982,  67646,  67314,  67978,
+	 63994,  64160,  64162,  63996,  63662,  63828,  63830,  63664,
+	 63330,  63496,  63498,  63332,  62998,  63164,  63166,  63000
+};
+
diff --git a/main/epp_fpga.h b/main/epp_fpga.h
new file mode 100644
index 0000000..542ce88
--- /dev/null
+++ b/main/epp_fpga.h
@@ -0,0 +1,238 @@
+/*****************************************************************************/
+
+/*
+ *      epp_fpga.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define FPGA_PART "XCS10_PC84"
+#define FPGA_BOUND 344
+#define FPGA_FRAMELEN 166
+#define FPGA_NUMFRAMES 572
+/*#define FPGA_CONFIGSIZE ((FPGA_FRAMELEN*FPGA_NUMFRAMES+56)/8)*/
+#define FPGA_CONFIGSIZE 11876
+#define FPGA_BOUNDSIZE ((FPGA_BOUND+7)/8)
+
+/* safe boundary */
+static const unsigned char fpga_safebound[] = {
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 
+	0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff
+};
+
+/* IO pin names */
+#define FPGA_PIN_RAMD0_T              253
+#define FPGA_PIN_RAMD0_O              254
+#define FPGA_PIN_RAMD0_I              255
+#define FPGA_PIN_RAMD1_T              241
+#define FPGA_PIN_RAMD1_O              242
+#define FPGA_PIN_RAMD1_I              243
+#define FPGA_PIN_RAMD2_T              229
+#define FPGA_PIN_RAMD2_O              230
+#define FPGA_PIN_RAMD2_I              231
+#define FPGA_PIN_RAMD3_T              217
+#define FPGA_PIN_RAMD3_O              218
+#define FPGA_PIN_RAMD3_I              219
+#define FPGA_PIN_RAMD4_T              220
+#define FPGA_PIN_RAMD4_O              221
+#define FPGA_PIN_RAMD4_I              222
+#define FPGA_PIN_RAMD5_T              232
+#define FPGA_PIN_RAMD5_O              233
+#define FPGA_PIN_RAMD5_I              234
+#define FPGA_PIN_RAMD6_T              244
+#define FPGA_PIN_RAMD6_O              245
+#define FPGA_PIN_RAMD6_I              246
+#define FPGA_PIN_RAMD7_T              256
+#define FPGA_PIN_RAMD7_O              257
+#define FPGA_PIN_RAMD7_I              258
+#define FPGA_PIN_RAMA0_T              259
+#define FPGA_PIN_RAMA0_O              260
+#define FPGA_PIN_RAMA0_I              261
+#define FPGA_PIN_RAMA1_T              262
+#define FPGA_PIN_RAMA1_O              263
+#define FPGA_PIN_RAMA1_I              264
+#define FPGA_PIN_RAMA2_T              283
+#define FPGA_PIN_RAMA2_O              284
+#define FPGA_PIN_RAMA2_I              285
+#define FPGA_PIN_RAMA3_T              295
+#define FPGA_PIN_RAMA3_O              296
+#define FPGA_PIN_RAMA3_I              297
+#define FPGA_PIN_RAMA4_T              301
+#define FPGA_PIN_RAMA4_O              302
+#define FPGA_PIN_RAMA4_I              303
+#define FPGA_PIN_RAMA5_T              313
+#define FPGA_PIN_RAMA5_O              314
+#define FPGA_PIN_RAMA5_I              315
+#define FPGA_PIN_RAMA6_T              325
+#define FPGA_PIN_RAMA6_O              326
+#define FPGA_PIN_RAMA6_I              327
+#define FPGA_PIN_RAMA7_T              337
+#define FPGA_PIN_RAMA7_O              338
+#define FPGA_PIN_RAMA7_I              339
+#define FPGA_PIN_RAMA8_T              328
+#define FPGA_PIN_RAMA8_O              329
+#define FPGA_PIN_RAMA8_I              330
+#define FPGA_PIN_RAMA9_T              316
+#define FPGA_PIN_RAMA9_O              317
+#define FPGA_PIN_RAMA9_I              318
+#define FPGA_PIN_RAMA10_T             286
+#define FPGA_PIN_RAMA10_O             287
+#define FPGA_PIN_RAMA10_I             288
+#define FPGA_PIN_RAMA11_T             304
+#define FPGA_PIN_RAMA11_O             305
+#define FPGA_PIN_RAMA11_I             306
+#define FPGA_PIN_RAMA12_T             2
+#define FPGA_PIN_RAMA12_O             3
+#define FPGA_PIN_RAMA12_I             4
+#define FPGA_PIN_RAMA13_T             340
+#define FPGA_PIN_RAMA13_O             341
+#define FPGA_PIN_RAMA13_I             342
+#define FPGA_PIN_RAMA14_T             14
+#define FPGA_PIN_RAMA14_O             15
+#define FPGA_PIN_RAMA14_I             16
+#define FPGA_PIN_RAMCE_T              271
+#define FPGA_PIN_RAMCE_O              272
+#define FPGA_PIN_RAMCE_I              273
+#define FPGA_PIN_RAMOE_T              298
+#define FPGA_PIN_RAMOE_O              299
+#define FPGA_PIN_RAMOE_I              300
+#define FPGA_PIN_RAMWR_T              5
+#define FPGA_PIN_RAMWR_O              6
+#define FPGA_PIN_RAMWR_I              7
+#define FPGA_PIN_EPPDATA0_T           -1
+#define FPGA_PIN_EPPDATA0_O           -1
+#define FPGA_PIN_EPPDATA0_I           -1
+#define FPGA_PIN_EPPDATA1_T           -1
+#define FPGA_PIN_EPPDATA1_O           -1
+#define FPGA_PIN_EPPDATA1_I           -1
+#define FPGA_PIN_EPPDATA2_T           -1
+#define FPGA_PIN_EPPDATA2_O           -1
+#define FPGA_PIN_EPPDATA2_I           -1
+#define FPGA_PIN_EPPDATA3_T           113
+#define FPGA_PIN_EPPDATA3_O           114
+#define FPGA_PIN_EPPDATA3_I           115
+#define FPGA_PIN_EPPDATA4_T           122
+#define FPGA_PIN_EPPDATA4_O           123
+#define FPGA_PIN_EPPDATA4_I           124
+#define FPGA_PIN_EPPDATA5_T           125
+#define FPGA_PIN_EPPDATA5_O           126
+#define FPGA_PIN_EPPDATA5_I           127
+#define FPGA_PIN_EPPDATA6_T           128
+#define FPGA_PIN_EPPDATA6_O           129
+#define FPGA_PIN_EPPDATA6_I           130
+#define FPGA_PIN_EPPDATA7_T           131
+#define FPGA_PIN_EPPDATA7_O           132
+#define FPGA_PIN_EPPDATA7_I           133
+#define FPGA_PIN_EPPNADDRSTB_T        140
+#define FPGA_PIN_EPPNADDRSTB_O        141
+#define FPGA_PIN_EPPNADDRSTB_I        142
+#define FPGA_PIN_EPPNDATASTB_T        86
+#define FPGA_PIN_EPPNDATASTB_O        87
+#define FPGA_PIN_EPPNDATASTB_I        88
+#define FPGA_PIN_EPPNWRITE_T          89
+#define FPGA_PIN_EPPNWRITE_O          90
+#define FPGA_PIN_EPPNWRITE_I          91
+#define FPGA_PIN_EPPNRESET_T          83
+#define FPGA_PIN_EPPNRESET_O          84
+#define FPGA_PIN_EPPNRESET_I          85
+#define FPGA_PIN_EPPNWAIT_T           -1
+#define FPGA_PIN_EPPNWAIT_O           -1
+#define FPGA_PIN_EPPNWAIT_I           -1
+#define FPGA_PIN_EPPNINTR_T           -1
+#define FPGA_PIN_EPPNINTR_O           -1
+#define FPGA_PIN_EPPNINTR_I           -1
+#define FPGA_PIN_SPPSELECT_T          -1
+#define FPGA_PIN_SPPSELECT_O          -1
+#define FPGA_PIN_SPPSELECT_I          -1
+#define FPGA_PIN_DAC0_T               47
+#define FPGA_PIN_DAC0_O               48
+#define FPGA_PIN_DAC0_I               49
+#define FPGA_PIN_DAC1_T               56
+#define FPGA_PIN_DAC1_O               57
+#define FPGA_PIN_DAC1_I               58
+#define FPGA_PIN_DAC2_T               59
+#define FPGA_PIN_DAC2_O               60
+#define FPGA_PIN_DAC2_I               61
+#define FPGA_PIN_DAC3_T               68
+#define FPGA_PIN_DAC3_O               69
+#define FPGA_PIN_DAC3_I               70
+#define FPGA_PIN_DAC4_T               71
+#define FPGA_PIN_DAC4_O               72
+#define FPGA_PIN_DAC4_I               73
+#define FPGA_PIN_DAC5_T               41
+#define FPGA_PIN_DAC5_O               42
+#define FPGA_PIN_DAC5_I               43
+#define FPGA_PIN_DAC6_T               38
+#define FPGA_PIN_DAC6_O               39
+#define FPGA_PIN_DAC6_I               40
+#define FPGA_PIN_DINDAC_T             44
+#define FPGA_PIN_DINDAC_O             45
+#define FPGA_PIN_DINDAC_I             46
+#define FPGA_PIN_DIN_T                80
+#define FPGA_PIN_DIN_O                81
+#define FPGA_PIN_DIN_I                82
+#define FPGA_PIN_RXC_T                143
+#define FPGA_PIN_RXC_O                144
+#define FPGA_PIN_RXC_I                145
+#define FPGA_PIN_RXD_T                164
+#define FPGA_PIN_RXD_O                165
+#define FPGA_PIN_RXD_I                166
+#define FPGA_PIN_TXC_T                152
+#define FPGA_PIN_TXC_O                153
+#define FPGA_PIN_TXC_I                154
+#define FPGA_PIN_TXD_T                178
+#define FPGA_PIN_TXD_O                179
+#define FPGA_PIN_TXD_I                180
+#define FPGA_PIN_DCD_T                167
+#define FPGA_PIN_DCD_O                168
+#define FPGA_PIN_DCD_I                169
+#define FPGA_PIN_MRES_T               199
+#define FPGA_PIN_MRES_O               200
+#define FPGA_PIN_MRES_I               201
+#define FPGA_PIN_EPPNERR_T            202
+#define FPGA_PIN_EPPNERR_O            203
+#define FPGA_PIN_EPPNERR_I            204
+#define FPGA_PIN_SPPPE_T              211
+#define FPGA_PIN_SPPPE_O              212
+#define FPGA_PIN_SPPPE_I              213
+#define FPGA_PIN_CLKFPGA_T            175
+#define FPGA_PIN_CLKFPGA_O            176
+#define FPGA_PIN_CLKFPGA_I            177
+#define FPGA_PIN_LEDPTT_T             190
+#define FPGA_PIN_LEDPTT_O             191
+#define FPGA_PIN_LEDPTT_I             192
+#define FPGA_PIN_LEDDCD_T             17
+#define FPGA_PIN_LEDDCD_O             18
+#define FPGA_PIN_LEDDCD_I             19
+#define FPGA_PIN_LEDSTA_T             26
+#define FPGA_PIN_LEDSTA_O             27
+#define FPGA_PIN_LEDSTA_I             28
+#define FPGA_PIN_LEDCON_T             29
+#define FPGA_PIN_LEDCON_O             30
+#define FPGA_PIN_LEDCON_I             31
diff --git a/main/eppafsk_firmware.h b/main/eppafsk_firmware.h
new file mode 100644
index 0000000..558e301
--- /dev/null
+++ b/main/eppafsk_firmware.h
@@ -0,0 +1,1551 @@
+/*****************************************************************************/
+
+/*
+ *      eppafsk_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPAFSK_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char eppafsk_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xff, 
+	0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0xb5, 0xfd, 0xff, 
+	0xff, 0xda, 0xfe, 0xaf, 0xed, 0xff, 0xde, 0xfe, 
+	0xff, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfb, 0xfb, 
+	0xff, 0xaf, 0xed, 0xff, 0xfe, 0xd7, 0xf6, 0x7f, 
+	0x6d, 0xff, 0xd7, 0xf7, 0x7f, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 
+	0xfb, 0xff, 0xbf, 0xb9, 0xff, 0xf8, 0xed, 0x9f, 
+	0xff, 0xfe, 0xf8, 0xed, 0x8f, 0x77, 0xfc, 0xf6, 
+	0xc7, 0x6f, 0x7f, 0xfc, 0xf6, 0xc7, 0xef, 0x6f, 
+	0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xf5, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xbf, 
+	0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 
+	0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 
+	0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xaf, 0xbf, 
+	0xfe, 0xfa, 0xfb, 0xef, 0xbf, 0xfb, 0xdd, 0xf7, 
+	0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x9b, 
+	0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xef, 
+	0xbd, 0xef, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xdd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xf6, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xfb, 
+	0xed, 0xb7, 0xdf, 0x5e, 0x3b, 0xed, 0xb7, 0xdf, 
+	0xfe, 0xf6, 0xdb, 0x6e, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xe7, 0x3f, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf5, 0xd7, 0x77, 
+	0xff, 0x7d, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 
+	0xcf, 0xbe, 0xff, 0xee, 0xb3, 0xcf, 0x7f, 0xfe, 
+	0xf9, 0xe6, 0x9d, 0x7f, 0xfe, 0xf9, 0xe6, 0xff, 
+	0x6f, 0xfe, 0xff, 0x7d, 0xf7, 0xdf, 0x77, 0xff, 
+	0xfd, 0xf7, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xfe, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf, 
+	0x3e, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 
+	0xe7, 0x9f, 0x7f, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xf7, 0xfe, 0xfb, 0xe7, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xf7, 0xdb, 0xd7, 0x3e, 
+	0xfb, 0xec, 0xb7, 0xdf, 0x7a, 0xfb, 0xad, 0xfb, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x3f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xbf, 0xff, 
+	0xef, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0x7e, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x77, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xef, 0xfe, 0xfb, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0x7f, 0xf7, 0xcd, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0x9f, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xaf, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6e, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf5, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xe6, 0xff, 0xff, 0xf9, 0xff, 
+	0xef, 0xff, 0xff, 0xfb, 0xdd, 0x6f, 0xff, 0xfd, 
+	0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 
+	0xdf, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0x6f, 0xfe, 0xff, 0x7f, 
+	0xff, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xf9, 0xef, 
+	0x9f, 0xff, 0xde, 0x5f, 0xff, 0xfe, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0x6b, 0xff, 0xff, 0xf5, 0xf4, 0xdf, 0x4f, 0xbf, 
+	0xef, 0xfe, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xbf, 0xf9, 0xfb, 0xf7, 0xff, 0xfb, 
+	0xff, 0xfe, 0xff, 0xef, 0xbf, 0xbe, 0xf7, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0xfd, 0xfd, 0xf7, 0xff, 0x8f, 0xef, 0xff, 
+	0xff, 0xe3, 0xff, 0xff, 0xd7, 0xff, 0x7f, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xe6, 0xff, 0x2f, 0xff, 0xff, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xfb, 0xcd, 0x6f, 0xfc, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xef, 
+	0xfa, 0xff, 0xaf, 0xf7, 0xfe, 0xfb, 0xef, 0xf7, 
+	0x5f, 0xed, 0xb5, 0xd5, 0x5d, 0x7b, 0xfd, 0xff, 
+	0xff, 0xff, 0x6f, 0xfe, 0xbf, 0x6f, 0xff, 0xfb, 
+	0xbf, 0x7b, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 
+	0xfe, 0xef, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xbf, 
+	0xff, 0xee, 0x5f, 0x7e, 0xf9, 0xa5, 0xdc, 0xdf, 
+	0xfe, 0xff, 0xff, 0xbf, 0x66, 0xff, 0xfb, 0xff, 
+	0xbf, 0xff, 0xfe, 0x7b, 0xef, 0xbd, 0xfb, 0xdd, 
+	0x77, 0xdf, 0x65, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xb7, 0xf9, 0xff, 0xde, 0xff, 0xbf, 0xbd, 0xf7, 
+	0xfb, 0xfb, 0xf9, 0x77, 0xbf, 0xfd, 0xf6, 0x7b, 
+	0x6d, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xd4, 0xbf, 
+	0xff, 0xff, 0xfb, 0xe9, 0xbf, 0xff, 0x3e, 0xfb, 
+	0x75, 0xaf, 0xbd, 0xf6, 0xda, 0x6b, 0xff, 0xff, 
+	0xff, 0x5f, 0x99, 0xfb, 0xbf, 0xdb, 0xff, 0xfe, 
+	0xff, 0xef, 0xff, 0xfe, 0xf2, 0xdf, 0x6c, 0xb3, 
+	0xcd, 0xbc, 0xdf, 0xec, 0xff, 0xff, 0xef, 0x66, 
+	0xfe, 0xbf, 0xf5, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0x96, 0x6c, 0xbd, 0xf7, 0xde, 0x2b, 0xef, 0xbd, 
+	0xff, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xfb, 0xff, 
+	0xef, 0xff, 0xfe, 0xfe, 0xef, 0xbf, 0x7d, 0xef, 
+	0xfd, 0xf7, 0x7e, 0x7b, 0xbf, 0xfe, 0xff, 0xff, 
+	0x66, 0xec, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0x7b, 0x7f, 0xfb, 0xed, 0xb7, 0xdf, 
+	0x7e, 0xe3, 0xff, 0xff, 0xbf, 0x99, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xb7, 
+	0xf3, 0xdd, 0x77, 0xff, 0x7f, 0xf7, 0xff, 0xff, 
+	0xff, 0xf7, 0xe6, 0xfd, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xf7, 0xcc, 0x7f, 0xfe, 0xf9, 
+	0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb1, 
+	0xff, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0x3e, 0x7d, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0xf7, 0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0x3f, 
+	0x9b, 0xfb, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xff, 0xff, 0xb7, 0xdf, 0x7e, 0xff, 0xed, 
+	0xf7, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfe, 0xfb, 
+	0xaf, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xd1, 
+	0xbf, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 
+	0xff, 0xbb, 0x79, 0xff, 0xf6, 0xcb, 0x27, 0xbf, 
+	0xfc, 0xf2, 0xcb, 0xfd, 0xf6, 0xb7, 0xdf, 0x7e, 
+	0xff, 0xfd, 0xf7, 0xff, 0xff, 0x7f, 0x6f, 0xfe, 
+	0xbf, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xcb, 0x5c, 0x67, 0x9d, 0x7f, 0xd7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0xef, 0x8f, 0x3e, 
+	0xfa, 0xe8, 0xa3, 0x8b, 0x3f, 0xfa, 0xd4, 0x47, 
+	0x9f, 0x5f, 0x74, 0xfc, 0xf1, 0x9f, 0x7f, 0xfe, 
+	0xe6, 0xff, 0xef, 0xaf, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0xbf, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f, 0x7d, 
+	0xf5, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xeb, 0xef, 0xbf, 0xfd, 0xfe, 0xea, 0xaf, 0x7f, 
+	0xfd, 0xf5, 0xd7, 0x57, 0x37, 0xdd, 0xfe, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xff, 0xff, 
+	0xff, 0xef, 0xff, 0xbf, 0xff, 0xfd, 0xf7, 0x55, 
+	0x7f, 0x53, 0xcd, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xbf, 0xfe, 0xfe, 0xdb, 0xef, 0xbb, 0xff, 
+	0xff, 0xfb, 0xff, 0x7f, 0xfd, 0x7f, 0xd7, 0xfd, 
+	0xff, 0xff, 0xff, 0x66, 0xff, 0x9b, 0xff, 0xbe, 
+	0xfc, 0xfe, 0xcb, 0xef, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xad, 0xbf, 0xde, 0xba, 0xab, 0xad, 
+	0xbb, 0xe6, 0xda, 0xd7, 0x5e, 0x7d, 0xbd, 0xe5, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0xfe, 0xbe, 0xef, 
+	0xff, 0xff, 0xfe, 0xfb, 0xff, 0xdf, 0x1f, 0xff, 
+	0xf8, 0xf1, 0xe7, 0x7f, 0xfd, 0xbd, 0xff, 0xff, 
+	0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 
+	0xff, 0xef, 0xbf, 0xfd, 0xef, 0xde, 0x3f, 0xfd, 
+	0xbf, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 
+	0xff, 0xff, 0xef, 0x3f, 0xff, 0xfd, 0xf7, 0xfd, 
+	0x7f, 0xdf, 0xdf, 0xff, 0xbf, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0x9f, 0xf9, 0xff, 0xfe, 0xfd, 0xef, 
+	0xb5, 0xdf, 0x7e, 0xff, 0xb9, 0xfd, 0xf5, 0xf7, 
+	0xdd, 0x7d, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0x6f, 
+	0xfc, 0xff, 0xf5, 0xff, 0xdf, 0xbf, 0xfd, 0xbd, 
+	0xff, 0xbf, 0xdb, 0x3f, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 
+	0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 
+	0xff, 0xfe, 0xff, 0x70, 0xf7, 0xfe, 0xff, 0xff, 
+	0xff, 0xc6, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0xff, 
+	0xff, 0xff, 0xbf, 0xfb, 0xf9, 0xff, 0xf7, 0x7f, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xbf, 
+	0x1b, 0x7f, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0xbe, 0x3f, 0xfb, 0x98, 0xff, 
+	0xff, 0xff, 0xef, 0xbf, 0xff, 0xfb, 0xff, 0xff, 
+	0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x99, 
+	0xff, 0x6e, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xcf, 0xaf, 
+	0x9f, 0xdc, 0x72, 0xcf, 0x3d, 0xd7, 0x7f, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xdd, 0xf7, 0xff, 0xff, 0xff, 
+	0xbf, 0xf9, 0xff, 0xd9, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfa, 0xeb, 0x7f, 0x77, 0xf8, 0xe3, 0x8f, 0x37, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 
+	0xfe, 0xfb, 0xf7, 0xbe, 0xbe, 0xff, 0xfe, 0xff, 
+	0xff, 0xfd, 0xf6, 0xdb, 0xdf, 0xdf, 0xff, 0xff, 
+	0xff, 0xef, 0x1b, 0xfe, 0xbf, 0xbf, 0xfa, 0xfa, 
+	0xeb, 0xa5, 0xf2, 0x9a, 0xef, 0xd7, 0xdf, 0xf9, 
+	0xa5, 0xde, 0x7a, 0x7e, 0xff, 0xff, 0x3f, 0x66, 
+	0xff, 0xef, 0x7f, 0xff, 0xff, 0x3f, 0xff, 0xef, 
+	0xd7, 0xf7, 0xfd, 0x77, 0xdf, 0xe5, 0x3b, 0xef, 
+	0xff, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x7b, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x6f, 0xbb, 0xb5, 0x7e, 0xbd, 
+	0xf7, 0xf6, 0xeb, 0xae, 0x3b, 0xf5, 0xff, 0xff, 
+	0x6f, 0xd6, 0xff, 0x5e, 0x7a, 0xe9, 0xa5, 0x97, 
+	0x5e, 0x3b, 0xef, 0x5d, 0xaf, 0xbd, 0x76, 0xbe, 
+	0xf9, 0xef, 0xfd, 0xff, 0x5f, 0x9b, 0xfb, 0xbf, 
+	0xbd, 0x66, 0x9a, 0x69, 0xa6, 0xd5, 0x56, 0xfe, 
+	0x96, 0xdf, 0xfb, 0xcd, 0x3e, 0x7b, 0x64, 0xaf, 
+	0xff, 0xef, 0x66, 0xfe, 0x6f, 0xff, 0xfd, 0x77, 
+	0xdf, 0x7d, 0xef, 0xbd, 0xfb, 0xe5, 0xf2, 0xde, 
+	0xfb, 0xcf, 0x3e, 0x7b, 0xef, 0xff, 0xb3, 0xb1, 
+	0xff, 0xfb, 0xff, 0xff, 0xe7, 0x1f, 0xff, 0xfb, 
+	0xbf, 0x7f, 0xf9, 0xb7, 0xf7, 0xbe, 0xe7, 0xbe, 
+	0xf4, 0xfd, 0xff, 0x66, 0xee, 0xff, 0xfe, 0xda, 
+	0x6b, 0xa8, 0xb1, 0xf6, 0xdb, 0x6f, 0x5f, 0xe7, 
+	0xed, 0xb7, 0xff, 0xfa, 0xe3, 0xfd, 0xff, 0xbf, 
+	0x9b, 0xf7, 0xff, 0x9b, 0xef, 0xbe, 0xfb, 0xee, 
+	0xbb, 0xef, 0xbf, 0xfb, 0xff, 0x77, 0xff, 0x77, 
+	0xdc, 0xf9, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xbb, 
+	0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0xb3, 0xce, 
+	0xef, 0xff, 0xf9, 0xff, 0xbf, 0xff, 0xfe, 0xf3, 
+	0xff, 0xbd, 0xb1, 0x7f, 0x7a, 0xe9, 0xaf, 0xbf, 
+	0x5e, 0xfa, 0xeb, 0xbf, 0xd7, 0xf9, 0xf5, 0xd7, 
+	0x6f, 0x9f, 0x7d, 0xf7, 0xdf, 0xff, 0x66, 0xe6, 
+	0x9b, 0x7f, 0xf6, 0xd9, 0x6f, 0x9f, 0x7d, 0xf6, 
+	0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf9, 0xe7, 0xbf, 
+	0xff, 0xff, 0x3f, 0x9b, 0x7b, 0xfb, 0xba, 0xed, 
+	0xf6, 0xdb, 0x6e, 0xb7, 0xfd, 0xff, 0xff, 0xdf, 
+	0x7e, 0xbf, 0xf7, 0xde, 0xfb, 0xff, 0xff, 0xef, 
+	0xa6, 0xde, 0xeb, 0xbf, 0xf5, 0xd6, 0x5b, 0x6f, 
+	0xbd, 0xfd, 0xf7, 0xef, 0xff, 0xfe, 0xfb, 0xe7, 
+	0xbf, 0xff, 0x5f, 0xff, 0xab, 0x61, 0xff, 0x72, 
+	0xbb, 0xef, 0xbe, 0xfb, 0xee, 0xbb, 0xff, 0xfe, 
+	0xfb, 0xdf, 0x7f, 0xfb, 0xfd, 0xf7, 0xef, 0x97, 
+	0x7f, 0x63, 0xfe, 0xbf, 0xfe, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xeb, 0xf6, 0x6f, 0xbd, 0xff, 
+	0x7f, 0xfd, 0xff, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 
+	0xaf, 0xcf, 0x3e, 0xfb, 0xec, 0xb3, 0xcf, 0x3e, 
+	0xba, 0xfc, 0x47, 0x9f, 0x7f, 0xfe, 0xf9, 0xd7, 
+	0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xcb, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xfe, 0xcf, 0xd7, 
+	0x5f, 0xff, 0xfb, 0xff, 0xd7, 0x5f, 0xff, 0xbf, 
+	0xe1, 0xef, 0xf2, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xaf, 0xeb, 0xff, 0xf5, 0xd7, 0xff, 0xff, 
+	0xff, 0xf4, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xbf, 0xdf, 
+	0xff, 0xf7, 0xd5, 0x3f, 0xff, 0xfd, 0xfd, 0xf5, 
+	0xff, 0x1b, 0xfa, 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xbf, 0xbb, 0xff, 0x7f, 0xfd, 
+	0xff, 0xff, 0xdb, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 
+	0xdb, 0xef, 0xbf, 0xfc, 0xe7, 0xfb, 0x4f, 0xbf, 
+	0xff, 0xe7, 0x9f, 0xfb, 0x7d, 0xbf, 0xad, 0xa7, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xae, 0xb5, 0xee, 
+	0xea, 0xeb, 0xad, 0xb7, 0xe6, 0xba, 0xd7, 0x5f, 
+	0x7d, 0xf5, 0x64, 0xd7, 0x5a, 0x7f, 0xfd, 0x6b, 
+	0xfa, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 
+	0xbf, 0xff, 0xf9, 0xf7, 0xf1, 0xe7, 0x8f, 0x5d, 
+	0xfc, 0xff, 0xff, 0x7f, 0x1b, 0xff, 0xfb, 0xef, 
+	0xbf, 0xf7, 0xff, 0xfb, 0xff, 0x77, 0xff, 0xfe, 
+	0xbf, 0xff, 0xfa, 0xfd, 0xfd, 0xff, 0xff, 0xff, 
+	0x7f, 0xe6, 0xff, 0x5f, 0xff, 0xde, 0xff, 0x5f, 
+	0xff, 0xf5, 0xff, 0x9f, 0xff, 0xeb, 0xae, 0xff, 
+	0xed, 0xf4, 0xff, 0xfe, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfe, 0xef, 0xaf, 0xe7, 0xfe, 0xfa, 0xeb, 0xc9, 
+	0xef, 0xf9, 0xe7, 0xe7, 0x57, 0x7e, 0xee, 0xe7, 
+	0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xef, 
+	0xdf, 0xff, 0xbd, 0xf7, 0xfd, 0xdf, 0xff, 0xdf, 
+	0x7f, 0xbf, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0x9b, 
+	0xff, 0xff, 0xbb, 0xfe, 0xfa, 0xff, 0x8f, 0xbf, 
+	0xfe, 0xff, 0xff, 0x1f, 0xff, 0xdf, 0xfd, 0xfb, 
+	0x3f, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xff, 0xaf, 
+	0x7d, 0xf7, 0xb7, 0x7e, 0x4f, 0xff, 0xfd, 0x6f, 
+	0xf7, 0xff, 0xdd, 0xaf, 0xee, 0xf7, 0x9f, 0xff, 
+	0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xed, 0xf1, 0x9f, 0xbf, 0xf7, 0xff, 0xff, 
+	0xfb, 0xef, 0xf6, 0xf7, 0xff, 0x6f, 0xfe, 0xfe, 
+	0xfd, 0xbf, 0xfb, 0xcf, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbb, 0xff, 0xff, 0xef, 0x7f, 0xfc, 
+	0xff, 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xbf, 0xfe, 
+	0xef, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xef, 0xff, 
+	0xff, 0xff, 0xff, 0x7d, 0xbd, 0xf7, 0xff, 0x66, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xeb, 0xab, 
+	0xff, 0xfe, 0xe7, 0xdc, 0x5f, 0x6f, 0xd9, 0xf5, 
+	0xff, 0x5f, 0xff, 0xbf, 0xf1, 0xff, 0xf2, 0xff, 
+	0xff, 0x9f, 0xf6, 0xfb, 0x2d, 0xf7, 0xf9, 0xfb, 
+	0xf3, 0x9f, 0x7f, 0xff, 0xfd, 0xfe, 0xff, 0xff, 
+	0x67, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xf7, 0xdd, 0xfb, 0xdf, 0xf7, 0xbe, 0xfb, 0xef, 
+	0x7f, 0xff, 0xff, 0xfe, 0xff, 0x9b, 0xfe, 0xaf, 
+	0xff, 0xfe, 0xfa, 0x9b, 0xbf, 0xbf, 0xcf, 0xce, 
+	0x5f, 0xff, 0x7b, 0xf5, 0xd5, 0x57, 0xdf, 0x79, 
+	0xff, 0xbf, 0x66, 0xff, 0xff, 0xef, 0xff, 0xfe, 
+	0xf6, 0x6f, 0xbf, 0x97, 0xff, 0xdd, 0xff, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x77, 0xdf, 0xfb, 0xb7, 0xf9, 
+	0xff, 0xfa, 0xef, 0xaf, 0xd7, 0xce, 0xf7, 0xff, 
+	0xbd, 0x76, 0xbf, 0xf6, 0xfe, 0xfb, 0xef, 0x9f, 
+	0x7f, 0xd6, 0xff, 0x6f, 0xd4, 0xff, 0xff, 0x7e, 
+	0xeb, 0xbc, 0x7f, 0x9b, 0x7f, 0xed, 0x75, 0xe7, 
+	0xbd, 0xf4, 0xd2, 0x4b, 0xff, 0xff, 0xf5, 0x5f, 
+	0x99, 0xfb, 0xaf, 0x9f, 0x2f, 0xfb, 0xf9, 0x3f, 
+	0xff, 0xfe, 0xfe, 0xdf, 0xca, 0x7b, 0xfd, 0x34, 
+	0xd3, 0x5e, 0x7f, 0xff, 0xef, 0x66, 0xfe, 0xbf, 
+	0xb2, 0x9a, 0x1c, 0xee, 0xaf, 0xef, 0x96, 0xff, 
+	0xbd, 0xf3, 0xfe, 0x8f, 0xaf, 0xbe, 0x57, 0xdf, 
+	0xfd, 0xb3, 0xb1, 0xff, 0xfa, 0xfb, 0x2f, 0xff, 
+	0x5e, 0xfb, 0xef, 0xbf, 0x7f, 0x6f, 0xf5, 0xff, 
+	0xff, 0xff, 0xef, 0xb7, 0xff, 0xff, 0x66, 0xec, 
+	0xff, 0xff, 0xfb, 0xeb, 0xbf, 0xf3, 0x5f, 0xfe, 
+	0x6f, 0x7f, 0x7b, 0xfd, 0xb5, 0xd7, 0x5e, 0xfb, 
+	0xed, 0xff, 0xbf, 0x99, 0xf7, 0xff, 0xf3, 0xcf, 
+	0xff, 0xff, 0x7f, 0xdb, 0xff, 0xbf, 0xf3, 0xff, 
+	0x7f, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xff, 0xf7, 
+	0xe6, 0xfd, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xdf, 
+	0xfd, 0xff, 0xcb, 0xff, 0xf7, 0xdf, 0x65, 0x9f, 
+	0x7d, 0xd6, 0xf9, 0xff, 0xbd, 0xb1, 0xff, 0xdb, 
+	0xee, 0x3e, 0xcf, 0x76, 0xf3, 0xee, 0xaf, 0x7f, 
+	0xbd, 0xf4, 0xd7, 0x4f, 0x7f, 0xfd, 0xb7, 0xdb, 
+	0xeb, 0x66, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xf3, 
+	0xfb, 0x7f, 0xff, 0xfb, 0xdf, 0x3f, 0xff, 0x6d, 
+	0xb3, 0xcf, 0xfe, 0xdf, 0xff, 0x3b, 0x9b, 0xfb, 
+	0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 
+	0xf6, 0xf7, 0xf7, 0x7f, 0xbb, 0x6d, 0xb7, 0xff, 
+	0xff, 0x7f, 0xef, 0xe6, 0xfe, 0xfb, 0xff, 0xff, 
+	0xda, 0xff, 0x8f, 0xef, 0xff, 0xf7, 0xbf, 0xdf, 
+	0x7f, 0xfb, 0xed, 0xb7, 0xfe, 0xff, 0xff, 0xbb, 
+	0x79, 0xff, 0xf6, 0xdf, 0xef, 0x9f, 0xfc, 0xfb, 
+	0xdf, 0xff, 0xfa, 0xb7, 0xd5, 0x77, 0xdd, 0x7d, 
+	0xf7, 0xdf, 0x93, 0x7f, 0x6f, 0xfe, 0xff, 0x7e, 
+	0xfa, 0xdf, 0xff, 0xff, 0x7b, 0xfe, 0xeb, 0xfd, 
+	0xff, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xfd, 0xff, 
+	0xff, 0x9b, 0xff, 0xbf, 0x8f, 0x3e, 0xff, 0xe8, 
+	0xb3, 0xcf, 0x3f, 0xfa, 0xfc, 0x67, 0x97, 0x7d, 
+	0x76, 0xdd, 0x45, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 
+	0xfb, 0xaf, 0xff, 0xff, 0xe7, 0xef, 0xef, 0xbf, 
+	0xfe, 0xf5, 0xdf, 0xdf, 0x7f, 0x7f, 0xfd, 0x95, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xeb, 0xff, 
+	0xbf, 0xfe, 0xfb, 0xff, 0xaf, 0x7f, 0xfd, 0xf5, 
+	0xdd, 0x7f, 0xbf, 0xfd, 0xe5, 0xd7, 0xff, 0x6f, 
+	0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xfe, 0xbf, 0x5f, 0xfd, 0xd7, 0xd7, 0x5f, 0x75, 
+	0xd5, 0xf7, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xd7, 
+	0x7f, 0x7f, 0xff, 0x7d, 0xf6, 0xfd, 0x7e, 0xfd, 
+	0xff, 0xe6, 0xff, 0xfb, 0xfb, 0xff, 0xfd, 0xfe, 
+	0xcb, 0xff, 0xff, 0xfd, 0xff, 0x9c, 0xdf, 0x7e, 
+	0x79, 0xfd, 0xa7, 0x9f, 0xfe, 0xbf, 0xf9, 0xff, 
+	0xad, 0xbf, 0xf6, 0xaa, 0xab, 0xad, 0xbd, 0xf6, 
+	0xda, 0x17, 0x5f, 0x6a, 0xbd, 0xa5, 0xd6, 0x5a, 
+	0x77, 0xfd, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xf7, 0xec, 0xbf, 0xbb, 0x7f, 0xf5, 0xff, 
+	0xa5, 0x9f, 0x7d, 0xfe, 0xf9, 0xff, 0xff, 0x1b, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xff, 0x7f, 0xef, 0xef, 
+	0xaf, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0x7f, 0xff, 
+	0xff, 0xfb, 0xff, 0x7f, 0x66, 0xff, 0x7f, 0xff, 
+	0xff, 0xef, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0x5f, 0x7f, 0xed, 0x64, 0x57, 0xff, 0xff, 
+	0x9f, 0xf9, 0xff, 0xef, 0xcb, 0xef, 0xf7, 0xff, 
+	0xfe, 0xff, 0x8d, 0xf9, 0xb9, 0x7d, 0xb7, 0x4b, 
+	0xff, 0xfd, 0xf9, 0xff, 0xff, 0x67, 0xfc, 0xff, 
+	0xff, 0xfa, 0xee, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 
+	0xff, 0xfd, 0x7d, 0xef, 0xaf, 0xde, 0xbf, 0x5f, 
+	0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xfe, 0xfb, 
+	0xed, 0xbf, 0xff, 0xfe, 0x3e, 0xd7, 0xff, 0xbb, 
+	0xdf, 0xf6, 0xff, 0x7d, 0xff, 0xff, 0x7f, 0xc6, 
+	0xff, 0xff, 0xaf, 0xb5, 0xf6, 0xf4, 0x7f, 0xff, 
+	0xfb, 0xfd, 0xf9, 0xfe, 0xfd, 0xdf, 0xff, 0xef, 
+	0xc7, 0xff, 0xed, 0xbf, 0xf9, 0xff, 0x7f, 0xdf, 
+	0x7f, 0xbf, 0xff, 0x77, 0xdf, 0xf5, 0x75, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0xff, 0xf3, 
+	0x6f, 0xfe, 0xff, 0xff, 0xbf, 0xa3, 0x8f, 0x3f, 
+	0x7e, 0xfc, 0xff, 0x1e, 0xeb, 0xff, 0xff, 0xaf, 
+	0x9b, 0xbf, 0xff, 0xcf, 0xff, 0x9b, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xdf, 0x7e, 0x3e, 0xfb, 0xff, 
+	0xdf, 0xfe, 0xff, 0xff, 0xf6, 0xe7, 0xff, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xff, 0xaf, 0xfd, 0xfa, 
+	0xfb, 0xff, 0xf7, 0xf7, 0xdf, 0x7f, 0xd1, 0x5b, 
+	0x6f, 0xf9, 0xf7, 0x9f, 0xff, 0xfc, 0xbf, 0xf9, 
+	0xff, 0xff, 0xef, 0xbf, 0x9f, 0xfe, 0xbf, 0x7f, 
+	0xff, 0xfd, 0xff, 0x75, 0xd3, 0x7f, 0xbf, 0xdb, 
+	0xe7, 0xdb, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfd, 
+	0xeb, 0xef, 0xff, 0xff, 0x9f, 0xbf, 0xff, 0xff, 
+	0xef, 0xdf, 0x5f, 0xcf, 0x7f, 0xfe, 0xfb, 0xff, 
+	0x1b, 0xfe, 0xbf, 0xff, 0xff, 0xe6, 0xeb, 0x3f, 
+	0xbc, 0xf8, 0x7e, 0xfe, 0x79, 0x65, 0xf5, 0x97, 
+	0xfc, 0xff, 0x7c, 0xf7, 0x3f, 0x66, 0xff, 0xfb, 
+	0xff, 0xbf, 0xf3, 0xfa, 0xcf, 0xa9, 0xbf, 0xcf, 
+	0x7f, 0xf6, 0xf9, 0xcf, 0xb9, 0xfe, 0xfc, 0xdf, 
+	0xfd, 0xb7, 0xf9, 0x5f, 0x7e, 0x6d, 0xec, 0xe7, 
+	0x9e, 0x7f, 0xa9, 0xff, 0xd7, 0xbf, 0xdd, 0x7e, 
+	0x73, 0xaf, 0xff, 0xd7, 0x9e, 0xff, 0x6f, 0xd6, 
+	0xf3, 0xce, 0x3a, 0xff, 0x8f, 0xf7, 0xdf, 0x3a, 
+	0xff, 0xfc, 0xaf, 0xbd, 0xf4, 0xdf, 0xf9, 0x67, 
+	0xbf, 0xf6, 0x5f, 0x9b, 0xfb, 0xbf, 0xdf, 0x5f, 
+	0xff, 0xe9, 0xbb, 0xaf, 0x6e, 0xde, 0xff, 0x7e, 
+	0x2b, 0xad, 0x3c, 0xfb, 0xcc, 0x37, 0xf7, 0xef, 
+	0x66, 0xfe, 0xbb, 0xf2, 0xda, 0x2b, 0xaa, 0xf9, 
+	0xa7, 0x9e, 0xf7, 0x5f, 0xf3, 0xee, 0x3b, 0xef, 
+	0x3e, 0x5b, 0xcd, 0xff, 0xb3, 0xb1, 0xff, 0xfe, 
+	0xff, 0xff, 0xfd, 0xfe, 0xfb, 0xee, 0xfb, 0xfd, 
+	0x87, 0xbd, 0xfd, 0xd6, 0xdf, 0xee, 0xf5, 0xdf, 
+	0xfa, 0x66, 0xee, 0xff, 0xfe, 0xfa, 0xff, 0xbf, 
+	0xbf, 0xcd, 0xfa, 0xff, 0xdf, 0xfb, 0xed, 0xb5, 
+	0xf7, 0xfe, 0x2b, 0xfd, 0xb7, 0xb8, 0x9b, 0xf7, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0x76, 0xdb, 0x6f, 
+	0xbf, 0xb9, 0xdd, 0x77, 0xdf, 0x7f, 0xdb, 0xf9, 
+	0xb7, 0xcf, 0xf7, 0xa6, 0xfd, 0xff, 0xf7, 0xf7, 
+	0xdf, 0xff, 0xff, 0xfd, 0xff, 0x9f, 0x47, 0xfe, 
+	0xf9, 0xe7, 0xbf, 0xff, 0xfe, 0xfb, 0xe5, 0xbd, 
+	0xb1, 0xff, 0xfb, 0xed, 0xb1, 0xdb, 0x56, 0xfb, 
+	0x6e, 0xbf, 0xff, 0xa1, 0xf4, 0xd7, 0x4b, 0x9f, 
+	0x7d, 0x76, 0xd2, 0xff, 0x66, 0xe6, 0xff, 0xef, 
+	0xff, 0xff, 0xfb, 0xdf, 0x7f, 0xff, 0xff, 0xff, 
+	0x3f, 0xfb, 0xec, 0xf3, 0xe7, 0x9f, 0xff, 0xac, 
+	0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0xf7, 0xff, 0xff, 0xff, 0xdb, 0x6e, 0x7b, 
+	0xff, 0xde, 0xfb, 0x6f, 0xfb, 0xef, 0xa6, 0xfe, 
+	0xff, 0xbf, 0xbf, 0xff, 0xf7, 0xeb, 0xbf, 0xff, 
+	0xdf, 0x85, 0xff, 0x7e, 0xbb, 0xff, 0x9f, 0xd7, 
+	0xff, 0xfb, 0xab, 0x79, 0xff, 0xf7, 0xdb, 0x3f, 
+	0xbf, 0xff, 0xfa, 0xcb, 0xff, 0x7e, 0xf1, 0xdf, 
+	0x77, 0x7f, 0xfc, 0xf7, 0xe7, 0x7f, 0x7d, 0x63, 
+	0xfe, 0xbf, 0x7e, 0xfb, 0xff, 0xed, 0x9f, 0xfe, 
+	0xba, 0xff, 0xff, 0x6f, 0xdd, 0xfd, 0xde, 0xf9, 
+	0xff, 0xfd, 0xf5, 0xfe, 0x9b, 0xff, 0xaf, 0xcf, 
+	0x3e, 0xff, 0xfc, 0xa3, 0x8f, 0x3e, 0xff, 0xbc, 
+	0x47, 0x9f, 0x7d, 0xf4, 0xb9, 0xe7, 0x1f, 0x7d, 
+	0xfe, 0xe6, 0xff, 0xeb, 0xbf, 0xbf, 0xfd, 0xf7, 
+	0x8b, 0x3f, 0xbf, 0xfe, 0xe5, 0xd7, 0xdf, 0xff, 
+	0xff, 0xef, 0xd7, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfa, 0xfb, 0x2f, 0xbf, 0xff, 0xfe, 0xdb, 0xaf, 
+	0x7f, 0xf9, 0xf5, 0xdf, 0x7f, 0xff, 0xff, 0xf7, 
+	0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xfb, 
+	0x6f, 0xbf, 0xfe, 0xfb, 0xbf, 0xff, 0xfd, 0xf7, 
+	0xd7, 0x5f, 0xff, 0xfc, 0xfd, 0xdf, 0xff, 0x9b, 
+	0xff, 0xff, 0xff, 0xfe, 0xf6, 0xdf, 0x2f, 0xbf, 
+	0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xe5, 0xff, 
+	0xff, 0xff, 0xff, 0x3f, 0xe6, 0xff, 0xfe, 0x5f, 
+	0xff, 0xfd, 0xf7, 0xfe, 0xef, 0xef, 0xfd, 0xcc, 
+	0xff, 0xdf, 0x6f, 0xbf, 0xed, 0xfd, 0xdf, 0xfe, 
+	0xbf, 0xe9, 0xdf, 0x2f, 0xbf, 0xfc, 0xe2, 0xeb, 
+	0xaf, 0xbd, 0xf6, 0x72, 0x57, 0x5f, 0x37, 0xb5, 
+	0x75, 0xd7, 0x5f, 0x7f, 0xfd, 0x69, 0xfe, 0xff, 
+	0xff, 0xff, 0xcb, 0x6f, 0xff, 0xab, 0xdd, 0xbb, 
+	0xdf, 0xe7, 0xb7, 0x5f, 0xfd, 0x5f, 0xfa, 0xff, 
+	0xc1, 0xff, 0x1b, 0xff, 0xf7, 0xef, 0x7f, 0xbd, 
+	0xfa, 0xfe, 0xde, 0x7f, 0xff, 0x7f, 0xef, 0xde, 
+	0xff, 0xff, 0xf3, 0xff, 0xf5, 0xef, 0x7f, 0xe6, 
+	0xff, 0x7f, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0x57, 0xf7, 
+	0xff, 0x5f, 0xff, 0xbf, 0xe9, 0xf7, 0xfb, 0xff, 
+	0xab, 0xf6, 0xff, 0xbe, 0xdf, 0xab, 0xf5, 0x7f, 
+	0xf7, 0xdf, 0x7e, 0x7f, 0x7e, 0x7f, 0xdf, 0xfe, 
+	0x6f, 0xfe, 0xbd, 0xff, 0xff, 0xef, 0xfe, 0xff, 
+	0xed, 0xff, 0xda, 0xf7, 0xbf, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xdb, 0xfd, 0x9b, 0xff, 0xbf, 
+	0xfb, 0xf6, 0xf8, 0xff, 0xbe, 0xdb, 0xef, 0xfb, 
+	0xbf, 0xda, 0x5f, 0x6f, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xdb, 0xef, 0xbf, 0xfe, 
+	0xbe, 0xff, 0xef, 0x3f, 0xfb, 0xff, 0xbf, 0xff, 
+	0x6f, 0xda, 0xff, 0xbf, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0x73, 0x4f, 0xfd, 0xbf, 0xfb, 0xf7, 0xf9, 
+	0xbd, 0x94, 0xdf, 0xff, 0xff, 0xd7, 0xfb, 0xff, 
+	0xff, 0xff, 0xdf, 0x6f, 0xfe, 0xff, 0xff, 0xff, 
+	0x31, 0xfe, 0x7a, 0xff, 0xff, 0xf1, 0xff, 0xff, 
+	0xfb, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf9, 0xfd, 
+	0x9b, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xd7, 
+	0xff, 0xf3, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xeb, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xff, 
+	0xbf, 0x7f, 0x7e, 0xe3, 0xeb, 0xff, 0x2f, 0xee, 
+	0xf5, 0xf9, 0x59, 0xbf, 0xdf, 0xb5, 0x7f, 0xab, 
+	0xff, 0xbf, 0xf1, 0xff, 0xff, 0xe1, 0xbf, 0xff, 
+	0xfe, 0xeb, 0x69, 0x7f, 0xff, 0xfd, 0xff, 0xfb, 
+	0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x67, 0xfe, 
+	0xff, 0xff, 0xff, 0xb3, 0xaf, 0x7f, 0xff, 0xef, 
+	0x7f, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xbd, 0xff, 
+	0xfe, 0xfb, 0xfb, 0x9b, 0xfe, 0xff, 0xff, 0x9f, 
+	0x33, 0x6b, 0xaf, 0xbf, 0xf7, 0x2e, 0xd7, 0x7f, 
+	0xe5, 0xe9, 0x57, 0x56, 0x78, 0xf9, 0xf5, 0xbf, 
+	0x66, 0xff, 0x7f, 0xef, 0xa7, 0x5e, 0xfb, 0xeb, 
+	0xef, 0xbf, 0x95, 0xff, 0x9f, 0xfe, 0xcf, 0xb5, 
+	0xfe, 0xf2, 0xdf, 0xfe, 0xb7, 0xf9, 0xff, 0xfb, 
+	0xff, 0xb5, 0xbf, 0x5c, 0xfb, 0xfb, 0xbd, 0xf7, 
+	0x9f, 0xf7, 0xfc, 0xd3, 0xef, 0xb3, 0xcd, 0xb6, 
+	0xeb, 0x6f, 0xd4, 0xbf, 0x9e, 0x3e, 0xf7, 0x0c, 
+	0xb3, 0xfe, 0x7e, 0xed, 0x55, 0xef, 0xbd, 0xfd, 
+	0xf4, 0x4b, 0xad, 0xb5, 0xd6, 0x5e, 0x99, 0xfb, 
+	0xff, 0xd7, 0xff, 0x7b, 0x49, 0xef, 0xdf, 0xf7, 
+	0xdb, 0xd7, 0x76, 0xdb, 0xfd, 0xe6, 0xd2, 0x6c, 
+	0xb3, 0x4d, 0x6e, 0x66, 0xfe, 0xbf, 0xf5, 0x9a, 
+	0x5a, 0xb2, 0xad, 0xfb, 0xfd, 0xfa, 0xdf, 0xdf, 
+	0xff, 0x8d, 0xfd, 0xbe, 0xf7, 0xde, 0xab, 0xb3, 
+	0xb1, 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xdc, 0xfe, 
+	0xff, 0xef, 0xf6, 0xbf, 0x86, 0xff, 0xd9, 0xdf, 
+	0xff, 0xbd, 0xf7, 0xff, 0x66, 0xec, 0xbf, 0xfe, 
+	0xfb, 0xeb, 0x2c, 0xe6, 0xfe, 0xff, 0x7b, 0x58, 
+	0xe1, 0xe9, 0xfd, 0xb6, 0x5f, 0xfb, 0xed, 0xb7, 
+	0x3f, 0x9b, 0xf7, 0xff, 0xfb, 0xef, 0xb7, 0xdf, 
+	0xf8, 0xff, 0xff, 0xb7, 0xb3, 0xfd, 0xfe, 0x7f, 
+	0xef, 0xf7, 0xdc, 0x73, 0xcf, 0x57, 0xe6, 0xfd, 
+	0xff, 0xf7, 0xd7, 0x5f, 0x67, 0xff, 0xfd, 0xff, 
+	0xc9, 0x4f, 0xbe, 0xff, 0x7f, 0xf3, 0x7d, 0xf6, 
+	0xd9, 0xe7, 0x9d, 0xb1, 0x5f, 0xfb, 0xef, 0x33, 
+	0xcf, 0x6e, 0x3b, 0xed, 0x27, 0x5e, 0xe9, 0xf4, 
+	0xdf, 0x5e, 0x3e, 0xfd, 0xf4, 0xd2, 0xff, 0x66, 
+	0xe6, 0xdf, 0x7f, 0xff, 0xfc, 0xf3, 0xfb, 0x7f, 
+	0xbf, 0xd9, 0xdb, 0x36, 0xff, 0xfe, 0xf7, 0xcd, 
+	0x1a, 0xeb, 0xac, 0x3b, 0x9b, 0xfb, 0xfe, 0xef, 
+	0xef, 0xbf, 0xff, 0xff, 0xef, 0xdf, 0xf6, 0x37, 
+	0xf7, 0xdf, 0xff, 0xff, 0xb6, 0xd7, 0x6e, 0x7b, 
+	0xef, 0xe6, 0xfe, 0xfb, 0xaf, 0xff, 0xd8, 0xe7, 
+	0xfb, 0xff, 0xdf, 0xf0, 0x87, 0xdf, 0x5e, 0xef, 
+	0xa3, 0xb7, 0xd7, 0xfe, 0xfb, 0xbb, 0x79, 0xff, 
+	0xf3, 0xc9, 0xbf, 0xff, 0xeb, 0x73, 0xbb, 0x67, 
+	0x76, 0xf3, 0xdd, 0xb3, 0x4f, 0x74, 0xf7, 0xd5, 
+	0x7f, 0x7f, 0x6f, 0xfe, 0xdf, 0xfe, 0xfe, 0xff, 
+	0xee, 0xb6, 0xdf, 0x7f, 0xbb, 0xdf, 0xff, 0xfd, 
+	0xf5, 0xff, 0xdf, 0xff, 0xff, 0x75, 0xff, 0x9b, 
+	0xff, 0xef, 0x8f, 0x3e, 0xf3, 0xfc, 0xb3, 0x8f, 
+	0x3f, 0xfb, 0x9c, 0xc7, 0x1f, 0x7f, 0xe4, 0xd9, 
+	0xe7, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xfb, 0xff, 
+	0xff, 0xfe, 0xfa, 0xdf, 0xff, 0xbf, 0xfd, 0xed, 
+	0x9f, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0x5f, 0xff, 
+	0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xfe, 
+	0xf3, 0xfb, 0xbf, 0xff, 0xfd, 0xfd, 0xd7, 0x5f, 
+	0xff, 0xfd, 0xff, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 
+	0xfe, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xef, 0x8f, 
+	0x7f, 0xfc, 0xf1, 0xfd, 0x7f, 0x7f, 0x7d, 0xf5, 
+	0xdf, 0xff, 0x9b, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xbf, 0xff, 0xfe, 0xf3, 0xdf, 0x7f, 
+	0xf9, 0xf5, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xdf, 0x4f, 0xbf, 0xf7, 0x73, 0xff, 0x2f, 
+	0x7f, 0xfd, 0xcc, 0xb7, 0xbf, 0x7e, 0xe9, 0xc7, 
+	0x1e, 0xd7, 0xff, 0xbb, 0xf9, 0xff, 0xaf, 0xb7, 
+	0xf6, 0xea, 0xeb, 0xaf, 0xb7, 0xf6, 0xf2, 0xc7, 
+	0x5b, 0x7f, 0xd9, 0xc5, 0x17, 0x5f, 0x76, 0xe9, 
+	0x6d, 0xf6, 0xbf, 0xff, 0xff, 0xf7, 0xfd, 0xff, 
+	0xef, 0xbf, 0xcf, 0x1f, 0x7e, 0xd3, 0x7e, 0x9f, 
+	0x7f, 0xf4, 0xf9, 0xa7, 0xff, 0x1b, 0xff, 0x7f, 
+	0xfb, 0xef, 0xef, 0x7d, 0xfb, 0xff, 0xff, 0xda, 
+	0xed, 0xdf, 0xf6, 0xdf, 0xff, 0xdb, 0x7f, 0xff, 
+	0xfd, 0x7f, 0xe6, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xff, 0x7f, 0xf7, 0xfb, 0xff, 
+	0x7d, 0xfd, 0xfc, 0x77, 0xce, 0x97, 0x9f, 0xf9, 
+	0xff, 0xff, 0xab, 0x0f, 0x3f, 0xdf, 0xfe, 0x3f, 
+	0xac, 0x7d, 0xb9, 0xf5, 0x87, 0x5b, 0xef, 0xfd, 
+	0xf6, 0xe7, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xbb, 
+	0xfb, 0xff, 0xff, 0xba, 0xff, 0xda, 0x5f, 0x7f, 
+	0xfb, 0xfc, 0xd7, 0xff, 0x77, 0xff, 0xff, 0xff, 
+	0x99, 0xff, 0xff, 0xbf, 0xfe, 0xf9, 0xff, 0x9f, 
+	0xfb, 0xff, 0xd7, 0xfb, 0xfd, 0xff, 0x7f, 0xf3, 
+	0xd7, 0xff, 0xff, 0xff, 0x7f, 0xc6, 0xdf, 0xfb, 
+	0xcf, 0xfd, 0xff, 0xdf, 0xfb, 0xfa, 0xed, 0xfb, 
+	0xef, 0x3f, 0xff, 0x7b, 0xfb, 0xf1, 0xff, 0xee, 
+	0xff, 0xbd, 0xf9, 0xff, 0x7b, 0xfb, 0xfd, 0xff, 
+	0xe7, 0xde, 0x7c, 0xf7, 0xbe, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x6b, 0xfe, 
+	0xff, 0xef, 0xff, 0xf3, 0xce, 0xd7, 0xff, 0xfd, 
+	0xd3, 0x1d, 0xbd, 0xfe, 0xea, 0x52, 0xbe, 0xff, 
+	0xfe, 0xbb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xf7, 
+	0x7b, 0xdd, 0xff, 0x76, 0xef, 0xea, 0xdf, 0xff, 
+	0xfe, 0xfb, 0xbf, 0xbb, 0xb3, 0xff, 0xfe, 0xde, 
+	0xe6, 0xff, 0xff, 0xaf, 0x7f, 0x7f, 0xf0, 0xed, 
+	0xff, 0xe7, 0xe7, 0xf5, 0xd7, 0x7b, 0xff, 0xdd, 
+	0xff, 0x9d, 0xef, 0xef, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xfd, 0xff, 0xfd, 0xfa, 0xf9, 0xed, 0xbf, 0xdf, 
+	0xdf, 0xbf, 0xbf, 0x33, 0xff, 0xff, 0x9f, 0x1f, 
+	0xf7, 0x6b, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xdf, 
+	0xff, 0xfe, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfd, 
+	0xde, 0xff, 0x6f, 0xf7, 0xf7, 0xff, 0x1b, 0xfe, 
+	0xff, 0xff, 0xff, 0xe7, 0xaf, 0xac, 0xff, 0xfa, 
+	0x2b, 0x5f, 0x7f, 0x7d, 0xe7, 0xdf, 0x7f, 0x73, 
+	0xff, 0xfd, 0x3f, 0x66, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0x73, 0xe9, 0xef, 0xb2, 0x93, 0xdd, 0xb7, 
+	0xdf, 0xae, 0xff, 0x9f, 0xf2, 0xdf, 0xff, 0xb7, 
+	0xf9, 0x9f, 0x1e, 0xeb, 0xf5, 0xff, 0x56, 0x7a, 
+	0xfb, 0xed, 0x77, 0xbf, 0xfd, 0xde, 0xeb, 0xcc, 
+	0xbf, 0xbd, 0xf6, 0xfe, 0x6f, 0xd6, 0xb3, 0xde, 
+	0x3a, 0xff, 0xbf, 0xb3, 0x5e, 0x7b, 0xed, 0x75, 
+	0xaf, 0xbd, 0x76, 0x7e, 0xf9, 0xaf, 0xbd, 0xf6, 
+	0x5f, 0x9b, 0xfb, 0xff, 0xaf, 0x7f, 0xfe, 0x6f, 
+	0x2f, 0xd5, 0x66, 0x9b, 0xdd, 0x6e, 0x33, 0xef, 
+	0x7f, 0xfb, 0x6c, 0xfb, 0xad, 0xee, 0x66, 0xfe, 
+	0xbf, 0xb6, 0x8e, 0x6a, 0xeb, 0xeb, 0xe6, 0xbe, 
+	0x7b, 0xdd, 0x71, 0xdf, 0xfd, 0xdf, 0xde, 0x72, 
+	0xdf, 0xfd, 0xb3, 0xb1, 0xff, 0xfa, 0xeb, 0xab, 
+	0xff, 0xda, 0x42, 0xb9, 0xef, 0x6e, 0x77, 0xfd, 
+	0xde, 0xbb, 0xff, 0xbf, 0xdc, 0xf7, 0xfe, 0x66, 
+	0xee, 0xbf, 0xfe, 0xfa, 0xeb, 0xbf, 0xe1, 0x54, 
+	0x5b, 0x6d, 0x7f, 0xfb, 0x05, 0x97, 0xfd, 0xda, 
+	0xa9, 0xed, 0xd7, 0xbf, 0x9b, 0xf7, 0xff, 0xdb, 
+	0xef, 0xbf, 0xfd, 0x7f, 0x9b, 0xfd, 0xb6, 0xb3, 
+	0xdd, 0xf6, 0xdb, 0x77, 0xbc, 0xdd, 0x76, 0xfb, 
+	0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xc7, 0xff, 0x7f, 
+	0x9f, 0x6f, 0xbe, 0xc9, 0x4d, 0x36, 0xd9, 0xe4, 
+	0xb7, 0x47, 0x3e, 0xf9, 0xfc, 0xbd, 0xb1, 0xff, 
+	0x7b, 0xed, 0xb7, 0xdf, 0x3e, 0xe3, 0x8b, 0x2f, 
+	0x7e, 0xe1, 0xa5, 0x97, 0x6f, 0xdf, 0xf9, 0x85, 
+	0x97, 0xff, 0x66, 0xe6, 0xff, 0x7f, 0xff, 0xfc, 
+	0xf6, 0xcf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf9, 0xff, 0x7f, 0xff, 0xfd, 0x3f, 0x9b, 
+	0xfb, 0xff, 0xf7, 0xdf, 0xff, 0xfe, 0xfe, 0xbf, 
+	0xff, 0xf6, 0xb7, 0xdf, 0x7c, 0xb3, 0xf7, 0x7f, 
+	0xdf, 0x7e, 0xf7, 0xef, 0xa6, 0xfe, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0x8b, 0x7f, 0xfc, 0xd1, 0x8f, 
+	0x3f, 0xee, 0xe8, 0xe7, 0x8f, 0x3f, 0xfa, 0xfc, 
+	0xab, 0x79, 0xff, 0xf6, 0xd9, 0x3f, 0xbf, 0xfa, 
+	0xeb, 0x9f, 0x7f, 0xfe, 0xf3, 0xce, 0x3f, 0xff, 
+	0xf5, 0xb3, 0xce, 0x7f, 0x6f, 0x6f, 0xfe, 0xdf, 
+	0xfe, 0xfb, 0xed, 0xae, 0xb3, 0xff, 0xaf, 0xc9, 
+	0x57, 0x7e, 0xd5, 0xd5, 0xbf, 0x59, 0x3e, 0xf9, 
+	0x6f, 0xff, 0x9a, 0xff, 0xef, 0x8f, 0x3e, 0x7b, 
+	0xe8, 0x33, 0xcf, 0x3f, 0x7a, 0xd4, 0x47, 0x1f, 
+	0x7d, 0xfe, 0xd1, 0x47, 0x9f, 0x5f, 0xbe, 0xe6, 
+	0xff, 0xef, 0xaf, 0xff, 0x5e, 0xe3, 0xcb, 0x2f, 
+	0xbf, 0x7e, 0xf5, 0x97, 0x5f, 0xfe, 0xf3, 0xc5, 
+	0xd7, 0xff, 0xf7, 0xbf, 0xf9, 0xff, 0xff, 0xeb, 
+	0xff, 0xff, 0xfe, 0xfa, 0xcb, 0xaf, 0x77, 0xfd, 
+	0xf5, 0xd7, 0xff, 0x7f, 0xfd, 0xf5, 0xff, 0xf7, 
+	0x6f, 0xfe, 0xff, 0xfe, 0xfa, 0xef, 0xaf, 0xbe, 
+	0xf8, 0xea, 0xbf, 0xff, 0xfd, 0xf3, 0xcf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 0xef, 
+	0xbf, 0xfe, 0xfb, 0xeb, 0xaf, 0xbf, 0xfe, 0x7f, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x3f, 0x66, 0xff, 0xcb, 0xff, 0x7f, 0xfd, 
+	0xf7, 0xcb, 0xff, 0xff, 0xff, 0xde, 0xff, 0x7f, 
+	0x7a, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0xe9, 
+	0xff, 0xae, 0x9e, 0xfe, 0xfa, 0xa3, 0xad, 0xbf, 
+	0xf4, 0xa2, 0xd7, 0x5e, 0x7d, 0xf5, 0xa5, 0x47, 
+	0x4f, 0x7e, 0xf9, 0x6f, 0xfe, 0xfd, 0xef, 0xff, 
+	0xff, 0xee, 0xfd, 0xe8, 0xf3, 0xcf, 0x7e, 0xfa, 
+	0x1d, 0xe7, 0xae, 0xff, 0xfe, 0xdf, 0x7f, 0xff, 
+	0x1a, 0xff, 0xff, 0xdb, 0x6f, 0x3f, 0xff, 0xbf, 
+	0x5f, 0xff, 0xbd, 0xef, 0x77, 0x3f, 0xff, 0xfa, 
+	0x75, 0xff, 0xbe, 0xff, 0x7f, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xba, 0x3d, 0xfd, 0xf6, 
+	0xf7, 0xff, 0xb7, 0xdc, 0xf7, 0xfe, 0xf8, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xef, 0x8f, 0xbf, 
+	0xff, 0xfb, 0xbf, 0xad, 0xfb, 0x9d, 0xb7, 0xc5, 
+	0x5f, 0xe9, 0xfd, 0xf7, 0xdf, 0xff, 0x6b, 0xfe, 
+	0x6f, 0xfe, 0xfe, 0xfb, 0xbe, 0xbf, 0xff, 0xbf, 
+	0xef, 0xfd, 0xff, 0xd7, 0xfd, 0xbf, 0xff, 0x7f, 
+	0xff, 0x7b, 0xff, 0x9b, 0xff, 0xbe, 0x7f, 0xee, 
+	0xf9, 0xe7, 0xff, 0xef, 0xff, 0xf8, 0xc3, 0x1f, 
+	0xff, 0xdf, 0xfd, 0xf3, 0xff, 0xf7, 0xff, 0xff, 
+	0xe6, 0xff, 0xfb, 0xaf, 0xbf, 0xd6, 0xfa, 0xfb, 
+	0xff, 0xbf, 0xff, 0xbf, 0xf7, 0xf8, 0xff, 0xff, 
+	0xf5, 0x37, 0xdf, 0xbf, 0xbf, 0xf9, 0xff, 0xf3, 
+	0x7f, 0xfd, 0xcf, 0xdf, 0x6b, 0xbf, 0xbf, 0xdf, 
+	0xff, 0xfd, 0xff, 0xfe, 0xdb, 0xbf, 0xf7, 0xf7, 
+	0xff, 0x6b, 0xfe, 0xff, 0xcf, 0xff, 0xff, 0x5f, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xbe, 0xfb, 0x7f, 
+	0xff, 0xff, 0xf1, 0x67, 0xff, 0xff, 0x9b, 0xfb, 
+	0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xef, 0xfd, 0xe6, 0xff, 0xcb, 0xbf, 0xf7, 
+	0xf4, 0x7b, 0xfd, 0xb5, 0xe7, 0xf5, 0xbf, 0xd9, 
+	0x7e, 0xbf, 0xff, 0xf7, 0xfa, 0xff, 0xff, 0xbf, 
+	0xe1, 0xff, 0xfa, 0xef, 0xbf, 0xf7, 0xfe, 0xf3, 
+	0xca, 0xfe, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xfd, 0x27, 0xd7, 0xff, 0x67, 0xf6, 0xff, 0xff, 
+	0xbc, 0xf3, 0xcf, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 
+	0x7f, 0xf7, 0xdd, 0xff, 0x5f, 0xff, 0xfd, 0xff, 
+	0xff, 0x9b, 0xfe, 0xfc, 0xf2, 0x9b, 0xef, 0x3f, 
+	0x7f, 0xbe, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x9d, 
+	0xdf, 0x77, 0xdf, 0xfd, 0xff, 0xbf, 0x66, 0x7f, 
+	0xea, 0xa5, 0xbf, 0xfe, 0xf2, 0xbb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x5f, 0xcf, 0xf7, 0xd7, 0x5f, 
+	0xff, 0xfb, 0xb7, 0xf9, 0xdf, 0x6a, 0xab, 0xad, 
+	0xb6, 0xce, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0x79, 0xeb, 0xbd, 0xf7, 0xf7, 0xeb, 0x6f, 
+	0xd4, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7, 0xdf, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0x75, 0xde, 0xcb, 
+	0x2f, 0xff, 0xf7, 0x5c, 0x99, 0xfb, 0xaf, 0x99, 
+	0xf6, 0xba, 0xe9, 0xf1, 0xaf, 0x56, 0xfb, 0xdf, 
+	0x7e, 0xfb, 0xfd, 0xef, 0xdf, 0x6c, 0xab, 0xcf, 
+	0xee, 0x66, 0xfe, 0x7f, 0xf7, 0xd5, 0x6f, 0xff, 
+	0xbf, 0xb7, 0xd6, 0xfe, 0xb7, 0xdf, 0x5e, 0xb5, 
+	0xf3, 0xbd, 0xf2, 0xee, 0xb9, 0x93, 0xb1, 0xff, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xee, 0xbc, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x6b, 0x7f, 0xff, 0xbd, 
+	0xfd, 0xf7, 0x66, 0xec, 0xbf, 0xf6, 0xda, 0x6b, 
+	0xaf, 0xfd, 0xff, 0x6a, 0xef, 0x7f, 0xff, 0xfd, 
+	0xf5, 0xda, 0x7e, 0xfb, 0xed, 0xff, 0xbf, 0x99, 
+	0xf7, 0xef, 0xbb, 0xef, 0xbe, 0xff, 0xfe, 0xdb, 
+	0xbd, 0xff, 0xfb, 0xed, 0xff, 0xff, 0x6f, 0xf7, 
+	0xdd, 0xff, 0x9f, 0x77, 0xe6, 0xfd, 0xfb, 0xec, 
+	0xb3, 0xcb, 0x2e, 0xff, 0xf9, 0xf7, 0xfb, 0xff, 
+	0xfe, 0xff, 0xcf, 0x99, 0x7f, 0xfe, 0xff, 0xcf, 
+	0xbd, 0xb1, 0xff, 0xfa, 0xeb, 0xa5, 0xbf, 0x5e, 
+	0x7b, 0xed, 0xbe, 0xff, 0x7d, 0xf7, 0xdf, 0x6e, 
+	0x7e, 0xfd, 0xf5, 0xda, 0xbf, 0x6e, 0xe6, 0x9f, 
+	0xfd, 0xf6, 0xdb, 0x6f, 0xdf, 0x7f, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xf9, 0xdf, 0x7f, 0xff, 
+	0xff, 0x3b, 0x9b, 0xfb, 0x6d, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0xfd, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xb7, 0xdf, 0xff, 0xbf, 0xef, 0xe6, 
+	0xfe, 0x6b, 0xaf, 0xbd, 0xf6, 0xda, 0xef, 0x37, 
+	0xfe, 0xff, 0xff, 0xfe, 0x7f, 0x2b, 0xe3, 0xbd, 
+	0xff, 0xfe, 0x7f, 0xbb, 0x79, 0xdf, 0xef, 0xbf, 
+	0xff, 0xfa, 0xeb, 0xf2, 0x9f, 0xff, 0xfa, 0xb7, 
+	0xdf, 0x3b, 0x7f, 0x7d, 0xf7, 0xdf, 0x17, 0x7f, 
+	0x6f, 0xfe, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0xbf, 
+	0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0x79, 0xf7, 0xff, 0x7f, 0xff, 0x9b, 0xff, 0xaf, 
+	0x83, 0x1e, 0xfa, 0xe8, 0xa2, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xe5, 0x9f, 0x3f, 0xec, 0xd9, 0xe7, 0x1f, 
+	0x7f, 0xfe, 0xe6, 0xff, 0xff, 0xf7, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xf5, 0xdf, 0xff, 
+	0xaf, 0xfd, 0xf7, 0xd7, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xba, 0xea, 0xad, 0xbf, 0xae, 0xff, 0xff, 
+	0xef, 0x7f, 0x5d, 0xf7, 0xff, 0xdf, 0xff, 0xfd, 
+	0xf5, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xda, 0xea, 
+	0xab, 0xaf, 0xfe, 0xff, 0xef, 0xaf, 0xff, 0xfd, 
+	0xf5, 0xdf, 0x77, 0xdf, 0x7d, 0xf5, 0xdf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xfe, 
+	0xff, 0xff, 0xfe, 0xfb, 0x7d, 0xff, 0xbf, 0xf7, 
+	0xf7, 0x5f, 0x7f, 0xff, 0xff, 0x66, 0xff, 0x93, 
+	0x6f, 0x7d, 0xf5, 0xf5, 0xdb, 0x4f, 0xf5, 0xbc, 
+	0xe7, 0x1f, 0xdf, 0x7e, 0xf3, 0xff, 0xff, 0xff, 
+	0xfb, 0xbf, 0xf9, 0xff, 0x2e, 0xbb, 0xfe, 0xfa, 
+	0xeb, 0xae, 0xbf, 0xfc, 0xf0, 0xc7, 0x5f, 0x7f, 
+	0xf9, 0xf5, 0x97, 0x5f, 0x7e, 0xf5, 0x6f, 0xfe, 
+	0xdf, 0xff, 0xee, 0xfd, 0xff, 0xba, 0xfc, 0xed, 
+	0xbe, 0xff, 0xed, 0xff, 0x58, 0x07, 0x6a, 0xb8, 
+	0xf1, 0xff, 0xe7, 0x1b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0x9f, 0xff, 0xff, 0x5f, 0xff, 0xef, 
+	0xef, 0xaf, 0xf7, 0xdf, 0x6f, 0xef, 0xff, 0xff, 
+	0x66, 0xef, 0xff, 0x7f, 0xfb, 0xfd, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x3b, 0xff, 0x7f, 0xef, 
+	0xfd, 0xb7, 0xfe, 0xff, 0xb7, 0xf9, 0xff, 0xde, 
+	0xeb, 0xef, 0xf7, 0xfe, 0xda, 0xed, 0xa9, 0x75, 
+	0xed, 0xe5, 0xe6, 0x7f, 0xf7, 0xfd, 0xf9, 0xff, 
+	0xfb, 0x67, 0xfc, 0xff, 0xbd, 0xfb, 0xde, 0xeb, 
+	0x9f, 0xfd, 0xfd, 0xdb, 0xde, 0x7e, 0x6b, 0xff, 
+	0xfb, 0xfd, 0xf7, 0xd7, 0xff, 0xff, 0x99, 0xff, 
+	0x9c, 0xbf, 0x55, 0xbf, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xcb, 0xfd, 0xe7, 0xfd, 0xf1, 0xc6, 0x3f, 
+	0xbf, 0xfb, 0xff, 0xc6, 0xff, 0xab, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xfb, 0xff, 0xe7, 0xcd, 0xbf, 
+	0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 
+	0xf9, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0xdf, 0xff, 
+	0xfe, 0xff, 0x1d, 0xff, 0xbf, 0xbf, 0x7e, 0xef, 
+	0xaf, 0xbf, 0xff, 0xff, 0x6b, 0xfe, 0x7d, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x4f, 0xce, 0xfd, 0xff, 
+	0x3b, 0xbc, 0xf8, 0xc7, 0xfe, 0xf7, 0xff, 0xff, 
+	0xff, 0x99, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xbe, 0xfb, 0xbf, 0xff, 0xff, 0xb6, 0xfb, 
+	0xfb, 0xff, 0xff, 0xbf, 0xb7, 0xbf, 0x66, 0xff, 
+	0xed, 0xaf, 0xbf, 0xbe, 0xfa, 0xbd, 0xf4, 0xfe, 
+	0xfa, 0xa7, 0xd7, 0xb7, 0xbf, 0xe5, 0xd5, 0x9b, 
+	0x7f, 0xbf, 0xb7, 0xf9, 0xff, 0x7b, 0xed, 0xab, 
+	0xbf, 0xfe, 0xfb, 0xbf, 0xbf, 0xdd, 0xdc, 0xf5, 
+	0xff, 0x37, 0xdf, 0xfd, 0xef, 0xcd, 0xfd, 0x6f, 
+	0xfe, 0x3d, 0xf7, 0xfb, 0xbf, 0xff, 0x7f, 0xff, 
+	0xff, 0xab, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xbf, 
+	0x7f, 0xff, 0xd7, 0xff, 0x9b, 0xff, 0x7b, 0xe7, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xdf, 0x7f, 0x7f, 
+	0xff, 0xf9, 0xfb, 0xef, 0xbc, 0xf5, 0xd1, 0xaf, 
+	0xff, 0xa6, 0xff, 0xbf, 0xef, 0xbf, 0x5f, 0xeb, 
+	0xef, 0xaf, 0xff, 0x5f, 0xdf, 0x5c, 0xdf, 0xad, 
+	0xf7, 0xf5, 0xff, 0x7f, 0xff, 0xaf, 0xd9, 0xff, 
+	0xf2, 0xfb, 0xef, 0x97, 0xff, 0xfe, 0xeb, 0xff, 
+	0xd5, 0x9f, 0xfd, 0xb7, 0xf9, 0x7e, 0xfd, 0xff, 
+	0xff, 0xff, 0x65, 0xfe, 0xb7, 0x5e, 0x7b, 0xef, 
+	0xed, 0xb6, 0xff, 0xfa, 0xff, 0xf9, 0x6d, 0xb7, 
+	0xfc, 0xba, 0xf9, 0x7f, 0xff, 0xf7, 0xfa, 0x1b, 
+	0xf5, 0xf5, 0xe7, 0x5e, 0x7b, 0xed, 0xb5, 0xbf, 
+	0xfe, 0x3f, 0xff, 0x6b, 0x6f, 0x9f, 0xff, 0xdf, 
+	0x79, 0xe7, 0x9d, 0x57, 0xe6, 0xbe, 0xe9, 0x66, 
+	0xbd, 0xf7, 0x5b, 0x6d, 0xa5, 0xff, 0xfd, 0x35, 
+	0xdb, 0xd6, 0xaf, 0xd7, 0xb4, 0xd3, 0xef, 0xb7, 
+	0x9b, 0x91, 0x6f, 0x7f, 0xf9, 0xef, 0xbd, 0x77, 
+	0xde, 0xa9, 0xff, 0x7f, 0xed, 0xdc, 0xf7, 0xff, 
+	0x37, 0x4d, 0xf4, 0xf5, 0xef, 0x6c, 0xec, 0xff, 
+	0xff, 0xdb, 0x6f, 0xe5, 0xad, 0xb7, 0xfa, 0xff, 
+	0x5f, 0x5b, 0xf7, 0xfd, 0xef, 0xff, 0x7b, 0xff, 
+	0xfd, 0xbd, 0x19, 0xf9, 0xaf, 0xfd, 0xf8, 0x5b, 
+	0x6d, 0xbf, 0x95, 0xfe, 0xf7, 0xdf, 0x7e, 0xfb, 
+	0xff, 0xbf, 0xfa, 0x7f, 0xff, 0xff, 0xef, 0x86, 
+	0x3d, 0xfb, 0x7e, 0xff, 0xef, 0xbe, 0xfb, 0xff, 
+	0xff, 0x6f, 0x7e, 0xb7, 0xff, 0xf7, 0x9d, 0x7f, 
+	0xff, 0xf9, 0xf7, 0x9d, 0x79, 0x9f, 0x2f, 0xbf, 
+	0xff, 0xf3, 0xcf, 0xff, 0xff, 0x7f, 0xf7, 0xbf, 
+	0xcc, 0x57, 0xf9, 0xed, 0xff, 0xde, 0x7f, 0x63, 
+	0x65, 0xae, 0x9f, 0x7e, 0xfa, 0xeb, 0xaf, 0xbf, 
+	0xfe, 0xfb, 0xcf, 0x7e, 0x77, 0xf1, 0xf7, 0xdb, 
+	0x67, 0xaf, 0xfd, 0xf7, 0xba, 0x99, 0xf8, 0x66, 
+	0xbb, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x7f, 0xff, 
+	0xfd, 0xdf, 0xff, 0x7f, 0x7e, 0xff, 0xef, 0xff, 
+	0xff, 0xce, 0xe6, 0xbe, 0xdb, 0xff, 0xbf, 0xfd, 
+	0xf6, 0xfb, 0xff, 0xfb, 0xdf, 0xff, 0xf7, 0xff, 
+	0xef, 0xfd, 0xff, 0xfd, 0xff, 0xef, 0xbb, 0xb9, 
+	0xfd, 0xda, 0xdf, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 
+	0xff, 0x7f, 0xef, 0x8e, 0xff, 0xfe, 0x7b, 0xff, 
+	0xf5, 0xdf, 0xff, 0x6e, 0xde, 0xff, 0xeb, 0xaa, 
+	0xbf, 0xff, 0xfe, 0xdb, 0xff, 0xdf, 0x5f, 0xfd, 
+	0xb3, 0x4f, 0x7f, 0x7d, 0xfd, 0xd5, 0x57, 0xdf, 
+	0x9b, 0xff, 0xfd, 0xf7, 0xff, 0xfa, 0xeb, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfb, 0x6e, 0xbd, 0xff, 
+	0xdf, 0x7f, 0xff, 0xdd, 0xff, 0xe6, 0xff, 0xeb, 
+	0xa3, 0x8b, 0x3e, 0xfa, 0xfc, 0xf3, 0xcf, 0x3f, 
+	0xff, 0xf9, 0x47, 0x9f, 0x7f, 0xfc, 0xf0, 0x67, 
+	0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xbf, 
+	0xfe, 0xfa, 0xdf, 0xff, 0x7f, 0xfd, 0xe5, 0xd7, 
+	0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x6f, 0xfe, 
+	0xbf, 0xfe, 0xfa, 0xea, 0xaf, 0xbf, 0xfe, 0xf7, 
+	0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x7f, 0xef, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xfe, 0xeb, 
+	0xef, 0xbf, 0xaf, 0xfe, 0xff, 0xff, 0x7f, 0x5f, 
+	0xfc, 0xf7, 0xdf, 0x5f, 0x7f, 0x7d, 0xf5, 0xff, 
+	0xe6, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xeb, 
+	0x7f, 0xff, 0xfe, 0xff, 0xd7, 0xff, 0xff, 0xff, 
+	0xfd, 0xde, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xf6, 
+	0xdb, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xfb, 0xff, 0xa7, 0xdb, 0x7d, 0xff, 0xbf, 0xa7, 
+	0xfe, 0x6f, 0xfe, 0xbf, 0x69, 0xaf, 0xb7, 0xfa, 
+	0xfa, 0xeb, 0xaf, 0xbf, 0xdc, 0xa5, 0x57, 0x5d, 
+	0x7b, 0xd9, 0xf5, 0xd7, 0x5f, 0xff, 0x9b, 0xfd, 
+	0xef, 0x3f, 0xcb, 0xbf, 0xff, 0xfe, 0xff, 0xcf, 
+	0xf3, 0xf7, 0x7f, 0xee, 0xd7, 0x63, 0xff, 0xfd, 
+	0xfd, 0xf6, 0xf9, 0xc6, 0xff, 0xff, 0xfa, 0xff, 
+	0x77, 0xff, 0xff, 0xff, 0xbf, 0xf2, 0xff, 0xf5, 
+	0xed, 0xff, 0xff, 0xee, 0xff, 0xef, 0xff, 0xbb, 
+	0xf9, 0xfb, 0xff, 0xbf, 0xff, 0xec, 0xb7, 0xef, 
+	0xfe, 0xff, 0xff, 0x73, 0x97, 0xff, 0x5f, 0xff, 
+	0x7f, 0x7f, 0xff, 0xfb, 0x6f, 0xfc, 0xb7, 0xfe, 
+	0xfb, 0xee, 0xbf, 0xee, 0xfe, 0xbf, 0xe9, 0x9f, 
+	0x3b, 0xfa, 0xe7, 0xd7, 0x5b, 0x77, 0xfc, 0xf0, 
+	0xff, 0x98, 0xff, 0xbf, 0xaf, 0x7f, 0xbe, 0xfa, 
+	0xef, 0xfb, 0xeb, 0xf9, 0xfe, 0xff, 0x7f, 0x7f, 
+	0xef, 0xdf, 0xbf, 0xf7, 0xff, 0x7f, 0xe6, 0xef, 
+	0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xef, 0xbd, 0xf7, 
+	0xfe, 0x56, 0xfe, 0xfd, 0x77, 0xdc, 0x74, 0x9f, 
+	0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xfa, 0xff, 0xfe, 
+	0xff, 0xff, 0xed, 0xf7, 0xef, 0xd7, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0xdf, 0xf7, 0xff, 0x67, 
+	0xee, 0xd5, 0xbf, 0xff, 0x7f, 0x7f, 0xd7, 0xff, 
+	0xff, 0x5b, 0xff, 0xfa, 0xf7, 0xbf, 0xdf, 0xfa, 
+	0xba, 0xfb, 0xf7, 0x7d, 0x9a, 0xff, 0x4f, 0xff, 
+	0xed, 0xf8, 0xfd, 0xfb, 0xdf, 0xff, 0x7f, 0xc5, 
+	0xf9, 0xfe, 0xff, 0xf5, 0xbf, 0xfd, 0xff, 0xff, 
+	0x7f, 0x66, 0xff, 0xef, 0xff, 0xfd, 0xde, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xf7, 0x9f, 0xb7, 0xf9, 0xff, 
+	0xe9, 0xad, 0xff, 0xbe, 0xfe, 0x7b, 0xcc, 0xff, 
+	0xff, 0x5f, 0xfe, 0xbf, 0x6d, 0x7f, 0xf5, 0xff, 
+	0xff, 0xfe, 0x6f, 0xf6, 0xdf, 0xbe, 0xff, 0xfd, 
+	0xbf, 0x5f, 0xf2, 0xdd, 0xe9, 0xff, 0x7e, 0xdd, 
+	0xff, 0xcf, 0x5d, 0xbf, 0xff, 0xf7, 0xff, 0x9b, 
+	0xff, 0xaf, 0xbe, 0xff, 0xef, 0xaf, 0xdf, 0xfc, 
+	0xef, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xf6, 0xff, 
+	0xff, 0xbf, 0xfd, 0xff, 0x86, 0xff, 0x9b, 0xbf, 
+	0xff, 0xff, 0xfb, 0xff, 0x6f, 0xf3, 0xf7, 0xc5, 
+	0xf2, 0xfe, 0xe5, 0xf7, 0xfd, 0xff, 0xfe, 0xff, 
+	0x8f, 0xd9, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfe, 
+	0xdf, 0xeb, 0xff, 0x7d, 0xf9, 0xb5, 0x77, 0xeb, 
+	0x7e, 0xff, 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xbf, 
+	0xcf, 0xfb, 0xff, 0xb9, 0xd7, 0x5f, 0x3a, 0xfb, 
+	0x5f, 0x7b, 0x3f, 0xf7, 0xba, 0xcb, 0x6f, 0xbd, 
+	0xf5, 0xff, 0x9b, 0xf5, 0xec, 0xb7, 0xff, 0xfd, 
+	0xef, 0xfc, 0xb3, 0xfe, 0xff, 0xdf, 0x5f, 0x67, 
+	0x9d, 0xdf, 0xfc, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 
+	0xfe, 0xff, 0xb3, 0xdb, 0xfd, 0xbb, 0xf9, 0x6f, 
+	0xff, 0xf5, 0xf5, 0xf3, 0xed, 0xb3, 0xcf, 0x74, 
+	0xd3, 0x4a, 0xfb, 0xbb, 0x99, 0xff, 0xee, 0xba, 
+	0x75, 0xff, 0x7b, 0xaf, 0xf9, 0x75, 0x56, 0x55, 
+	0xd4, 0xf3, 0xfe, 0x33, 0xfd, 0xbf, 0xfb, 0xfe, 
+	0x6c, 0xec, 0xbf, 0xf7, 0xfb, 0xff, 0xbd, 0xef, 
+	0xff, 0x7e, 0xbd, 0x5f, 0x2b, 0x1f, 0xf7, 0xef, 
+	0xf9, 0xfb, 0x7f, 0xbf, 0xbf, 0x99, 0xfb, 0xef, 
+	0xbf, 0xff, 0x7f, 0xee, 0xff, 0xbf, 0x5d, 0xf7, 
+	0xd7, 0x4b, 0x2f, 0xed, 0xbf, 0xda, 0x5f, 0x7f, 
+	0xfd, 0xcf, 0xe6, 0xfd, 0xff, 0xfe, 0xf3, 0xaf, 
+	0xff, 0xff, 0x76, 0xfb, 0xed, 0x7e, 0xff, 0xfd, 
+	0xff, 0x9d, 0x7f, 0xfb, 0xdd, 0xf7, 0xb5, 0x79, 
+	0xff, 0x7f, 0xfd, 0x79, 0xdf, 0xdf, 0xff, 0xff, 
+	0xf1, 0xc6, 0xff, 0xde, 0xfa, 0xff, 0xef, 0xf7, 
+	0x7f, 0xfe, 0x79, 0x6f, 0xec, 0xd7, 0x16, 0xfb, 
+	0xcd, 0xb7, 0xef, 0xfe, 0xf3, 0x8d, 0x75, 0xff, 
+	0x7d, 0xf7, 0xdb, 0x77, 0x3f, 0xbd, 0xf4, 0xbf, 
+	0x99, 0xf9, 0xf7, 0xdf, 0x3f, 0xbf, 0xff, 0xff, 
+	0xff, 0x3f, 0xff, 0xff, 0xef, 0xbf, 0x7f, 0xfe, 
+	0xff, 0xc7, 0x3e, 0xfb, 0xcf, 0xe6, 0xfe, 0xfe, 
+	0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0x7d, 0xf7, 0xef, 0xfd, 0xff, 0xb5, 0xdb, 
+	0xfe, 0xbb, 0xa9, 0xff, 0xfa, 0xef, 0xef, 0xde, 
+	0xfe, 0xff, 0xdb, 0x6d, 0xdf, 0xff, 0xb5, 0xdf, 
+	0xfa, 0xf9, 0xff, 0xf5, 0xd7, 0xff, 0x6a, 0xde, 
+	0x9f, 0x7c, 0xf2, 0xcf, 0x7f, 0xff, 0xfd, 0x7f, 
+	0xab, 0xff, 0x7e, 0xf1, 0xdd, 0x7f, 0xfb, 0xf5, 
+	0xf7, 0xdf, 0xdf, 0x9b, 0xff, 0xaf, 0xff, 0x7f, 
+	0xef, 0xfd, 0xe7, 0xdf, 0xff, 0xfa, 0xff, 0xff, 
+	0xef, 0xfd, 0xdf, 0xdf, 0xff, 0xef, 0xff, 0xff, 
+	0xe6, 0xff, 0xfb, 0xf2, 0xcf, 0x3e, 0xbf, 0xf8, 
+	0xf3, 0x8f, 0x3e, 0xf7, 0xf9, 0xc7, 0x9f, 0x7f, 
+	0xf6, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 
+	0xeb, 0xef, 0xff, 0xef, 0xff, 0xeb, 0xef, 0xff, 
+	0xf3, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xbf, 0xfa, 0xef, 0xff, 
+	0xef, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0x7f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 
+	0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xee, 0xff, 0xff, 0xfd, 0xf5, 0xdf, 0x7f, 0x5f, 
+	0x7d, 0xf5, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xbf, 
+	0xfe, 0xbf, 0xff, 0xff, 0xbf, 0xfe, 0xee, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xd3, 0xff, 0xbf, 0xfb, 0xf2, 
+	0xfb, 0x6f, 0x7d, 0xff, 0xe5, 0x77, 0xdb, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0x6f, 0xf2, 0xff, 0xab, 
+	0xae, 0xbf, 0xe6, 0x70, 0xcb, 0x2e, 0x3d, 0xbc, 
+	0x75, 0xd7, 0x5f, 0x7f, 0xf9, 0xf1, 0x47, 0x0f, 
+	0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xdd, 0xfc, 0xec, 0xff, 0xf7, 0xf7, 0xd8, 
+	0x73, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xc6, 0xbf, 
+	0xff, 0xfb, 0xeb, 0xef, 0xdf, 0xbf, 0xab, 0xeb, 
+	0x5f, 0xff, 0xff, 0xfd, 0xf7, 0x7f, 0xef, 0xff, 
+	0xef, 0xef, 0x9f, 0xf9, 0xbf, 0xdf, 0xff, 0xfd, 
+	0xf3, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xfb, 0xbf, 
+	0xd3, 0xaf, 0xbf, 0xf7, 0x7f, 0xff, 0xfe, 0x6f, 
+	0xfe, 0xf7, 0x7e, 0xf8, 0xee, 0xbf, 0xbf, 0xde, 
+	0x3e, 0xe9, 0xd9, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f, 
+	0xff, 0xfd, 0xf7, 0x7f, 0x9b, 0xff, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf6, 0x9f, 0xff, 0x79, 0xf5, 0xdf, 
+	0xa9, 0xfe, 0xfb, 0xcf, 0xf5, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xcf, 0x7b, 0x7b, 0xff, 0xef, 0xb9, 
+	0xdf, 0x9b, 0x7f, 0xee, 0xf3, 0xdf, 0xd9, 0x7f, 
+	0xcc, 0xf2, 0xf7, 0xdf, 0xf7, 0xbf, 0xd9, 0xff, 
+	0xfa, 0xfb, 0xff, 0xbf, 0xfe, 0x2e, 0xcb, 0x6f, 
+	0x3f, 0xcf, 0xf9, 0xff, 0xdf, 0x7f, 0xe5, 0xe5, 
+	0xf7, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xfb, 0x3f, 
+	0xff, 0xef, 0xfe, 0xdf, 0xef, 0x7c, 0x7f, 0xbf, 
+	0xfe, 0xdf, 0xff, 0xbf, 0xaf, 0xf7, 0xbf, 0x9b, 
+	0xfd, 0xfd, 0x3b, 0xef, 0xf8, 0x33, 0xed, 0xff, 
+	0xdf, 0xff, 0xff, 0xf4, 0x75, 0xfe, 0xe9, 0xfd, 
+	0xfb, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xcf, 
+	0xff, 0xfe, 0xec, 0xfb, 0xff, 0xdb, 0xdf, 0xbf, 
+	0xff, 0xfe, 0x4e, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xbb, 0xf9, 0xff, 0xfb, 0xff, 0xa7, 0xff, 0x7e, 
+	0xff, 0xed, 0xb7, 0xff, 0xfd, 0xee, 0xed, 0x7d, 
+	0xfe, 0xff, 0xe7, 0xbe, 0xff, 0x6f, 0xfc, 0xff, 
+	0xfe, 0xfb, 0xeb, 0xb5, 0xfd, 0xf6, 0xdb, 0x27, 
+	0x3f, 0xff, 0xfd, 0xbf, 0xcf, 0xef, 0xbf, 0xfd, 
+	0xf6, 0x7f, 0x99, 0xff, 0xaf, 0xdf, 0xfe, 0xff, 
+	0xf3, 0xbf, 0x3f, 0xff, 0xfb, 0x5f, 0x7f, 0xfd, 
+	0xff, 0xf7, 0xff, 0x5f, 0xed, 0xfd, 0xff, 0xa6, 
+	0xff, 0xeb, 0x3f, 0xd6, 0xf9, 0xe7, 0xfb, 0xef, 
+	0xff, 0xfe, 0x7f, 0x7e, 0xff, 0xfd, 0xf7, 0xf5, 
+	0xff, 0xff, 0xff, 0xaf, 0xd9, 0xff, 0xda, 0x4f, 
+	0xfc, 0xff, 0xfd, 0xff, 0xeb, 0xbf, 0xff, 0x9f, 
+	0xff, 0xb2, 0xeb, 0x4e, 0xef, 0xf5, 0xd7, 0xff, 
+	0x6d, 0xfe, 0xe7, 0xff, 0xfb, 0x1f, 0xff, 0xbf, 
+	0xff, 0xde, 0xeb, 0xf9, 0xfb, 0xf7, 0xe7, 0xba, 
+	0x53, 0x6f, 0xbd, 0xf5, 0xff, 0x9b, 0xf5, 0xf9, 
+	0xff, 0xfe, 0x7d, 0xff, 0xff, 0xbf, 0xfe, 0x7a, 
+	0xff, 0xfb, 0x67, 0x98, 0xff, 0xd6, 0xeb, 0xaf, 
+	0x9f, 0x57, 0xe6, 0xfe, 0xe9, 0xe5, 0xdf, 0xbb, 
+	0xfb, 0xfd, 0xaf, 0xff, 0x3e, 0xf5, 0xfd, 0xff, 
+	0xfa, 0x57, 0xf4, 0xd2, 0x4a, 0xb3, 0xbb, 0x99, 
+	0x1f, 0xae, 0xad, 0x71, 0xff, 0x3b, 0xef, 0xa9, 
+	0xb7, 0xce, 0xb5, 0xfe, 0xf3, 0xef, 0x37, 0xdd, 
+	0xbe, 0xfb, 0xea, 0x64, 0xec, 0xbf, 0xfe, 0xfe, 
+	0xdf, 0xaf, 0xef, 0xbf, 0xfa, 0xee, 0xdb, 0xff, 
+	0x7f, 0xf7, 0xed, 0x5f, 0xfe, 0x7f, 0xff, 0xbf, 
+	0x99, 0xfb, 0xef, 0xff, 0xfe, 0x3f, 0xfb, 0xff, 
+	0xbf, 0xfe, 0xfa, 0xff, 0xdf, 0x7b, 0xe5, 0xbf, 
+	0x92, 0x5f, 0x7f, 0xfd, 0x0f, 0xc6, 0x3d, 0xff, 
+	0xff, 0xf3, 0xff, 0x3f, 0xff, 0xf6, 0xdb, 0x6f, 
+	0x7e, 0xfb, 0xfd, 0xf7, 0x9d, 0xff, 0xf7, 0xdd, 
+	0xf7, 0x9d, 0x79, 0xdf, 0x7f, 0xff, 0xf9, 0xf7, 
+	0x9f, 0x7f, 0xfe, 0xf9, 0xf7, 0xbf, 0xdf, 0x3a, 
+	0xe3, 0x6d, 0xff, 0x7d, 0xf6, 0x79, 0x6f, 0xec, 
+	0xdb, 0x3e, 0xfb, 0xcf, 0xb3, 0xfd, 0x76, 0xfb, 
+	0xed, 0x7e, 0xf7, 0xdd, 0xe7, 0xdb, 0x57, 0x2f, 
+	0xfd, 0xf4, 0xaa, 0x9b, 0xf9, 0xf6, 0xef, 0x7f, 
+	0xbf, 0xfd, 0xff, 0xdb, 0xef, 0xff, 0xfd, 0xff, 
+	0xbf, 0x7f, 0xfe, 0xf7, 0xcf, 0x36, 0xfb, 0xcf, 
+	0xe6, 0x7e, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 
+	0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xef, 0xfd, 
+	0xff, 0xb5, 0xdb, 0xfe, 0xbb, 0xb9, 0xff, 0xfe, 
+	0xfb, 0x77, 0xfe, 0xff, 0xff, 0xef, 0xbf, 0xff, 
+	0xfd, 0xb5, 0x9a, 0xfe, 0xfb, 0xf7, 0xff, 0xd7, 
+	0xdf, 0x6e, 0xde, 0xbd, 0xfd, 0xf6, 0xdf, 0x37, 
+	0xff, 0xfd, 0xf3, 0xdb, 0x77, 0x7e, 0x95, 0x4d, 
+	0x7f, 0xed, 0x6e, 0xb5, 0xdf, 0xdf, 0x9b, 0xff, 
+	0xff, 0xbf, 0xee, 0xf3, 0xff, 0xf5, 0xff, 0xfe, 
+	0xfa, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x5f, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0xa3, 0x8f, 
+	0x3e, 0xfb, 0xf8, 0xf3, 0x8f, 0x1e, 0x7f, 0xda, 
+	0xe7, 0xb7, 0x7f, 0xee, 0xf9, 0x47, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xff, 0xf7, 
+	0xeb, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f, 
+	0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 
+	0xfe, 0xff, 0xbf, 0xff, 0xfd, 0xfa, 0xff, 0xf5, 
+	0xbf, 0xff, 0xfe, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfe, 0xfa, 0xfb, 
+	0xaf, 0xff, 0xfe, 0xf3, 0xdd, 0x61, 0xbd, 0x57, 
+	0xdf, 0xd7, 0x5f, 0x7d, 0xf5, 0xff, 0xe6, 0xff, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xcb, 0xbf, 0xff, 
+	0xdc, 0x7f, 0xde, 0xfb, 0xf7, 0xff, 0xe5, 0xff, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 0xfb, 0xff, 
+	0xff, 0xfc, 0xff, 0xfb, 0xef, 0x7f, 0xf7, 0xe7, 
+	0x27, 0xdf, 0x7f, 0xfb, 0xc9, 0xb7, 0xfb, 0x6f, 
+	0xfe, 0xff, 0x6b, 0xad, 0xbd, 0xfe, 0xfa, 0x6b, 
+	0xae, 0x36, 0xee, 0xf5, 0xd7, 0x5b, 0x7d, 0xf9, 
+	0x75, 0xd7, 0x0b, 0xff, 0x9b, 0xcd, 0xef, 0xff, 
+	0xef, 0xdf, 0xff, 0xfe, 0xfa, 0xff, 0xb7, 0xef, 
+	0xfd, 0xe5, 0xf9, 0xd3, 0xe7, 0xfe, 0x7f, 0xff, 
+	0xd9, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 
+	0xdd, 0xfb, 0xbb, 0x7f, 0xff, 0xfb, 0xdc, 0xfd, 
+	0xff, 0xff, 0xfe, 0xed, 0xeb, 0xbf, 0xe9, 0xff, 
+	0xdf, 0xff, 0xf7, 0xdd, 0xfb, 0xff, 0x7f, 0xf7, 
+	0xff, 0xdf, 0xff, 0xaf, 0xbf, 0xfa, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0xdc, 0xbf, 0xde, 0xee, 0xeb, 
+	0xad, 0x3f, 0x6e, 0x76, 0xc3, 0x59, 0x7f, 0xfc, 
+	0xf5, 0xd7, 0xdd, 0x7f, 0xe5, 0xd1, 0x7b, 0x19, 
+	0xff, 0xbb, 0xdf, 0xfd, 0xf6, 0xda, 0xee, 0xdf, 
+	0xbe, 0xfd, 0xbf, 0xbf, 0x37, 0xfb, 0xef, 0xbd, 
+	0x35, 0x5f, 0xf7, 0x7f, 0xe6, 0xee, 0xfb, 0xbe, 
+	0x7f, 0xee, 0xf9, 0x9e, 0x9f, 0xff, 0xff, 0xfc, 
+	0xfe, 0xff, 0x77, 0xfc, 0xf2, 0x8f, 0x3e, 0xf7, 
+	0xbf, 0xf1, 0xff, 0xff, 0xdf, 0xaf, 0xbf, 0xe6, 
+	0xfa, 0xeb, 0xed, 0xff, 0xfb, 0xbe, 0x97, 0xdf, 
+	0x7f, 0xf7, 0xfd, 0xf7, 0xff, 0x67, 0xfc, 0xff, 
+	0xff, 0xf7, 0xfd, 0xff, 0xd5, 0x37, 0xdf, 0xbb, 
+	0xfd, 0xfd, 0xcf, 0xff, 0xdf, 0x76, 0xbb, 0xbd, 
+	0xf6, 0xff, 0x1a, 0xfd, 0x8f, 0xff, 0xfb, 0xdc, 
+	0xf1, 0xff, 0xff, 0xef, 0xec, 0xe5, 0xe7, 0x9f, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7e, 0xe6, 
+	0xff, 0xaf, 0xff, 0xbf, 0xf5, 0xf6, 0xff, 0xff, 
+	0xbe, 0xfe, 0xef, 0xfe, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xaf, 0xf9, 0xff, 0xfa, 0xff, 
+	0xbf, 0xfb, 0xee, 0x7f, 0xef, 0xb3, 0xdf, 0xec, 
+	0xf6, 0xdf, 0x7f, 0xc7, 0x9d, 0x77, 0xde, 0xff, 
+	0x6f, 0xfe, 0x9d, 0x76, 0xff, 0xe7, 0x9f, 0xdf, 
+	0x7c, 0xfb, 0xef, 0xff, 0xf7, 0xef, 0xfb, 0x4d, 
+	0x2f, 0xbf, 0xfc, 0xf2, 0x7f, 0x9b, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xef, 0xdf, 0x3f, 0xff, 0xfc, 
+	0xf7, 0xdf, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xdd, 0xbf, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0x7c, 0xbe, 0xff, 0xff, 0x7f, 0xfe, 
+	0xff, 0xff, 0x7f, 0x3e, 0xff, 0xff, 0x8f, 0xd9, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x5f, 0x6e, 
+	0xef, 0x7f, 0xff, 0xdf, 0xff, 0x4b, 0x7f, 0x3d, 
+	0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xff, 0x9f, 0x3b, 
+	0xff, 0xff, 0xbd, 0x9c, 0x2e, 0xdb, 0x55, 0x2f, 
+	0x9d, 0xfd, 0xd6, 0x5b, 0x6b, 0xb5, 0xf5, 0xff, 
+	0x9b, 0xf5, 0xdf, 0xa7, 0x9f, 0x7f, 0xff, 0xc9, 
+	0xb7, 0xdf, 0x78, 0xd6, 0x5b, 0x67, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0xff, 
+	0xff, 0xff, 0x1f, 0xff, 0xab, 0xfb, 0xaf, 0x60, 
+	0xaf, 0xdd, 0x6b, 0x7b, 0xfd, 0xf5, 0xd7, 0x4b, 
+	0xb7, 0xbb, 0x99, 0xff, 0xf7, 0xbb, 0xf6, 0xda, 
+	0xfb, 0xe2, 0xbb, 0xa5, 0x7f, 0xbb, 0xfc, 0xda, 
+	0xfe, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0x6c, 0xec, 
+	0xff, 0xdd, 0xff, 0xf7, 0xdd, 0xb3, 0xdc, 0x7e, 
+	0xe9, 0xf5, 0xfc, 0xfd, 0xf5, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xbf, 0x99, 0xfb, 0xff, 0xa7, 0xff, 
+	0x7f, 0xfe, 0x2c, 0xa7, 0x5f, 0xea, 0xb7, 0xdf, 
+	0x7b, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0x8f, 
+	0xe6, 0xfd, 0xff, 0xf2, 0xdb, 0xbe, 0xbb, 0xdd, 
+	0xf2, 0xfb, 0xef, 0xee, 0xff, 0xed, 0x77, 0xff, 
+	0x7d, 0xf7, 0xfd, 0xf7, 0xbd, 0x79, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xfe, 0x77, 0xde, 
+	0x37, 0xdf, 0xf4, 0xcb, 0x7f, 0x9f, 0x7d, 0xf6, 
+	0x79, 0x6f, 0xec, 0xff, 0x34, 0xfb, 0xec, 0xb3, 
+	0xef, 0xfc, 0xfb, 0xcd, 0x75, 0xfc, 0xfd, 0x74, 
+	0xd3, 0x4f, 0x3f, 0xbd, 0xf4, 0xbf, 0x99, 0xf9, 
+	0xf7, 0xfb, 0x6f, 0xbf, 0xfd, 0xff, 0xdf, 0x3f, 
+	0xff, 0xff, 0xff, 0x77, 0x7f, 0xec, 0xb5, 0xd7, 
+	0x3e, 0xfb, 0xcf, 0xe6, 0xbe, 0xff, 0xff, 0xfb, 
+	0xde, 0xfb, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0x5f, 0xfb, 0xed, 0xb7, 0xd7, 0xfe, 0xbb, 
+	0xa9, 0xff, 0xe7, 0xf9, 0xff, 0xfe, 0x7f, 0xf7, 
+	0xff, 0x2d, 0xf6, 0xf3, 0xb5, 0xdf, 0xff, 0x7f, 
+	0xfd, 0xf5, 0xd7, 0xff, 0x6a, 0xde, 0xdf, 0xfd, 
+	0xf3, 0x9f, 0x7f, 0xfe, 0xff, 0x77, 0x8b, 0xfc, 
+	0x7d, 0x95, 0xd5, 0xfe, 0xff, 0xfe, 0xfb, 0xee, 
+	0xdf, 0x98, 0xff, 0xff, 0xfe, 0x7f, 0xef, 0xfd, 
+	0xef, 0xff, 0xcf, 0x32, 0xbf, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xe6, 0xff, 
+	0xff, 0xb3, 0xcf, 0x3f, 0xff, 0xf8, 0xf3, 0x8f, 
+	0x3e, 0xff, 0xf1, 0x67, 0x9f, 0x7f, 0xf4, 0xd1, 
+	0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xfa, 0xfb, 0x7f, 
+	0xff, 0xf9, 0xfb, 0x9f, 0xaf, 0xff, 0xfb, 0xf7, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbe, 
+	0xfe, 0xeb, 0xdf, 0xff, 0xfd, 0xf5, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xaf, 0xff, 
+	0xff, 0xe7, 0xbf, 0xbf, 0xff, 0xff, 0xea, 0x3f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0xff, 0x66, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0x7e, 0xff, 0xff, 0xfe, 0xff, 0x7f, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf9, 0xff, 
+	0xff, 0xfb, 0xef, 0xff, 0xfc, 0xf2, 0xfb, 0x6f, 
+	0x77, 0xfb, 0xff, 0x1f, 0x5f, 0x7e, 0xff, 0xfd, 
+	0xf7, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 0xae, 0xbd, 
+	0xfa, 0x78, 0xc3, 0x2e, 0xbf, 0xbe, 0xf1, 0xd7, 
+	0x4f, 0x6b, 0xdd, 0x75, 0xd7, 0x5c, 0xf7, 0x9b, 
+	0x7f, 0xff, 0xff, 0xef, 0x31, 0xcf, 0x37, 0xfb, 
+	0xff, 0xfc, 0x97, 0x7f, 0xf4, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xc6, 0xfb, 0xff, 0xfc, 
+	0xfb, 0x63, 0x7e, 0xf7, 0xfd, 0xef, 0xab, 0xff, 
+	0xf7, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xbe, 
+	0x9f, 0xf9, 0xff, 0xff, 0xbd, 0xaf, 0xfe, 0xfe, 
+	0xfb, 0x7d, 0xf7, 0x5f, 0xfd, 0xf7, 0xfd, 0xff, 
+	0xe9, 0xff, 0xfe, 0x7f, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xfe, 0xfc, 0xeb, 0xab, 0xff, 0xee, 0x7a, 0xcb, 
+	0xdf, 0xee, 0xfd, 0xf5, 0xc5, 0xff, 0x6f, 0x7d, 
+	0xf1, 0x7d, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xb7, 
+	0xdb, 0xff, 0xef, 0xfe, 0xf7, 0xde, 0xf5, 0xff, 
+	0xda, 0xfc, 0xff, 0x53, 0xff, 0xfe, 0xff, 0xe6, 
+	0xef, 0xfa, 0xbf, 0xbb, 0xec, 0xb7, 0xe3, 0xaf, 
+	0xbf, 0xee, 0xf3, 0xf7, 0xef, 0xff, 0xdf, 0xaf, 
+	0xff, 0x7f, 0xff, 0xaf, 0xf9, 0xff, 0xfe, 0xf3, 
+	0xcf, 0xbf, 0xaf, 0xcf, 0x7b, 0x4f, 0xff, 0xef, 
+	0xf5, 0xff, 0xfe, 0xee, 0xff, 0x3f, 0x77, 0xff, 
+	0x6b, 0xfe, 0xfe, 0xfe, 0xfb, 0x6f, 0xef, 0xf5, 
+	0xff, 0x66, 0x6d, 0xf7, 0xfb, 0xff, 0x3f, 0xff, 
+	0xff, 0xfb, 0xe7, 0x6d, 0xfd, 0x9b, 0xff, 0xff, 
+	0xff, 0x7f, 0xf8, 0xff, 0xff, 0xfe, 0xe9, 0xed, 
+	0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0x1f, 0x9d, 
+	0xee, 0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0x7e, 
+	0xff, 0x7f, 0xf9, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xef, 0xff, 0xdb, 0xff, 0xfe, 0xaf, 0xf9, 
+	0xff, 0x7f, 0xff, 0xa4, 0xbf, 0x6e, 0xaa, 0xdf, 
+	0xab, 0x7b, 0xdd, 0xde, 0xd7, 0xef, 0x7f, 0x7d, 
+	0xff, 0xd7, 0xfb, 0x6f, 0xfc, 0xdb, 0xfe, 0xfb, 
+	0x2f, 0xbe, 0xff, 0xfe, 0xf3, 0x2d, 0x7f, 0xfb, 
+	0xcf, 0xf5, 0xff, 0x7f, 0xbf, 0xef, 0xf7, 0x7f, 
+	0x99, 0xff, 0xdf, 0x7f, 0xff, 0xdb, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xbb, 0xef, 0xff, 0xff, 0xf7, 0xff, 
+	0xef, 0xff, 0xff, 0xfe, 0xff, 0xa6, 0xfd, 0xfb, 
+	0xef, 0xe7, 0xff, 0xff, 0xfb, 0xaf, 0xd5, 0xfb, 
+	0xff, 0x7f, 0x73, 0xe5, 0xe7, 0xf7, 0xff, 0xff, 
+	0xff, 0xaf, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xf7, 0x5e, 0xf9, 0x7f, 0xff, 0xff, 0x5f, 0xf6, 
+	0xf8, 0xaf, 0xef, 0xff, 0xff, 0xff, 0x6d, 0xee, 
+	0xbf, 0x9e, 0x1e, 0xdf, 0xff, 0xbf, 0xff, 0xfb, 
+	0xeb, 0x5c, 0xff, 0xbf, 0xdd, 0x54, 0x53, 0xaf, 
+	0x3f, 0xfd, 0xff, 0x1b, 0xf5, 0xef, 0xf7, 0x9f, 
+	0x6f, 0xfe, 0xef, 0xbf, 0x9f, 0xfa, 0xd7, 0xf9, 
+	0xaf, 0xbd, 0xf5, 0xf7, 0x7b, 0xef, 0x9f, 0x57, 
+	0xe6, 0xfe, 0xff, 0xf3, 0xdb, 0x7f, 0xff, 0xfd, 
+	0x3f, 0xbd, 0xf7, 0xf7, 0xff, 0x7f, 0x93, 0xeb, 
+	0xf7, 0xdd, 0xe4, 0xab, 0xbb, 0x91, 0xff, 0xef, 
+	0xfc, 0xf5, 0xee, 0x2b, 0xef, 0xdb, 0xef, 0x7e, 
+	0xd7, 0xfe, 0x73, 0xef, 0xfe, 0xd7, 0xde, 0x5a, 
+	0xed, 0x64, 0xec, 0xff, 0xbf, 0xf6, 0xf7, 0xdf, 
+	0xff, 0xff, 0xdb, 0x7b, 0x7f, 0xff, 0x7f, 0xfd, 
+	0x10, 0x5a, 0xff, 0x85, 0xdd, 0xbf, 0x99, 0xfb, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xce, 0xf7, 0xdf, 0xff, 0xa5, 0x25, 0xf4, 0x7f, 
+	0xaf, 0xfd, 0x6f, 0xe6, 0xfd, 0xff, 0xfe, 0xff, 
+	0xee, 0xbb, 0xff, 0x7f, 0xff, 0xed, 0xfe, 0xff, 
+	0xdd, 0xde, 0x9f, 0xff, 0xbf, 0xff, 0xfe, 0x9d, 
+	0x71, 0xff, 0x7f, 0xdc, 0xfd, 0xd7, 0x7f, 0xff, 
+	0xbf, 0x7f, 0xd6, 0xff, 0x57, 0x3e, 0xff, 0xfc, 
+	0xff, 0xcf, 0x3e, 0x7b, 0x6f, 0xec, 0xdf, 0xf6, 
+	0xbb, 0x6d, 0xb3, 0xff, 0xfe, 0xf3, 0xcf, 0x71, 
+	0xfb, 0xfd, 0xe5, 0x9f, 0x6b, 0xbf, 0xc1, 0xc6, 
+	0xad, 0x9b, 0xf9, 0xf3, 0xdf, 0x6f, 0xbf, 0xfd, 
+	0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x7d, 0xff, 
+	0xff, 0xfb, 0xe7, 0x9f, 0xff, 0xce, 0xe6, 0x7e, 
+	0xff, 0xfe, 0xfb, 0xee, 0xbb, 0xff, 0xff, 0xfe, 
+	0xeb, 0xff, 0xff, 0xdf, 0xfd, 0xbf, 0xff, 0xfd, 
+	0xfd, 0xdf, 0xbb, 0xb9, 0xff, 0xfb, 0xeb, 0xff, 
+	0xfe, 0xfb, 0x7f, 0xcb, 0x2f, 0x7c, 0xfd, 0xbf, 
+	0x3e, 0x5e, 0xf9, 0xfd, 0xcf, 0x3f, 0xdf, 0x6e, 
+	0xde, 0xdf, 0xfd, 0xfb, 0x9d, 0x77, 0xbe, 0xdd, 
+	0xea, 0x8b, 0xdf, 0xfe, 0xd3, 0xcf, 0x13, 0xd9, 
+	0xfe, 0xf3, 0xcf, 0xdf, 0x9b, 0xff, 0xaf, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xbf, 0xfe, 0xfe, 0xd7, 
+	0x4b, 0xff, 0xf7, 0xe5, 0xdf, 0xfb, 0x7e, 0xdd, 
+	0xff, 0xe6, 0xff, 0xef, 0xf3, 0xcf, 0x2f, 0xf7, 
+	0xf8, 0xa3, 0x8b, 0x3d, 0xfd, 0xd1, 0xe7, 0x1f, 
+	0x7d, 0xfc, 0xf9, 0xc7, 0x9e, 0xbf, 0xf9, 0xff, 
+	0xfb, 0xef, 0xff, 0xfb, 0xfd, 0xff, 0xfb, 0x3f, 
+	0xff, 0xfd, 0xf5, 0x97, 0xff, 0xfc, 0xfd, 0xc7, 
+	0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xfb, 0xbf, 0xff, 0xba, 0xee, 0xff, 0x7f, 0xfd, 
+	0xf5, 0xff, 0x7f, 0x7f, 0xff, 0xef, 0xff, 0x9b, 
+	0xff, 0xbf, 0xff, 0xff, 0xef, 0x9f, 0xff, 0xff, 
+	0xfb, 0xe7, 0xdf, 0xff, 0x7d, 0xf1, 0xd5, 0xdf, 
+	0xff, 0xfd, 0xf5, 0xff, 0xe6, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfe, 
+	0xff, 0x5f, 0x7f, 0xfd, 0xe7, 0xff, 0xff, 0xff, 
+	0xbf, 0xf9, 0xff, 0xf6, 0xcb, 0x6f, 0xaf, 0xbf, 
+	0xfe, 0xfb, 0x79, 0xaf, 0x7f, 0xe5, 0xff, 0xf7, 
+	0x7f, 0xfb, 0xef, 0x97, 0xff, 0x6f, 0xfa, 0xbf, 
+	0xab, 0xaf, 0x3d, 0xe6, 0xfa, 0xeb, 0xad, 0xbf, 
+	0xfe, 0x45, 0xd3, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0x5a, 0xff, 0x9b, 0xff, 0xe7, 0x5f, 0xff, 0xf0, 
+	0xef, 0xd7, 0xff, 0xff, 0xee, 0xff, 0x7f, 0xfe, 
+	0xd9, 0x9f, 0xe7, 0xdf, 0xff, 0xff, 0xd9, 0xc6, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0x7f, 0xff, 0xf7, 0x3f, 0xb7, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xbb, 0xe9, 0xff, 0xff, 0xff, 
+	0xaf, 0x7d, 0xdf, 0xff, 0xff, 0xfb, 0xdf, 0xdf, 
+	0xc6, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x6b, 0xfe, 0xbf, 0xff, 0xfe, 0xef, 0x2f, 0xfb, 
+	0xff, 0x7a, 0xcd, 0x7f, 0x6d, 0xf1, 0xb5, 0xe7, 
+	0x7f, 0xef, 0xbd, 0xf7, 0xff, 0x99, 0xff, 0xbf, 
+	0xff, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xdf, 
+	0xf6, 0xf7, 0xee, 0x73, 0xff, 0xfd, 0xdf, 0xff, 
+	0xde, 0x7f, 0xe6, 0xff, 0xef, 0xbf, 0xbf, 0xfe, 
+	0xfa, 0xe7, 0x2f, 0xad, 0xfd, 0x7f, 0xf7, 0x1d, 
+	0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xf9, 0xfe, 0xf4, 
+	0xfe, 0xbf, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xef, 
+	0xb5, 0xff, 0xff, 0x67, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xdf, 0xfa, 0xdf, 0x7f, 0xef, 0xb9, 
+	0xff, 0xd6, 0xfe, 0xfb, 0xff, 0xef, 0xdf, 0x7c, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xfa, 0xdf, 0xe8, 0x7f, 0xe7, 0xff, 0xfe, 0xff, 
+	0xff, 0x1d, 0x7d, 0xf6, 0x7a, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xdf, 0xcd, 
+	0xff, 0xff, 0x7e, 0xbd, 0xff, 0x9f, 0xdf, 0x4f, 
+	0xff, 0xaf, 0xf9, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0xf6, 0xfb, 0xef, 0xfe, 0xfe, 0xd7, 0xff, 0xd7, 
+	0x7f, 0xff, 0xfd, 0xee, 0xff, 0xf7, 0x6f, 0xfc, 
+	0x7f, 0xee, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 
+	0xef, 0x77, 0xff, 0x7f, 0x77, 0x97, 0x5f, 0xff, 
+	0xf7, 0xbf, 0xff, 0x9b, 0xff, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xff, 
+	0xff, 0xfd, 0xfd, 0xf7, 0xff, 0xf7, 0xf7, 0xff, 
+	0x86, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xbf, 0xff, 0x9f, 0x97, 0xdf, 0xff, 0xf9, 0xe5, 
+	0x3d, 0x3e, 0x5f, 0xff, 0x8f, 0xd9, 0xff, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x67, 
+	0xff, 0xb7, 0xbf, 0xd3, 0x7f, 0xbf, 0xfe, 0xd7, 
+	0xff, 0x6d, 0xfe, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 
+	0xf7, 0xde, 0xfe, 0x7f, 0x7c, 0xfc, 0xbf, 0xfe, 
+	0x76, 0x7b, 0xff, 0xb7, 0xfe, 0xff, 0x9b, 0xf5, 
+	0xe5, 0x97, 0x5f, 0x7e, 0xf9, 0xe5, 0x97, 0xff, 
+	0xfd, 0xe7, 0xff, 0xcf, 0xbf, 0xf6, 0xda, 0xf3, 
+	0xef, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xb6, 0xd9, 
+	0x66, 0x9b, 0x6d, 0xe5, 0xff, 0xfd, 0x87, 0xdf, 
+	0x5f, 0xaf, 0xcd, 0xbc, 0xd7, 0x57, 0xff, 0xbb, 
+	0x99, 0xff, 0x5e, 0x79, 0xe5, 0x9d, 0x77, 0xde, 
+	0xfb, 0xff, 0x7f, 0xcf, 0xd6, 0xd7, 0xcf, 0x7b, 
+	0xef, 0xd5, 0x57, 0xff, 0x6c, 0xec, 0xbf, 0xf7, 
+	0xde, 0x7b, 0xeb, 0xaf, 0xff, 0xfb, 0xff, 0x75, 
+	0xaf, 0xff, 0xb5, 0xf5, 0x7f, 0xfb, 0xff, 0xff, 
+	0xbf, 0x99, 0xfb, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0x77, 0xbf, 0xea, 0xff, 0xed, 
+	0xb7, 0xdf, 0xf8, 0xff, 0xff, 0xef, 0xe6, 0xfd, 
+	0xfb, 0xef, 0xbb, 0xef, 0xbe, 0xfb, 0xfe, 0xfb, 
+	0x2f, 0x6e, 0xfe, 0xff, 0x67, 0xff, 0x7f, 0xff, 
+	0xff, 0xb7, 0xbd, 0x79, 0xff, 0xfe, 0xfb, 0xec, 
+	0xb3, 0xcf, 0x3e, 0xbb, 0x7c, 0xf7, 0x3f, 0xff, 
+	0x7f, 0xdf, 0x7f, 0x9f, 0xdf, 0x7c, 0x7f, 0x6f, 
+	0xec, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xef, 0x7e, 0xfe, 0xfd, 0xf6, 0xd7, 0x5f, 
+	0xff, 0xfd, 0xf6, 0xbf, 0x99, 0xf9, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xfd, 0xf7, 0xff, 0x9f, 0xff, 
+	0xcf, 0xe6, 0xfe, 0xfb, 0x6f, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xed, 0x7f, 0xfb, 0xfd, 0xbb, 0xa9, 0xff, 
+	0xff, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0x7f, 
+	0xfe, 0xf1, 0xff, 0xfe, 0xfe, 0xfb, 0xef, 0xfc, 
+	0xdf, 0xff, 0x6a, 0xde, 0xff, 0xfb, 0xee, 0xbb, 
+	0xef, 0xbe, 0xfb, 0xae, 0xdd, 0x77, 0xfc, 0xfb, 
+	0x57, 0x7f, 0xff, 0xbd, 0xf1, 0xd7, 0xdf, 0x98, 
+	0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xbe, 0xff, 
+	0x6e, 0xef, 0xdf, 0xfb, 0xff, 0xfd, 0xff, 0xd7, 
+	0x5f, 0xef, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xb3, 
+	0xcf, 0x3e, 0x7b, 0xec, 0xb3, 0xe7, 0xaf, 0x67, 
+	0xfc, 0x75, 0x9f, 0x1f, 0x74, 0xd3, 0xe7, 0x8f, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xef, 0xbf, 0xff, 0x7e, 
+	0xfb, 0xef, 0xbf, 0xef, 0x7d, 0x65, 0xdd, 0x57, 
+	0x5f, 0xfd, 0xef, 0xb7, 0xeb, 0x6f, 0xfe, 0xbf, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xfd, 
+	0x77, 0x3f, 0xfd, 0xf6, 0xd3, 0x4d, 0xf7, 0xfb, 
+	0xed, 0xff, 0x9b, 0xff, 0xa7, 0xbe, 0xfb, 0xee, 
+	0xbb, 0xed, 0xbe, 0xdb, 0xbf, 0x7e, 0x51, 0xde, 
+	0x75, 0xd4, 0x7c, 0xf7, 0xfd, 0xf7, 0xff, 0xe6, 
+	0xff, 0xeb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xf7, 0xcf, 0x7f, 0x96, 0x79, 0x67, 0xdd, 0x7e, 
+	0xff, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0x7f, 0xf1, 
+	0xfd, 0xb7, 0xfb, 0xff, 0xf9, 0xbf, 0x7f, 0xff, 
+	0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0xbf, 0xfa, 0xfa, 
+	0xab, 0xad, 0x3f, 0xa4, 0x65, 0xd7, 0x1e, 0x7f, 
+	0xfd, 0xd5, 0xd7, 0x5f, 0xff, 0x9a, 0x7f, 0xff, 
+	0xfc, 0xfb, 0xbf, 0xff, 0xfe, 0xfd, 0x73, 0xff, 
+	0xff, 0xfd, 0x7e, 0xf6, 0x5f, 0xff, 0xfe, 0xbd, 
+	0xff, 0xff, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 
+	0xff, 0xff, 0xbe, 0xfb, 0xfe, 0xbf, 0x9e, 0xf9, 
+	0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x77, 0xdf, 0xef, 0xfe, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0x7d, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xf2, 0xb2, 0x63, 0x5f, 0x7e, 
+	0xfc, 0xe7, 0x9d, 0x97, 0xdb, 0xbd, 0x75, 0xff, 
+	0x9b, 0xff, 0xbf, 0xff, 0xfe, 0xeb, 0xef, 0x6e, 
+	0xff, 0xfe, 0xdf, 0xdf, 0xf7, 0xef, 0x9f, 0x7f, 
+	0xfb, 0xff, 0xfd, 0x5d, 0xff, 0xe6, 0xff, 0xe3, 
+	0xef, 0x3f, 0xfe, 0xa2, 0xe7, 0x8e, 0xbf, 0xf7, 
+	0x74, 0xf7, 0xdf, 0x7f, 0xfc, 0xff, 0xf7, 0xdf, 
+	0xff, 0xaf, 0xf9, 0xff, 0xff, 0x5f, 0xff, 0x3f, 
+	0xff, 0xff, 0xff, 0x67, 0xbf, 0xfa, 0xef, 0xff, 
+	0xdf, 0xff, 0xfb, 0xff, 0x7f, 0x7f, 0x6f, 0xfe, 
+	0xe7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xbb, 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xfd, 
+	0xff, 0x7f, 0xfe, 0x9b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xdf, 0xec, 0xe5, 0xaa, 
+	0xff, 0xff, 0xfb, 0x86, 0xfd, 0xfc, 0xfb, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0x3f, 0xe3, 0xd9, 0xef, 0xff, 0xdf, 0xfe, 
+	0xf7, 0xfb, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 
+	0xff, 0xbf, 0xbf, 0xfe, 0xfa, 0xeb, 0x2a, 0xff, 
+	0xff, 0xff, 0xde, 0x7d, 0x7e, 0xfd, 0xf5, 0xff, 
+	0xff, 0x6f, 0xfc, 0xdf, 0x7e, 0xff, 0xc5, 0xb7, 
+	0xdf, 0xfe, 0xfb, 0xef, 0xf6, 0xff, 0xfd, 0xf6, 
+	0xce, 0x7f, 0xfc, 0xfd, 0xf7, 0xff, 0x99, 0xff, 
+	0xdf, 0xff, 0xff, 0xfb, 0xb7, 0xdf, 0x7f, 0xff, 
+	0xfb, 0xff, 0x7b, 0x7f, 0xdd, 0xf7, 0xdf, 0xbf, 
+	0xff, 0xe5, 0xfd, 0xa6, 0xff, 0xef, 0xbf, 0xff, 
+	0xfc, 0xfb, 0xef, 0xef, 0xbf, 0xfb, 0xd5, 0x5f, 
+	0xdf, 0xc9, 0xf7, 0xff, 0xfa, 0xdf, 0xff, 0x8f, 
+	0xd9, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xef, 0x3f, 0x7f, 0xfb, 0xed, 0x77, 0xeb, 0xff, 
+	0x9f, 0xff, 0xdf, 0xff, 0x6d, 0xfe, 0xff, 0xce, 
+	0xff, 0x6f, 0xbf, 0xfd, 0xde, 0x7b, 0xef, 0x5f, 
+	0x6b, 0xbf, 0xf7, 0x7a, 0x53, 0xff, 0xbf, 0xf4, 
+	0xff, 0x9b, 0xf7, 0xef, 0xe7, 0xff, 0xfe, 0xfb, 
+	0xef, 0x97, 0x5f, 0x7e, 0xd7, 0x6b, 0xaf, 0x9d, 
+	0x7f, 0xd6, 0xff, 0xe7, 0xff, 0xd7, 0xe6, 0xfe, 
+	0xfd, 0xb5, 0xd7, 0x5f, 0x7f, 0xfd, 0xb6, 0xd9, 
+	0x2e, 0xf5, 0xdf, 0xcc, 0xff, 0xcf, 0x36, 0xfb, 
+	0xdf, 0xfb, 0xbb, 0x99, 0xbf, 0xef, 0xb9, 0xf7, 
+	0xda, 0x6b, 0xef, 0x79, 0xe5, 0x5f, 0xf5, 0xbd, 
+	0xf2, 0xff, 0xb3, 0xf7, 0xfe, 0x5f, 0xee, 0x6c, 
+	0xea, 0xff, 0x1f, 0xff, 0xfe, 0xf5, 0xff, 0xbf, 
+	0xde, 0xfb, 0x5b, 0x7f, 0xef, 0xf7, 0xef, 0x5b, 
+	0xd9, 0xff, 0xf5, 0xbd, 0x99, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0xdb, 0xd7, 
+	0x7e, 0xfb, 0xed, 0x3f, 0xd4, 0xff, 0xff, 0xff, 
+	0xef, 0xc6, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xef, 0xaf, 0xef, 0x7e, 0xf7, 0xff, 0xf7, 
+	0x9d, 0xef, 0xff, 0xf9, 0xf7, 0xbd, 0x79, 0x17, 
+	0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xfb, 0xef, 
+	0x72, 0x9d, 0xfd, 0x77, 0xf9, 0xef, 0x33, 0xff, 
+	0xfc, 0x6b, 0x6f, 0xec, 0xd7, 0x56, 0x1b, 0xed, 
+	0xbf, 0xfb, 0xfe, 0xfa, 0xeb, 0x75, 0x7f, 0xfd, 
+	0xf5, 0xdb, 0x77, 0xbc, 0xfd, 0xf6, 0x3d, 0x99, 
+	0xf9, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xfe, 0xfd, 0xdf, 0x7f, 0x7f, 0xfe, 0xff, 
+	0xfd, 0x9f, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xed, 0xff, 
+	0xf7, 0xdf, 0xee, 0xfd, 0xff, 0xff, 0xfb, 0xff, 
+	0xbb, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfe, 0x7f, 0xef, 0x75, 0xef, 0xbf, 0xff, 0xfe, 
+	0xf9, 0xf3, 0xfd, 0xd6, 0xff, 0x6a, 0xde, 0x9f, 
+	0x7d, 0xf7, 0xcd, 0x77, 0x9f, 0xfd, 0x6f, 0xbb, 
+	0x7e, 0xfd, 0xf7, 0x5f, 0x7f, 0xeb, 0xfc, 0xf9, 
+	0xcf, 0xce, 0x9b, 0xff, 0xfd, 0xff, 0xfe, 0xff, 
+	0xef, 0xef, 0xff, 0xef, 0xfb, 0xdf, 0xfb, 0x77, 
+	0x9d, 0xdf, 0x97, 0xeb, 0x7f, 0xff, 0xff, 0xe6, 
+	0xff, 0xfb, 0xe3, 0xcf, 0x3e, 0xfb, 0xf8, 0xf3, 
+	0xcf, 0x9e, 0x7d, 0xfc, 0x57, 0x8f, 0x5f, 0x77, 
+	0xf9, 0xc7, 0x9f, 0xbf, 0xf9, 0xff, 0xe7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xeb, 0xbf, 0xff, 0x7d, 
+	0xf5, 0xd7, 0xe7, 0xde, 0x7b, 0xf7, 0xd7, 0xdf, 
+	0x6f, 0xfe, 0x9f, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xfa, 0xef, 0xd5, 0x3f, 0xfd, 0xf4, 0xfa, 
+	0xef, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xef, 0xff, 0xbf, 0xfa, 0xee, 
+	0x77, 0x51, 0xfd, 0x77, 0x4f, 0x1d, 0xf5, 0x7f, 
+	0xf7, 0xff, 0xe6, 0xff, 0xdb, 0xef, 0xff, 0xfe, 
+	0xfb, 0xff, 0xaf, 0xbf, 0xdf, 0xf7, 0xd6, 0xfb, 
+	0xe7, 0x9f, 0x7f, 0x9f, 0xdf, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xfb, 0xff, 0xb7, 0xdf, 0x7f, 0xf3, 
+	0xff, 0x97, 0xf7, 0x6f, 0xfe, 0xff, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfe, 0xd4, 
+	0xd7, 0x5f, 0x7f, 0xf9, 0xf5, 0xd7, 0x5a, 0xff, 
+	0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xef, 0x67, 0xff, 0x7f, 0xf0, 0x62, 
+	0x07, 0xf7, 0xff, 0xff, 0xff, 0xc6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xff, 0xbf, 0xdf, 0x6f, 0xfd, 0x75, 0xff, 0xff, 
+	0xfd, 0x9f, 0xf9, 0xdf, 0xff, 0xff, 0xfb, 0xfd, 
+	0xff, 0xdf, 0xff, 0xff, 0xdf, 0xef, 0xfe, 0xda, 
+	0xff, 0xbf, 0xff, 0xbe, 0xff, 0xff, 0x6f, 0xfc, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 
+	0xcb, 0x7f, 0x7e, 0xfe, 0xe5, 0xd7, 0x7f, 0xfe, 
+	0xbd, 0x6f, 0x7f, 0x9b, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xff, 0xef, 0xbf, 0xef, 0xbb, 0xff, 0xf4, 
+	0x77, 0xdb, 0xef, 0xf7, 0xff, 0xf7, 0xf7, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xfb, 0xfc, 0xff, 0x7f, 0x5f, 0xff, 
+	0xf6, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 
+	0x7f, 0xff, 0xe7, 0xff, 0x7f, 0x7e, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xf7, 
+	0xff, 0xdf, 0xdf, 0xff, 0xbf, 0xfe, 0x9b, 0xff, 
+	0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0x7b, 0xfd, 0xff, 0xda, 0xf8, 0xf5, 
+	0xff, 0xfe, 0xff, 0xf7, 0x6e, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0x77, 
+	0xfd, 0xfb, 0xf3, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0xbe, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0x7d, 0xdf, 0xef, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xef, 
+	0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 
+	0xdd, 0xef, 0x9e, 0xfb, 0xfe, 0xf9, 0xef, 0x9f, 
+	0x7e, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0x9f, 0xff, 0xcf, 0xff, 0xef, 
+	0xdf, 0x6d, 0xfe, 0xfd, 0xe7, 0xbf, 0xf7, 0x6f, 
+	0xfe, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xf7, 0xee, 
+	0xfb, 0xaf, 0xff, 0xe7, 0xf5, 0xff, 0xdf, 0xfb, 
+	0x7f, 0xbd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xfb, 
+	0xff, 0xfb, 0xfd, 0xb7, 0xdf, 0x7f, 0xff, 0xff, 
+	0xff, 0xa6, 0xff, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 
+	0xef, 0xbd, 0xff, 0xdf, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0x76, 0xd3, 0x7f, 0xed, 0xbf, 0xf9, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 0xf3, 0xcf, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xfb, 
+	0x67, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0x53, 0x7f, 0xff, 
+	0x74, 0xf7, 0x5e, 0x6f, 0xdf, 0xfd, 0xff, 0x9b, 
+	0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 
+	0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xfd, 0xfb, 
+	0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xee, 0xbe, 0xff, 
+	0xbf, 0xf9, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0xdf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0xfd, 0xf6, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xef, 0x7f, 
+	0xfb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x5f, 0x7f, 0xff, 0xeb, 0xef, 
+	0xf7, 0xfe, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf, 
+	0x7e, 0xf3, 0xed, 0xb7, 0xdd, 0x7e, 0xeb, 0xdb, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6b, 0xbf, 0xe9, 
+	0x6f, 0xfe, 0xff, 0xf5, 0xdf, 0x7f, 0xff, 0xed, 
+	0xf5, 0xdf, 0x7f, 0xef, 0xfb, 0xef, 0xbf, 0xef, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xe9, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdb, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 
+	0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0xab, 0xaf, 0xbf, 
+	0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7, 
+	0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xf9, 0xef, 
+	0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xfb, 0xdd, 
+	0xf7, 0xdf, 0x7f, 0xdf, 0xfd, 0xf7, 0xdf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x79, 0xee, 0xf9, 0xe7, 0x9f, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xad, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x1b, 0x7f, 0xfd, 0xf1, 
+	0xd7, 0x5b, 0x7f, 0xfd, 0xe5, 0x2f, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0xae, 0xbf, 0xfe, 0xf8, 0x6f, 0xee, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xf6, 0xfb, 
+	0x2f, 0x77, 0xbf, 0xf5, 0xf7, 0xdf, 0x5f, 0xfd, 
+	0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 
+	0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x7b, 
+	0xee, 0xbf, 0xf5, 0x6d, 0xf7, 0xdf, 0x76, 0xff, 
+	0x7d, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xbd, 0xf5, 0x37, 0xdf, 
+	0xd9, 0xfa, 0x9b, 0xa9, 0xbf, 0x9f, 0xfa, 0xeb, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPPAFSK_ROM_DIVROM0              0
+#define EPPAFSK_ROM_DIVROM1              16
+#define EPPAFSK_ROM_DIVROM2              32
+#define EPPAFSK_ROM_SWROMIE              48
+#define EPPAFSK_ROM_SWROMOE              64
+#define EPPAFSK_ROM_CLKSELROM            80
+#define EPPAFSK_ROM_PTTMUTEROM           96
+
+
+/* rom locations */
+static const unsigned long eppafsk_roms[112] = {
+	 37019,  36851,  37683,  37515,  37351,  37183,  38015,  37847,
+	 36853,  37017,  37517,  37681,  37185,  37349,  37849,  38013,
+	 25027,  24859,  25691,  25523,  25359,  25191,  26023,  25855,
+	 24861,  25025,  25525,  25689,  25193,  25357,  25857,  26021,
+	 58069,  58235,  58237,  58071,  57405,  57571,  57573,  57407,
+	 57737,  57903,  57905,  57739,  57073,  57239,  57241,  57075,
+	 31033,  30865,  31365,  31197,  31697,  31529,  32029,  31861,
+	 30867,  31031,  31199,  31363,  31531,  31695,  31863,  32027,
+	 25057,  24889,  25721,  25553,  25389,  25221,  26053,  25885,
+	 24891,  25055,  25555,  25719,  25223,  25387,  25887,  26051,
+	 15990,  15326,  16156,  15492,  16158,  15494,  15992,  15328,
+	 15658,  14994,  15824,  15160,  15826,  15162,  15660,  14996,
+	 31013,  30845,  31345,  31177,  31677,  31509,  32009,  31841,
+	 30847,  31011,  31179,  31343,  31511,  31675,  31843,  32007
+};
+
diff --git a/main/eppchk_firmware.h b/main/eppchk_firmware.h
new file mode 100644
index 0000000..24200e0
--- /dev/null
+++ b/main/eppchk_firmware.h
@@ -0,0 +1,1531 @@
+/*****************************************************************************/
+
+/*
+ *      eppchk_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPCHK_FIRMWAREDATE "19990705"
+
+/* firmware */
+static const unsigned char eppchk_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff, 
+	0xfd, 0xed, 0xd7, 0xdf, 0xfe, 0xfd, 0xfd, 0x7f, 
+	0xef, 0xfe, 0xf6, 0xee, 0x6f, 0xef, 0xfe, 0xf6, 
+	0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xfb, 
+	0xff, 0xaf, 0xff, 0x7f, 0xfe, 0xdf, 0xff, 0xff, 
+	0xfd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf8, 0xed, 0xcf, 
+	0xff, 0xfe, 0xfb, 0xed, 0x8f, 0xdf, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 
+	0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xf7, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0x1b, 0xff, 0x6f, 0xed, 
+	0xf5, 0xd3, 0x5f, 0x7f, 0xed, 0xf5, 0xd7, 0xbe, 
+	0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 
+	0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xbc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 
+	0xef, 0xbe, 0xbf, 0xfe, 0xfb, 0xef, 0xbe, 0xff, 
+	0xda, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0x6f, 0xfc, 0xff, 0xfb, 0xaf, 0xbf, 
+	0xfe, 0xfa, 0xfb, 0xaf, 0xbf, 0xff, 0xfd, 0xd7, 
+	0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0x9b, 
+	0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xed, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xe6, 0xff, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xed, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7d, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xff, 
+	0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xd7, 
+	0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xfb, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbd, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0x7f, 0xfd, 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xcf, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xf7, 0xfc, 0xf3, 
+	0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xef, 0x7f, 0xfe, 
+	0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 
+	0x6f, 0xf6, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xff, 
+	0xfd, 0x77, 0xdf, 0xef, 0xfe, 0xfb, 0xee, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xf7, 0x9b, 0xdd, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xef, 0xfc, 
+	0xe7, 0x9e, 0x7f, 0xfe, 0x79, 0xe7, 0x9f, 0x7b, 
+	0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xff, 
+	0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xd9, 0xd7, 0x3e, 
+	0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xf7, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 
+	0xff, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfb, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xf7, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xfc, 0xff, 0x5f, 0xfe, 0xff, 
+	0xe5, 0xff, 0xfb, 0xff, 0xbf, 0xf9, 0xff, 0xbf, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xaf, 
+	0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0x7e, 0xdf, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0x7f, 0xbf, 0xfe, 0xff, 0xff, 0xbf, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xdf, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xfd, 0xbd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0x79, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf6, 
+	0xdf, 0xff, 0x7f, 0xf4, 0xff, 0xd7, 0xff, 0xf7, 
+	0xfd, 0xff, 0xc7, 0xff, 0x6f, 0xfe, 0xf7, 0xdb, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf, 
+	0xff, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xff, 0xfd, 
+	0xff, 0x9b, 0xdf, 0xfb, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfb, 0x2d, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0x9f, 0x7f, 0x7f, 0xff, 
+	0xfd, 0xfe, 0xb7, 0xff, 0xff, 0xfb, 0xff, 0xff, 
+	0xff, 0xef, 0xbf, 0xf9, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xf7, 
+	0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0xfb, 0xdf, 0xfd, 0xf3, 0xdf, 0xbf, 0x7e, 
+	0xf8, 0xfd, 0xf7, 0xff, 0xfe, 0xff, 0xbf, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0x9b, 0xbf, 0xff, 0xff, 
+	0xfd, 0xfa, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xaf, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xfd, 0xf7, 
+	0xdf, 0x5f, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xfd, 0xef, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0x7e, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x9b, 
+	0xff, 0xfc, 0xff, 0xfb, 0xef, 0xbf, 0xf5, 0xfe, 
+	0x9b, 0xff, 0x9f, 0xf3, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xa7, 0x66, 0x7f, 0xfd, 0xff, 
+	0xfe, 0xfb, 0x2f, 0xbf, 0xff, 0xfe, 0xff, 0x7d, 
+	0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xb7, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xde, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x5f, 0x99, 0xfb, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xdf, 0xef, 0xb7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x66, 
+	0xfe, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xdd, 0x7d, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xb3, 0xa9, 0xbf, 0xcf, 0xbf, 
+	0xfc, 0xd6, 0xdb, 0xef, 0xff, 0xfc, 0xff, 0x9d, 
+	0xf7, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 
+	0x66, 0xee, 0xff, 0xc7, 0x5f, 0x7d, 0xfc, 0xed, 
+	0xf7, 0x4f, 0xfd, 0xdf, 0xaf, 0xff, 0xff, 0xff, 
+	0xf9, 0xff, 0xff, 0xff, 0xbf, 0x19, 0xf7, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb1, 
+	0xff, 0xe3, 0x8f, 0x3f, 0xfe, 0xf8, 0xe3, 0xcf, 
+	0xbf, 0xff, 0xbd, 0xf6, 0xdf, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0xff, 0x66, 0xee, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 
+	0x9b, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xef, 0xe6, 0xfe, 0x4d, 
+	0x7d, 0xfc, 0xf1, 0xc7, 0x1f, 0x7d, 0xfc, 0xff, 
+	0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbb, 0x61, 0xff, 0xe3, 0xbf, 0x7f, 0xfe, 
+	0xdb, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xce, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfe, 
+	0xff, 0xfe, 0xf7, 0xdf, 0x7d, 0xfb, 0xcd, 0xb7, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xcf, 0x8f, 
+	0x3f, 0xfe, 0xf8, 0xe3, 0x3f, 0xff, 0xfc, 0xe7, 
+	0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 
+	0xe6, 0xff, 0xef, 0x7f, 0xee, 0xb9, 0xe7, 0xfe, 
+	0x7b, 0xfe, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf3, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xff, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xfb, 0xff, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xfe, 
+	0xbf, 0xfd, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xe7, 
+	0xf7, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xfd, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 
+	0xbf, 0xfc, 0xa2, 0xd7, 0x5f, 0x7e, 0xf9, 0xd5, 
+	0xd7, 0x5f, 0x7f, 0xed, 0x6f, 0xfe, 0xff, 0xfc, 
+	0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 0xb3, 0xff, 0xff, 
+	0xb7, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 
+	0xef, 0x1b, 0xff, 0xef, 0xef, 0xfe, 0xfb, 0xef, 
+	0xb7, 0x6f, 0xbe, 0xff, 0xff, 0xfb, 0xef, 0x7f, 
+	0xff, 0xff, 0xf7, 0xbf, 0xff, 0xbd, 0xa6, 0xff, 
+	0xef, 0xef, 0xbf, 0x7f, 0xfe, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0x7b, 0xff, 0xf7, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xbf, 0x79, 0xff, 0x7f, 0xbf, 0xff, 
+	0xff, 0x7f, 0xff, 0xdf, 0x7f, 0xfb, 0xdb, 0xe5, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 
+	0xfc, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xdb, 0xff, 
+	0xef, 0xff, 0xf7, 0xef, 0xfb, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0x99, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xd3, 0xdf, 
+	0xdd, 0xff, 0xfd, 0xfe, 0xff, 0x3f, 0xff, 0xed, 
+	0xff, 0xc6, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x3f, 0xef, 0xf9, 0x7f, 0x0d, 0xfe, 
+	0xff, 0xef, 0xf7, 0xbf, 0xff, 0x9f, 0xf9, 0xef, 
+	0xff, 0xff, 0xff, 0xef, 0xfb, 0xef, 0xff, 0xbf, 
+	0xbd, 0xed, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0xfb, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0x9f, 0x3f, 0xfc, 0xe1, 0xf7, 0xdf, 0xff, 
+	0xf0, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x99, 
+	0xdf, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xed, 0xf7, 
+	0xed, 0xf7, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xab, 0xaf, 
+	0xbf, 0xfe, 0xdf, 0xff, 0xdf, 0xb7, 0x8e, 0xf5, 
+	0xdf, 0xff, 0xff, 0x79, 0xef, 0xdf, 0x7f, 0xfe, 
+	0xbf, 0xf9, 0xf7, 0xf3, 0xee, 0xbf, 0xdf, 0xff, 
+	0xdf, 0x7f, 0xbf, 0xfd, 0x7d, 0xfe, 0xdf, 0x1f, 
+	0xbf, 0xff, 0xf6, 0xce, 0xff, 0x6f, 0xfe, 0xff, 
+	0x7e, 0xfd, 0xaf, 0xff, 0xd7, 0xff, 0xff, 0xaf, 
+	0x7f, 0x7b, 0xf7, 0xb7, 0xff, 0xff, 0x7f, 0xfe, 
+	0xfb, 0xff, 0x1b, 0xfe, 0x6c, 0xbe, 0xff, 0x63, 
+	0xbe, 0xff, 0xfe, 0xcf, 0x47, 0xfe, 0x5f, 0x67, 
+	0xf7, 0x6f, 0xfe, 0xdf, 0x4f, 0xef, 0x3f, 0x66, 
+	0x7f, 0xee, 0xbf, 0xff, 0xca, 0xff, 0xbf, 0xff, 
+	0xe7, 0xff, 0xff, 0xd7, 0xcb, 0xfb, 0x3f, 0xbf, 
+	0xdf, 0x7f, 0xff, 0xb7, 0xf9, 0xdf, 0x6b, 0xef, 
+	0xed, 0xfd, 0xfb, 0xff, 0xff, 0xfc, 0xfe, 0x3b, 
+	0xf5, 0x77, 0xff, 0xcf, 0xb9, 0xe7, 0x9e, 0xff, 
+	0x6f, 0xd6, 0x97, 0x5f, 0x7e, 0xf9, 0xff, 0xff, 
+	0xff, 0x3f, 0xff, 0xf9, 0xe7, 0xfd, 0xfd, 0xff, 
+	0x79, 0x2e, 0xbf, 0xec, 0x5f, 0x9b, 0xfb, 0xef, 
+	0x97, 0x5f, 0xfb, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 
+	0x3f, 0x4b, 0xb7, 0xef, 0xff, 0xff, 0x7f, 0xb9, 
+	0xfd, 0xee, 0x66, 0xfe, 0xaf, 0xb5, 0xda, 0xfa, 
+	0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x57, 0xff, 
+	0xfd, 0xff, 0xdf, 0xf7, 0xc2, 0x9f, 0xb3, 0xb1, 
+	0xff, 0xfb, 0xef, 0xef, 0xff, 0xfb, 0x6f, 0x7f, 
+	0xdd, 0xf7, 0xbe, 0xf5, 0xff, 0xfa, 0xaf, 0xbd, 
+	0xfc, 0xf6, 0xf7, 0x66, 0xee, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xff, 0xfd, 0xb7, 0x4f, 0xdc, 0xf8, 0x46, 
+	0xfd, 0x1f, 0xfc, 0x7f, 0xe7, 0x1d, 0xf7, 0xbf, 
+	0x9b, 0xf7, 0xef, 0xbb, 0xef, 0xbf, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xbb, 0xd9, 0xff, 0xe7, 0xfb, 0xff, 
+	0xff, 0xdc, 0x73, 0xcf, 0xf7, 0xe6, 0xfd, 0xfb, 
+	0xec, 0xb3, 0xcf, 0xe7, 0x9f, 0x7f, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xfc, 0xff, 0x57, 0xfe, 0xf9, 
+	0xe5, 0xbd, 0xb1, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 
+	0xf8, 0xe3, 0xcf, 0x77, 0xd7, 0xfb, 0xf7, 0x9b, 
+	0x7f, 0xff, 0xfd, 0xf5, 0xd7, 0xff, 0x66, 0xe6, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xbf, 
+	0xfd, 0xf7, 0xbf, 0xdf, 0xfe, 0xff, 0xef, 0x7f, 
+	0xef, 0xbd, 0x3f, 0x9b, 0xfb, 0x6f, 0xbf, 0xfd, 
+	0xf6, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xdf, 0xf7, 
+	0xf7, 0xf7, 0xff, 0x7d, 0xdf, 0x7e, 0xfb, 0xef, 
+	0xa6, 0xfe, 0xeb, 0xaf, 0xbf, 0xfe, 0xc7, 0x1f, 
+	0x7f, 0xdd, 0x79, 0xcf, 0xfb, 0xeb, 0x78, 0xbf, 
+	0xfd, 0xf7, 0xdf, 0xff, 0xab, 0x79, 0xff, 0xf2, 
+	0xcb, 0x2f, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xf7, 0xef, 0x1f, 0xdf, 0xee, 0xb5, 0xdd, 0x77, 
+	0x7d, 0x6f, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0x7d, 
+	0xff, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xef, 
+	0xf7, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 
+	0xff, 0xcb, 0x1f, 0x3f, 0xfc, 0xf0, 0xcb, 0x3f, 
+	0xff, 0xbc, 0xe7, 0x9f, 0x7d, 0xfc, 0xf1, 0x67, 
+	0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xe7, 0x9f, 0x7f, 0xff, 0xfd, 0xee, 0xdf, 
+	0xff, 0xfc, 0xff, 0xc7, 0xdf, 0x7f, 0xff, 0xbf, 
+	0xe1, 0xff, 0xff, 0xfe, 0xf7, 0xdf, 0x5f, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 
+	0xff, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 
+	0x7a, 0xea, 0xf8, 0xeb, 0xaf, 0xff, 0xdf, 0xff, 
+	0xfe, 0xff, 0xdf, 0xff, 0xdf, 0x7d, 0xf7, 0xdd, 
+	0xff, 0x9b, 0xfb, 0xaf, 0xbf, 0x0e, 0xba, 0x7c, 
+	0xf1, 0xe9, 0xf7, 0xdf, 0xff, 0xfe, 0xff, 0xfd, 
+	0xff, 0xdf, 0xdf, 0x7f, 0xff, 0xff, 0xe6, 0xfe, 
+	0xff, 0xff, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xbf, 
+	0xfc, 0xe9, 0xb7, 0x9f, 0xfe, 0xff, 0xe9, 0xff, 
+	0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xde, 
+	0xfa, 0xeb, 0xaf, 0xbf, 0xde, 0xea, 0x96, 0x5f, 
+	0x7a, 0xfd, 0xb5, 0xc6, 0x5f, 0x7f, 0xfd, 0x6b, 
+	0xfa, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xef, 0xfc, 
+	0x3b, 0xcf, 0x7f, 0x32, 0xfe, 0xfb, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xf7, 0xff, 
+	0xff, 0xee, 0xff, 0xbf, 0xef, 0x3e, 0xfe, 0xef, 
+	0xfb, 0xff, 0xbf, 0xff, 0xfd, 0xf5, 0xf7, 0xff, 
+	0x7f, 0xe6, 0xff, 0xff, 0xfd, 0xfd, 0xef, 0xff, 
+	0xfb, 0xff, 0xff, 0x7e, 0xf7, 0x7b, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfa, 0xff, 0xaf, 0xdf, 0xdf, 0xf7, 0xdf, 0x67, 
+	0x7f, 0xfc, 0xf7, 0xff, 0x5f, 0x7b, 0xfe, 0xfd, 
+	0xd7, 0xfd, 0x6f, 0xfa, 0xff, 0x7e, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xbf, 0x9f, 0xb7, 0xf7, 0xf7, 
+	0xff, 0xbf, 0xff, 0xdf, 0xfd, 0xab, 0xff, 0x9b, 
+	0xff, 0xef, 0xff, 0xef, 0xfe, 0xff, 0xff, 0x77, 
+	0xbe, 0xff, 0xdf, 0xdf, 0xff, 0xef, 0xfd, 0xcf, 
+	0x7f, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0xf7, 0xdf, 0xef, 0xbb, 0xfb, 0xf9, 
+	0xff, 0xff, 0x7d, 0xed, 0x35, 0xe7, 0x5e, 0xbf, 
+	0xbf, 0xf9, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0xfb, 0xbf, 0xbb, 0xfd, 0xff, 0x7f, 0xff, 
+	0xfd, 0xff, 0xf6, 0xff, 0xff, 0x6f, 0xfe, 0xff, 
+	0xff, 0xcf, 0xf7, 0xcf, 0x2f, 0xbf, 0xff, 0xf3, 
+	0x97, 0xbe, 0xf7, 0xff, 0x7f, 0xee, 0xff, 0xff, 
+	0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xdd, 0xbe, 0xeb, 0x7f, 0xf6, 0xbf, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xef, 0xff, 0xff, 0xde, 0xfd, 0xf7, 0xbf, 
+	0xff, 0xb7, 0x31, 0x97, 0x7f, 0xff, 0xfd, 0xf7, 
+	0x97, 0x77, 0xff, 0xbf, 0xf1, 0x7f, 0xfb, 0xef, 
+	0xbf, 0xff, 0xff, 0xf7, 0xb7, 0xbe, 0xff, 0xfd, 
+	0xf6, 0xcd, 0x6f, 0xff, 0xdd, 0xf6, 0xdf, 0xff, 
+	0x67, 0xfe, 0xbf, 0xfe, 0xfb, 0xeb, 0xff, 0xdf, 
+	0xff, 0xef, 0xef, 0x7f, 0xff, 0xfe, 0xbb, 0xd7, 
+	0x9f, 0xfd, 0xf5, 0xd9, 0xff, 0x9b, 0xff, 0xef, 
+	0xbf, 0xff, 0xfe, 0xff, 0xbf, 0xe6, 0xff, 0x7f, 
+	0x3e, 0x5f, 0xfb, 0x85, 0x7d, 0xf6, 0xdf, 0x4b, 
+	0xff, 0xbf, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xff, 0x5b, 0xf9, 0xff, 0x9f, 0xef, 0xd7, 0xf2, 
+	0xc9, 0x3d, 0xf7, 0xdf, 0x73, 0xff, 0xb7, 0xd9, 
+	0xdf, 0x5b, 0x6f, 0xbd, 0xff, 0xff, 0xfb, 0xdf, 
+	0xf5, 0xff, 0x3b, 0xff, 0xdf, 0x7b, 0xee, 0xb9, 
+	0xe7, 0x9e, 0xff, 0x6f, 0xde, 0x97, 0x5f, 0x7e, 
+	0xf9, 0xff, 0xbf, 0x9f, 0x7f, 0xff, 0xfd, 0xcf, 
+	0xff, 0xff, 0xb2, 0xcb, 0x2e, 0xbf, 0xec, 0x5e, 
+	0x9b, 0xfb, 0xe7, 0xbf, 0x7f, 0xfe, 0x7d, 0xbf, 
+	0xd9, 0xb9, 0x77, 0x3c, 0x5f, 0xff, 0xad, 0x36, 
+	0xdb, 0x6d, 0xf9, 0x3d, 0xee, 0x66, 0xfe, 0xae, 
+	0xbf, 0xca, 0x1a, 0xff, 0xbb, 0xf5, 0xdf, 0x6f, 
+	0xff, 0x53, 0xff, 0x35, 0xef, 0xfd, 0xf7, 0xde, 
+	0xbf, 0xb3, 0xa9, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0xdb, 0x6b, 0xf5, 0xd9, 0xff, 0x3e, 0xff, 0xdf, 
+	0xdb, 0x7f, 0xef, 0xfd, 0xf6, 0xf7, 0x66, 0xee, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xff, 0x85, 0x57, 0x77, 
+	0xde, 0xf5, 0xde, 0xff, 0x9f, 0xdd, 0x7f, 0xff, 
+	0x3d, 0xf7, 0xbf, 0x1b, 0xf7, 0xec, 0xbb, 0xef, 
+	0xfe, 0xdf, 0x7f, 0xff, 0x2e, 0xfb, 0xdb, 0xed, 
+	0xff, 0xfb, 0xbd, 0xf7, 0xdc, 0x53, 0xcf, 0x77, 
+	0xe6, 0x7d, 0xff, 0xfc, 0xf3, 0xff, 0xe7, 0x9f, 
+	0xff, 0xe7, 0xdf, 0xff, 0xfc, 0xff, 0x7c, 0xff, 
+	0x5d, 0xf6, 0xd9, 0xe5, 0xbd, 0xb1, 0xef, 0xfa, 
+	0xeb, 0xaf, 0xfd, 0xf8, 0x63, 0xdd, 0x77, 0xcf, 
+	0xfb, 0xf7, 0x9f, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0xef, 0x66, 0xee, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xff, 0x7f, 0xff, 0xfc, 0xf6, 0xff, 0xff, 0xff, 
+	0xf7, 0xde, 0x7b, 0xef, 0xbd, 0x39, 0x9b, 0xfb, 
+	0x6f, 0xbf, 0xfd, 0xfe, 0xff, 0xff, 0xfb, 0xbe, 
+	0x7b, 0xdf, 0xff, 0xff, 0xf7, 0xfd, 0xb7, 0xdf, 
+	0x7e, 0xbb, 0xef, 0xe6, 0xfe, 0xeb, 0xaf, 0xff, 
+	0xff, 0xd7, 0x1f, 0x7f, 0xff, 0xfd, 0xcf, 0xf6, 
+	0xfb, 0xf8, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xbb, 
+	0x79, 0xff, 0xf2, 0xcb, 0x7f, 0xff, 0xfb, 0xef, 
+	0xbf, 0xf7, 0xfe, 0xb7, 0xdd, 0x3e, 0xff, 0x6d, 
+	0xd7, 0xdd, 0x76, 0x7d, 0x6f, 0xfa, 0xff, 0x7f, 
+	0xff, 0xfd, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0x77, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xff, 0x9b, 0xfe, 0xff, 0xcf, 0x1f, 0xbf, 0xfc, 
+	0xf0, 0xc3, 0x3f, 0xff, 0xbc, 0xc7, 0x8f, 0x7b, 
+	0xfe, 0xd9, 0x67, 0x9f, 0x7d, 0xfe, 0xe6, 0xff, 
+	0xff, 0xff, 0x9f, 0x7c, 0xf7, 0xdd, 0xf7, 0xff, 
+	0xf9, 0xee, 0xdf, 0x6f, 0x7c, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0x23, 
+	0xcb, 0x1d, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0xf7, 
+	0xdf, 0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 
+	0xfe, 0xbf, 0xfe, 0x7a, 0xea, 0xfb, 0xeb, 0xad, 
+	0xff, 0xff, 0xff, 0xff, 0xbd, 0xd7, 0x57, 0xdf, 
+	0x7d, 0xf7, 0xdd, 0xff, 0x1b, 0xfe, 0xaf, 0xbf, 
+	0xce, 0x32, 0x7f, 0xfd, 0xf5, 0xf7, 0xdf, 0xff, 
+	0x7e, 0xfb, 0xfd, 0xf5, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xff, 0xe6, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0x4f, 0x3f, 0xfd, 0xfc, 0xfe, 0x5f, 0xfc, 
+	0xff, 0xff, 0x7e, 0xff, 0xff, 0xbf, 0xf9, 0xfd, 
+	0x8f, 0x3e, 0xfc, 0xf2, 0xeb, 0xaf, 0x37, 0x56, 
+	0x5a, 0x57, 0x5f, 0x74, 0xf9, 0xd5, 0xd7, 0x5f, 
+	0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xe7, 0xfc, 0xd3, 0xcf, 0xfb, 0xf7, 0xe7, 
+	0xe7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x1b, 
+	0xff, 0xf7, 0xdf, 0xfd, 0x77, 0xf7, 0x97, 0xaf, 
+	0x7e, 0xb6, 0xfe, 0xfd, 0x7e, 0xf7, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xff, 
+	0xff, 0xf9, 0xff, 0xbd, 0xff, 0xff, 0xbe, 0xff, 
+	0xfb, 0xbf, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 
+	0x9f, 0xf1, 0x7b, 0xfa, 0xeb, 0xaf, 0xf3, 0xff, 
+	0xf7, 0xcf, 0xbd, 0x7f, 0xfd, 0xf5, 0xd5, 0xdf, 
+	0x5d, 0xfd, 0xd5, 0xf7, 0xff, 0x67, 0xf6, 0xbf, 
+	0xbe, 0xfb, 0xa9, 0xfb, 0xff, 0xff, 0xfd, 0xf6, 
+	0x7f, 0xff, 0xfd, 0xf3, 0xbf, 0x5e, 0xdf, 0xfa, 
+	0xf7, 0xff, 0x99, 0xff, 0x9f, 0x3f, 0xfe, 0xbb, 
+	0x67, 0xbf, 0xff, 0xfc, 0x9b, 0xb7, 0xdb, 0xfe, 
+	0xeb, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6, 
+	0xff, 0xeb, 0xaf, 0xfd, 0xff, 0xfa, 0xd3, 0xcf, 
+	0x3f, 0xef, 0xf5, 0xff, 0xff, 0x7d, 0xfb, 0x6f, 
+	0xbf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0x7d, 
+	0x7f, 0xfd, 0xff, 0xfb, 0xfb, 0xef, 0xef, 0xff, 
+	0xbf, 0xff, 0x7e, 0xff, 0xe7, 0xff, 0xfb, 0xff, 
+	0x6f, 0xfe, 0x3f, 0xfb, 0xfc, 0xf0, 0xcf, 0x3f, 
+	0xfe, 0xfc, 0xe2, 0xf5, 0xfe, 0xff, 0xff, 0xff, 
+	0xbf, 0xbf, 0xfb, 0xff, 0xff, 0x9b, 0xff, 0x7d, 
+	0xf7, 0xdd, 0xf7, 0xde, 0x7f, 0x1f, 0xff, 0xbb, 
+	0x7f, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xe6, 0xdf, 0xc5, 0x5f, 0x7b, 0xef, 
+	0xf0, 0xeb, 0xad, 0xbd, 0xbe, 0xf7, 0xbf, 0xff, 
+	0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0x7b, 0xff, 0xbf, 0xff, 0xef, 0xfb, 0xff, 
+	0xf7, 0x7d, 0xf5, 0xff, 0xff, 0xbf, 0xbe, 0xe7, 
+	0xff, 0xff, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xff, 
+	0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 
+	0x1b, 0xfe, 0xff, 0xff, 0xff, 0xda, 0xff, 0xf5, 
+	0xe7, 0xcf, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 
+	0x5f, 0xff, 0xfd, 0xff, 0x3f, 0x66, 0xff, 0xfb, 
+	0xef, 0xbf, 0xf7, 0x7e, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7c, 0xff, 
+	0xff, 0xb7, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xff, 
+	0x5f, 0xff, 0xdf, 0x79, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x3d, 0xf7, 0xff, 0xff, 0x6f, 0xd6, 
+	0xbf, 0xff, 0xfe, 0xeb, 0xef, 0xff, 0xdf, 0x7f, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xfd, 0xff, 0x5f, 0x9b, 0xfb, 0xbf, 0xbd, 0xff, 
+	0xda, 0xed, 0x77, 0xc7, 0xb9, 0xb7, 0xb5, 0xff, 
+	0xfb, 0xff, 0xfd, 0xda, 0xe2, 0xfb, 0xff, 0xed, 
+	0x66, 0xfe, 0x6b, 0xaf, 0xbf, 0x2e, 0x7a, 0xfc, 
+	0xf6, 0xd7, 0x5f, 0xe7, 0xff, 0xff, 0xff, 0xf5, 
+	0xde, 0x7b, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xfb, 
+	0xfb, 0x2f, 0xfd, 0xfe, 0x7d, 0xf7, 0xdf, 0x77, 
+	0xbb, 0xde, 0xfe, 0xcb, 0xdf, 0x35, 0xf7, 0xff, 
+	0xff, 0x66, 0xee, 0xbf, 0xfe, 0xfa, 0xab, 0xaf, 
+	0xff, 0x8d, 0x77, 0xdf, 0x78, 0xfe, 0x1f, 0xff, 
+	0xdf, 0xff, 0xcb, 0x85, 0xff, 0xbf, 0x9b, 0xf7, 
+	0xff, 0xfd, 0x67, 0x9f, 0x7d, 0xbf, 0xff, 0x2e, 
+	0xfb, 0xbb, 0xfd, 0xfe, 0xff, 0xff, 0xbf, 0xe5, 
+	0xfe, 0xff, 0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xf6, 
+	0xdb, 0xef, 0xff, 0xfd, 0xf7, 0xdf, 0xdf, 0x3a, 
+	0xff, 0xff, 0x3f, 0xcf, 0x3e, 0xfb, 0xff, 0xbd, 
+	0xb1, 0x5f, 0xfb, 0xef, 0xb6, 0xd0, 0xfe, 0xf7, 
+	0xdc, 0x7e, 0xd3, 0xdd, 0xc7, 0xdf, 0x7f, 0xff, 
+	0x71, 0xe7, 0xdd, 0xff, 0x66, 0xe6, 0xdf, 0x77, 
+	0xdf, 0x7e, 0xff, 0xdd, 0x6f, 0xff, 0xfd, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x3f, 0x9b, 0xfb, 0xfb, 0xef, 0xff, 0xff, 0xff, 
+	0xbe, 0xf7, 0xbe, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xa6, 0xfe, 
+	0xef, 0xaf, 0xbf, 0xfe, 0xfb, 0x9f, 0x7f, 0xde, 
+	0xf9, 0xe5, 0x3f, 0xff, 0xff, 0xff, 0x8f, 0x3f, 
+	0xfe, 0xff, 0xab, 0x79, 0xff, 0xeb, 0xab, 0xa6, 
+	0xb6, 0xeb, 0xef, 0xbd, 0xff, 0x56, 0xd1, 0xdf, 
+	0xff, 0xff, 0xbe, 0xf3, 0xcf, 0xff, 0x7f, 0x6f, 
+	0xfe, 0xf7, 0xce, 0xfb, 0xe9, 0xbf, 0xff, 0xfb, 
+	0xff, 0xdf, 0x5f, 0xff, 0xf7, 0xff, 0xdf, 0xff, 
+	0xee, 0xf7, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0x8f, 
+	0x3f, 0xfa, 0xf8, 0xf3, 0xcf, 0x3d, 0xff, 0xd4, 
+	0xe3, 0x9f, 0x7f, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xf6, 0xe6, 0xff, 0xef, 0xff, 0xbf, 0xfe, 0xfb, 
+	0xff, 0x7f, 0xff, 0xf9, 0xf4, 0xbb, 0xff, 0xff, 
+	0xff, 0xc5, 0xd7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfe, 0xff, 0xaf, 0xff, 0xfe, 0xff, 0xdf, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xf5, 
+	0xff, 0xff, 0x6f, 0xfe, 0xdf, 0xfa, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xff, 0xff, 0xff, 0x5f, 0xef, 0xfb, 
+	0xff, 0xdf, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0x9b, 
+	0xff, 0xef, 0xbf, 0xff, 0xfa, 0xef, 0xff, 0xfd, 
+	0xf7, 0xdf, 0xd3, 0xfe, 0xfb, 0xff, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xd3, 0x2f, 
+	0xbf, 0xff, 0xf6, 0x8b, 0xef, 0xff, 0xff, 0xfe, 
+	0xff, 0xf7, 0xff, 0xff, 0xe9, 0xa7, 0xff, 0xdd, 
+	0xbf, 0xe9, 0xff, 0xae, 0x37, 0xfe, 0xaa, 0xeb, 
+	0xad, 0xb7, 0x76, 0xfa, 0x17, 0x1f, 0x7e, 0xf1, 
+	0xf5, 0xd7, 0x4f, 0x7f, 0xfd, 0x6b, 0xfe, 0xff, 
+	0xff, 0x6f, 0x85, 0xec, 0xff, 0xff, 0xff, 0xff, 
+	0x7e, 0xf6, 0xfb, 0xff, 0xfb, 0x2f, 0xfe, 0xfc, 
+	0xff, 0xff, 0x1b, 0xff, 0xf7, 0xff, 0xff, 0xbf, 
+	0xff, 0xfa, 0xdb, 0xef, 0xbf, 0xd6, 0xdd, 0xef, 
+	0xff, 0xef, 0xef, 0xfb, 0xfd, 0xbf, 0x7f, 0x26, 
+	0xfe, 0xff, 0xff, 0x9f, 0x7e, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xbf, 0x78, 0xff, 
+	0xcf, 0x3b, 0x5f, 0xfe, 0xfb, 0xaf, 0x77, 0xed, 
+	0xef, 0xff, 0xff, 0x7f, 0xb4, 0xe1, 0xbf, 0xff, 
+	0x6f, 0xfe, 0x7f, 0xb7, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0xeb, 0xea, 0x7f, 0xf7, 0xff, 0x7f, 0xff, 
+	0xfb, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 
+	0x7f, 0xee, 0xbf, 0xff, 0xff, 0x7b, 0xfe, 0xf7, 
+	0xf7, 0xff, 0xff, 0xff, 0x7f, 0xd7, 0xcf, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xbf, 0xff, 
+	0xff, 0xfd, 0xfb, 0xfd, 0xf9, 0xfe, 0xbf, 0xf9, 
+	0xff, 0xf3, 0xb1, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0x3f, 0xed, 0xfa, 0xdf, 0xff, 0x7f, 
+	0xf7, 0x9f, 0xf7, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 
+	0xf7, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfc, 
+	0xbd, 0xd3, 0xff, 0x7f, 0xff, 0xff, 0x9f, 0x7f, 
+	0xfe, 0xfe, 0x7f, 0xff, 0xbe, 0xfb, 0xfe, 0xff, 
+	0x9b, 0xff, 0xff, 0xef, 0xce, 0xef, 0xdf, 0xff, 
+	0xff, 0xff, 0xdf, 0xbf, 0x77, 0xff, 0xff, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe9, 
+	0x8f, 0xff, 0xff, 0xf7, 0xff, 0xb9, 0xf7, 0xff, 
+	0xe3, 0x6f, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0x5f, 
+	0xfe, 0xbf, 0xf1, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0x7f, 0xef, 0xf7, 0xff, 0xff, 0xed, 0xdf, 0xff, 
+	0xff, 0x3b, 0xfc, 0xff, 0xdb, 0xff, 0x67, 0xfe, 
+	0x7f, 0xfb, 0xfd, 0xef, 0xff, 0xf7, 0xff, 0xff, 
+	0xff, 0x5f, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0x7d, 
+	0xff, 0xf7, 0xfb, 0x9b, 0xf3, 0xff, 0xff, 0xff, 
+	0xfb, 0xbf, 0xbf, 0xfe, 0xfb, 0xff, 0x5f, 0xfe, 
+	0xff, 0x3d, 0x7f, 0xde, 0xfe, 0xff, 0xff, 0xbf, 
+	0x66, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x6f, 0xfa, 
+	0xef, 0xfe, 0xf7, 0x9d, 0xff, 0x5f, 0xcf, 0x3f, 
+	0xfd, 0xff, 0xdf, 0xfb, 0xb7, 0xd9, 0xff, 0x7f, 
+	0xea, 0x3f, 0xff, 0xff, 0xeb, 0xff, 0xac, 0xff, 
+	0xfd, 0xff, 0xdf, 0xff, 0xff, 0xf9, 0xbf, 0xfa, 
+	0xff, 0x6f, 0xdc, 0xff, 0xdf, 0xfa, 0xbb, 0xff, 
+	0xbf, 0xff, 0x7e, 0xeb, 0xdf, 0xff, 0xfe, 0xf5, 
+	0xff, 0xdf, 0xfe, 0x9f, 0xff, 0x5e, 0x99, 0xfb, 
+	0xff, 0xaf, 0xf7, 0x5e, 0x7d, 0xbf, 0xd9, 0x34, 
+	0xff, 0x9f, 0xee, 0xfe, 0xfd, 0xff, 0xff, 0x5f, 
+	0xbf, 0x7f, 0x6e, 0x66, 0xfe, 0xff, 0xef, 0xbd, 
+	0x67, 0xff, 0xbb, 0xa5, 0xef, 0xfb, 0xbd, 0xb9, 
+	0x5f, 0xfd, 0xff, 0xdf, 0x72, 0xe7, 0x8d, 0xb3, 
+	0xa9, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xcb, 0x2b, 
+	0x6f, 0xaf, 0xff, 0x2d, 0xee, 0xde, 0xff, 0xff, 
+	0xff, 0xf5, 0xfd, 0xf9, 0x66, 0xec, 0xff, 0xff, 
+	0xfe, 0xfb, 0xff, 0x95, 0x57, 0xc2, 0xeb, 0xdf, 
+	0xe2, 0x1b, 0xf5, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xba, 0x9b, 0xf7, 0xff, 0xff, 0xc7, 0xdf, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xf6, 0xdf, 
+	0xfe, 0xff, 0xf8, 0xb7, 0xff, 0x77, 0xe6, 0xfd, 
+	0xff, 0xfd, 0xff, 0xdf, 0xe7, 0x9f, 0xfd, 0xf6, 
+	0x9f, 0xdf, 0xbc, 0xeb, 0xcf, 0xff, 0xff, 0xff, 
+	0xfb, 0xed, 0x9d, 0xb1, 0xff, 0xfb, 0xee, 0xbf, 
+	0xfb, 0xf8, 0xa3, 0xef, 0xbe, 0xff, 0xad, 0x66, 
+	0xdb, 0x7e, 0xff, 0xfd, 0x76, 0xda, 0xfd, 0x66, 
+	0xee, 0xff, 0x7f, 0xdf, 0x7d, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xbf, 0xdf, 0xfe, 0xff, 0xff, 
+	0x9b, 0xff, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xfb, 
+	0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 
+	0xf7, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xf7, 
+	0xef, 0xe6, 0xfe, 0xe9, 0xaf, 0xff, 0xde, 0xc7, 
+	0x0b, 0x3f, 0xbd, 0xff, 0x97, 0x7f, 0x5f, 0xff, 
+	0xbf, 0xfd, 0xff, 0x7f, 0xff, 0xbb, 0x61, 0xff, 
+	0x72, 0xbb, 0xef, 0xfe, 0x5b, 0xe2, 0xaf, 0x66, 
+	0xdf, 0xf3, 0xef, 0x97, 0xff, 0x7f, 0xf7, 0xef, 
+	0x57, 0x7f, 0x6f, 0xfe, 0xbb, 0xfe, 0x3b, 0xef, 
+	0xff, 0xfe, 0xdb, 0xfb, 0xff, 0xff, 0xf6, 0xf7, 
+	0xfd, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0x9b, 
+	0xff, 0xaf, 0xcf, 0x3f, 0xfb, 0xfc, 0xf3, 0xcf, 
+	0x3e, 0xff, 0xfc, 0xe7, 0x1f, 0x7d, 0xfe, 0xd9, 
+	0xe7, 0x1f, 0x3d, 0xfe, 0xe6, 0xff, 0xeb, 0xaf, 
+	0xff, 0xfe, 0xf7, 0xcb, 0xaf, 0xbf, 0xff, 0xce, 
+	0xff, 0x5f, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xbc, 
+	0xbf, 0xe1, 0xff, 0xfa, 0xfb, 0xef, 0xff, 0xfd, 
+	0xfa, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xd7, 0xff, 
+	0x7f, 0xff, 0xfd, 0xd7, 0xfb, 0x6f, 0xfe, 0xff, 
+	0xfe, 0xeb, 0xaf, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0x7f, 0xff, 0xf5, 0xff, 0x7f, 0x7d, 0xfd, 
+	0xf5, 0xff, 0x9b, 0xfb, 0xaf, 0xff, 0xff, 0xfb, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xfb, 0x7e, 0x7f, 
+	0xfd, 0xef, 0xdf, 0x5f, 0x7f, 0xad, 0xff, 0xe6, 
+	0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xef, 
+	0xfe, 0xff, 0xbe, 0xff, 0xdf, 0xdf, 0xff, 0xff, 
+	0x97, 0xdf, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbb, 
+	0xe6, 0xf2, 0x8b, 0x2f, 0xba, 0xf8, 0x92, 0x47, 
+	0x5f, 0x7e, 0xed, 0xb5, 0xd7, 0x5a, 0x74, 0xfd, 
+	0x6f, 0xfe, 0xff, 0xff, 0xff, 0xcf, 0x3e, 0xff, 
+	0xfd, 0xff, 0x7f, 0x7f, 0xfd, 0xff, 0xfa, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xfe, 0x1b, 0xff, 0xf7, 
+	0xf7, 0xbf, 0xfd, 0xee, 0xd7, 0xdf, 0x7f, 0xff, 
+	0xff, 0xfd, 0xed, 0xf7, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0x7f, 0xa6, 0xde, 0x7f, 0xff, 0xff, 0xfe, 
+	0xfe, 0xff, 0xf7, 0xdf, 0x5d, 0xf7, 0xfb, 0xf1, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x9f, 0xf9, 
+	0xff, 0x7a, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xeb, 
+	0xff, 0xff, 0xf5, 0xf7, 0x97, 0xfd, 0xed, 0xbf, 
+	0xfd, 0xdb, 0xff, 0x67, 0xfc, 0xe7, 0xfe, 0xdf, 
+	0xff, 0xff, 0xff, 0xbf, 0xfb, 0xbe, 0xfe, 0xf7, 
+	0xff, 0xee, 0xfe, 0xff, 0xff, 0xfd, 0x3d, 0xfe, 
+	0x98, 0xf7, 0xef, 0xff, 0xef, 0xdf, 0xcf, 0xbf, 
+	0xbf, 0xff, 0xfb, 0xd7, 0x5b, 0x77, 0xef, 0xbf, 
+	0xcf, 0x7f, 0xdf, 0xfd, 0x7f, 0x46, 0xef, 0xdb, 
+	0x77, 0xfb, 0xff, 0xfc, 0x77, 0x7f, 0x3f, 0xf6, 
+	0xdd, 0xa5, 0xff, 0xff, 0xff, 0xed, 0xa6, 0xfd, 
+	0xff, 0xbf, 0xf9, 0xff, 0x7b, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0xfe, 0xff, 0x7f, 0xf3, 0xbd, 0xfe, 
+	0xff, 0x7f, 0xff, 0xd7, 0xbf, 0xff, 0x6f, 0xfe, 
+	0xff, 0xff, 0xff, 0xf3, 0xff, 0xcf, 0x7f, 0xf5, 
+	0xfd, 0xd6, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xf3, 0xff, 0xbb, 0x9b, 0xff, 0xf9, 0xff, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xef, 
+	0xff, 0x97, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0xe6, 0xff, 0xdf, 0x7b, 0x7f, 0xfd, 0xff, 0xff, 
+	0xff, 0xd3, 0x4e, 0x77, 0xd7, 0x7f, 0xbf, 0xbd, 
+	0xf6, 0x9f, 0x67, 0xfe, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xdf, 0xfe, 0xdf, 0x7e, 0xff, 0xff, 0xdf, 0xf7, 
+	0xed, 0xbf, 0xfd, 0x3f, 0xff, 0xfc, 0xf4, 0xcf, 
+	0xfd, 0x6f, 0xfe, 0xff, 0xee, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0x7f, 0xff, 0x9f, 0xf7, 0xff, 0xfd, 
+	0x5f, 0xbf, 0x7f, 0xff, 0xd7, 0xff, 0x1b, 0xfe, 
+	0xff, 0xff, 0xcb, 0xef, 0xbf, 0xbf, 0xd4, 0xfb, 
+	0xef, 0xbf, 0xfe, 0xcf, 0xff, 0xfd, 0xff, 0xff, 
+	0x7f, 0xfd, 0x3f, 0x66, 0xff, 0xff, 0xf5, 0xd6, 
+	0xfd, 0xef, 0xbf, 0x7c, 0xff, 0xfb, 0xff, 0xff, 
+	0xde, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xb7, 
+	0xf9, 0x5f, 0xf2, 0xff, 0xff, 0x97, 0xff, 0xfb, 
+	0xff, 0xec, 0x7f, 0xfd, 0xff, 0xf4, 0x4b, 0xcf, 
+	0xff, 0xff, 0xdc, 0xfe, 0x6f, 0xd6, 0xb3, 0xfe, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0xfa, 0x5f, 
+	0xcf, 0xff, 0xf5, 0xd4, 0xf9, 0xff, 0x9f, 0xf7, 
+	0x5f, 0x9b, 0xfb, 0xef, 0xfe, 0xf7, 0xdf, 0x4f, 
+	0x2f, 0xdd, 0xf7, 0xd3, 0xf7, 0x7f, 0xb6, 0xbf, 
+	0xfc, 0xff, 0xcf, 0x3a, 0xfd, 0xee, 0x66, 0xfe, 
+	0xfb, 0xff, 0xff, 0xff, 0xde, 0x7b, 0xf3, 0xff, 
+	0xfe, 0xdd, 0xbf, 0xcd, 0x2d, 0xf7, 0x5d, 0x91, 
+	0x43, 0x8d, 0xb3, 0xb1, 0xff, 0x7e, 0xbd, 0xfc, 
+	0xbe, 0xf6, 0xfa, 0xfe, 0xa5, 0x7d, 0xbf, 0xff, 
+	0xf7, 0x5f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x66, 
+	0xee, 0xbf, 0x5f, 0x5f, 0x7d, 0x2f, 0xbd, 0xf5, 
+	0x0f, 0x0b, 0xdf, 0xc7, 0xfb, 0xf5, 0xd7, 0xff, 
+	0x7f, 0xf3, 0xf7, 0x3f, 0x9b, 0xf7, 0xff, 0xfd, 
+	0xfd, 0xf7, 0xdf, 0x7c, 0xdb, 0xfd, 0xb7, 0xfb, 
+	0xfd, 0xf6, 0xdf, 0x7e, 0xff, 0xfd, 0xfe, 0xdf, 
+	0xb7, 0xe6, 0xfd, 0xbf, 0x7f, 0xfe, 0xf9, 0x6f, 
+	0xbf, 0x7f, 0xfe, 0x5b, 0xff, 0xfa, 0xeb, 0xff, 
+	0xbf, 0xfe, 0x7b, 0xff, 0xaf, 0xbd, 0xb1, 0xff, 
+	0xfb, 0x8f, 0x3f, 0xfe, 0xea, 0xeb, 0xcf, 0xbf, 
+	0xc7, 0xdd, 0x27, 0xdb, 0x6e, 0xf7, 0xad, 0xc6, 
+	0xda, 0xf6, 0x66, 0xe6, 0xdf, 0xf7, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0x7f, 
+	0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0x3f, 0x9b, 
+	0xfb, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xfb, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0xff, 0xfe, 
+	0xfd, 0xdf, 0xff, 0xef, 0xa6, 0xde, 0xef, 0x7d, 
+	0xf4, 0xf1, 0xd3, 0x4f, 0x7f, 0xfc, 0xf4, 0xfd, 
+	0x9f, 0x7f, 0x7f, 0xfd, 0xff, 0x97, 0x5b, 0xff, 
+	0xab, 0x79, 0xdf, 0xaa, 0xbf, 0xff, 0xb6, 0xfa, 
+	0x6b, 0xbf, 0xbf, 0x7a, 0xf9, 0xee, 0x92, 0x5f, 
+	0xfe, 0xbb, 0xdd, 0x56, 0x7f, 0x6f, 0xfe, 0xf7, 
+	0xfe, 0xef, 0xff, 0xff, 0xbf, 0xfe, 0x7f, 0xef, 
+	0x5f, 0xff, 0xff, 0xf5, 0xf7, 0xef, 0xef, 0xdd, 
+	0x75, 0xff, 0x9b, 0xff, 0xaf, 0xcf, 0x6f, 0xb7, 
+	0xed, 0xa4, 0xd3, 0x3d, 0xfb, 0xd4, 0xe7, 0x1f, 
+	0x7d, 0xf4, 0xd9, 0xc7, 0x1f, 0x7d, 0xfe, 0xe6, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0x7f, 
+	0xbe, 0xfe, 0xe4, 0xff, 0x5f, 0x7f, 0xfd, 0xff, 
+	0xd7, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xff, 
+	0xf7, 0x9f, 0x5e, 0x7f, 0xfd, 0xaf, 0x7f, 0xf9, 
+	0xff, 0xd7, 0x5f, 0xff, 0xff, 0xf5, 0xf5, 0xff, 
+	0x6f, 0xfe, 0xdf, 0xfb, 0xbf, 0xdc, 0xf2, 0x8b, 
+	0x2f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf5, 0xd7, 
+	0xff, 0x7f, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xef, 
+	0xff, 0xc7, 0x1f, 0x6f, 0xed, 0xf5, 0xf7, 0xdf, 
+	0x93, 0xff, 0x7f, 0xf9, 0xf5, 0xff, 0x5f, 0x73, 
+	0xed, 0xff, 0x66, 0xff, 0xcf, 0xff, 0xff, 0xff, 
+	0xff, 0xcf, 0xff, 0xfe, 0xbc, 0xfd, 0x97, 0xbf, 
+	0x7e, 0xef, 0xfd, 0xa7, 0xdf, 0xff, 0xbf, 0xe9, 
+	0xdf, 0x2f, 0xbe, 0xfa, 0xea, 0xab, 0x2f, 0xbe, 
+	0xfc, 0xba, 0xd7, 0x5b, 0x7f, 0xdd, 0x75, 0xd7, 
+	0x5b, 0x34, 0xfc, 0x6b, 0xfe, 0xdf, 0xff, 0xd7, 
+	0xcf, 0x7e, 0xf7, 0xf6, 0xff, 0xee, 0xbf, 0xbf, 
+	0xbf, 0xfe, 0xff, 0xfb, 0xaf, 0xdf, 0xff, 0xff, 
+	0x1b, 0xff, 0x7f, 0xbf, 0xfd, 0xfe, 0x7b, 0xf7, 
+	0xff, 0xef, 0x7f, 0x7f, 0xff, 0xe7, 0x1f, 0xde, 
+	0xff, 0xff, 0xb7, 0xfb, 0x5e, 0xe6, 0xdf, 0xff, 
+	0xff, 0x67, 0x7f, 0xff, 0xf5, 0xff, 0x7f, 0xdf, 
+	0xef, 0xfb, 0xee, 0xff, 0xdf, 0xef, 0xff, 0xfd, 
+	0xff, 0xbf, 0xf9, 0xdf, 0xff, 0xfd, 0xff, 0xfd, 
+	0xff, 0xb3, 0xde, 0xaf, 0x7f, 0xf5, 0xf7, 0x67, 
+	0xdb, 0x7f, 0x7d, 0xdd, 0x46, 0xff, 0x6b, 0xfe, 
+	0xff, 0xff, 0x7f, 0xff, 0xfb, 0x7d, 0xff, 0xff, 
+	0xda, 0x37, 0x7f, 0xdf, 0xff, 0xbf, 0x6f, 0xd5, 
+	0xfd, 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xef, 0xff, 
+	0xdf, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0x39, 
+	0xff, 0xdf, 0xef, 0xf6, 0x7f, 0xff, 0xb7, 0xff, 
+	0xe6, 0xdd, 0xff, 0x7b, 0xdf, 0xff, 0xf7, 0x9f, 
+	0xff, 0xff, 0xfd, 0xfe, 0xd7, 0xfd, 0xfe, 0xff, 
+	0xbf, 0xbe, 0x5f, 0xbf, 0xb7, 0xb9, 0xff, 0xff, 
+	0xff, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xfb, 0xbd, 
+	0xef, 0xbf, 0xfa, 0xfb, 0xff, 0xff, 0x2f, 0x7f, 
+	0xfa, 0x6f, 0xfe, 0xdf, 0xdf, 0x5f, 0xfd, 0xd7, 
+	0xdd, 0x7f, 0xfa, 0xfd, 0xf6, 0x3f, 0xf4, 0xf1, 
+	0xff, 0xff, 0xbd, 0xff, 0x7e, 0xff, 0x9b, 0xfd, 
+	0xff, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xf6, 0xed, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfe, 0xe6, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0x6e, 0xff, 0xdf, 
+	0x7f, 0xbf, 0xdd, 0x7e, 0xfb, 0x6f, 0xfe, 0xbf, 
+	0xf1, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x17, 
+	0x7f, 0xbf, 0xfc, 0xeb, 0xfb, 0xef, 0xed, 0xfb, 
+	0xf7, 0xff, 0xcd, 0xfb, 0x63, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xfe, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0x9b, 0xff, 0xff, 0x97, 0xf7, 0xff, 0xbf, 
+	0xff, 0xff, 0xcf, 0x6b, 0x5d, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x2f, 0xfd, 0xbf, 0x66, 0xff, 
+	0xff, 0xec, 0xbf, 0x5f, 0xff, 0xfb, 0xff, 0xbf, 
+	0x9b, 0xdd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0x58, 0xff, 0xb7, 0xd9, 0xff, 0xff, 0xfb, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xfc, 0x73, 0x3f, 0xaf, 
+	0xff, 0xff, 0xff, 0x3b, 0xff, 0xdf, 0xf9, 0x6f, 
+	0xde, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xff, 
+	0x7f, 0xff, 0xdc, 0x67, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xed, 0xbf, 0x75, 0x5e, 0x9b, 0xfb, 0xf5, 0xbf, 
+	0xf7, 0x9b, 0x7d, 0xbf, 0xd9, 0xb7, 0x9b, 0xdd, 
+	0xea, 0xf8, 0xff, 0xff, 0xbf, 0xf7, 0xdf, 0xcb, 
+	0xee, 0x66, 0xbe, 0xfd, 0xef, 0xbe, 0x66, 0xff, 
+	0x6b, 0xf6, 0xbf, 0x5b, 0xdd, 0x7b, 0xeb, 0xff, 
+	0xff, 0xef, 0x7f, 0xff, 0xb5, 0xb3, 0xa9, 0xff, 
+	0xff, 0xbb, 0xbf, 0xff, 0xdb, 0xfb, 0x7f, 0xac, 
+	0x72, 0x27, 0x7f, 0xfe, 0xeb, 0xef, 0xbb, 0xfd, 
+	0x9f, 0xfe, 0x66, 0xee, 0xff, 0xff, 0x1e, 0xeb, 
+	0xff, 0x85, 0xfe, 0xcf, 0x6b, 0xd5, 0xc3, 0xb7, 
+	0xff, 0xfe, 0xe3, 0x8e, 0xfd, 0xc5, 0xbf, 0x1b, 
+	0xf7, 0xff, 0xff, 0x6d, 0x3f, 0xdf, 0xff, 0xdb, 
+	0xfd, 0xf7, 0xbf, 0xf9, 0xdf, 0x7f, 0x7f, 0xfe, 
+	0xed, 0xff, 0xdb, 0x77, 0xe6, 0x5d, 0xff, 0x7f, 
+	0xfe, 0xff, 0xe7, 0xff, 0x79, 0xfe, 0xf9, 0xcf, 
+	0x7e, 0xfb, 0xcf, 0x3f, 0xef, 0xff, 0xfb, 0xac, 
+	0xb5, 0xb1, 0xef, 0xfb, 0x8f, 0xb7, 0xff, 0x78, 
+	0xfb, 0xcd, 0x35, 0xd6, 0xd1, 0x16, 0x9a, 0x7f, 
+	0xfa, 0xf9, 0x77, 0xdf, 0xe3, 0x66, 0xee, 0xff, 
+	0xff, 0xff, 0xfc, 0xff, 0xcf, 0x3f, 0xff, 0xfd, 
+	0xff, 0xb7, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 
+	0xfe, 0x3b, 0x9b, 0xfb, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xfd, 0xf7, 0xdb, 0xff, 0xff, 0xf7, 0xf7, 
+	0xdf, 0xff, 0xfe, 0xf7, 0xdf, 0x77, 0xef, 0xe6, 
+	0xfe, 0xff, 0x2f, 0xfc, 0xfe, 0xc7, 0xef, 0x3f, 
+	0xbc, 0xf0, 0x87, 0x7a, 0x4f, 0x7d, 0xf5, 0xce, 
+	0xf7, 0x7f, 0xfe, 0xbb, 0x79, 0xff, 0x7f, 0x89, 
+	0xed, 0xfe, 0xfb, 0x6e, 0x99, 0x3f, 0x76, 0xb3, 
+	0xce, 0x97, 0x6f, 0xfe, 0xfb, 0xe7, 0x5f, 0x7f, 
+	0x6f, 0xfa, 0xff, 0xff, 0xff, 0xeb, 0x7f, 0xbf, 
+	0xde, 0xf3, 0xa9, 0x5e, 0xed, 0xfb, 0xd5, 0x57, 
+	0xef, 0x3d, 0xff, 0x7f, 0xdf, 0x9b, 0xfe, 0xff, 
+	0xcf, 0x0d, 0xba, 0xfc, 0xa3, 0x8f, 0x3f, 0xfb, 
+	0xd4, 0xe7, 0x17, 0x3d, 0xf4, 0xd8, 0x41, 0x8f, 
+	0x5f, 0xfe, 0xe6, 0xff, 0xff, 0x2f, 0xf7, 0xfe, 
+	0xe7, 0xef, 0x3f, 0xdf, 0xfe, 0xf6, 0xff, 0x5f, 
+	0x3f, 0xfd, 0x7e, 0xfa, 0x6b, 0xff, 0xbf, 0xf9, 
+	0x6f, 0xff, 0xeb, 0xe7, 0xdf, 0xff, 0xfe, 0xfb, 
+	0xff, 0x7f, 0xff, 0xff, 0xd5, 0x5f, 0xdf, 0x7f, 
+	0xff, 0xd7, 0xf7, 0x6f, 0xfe, 0xff, 0xff, 0xb7, 
+	0xfe, 0xfa, 0xef, 0xff, 0xf3, 0xef, 0xff, 0x7f, 
+	0xdf, 0xf5, 0xd6, 0xfb, 0x7f, 0xff, 0x77, 0xff, 
+	0x1b, 0xfe, 0xff, 0xff, 0x27, 0x1f, 0x7c, 0xfa, 
+	0xbd, 0xd7, 0xdf, 0xfb, 0xfe, 0x7b, 0xbf, 0x75, 
+	0xde, 0xd9, 0x7f, 0xef, 0xff, 0xe6, 0xff, 0xff, 
+	0xed, 0x3f, 0xfd, 0xef, 0x93, 0xff, 0xff, 0xff, 
+	0xfc, 0xa7, 0xff, 0xff, 0xef, 0xff, 0xff, 0x97, 
+	0xea, 0xbf, 0xf9, 0xff, 0xaf, 0x37, 0x7c, 0xf2, 
+	0xab, 0x0f, 0xbf, 0xfa, 0xe0, 0x96, 0x1f, 0x7d, 
+	0xfd, 0xb5, 0xd7, 0x5f, 0x73, 0xfd, 0x6f, 0xfe, 
+	0xef, 0x7f, 0xf7, 0xf7, 0xff, 0x7e, 0xf3, 0xb7, 
+	0xcf, 0x7f, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xfe, 
+	0xdf, 0xdf, 0xff, 0x1b, 0xfd, 0xfe, 0xbb, 0xdf, 
+	0xff, 0xfe, 0xf7, 0x5f, 0x6d, 0xfe, 0x17, 0xff, 
+	0xff, 0xcf, 0xff, 0x77, 0xfe, 0xff, 0xef, 0x7f, 
+	0xe6, 0xff, 0xfe, 0xf6, 0xdf, 0x75, 0xdf, 0xfd, 
+	0xff, 0xdb, 0xea, 0x7f, 0xbf, 0xff, 0xaf, 0xef, 
+	0xff, 0xff, 0xfe, 0xff, 0xbf, 0xf1, 0xff, 0xff, 
+	0x7f, 0xcd, 0xff, 0xff, 0x7b, 0xfe, 0xcf, 0xff, 
+	0x7d, 0xe7, 0xd7, 0x5e, 0xd6, 0xe7, 0xe9, 0xde, 
+	0xfe, 0x67, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xef, 0xff, 0xff, 0xfe, 0xf7, 0xdf, 0xfe, 0xeb, 
+	0x5f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xbf, 
+	0xff, 0xf3, 0xff, 0xf7, 0xef, 0xef, 0xdb, 0xdf, 
+	0xd7, 0xb7, 0xfe, 0xc7, 0x9f, 0xfd, 0xff, 0x35, 
+	0x77, 0xdf, 0xbf, 0xe6, 0xff, 0xdd, 0x7f, 0xbf, 
+	0xfe, 0x77, 0xdf, 0x7d, 0xff, 0xef, 0xde, 0xfe, 
+	0xff, 0xef, 0x9b, 0xef, 0xf7, 0xef, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb5, 0xff, 
+	0xfd, 0xf7, 0xf7, 0x6f, 0x9f, 0x7e, 0xff, 0xfd, 
+	0xbf, 0xbc, 0xff, 0xfb, 0x6f, 0xfe, 0xef, 0xff, 
+	0xff, 0xf3, 0xff, 0x37, 0xd7, 0xbf, 0xff, 0xdf, 
+	0xef, 0xff, 0xbe, 0x43, 0xff, 0xf9, 0xbf, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xff, 
+	0xaf, 0xff, 0xff, 0xdf, 0xf7, 0xf5, 0xff, 0xf7, 
+	0x97, 0x7b, 0xfd, 0xff, 0xff, 0xdf, 0x66, 0xff, 
+	0xff, 0xfe, 0x7f, 0xbf, 0xe3, 0xff, 0xff, 0xf7, 
+	0x4f, 0xff, 0xdf, 0xf9, 0xf5, 0xf5, 0xff, 0xdf, 
+	0x6d, 0xaf, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0x7b, 
+	0x3f, 0x56, 0xff, 0xfd, 0x7e, 0xff, 0xcf, 0xa1, 
+	0xfd, 0xbf, 0xfd, 0xff, 0xf3, 0xd7, 0xff, 0x6f, 
+	0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0xfd, 0xfb, 0x9b, 0xff, 0xfc, 0xf1, 
+	0xc1, 0x2f, 0xbf, 0x78, 0xf4, 0x95, 0xd7, 0xff, 
+	0xf2, 0xef, 0x7b, 0xff, 0xfe, 0xf2, 0xef, 0x8f, 
+	0xff, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 
+	0xbf, 0xff, 0xfe, 0xfa, 0xdf, 0xff, 0xff, 0x2f, 
+	0xf5, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xd9, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0xec, 
+	0xff, 0xfb, 0xff, 0xff, 0x59, 0xfe, 0xff, 0xfd, 
+	0xff, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0x2f, 0xbf, 
+	0xfc, 0xd4, 0xff, 0xe6, 0xff, 0xff, 0x5f, 0x1b, 
+	0xf5, 0xff, 0xff, 0xff, 0x3f, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xd9, 0x67, 0x9f, 0xf5, 0xef, 
+	0xf9, 0xff, 0xff, 0x57, 0xe6, 0x7e, 0xfd, 0xff, 
+	0xbf, 0xfe, 0x9a, 0x7d, 0xff, 0xfd, 0x76, 0xbf, 
+	0x9f, 0x7e, 0x7a, 0xcf, 0xde, 0xdf, 0xff, 0xff, 
+	0xbb, 0x91, 0x5f, 0xff, 0xff, 0xaf, 0xbe, 0x66, 
+	0xff, 0xff, 0xef, 0xee, 0xff, 0xb7, 0xdf, 0x5e, 
+	0xbd, 0xff, 0x5f, 0xfb, 0xff, 0x64, 0xec, 0xff, 
+	0xff, 0xff, 0xeb, 0xbf, 0xff, 0xf7, 0x4f, 0xad, 
+	0xff, 0x65, 0xfd, 0xf5, 0xd7, 0xe3, 0xef, 0xfd, 
+	0xff, 0xbf, 0x19, 0xf9, 0xff, 0xff, 0xff, 0xfa, 
+	0xfb, 0xff, 0xfc, 0xc7, 0xde, 0xff, 0x4a, 0x7e, 
+	0xf9, 0x15, 0xfe, 0xf7, 0xff, 0xff, 0xef, 0x86, 
+	0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbf, 0xf9, 0xe6, 0xdb, 0xee, 
+	0xff, 0xf9, 0xe7, 0xbd, 0x69, 0x5f, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe7, 0x9f, 0x7f, 0xfe, 0xf3, 
+	0xdf, 0x7e, 0xfb, 0xec, 0x3f, 0xff, 0xfc, 0x73, 
+	0x67, 0xae, 0xef, 0x7e, 0xfb, 0xef, 0xb7, 0xff, 
+	0xfc, 0xe3, 0x8f, 0x7f, 0xfc, 0x75, 0xd7, 0x9d, 
+	0x77, 0xfb, 0xed, 0xf7, 0xbb, 0x99, 0xf8, 0xff, 
+	0xdb, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf, 
+	0xdf, 0xef, 0xe6, 0xf6, 0xff, 0xfe, 0xff, 0xdf, 
+	0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xbb, 0xb9, 
+	0xff, 0xff, 0xef, 0xff, 0xbf, 0xfe, 0xd2, 0x5f, 
+	0x7f, 0xf5, 0xeb, 0xe5, 0x97, 0xfb, 0xb8, 0xff, 
+	0xfd, 0xdf, 0xff, 0x6e, 0xde, 0xff, 0xff, 0xf6, 
+	0xff, 0xef, 0xbe, 0xf8, 0xef, 0xbf, 0xff, 0x7d, 
+	0xb5, 0xd5, 0x3e, 0xff, 0x7e, 0xfb, 0xef, 0xdf, 
+	0x9b, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xeb, 0xaf, 
+	0xf7, 0xff, 0xbf, 0xff, 0xdd, 0xff, 0xff, 0x7f, 
+	0xf7, 0xdf, 0xbf, 0xfd, 0xff, 0xe6, 0xff, 0xff, 
+	0xe3, 0xcb, 0x0f, 0xfe, 0xe8, 0xf1, 0xc3, 0x0f, 
+	0x7f, 0xf0, 0xe5, 0x9f, 0x7b, 0xfc, 0xf9, 0xe7, 
+	0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xcf, 0xf6, 0xdb, 
+	0x7e, 0xe7, 0x9d, 0x77, 0x9e, 0xf3, 0xf6, 0xdb, 
+	0xff, 0xfc, 0xff, 0xfd, 0xdf, 0xff, 0x6f, 0xfe, 
+	0xff, 0xff, 0xfe, 0xfc, 0xf3, 0xcf, 0x3f, 0x7f, 
+	0xfc, 0xf1, 0x8f, 0x7d, 0xfc, 0xdf, 0xff, 0x7f, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xbc, 
+	0x7f, 0xee, 0xfb, 0xe7, 0xaf, 0xbf, 0xfe, 0xf5, 
+	0xd7, 0xfd, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 
+	0xe6, 0xff, 0xff, 0x6f, 0xf3, 0xff, 0x1f, 0x7f, 
+	0xfc, 0xf5, 0xd7, 0xbe, 0xfe, 0xd8, 0xfb, 0xef, 
+	0xf5, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xfd, 0x97, 0xdf, 0xfe, 0xff, 0xed, 0xff, 
+	0xf3, 0x6d, 0xfe, 0xff, 0xeb, 0xaf, 0xbe, 0xfc, 
+	0xfa, 0xe3, 0xaf, 0xbe, 0xea, 0xd5, 0x16, 0x5b, 
+	0x77, 0xed, 0x55, 0xd7, 0x5f, 0xfb, 0x9b, 0xff, 
+	0xff, 0xf7, 0xbc, 0xff, 0xbf, 0xbf, 0xd7, 0xcd, 
+	0xf3, 0xdf, 0xfd, 0xf9, 0xbf, 0xdd, 0x9f, 0xdf, 
+	0xff, 0xff, 0xff, 0xc6, 0xff, 0xde, 0x6f, 0xfb, 
+	0xff, 0x9f, 0x6d, 0xef, 0x5f, 0xfc, 0xf7, 0xfb, 
+	0xef, 0xb7, 0x7f, 0xfd, 0xfb, 0xff, 0xdf, 0x9f, 
+	0xf9, 0xff, 0xff, 0xf7, 0xfd, 0xfd, 0xff, 0xef, 
+	0xfd, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xfe, 0xff, 
+	0xfd, 0xbf, 0xfe, 0xff, 0x6f, 0xfc, 0xff, 0xff, 
+	0xbf, 0xff, 0xbf, 0xb5, 0xff, 0xff, 0xfe, 0xff, 
+	0xfe, 0xb5, 0xfd, 0xdf, 0x7f, 0x5f, 0xff, 0xb5, 
+	0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0x7b, 0xff, 0xff, 0x7f, 0xfe, 0xf7, 0xf7, 0x7b, 
+	0xfd, 0xf3, 0x7f, 0xff, 0x4d, 0xff, 0xe6, 0xff, 
+	0xfd, 0xbf, 0xff, 0xfc, 0xfe, 0xff, 0x7c, 0xff, 
+	0xf1, 0x6f, 0xf7, 0x7f, 0xf7, 0xff, 0xff, 0xff, 
+	0xcf, 0xff, 0xaf, 0xf9, 0xf3, 0xff, 0xdf, 0xdf, 
+	0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 
+	0xc7, 0x5f, 0x7d, 0xed, 0x6d, 0xd7, 0xff, 0x6f, 
+	0xfa, 0xff, 0xff, 0x97, 0xff, 0xff, 0xdf, 0xff, 
+	0xfb, 0xbf, 0xef, 0xf9, 0xaf, 0xff, 0xfa, 0xff, 
+	0xdb, 0xfd, 0xff, 0xfe, 0x9b, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0xf3, 0xfd, 0xdf, 0xff, 0x1f, 0xff, 
+	0x99, 0xf7, 0xfe, 0x5f, 0xfe, 0xff, 0xbc, 0xff, 
+	0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xd6, 
+	0x3f, 0xfe, 0xdf, 0x37, 0xff, 0xbb, 0xbf, 0xfb, 
+	0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xb9, 0xff, 
+	0x7f, 0xdf, 0x7f, 0xfb, 0xef, 0x7f, 0xfd, 0xb8, 
+	0xf3, 0x5f, 0xf3, 0x9f, 0x7b, 0xff, 0xfd, 0x7e, 
+	0xdf, 0xef, 0x6f, 0xee, 0xff, 0xff, 0xf7, 0xff, 
+	0xf5, 0xff, 0xff, 0xdb, 0xef, 0x7f, 0xfb, 0xeb, 
+	0xcf, 0x9d, 0x7f, 0xbf, 0xf7, 0xd7, 0xff, 0x9b, 
+	0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xfc, 
+	0xfe, 0xea, 0xdf, 0xdb, 0x7f, 0xef, 0x55, 0xd7, 
+	0xed, 0x7f, 0xfd, 0xff, 0x86, 0xff, 0xff, 0xff, 
+	0xfd, 0xff, 0xee, 0xff, 0xbf, 0xfd, 0xff, 0xff, 
+	0x3f, 0xff, 0xfc, 0xed, 0xff, 0xf7, 0x7f, 0xff, 
+	0x8f, 0xd9, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xfd, 
+	0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xee, 0xbf, 0xdf, 
+	0xff, 0xff, 0xff, 0xd7, 0xff, 0x6d, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xff, 0x5e, 0x7b, 0xf9, 
+	0xd5, 0xcf, 0xff, 0xfd, 0xda, 0xf3, 0x2f, 0xff, 
+	0xf5, 0xff, 0x9b, 0xf5, 0xff, 0xbf, 0xff, 0xff, 
+	0xfb, 0xad, 0xb3, 0xcf, 0x3e, 0xf7, 0xf9, 0xff, 
+	0x9d, 0xfd, 0xfc, 0x7f, 0x6f, 0xfd, 0xd7, 0xe6, 
+	0xfe, 0xff, 0xbf, 0x99, 0xf6, 0xde, 0xfe, 0x75, 
+	0xd9, 0xf4, 0xa7, 0xff, 0x7f, 0xaf, 0xcb, 0x7e, 
+	0xb3, 0x57, 0xaf, 0xbb, 0x99, 0xff, 0xff, 0x6b, 
+	0xa6, 0xbe, 0xfb, 0xee, 0x7d, 0xbf, 0xfd, 0xed, 
+	0xdf, 0x77, 0xeb, 0xab, 0xb7, 0x66, 0x53, 0xed, 
+	0x6c, 0xec, 0xff, 0xff, 0xfb, 0xab, 0xec, 0xd7, 
+	0xbe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0xff, 0x7f, 0xbf, 0xf4, 0xbf, 0x99, 0xfb, 0xff, 
+	0xbf, 0xfe, 0x7a, 0x39, 0xac, 0xbf, 0xfc, 0xf2, 
+	0x97, 0x5f, 0x7f, 0xfd, 0xe5, 0xdf, 0x7f, 0x7f, 
+	0xfd, 0xcf, 0xe6, 0xfd, 0xff, 0xff, 0xff, 0xfd, 
+	0xf7, 0xff, 0x7f, 0xf3, 0xcd, 0x6f, 0xfe, 0xf9, 
+	0xb7, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xad, 0x79, 
+	0xff, 0xff, 0xff, 0x79, 0xfe, 0xf9, 0xff, 0xbf, 
+	0xfd, 0xf6, 0xb7, 0xff, 0xfc, 0xfb, 0xed, 0xbf, 
+	0xff, 0xfe, 0x7b, 0x6f, 0xe8, 0xff, 0x7e, 0xfb, 
+	0x8f, 0x3f, 0xd7, 0xf6, 0xeb, 0xac, 0x7b, 0x8d, 
+	0xfd, 0x76, 0x5f, 0x77, 0xf3, 0x79, 0xf6, 0xbd, 
+	0x99, 0xf9, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0x3f, 0xff, 0xff, 0xef, 0xb7, 0xff, 0xff, 
+	0xff, 0xff, 0xb7, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 
+	0xfd, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xef, 0xff, 
+	0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xbb, 0xa9, 0x7f, 0xfa, 0xef, 0x6f, 0xbe, 
+	0xf4, 0xfb, 0xcb, 0x3f, 0x7f, 0xf9, 0xf5, 0xf7, 
+	0x5f, 0xfe, 0xff, 0xcf, 0xf7, 0xff, 0x6a, 0xde, 
+	0xbf, 0xdc, 0xee, 0x9b, 0x2d, 0xfe, 0xfc, 0x6a, 
+	0xab, 0x5f, 0x7d, 0xf9, 0xe5, 0x57, 0xff, 0xbe, 
+	0xfb, 0xef, 0xdf, 0x9b, 0xff, 0xaf, 0xbf, 0x7e, 
+	0x6e, 0xeb, 0xb6, 0xbf, 0xdf, 0xff, 0xf7, 0x5f, 
+	0x7f, 0xfd, 0x7d, 0xf3, 0xff, 0xfd, 0xff, 0xff, 
+	0xe6, 0xff, 0xeb, 0xa3, 0x87, 0x1f, 0x7a, 0xec, 
+	0xe1, 0x87, 0x0f, 0xfd, 0xd8, 0x41, 0x1f, 0x7f, 
+	0xfc, 0xf9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 
+	0xef, 0x77, 0x97, 0x58, 0xfb, 0xed, 0xb7, 0x9f, 
+	0xfd, 0xf4, 0xd3, 0x7f, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xa3, 
+	0x8f, 0x3f, 0xfb, 0xe8, 0x73, 0x1f, 0x7d, 0xf4, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0x9f, 0xf7, 0xea, 0xbb, 0xe7, 0x9f, 
+	0x3f, 0xfe, 0x53, 0x47, 0xfd, 0xff, 0xf7, 0x5f, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xf1, 
+	0xe7, 0x9a, 0xfb, 0xfc, 0xb1, 0xc7, 0x3f, 0x96, 
+	0x5d, 0xff, 0xef, 0xfd, 0xd7, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xcb, 0xff, 0xef, 0xf9, 0xf2, 
+	0xff, 0x2f, 0x2f, 0xf9, 0xff, 0xfd, 0xff, 0x7f, 
+	0x7a, 0xe9, 0xf7, 0xff, 0x6f, 0xfa, 0xff, 0xcb, 
+	0xae, 0xbf, 0xf6, 0x7a, 0x6b, 0xaf, 0xb9, 0xce, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xdd, 0xf5, 0xd6, 0x5d, 
+	0xff, 0x9a, 0xfd, 0xff, 0xff, 0xfb, 0x63, 0xdb, 
+	0xfd, 0xf7, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xc6, 0xff, 
+	0xff, 0xfb, 0x9f, 0xfb, 0x9d, 0xdd, 0xfe, 0xff, 
+	0xff, 0xbf, 0x7f, 0xff, 0xed, 0xff, 0xff, 0x3f, 
+	0xff, 0xfd, 0x9f, 0xf9, 0x9f, 0xff, 0x7d, 0x57, 
+	0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0x7f, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0x3f, 0xfa, 0xfb, 0xef, 0xfb, 0xbe, 0xff, 
+	0xbb, 0xff, 0x7b, 0xdf, 0xb5, 0xf0, 0xdf, 0xfd, 
+	0xff, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xeb, 
+	0xf7, 0xff, 0xfd, 0x7b, 0xff, 0x5f, 0xff, 0xf5, 
+	0xfb, 0xff, 0xf6, 0x7f, 0xff, 0xd7, 0xff, 0x5f, 
+	0xff, 0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xf7, 0xbf, 
+	0xff, 0xef, 0xfe, 0xff, 0xf7, 0xf7, 0xfd, 0x77, 
+	0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xef, 
+	0xff, 0xff, 0xff, 0xbf, 0xfc, 0xf6, 0xdf, 0x7f, 
+	0x3b, 0xfc, 0xff, 0x7f, 0xff, 0xf7, 0xbb, 0xfd, 
+	0xfe, 0xff, 0x6f, 0xfe, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0x7e, 0xff, 0xff, 0xef, 0xff, 0xaf, 
+	0xff, 0xfe, 0xff, 0x79, 0x77, 0xff, 0xfa, 0x9b, 
+	0xff, 0xff, 0x3f, 0x7f, 0xfc, 0xd1, 0xf7, 0x3f, 
+	0xfe, 0xf8, 0xc7, 0xed, 0x77, 0xff, 0xff, 0xbf, 
+	0xfb, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x6f, 
+	0xbf, 0xf9, 0xe6, 0xff, 0xbf, 0xef, 0xb5, 0xb7, 
+	0xff, 0xdf, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xbf, 0x99, 0xff, 0xff, 0xee, 0xaf, 0xdd, 0xff, 
+	0xff, 0xeb, 0x2f, 0xf7, 0xdf, 0x47, 0xfe, 0xfb, 
+	0xef, 0xff, 0xf7, 0xff, 0xff, 0x6f, 0xec, 0xff, 
+	0xff, 0xfb, 0xef, 0xff, 0xff, 0xea, 0xbb, 0xef, 
+	0xfe, 0xed, 0xfe, 0xff, 0xbd, 0x5d, 0xff, 0xff, 
+	0xff, 0x7f, 0x98, 0xff, 0xff, 0xbf, 0xfe, 0xfd, 
+	0xff, 0xbf, 0xfb, 0xfe, 0xfd, 0x7f, 0xee, 0xfd, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xa6, 
+	0xff, 0xeb, 0xbf, 0xfe, 0xf2, 0xef, 0xfb, 0xbf, 
+	0xfc, 0xf2, 0xdf, 0x1a, 0xff, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xaf, 0xd9, 0xff, 0xfa, 0xdb, 
+	0x6f, 0xff, 0x9d, 0xfe, 0xdb, 0x6f, 0xff, 0x9b, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0x6d, 0xfe, 0xbf, 0xde, 0x76, 0xdb, 0x69, 0xbf, 
+	0xdf, 0x76, 0xdb, 0xff, 0x4e, 0xf5, 0xff, 0xff, 
+	0x6b, 0x2f, 0xff, 0xff, 0xfa, 0x9b, 0xf5, 0xaf, 
+	0xd7, 0x5a, 0x6b, 0xbb, 0xef, 0xd7, 0x5e, 0xfb, 
+	0xff, 0xd3, 0xff, 0xff, 0x7f, 0xf6, 0xd9, 0xff, 
+	0xbf, 0xd7, 0xe6, 0xfe, 0x6b, 0xbf, 0xd9, 0x26, 
+	0xfb, 0xef, 0xb7, 0xd8, 0x62, 0xd5, 0xdf, 0xff, 
+	0xff, 0xff, 0x2d, 0xbb, 0xfe, 0xdf, 0xbb, 0x99, 
+	0x6f, 0xea, 0x7b, 0xe5, 0xfd, 0xfa, 0xae, 0x78, 
+	0xef, 0x7d, 0xf5, 0xdf, 0xfa, 0xff, 0xff, 0xed, 
+	0xff, 0xff, 0xff, 0x6c, 0xec, 0xbf, 0xfa, 0xfe, 
+	0xfb, 0xaf, 0xff, 0xfe, 0x5e, 0xfb, 0x5d, 0x67, 
+	0xfd, 0xff, 0xff, 0x5f, 0x7f, 0xfd, 0xff, 0xbf, 
+	0x99, 0xf8, 0xaf, 0xff, 0xf6, 0xdb, 0x6b, 0xef, 
+	0xff, 0x16, 0x5b, 0xd4, 0xdf, 0xff, 0xff, 0xff, 
+	0x97, 0x5f, 0xfc, 0xff, 0xef, 0xc6, 0xfd, 0xff, 
+	0xef, 0xbd, 0xe7, 0x9f, 0xff, 0xec, 0xbd, 0xe7, 
+	0x7e, 0xff, 0xff, 0xff, 0xdf, 0x6e, 0xbe, 0xf9, 
+	0xff, 0x9d, 0x79, 0xdf, 0x7f, 0xfb, 0xef, 0xb3, 
+	0xce, 0x7f, 0xfa, 0xef, 0x73, 0x9d, 0xff, 0xfe, 
+	0xff, 0xcf, 0xb7, 0xdf, 0xfe, 0x7f, 0x6f, 0xec, 
+	0xef, 0xee, 0xfa, 0xeb, 0xbf, 0xff, 0xf6, 0xfa, 
+	0xeb, 0x7f, 0xbf, 0xdd, 0xf7, 0xdf, 0x7f, 0x8d, 
+	0x7d, 0xf7, 0xbf, 0x99, 0xf9, 0xff, 0xbf, 0xf7, 
+	0xde, 0x7f, 0xff, 0xbf, 0xf7, 0xde, 0xff, 0xec, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xce, 
+	0xe6, 0xfe, 0xff, 0xef, 0xbf, 0xfd, 0xff, 0xff, 
+	0xef, 0xbf, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xfd, 0xff, 0xdf, 0xbb, 0xb9, 0xff, 0xff, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xfa, 0x7f, 0xff, 0xf5, 
+	0xef, 0xf5, 0xd7, 0x5f, 0x7f, 0xf9, 0xe7, 0xd7, 
+	0xff, 0x6e, 0xde, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0xbe, 0xfc, 0xef, 0xbf, 0xff, 0xbd, 0xb9, 0xe5, 
+	0x97, 0x5f, 0x7d, 0xd5, 0xe5, 0xdf, 0x9b, 0xff, 
+	0xaf, 0xfb, 0xef, 0xfa, 0xeb, 0xe7, 0xf7, 0xff, 
+	0xfa, 0xd7, 0x4f, 0x7f, 0xfd, 0xff, 0xf7, 0xfb, 
+	0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xeb, 0xf3, 0x83, 
+	0x0e, 0xba, 0xf8, 0xf3, 0x83, 0x0e, 0x75, 0xd1, 
+	0x47, 0x9f, 0x7f, 0xfc, 0xd9, 0x47, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xf7, 0xeb, 0xa7, 0x9f, 0xfe, 0xfb, 
+	0xeb, 0xa7, 0x1f, 0xfd, 0xf5, 0x97, 0x5f, 0xff, 
+	0xfd, 0xf7, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xba, 0xe8, 0xa2, 0xeb, 0xfe, 0xba, 0xe8, 0x52, 
+	0x57, 0xfd, 0xe5, 0xd7, 0x7f, 0x7f, 0xfd, 0xf5, 
+	0xff, 0x9b, 0xff, 0x2f, 0xbe, 0x9e, 0x7f, 0xfe, 
+	0xfb, 0xbf, 0x9e, 0x7f, 0xfe, 0x57, 0x7f, 0xfd, 
+	0xff, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 
+	0xeb, 0xaf, 0xf9, 0xe7, 0x9f, 0xdf, 0xaf, 0xf9, 
+	0xe7, 0x3e, 0xd7, 0x5f, 0xfe, 0xff, 0xbf, 0xdf, 
+	0x5e, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 
+	0x3f, 0xbd, 0xf4, 0xff, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0x6f, 
+	0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xba, 0xab, 
+	0xaf, 0xbf, 0xe6, 0xf5, 0xd7, 0x5f, 0x7b, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0xff, 0x9b, 0xfd, 0x3d, 0xfe, 
+	0x7c, 0xf3, 0xc5, 0xff, 0xff, 0xef, 0xef, 0x7f, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfd, 0xff, 
+	0xff, 0xc6, 0xff, 0xfb, 0xbf, 0xff, 0xfe, 0x7b, 
+	0xbf, 0xff, 0xdb, 0xff, 0xff, 0xfb, 0xef, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfd, 0x9f, 0xf9, 0xff, 
+	0xfd, 0xfb, 0xef, 0xbd, 0xff, 0xf7, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xff, 0x6f, 0xfc, 0xff, 0xff, 0xfb, 0xef, 
+	0xcf, 0xff, 0xfe, 0x7b, 0xef, 0x7d, 0x7f, 0x9f, 
+	0xff, 0xff, 0x7f, 0xdf, 0xef, 0xff, 0xff, 0x99, 
+	0xfd, 0xff, 0xbf, 0xff, 0xee, 0xfe, 0xeb, 0xbf, 
+	0xbf, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0x6f, 0xff, 0xe6, 0xff, 0xe7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xfc, 
+	0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xff, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xff, 0x7f, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xf7, 0x5f, 0x7f, 0xfe, 0xff, 0xff, 0xbf, 
+	0xdf, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xc7, 0x9f, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xff, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xfb, 
+	0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 
+	0xbf, 0xdf, 0xfe, 0xf9, 0xef, 0xbd, 0x77, 0xbd, 
+	0xf4, 0xd7, 0x5f, 0x77, 0xfd, 0xf1, 0xd7, 0xff, 
+	0x6f, 0xf6, 0xff, 0xfe, 0xf9, 0xe7, 0x1f, 0x7f, 
+	0xfc, 0x79, 0xe7, 0x7f, 0xf7, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xef, 0xcf, 
+	0x7f, 0xfb, 0xed, 0xf7, 0xdf, 0x7f, 0xdb, 0xfd, 
+	0xdf, 0xbf, 0xff, 0xfd, 0xfb, 0x5f, 0xff, 0xff, 
+	0xff, 0xff, 0x86, 0xff, 0xff, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0xef, 0xbf, 0xfd, 0xf6, 0xb7, 0xdf, 0x7e, 
+	0xab, 0xed, 0xf7, 0xf7, 0xde, 0xfb, 0x8f, 0xd9, 
+	0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xd3, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xff, 0x6d, 0xfe, 0xe7, 0xde, 0x76, 
+	0xdb, 0x6d, 0xb7, 0xdf, 0x76, 0xdb, 0xdd, 0x6f, 
+	0xbf, 0xfd, 0xb6, 0xdb, 0xef, 0xbd, 0xe7, 0xff, 
+	0x9b, 0xf5, 0xe9, 0xd7, 0x5a, 0x6b, 0xad, 0xb5, 
+	0xd7, 0x5e, 0x7b, 0xdd, 0x6b, 0xaf, 0xbd, 0xe6, 
+	0xda, 0x6b, 0xaf, 0xf5, 0xd7, 0xe6, 0xfe, 0x6f, 
+	0xb6, 0xd9, 0x66, 0x9b, 0x6d, 0xb5, 0xd8, 0x62, 
+	0x37, 0xdb, 0x6c, 0xb3, 0xcd, 0xb6, 0xf2, 0xde, 
+	0xff, 0xbb, 0x99, 0xff, 0x5e, 0x79, 0xef, 0xbd, 
+	0xf7, 0xde, 0x79, 0xef, 0x7d, 0xef, 0xbd, 0xf7, 
+	0xde, 0x7b, 0xef, 0xbc, 0xf7, 0xff, 0x6c, 0xec, 
+	0xff, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xb7, 0x7e, 
+	0xfb, 0xdd, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xdb, 
+	0xfd, 0x77, 0xbe, 0x99, 0xfb, 0xef, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0x1e, 0x7b, 0xdc, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xad, 0xef, 
+	0xe6, 0xfd, 0xff, 0xef, 0xbd, 0xe7, 0x9e, 0x7b, 
+	0xee, 0xb9, 0xe7, 0x3c, 0xf7, 0xdc, 0x73, 0xcf, 
+	0x3d, 0xff, 0xfc, 0xd3, 0xbd, 0x79, 0xff, 0x7f, 
+	0xfb, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0x73, 
+	0x9f, 0x7d, 0xf6, 0xd9, 0x67, 0x9f, 0x7d, 0x7e, 
+	0x79, 0x6f, 0xe0, 0xff, 0xbe, 0xfa, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xbf, 0x99, 0xf9, 
+	0xff, 0xbf, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 
+	0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 
+	0x7b, 0xef, 0xcf, 0xe6, 0xfe, 0xff, 0xef, 0xbf, 
+	0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xed, 0xb7, 
+	0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xfe, 0xbb, 
+	0xa9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0x6a, 0xd8, 0xb7, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0x5f, 
+	0xdf, 0x9b, 0xff, 0xaf, 0xfb, 0xff, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 
+	0xff, 0xf3, 0x83, 0x0e, 0x3a, 0xe8, 0xa0, 0x83, 
+	0x0e, 0x75, 0xd0, 0x41, 0x07, 0x1d, 0x74, 0xd0, 
+	0x41, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfd, 0xf5, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff, 0x6f, 
+	0xfe, 0x9f, 0xff, 0xba, 0xe9, 0xa6, 0x9b, 0x6e, 
+	0xba, 0xe9, 0x56, 0x37, 0xdd, 0x74, 0xd3, 0x4d, 
+	0x37, 0xdd, 0xf4, 0xff, 0x9b, 0xff, 0xaf, 0xbe, 
+	0x9e, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 
+	0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 
+	0xff, 0xe6, 0xff, 0xff, 0xaf, 0xc9, 0x27, 0x9f, 
+	0x7c, 0xf2, 0xc9, 0x27, 0x3f, 0xf9, 0xe4, 0x93, 
+	0x4f, 0x3e, 0xf9, 0xe4, 0xfb, 0xbf, 0xf9, 0xff, 
+	0xf4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe7, 
+	0x37, 0xff, 0x6f, 0xfa, 0xbf, 0x6b, 0xaf, 0xbf, 
+	0xfe, 0xea, 0xeb, 0xaf, 0xbe, 0xfe, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5d, 0xff, 0x9a, 
+	0xff, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xfb, 0xdf, 0xc6, 0xff, 0xff, 0xbf, 
+	0xdf, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xfb, 0xff, 0xbf, 0xff, 0xfe, 0xfd, 0xde, 0xff, 
+	0x9f, 0xc9, 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0x6b, 0xfe, 0xff, 
+	0xff, 0xf4, 0x93, 0xcf, 0x3f, 0xff, 0xdc, 0xd3, 
+	0x9d, 0xff, 0xf9, 0xe9, 0xa7, 0x9f, 0x7e, 0xba, 
+	0xf5, 0xff, 0x9b, 0xff, 0xff, 0xfb, 0xff, 0x7f, 
+	0xfe, 0xfa, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0xff, 0xe6, 
+	0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xfe, 0xf7, 0xff, 0xf7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xaf, 0xf9, 0x7f, 0xff, 0xff, 
+	0xff, 0xfb, 0xff, 0xf7, 0xff, 0xff, 0xbe, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0x6f, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xff, 0x9b, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xf3, 0xce, 0xff, 0xff, 0xbd, 
+	0xe7, 0xff, 0xf7, 0x7e, 0xf9, 0xe7, 0xbf, 0x7e, 
+	0xfb, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfb, 0xef, 0xff, 0x7f, 0xff, 0xf7, 0xff, 0xff, 
+	0xfe, 0xfd, 0xf7, 0xef, 0xdd, 0xff, 0xbf, 0xb9, 
+	0xff, 0xf7, 0xdf, 0xff, 0x5f, 0xfe, 0xfd, 0xef, 
+	0xff, 0xff, 0xfc, 0xf4, 0xd7, 0x17, 0x7f, 0xfc, 
+	0xf5, 0xd7, 0xff, 0x6f, 0xfc, 0xff, 0xff, 0xf7, 
+	0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 
+	0xdf, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xfe, 
+	0x99, 0xfb, 0xff, 0xff, 0x7f, 0xff, 0xeb, 0xb7, 
+	0xbf, 0xfe, 0xfb, 0xd7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0xff, 0xff, 
+	0xbf, 0xa7, 0xfe, 0x7b, 0xae, 0xbf, 0xfc, 0xfa, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5c, 0x7f, 
+	0xff, 0xaf, 0xd9, 0xff, 0xff, 0xfb, 0xa5, 0xbf, 
+	0x9f, 0xfe, 0xbb, 0x6f, 0x57, 0xff, 0xdd, 0x77, 
+	0xdf, 0x7d, 0x37, 0xfd, 0xf7, 0xff, 0x6d, 0xfe, 
+	0xff, 0xff, 0xfb, 0xeb, 0xed, 0xb7, 0xdb, 0x76, 
+	0xdb, 0xdd, 0x6d, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 
+	0xb7, 0xfd, 0xfc, 0x9b, 0xf5, 0xff, 0xbf, 0xff, 
+	0x7a, 0xed, 0xb5, 0xd7, 0x5e, 0x7b, 0xdd, 0x6b, 
+	0xaf, 0xbd, 0xf6, 0xda, 0x6b, 0xaf, 0xfd, 0xd7, 
+	0xe6, 0xfe, 0x7f, 0xbf, 0x9d, 0xf6, 0x5b, 0x6d, 
+	0xb5, 0xd8, 0x52, 0xb7, 0xda, 0x6c, 0xab, 0xad, 
+	0xb6, 0xda, 0x6a, 0xb3, 0xbb, 0x99, 0x6f, 0xff, 
+	0xbb, 0xab, 0xbe, 0x77, 0xde, 0x79, 0xef, 0x5d, 
+	0xef, 0xbc, 0xf2, 0xce, 0x3b, 0xef, 0xbc, 0xf3, 
+	0xea, 0x6c, 0xec, 0xff, 0xfb, 0x6b, 0xab, 0xed, 
+	0xa5, 0xb7, 0x7e, 0x7b, 0xd9, 0x5b, 0xff, 0xbd, 
+	0xf5, 0xd6, 0x5b, 0x6f, 0x7d, 0xbe, 0x99, 0xfb, 
+	0xff, 0xb3, 0x8f, 0xda, 0x6e, 0xb9, 0xfd, 0x16, 
+	0x5b, 0xdc, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 
+	0xfb, 0xad, 0xef, 0xc6, 0xfd, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xde, 0x7a, 0xee, 0xb9, 0xe7, 0x3d, 0xf7, 
+	0xdc, 0x73, 0xcf, 0x3d, 0xf7, 0xdc, 0xd3, 0x9d, 
+	0x79, 0xff, 0xe7, 0x9f, 0x7f, 0xbe, 0xff, 0x3e, 
+	0xfb, 0xec, 0x73, 0x9f, 0x7d, 0xf6, 0xd9, 0x67, 
+	0x9f, 0x7d, 0xf6, 0x79, 0x6f, 0xec, 0xff, 0xf8, 
+	0xe3, 0x8f, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xbf, 0x99, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x7b, 
+	0xef, 0xbd, 0xf7, 0xde, 0xf7, 0xde, 0x7b, 0xef, 
+	0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xcf, 0xe6, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x6f, 0xbf, 
+	0xfd, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 
+	0xdf, 0xfe, 0xbb, 0xb9, 0x7f, 0xe6, 0x99, 0x2d, 
+	0xfc, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6e, 
+	0xde, 0xbf, 0xf9, 0xe6, 0x8b, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0xdf, 0x9b, 0xff, 0xe7, 0x9e, 
+	0xfb, 0x7a, 0xff, 0xad, 0xbf, 0xde, 0xfa, 0xd7, 
+	0x5b, 0x67, 0xbd, 0xf5, 0xd6, 0x5f, 0x6f, 0xdd, 
+	0xff, 0xe6, 0xff, 0xfb, 0xe3, 0x8b, 0x0c, 0xff, 
+	0xe8, 0xa0, 0x8f, 0x3e, 0xf5, 0xd1, 0x47, 0x1f, 
+	0x7d, 0xf4, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 
+	0xf3, 0xdf, 0x76, 0x9f, 0x7e, 0xfa, 0xe9, 0xaf, 
+	0x3f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xd7, 0xff, 0x6f, 0xf8, 0xff, 0xfe, 0xff, 0xfc, 
+	0xa1, 0x8f, 0x3e, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 
+	0xff, 0x3f, 0xff, 0xbd, 0xb7, 0xea, 0xfb, 0xe3, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x86, 0xfe, 0x6f, 0xff, 
+	0xf5, 0xd7, 0x1a, 0x7f, 0xfc, 0xfd, 0xf7, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf2, 0xf7, 
+	0x8b, 0x2f, 0xbd, 0xf8, 0xfa, 0xab, 0xaf, 0xbe, 
+	0xfe, 0xd5, 0xd7, 0x5f, 0x7d, 0xfd, 0xb5, 0xd7, 
+	0x5f, 0xff, 0x9b, 0xff, 0x37, 0xfe, 0xf8, 0xf3, 
+	0xfe, 0xf7, 0xff, 0xe8, 0xff, 0x7f, 0x7f, 0xfe, 
+	0xf9, 0xe7, 0x9f, 0xff, 0xfd, 0xff, 0xff, 0xc6, 
+	0xff, 0xfb, 0xef, 0xff, 0xfb, 0xff, 0x7f, 0xe7, 
+	0xdf, 0x77, 0xff, 0xd3, 0xcf, 0x7b, 0xfd, 0x3d, 
+	0xff, 0xf7, 0xff, 0x9a, 0xf9, 0xff, 0xfd, 0xf7, 
+	0xaf, 0xfb, 0xff, 0xff, 0x6f, 0xfb, 0xdf, 0xff, 
+	0xfe, 0xdf, 0xf7, 0xbb, 0xfd, 0xbf, 0xff, 0xfb, 
+	0x6f, 0xfe, 0xf6, 0xdc, 0xfb, 0xe3, 0xbf, 0xfd, 
+	0xf6, 0xb3, 0xef, 0x7d, 0xfb, 0xf9, 0xb6, 0x9f, 
+	0x7f, 0xbf, 0xbd, 0xf7, 0xff, 0x99, 0xfd, 0xff, 
+	0xff, 0xf7, 0xff, 0xba, 0xef, 0xff, 0xbf, 0xfe, 
+	0xff, 0xdf, 0x7b, 0x7f, 0xdd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xff, 0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xf7, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff, 
+	0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 
+	0x9b, 0xff, 0xcf, 0x3f, 0xfb, 0xfc, 0xf2, 0xcf, 
+	0xff, 0xbf, 0xbf, 0xe7, 0xf7, 0x57, 0x7e, 0xf9, 
+	0xe5, 0xf7, 0xd7, 0xff, 0xff, 0xe6, 0xff, 0xaf, 
+	0xbf, 0xf7, 0xfe, 0xfb, 0xef, 0xfd, 0xff, 0xdf, 
+	0xf7, 0xfe, 0x7b, 0xef, 0xfd, 0xf8, 0xfe, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xf9, 0xf7, 0x9f, 0x7f, 
+	0xdb, 0xf9, 0xff, 0xbf, 0xef, 0xfc, 0xf6, 0xcf, 
+	0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfc, 
+	0xff, 0xfe, 0xdb, 0x6f, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xff, 0xfe, 
+	0xfa, 0xad, 0xad, 0xfe, 0xfe, 0xea, 0xef, 0xbf, 
+	0xfd, 0xf6, 0xdb, 0x7f, 0xfb, 0xfd, 0xf7, 0xfb, 
+	0x86, 0x7f, 0x2e, 0xbf, 0xfc, 0xf6, 0xcb, 0x2f, 
+	0xbf, 0xe4, 0xf2, 0x97, 0x5f, 0x7e, 0x79, 0xe7, 
+	0xcf, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0x9f, 0xfe, 
+	0xbb, 0xef, 0x97, 0xff, 0xee, 0xbb, 0xe5, 0x7e, 
+	0xf7, 0xdd, 0x77, 0xdf, 0xfd, 0xfb, 0xff, 0xff, 
+	0xff, 0x6d, 0xfe, 0xb7, 0xdb, 0x7e, 0xfb, 0xed, 
+	0xb6, 0xdf, 0x76, 0xdb, 0xdd, 0x6f, 0xbb, 0xfd, 
+	0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xf5, 
+	0xb5, 0xd7, 0x5e, 0x7b, 0xed, 0xb5, 0xd7, 0x5e, 
+	0x73, 0xdd, 0x6b, 0xaf, 0xbd, 0xf6, 0xff, 0xff, 
+	0xff, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xb6, 0xd9, 
+	0x66, 0x9b, 0x6d, 0xb6, 0xd8, 0x66, 0x37, 0x5b, 
+	0x6c, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbb, 
+	0x99, 0xfe, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 
+	0x7b, 0xef, 0x7d, 0xef, 0xbd, 0xf7, 0xde, 0xfb, 
+	0xff, 0xff, 0xff, 0xbf, 0x6c, 0xec, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x7e, 0xfb, 0xdf, 
+	0x7f, 0x9f, 0xfd, 0xdf, 0xff, 0xef, 0xff, 0xff, 
+	0xbf, 0x99, 0xfb, 0xbf, 0xfd, 0xf6, 0x5b, 0x6d, 
+	0xbf, 0xfd, 0x16, 0xdb, 0xdf, 0x7e, 0xab, 0xed, 
+	0xb7, 0xff, 0xf3, 0xff, 0xff, 0xef, 0xe6, 0xfd, 
+	0x7b, 0xee, 0xb9, 0xe7, 0x9e, 0x7b, 0xee, 0xb9, 
+	0xe7, 0x3d, 0xf7, 0xdc, 0xf3, 0xcf, 0xff, 0xfd, 
+	0xff, 0xff, 0xbd, 0x79, 0xff, 0x3e, 0xfb, 0xec, 
+	0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0x73, 0x9f, 0x7d, 
+	0xf6, 0xd9, 0xe7, 0xff, 0xff, 0xff, 0x7f, 0x6f, 
+	0xec, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f, 
+	0xff, 0xfd, 0xf7, 0x3f, 0x99, 0xf9, 0xef, 0xbd, 
+	0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 0xf7, 
+	0xde, 0x7b, 0xef, 0xbd, 0xff, 0xff, 0xff, 0xff, 
+	0xcf, 0xe6, 0xfe, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xed, 0xb7, 0xdf, 0x7e, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xef, 0xbf, 0xff, 0xfe, 0x7b, 0xfd, 0xff, 
+	0xff, 0xff, 0x6a, 0xde, 0xfd, 0xfb, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0x5f, 0xfe, 0xff, 0xff, 0xdf, 0x98, 
+	0xff, 0xaf, 0xbb, 0xee, 0xfa, 0xeb, 0xae, 0xbb, 
+	0xee, 0xba, 0xd7, 0x5d, 0x77, 0xfd, 0xf5, 0xd7, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xa3, 
+	0x8b, 0x2e, 0xfa, 0xe8, 0xa2, 0x8f, 0x2e, 0x75, 
+	0xd1, 0x45, 0x17, 0x7d, 0x74, 0xf8, 0xe3, 0x9f, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0xaf, 0x3f, 0xfd, 0xf5, 0xd7, 0x5f, 
+	0x7f, 0xf1, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xfe, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 0xfa, 0xe9, 
+	0x57, 0x3f, 0xfd, 0xf4, 0xd3, 0x4f, 0xaf, 0xff, 
+	0xfe, 0xff, 0x9b, 0xff, 0xf7, 0xff, 0xaf, 0xbf, 
+	0xfe, 0xfb, 0xeb, 0xbf, 0xbf, 0xfe, 0xf5, 0xd7, 
+	0x5f, 0xff, 0xd5, 0xf5, 0xcf, 0xff, 0xff, 0x86, 
+	0xff, 0x7f, 0xff, 0xc1, 0x07, 0x1f, 0x7c, 0xf0, 
+	0xc1, 0x07, 0x3f, 0xf8, 0xe0, 0x83, 0x0f, 0x64, 
+	0xf8, 0xe1, 0xff, 0x8f, 0xd9, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0xbf, 0xfa, 0xfa, 
+	0xab, 0xaf, 0xbf, 0xfa, 0xf5, 0xd7, 0x5f, 0x7f, 
+	0xfd, 0xf5, 0xd7, 0x5f, 0xff, 0x9a, 0xff, 0xf7, 
+	0xcf, 0x7c, 0xff, 0xff, 0x3f, 0xff, 0xec, 0xf3, 
+	0x9f, 0x7f, 0xfe, 0xf1, 0xe6, 0xfe, 0xff, 0xef, 
+	0xff, 0xff, 0xc6, 0xfb, 0xfd, 0x67, 0xff, 0xdd, 
+	0x7f, 0x7f, 0xff, 0xfd, 0x7f, 0xbf, 0xfb, 0xfe, 
+	0xfb, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0x9f, 0xf9, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfa, 0xea, 
+	0xa7, 0x5f, 0xfd, 0xf4, 0xd3, 0x4f, 0xff, 0x7f, 
+	0xff, 0xfb, 0xff, 0x6f, 0xfe, 0x17, 0xdf, 0xfc, 
+	0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0xf3, 0x9d, 0x7f, 
+	0xfe, 0xf7, 0xa6, 0xef, 0xfe, 0xff, 0xff, 0xfb, 
+	0x9b, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0x9f, 0xff, 0xfe, 0xff, 0xdd, 0x7f, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xbe, 0xff, 0xde, 0xf7, 0xef, 0xbf, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf6, 
+	0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 
+	0xfe, 0xef, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0x7f, 0xcf, 0x3f, 0xbf, 
+	0xfc, 0xf3, 0xcb, 0x2f, 0xfe, 0xf8, 0xe6, 0x17, 
+	0xdf, 0x7f, 0xe9, 0x7f, 0xf7, 0xff, 0xff, 0xff, 
+	0xe6, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0x7f, 0xff, 0xfe, 0xf7, 0xdf, 0xff, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xd9, 
+	0xa7, 0x9f, 0x77, 0xfe, 0xf9, 0xef, 0xbf, 0xef, 
+	0xfc, 0x76, 0xdf, 0x3f, 0xbf, 0xff, 0xf7, 0xd5, 
+	0xff, 0x6a, 0xfc, 0x2f, 0xfc, 0xf0, 0xc3, 0x0f, 
+	0x3f, 0xfc, 0xf0, 0xc3, 0x1f, 0x7e, 0xf8, 0xf1, 
+	0x85, 0x5f, 0x7f, 0xdc, 0xf5, 0xff, 0x99, 0xff, 
+	0xf7, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7f, 0xef, 0xff, 0xf7, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xa6, 0x7c, 0xae, 0xb9, 0xfc, 
+	0x9e, 0x0b, 0x2f, 0xbf, 0xe4, 0xf2, 0x97, 0x5f, 
+	0x78, 0xfd, 0xe5, 0x97, 0x77, 0xff, 0xff, 0x8f, 
+	0xd9, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfe, 
+	0xdb, 0x65, 0x7f, 0xf7, 0xed, 0x72, 0xdf, 0x7d, 
+	0xf7, 0xdd, 0xff, 0xff, 0x6d, 0xfe, 0xb7, 0xdb, 
+	0x6e, 0xfb, 0xed, 0xb6, 0xdb, 0x76, 0xdb, 0xdd, 
+	0x6f, 0xbb, 0xed, 0xf6, 0xdb, 0xee, 0xf9, 0xff, 
+	0xff, 0x1b, 0xf5, 0xb5, 0xd7, 0x5e, 0x7b, 0xed, 
+	0xb5, 0xd7, 0x5e, 0x73, 0xdd, 0x6b, 0xaf, 0xb9, 
+	0xf6, 0xda, 0x6b, 0xff, 0xff, 0xd7, 0xe6, 0xfe, 
+	0x6f, 0xb5, 0xd9, 0x56, 0x9b, 0x6d, 0xb6, 0xd8, 
+	0x66, 0x37, 0x5b, 0x6c, 0xab, 0xcd, 0x16, 0x73, 
+	0xfe, 0xff, 0xbb, 0x99, 0xff, 0xde, 0x79, 0xef, 
+	0x9d, 0xf7, 0xde, 0x7b, 0xef, 0x7d, 0xef, 0xbd, 
+	0xf7, 0xce, 0x7b, 0xef, 0xbd, 0xff, 0xff, 0x6c, 
+	0xec, 0xbf, 0xb7, 0xfe, 0x7b, 0xe9, 0xbf, 0xff, 
+	0x7e, 0xfb, 0xdf, 0x7f, 0x9f, 0xbd, 0xf5, 0xdf, 
+	0xe7, 0xad, 0xff, 0xbf, 0x19, 0xfb, 0xbf, 0xfd, 
+	0xf6, 0x1b, 0x6e, 0xbf, 0xfd, 0x16, 0xdb, 0xdf, 
+	0x7e, 0xab, 0xed, 0xb7, 0xdf, 0x6a, 0xcb, 0xff, 
+	0xef, 0xe6, 0xfd, 0x7b, 0xef, 0xbd, 0xe7, 0x9e, 
+	0x7b, 0xee, 0xb9, 0xe7, 0x3d, 0xf7, 0xdc, 0x73, 
+	0xcf, 0x3d, 0xff, 0xf4, 0xff, 0xbd, 0x79, 0xff, 
+	0xff, 0xfb, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 
+	0x73, 0x9f, 0x7d, 0xf6, 0xd9, 0x67, 0x9f, 0x7d, 
+	0xfe, 0x7f, 0x6f, 0xec, 0xbf, 0xfe, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf7, 0xbf, 0x99, 
+	0xf9, 0xef, 0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 
+	0xf7, 0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 
+	0xde, 0xfb, 0xff, 0xcf, 0xe6, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xed, 
+	0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xff, 0xff, 
+	0xbb, 0xb9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xdf, 0xff, 0x6a, 0xde, 0xff, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xe7, 0xde, 0x98, 0xff, 0xff, 0xfb, 0xff, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 
+	0xfd, 0xf5, 0xd7, 0x5f, 0xff, 0xbd, 0xff, 0xe6, 
+	0xff, 0xff, 0xf3, 0x83, 0x0e, 0x3a, 0xe8, 0xa0, 
+	0x83, 0x4e, 0x75, 0xd2, 0x49, 0x07, 0x1d, 0x74, 
+	0xd0, 0x61, 0x9f, 0xbf, 0xf9, 0xff, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xdf, 0xff, 
+	0x6f, 0xfe, 0xbf, 0xfe, 0xba, 0xe9, 0xa6, 0x9b, 
+	0x6e, 0xba, 0xe9, 0x56, 0x37, 0xdd, 0x74, 0xd3, 
+	0x4d, 0x37, 0xdd, 0xf6, 0xff, 0x9b, 0xff, 0xaf, 
+	0xbf, 0x9e, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xfc, 0xe3, 0x8f, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0xfd, 0xff, 0xe6, 0xff, 0x6b, 0xaf, 0xc9, 0x27, 
+	0x9f, 0x7c, 0xf2, 0xc9, 0xe7, 0x3e, 0xff, 0xfc, 
+	0x93, 0x4f, 0x3e, 0xf9, 0x64, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xe9, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xe9, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xee, 0xf5, 
+	0xd7, 0x5e, 0x7f, 0xfd, 0xf5, 0xd6, 0x5f, 0xff, 
+	0x9a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xff, 0x9e, 0xff, 0xdf, 0x39, 0xe7, 
+	0x9f, 0x7f, 0xfe, 0xff, 0xff, 0xc6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7f, 
+	0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
+	0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfe, 0xff, 0xeb, 
+	0xbf, 0xff, 0x7f, 0xff, 0x66, 0x7d, 0x7f, 0x53, 
+	0x5f, 0x57, 0xf5, 0xf5, 0x7d, 0xf7, 0x6e, 0xfe, 
+	0xff, 0xde, 0xfc, 0xf1, 0xcf, 0x17, 0x7f, 0x7c, 
+	0xf3, 0x9b, 0x7f, 0xfe, 0xf9, 0xe5, 0x9f, 0x7f, 
+	0xde, 0xff, 0xff, 0x9b, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7d, 0xf7, 
+	0xdf, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xe6, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0x76, 0xff, 0x7d, 0xff, 0x7f, 
+	0xff, 0xff, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0x3f, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 
+	0xfe, 0xff, 0xe7, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xfe, 0xff, 0xff, 0x7f, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xcf, 0xbd, 0xff, 0xd7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9b, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xfd, 0xff, 0xff, 0xcf, 0x3f, 0xff, 0xff, 
+	0xfe, 0xf7, 0xff, 0xe6, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 
+	0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xbf, 0xff, 0xef, 0xff, 0xff, 0x7f, 0xff, 0xaf, 
+	0x6f, 0xff, 0x7f, 0xff, 0x6f, 0xfc, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xd7, 0x4f, 0x7f, 
+	0xf8, 0xeb, 0xef, 0xbf, 0x7f, 0xfe, 0xfb, 0xff, 
+	0xff, 0x99, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff, 
+	0xff, 0xdf, 0xef, 0x7d, 0xdf, 0xfd, 0xbf, 0xdf, 
+	0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 
+	0xcf, 0x3d, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, 0xf7, 
+	0xd5, 0xef, 0x9e, 0xfb, 0xee, 0xb1, 0xee, 0x9e, 
+	0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xde, 0x7f, 
+	0xfb, 0xfd, 0xf7, 0x9e, 0xdf, 0xfb, 0xdf, 0xef, 
+	0xdb, 0xff, 0xfe, 0xff, 0xee, 0xbf, 0xef, 0x6f, 
+	0xfe, 0xbf, 0xfe, 0xf9, 0xeb, 0xaf, 0xb7, 0xfe, 
+	0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xc7, 0xdb, 
+	0x7f, 0xbd, 0x71, 0xff, 0x9b, 0xff, 0xef, 0xdf, 
+	0x77, 0xff, 0x7d, 0xf7, 0xdf, 0x77, 0xff, 0xf9, 
+	0xef, 0xfd, 0xfb, 0xff, 0xfb, 0xfe, 0xff, 0xff, 
+	0xff, 0xa6, 0xff, 0xef, 0xbf, 0x7f, 0xfa, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xde, 0xf3, 0xcf, 0x5f, 0x69, 
+	0xfd, 0xf3, 0xd6, 0x3f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfd, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 
+	0x7f, 0xaf, 0xfb, 0x7f, 0xcf, 0x7f, 0xf7, 0xff, 
+	0xef, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xdf, 0xdf, 0xff, 0xfa, 0xff, 
+	0x6f, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0x9b, 
+	0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 
+	0xfa, 0xfd, 0xef, 0x7f, 0xfd, 0xfe, 0xd3, 0xef, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xf7, 0xf7, 0xfd, 0xf7, 0xff, 0xff, 0xbe, 0xff, 
+	0xbf, 0xf9, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xfb, 
+	0xef, 0xbf, 0x7f, 0xbe, 0xf3, 0xdf, 0xbf, 0xfb, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 
+	0xff, 0xfe, 0xf3, 0xef, 0x3f, 0xff, 0xfe, 0xf3, 
+	0xdf, 0xfb, 0xfe, 0xf9, 0xf7, 0xdf, 0x7f, 0x7e, 
+	0xff, 0xfb, 0x9b, 0xff, 0xff, 0x3f, 0xdf, 0x7d, 
+	0xf7, 0xdd, 0x77, 0xdf, 0x7d, 0xef, 0xbb, 0xaf, 
+	0xbe, 0xfa, 0xfa, 0x9b, 0x6f, 0xfe, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0x77, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0xb7, 0xdf, 
+	0x4e, 0x3b, 0x6d, 0xb4, 0xd3, 0x46, 0x7b, 0xda, 
+	0x69, 0xa7, 0x95, 0x76, 0xdb, 0x6f, 0xb7, 0xf9, 
+	0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 
+	0x77, 0xdf, 0x7f, 0xe7, 0xdb, 0xef, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xbf, 0xe7, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xbe, 
+	0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xbf, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 
+	0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 
+	0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7, 
+	0x5f, 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 
+	0xf7, 0xdd, 0x7f, 0xff, 0xdd, 0xf7, 0xdf, 0xfe, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 
+	0x7f, 0xf6, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbf, 0xde, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xee, 
+	0xfa, 0xeb, 0x2f, 0xbf, 0xfe, 0xf8, 0x6f, 0xee, 
+	0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0xf2, 0xfb, 
+	0x6f, 0x7f, 0xfb, 0xfd, 0xb5, 0xdf, 0x7f, 0xb9, 
+	0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 
+	0xe6, 0xfe, 0x5b, 0xef, 0xbf, 0xef, 0xfe, 0x7b, 
+	0xef, 0xbf, 0xe5, 0x2d, 0xf7, 0xdf, 0x72, 0xff, 
+	0x2d, 0xf7, 0xdf, 0xfe, 0xbf, 0xf9, 0xbf, 0xf5, 
+	0xf5, 0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0x37, 0xd3, 
+	0x99, 0xfa, 0xbb, 0xa9, 0xbf, 0xd9, 0xfa, 0xab, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+
+
+/* rom locations */
+static const unsigned long eppchk_roms[0] = {
+	
+};
+
diff --git a/main/eppfpga.8 b/main/eppfpga.8
new file mode 100644
index 0000000..ff8eed9
--- /dev/null
+++ b/main/eppfpga.8
@@ -0,0 +1,129 @@
+.\" Copyright 1998 Thomas Sailer (sailer at ife.ee.ethz.ch)
+.\" May be distributed under the GNU General Public License
+.\"
+.\" "
+.TH EPPFPGA 8 "30 March 2000" "Eppfpga 0.8" "Linux AX.25 Utilities Manual"
+.SH NAME
+eppfpga \- Baycom EPP modem with FPGA configuration/diagnostics tool
+.SH SYNOPSIS
+.B eppfpga
+.B "[ \-vh ]"
+.B "[\-p portaddr]"
+.B "[\-m modestr]"
+.B "[\-t test]"
+
+
+.SH DESCRIPTION
+.B eppfpga
+is the configuration and diagnostics utility for the Baycom EPP modem.
+It can be used to download the FPGA ``firmware'' or to execute various tests.
+This utility is also needed during
+.I "ifconfig bcex up"
+and therefore should reside in /sbin.
+
+
+.SH OPTIONS
+.B eppfpga
+accepts the following options:
+
+.TP
+.B \-h
+Display an overview of the available command line parameters and exit.
+.TP
+.B \-v
+Increases the verbosity of the output. May be cumulated.
+.TP
+.B \-p
+Specifies the base address of the EPP capable parallel port to which
+the modem is connected. Use the
+.I 0x
+prefix to specify hexadecimal numbers.
+.TP
+.B \-m
+Specifies various ``firmware'' options.
+.TP
+.B \-t
+Execute the named test. Tests may be stopped by pressing
+\fICTRL\-C\fP.
+
+.SH "FIRMWARE OPTIONS"
+
+.TP
+.B intclk
+uses FPGA internal clock; \fBdon't\fP use if an external oscillator is on board.
+.TP
+.B extclk
+uses the external oscillator; recommended if the internal modem is used, as the
+frequency of the FPGA oscillator is not accurate enough.
+.TP
+.B intmodem
+uses the internal modem
+.TP
+.B extmodem
+uses a DF9IC type modem connected to the high speed modem connector
+.TP
+.B divider=x
+sets the clock divider for the internal modem (baud=fquartz/16/divider)
+.TP
+.B loopback
+sets an internal modem loopback
+.TP
+.B extstat
+allows extended status readback
+.TP
+.B noextstat
+disallows extended status readback
+.TP
+.B pttmute
+mutes modulation signal output when PTT is off (default)
+.TP
+.B nopttmute
+modulation signal is continuously output
+
+.SH TESTS
+
+.TP
+.B ram
+tests the on board SRAM using boundary scan
+.TP
+.B bled
+tests the on board LED's using boundary scan; \fBdisconnect PTT\fP during
+the test.
+.TP
+.B dac
+tests the on board DAC using boundary scan
+.TP
+.B led
+tests the CON and STA leds using EPP address write
+.TP
+.B ledfast
+tests the CON and STA leds using fast EPP address write
+.TP
+.B berr
+performs a BER test using the complete adapter. An external
+loopback is required.
+.TP
+.B berrv
+performs a BER test using the complete adapter. Also prints out
+the received bits. An external loopback is required.
+.TP
+.B ccnt
+frequency counter using the check firmware
+.TP
+.B cdac
+fast DAC test using the check firmware
+.TP
+.B cram
+fast RAM test using the check firmware
+.TP
+.B cled
+LED test using the check firmware
+
+.SH "SEE ALSO"
+.nf
+.BR ifconfig "\ (8), " sethdlc "\ (8), "
+linux/drivers/net/hamradio/baycom_epp.c
+.fi
+
+.SH AUTHOR
+eppfpga was written by Thomas Sailer, HB9JNX/AE4WA (sailer at ife.ee.ethz.ch).
diff --git a/main/eppfpga.c b/main/eppfpga.c
new file mode 100644
index 0000000..8be52b6
--- /dev/null
+++ b/main/eppfpga.c
@@ -0,0 +1,329 @@
+/*****************************************************************************/
+
+/*
+ *      eppfpga.c  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+#include "getopt.h"
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+static struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+static int quit = 0;
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+        va_list ap;
+        int r;
+
+        if (vl > verboselevel)
+                return 0;
+	va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+        if (syslogmsg) {
+		static const int logprio[] = { LOG_ERR, LOG_INFO };
+		vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+		r = 0;
+	} else
+#endif
+                r = vfprintf(stderr, format, ap);
+	va_end(ap);
+        return r;
+}
+
+int tprintf(const char *format, ...)
+{
+	va_list ap;
+	int i;
+
+        va_start(ap, format);
+        i = vprintf(format, ap);
+        va_end(ap);
+	fflush(stdout);
+	return i;
+}
+
+int idle_callback(unsigned us_delay)
+{
+	if (us_delay)
+		usleep(us_delay);
+	return quit;
+}
+
+void epp_error(const char *msg)
+{
+	lprintf(0, msg);
+	reset_modem();
+	exit(1);
+}
+
+static void signal_quit(int signum)
+{
+	quit = 1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+        static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+                { "ppuser", 1, 0, 0x400 },
+                { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+                { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+                { "ppgenport", 0, 0, 0x403 },
+                { "ppwin", 1, 0, 0x404 },
+                { "pplpt", 1, 0, 0x404 },
+                { "ppring0", 0, 0, 0x405 },
+#endif
+		{ "ppforcehwepp", 0, 0, 0x410 },
+		{ "ppswemulepp", 0, 0, 0x411 },
+		{ "ppswemulecp", 0, 0, 0x412 },
+		{ 0, 0, 0, 0 }
+        };
+	int c, err = 0;
+	const struct eppfpgatests *tst = NULL;
+	unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+	const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+	printf("eppfpga v" VERSION " (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+	while ((c = getopt_long(argc, argv, "svp:m:t:", long_options, NULL)) != EOF) {
+		switch (c) {
+		case 0x400:
+			ppuser = optarg;
+			ppkdrv = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x401:
+			ppkdrv = optarg;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x402:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = optarg;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+			break;
+
+		case 0x403:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 1;
+                        ntdrv = 0;
+                        w9xring0 = 0;
+                        break;
+
+		case 0x404:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = strtoul(optarg, NULL, 0);
+                        w9xring0 = 0;
+			break;
+
+		case 0x405:
+			ppkdrv = NULL;
+			ppuser = NULL;
+			ppdev = NULL;
+			ntddkgenport = 0;
+                        ntdrv = 0;
+                        w9xring0 = 1;
+			break;
+
+		case 0x410:
+			ppflags |= PPFLAG_FORCEHWEPP;
+			break;
+
+		case 0x411:
+			ppflags |= PPFLAG_SWEMULEPP;
+			break;
+
+		case 0x412:
+			ppflags |= PPFLAG_SWEMULECP;
+			break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+		case 's':
+			if (syslogmsg)
+				break;
+			openlog("eppfpga", LOG_PID, LOG_USER);
+			syslogmsg = 1;
+			break;
+#endif
+
+		case 'v':
+			verboselevel++;
+			break;
+
+		case 'p': 
+			iobase = strtoul(optarg, NULL, 0);
+			if (iobase <= 0 || iobase >= 0x3f8)
+				err++;
+			ppuser = NULL;
+			ppkdrv = NULL;
+			break;
+			
+		case 'm':
+			parseconfig(&cfg, optarg);
+			break;
+
+		case 't':
+			if (tst != NULL) {
+				err++;
+				break;
+			}
+			for (tst = eppfpgatests; tst->name && strcmp(optarg, tst->name); tst++);
+			if (!tst->name)
+				err++;
+			break;
+
+		default:
+			err++;
+			break;
+		}
+	}
+	if (err) {
+		lprintf(0, "usage: %s [-v] [-p <portaddr>] [-m <modestr>] [-t <test>]\n"
+			"  mode options:\n"
+			"    intclk    uses FPGA internal clock; DON'T use if an external osc is on board\n"
+			"    extclk    uses the external oscillator; recommended if the internal modem is used\n"
+			"    intmodem  uses the internal modem\n"
+			"    extmodem  uses a DF9IC type modem connected to the high speed modem connector\n"
+			"    fclk=     sets the FPGA clock frequency (default 19.6666 MHz)\n"
+			"    bitrate=  sets the bitrate for the FSK modem\n"
+			"    loopback  sets an internal modem loopback\n"
+			"    extstat   allows extended status readback\n"
+			"    noextstat disallows extended status readback\n"
+			"  test options:\n", argv[0]);
+		for (tst = eppfpgatests; tst->name; tst++)
+			lprintf(0, "    %-15s%s\n", tst->name, tst->desc);
+		exit(1);
+	}
+#ifdef HAVE_PPUSER
+	if (ppkdrv) {
+		if (parport_init_ppkdrv(ppkdrv)) {
+			fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+			exit(1);
+		}
+	} else
+#endif
+#ifdef HAVE_PPUSER
+		if (ppdev) {
+			if (parport_init_ppdev(ppdev)) {
+				fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+				exit(1);
+			}
+		} else if (ppuser) {
+			if (parport_init_ppuser(ppuser)) {
+				fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+				exit(1);
+			}
+		} else
+#endif
+#ifdef WIN32
+                        if (ntdrv) {
+                                if (parport_init_win_flags(ntdrv-1, ppflags)) {
+                                        fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+                                        exit(1);
+                                }
+                        } else if (ntddkgenport) {
+                                if (parport_init_ntddkgenport()) {
+                                        fprintf(stderr, "no NTDDK genport.sys driver found\n");
+                                        exit(1);
+                                }
+                        } else if (w9xring0) {
+                                if (parport_init_w9xring0_flags(iobase, ppflags)) {
+                                        fprintf(stderr, "no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+                        } else
+#endif
+                                if (parport_init_direct_flags(iobase, ppflags)) {
+                                        fprintf(stderr, "no parport found at 0x%x\n", iobase);
+                                        exit(1);
+                                }
+	if (!tst) {
+	  err = abs(adapter_start_epp(&cfg));
+	  goto out;
+	}
+#ifdef SIGHUP
+	signal(SIGHUP, signal_quit);
+#endif
+	signal(SIGINT, signal_quit);
+#ifdef SIGQUIT
+	signal(SIGQUIT, signal_quit);
+#endif
+	signal(SIGTERM, signal_quit);
+	err = abs(tst->func(&cfg));
+ out:
+#ifdef WIN32
+	if (!ppkdrv && !ppuser && !ppdev && !ntddkgenport && ntdrv)
+	    parport_stop_win();
+#endif
+	exit(err);
+}
diff --git a/main/eppsamp_firmware.h b/main/eppsamp_firmware.h
new file mode 100644
index 0000000..87fe576
--- /dev/null
+++ b/main/eppsamp_firmware.h
@@ -0,0 +1,1545 @@
+/*****************************************************************************/
+
+/*
+ *      eppsamp_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPSAMP_FIRMWAREDATE "19990716"
+
+/* firmware */
+static const unsigned char eppsamp_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff, 
+	0xfd, 0xed, 0xd7, 0xdf, 0xde, 0xfd, 0xed, 0x7d, 
+	0xef, 0xfe, 0xf6, 0xee, 0x6f, 0xef, 0xfe, 0xfe, 
+	0xff, 0x9b, 0xff, 0xfd, 0xaf, 0xff, 0xfd, 0xfb, 
+	0xff, 0xaf, 0xff, 0x7f, 0xfe, 0xd7, 0xff, 0x7f, 
+	0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfc, 0xed, 0xcf, 
+	0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6, 
+	0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f, 
+	0xfe, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77, 
+	0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda, 
+	0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xed, 
+	0xf5, 0xd3, 0x5f, 0x3f, 0xfd, 0xf5, 0xd3, 0x9f, 
+	0xfe, 0xfa, 0xe9, 0xaf, 0x9f, 0xfe, 0xfa, 0x69, 
+	0xff, 0xc6, 0xff, 0x3b, 0xfb, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xde, 0xb9, 0xbf, 0xf9, 0xff, 
+	0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff, 
+	0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 
+	0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xfa, 0xaf, 0xae, 
+	0xfa, 0xfa, 0xfa, 0xaf, 0xaf, 0x7f, 0xfd, 0xd7, 
+	0xd7, 0x7f, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b, 
+	0xff, 0xdf, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf6, 0xff, 0xc6, 0xff, 0xdf, 0x7f, 
+	0xef, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xff, 0x9f, 0x7f, 0xff, 0xed, 0xf7, 
+	0x9f, 0x7f, 0xff, 0xf9, 0xcf, 0xbf, 0xff, 0xfc, 
+	0xfb, 0xcf, 0xbf, 0xff, 0xfc, 0x6f, 0xf4, 0xff, 
+	0xed, 0xb7, 0xdf, 0x76, 0xfb, 0xed, 0xb7, 0xdf, 
+	0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xf9, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xe7, 0xbf, 0xff, 0xfc, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 
+	0xbf, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xf7, 0xdd, 0xef, 0xbf, 0xff, 0xee, 0xbb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 
+	0xcf, 0x35, 0xff, 0xec, 0xf3, 0xcf, 0x7f, 0xfe, 
+	0xf9, 0xa7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xff, 
+	0x6f, 0xfe, 0xff, 0xfd, 0x77, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xfd, 0x9b, 0xdd, 0xcf, 
+	0x3f, 0xbf, 0xfc, 0xf2, 0xcf, 0x3d, 0xf7, 0xcc, 
+	0xe7, 0x9f, 0x77, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xef, 0xfe, 0xfb, 0xef, 0xb7, 0xff, 0xfe, 0xfb, 
+	0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xf7, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0x9d, 0xfd, 0xf6, 0xdb, 0xdf, 0x7a, 
+	0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xad, 0xff, 
+	0x9b, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xff, 0xff, 0xe6, 0xff, 0x7f, 
+	0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xf6, 
+	0x3f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0x9b, 0xff, 0x5f, 0xff, 0xfd, 
+	0xf7, 0x5f, 0x7d, 0xf5, 0xdd, 0xf7, 0xbd, 0xff, 
+	0xee, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xff, 
+	0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xfd, 0xe9, 0xff, 0x7f, 0xfe, 0xff, 
+	0xed, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 
+	0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xbf, 
+	0x7f, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xdf, 0xfe, 0xfb, 
+	0xef, 0xf7, 0xff, 0xfb, 0xbf, 0xff, 0xef, 0xff, 
+	0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, 
+	0x7f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xf7, 0x66, 0xfe, 0xff, 0xff, 0xff, 
+	0xbf, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0xaf, 0xde, 0xff, 0xfb, 
+	0xfd, 0xef, 0x7b, 0xfe, 0xff, 0x57, 0xff, 0xf7, 
+	0xfd, 0xff, 0xff, 0xff, 0x6f, 0xf6, 0xf7, 0xff, 
+	0xef, 0xd7, 0xff, 0xdf, 0xff, 0xdf, 0xef, 0xff, 
+	0xfb, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9a, 0xfc, 0xff, 0xff, 0xf6, 0xfb, 0xfe, 
+	0xed, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xfb, 
+	0xf7, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xff, 0xcf, 0x2f, 0xf7, 0xfa, 0x5d, 0xff, 0xff, 
+	0xff, 0xf4, 0xb7, 0x5f, 0xf7, 0x7b, 0xdf, 0xbf, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xef, 0xed, 
+	0xf7, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xf7, 
+	0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xff, 0x6b, 
+	0xfe, 0xfd, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 
+	0xf7, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xf5, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xbf, 0xff, 0xbf, 0xfa, 0xee, 0xf2, 
+	0xef, 0xaf, 0xff, 0xfc, 0xf7, 0xfd, 0x7f, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0x7f, 
+	0xff, 0xe6, 0xbf, 0xff, 0xbf, 0xff, 0xef, 0xbf, 
+	0xf7, 0x7d, 0xf7, 0xdb, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0x6f, 0x7e, 0xff, 0xff, 0x7b, 0xf3, 
+	0xff, 0xbf, 0xff, 0xfd, 0xf3, 0x5f, 0xff, 0xfd, 
+	0xf9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x9b, 
+	0xff, 0x7f, 0xff, 0xff, 0x7b, 0x89, 0xff, 0xe7, 
+	0x5a, 0xe3, 0xdf, 0xff, 0xff, 0xfd, 0xf5, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xe6, 0xff, 0xff, 0xff, 
+	0xfd, 0xfe, 0xfa, 0xff, 0xbc, 0xa7, 0xff, 0xf5, 
+	0xdf, 0x5f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 
+	0xb7, 0x79, 0xff, 0x7f, 0xf9, 0xb5, 0x97, 0xf2, 
+	0xff, 0xaf, 0xbf, 0xfe, 0xfd, 0xbf, 0xdc, 0x4b, 
+	0xff, 0xff, 0xff, 0xff, 0xeb, 0x6f, 0xdc, 0xff, 
+	0xcf, 0x3f, 0xef, 0xaf, 0xff, 0xff, 0xfb, 0xfb, 
+	0x5f, 0xff, 0xfd, 0xfd, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0x5f, 0x99, 0xfb, 0xf5, 0xbf, 0x7f, 0xdb, 
+	0xff, 0xff, 0xff, 0xfe, 0xfb, 0xd5, 0xeb, 0x7f, 
+	0xfd, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xef, 0x46, 
+	0xfe, 0xff, 0xbf, 0xca, 0x58, 0x6f, 0xfd, 0x3f, 
+	0xbf, 0xbb, 0xdd, 0x7b, 0x5f, 0x95, 0xed, 0xfe, 
+	0xff, 0xff, 0xfd, 0x93, 0x99, 0xff, 0x7f, 0xf9, 
+	0x3f, 0xff, 0xfe, 0xff, 0xcf, 0xbf, 0x7f, 0x7d, 
+	0xff, 0xd7, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff, 
+	0x66, 0xec, 0xff, 0xcf, 0xfb, 0x9f, 0xff, 0xff, 
+	0xff, 0xfb, 0xfb, 0xdf, 0xff, 0xff, 0xf5, 0xd7, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0x19, 0xf7, 0xf6, 
+	0xff, 0xef, 0xb7, 0xff, 0xf6, 0xdb, 0xfd, 0xbf, 
+	0xf9, 0xff, 0xb7, 0x9f, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x77, 0xe6, 0x7d, 0xff, 0xff, 0xdf, 0x79, 
+	0x7f, 0xff, 0x79, 0xf6, 0xff, 0xff, 0xfc, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb9, 
+	0xbe, 0xfb, 0xed, 0x35, 0xfe, 0x6e, 0xfb, 0xcd, 
+	0xbe, 0xff, 0xfd, 0xf7, 0xd9, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xdf, 0xae, 0x6e, 0xee, 0xff, 0x3f, 0xff, 
+	0xfd, 0xf7, 0xcf, 0xef, 0xef, 0xff, 0xff, 0xff, 
+	0x77, 0xde, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3d, 
+	0x9b, 0xf9, 0xff, 0xf7, 0xef, 0xbf, 0xff, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xf6, 0xff, 
+	0xaf, 0xff, 0xff, 0xfb, 0xeb, 0x2d, 0xbd, 0xff, 
+	0xff, 0xde, 0x5b, 0x7f, 0xfd, 0xff, 0xff, 0xff, 
+	0x7f, 0xbb, 0x61, 0xff, 0xff, 0xcb, 0xbd, 0x9e, 
+	0x7c, 0xf2, 0xa9, 0x66, 0xff, 0xbb, 0xd7, 0x57, 
+	0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfa, 
+	0xff, 0x7f, 0xfa, 0xef, 0xfe, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xfd, 0x7f, 0xbd, 0xf7, 0xd6, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xfe, 0xff, 0x8f, 0x3e, 
+	0xfb, 0xfc, 0xa3, 0x9b, 0x5e, 0x3a, 0xfd, 0x47, 
+	0x9f, 0xdf, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 
+	0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 
+	0xaf, 0xbf, 0xdf, 0xed, 0xff, 0x5f, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xfe, 0xfa, 0xeb, 0xe7, 0x5f, 
+	0xfb, 0xff, 0xd7, 0xcf, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xbf, 0xff, 
+	0xbf, 0xae, 0x6a, 0xe8, 0xf2, 0x7f, 0xf5, 0x57, 
+	0x59, 0xef, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0x6f, 0xbb, 0xcf, 
+	0xba, 0xbf, 0x5f, 0xff, 0x9d, 0xfd, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x6d, 0x3f, 
+	0xf9, 0xf2, 0xff, 0x2f, 0xff, 0xf7, 0xe4, 0xb4, 
+	0x9f, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xaf, 0xb7, 0xee, 0x7a, 0x43, 0xaf, 
+	0xb5, 0xfc, 0xe2, 0xd7, 0x5f, 0x75, 0xfd, 0xf5, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0x3e, 0xfe, 0xff, 
+	0xbe, 0x7f, 0xff, 0xff, 0xeb, 0xf3, 0xff, 0xbf, 
+	0x7f, 0xfe, 0xff, 0x6f, 0xf5, 0xff, 0xff, 0xff, 
+	0xe7, 0x9b, 0xff, 0xf7, 0xef, 0xbf, 0xff, 0xff, 
+	0xff, 0xa9, 0x66, 0xff, 0xff, 0xfb, 0xf7, 0xdf, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xe6, 0xfb, 
+	0xff, 0xff, 0xdd, 0x7f, 0xdf, 0xbd, 0xff, 0xfe, 
+	0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0x71, 0xfe, 0xff, 0xeb, 0xaf, 
+	0xbd, 0xdd, 0xfa, 0xef, 0xff, 0x71, 0xf9, 0xf7, 
+	0xc7, 0x9b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x67, 
+	0xbc, 0xfb, 0xff, 0xfb, 0xea, 0x7f, 0xbf, 0xfd, 
+	0xfd, 0xff, 0xbf, 0xbe, 0xff, 0xfb, 0xff, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0x99, 0xfb, 0xff, 0xbb, 
+	0xff, 0xd9, 0x5f, 0xff, 0xef, 0xfe, 0xcb, 0xf9, 
+	0xdf, 0xff, 0xbf, 0xf3, 0xdf, 0xfe, 0xff, 0xff, 
+	0xff, 0xc6, 0xfb, 0xbf, 0xef, 0xbd, 0xff, 0xff, 
+	0xff, 0x4e, 0xbf, 0xff, 0xbf, 0xff, 0xdf, 0xff, 
+	0xf3, 0xf9, 0xbe, 0xff, 0xff, 0x9f, 0xe1, 0xef, 
+	0xff, 0xee, 0xbe, 0xdf, 0xeb, 0xff, 0xfb, 0x3d, 
+	0xff, 0xdf, 0xff, 0xf7, 0xf6, 0xeb, 0xfd, 0xff, 
+	0xff, 0xff, 0x6b, 0xfc, 0xff, 0xff, 0xfd, 0xfd, 
+	0xff, 0xff, 0x7f, 0xff, 0xfd, 0x12, 0xbd, 0x7f, 
+	0xfe, 0xfb, 0x9f, 0xf7, 0xff, 0xff, 0xff, 0x99, 
+	0xfd, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff, 
+	0xff, 0xdf, 0x5f, 0xff, 0xef, 0xff, 0xff, 0xbf, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 
+	0xef, 0xde, 0xda, 0xef, 0xaf, 0x9b, 0xee, 0xff, 
+	0xd7, 0xef, 0x7f, 0xfd, 0xf1, 0xff, 0xff, 0xdf, 
+	0xbf, 0xf9, 0xf7, 0xda, 0xff, 0xdf, 0xff, 0xfa, 
+	0xff, 0xfe, 0xaf, 0xff, 0xff, 0xf5, 0xfd, 0x7f, 
+	0xf6, 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xfd, 
+	0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xdf, 0xef, 0xfd, 
+	0xff, 0xbf, 0xdf, 0x9f, 0x6f, 0x7f, 0xef, 0xff, 
+	0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xda, 
+	0x9f, 0x7f, 0xff, 0xcf, 0x2f, 0x3f, 0xf2, 0xff, 
+	0x3d, 0xf5, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0x66, 
+	0xff, 0xff, 0xff, 0xbf, 0xce, 0xff, 0x6f, 0xff, 
+	0xfd, 0xcf, 0xbf, 0xff, 0xdf, 0x2f, 0xfd, 0xb7, 
+	0xff, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x7f, 0xfe, 
+	0xaf, 0xff, 0xf9, 0xff, 0xdf, 0x7c, 0xfe, 0xf3, 
+	0xaf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xd6, 0xff, 0x9f, 0xff, 0xfb, 0x5f, 0xe7, 
+	0xcf, 0xed, 0xf7, 0xbf, 0xff, 0xfa, 0xfd, 0xde, 
+	0xfb, 0xff, 0xff, 0xff, 0x5f, 0x9b, 0xfb, 0xff, 
+	0xbf, 0x6d, 0xba, 0xfd, 0xff, 0x9b, 0xf5, 0xc7, 
+	0x7f, 0xff, 0x7f, 0x5d, 0xa4, 0xf0, 0xff, 0xff, 
+	0xff, 0xef, 0x66, 0xfe, 0xff, 0x7f, 0x96, 0x6e, 
+	0xf7, 0xbb, 0xff, 0xd6, 0xff, 0xff, 0xff, 0x5f, 
+	0x2d, 0xf9, 0xdd, 0xff, 0xff, 0xff, 0xb3, 0xb1, 
+	0xff, 0xff, 0xdf, 0xaf, 0xfd, 0xcd, 0x7a, 0xff, 
+	0xe5, 0xd5, 0xbb, 0xef, 0xd7, 0xff, 0x7e, 0xfd, 
+	0xff, 0xff, 0xff, 0x66, 0xe2, 0xff, 0xff, 0xff, 
+	0xeb, 0x7f, 0xb3, 0x8e, 0xef, 0x3b, 0xff, 0xdf, 
+	0xff, 0xf5, 0x7f, 0x5f, 0xff, 0xff, 0xff, 0xbf, 
+	0x9b, 0xf7, 0xff, 0xf3, 0x6f, 0x3f, 0xdf, 0xff, 
+	0xf3, 0xcf, 0x3f, 0xbb, 0xf9, 0xb7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xff, 
+	0x79, 0xf7, 0x9b, 0xe7, 0xff, 0x7f, 0xfe, 0x99, 
+	0xef, 0xbe, 0xfb, 0xff, 0xb7, 0xff, 0xff, 0xff, 
+	0xff, 0xbd, 0xb1, 0x7f, 0xfb, 0x4d, 0xb1, 0xd7, 
+	0x5c, 0xfb, 0x8d, 0x3f, 0xd7, 0x79, 0xa7, 0xdd, 
+	0x7f, 0x9c, 0xfd, 0xf7, 0xdf, 0xff, 0x62, 0xe6, 
+	0xef, 0x3f, 0xff, 0xfd, 0xf7, 0xdf, 0x6f, 0xff, 
+	0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 
+	0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xf7, 0xbf, 
+	0xff, 0xbe, 0xfe, 0xf7, 0xbf, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 
+	0xa6, 0xfe, 0xeb, 0xff, 0xb6, 0xde, 0x77, 0xff, 
+	0x77, 0xfe, 0xfd, 0xcf, 0xf7, 0xff, 0xaf, 0xf1, 
+	0xf5, 0xff, 0xff, 0xff, 0xab, 0x79, 0xff, 0xf2, 
+	0xff, 0xaf, 0xda, 0xf9, 0xf7, 0x9f, 0x7f, 0xda, 
+	0xfb, 0xed, 0xbf, 0x7b, 0x7c, 0xf9, 0xff, 0xff, 
+	0x7f, 0x6f, 0xfe, 0x9f, 0xfe, 0x72, 0xef, 0xff, 
+	0xbf, 0xef, 0x2e, 0xff, 0xff, 0x7e, 0xfd, 0xff, 
+	0xd7, 0x5d, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xaf, 0x8f, 0x3e, 0xfe, 0xfc, 0xf3, 0xdb, 0x7f, 
+	0x3f, 0xfd, 0x47, 0x9f, 0x9f, 0xe4, 0xd1, 0xe7, 
+	0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xff, 0xbf, 0xbf, 
+	0xfe, 0xe7, 0xdf, 0xef, 0xbf, 0xff, 0xff, 0xd7, 
+	0x7f, 0xe7, 0xfd, 0xe5, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xfb, 0xaf, 0xbf, 0xff, 0xff, 
+	0xff, 0xf7, 0xdf, 0xff, 0xf5, 0xf7, 0x6f, 0x3f, 
+	0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xfa, 0xaf, 0xff, 0xfe, 0xad, 0xef, 0xbc, 0x70, 
+	0xff, 0xfd, 0xf7, 0x51, 0x4f, 0xff, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xef, 0xbf, 0xfe, 0xfa, 0xfb, 
+	0x7f, 0xfb, 0xcf, 0x3f, 0xf7, 0x7f, 0x7f, 0xdf, 
+	0xf5, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xff, 0x6f, 0xbf, 0xfc, 0xff, 0xdf, 0x4d, 0xbf, 
+	0xff, 0xff, 0xff, 0xff, 0x7b, 0xfb, 0xed, 0xff, 
+	0xf7, 0xff, 0xbf, 0xe9, 0xff, 0xaf, 0xbd, 0xf6, 
+	0xda, 0xeb, 0xa7, 0x9a, 0xd6, 0xfa, 0xd7, 0x5f, 
+	0x7f, 0xc9, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0x6b, 
+	0xfe, 0xff, 0xf7, 0xbc, 0x37, 0x3f, 0x9e, 0xac, 
+	0xc3, 0xdf, 0xff, 0xff, 0xd9, 0xff, 0x77, 0x9d, 
+	0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xef, 
+	0xaf, 0xff, 0xfa, 0xed, 0xbf, 0xff, 0xad, 0xfd, 
+	0x5d, 0xd7, 0xff, 0x3e, 0x7f, 0xfb, 0xff, 0xff, 
+	0x7e, 0xe6, 0x7f, 0xdf, 0xff, 0xfd, 0xff, 0x1d, 
+	0xef, 0x5f, 0xfd, 0x5f, 0xff, 0x7f, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xf9, 0xff, 
+	0xfe, 0xff, 0xa7, 0x3b, 0xfe, 0x7b, 0xe3, 0x2f, 
+	0x7f, 0xd8, 0xed, 0xf7, 0xff, 0xff, 0xf9, 0xef, 
+	0xff, 0xef, 0x6f, 0xfe, 0xff, 0xde, 0xff, 0x9b, 
+	0xdf, 0xb7, 0xf7, 0x1d, 0xe7, 0xbf, 0xef, 0x5b, 
+	0xaf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b, 
+	0xfe, 0xff, 0x6f, 0xfe, 0xb9, 0xff, 0xff, 0x7f, 
+	0xfe, 0xfb, 0xcf, 0x7f, 0xef, 0xe8, 0x5f, 0xc7, 
+	0xfd, 0xff, 0x7f, 0xff, 0xe6, 0xff, 0xfb, 0xaf, 
+	0xbd, 0xff, 0xf7, 0x7f, 0xff, 0x3e, 0xb7, 0xcc, 
+	0xd7, 0xff, 0x7f, 0xfb, 0xf5, 0xff, 0xfd, 0xff, 
+	0xbf, 0xf9, 0xfe, 0xfb, 0xff, 0xbf, 0xdd, 0xfb, 
+	0xef, 0xff, 0xbf, 0xbf, 0xfd, 0xef, 0xff, 0x7f, 
+	0xe9, 0x7f, 0xff, 0xff, 0xff, 0x6e, 0xbe, 0xff, 
+	0xff, 0xe7, 0xfe, 0xfe, 0x5f, 0x7f, 0xff, 0x91, 
+	0xf6, 0x3d, 0x54, 0xe4, 0xfb, 0xff, 0xfd, 0xfe, 
+	0xff, 0xff, 0x9b, 0xef, 0xff, 0xf7, 0xbf, 0xff, 
+	0x7f, 0xdf, 0xfe, 0xff, 0xec, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0x7f, 0x6f, 0xff, 0xff, 0xff, 0xe6, 
+	0xdf, 0xff, 0xff, 0xfd, 0xfe, 0xfa, 0xef, 0xae, 
+	0x99, 0x5e, 0x3f, 0xda, 0x5d, 0xf7, 0xfd, 0xc7, 
+	0xff, 0xff, 0xff, 0xbb, 0xc1, 0x7f, 0xff, 0xff, 
+	0x1f, 0xdf, 0xff, 0xdb, 0x6f, 0xad, 0x7f, 0xfd, 
+	0xb5, 0xdf, 0x1f, 0xfe, 0xed, 0xff, 0xff, 0xff, 
+	0x66, 0xba, 0xff, 0xf7, 0xff, 0xaf, 0xff, 0xbf, 
+	0xde, 0xfd, 0xbf, 0xf5, 0x7f, 0xff, 0xfb, 0xff, 
+	0x9f, 0xfd, 0xff, 0xff, 0xfb, 0x9b, 0xfe, 0xaf, 
+	0xbf, 0x98, 0xff, 0xff, 0xb9, 0xbe, 0xff, 0x6b, 
+	0xd5, 0xdf, 0x7d, 0xe3, 0xd7, 0xff, 0xfe, 0xfc, 
+	0xff, 0xbf, 0xa6, 0xff, 0x6b, 0xbf, 0xfc, 0xff, 
+	0xff, 0xdb, 0xef, 0xbf, 0xcd, 0xf5, 0xb2, 0xdf, 
+	0x62, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xb7, 0x79, 
+	0xff, 0x7a, 0xea, 0xf5, 0xf3, 0xff, 0x73, 0xf9, 
+	0xb5, 0xff, 0xf9, 0xfd, 0xf7, 0xfe, 0xfd, 0xff, 
+	0xff, 0xff, 0xf3, 0x6f, 0xd4, 0xa7, 0xde, 0x3b, 
+	0xff, 0xef, 0xbf, 0xfd, 0x7e, 0xfb, 0x19, 0x7e, 
+	0xff, 0x7d, 0xfe, 0xf3, 0xff, 0xff, 0xff, 0x5e, 
+	0x99, 0xfb, 0xb7, 0xaf, 0x5e, 0xbe, 0x7d, 0x3f, 
+	0xd9, 0xbf, 0xbf, 0xd5, 0xde, 0xff, 0xff, 0xf7, 
+	0xfa, 0xea, 0xff, 0x7f, 0xef, 0x86, 0x7e, 0xac, 
+	0xbf, 0xda, 0x7b, 0xdf, 0xdb, 0xf5, 0xff, 0x7f, 
+	0xb5, 0x57, 0xff, 0x7d, 0xbf, 0x3e, 0xfb, 0xff, 
+	0xff, 0x93, 0xb9, 0xff, 0xfa, 0x6f, 0xff, 0xef, 
+	0xff, 0xf3, 0xeb, 0xaf, 0xef, 0xab, 0xbd, 0xff, 
+	0x5f, 0xff, 0xef, 0xff, 0xff, 0xff, 0x66, 0xec, 
+	0xbf, 0xfe, 0xfb, 0xff, 0xef, 0xbf, 0xf1, 0x5a, 
+	0x6b, 0xff, 0x47, 0xed, 0xff, 0xd7, 0xfe, 0xff, 
+	0xff, 0xff, 0x3f, 0x18, 0xf7, 0xfc, 0xf3, 0xff, 
+	0x3f, 0xff, 0xf6, 0xfd, 0xbf, 0xbf, 0xf9, 0xed, 
+	0xb7, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xdf, 0x77, 
+	0xe6, 0xfd, 0xff, 0xf9, 0xf7, 0x9f, 0xef, 0x1f, 
+	0xf9, 0xfe, 0xfb, 0xbf, 0xfe, 0xfb, 0xff, 0x37, 
+	0xff, 0xfe, 0xff, 0x8f, 0xb5, 0xb9, 0x5e, 0xfb, 
+	0xef, 0xbb, 0xfd, 0xfe, 0xeb, 0xef, 0xb5, 0xd7, 
+	0x6d, 0xf7, 0xd9, 0x6f, 0xaf, 0x7d, 0xf7, 0xdf, 
+	0xbf, 0x6e, 0xee, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x73, 0xff, 0xfd, 0xf7, 0xff, 0x7f, 0xfe, 
+	0xf9, 0xef, 0xff, 0xff, 0xff, 0x3b, 0x9b, 0xf9, 
+	0xfd, 0xef, 0xbf, 0xbf, 0xff, 0xfd, 0xf7, 0xbf, 
+	0xff, 0xfe, 0xff, 0xef, 0xdf, 0x7f, 0xff, 0xff, 
+	0xff, 0xbf, 0xef, 0xe6, 0xf6, 0xfb, 0xf7, 0xbf, 
+	0xde, 0x7a, 0x7f, 0xbf, 0xfd, 0xf6, 0xf5, 0xff, 
+	0x7f, 0x7f, 0xad, 0xff, 0xff, 0x4f, 0x7f, 0xbb, 
+	0x61, 0xff, 0xf6, 0xdf, 0x6f, 0x9f, 0xc9, 0xe7, 
+	0xab, 0xae, 0x7a, 0xf5, 0xdf, 0x57, 0xdf, 0xf5, 
+	0xf7, 0xff, 0x97, 0x7f, 0x6f, 0xfe, 0xdf, 0xff, 
+	0xfe, 0xeb, 0xaf, 0xff, 0xff, 0xfb, 0xff, 0x5d, 
+	0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xdf, 0xff, 
+	0xdf, 0x9b, 0xff, 0xff, 0xcf, 0x3e, 0xfa, 0xe8, 
+	0xf3, 0x8f, 0x8e, 0x3b, 0xde, 0x67, 0x1f, 0x7d, 
+	0xff, 0xfc, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 
+	0xfb, 0xff, 0xbf, 0xff, 0xfa, 0xff, 0xfb, 0xef, 
+	0xbe, 0xc5, 0xff, 0xff, 0x7f, 0xfd, 0xfd, 0xff, 
+	0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xff, 0xef, 
+	0xbf, 0xfe, 0xff, 0xfb, 0xa6, 0x57, 0xfd, 0xff, 
+	0xf7, 0xcf, 0xaf, 0xff, 0xff, 0xd7, 0xff, 0x6f, 
+	0xfe, 0xbf, 0xff, 0xff, 0xfb, 0xaf, 0xfe, 0xbb, 
+	0x6f, 0xbe, 0x5a, 0xfd, 0xf5, 0xdf, 0x5f, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff, 
+	0xff, 0xf6, 0xeb, 0xbf, 0xbb, 0xef, 0x7b, 0x9f, 
+	0x7f, 0x7e, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xff, 0xdf, 0xff, 0x3f, 0xf9, 0xff, 
+	0xfe, 0x2f, 0xfe, 0xbb, 0xfc, 0xa7, 0xdf, 0xfe, 
+	0xf7, 0xe5, 0x7d, 0xff, 0xff, 0xbf, 0xf9, 0xbf, 
+	0x8f, 0xbd, 0xda, 0xea, 0xab, 0x07, 0xbf, 0xfc, 
+	0x32, 0x17, 0x4f, 0x6d, 0xfd, 0xf1, 0xd6, 0x5f, 
+	0x7f, 0xed, 0x6f, 0x3e, 0xbf, 0xff, 0xbb, 0xff, 
+	0xff, 0xff, 0xfb, 0xdd, 0xff, 0xfe, 0xde, 0x9e, 
+	0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 
+	0xff, 0xff, 0xdf, 0xfa, 0xff, 0xfd, 0xf7, 0xee, 
+	0x7f, 0xff, 0xf5, 0xec, 0xf7, 0x7f, 0xff, 0xbf, 
+	0xff, 0xff, 0xfb, 0x7f, 0xe6, 0x7f, 0xff, 0xff, 
+	0xff, 0xf7, 0xdf, 0xfe, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfb, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x9f, 0xf1, 0xff, 0xbb, 0xcb, 0xff, 0xbf, 0xde, 
+	0x7e, 0xe3, 0xff, 0xfe, 0xbf, 0xef, 0xdf, 0xff, 
+	0x7f, 0xdf, 0xdf, 0xff, 0xff, 0x67, 0xf8, 0xbd, 
+	0xef, 0xba, 0xfc, 0xaf, 0xff, 0xfa, 0xfd, 0xff, 
+	0xfb, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0x99, 0xf7, 0xf7, 0x7f, 0xd6, 0x7f, 
+	0xef, 0xfb, 0xfb, 0xef, 0xff, 0xcb, 0x7e, 0x7b, 
+	0xdf, 0xe7, 0xbf, 0xff, 0xfb, 0xff, 0x7f, 0xc6, 
+	0xdf, 0xeb, 0xef, 0xf7, 0xff, 0xff, 0xdf, 0x7e, 
+	0xd7, 0xfd, 0xf5, 0xff, 0xfb, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0xff, 0xbf, 0xb1, 0xff, 0x3f, 0x6f, 
+	0xff, 0xff, 0x79, 0xdf, 0xff, 0xff, 0xb1, 0xef, 
+	0xef, 0xff, 0xf3, 0xea, 0xff, 0xff, 0xff, 0xef, 
+	0x6f, 0xfc, 0xff, 0xfd, 0xbf, 0xdf, 0xde, 0x7f, 
+	0xff, 0xff, 0xf3, 0xff, 0xff, 0xda, 0xf1, 0xff, 
+	0x1f, 0x77, 0xfc, 0xff, 0xff, 0x9b, 0xdb, 0xff, 
+	0xff, 0xff, 0x6f, 0xf7, 0xbf, 0xff, 0xff, 0xfc, 
+	0xfe, 0x7f, 0xff, 0xfd, 0x7f, 0xdf, 0x7f, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xed, 0xaf, 0xff, 0xff, 
+	0xb3, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0x93, 0xed, 
+	0xff, 0xf9, 0xff, 0xd3, 0xff, 0xfe, 0xab, 0xf9, 
+	0xf7, 0xfb, 0xef, 0xaf, 0x7f, 0xfe, 0xd7, 0x7f, 
+	0xfd, 0xfd, 0xfd, 0xc7, 0xff, 0x53, 0xff, 0xfb, 
+	0xf7, 0xff, 0xff, 0x6d, 0xfe, 0x3f, 0xff, 0xfd, 
+	0xbf, 0xb7, 0xfe, 0xff, 0xbf, 0xff, 0x7f, 0xfb, 
+	0xfd, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0x1b, 0xfe, 0xaf, 0xbf, 0x5f, 0x63, 0xbe, 0xfc, 
+	0xe6, 0x9b, 0x6e, 0x7e, 0x4b, 0xfd, 0xf7, 0xfd, 
+	0x7c, 0xff, 0xe7, 0xf7, 0x3f, 0x66, 0xff, 0xeb, 
+	0xff, 0xbf, 0x5b, 0xf7, 0xff, 0xf5, 0x96, 0x5d, 
+	0xdf, 0x92, 0xff, 0x7e, 0xbf, 0xfe, 0xff, 0xeb, 
+	0xfd, 0xb7, 0xf9, 0x9f, 0x7f, 0x79, 0x35, 0xd5, 
+	0xf7, 0xef, 0xff, 0xef, 0xf3, 0xed, 0xe5, 0xff, 
+	0xeb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xd6, 
+	0xf7, 0xff, 0x3b, 0xd3, 0xed, 0xff, 0xff, 0xff, 
+	0xfb, 0xd9, 0x7f, 0xf4, 0xff, 0xfc, 0xff, 0xff, 
+	0xfe, 0xff, 0x5f, 0x9b, 0xeb, 0x3b, 0x9b, 0xff, 
+	0xfa, 0x7c, 0xf6, 0xfd, 0xf7, 0xde, 0xd7, 0xca, 
+	0xfa, 0xef, 0xbd, 0xff, 0xfe, 0xfa, 0xef, 0xef, 
+	0x66, 0xfe, 0xdf, 0xb7, 0x9a, 0xbe, 0xef, 0xff, 
+	0xff, 0xbf, 0xfb, 0xd5, 0x33, 0xff, 0x7f, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xff, 
+	0xfa, 0xaf, 0xff, 0xc3, 0xcf, 0xbf, 0xed, 0xfe, 
+	0x6d, 0xcd, 0xff, 0x5b, 0xff, 0xf7, 0xff, 0x7a, 
+	0xeb, 0x66, 0xee, 0xff, 0xfd, 0xfb, 0xdb, 0xff, 
+	0xfd, 0xf7, 0x5f, 0x7a, 0xdf, 0x79, 0xab, 0x1f, 
+	0xd4, 0xff, 0xfb, 0xf7, 0x3f, 0xbe, 0x9b, 0xf7, 
+	0x7f, 0xdb, 0x6f, 0xff, 0xdf, 0x7f, 0xff, 0xbd, 
+	0xf7, 0xbb, 0xff, 0xdf, 0xfb, 0x7f, 0xfe, 0xff, 
+	0xff, 0xfb, 0xf7, 0xe6, 0xfd, 0xff, 0xfd, 0xf7, 
+	0xdb, 0x67, 0x1f, 0x7f, 0xfc, 0xf1, 0xcf, 0x3f, 
+	0xf3, 0xf8, 0xbf, 0xff, 0xbf, 0xfb, 0xfc, 0xad, 
+	0xb1, 0x5f, 0xf3, 0xee, 0xb3, 0xcf, 0xe8, 0xe3, 
+	0x8f, 0x3f, 0xde, 0xf9, 0xd7, 0x9f, 0x7f, 0xdf, 
+	0xfd, 0x67, 0x1f, 0xff, 0x66, 0xe6, 0xdf, 0x7f, 
+	0xbf, 0xfd, 0xf3, 0xff, 0xfb, 0xef, 0xbf, 0xf6, 
+	0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x3f, 0x9b, 0xfb, 0xfe, 0xfb, 0xdf, 0xff, 0xfe, 
+	0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xa6, 0xfe, 
+	0xdf, 0xef, 0xdf, 0xdf, 0xc2, 0x1f, 0x7f, 0xbc, 
+	0xf0, 0x87, 0x7f, 0xfb, 0x7a, 0xfd, 0xff, 0x13, 
+	0xff, 0xf8, 0xab, 0x79, 0xff, 0xff, 0xdd, 0x7d, 
+	0x9a, 0xf8, 0xef, 0xbf, 0x2f, 0x7e, 0xf1, 0xce, 
+	0x7f, 0x5f, 0xfd, 0xf7, 0xc5, 0x7f, 0x7f, 0x6f, 
+	0xfe, 0xbf, 0xfe, 0x7e, 0xff, 0xef, 0xf2, 0xdd, 
+	0x6f, 0xe9, 0x7f, 0xee, 0xf7, 0x7f, 0xdf, 0xff, 
+	0xb7, 0xf5, 0xdf, 0xff, 0x9b, 0xff, 0xbf, 0x8f, 
+	0x3f, 0xff, 0xe8, 0xf3, 0xdb, 0x4f, 0x32, 0xd5, 
+	0xe7, 0x9f, 0x9f, 0xf6, 0xf9, 0x67, 0x9f, 0x7f, 
+	0xfe, 0xe6, 0xff, 0xeb, 0xaf, 0xff, 0xfe, 0xfa, 
+	0xdf, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0x7c, 
+	0xff, 0xef, 0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfa, 0xeb, 0xff, 0xbf, 0xfe, 0xbf, 0xff, 0xf5, 
+	0xdb, 0xfd, 0xfd, 0xff, 0xcd, 0xbf, 0xfb, 0xf7, 
+	0xff, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xfa, 0xbf, 
+	0xaf, 0xfe, 0xb9, 0xaf, 0x9c, 0xf1, 0xfd, 0xf7, 
+	0xdf, 0x78, 0xef, 0x7d, 0xf5, 0xdf, 0xff, 0x9b, 
+	0xff, 0xaf, 0xbf, 0xfe, 0xff, 0xeb, 0xff, 0xfb, 
+	0xdf, 0xbf, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xfe, 
+	0x5f, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0xef, 
+	0xaf, 0xfd, 0xf6, 0xff, 0xff, 0xb7, 0xfd, 0xdf, 
+	0xa7, 0xff, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0xfb, 
+	0xbf, 0xe9, 0xff, 0xad, 0xbd, 0xd6, 0xba, 0xab, 
+	0x2f, 0x3f, 0x76, 0xea, 0xd7, 0x5c, 0x7d, 0xcd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xed, 0x6b, 0xde, 0xff, 
+	0xff, 0xfd, 0x9b, 0xee, 0xff, 0x7c, 0xf3, 0xc2, 
+	0x7e, 0xf4, 0xf9, 0x6f, 0xf7, 0xef, 0xef, 0xff, 
+	0xcf, 0xff, 0x1b, 0x7d, 0xff, 0xff, 0xef, 0xed, 
+	0xfe, 0xef, 0xbb, 0x6f, 0xfb, 0xdd, 0x57, 0xff, 
+	0xfa, 0xff, 0xfe, 0xef, 0xed, 0xfe, 0x7f, 0xa6, 
+	0xff, 0x9f, 0xff, 0xef, 0xf7, 0xe7, 0xef, 0xdf, 
+	0xb7, 0x7f, 0x7d, 0xfb, 0xe7, 0xff, 0x77, 0xfe, 
+	0xff, 0xfd, 0xff, 0xaf, 0xf9, 0xff, 0xac, 0xa9, 
+	0xcf, 0x37, 0x5f, 0x7f, 0xff, 0x29, 0xff, 0xfd, 
+	0xf1, 0xff, 0x7f, 0xff, 0xdf, 0xd1, 0xff, 0xff, 
+	0x6f, 0xfe, 0xf7, 0xff, 0xfb, 0xfd, 0xff, 0xff, 
+	0xbb, 0xff, 0x6b, 0xff, 0xf5, 0x7e, 0xff, 0xf7, 
+	0xf6, 0xff, 0xfe, 0xfe, 0xff, 0x9b, 0xbe, 0x9f, 
+	0x3f, 0xee, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xf9, 
+	0x53, 0x7f, 0xff, 0xdd, 0xaf, 0xfe, 0x7d, 0xf7, 
+	0xff, 0xff, 0xe6, 0xfd, 0xdf, 0x2f, 0xbf, 0xfc, 
+	0xce, 0xdf, 0x7b, 0xaf, 0xff, 0xb0, 0x87, 0x1f, 
+	0xfe, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xb9, 
+	0xff, 0x5f, 0x3f, 0xff, 0xff, 0xfe, 0xdf, 0xfe, 
+	0xbf, 0xf7, 0xaf, 0xff, 0xfd, 0xfb, 0xf9, 0xff, 
+	0xef, 0xff, 0xfb, 0x6f, 0xfa, 0xff, 0xfb, 0xff, 
+	0x23, 0x7b, 0xcb, 0x7f, 0xfe, 0xfd, 0xf7, 0xad, 
+	0xdf, 0x7e, 0xfb, 0xfb, 0xf7, 0xf7, 0xff, 0xff, 
+	0x9b, 0xfb, 0xff, 0xff, 0xdf, 0xf7, 0xfc, 0xff, 
+	0xb7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xe6, 0xdf, 0xe9, 
+	0xba, 0xdf, 0xff, 0xfb, 0xef, 0xf7, 0xda, 0xde, 
+	0xf7, 0xdf, 0x6b, 0xf7, 0xff, 0xf7, 0xbb, 0xff, 
+	0xff, 0xbb, 0xf1, 0xff, 0xfb, 0xed, 0x7e, 0x79, 
+	0xfc, 0xff, 0x3f, 0xff, 0x75, 0xd4, 0xf1, 0xc7, 
+	0xff, 0xff, 0xb7, 0xf5, 0xff, 0xff, 0x67, 0xfe, 
+	0x7f, 0xff, 0xfc, 0xbf, 0xbf, 0xbb, 0xff, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xcf, 0xff, 
+	0xff, 0xfe, 0xbf, 0x9b, 0xfe, 0xff, 0xbf, 0xf6, 
+	0xea, 0x8b, 0xff, 0xf3, 0xf6, 0xff, 0xdf, 0x7f, 
+	0xff, 0xef, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xbf, 
+	0xa6, 0xff, 0xff, 0xaf, 0xbf, 0xfa, 0xeb, 0xfb, 
+	0xec, 0xff, 0xff, 0xfd, 0xf7, 0xfe, 0xff, 0xff, 
+	0xfd, 0xf7, 0xff, 0xff, 0xb7, 0x79, 0xff, 0x7b, 
+	0xee, 0xa5, 0x97, 0x5e, 0x3b, 0xfb, 0xb5, 0xff, 
+	0xfd, 0x77, 0xd6, 0xd2, 0xff, 0x3d, 0xff, 0xff, 
+	0xff, 0x6f, 0xd4, 0xf7, 0xdf, 0xfa, 0xeb, 0xa9, 
+	0xb3, 0x9e, 0x7e, 0xfa, 0xdf, 0x7f, 0x3f, 0x75, 
+	0xde, 0xdf, 0xef, 0xff, 0xff, 0x5e, 0x99, 0xfb, 
+	0xf1, 0xaf, 0x66, 0x9f, 0xe9, 0xff, 0xd5, 0x76, 
+	0x9a, 0xf5, 0xcf, 0xb3, 0xcd, 0xb6, 0xf3, 0x65, 
+	0xb3, 0x7f, 0x6f, 0x86, 0xfe, 0xbf, 0xa6, 0xd6, 
+	0xfb, 0xaa, 0x79, 0xe7, 0x8a, 0x56, 0xdd, 0x70, 
+	0xcc, 0x79, 0x27, 0x5c, 0x73, 0xec, 0xff, 0xb3, 
+	0xb9, 0xfe, 0xff, 0xab, 0xbf, 0xb5, 0xfe, 0xdb, 
+	0xba, 0xbc, 0x7f, 0xff, 0xbd, 0xdf, 0x5f, 0x7f, 
+	0xef, 0xf5, 0xff, 0xff, 0x66, 0xec, 0xff, 0xff, 
+	0xfa, 0x3f, 0xa1, 0xbf, 0xfe, 0xde, 0xfb, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xd7, 0xdf, 0x7f, 0xfd, 0xff, 
+	0xbf, 0x1b, 0xf7, 0xf6, 0xdb, 0xff, 0x37, 0xff, 
+	0xff, 0xfb, 0xfd, 0x3f, 0xfb, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0xa6, 0xfd, 
+	0xff, 0xff, 0xf6, 0xd9, 0x7f, 0xff, 0x75, 0xf6, 
+	0xdf, 0xdf, 0xff, 0xeb, 0xaf, 0xbf, 0xde, 0xfc, 
+	0xff, 0xff, 0x8d, 0xb9, 0x7e, 0xdb, 0xef, 0x36, 
+	0xd3, 0xbe, 0xbb, 0x8d, 0xbb, 0xcf, 0xfd, 0x77, 
+	0xdf, 0x67, 0xb7, 0xfd, 0xf6, 0xdf, 0xeb, 0x66, 
+	0xee, 0xdb, 0xff, 0xbf, 0xfd, 0xf7, 0xff, 0x6f, 
+	0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf9, 0xe7, 
+	0x9f, 0xff, 0xff, 0x3f, 0x9b, 0xf9, 0xfd, 0xff, 
+	0xdb, 0xef, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xfe, 
+	0xff, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 
+	0xef, 0xe6, 0xf6, 0xeb, 0xaf, 0xbf, 0xf1, 0xff, 
+	0xeb, 0x2f, 0xbc, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f, 
+	0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xbb, 0x79, 0x7f, 
+	0xf2, 0x89, 0x35, 0xfe, 0xfd, 0xea, 0x8b, 0xaf, 
+	0x7e, 0xd3, 0xc5, 0x17, 0x5f, 0x7c, 0xd1, 0xc5, 
+	0xff, 0x7f, 0x6f, 0xfa, 0xbf, 0xfe, 0x7e, 0xbf, 
+	0xff, 0xfb, 0x7e, 0x7b, 0xef, 0x56, 0xff, 0xfd, 
+	0xf6, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x9b, 
+	0xfe, 0xef, 0x8f, 0x2f, 0x7f, 0xf8, 0xb3, 0x9b, 
+	0x5d, 0xbb, 0xf5, 0x67, 0x97, 0xbd, 0xfc, 0xf1, 
+	0x47, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 
+	0xbf, 0x5c, 0xff, 0xff, 0x6f, 0xbf, 0xff, 0xf7, 
+	0xf7, 0xdd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xbf, 0xe1, 0xff, 0xfa, 0xeb, 0x3b, 0xff, 0xff, 
+	0xff, 0xcf, 0xe7, 0xdf, 0xff, 0xfd, 0xf5, 0xef, 
+	0x3f, 0xfd, 0xfd, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xff, 0xa7, 0xaf, 0xff, 0xff, 0xaa, 0x6f, 0xbc, 
+	0x72, 0xfd, 0xf7, 0xdf, 0x58, 0xef, 0xfd, 0xf7, 
+	0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xfb, 0xcf, 0x3f, 0xfb, 0xff, 0xf7, 
+	0x9f, 0xfd, 0xf6, 0xdf, 0xff, 0xfb, 0xff, 0xe6, 
+	0xff, 0xff, 0x6f, 0xb7, 0xfd, 0xf6, 0x7b, 0x6f, 
+	0xff, 0xff, 0xcc, 0xa7, 0xff, 0xff, 0xe7, 0xcd, 
+	0xff, 0xff, 0xfb, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 
+	0xee, 0xfa, 0xab, 0xaf, 0xbf, 0xfe, 0xba, 0xd7, 
+	0x5b, 0x7d, 0xf5, 0xf5, 0xd3, 0x5f, 0x7f, 0xfd, 
+	0x6f, 0x3e, 0xff, 0xff, 0xe0, 0xab, 0x86, 0x7f, 
+	0xdb, 0xec, 0xbf, 0x96, 0xf5, 0xf7, 0xdf, 0xff, 
+	0x9f, 0xfd, 0xef, 0xff, 0xff, 0x9b, 0xff, 0xf7, 
+	0x6b, 0xbf, 0xbf, 0xbf, 0xff, 0xdf, 0xff, 0xf7, 
+	0xff, 0xef, 0xfb, 0xff, 0xee, 0xff, 0xff, 0xff, 
+	0xff, 0x7f, 0xe6, 0xfd, 0xfd, 0xbb, 0x7f, 0xff, 
+	0xeb, 0xfd, 0xff, 0xdb, 0xcf, 0x5f, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xf9, 0xff, 0xff, 0x8f, 0xf1, 
+	0xff, 0xfb, 0xaf, 0xcb, 0xff, 0xdc, 0xb3, 0xea, 
+	0xbf, 0x7f, 0xbe, 0xb7, 0x9e, 0x9f, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0xef, 0xfb, 0x76, 0xff, 0xff, 0xff, 
+	0x7f, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 
+	0x99, 0xf7, 0x6f, 0xb3, 0xff, 0xf9, 0xfb, 0xef, 
+	0xfb, 0xfe, 0xfe, 0xbf, 0xdf, 0x77, 0xff, 0xff, 
+	0xbf, 0x7e, 0xff, 0xff, 0x7f, 0xc6, 0xff, 0xff, 
+	0xff, 0xbd, 0xff, 0xf7, 0xff, 0xc8, 0xff, 0xf7, 
+	0xff, 0xb7, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xef, 
+	0xf7, 0xbf, 0xf1, 0xe7, 0xff, 0xff, 0xbf, 0xdf, 
+	0xef, 0xff, 0xee, 0xf6, 0xbf, 0xff, 0xf7, 0xff, 
+	0xfb, 0xff, 0xef, 0xef, 0xff, 0xfb, 0x6d, 0xf8, 
+	0x3f, 0xbe, 0xfc, 0x76, 0xff, 0xbe, 0x76, 0xf0, 
+	0xe3, 0x96, 0x9f, 0xfe, 0x3a, 0x63, 0x9f, 0x75, 
+	0x76, 0xff, 0xff, 0x9b, 0xff, 0xdf, 0xfd, 0xfd, 
+	0xf7, 0xff, 0xff, 0xff, 0x9e, 0x7d, 0xd7, 0x7e, 
+	0xf7, 0xfb, 0xb9, 0xbf, 0x7f, 0xff, 0xdf, 0xef, 
+	0xe6, 0xfe, 0xff, 0xde, 0xff, 0xfd, 0xff, 0xef, 
+	0xf3, 0xff, 0xff, 0xf7, 0xff, 0xef, 0xbd, 0xf7, 
+	0xf1, 0xab, 0xff, 0xdd, 0xab, 0xa9, 0xff, 0xff, 
+	0x7f, 0x7f, 0xfe, 0xf7, 0xfb, 0xfe, 0xfb, 0xfb, 
+	0x7d, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xaf, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0x7f, 0xbf, 0xff, 0xff, 
+	0xbf, 0xfe, 0xff, 0xff, 0x5f, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xdf, 0xff, 0x1b, 0xfe, 
+	0xff, 0xff, 0xcb, 0xca, 0xdf, 0xfc, 0xf2, 0xfb, 
+	0xcf, 0x5f, 0x53, 0xaf, 0xed, 0xbf, 0x7c, 0xf9, 
+	0xfd, 0xff, 0x3f, 0x66, 0xff, 0xff, 0x7f, 0x97, 
+	0xfc, 0x7f, 0xdd, 0xfc, 0xff, 0xcf, 0xff, 0xf4, 
+	0xd9, 0xcf, 0xbf, 0x5e, 0x7e, 0xff, 0xff, 0xb7, 
+	0xf9, 0xff, 0x7f, 0xfa, 0xec, 0x97, 0xfe, 0xff, 
+	0x3f, 0xff, 0x66, 0xf5, 0xe5, 0xdf, 0xff, 0xfe, 
+	0xfb, 0xbf, 0xff, 0xff, 0x6f, 0xd6, 0xff, 0xcf, 
+	0x7b, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd9, 
+	0x67, 0xf8, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0x5f, 0x9b, 0xfb, 0xff, 0xff, 0xf7, 0xda, 0xff, 
+	0xff, 0xbd, 0xf6, 0xdf, 0xdf, 0x4a, 0xb7, 0xed, 
+	0xbf, 0x7f, 0x7e, 0xfb, 0xff, 0xef, 0x66, 0xfe, 
+	0xff, 0xff, 0xbe, 0xfa, 0xef, 0xff, 0xaf, 0xfe, 
+	0xff, 0x5f, 0x53, 0xdf, 0xbd, 0xff, 0xff, 0x5f, 
+	0xff, 0xff, 0xb3, 0xb1, 0xff, 0xff, 0xbb, 0xfd, 
+	0xbc, 0x5e, 0xcf, 0xab, 0xfd, 0x7e, 0xb5, 0xe5, 
+	0xdf, 0xf1, 0xaf, 0xef, 0xf7, 0xff, 0xff, 0x66, 
+	0xee, 0xff, 0xff, 0xdb, 0x7e, 0xaf, 0xd7, 0xf7, 
+	0x5a, 0x7e, 0xdf, 0x0b, 0xfd, 0x9d, 0x7f, 0xea, 
+	0xe1, 0xe5, 0xff, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 
+	0x6f, 0xff, 0xff, 0x7e, 0xff, 0xbd, 0xb7, 0xb9, 
+	0xff, 0xe6, 0xfb, 0xaf, 0xbf, 0xec, 0xfe, 0xff, 
+	0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xf7, 0xfb, 0x7f, 
+	0x1d, 0x7f, 0xfc, 0xd1, 0xcf, 0x3c, 0xf3, 0xf8, 
+	0xf3, 0xcf, 0x3f, 0xff, 0xff, 0xbd, 0xb1, 0xff, 
+	0xfb, 0xef, 0xb3, 0xff, 0xbe, 0xe3, 0x8f, 0x3f, 
+	0xce, 0xb1, 0x86, 0x9f, 0x7f, 0xae, 0xf9, 0xe7, 
+	0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xbf, 0xfd, 
+	0xff, 0xff, 0xfb, 0xef, 0xbf, 0xf6, 0xbf, 0xf7, 
+	0xdf, 0xff, 0xee, 0xfb, 0xff, 0xff, 0x3f, 0x9b, 
+	0xfb, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xff, 0xf7, 0xff, 0xf7, 0xdf, 0x7d, 
+	0xff, 0xfd, 0xff, 0xef, 0xa6, 0xde, 0xff, 0xff, 
+	0xb7, 0xf7, 0x7f, 0x0f, 0x7f, 0xbc, 0xf0, 0x85, 
+	0x3f, 0xff, 0xf8, 0xab, 0x85, 0x3f, 0xfe, 0xff, 
+	0xab, 0x79, 0xff, 0xff, 0x9f, 0x3f, 0xde, 0x7d, 
+	0x63, 0xbf, 0x25, 0xf6, 0xf1, 0xcf, 0x7e, 0xff, 
+	0x7d, 0xb1, 0xcf, 0xfe, 0x7f, 0x6f, 0xfe, 0xff, 
+	0xff, 0xba, 0xfb, 0xaf, 0xfb, 0xfe, 0xaf, 0xdf, 
+	0x7f, 0xae, 0xfb, 0xff, 0xfe, 0x5b, 0xb7, 0xfb, 
+	0xff, 0xff, 0x9b, 0xff, 0xff, 0x8f, 0x3e, 0xbb, 
+	0xe8, 0x33, 0xcb, 0x8f, 0x3f, 0xfe, 0xe7, 0x9f, 
+	0x1b, 0xff, 0x95, 0xe7, 0x9f, 0x3f, 0xfe, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xbe, 0xff, 0xfa, 0xcf, 0x7b, 
+	0xaf, 0xbc, 0xc5, 0xf7, 0xff, 0xde, 0xfb, 0xe5, 
+	0xdf, 0xff, 0xbe, 0xbf, 0xf9, 0xff, 0xf7, 0xff, 
+	0xbf, 0xaf, 0xfe, 0xbb, 0xdf, 0xa5, 0xdb, 0xfd, 
+	0xf7, 0xbf, 0xed, 0x3e, 0xf9, 0xfd, 0xff, 0xfb, 
+	0x6f, 0xfe, 0xff, 0xff, 0xef, 0xbb, 0xae, 0xff, 
+	0xb8, 0xaf, 0x9e, 0x79, 0xfd, 0xf7, 0xdf, 0x7c, 
+	0x7f, 0xfd, 0xf5, 0xef, 0xff, 0x9b, 0xfd, 0x7f, 
+	0xff, 0xff, 0xfb, 0xeb, 0xbf, 0xfb, 0xdf, 0xbf, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xd6, 0xdf, 0xff, 
+	0xbb, 0xff, 0xe6, 0xff, 0xff, 0xff, 0x3f, 0xbd, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x97, 0xf7, 
+	0xff, 0xff, 0x9f, 0xa7, 0xff, 0xff, 0xbf, 0xe9, 
+	0xbf, 0xaf, 0x9f, 0xda, 0xfa, 0xab, 0xaf, 0xbf, 
+	0xfa, 0xfa, 0x97, 0x1d, 0x7e, 0xf9, 0xd5, 0xd7, 
+	0x5d, 0x3d, 0xfd, 0x6b, 0xf6, 0xff, 0xff, 0xff, 
+	0xfe, 0xfe, 0xff, 0xfd, 0xff, 0xcf, 0xfe, 0xf7, 
+	0xff, 0xfe, 0x9f, 0x7f, 0xfe, 0xe9, 0x47, 0xff, 
+	0x1b, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xe7, 
+	0xdf, 0x7f, 0xbb, 0xfe, 0xfd, 0xfd, 0xfb, 0xf5, 
+	0xef, 0x2f, 0xbf, 0xbf, 0x7f, 0xa6, 0xff, 0xfe, 
+	0xff, 0xdf, 0x7f, 0xef, 0x5f, 0x77, 0x9f, 0xb7, 
+	0xff, 0xff, 0xfe, 0xbf, 0xfb, 0xb7, 0xff, 0x5f, 
+	0xff, 0xb7, 0xf9, 0xff, 0x7f, 0xea, 0xff, 0xff, 
+	0xde, 0x7f, 0xff, 0xfd, 0xda, 0xbf, 0xe6, 0xfe, 
+	0xfb, 0x67, 0xbe, 0xd0, 0xff, 0xfb, 0x6d, 0xfe, 
+	0xff, 0x7f, 0xfb, 0xff, 0xeb, 0xff, 0xef, 0xdf, 
+	0xfe, 0xfe, 0x7f, 0xdf, 0x7e, 0xff, 0xf8, 0xff, 
+	0x76, 0xff, 0xfd, 0x9b, 0xfe, 0xff, 0xbf, 0xfe, 
+	0xdf, 0xff, 0xbb, 0x7f, 0xfe, 0xfb, 0xcb, 0x7f, 
+	0xff, 0xdb, 0xff, 0xfc, 0x7f, 0xf7, 0xec, 0x9f, 
+	0xe6, 0xdf, 0xeb, 0xcf, 0xff, 0xff, 0x9f, 0xbb, 
+	0xaf, 0xfd, 0xd7, 0xfc, 0xf6, 0xfe, 0xff, 0xfb, 
+	0xbf, 0xa7, 0xef, 0xfd, 0xaf, 0xf9, 0xf7, 0xff, 
+	0xed, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x75, 0xef, 
+	0xed, 0xed, 0xff, 0xf7, 0xef, 0xff, 0xf7, 0xfe, 
+	0xfb, 0x6f, 0xfe, 0xff, 0xff, 0xcf, 0xff, 0xff, 
+	0xff, 0xcf, 0xbf, 0xff, 0x9f, 0x17, 0xde, 0xf8, 
+	0xf3, 0xbf, 0x75, 0xfe, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0x56, 0x7f, 0x7b, 0xfd, 0xfd, 0xeb, 0xd7, 
+	0xfe, 0xef, 0xff, 0xe6, 0xff, 0xcf, 0x2e, 0xdb, 
+	0x6b, 0xbf, 0x7d, 0xae, 0xf7, 0xf9, 0x75, 0xcf, 
+	0xe9, 0xaf, 0xbf, 0xff, 0xd7, 0x5f, 0xf7, 0xbf, 
+	0xf1, 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xff, 0x7d, 0xfd, 0xf7, 0xff, 0xf6, 0xf9, 
+	0xfb, 0xf7, 0x9f, 0xff, 0x67, 0xbe, 0xbf, 0xfe, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 
+	0x77, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xfb, 
+	0xfb, 0x9b, 0xfe, 0xef, 0xbf, 0xff, 0x1f, 0xfb, 
+	0x75, 0xfe, 0xf3, 0xfe, 0x57, 0x52, 0xe7, 0x37, 
+	0xbd, 0xb7, 0x6b, 0xf9, 0xe5, 0xa7, 0xa6, 0xff, 
+	0xef, 0xbf, 0xff, 0xcf, 0x7f, 0xfd, 0xf9, 0xff, 
+	0x5f, 0x6d, 0xf6, 0xff, 0x7e, 0xff, 0xfd, 0xb2, 
+	0xd9, 0xfd, 0xb7, 0x79, 0xdf, 0x7b, 0xef, 0xff, 
+	0xbf, 0xff, 0xcf, 0x2f, 0xef, 0x67, 0x99, 0xe5, 
+	0xbf, 0xdf, 0x7f, 0xef, 0xf7, 0xdf, 0xeb, 0x6f, 
+	0xd4, 0x97, 0x5f, 0xfe, 0xff, 0xff, 0xff, 0xcf, 
+	0xfe, 0xff, 0x5d, 0x7d, 0xf9, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0x5e, 0x99, 0xfb, 0xb7, 0xff, 
+	0x66, 0xff, 0xfb, 0xaf, 0xbf, 0x66, 0x5a, 0xd4, 
+	0x5e, 0xb3, 0xe7, 0xbd, 0xf7, 0xff, 0xb3, 0x4f, 
+	0xee, 0x86, 0x7e, 0xf8, 0xe5, 0xfd, 0xff, 0xaf, 
+	0xa9, 0xaf, 0xbe, 0x63, 0xf5, 0xd3, 0xff, 0x7f, 
+	0xf7, 0xdd, 0x7f, 0xff, 0xfd, 0x93, 0xb9, 0xff, 
+	0xfe, 0xfb, 0xff, 0xb7, 0xdf, 0x7a, 0xef, 0xac, 
+	0x7f, 0x31, 0xe4, 0x7e, 0xde, 0x2f, 0xbf, 0xff, 
+	0xfa, 0xfb, 0x66, 0xec, 0xff, 0xfe, 0xfb, 0xff, 
+	0xf9, 0xa7, 0x1e, 0x4e, 0xfb, 0x5f, 0x63, 0x35, 
+	0xbf, 0x72, 0xca, 0xdf, 0x87, 0x9f, 0x38, 0x18, 
+	0xf7, 0xe6, 0xbb, 0xef, 0xbf, 0xfe, 0xf2, 0xff, 
+	0xbd, 0xbf, 0xfb, 0xfe, 0x93, 0xeb, 0xaf, 0xff, 
+	0xff, 0xfe, 0xfb, 0x77, 0xe6, 0x7d, 0xba, 0xec, 
+	0xb3, 0xce, 0xef, 0xff, 0x7f, 0xfe, 0x5f, 0xdf, 
+	0x7e, 0xf2, 0xfc, 0xf3, 0xff, 0x3e, 0xff, 0xfc, 
+	0xbd, 0xb9, 0xfe, 0xfa, 0xeb, 0xb7, 0xd7, 0xfe, 
+	0x7b, 0xcd, 0xbf, 0xdb, 0x35, 0xf6, 0x1a, 0x7f, 
+	0xfe, 0xdd, 0xe7, 0x9f, 0xbe, 0x6e, 0xee, 0xbf, 
+	0xff, 0xfe, 0xfe, 0xf7, 0xff, 0x7f, 0xff, 0xfd, 
+	0xf6, 0xb9, 0xef, 0xbe, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0x3b, 0x9a, 0xf9, 0x6f, 0xbf, 0xfd, 0xff, 
+	0xbe, 0xff, 0xef, 0xbb, 0xff, 0xfe, 0xfd, 0xf5, 
+	0xff, 0xdf, 0xff, 0xff, 0xfd, 0xd7, 0xcf, 0xe6, 
+	0xf6, 0xfb, 0xef, 0xb7, 0xff, 0xdf, 0xeb, 0x3f, 
+	0xf4, 0xfe, 0xd5, 0xd7, 0x7e, 0xfa, 0xe3, 0xfe, 
+	0x37, 0xde, 0x78, 0xbb, 0x61, 0xdf, 0xae, 0xbb, 
+	0xbf, 0xfe, 0xf9, 0xf2, 0x8b, 0x67, 0x7e, 0xb5, 
+	0xd5, 0x33, 0xfb, 0xfd, 0xfb, 0xcd, 0x37, 0x7f, 
+	0x6f, 0xfe, 0xff, 0xee, 0xbb, 0xef, 0xbf, 0xbf, 
+	0xee, 0xeb, 0xef, 0x5f, 0x7f, 0x9d, 0xf7, 0xff, 
+	0x4f, 0x7f, 0xf7, 0xdd, 0xff, 0x9b, 0xff, 0xbf, 
+	0xcf, 0x3e, 0xfe, 0xf8, 0xa3, 0x9b, 0x5e, 0xbe, 
+	0x95, 0x41, 0x1f, 0x9f, 0xee, 0xd0, 0xc7, 0x1f, 
+	0x7f, 0xfe, 0xe6, 0xff, 0xef, 0xbf, 0xff, 0xf8, 
+	0xff, 0x9f, 0x7e, 0xbf, 0xfe, 0xc5, 0x93, 0x7f, 
+	0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xef, 0xfb, 0xef, 0xef, 0xff, 0xff, 0xff, 0xcf, 
+	0xa7, 0x5f, 0x3d, 0xe5, 0xf7, 0xeb, 0xaf, 0xfb, 
+	0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfb, 0xee, 
+	0xbb, 0xbf, 0xfe, 0xbf, 0x6f, 0xbc, 0x72, 0xf5, 
+	0xf5, 0x57, 0x39, 0x4f, 0xff, 0xf7, 0xdf, 0xff, 
+	0x1b, 0xfe, 0xef, 0xbf, 0xff, 0xf3, 0xfb, 0x7f, 
+	0xfb, 0xce, 0x3f, 0xd3, 0x5b, 0x7f, 0xbf, 0xff, 
+	0x96, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xc5, 0xff, 0xff, 0xaf, 0xfc, 
+	0xe9, 0xa7, 0xfe, 0x5f, 0xef, 0xed, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xfd, 0xaf, 0xbd, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0xe2, 0xd6, 0x5d, 0x7f, 
+	0xfd, 0x55, 0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0x36, 
+	0xff, 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xaf, 
+	0xf7, 0x7f, 0xf7, 0xfd, 0xf6, 0xae, 0xdf, 0x9f, 
+	0xdf, 0x47, 0xe6, 0x9b, 0x7b, 0xf7, 0xeb, 0xaf, 
+	0xbf, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xfd, 0xf9, 
+	0xef, 0xcd, 0xba, 0xff, 0xfe, 0xef, 0xbe, 0xff, 
+	0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xff, 0xd7, 0xf5, 0xb7, 0x9b, 0xfe, 0xbb, 0xbf, 
+	0xdf, 0x7f, 0xbe, 0xff, 0xbf, 0x31, 0xdf, 0x7e, 
+	0xff, 0xb5, 0xff, 0x7f, 0x78, 0x2f, 0x8f, 0x57, 
+	0xb8, 0xe7, 0xfc, 0xff, 0xf3, 0xff, 0xe9, 0xdf, 
+	0xff, 0x67, 0xfc, 0xed, 0xee, 0xff, 0xfb, 0xff, 
+	0xff, 0xfb, 0xff, 0xf6, 0xfe, 0xff, 0xf7, 0xfe, 
+	0xfd, 0xef, 0xeb, 0x7f, 0xff, 0x7b, 0x99, 0xfe, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xee, 0xee, 0xaf, 0xee, 
+	0xff, 0xf2, 0xdd, 0xf7, 0xff, 0xff, 0xdf, 0xf7, 
+	0x7f, 0xdf, 0xf7, 0x46, 0xff, 0xeb, 0xad, 0xbf, 
+	0xf6, 0xea, 0xff, 0x67, 0xff, 0xd7, 0xff, 0xfe, 
+	0xff, 0xfe, 0xef, 0xe9, 0xff, 0xfb, 0xe7, 0x9f, 
+	0xf1, 0xf7, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0x5f, 
+	0x8f, 0xfc, 0xbb, 0x67, 0xff, 0x7e, 0xfd, 0xed, 
+	0xfd, 0xff, 0x7f, 0xff, 0x67, 0xfc, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xdb, 0x6f, 0xcf, 0xe1, 0xb5, 
+	0xb7, 0xce, 0xb0, 0xc3, 0x1f, 0xf7, 0x86, 0x9b, 
+	0xff, 0x98, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbe, 
+	0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xfa, 0xfb, 
+	0x77, 0xbd, 0xbb, 0xff, 0xfe, 0xef, 0x66, 0xff, 
+	0xee, 0xbf, 0xdf, 0xfe, 0xfb, 0xfd, 0xaf, 0xdf, 
+	0xf7, 0x77, 0xf9, 0xfd, 0xbf, 0xef, 0xe7, 0xfb, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xcb, 0xa9, 
+	0xbf, 0xfe, 0xff, 0xeb, 0xfb, 0x6f, 0xfc, 0xdf, 
+	0x3f, 0xff, 0xbe, 0xfc, 0xef, 0xff, 0xff, 0x6d, 
+	0xfe, 0xbf, 0xef, 0xfe, 0xfb, 0xef, 0xfe, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0x9b, 0x78, 0xe2, 0xfc, 
+	0xfb, 0x9f, 0x1f, 0x7f, 0xe4, 0xd5, 0xf7, 0xbe, 
+	0xfe, 0xf8, 0x9b, 0x6f, 0x7d, 0xf9, 0xd0, 0x33, 
+	0xdf, 0xa6, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0x7e, 
+	0x1d, 0x2f, 0xe6, 0xcb, 0xdf, 0x72, 0xff, 0xf9, 
+	0xf7, 0xd5, 0x7a, 0xff, 0xfc, 0xaf, 0xd9, 0xff, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xff, 0xab, 0x7f, 
+	0xd7, 0x97, 0xdd, 0xba, 0xf9, 0x4e, 0xbb, 0xfe, 
+	0x7f, 0xff, 0x6d, 0xfe, 0xf7, 0xde, 0x7b, 0xef, 
+	0xbd, 0xff, 0xfb, 0xfa, 0xdf, 0xff, 0x7e, 0x3b, 
+	0xa5, 0xbf, 0x53, 0x7e, 0xf5, 0xff, 0xfa, 0x1b, 
+	0xf5, 0xe5, 0x97, 0x5f, 0x7e, 0xf9, 0xff, 0xbf, 
+	0xfe, 0xef, 0xff, 0xdf, 0x67, 0xf9, 0x7f, 0x96, 
+	0x53, 0xff, 0x9f, 0x57, 0xe6, 0xbe, 0x6d, 0xbf, 
+	0xdd, 0xf6, 0xfb, 0xfd, 0xff, 0xff, 0xf7, 0x9f, 
+	0x77, 0xfe, 0xfb, 0xe7, 0xb5, 0xfa, 0xfe, 0xff, 
+	0x9b, 0x91, 0xff, 0xde, 0x7b, 0xe3, 0xbd, 0x1f, 
+	0xff, 0xbf, 0xff, 0xff, 0xff, 0xdd, 0x7f, 0xff, 
+	0x7f, 0xf5, 0xde, 0xff, 0xff, 0x6c, 0xec, 0xbf, 
+	0xff, 0xfe, 0xfa, 0xef, 0xff, 0xdf, 0xff, 0x3f, 
+	0xfd, 0x69, 0xe7, 0xd5, 0xff, 0x5f, 0x5f, 0xed, 
+	0xff, 0xbf, 0x19, 0xfb, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xff, 0xef, 0xff, 0xdf, 0xfe, 0xd6, 0x2b, 
+	0xad, 0x1f, 0x56, 0x4a, 0xa9, 0xff, 0xef, 0xc6, 
+	0xfd, 0xfb, 0xee, 0xbb, 0xef, 0xfe, 0xff, 0xff, 
+	0xfb, 0xf5, 0xae, 0xbf, 0xfe, 0xda, 0x8b, 0x2f, 
+	0xbb, 0xfe, 0xff, 0x9d, 0x79, 0xf7, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xfb, 0xff, 0xff, 0x71, 0xfe, 0xf3, 
+	0xcf, 0x3f, 0xff, 0xec, 0x33, 0xcf, 0xff, 0x7f, 
+	0x67, 0xae, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xff, 
+	0xfe, 0xfb, 0x8f, 0x7f, 0xfc, 0xf1, 0xc7, 0x9f, 
+	0x77, 0xfe, 0xf9, 0xf7, 0xbf, 0x99, 0xf8, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xff, 0xce, 0xe6, 0xfe, 0xdb, 0x6f, 0xbf, 0xfd, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xf7, 0xbb, 0xb9, 
+	0xfd, 0x7e, 0xfb, 0xef, 0xff, 0xff, 0xfa, 0xe9, 
+	0x2f, 0xf4, 0xe1, 0x85, 0x3e, 0x5e, 0x7a, 0xa1, 
+	0xaf, 0xfb, 0xff, 0x6e, 0xde, 0xbf, 0xfb, 0xee, 
+	0xbb, 0xff, 0xba, 0xfc, 0xf2, 0x8b, 0x7f, 0x6c, 
+	0xf1, 0xdf, 0x13, 0x5f, 0xfc, 0xf7, 0xef, 0xdf, 
+	0x9b, 0xff, 0xbf, 0xfb, 0xee, 0x7b, 0xff, 0xad, 
+	0xbf, 0x5f, 0xaa, 0xdf, 0x4b, 0xfe, 0xf7, 0xff, 
+	0x57, 0xfb, 0xbf, 0xff, 0xff, 0xe6, 0xff, 0xef, 
+	0xb3, 0xcf, 0x3e, 0xff, 0xe8, 0xe3, 0x8f, 0x0e, 
+	0x67, 0xd0, 0xe1, 0x87, 0x1f, 0x74, 0xf8, 0xe5, 
+	0x97, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xbf, 0xbf, 
+	0xfe, 0xe7, 0xeb, 0xff, 0xff, 0xf9, 0xff, 0xbf, 
+	0x5f, 0x7f, 0xf9, 0xcf, 0x97, 0xff, 0x6f, 0xfe, 
+	0xff, 0xfe, 0xfb, 0xef, 0xaf, 0xff, 0xff, 0xfa, 
+	0xff, 0x75, 0xb6, 0xbf, 0x7e, 0xd3, 0x4d, 0xb7, 
+	0xff, 0x64, 0xff, 0x9b, 0xff, 0xef, 0xbe, 0xfb, 
+	0xee, 0xab, 0xff, 0xbf, 0xff, 0xaf, 0x5e, 0xf3, 
+	0xd5, 0x33, 0xdf, 0x1c, 0xf3, 0x55, 0x7d, 0xff, 
+	0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xdf, 
+	0xef, 0xff, 0x1f, 0x76, 0xf9, 0xe3, 0x97, 0x5f, 
+	0x74, 0xf9, 0x41, 0xd6, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xb7, 
+	0xf7, 0xe5, 0xff, 0xff, 0x7f, 0xf9, 0xdf, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xcb, 0xaf, 0xbf, 0xfc, 
+	0xfa, 0xeb, 0xaf, 0xbe, 0xea, 0xb5, 0x56, 0x5f, 
+	0x7b, 0xad, 0xf5, 0xc7, 0x5e, 0xff, 0x9b, 0xfd, 
+	0xff, 0xfc, 0xf7, 0xaf, 0xff, 0xfc, 0xfb, 0xec, 
+	0xfb, 0x9f, 0xf9, 0xee, 0xfd, 0x47, 0xbf, 0x7f, 
+	0xfe, 0xdf, 0xd9, 0xc6, 0xfb, 0xfd, 0xf7, 0xef, 
+	0x7f, 0xff, 0xfd, 0x67, 0xdf, 0xff, 0xdf, 0xf5, 
+	0x7f, 0xf7, 0xfc, 0xfb, 0x8f, 0xff, 0xff, 0xbf, 
+	0xf9, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 
+	0xed, 0xdf, 0x6a, 0x55, 0xcf, 0xfd, 0xfe, 0xdb, 
+	0xf7, 0x7f, 0xfc, 0xf9, 0x6f, 0xfe, 0xbf, 0xdb, 
+	0xeb, 0xfb, 0xcf, 0xaf, 0xfe, 0xff, 0xfe, 0xf5, 
+	0xff, 0x7d, 0xfe, 0xfd, 0x9d, 0xff, 0xff, 0xf5, 
+	0x9f, 0x19, 0xff, 0x7e, 0xff, 0xff, 0xfb, 0xff, 
+	0xaf, 0xf7, 0xfb, 0x7f, 0xff, 0xdd, 0xff, 0xbf, 
+	0x7f, 0xff, 0xff, 0xf7, 0x3c, 0x3f, 0xe6, 0xff, 
+	0xc7, 0xe7, 0xe3, 0xef, 0xbf, 0xdd, 0xff, 0xdb, 
+	0x36, 0xf7, 0xdb, 0x7f, 0xf7, 0xff, 0xf3, 0x5f, 
+	0xf7, 0xb7, 0xbf, 0xd1, 0xff, 0xfa, 0xfd, 0x7b, 
+	0xff, 0xff, 0xbf, 0xff, 0x0f, 0x3f, 0xfc, 0xe1, 
+	0x87, 0xdf, 0xff, 0xbb, 0xf9, 0xff, 0xfd, 0x67, 
+	0xee, 0xff, 0x7f, 0xff, 0xff, 0xf5, 0xef, 0xcf, 
+	0xff, 0x7d, 0xf6, 0xbb, 0x8f, 0x5f, 0xf7, 0xfb, 
+	0xbf, 0xbd, 0xbf, 0xbe, 0x99, 0xff, 0xcf, 0xff, 
+	0x6f, 0xff, 0xfb, 0xfe, 0xfc, 0xef, 0xf8, 0xc6, 
+	0xbd, 0x7f, 0xff, 0x6f, 0x7b, 0x9f, 0xff, 0xff, 
+	0x7f, 0xe6, 0xff, 0xf3, 0xfd, 0xf7, 0xef, 0x7e, 
+	0xff, 0xfb, 0xf5, 0xfe, 0xef, 0xef, 0xdf, 0xff, 
+	0xff, 0x7f, 0xe6, 0xfe, 0xfd, 0xbb, 0xf9, 0xef, 
+	0xff, 0xff, 0xf7, 0xff, 0x7f, 0x7f, 0xef, 0xbf, 
+	0xff, 0xfd, 0xf7, 0x5b, 0xff, 0x6b, 0xfd, 0x75, 
+	0x7f, 0xf7, 0x6f, 0xfe, 0xdf, 0x4f, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe9, 0x61, 0x13, 0x7a, 0xec, 
+	0xc1, 0xd3, 0x77, 0xb6, 0xfd, 0xff, 0xff, 0x9b, 
+	0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0x7f, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xef, 
+	0x7f, 0xff, 0xff, 0xff, 0x86, 0xff, 0xbf, 0xb9, 
+	0xe4, 0xfb, 0xee, 0xef, 0xaf, 0xbf, 0xfb, 0xdd, 
+	0xf7, 0xdf, 0x7d, 0xf7, 0xdd, 0xf7, 0xdf, 0xff, 
+	0x8f, 0xd9, 0xff, 0x6f, 0xbe, 0xf9, 0xbc, 0xfb, 
+	0xfb, 0xeb, 0x3f, 0xff, 0xf9, 0xf7, 0xda, 0x7e, 
+	0xc9, 0xe5, 0xf7, 0xf7, 0xff, 0x6d, 0xfe, 0xd7, 
+	0xff, 0x7b, 0xfa, 0xef, 0xff, 0xfe, 0x7f, 0x4f, 
+	0x7d, 0xee, 0xad, 0x97, 0x9e, 0x7b, 0xea, 0xed, 
+	0xfd, 0xff, 0x9b, 0xf5, 0xf9, 0xff, 0xdf, 0xfb, 
+	0xfb, 0xbf, 0xff, 0x5f, 0x6e, 0xf5, 0xcb, 0x2f, 
+	0xbf, 0xfc, 0xb2, 0xcb, 0x7f, 0xff, 0xd7, 0xe6, 
+	0xfe, 0x6b, 0xbf, 0xc9, 0x77, 0xde, 0xef, 0xaf, 
+	0xff, 0x76, 0x17, 0xdb, 0x6f, 0xb7, 0xf5, 0xf6, 
+	0xdb, 0xcf, 0xff, 0xbb, 0x99, 0xff, 0xea, 0xbf, 
+	0xf7, 0xae, 0xfb, 0xeb, 0xab, 0xef, 0x44, 0xc7, 
+	0xdc, 0x70, 0xcd, 0x0d, 0x37, 0xdc, 0x70, 0xff, 
+	0x6c, 0xec, 0xff, 0xff, 0xfb, 0x3a, 0xe5, 0xff, 
+	0xf6, 0xdf, 0x7b, 0xdf, 0x7f, 0xef, 0xfd, 0xf7, 
+	0xdf, 0x7b, 0xaf, 0xfd, 0xbf, 0x99, 0xf9, 0xff, 
+	0xf0, 0xd3, 0x5b, 0x3b, 0xbd, 0xff, 0xff, 0xdb, 
+	0xdf, 0x6a, 0xab, 0xed, 0x37, 0xde, 0x7e, 0x4b, 
+	0xff, 0xef, 0xa6, 0xfd, 0xdf, 0x7f, 0xef, 0xad, 
+	0xf7, 0xfe, 0xfe, 0xbf, 0xf7, 0x3c, 0xf7, 0xdc, 
+	0x73, 0xcf, 0x3d, 0xf7, 0xf4, 0xf7, 0xbd, 0x69, 
+	0xff, 0x67, 0x9f, 0x7f, 0xde, 0xf9, 0xdf, 0x7d, 
+	0xef, 0x7f, 0x9f, 0x5d, 0x76, 0xd9, 0x65, 0x97, 
+	0x5d, 0xd6, 0x79, 0x6f, 0xe4, 0xdf, 0xbc, 0xf3, 
+	0x8f, 0x3f, 0xff, 0x56, 0xfb, 0xeb, 0x5f, 0x7f, 
+	0xfd, 0xb5, 0xd7, 0x5f, 0x7f, 0xed, 0xf6, 0xbf, 
+	0x99, 0xf9, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 
+	0xf7, 0xde, 0x9b, 0xff, 0xcf, 0xe6, 0xfe, 0xbf, 
+	0xfb, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xff, 
+	0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xfd, 
+	0xff, 0xbb, 0xa9, 0xff, 0xc6, 0x1f, 0x77, 0xfc, 
+	0xd1, 0xfa, 0xef, 0xff, 0x75, 0xef, 0xbd, 0xf7, 
+	0xde, 0x7b, 0xaf, 0xbd, 0xf7, 0xff, 0x6a, 0xde, 
+	0xdf, 0x78, 0xe7, 0x9f, 0xff, 0xbe, 0xda, 0xef, 
+	0x9d, 0xdf, 0x3c, 0xd3, 0x4c, 0x33, 0xdd, 0x34, 
+	0xd3, 0xe7, 0xdf, 0x9b, 0xff, 0xff, 0xf2, 0xdf, 
+	0xef, 0xbf, 0xff, 0xff, 0xde, 0xff, 0xdd, 0x6f, 
+	0xbf, 0xfd, 0x76, 0xdb, 0x6b, 0xff, 0xfd, 0xff, 
+	0xe6, 0xff, 0xff, 0x73, 0xcf, 0x3f, 0xff, 0xfc, 
+	0xf3, 0xcf, 0x0f, 0x77, 0xd8, 0x65, 0x97, 0x5d, 
+	0x76, 0xd9, 0xc5, 0x97, 0xbf, 0xf9, 0xff, 0xf6, 
+	0x8f, 0xaf, 0xff, 0xfd, 0xf7, 0xef, 0xaf, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 
+	0xfd, 0x6f, 0xfe, 0xff, 0xfc, 0xfe, 0xeb, 0x7f, 
+	0xff, 0xff, 0xff, 0xeb, 0x75, 0xb7, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xfc, 0xff, 0x9b, 0xff, 
+	0xff, 0xfe, 0xfa, 0xef, 0xbf, 0x7f, 0xfe, 0xfa, 
+	0xaa, 0x76, 0xd3, 0x55, 0x57, 0x5d, 0x75, 0xd5, 
+	0x55, 0x7f, 0xff, 0xe6, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0xff, 0xdf, 0x7f, 0xbf, 0x1e, 0x7d, 0xf1, 
+	0xc1, 0x07, 0x1f, 0x7c, 0xf0, 0x61, 0xdf, 0xbf, 
+	0xf9, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xf4, 0xd4, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xef, 
+	0xbf, 0xff, 0xa6, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 
+	0xaf, 0xbf, 0xdc, 0x7a, 0xab, 0xaf, 0xbf, 0xfa, 
+	0xd5, 0xd7, 0x5f, 0x7b, 0xf5, 0xf5, 0xd7, 0x5f, 
+	0xff, 0x9a, 0x7f, 0x3f, 0xba, 0xfc, 0xf3, 0x5d, 
+	0xbf, 0xff, 0xef, 0xbb, 0xfe, 0xfd, 0xa7, 0x5f, 
+	0x57, 0x3e, 0xf9, 0xe7, 0xde, 0xff, 0xc6, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xe7, 
+	0xfe, 0xef, 0xff, 0xfb, 0xfb, 0xbb, 0xfd, 0xff, 
+	0xfb, 0xfb, 0x9f, 0xf9, 0xf7, 0xfa, 0xeb, 0x2f, 
+	0xfd, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0x6b, 
+	0xfe, 0xf7, 0xff, 0xfb, 0xe3, 0xff, 0xff, 0xfc, 
+	0xf7, 0xcb, 0x5f, 0x77, 0xfe, 0xf5, 0xe6, 0x9f, 
+	0x7f, 0xfa, 0xf5, 0xff, 0x9b, 0xff, 0xff, 0xbf, 
+	0xef, 0xfd, 0xff, 0xdf, 0xee, 0xef, 0xf5, 0xbe, 
+	0xfd, 0xdf, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xfb, 
+	0xff, 0xe6, 0xff, 0xef, 0xff, 0xf7, 0xef, 0x2f, 
+	0x5f, 0xff, 0xff, 0x7f, 0xfc, 0xfb, 0xcd, 0xb7, 
+	0xfc, 0xf2, 0xfb, 0x4d, 0xf7, 0xbf, 0xf9, 0xef, 
+	0xfa, 0x7f, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0x7f, 
+	0x9a, 0xaf, 0xef, 0xff, 0x4f, 0x7e, 0xfd, 0xff, 
+	0xaf, 0xff, 0x6f, 0xfe, 0xff, 0xfd, 0xdf, 0xfd, 
+	0xff, 0xee, 0xf3, 0xbf, 0x7f, 0xf5, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x9b, 
+	0xff, 0xef, 0xbf, 0xef, 0xfc, 0xf3, 0x8f, 0x1f, 
+	0x7e, 0x7d, 0x77, 0xbd, 0x6f, 0x9f, 0x61, 0x46, 
+	0xbe, 0xdf, 0xff, 0xdf, 0xe6, 0xff, 0xfb, 0xef, 
+	0xff, 0xed, 0xfc, 0xee, 0xbf, 0x7f, 0x7f, 0xfd, 
+	0xef, 0xdc, 0xff, 0xfd, 0xcf, 0xef, 0xff, 0xfd, 
+	0xbf, 0xb9, 0xff, 0xfa, 0xdf, 0xdf, 0xff, 0xff, 
+	0xff, 0xfe, 0xf7, 0xfa, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xe8, 0xff, 
+	0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x3f, 
+	0xff, 0xfe, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x99, 0xff, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 
+	0x7f, 0x2d, 0x6f, 0xfe, 0x93, 0x2f, 0xbf, 0xfc, 
+	0xa6, 0x9b, 0xdf, 0x5c, 0xf3, 0xfd, 0x37, 0xdf, 
+	0x7c, 0xff, 0xff, 0xa9, 0xd9, 0x5f, 0xfe, 0xdb, 
+	0x79, 0xff, 0xfd, 0xff, 0xff, 0x6c, 0xe5, 0x3b, 
+	0xed, 0xbc, 0xf3, 0xce, 0x3b, 0xef, 0xff, 0xff, 
+	0x6d, 0xfe, 0xff, 0x92, 0xdf, 0xff, 0xff, 0xff, 
+	0xfb, 0xef, 0xdb, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xff, 0xdf, 0x1b, 0xf7, 0xef, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 
+	0xff, 0xdf, 0xfd, 0xff, 0xef, 0x7f, 0xff, 0xfd, 
+	0xff, 0x57, 0xe6, 0xf6, 0x7f, 0xef, 0xff, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xbd, 0xf7, 0x9f, 0xdf, 0xee, 
+	0x79, 0xed, 0xb5, 0xff, 0x5e, 0xff, 0xbb, 0xb9, 
+	0xff, 0xaf, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xfe, 0xff, 0xdd, 0xfd, 0x5f, 0x7d, 0xf5, 
+	0xff, 0x57, 0xff, 0x64, 0xee, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xf3, 0xfb, 0x4f, 0xb9, 0xff, 0xfd, 
+	0xf5, 0xdf, 0xd7, 0x59, 0xff, 0xff, 0xf5, 0xbf, 
+	0x19, 0xf8, 0xff, 0xe4, 0xff, 0xcf, 0x3f, 0xf5, 
+	0xfd, 0xc7, 0x5e, 0xff, 0xd8, 0xeb, 0x8f, 0x95, 
+	0x57, 0xfa, 0x69, 0xfd, 0x0f, 0xe6, 0xfd, 0xdf, 
+	0xfb, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb5, 
+	0xae, 0xbf, 0xf6, 0xfa, 0xeb, 0xaf, 0xbd, 0xf6, 
+	0xff, 0x9d, 0x79, 0x9f, 0xe7, 0xff, 0x7f, 0xfe, 
+	0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xb3, 0xcf, 0x3f, 
+	0xff, 0xec, 0xf3, 0xcf, 0xff, 0x7f, 0x6d, 0xec, 
+	0xdf, 0x7c, 0xfb, 0xcf, 0x3f, 0xff, 0xf8, 0xe3, 
+	0x8f, 0x7f, 0xdc, 0xf1, 0xc7, 0x9f, 0x77, 0xfe, 
+	0xf9, 0xb7, 0x2a, 0x9a, 0xf9, 0xfb, 0xcf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xce, 
+	0xe6, 0xfe, 0xbf, 0xfe, 0xff, 0xfb, 0xef, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xdf, 0xb3, 0xb9, 0xff, 0xc7, 
+	0xfb, 0x2f, 0xfc, 0xf1, 0xd7, 0x1f, 0x7f, 0x7c, 
+	0xe1, 0x8f, 0x3f, 0x5e, 0xfa, 0xe3, 0x8f, 0xff, 
+	0xdf, 0x6e, 0xde, 0xff, 0xf8, 0x73, 0x8b, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfc, 0xf7, 0xdf, 
+	0x17, 0xff, 0xfd, 0xf7, 0xff, 0xdf, 0x9b, 0xff, 
+	0x7f, 0x9f, 0xff, 0xfa, 0xbf, 0xff, 0xf7, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xfe, 0xfd, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xb3, 0x8f, 
+	0x3c, 0xff, 0xfc, 0xf3, 0xcf, 0x8d, 0x6f, 0xb8, 
+	0xe1, 0x86, 0x1f, 0x6e, 0xb9, 0xe1, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xe7, 0xff, 0x2f, 0xff, 0xff, 0xf7, 
+	0xdf, 0x7f, 0x6e, 0xf9, 0xcf, 0xbf, 0x5f, 0xe4, 
+	0xd3, 0xcf, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 
+	0xff, 0xeb, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x55, 
+	0xb7, 0xbf, 0x7e, 0xd3, 0xef, 0xbf, 0xdf, 0xfe, 
+	0xff, 0x9b, 0xff, 0xff, 0xfe, 0xff, 0xe2, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xaf, 0x3e, 0xf3, 0xd5, 0x33, 
+	0xdf, 0x7d, 0xf7, 0xcd, 0x7f, 0xff, 0x86, 0xff, 
+	0xef, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0x7f, 0xf9, 0xe3, 0x97, 0x3f, 0xfe, 0xf8, 
+	0xe5, 0xdf, 0xbf, 0xf9, 0xff, 0xff, 0x8b, 0xfb, 
+	0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 
+	0x7e, 0xff, 0xeb, 0x8d, 0xbf, 0xfe, 0xfa, 0xab, 
+	0xaf, 0xbc, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f, 0xfc, 
+	0xf5, 0x57, 0x5f, 0xff, 0x9b, 0xff, 0xf6, 0xfd, 
+	0xf7, 0xf3, 0xfd, 0x3d, 0xff, 0xef, 0xb6, 0xbf, 
+	0xfd, 0xf6, 0xf9, 0xe6, 0xdf, 0xed, 0xf6, 0xff, 
+	0xf9, 0xc6, 0xff, 0xbf, 0xff, 0xdf, 0xce, 0xff, 
+	0xe9, 0xf7, 0xbf, 0x7f, 0xfb, 0xf6, 0x6f, 0x3f, 
+	0x7d, 0xbf, 0xf3, 0xff, 0xef, 0xbb, 0xf9, 0xff, 
+	0xff, 0xff, 0xef, 0xfd, 0xff, 0xf7, 0x7f, 0xff, 
+	0xfe, 0xff, 0xbf, 0xb7, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0x6f, 0xfc, 0xff, 0xfd, 0x70, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xbf, 0xff, 
+	0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x99, 
+	0x7f, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0xfb, 0xff, 0x7e, 0xff, 0xd7, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xfe, 
+	0xff, 0xdd, 0xbf, 0xef, 0xfd, 0xfb, 0xef, 0xef, 
+	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xbb, 0xf9, 0xff, 0xbf, 0xbd, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0x7f, 0xef, 0xfb, 0xef, 0x7b, 0xff, 
+	0xfe, 0xfb, 0xfe, 0xff, 0xff, 0x67, 0xfe, 0xff, 
+	0xd7, 0xdf, 0x7f, 0xff, 0xff, 0xbd, 0xef, 0xff, 
+	0xfd, 0xdf, 0xbf, 0xbf, 0xfe, 0xff, 0xeb, 0xff, 
+	0xff, 0xff, 0x99, 0xdf, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xff, 0x3f, 0xf7, 0xbd, 0x77, 0xdf, 0xf7, 
+	0xfe, 0x7b, 0xf6, 0xbf, 0xff, 0xfe, 0x7f, 0xe6, 
+	0xbf, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0x7f, 0xc7, 
+	0x7f, 0xf7, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfd, 
+	0xef, 0xbf, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xeb, 
+	0xaf, 0xfb, 0xbf, 0xfb, 0xff, 0xf7, 0xdf, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x6e, 0xfe, 0xff, 0xf8, 0xfb, 0xef, 0x7f, 0xbf, 
+	0xfc, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xfd, 0xbf, 
+	0x7b, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 
+	0xff, 0xcf, 0x86, 0xff, 0xeb, 0x2f, 0xbf, 0xfe, 
+	0x67, 0x2e, 0xe5, 0xe6, 0x9a, 0xdf, 0x7c, 0xf3, 
+	0xcd, 0x37, 0xdf, 0x7c, 0x53, 0xfd, 0x8f, 0xd9, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0x3e, 0xdb, 
+	0x6c, 0xff, 0x9b, 0xdf, 0x7f, 0xff, 0xfe, 0xfb, 
+	0xef, 0xd4, 0xff, 0x6d, 0xfe, 0xf7, 0xdf, 0x5f, 
+	0x7f, 0xff, 0xe7, 0xfb, 0xfe, 0xcf, 0xff, 0x7e, 
+	0xfd, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xd5, 0xff, 
+	0x9b, 0xf5, 0xa5, 0x97, 0x5e, 0xfa, 0xff, 0xff, 
+	0xbf, 0xff, 0xfe, 0x7f, 0x5b, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0x7d, 0xfd, 0xd7, 0xe6, 0xfe, 0xeb, 
+	0xa6, 0xbf, 0x6e, 0xff, 0xfb, 0xe6, 0xfd, 0x72, 
+	0xbf, 0xfd, 0xfe, 0xfb, 0xe7, 0xbf, 0xff, 0x5e, 
+	0xfb, 0xbb, 0x99, 0xfe, 0x6f, 0xbd, 0xf7, 0xfe, 
+	0xff, 0x7e, 0xb9, 0xef, 0xce, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x57, 0xff, 0x6c, 0xec, 
+	0xff, 0xff, 0x7f, 0xfc, 0xff, 0xbf, 0xff, 0x3e, 
+	0xef, 0xf9, 0x6f, 0xfd, 0x9f, 0x7f, 0xfb, 0xff, 
+	0xff, 0xb5, 0xbe, 0x99, 0xfb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xff, 0xef, 0xbd, 0xc3, 0xce, 0x7e, 0x42, 
+	0xe9, 0x8f, 0x3f, 0x7c, 0xfe, 0x61, 0x05, 0xef, 
+	0xe6, 0xfd, 0xfb, 0xee, 0xbb, 0xef, 0xbf, 0xff, 
+	0x76, 0xff, 0xf5, 0xae, 0xbf, 0xf6, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xbd, 0x79, 0xff, 0x3e, 
+	0xfb, 0xec, 0xb3, 0xce, 0x6f, 0x9f, 0x7f, 0xfe, 
+	0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 
+	0x7f, 0x6f, 0xec, 0x9f, 0xfe, 0xfa, 0xe9, 0xb7, 
+	0xdf, 0xbe, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xc7, 
+	0x1f, 0x7f, 0xfe, 0xf9, 0xe7, 0xbf, 0x99, 0xf9, 
+	0x6b, 0x9f, 0x3d, 0xb6, 0xfd, 0xf3, 0xff, 0xff, 
+	0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xcf, 0xe6, 0xfe, 0xdb, 0x6b, 0xaf, 
+	0xdd, 0xbf, 0xff, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 
+	0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xbb, 
+	0xa9, 0xdf, 0xfb, 0xed, 0xbf, 0xff, 0xfe, 0xdb, 
+	0x1f, 0x7f, 0xfc, 0xa3, 0x8f, 0x3f, 0xfe, 0xf8, 
+	0xe3, 0x8f, 0x3f, 0xfe, 0x6a, 0xd8, 0xbf, 0xfd, 
+	0xf6, 0xdb, 0x6f, 0xf7, 0xea, 0xef, 0xbf, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 
+	0xdf, 0x9b, 0xff, 0xe7, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0x7f, 0xff, 0xef, 0xf7, 0xff, 0xe6, 0xff, 
+	0xef, 0xb2, 0xc7, 0x1e, 0xfb, 0xec, 0x73, 0xcb, 
+	0x0d, 0x6f, 0xb8, 0xe5, 0x8e, 0x1b, 0x7e, 0xb8, 
+	0xe1, 0x97, 0xbf, 0xf9, 0xff, 0xf6, 0xf9, 0xe7, 
+	0x9f, 0xff, 0xfb, 0x9f, 0x7f, 0xdf, 0xf3, 0x4e, 
+	0x3b, 0xef, 0xbe, 0xfb, 0xce, 0xbb, 0xfd, 0x6f, 
+	0xfe, 0xdf, 0x3e, 0xfb, 0xec, 0xb3, 0xef, 0xfe, 
+	0xbf, 0xfe, 0xf2, 0x8f, 0x7f, 0xfe, 0xf9, 0xe3, 
+	0x97, 0x5f, 0xfe, 0xfd, 0x9b, 0xff, 0x3f, 0xeb, 
+	0x9e, 0x7b, 0xee, 0xfb, 0xfe, 0xbb, 0x67, 0x7e, 
+	0xf5, 0xdd, 0x37, 0x4f, 0x3d, 0xf3, 0xcd, 0x73, 
+	0xff, 0x86, 0xff, 0xdb, 0xec, 0xb3, 0xcf, 0xbe, 
+	0xff, 0xff, 0xfb, 0xef, 0xff, 0xfe, 0xfb, 0xe7, 
+	0xbf, 0x7f, 0xff, 0xfd, 0xff, 0xbf, 0xf9, 0xff, 
+	0xf4, 0xdb, 0x4f, 0xfe, 0xf7, 0xf6, 0xcb, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xfb, 0x6f, 0xfe, 0xbf, 0xab, 0xaf, 0xbb, 
+	0xfe, 0xf2, 0xab, 0xad, 0x3f, 0xfe, 0xf5, 0x57, 
+	0x5f, 0x7f, 0xed, 0xf1, 0xd7, 0x5f, 0xff, 0x9a, 
+	0xfe, 0x3f, 0x3f, 0xdf, 0x7f, 0xcd, 0xcf, 0xf7, 
+	0xef, 0xb3, 0xbe, 0x7d, 0xfe, 0xb9, 0xe7, 0x9f, 
+	0xff, 0xf7, 0xfb, 0xff, 0xc6, 0xef, 0xfb, 0xff, 
+	0xf7, 0xff, 0x7a, 0xff, 0xf7, 0x9f, 0xdf, 0xbd, 
+	0xf3, 0x4e, 0xff, 0xfd, 0xfc, 0xfd, 0xdf, 0xfb, 
+	0x9f, 0xf9, 0xfb, 0xf3, 0xff, 0x7f, 0xfd, 0xfd, 
+	0xff, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xde, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xd7, 
+	0xfe, 0xfa, 0xbf, 0xbf, 0x3f, 0xff, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xff, 0xff, 0x9b, 0xfd, 0xff, 0x7f, 0xed, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xf7, 0xd7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 
+	0xff, 0x7b, 0xff, 0xef, 0xf7, 0xbf, 0xcf, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 
+	0xbf, 0xff, 0xf7, 0xbf, 0xf9, 0xf7, 0xff, 0x7f, 
+	0xff, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xbf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xfe, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 
+	0xf5, 0xff, 0xff, 0xef, 0xdf, 0xdf, 0xbf, 0xfe, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0x9b, 0xff, 0xfe, 
+	0xef, 0xff, 0xcf, 0x23, 0xf7, 0xff, 0xf7, 0x3d, 
+	0xef, 0xbb, 0xef, 0xfe, 0x7b, 0xef, 0xb3, 0xff, 
+	0xff, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xfd, 0xfe, 0xef, 0xef, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xef, 0xff, 0xfb, 0x7e, 0xf7, 0xfd, 
+	0xf3, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 
+	0x7f, 0xdf, 0xff, 0x6f, 0xfc, 0xff, 0xfe, 0xbb, 
+	0xfd, 0x87, 0xfb, 0xfd, 0xfa, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0x99, 0xff, 0xbf, 0xbf, 0x7e, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 
+	0xff, 0xff, 0x7f, 0xfd, 0xff, 0xa6, 0xff, 0xeb, 
+	0xaf, 0xbf, 0xfc, 0x7f, 0xbe, 0xf9, 0xe7, 0xfb, 
+	0xdf, 0x5a, 0xf9, 0xcd, 0x37, 0xdf, 0x7c, 0x5f, 
+	0xff, 0xad, 0xd9, 0xff, 0xdf, 0x7f, 0xff, 0xff, 
+	0xc7, 0x7e, 0xfe, 0x7c, 0xe7, 0x3b, 0xbd, 0xbf, 
+	0xf3, 0xce, 0x3b, 0xef, 0xd7, 0xff, 0x6c, 0xde, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xd7, 0xfb, 0xff, 
+	0xdf, 0xff, 0xfe, 0xf5, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xf5, 0xff, 0x1b, 0xf5, 0xa5, 0x97, 0x5e, 
+	0xfa, 0xff, 0xe9, 0xff, 0xff, 0xff, 0xbf, 0xdf, 
+	0xff, 0xfb, 0xff, 0xbf, 0xff, 0x7f, 0x3d, 0x57, 
+	0xe6, 0xbe, 0xe9, 0xa6, 0x9b, 0x5e, 0xff, 0x7b, 
+	0xff, 0xff, 0xf3, 0xbf, 0xdf, 0xea, 0xfb, 0xe7, 
+	0xbf, 0x7f, 0x5e, 0x7f, 0xbb, 0x91, 0x7f, 0xef, 
+	0xbf, 0xff, 0xd6, 0xfb, 0xda, 0xff, 0xff, 0xff, 
+	0xff, 0x5d, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x57, 
+	0xff, 0x64, 0xec, 0xef, 0xff, 0xff, 0xff, 0xfc, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbd, 0xff, 
+	0x7f, 0xfb, 0xe5, 0xb7, 0xf4, 0xbf, 0x19, 0xfb, 
+	0xaf, 0xbf, 0xfe, 0x3a, 0xff, 0xef, 0xfd, 0xff, 
+	0x0f, 0x7f, 0xc2, 0x89, 0xa7, 0xbe, 0xfc, 0xea, 
+	0x63, 0xfd, 0x6f, 0xc6, 0xfd, 0xfb, 0xee, 0xbb, 
+	0xff, 0xff, 0xff, 0xf6, 0xdb, 0xf5, 0xae, 0xbf, 
+	0xfe, 0xfa, 0x6b, 0xaf, 0xbf, 0xfe, 0xb7, 0x9d, 
+	0x79, 0xff, 0x3f, 0xff, 0xfc, 0xff, 0xff, 0x7f, 
+	0xff, 0x7f, 0xfe, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 
+	0xf3, 0xcf, 0xff, 0x7b, 0x6f, 0xae, 0xbf, 0x7e, 
+	0xfa, 0xeb, 0xa7, 0xdf, 0x1e, 0xfb, 0xcf, 0x7f, 
+	0xfe, 0xf9, 0xe7, 0x1f, 0x7f, 0xfc, 0xf1, 0xf7, 
+	0xa9, 0x9b, 0xf9, 0x67, 0x8f, 0xfd, 0xf6, 0xf8, 
+	0xfb, 0xdf, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0xce, 0x66, 0x7e, 
+	0xdb, 0x6b, 0xbf, 0xed, 0xff, 0xff, 0xfe, 0xff, 
+	0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xb3, 0xb9, 0xf5, 0xfb, 0xef, 0xaf, 
+	0xbf, 0xfe, 0xda, 0xef, 0x7f, 0xfc, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xf8, 0xe3, 0x8f, 0xdb, 0xdf, 0x6e, 
+	0xde, 0xbf, 0xfd, 0xf6, 0xc9, 0x2f, 0xbf, 0x7a, 
+	0xf7, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xee, 0xdf, 0x9b, 0xff, 0xe7, 0xbf, 
+	0x7f, 0xfa, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff, 
+	0xff, 0xe6, 0xff, 0xef, 0xb3, 0x8f, 0x3e, 0xfa, 
+	0xec, 0xf3, 0xcf, 0x0d, 0x7f, 0xf8, 0xe1, 0x87, 
+	0x1b, 0x7e, 0xb8, 0xe1, 0x97, 0xbd, 0xf9, 0xff, 
+	0xfe, 0xfb, 0xaf, 0xbf, 0xfc, 0xff, 0xff, 0x7f, 
+	0xdf, 0xf3, 0xce, 0x3b, 0xef, 0xbe, 0xfb, 0xee, 
+	0xfb, 0xfd, 0x6f, 0xfe, 0xff, 0xfe, 0xfb, 0xeb, 
+	0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0x5f, 
+	0xfe, 0xf8, 0xe3, 0x8f, 0x3f, 0xfe, 0xfd, 0x9b, 
+	0xff, 0xbf, 0xff, 0xfe, 0xfa, 0xeb, 0xff, 0xfe, 
+	0xff, 0x67, 0x7e, 0xf5, 0xcd, 0x57, 0x4f, 0x3d, 
+	0xf5, 0xd4, 0x7f, 0xff, 0xe6, 0xff, 0xfb, 0xef, 
+	0xbf, 0xfe, 0xf2, 0xef, 0x7f, 0xff, 0xef, 0xff, 
+	0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xbf, 0xf9, 0xff, 0xf6, 0xfb, 0xef, 0xff, 0xff, 
+	0xe3, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xfa, 0x5f, 
+	0xeb, 0xae, 0xbf, 0xfe, 0xda, 0xeb, 0xaf, 0x3d, 
+	0xfe, 0xd1, 0xd7, 0x4f, 0x7f, 0xfd, 0xf5, 0xc7, 
+	0x4f, 0x7f, 0x9b, 0xbd, 0xef, 0xff, 0xff, 0xfd, 
+	0xbc, 0xff, 0xff, 0xef, 0xd3, 0x9d, 0x7f, 0xb6, 
+	0xf9, 0xe7, 0xbf, 0x7f, 0xee, 0xff, 0xf9, 0xc6, 
+	0xfe, 0xff, 0xfe, 0xeb, 0xc7, 0xff, 0xfe, 0xff, 
+	0xaf, 0xff, 0xf5, 0xcb, 0x5f, 0xef, 0xfd, 0xfb, 
+	0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xfb, 0xff, 0xbd, 
+	0xff, 0xef, 0x5d, 0xff, 0xbf, 0xdf, 0xfd, 0xff, 
+	0xff, 0xff, 0xd6, 0xff, 0xff, 0xbb, 0xff, 0xff, 
+	0x6f, 0xfe, 0x37, 0xff, 0xfa, 0xef, 0xbf, 0xff, 
+	0x66, 0xfa, 0xfe, 0xfd, 0xf7, 0xff, 0xff, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xe7, 0xdf, 0x99, 0xff, 0xfb, 
+	0xbf, 0xfe, 0x7d, 0xf7, 0xfd, 0xb5, 0xfe, 0xff, 
+	0xfe, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0x5f, 
+	0xff, 0x7f, 0xe6, 0xff, 0xef, 0xff, 0xff, 0xfe, 
+	0xf9, 0xe3, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7b, 
+	0xff, 0xef, 0xff, 0xde, 0x7f, 0xff, 0xbb, 0xf9, 
+	0xf7, 0xf8, 0x5b, 0xff, 0xbf, 0xfd, 0xfe, 0xff, 
+	0x7e, 0xbe, 0xef, 0xed, 0xa7, 0xfd, 0x5d, 0xfb, 
+	0xb5, 0xd7, 0xff, 0x67, 0xfe, 0xf9, 0xdf, 0xfb, 
+	0xdf, 0xb7, 0xde, 0xfe, 0xdf, 0xff, 0xee, 0xff, 
+	0x7d, 0xf7, 0xfe, 0xdf, 0xff, 0xbb, 0xee, 0x7b, 
+	0x99, 0xff, 0xcf, 0x3b, 0xc3, 0xfc, 0x73, 0xff, 
+	0xff, 0xfb, 0xfc, 0xbf, 0xff, 0xe7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xde, 
+	0x77, 0xdf, 0xf5, 0xd7, 0xff, 0xfd, 0xfe, 0xfe, 
+	0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xf9, 0xbf, 0xf9, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 
+	0xef, 0xda, 0xef, 0xd7, 0xfd, 0xff, 0xf7, 0xd7, 
+	0xff, 0xfb, 0xff, 0xf7, 0x9f, 0xf7, 0x6f, 0xfc, 
+	0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0xfc, 0xfb, 
+	0xff, 0xff, 0x6f, 0xfd, 0xf7, 0xdf, 0x5f, 0x3f, 
+	0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xf7, 0xff, 0xdf, 
+	0xff, 0xff, 0xdf, 0xbf, 0xfa, 0xff, 0xff, 0xdf, 
+	0xff, 0xbd, 0xf7, 0xff, 0xdf, 0x7f, 0xff, 0xff, 
+	0x86, 0x3f, 0xbf, 0xec, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xff, 0xe7, 0xcb, 0xdf, 0xdf, 0xfe, 0xe7, 0xfb, 
+	0xf7, 0xf7, 0xdf, 0xff, 0x8f, 0xd9, 0xcf, 0xf7, 
+	0xdb, 0x7f, 0xff, 0xfd, 0xef, 0xff, 0xfc, 0xd6, 
+	0xf7, 0xfd, 0xff, 0xf3, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xff, 0x6d, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xf5, 
+	0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xf5, 
+	0xff, 0x79, 0x67, 0x3f, 0xfd, 0xff, 0x9b, 0xf5, 
+	0xff, 0xbf, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff, 
+	0xff, 0xff, 0xd3, 0x4f, 0xfd, 0xff, 0xf7, 0xdf, 
+	0x6f, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xff, 0xbd, 
+	0xf7, 0xda, 0x7f, 0xf6, 0xff, 0xf7, 0xbf, 0xdf, 
+	0xef, 0xbf, 0xff, 0xb7, 0xf7, 0xd6, 0xab, 0xbb, 
+	0x99, 0xff, 0xeb, 0xbf, 0xbf, 0x9e, 0xfa, 0xdb, 
+	0xff, 0xff, 0xff, 0xff, 0x7d, 0xf9, 0xe3, 0x7f, 
+	0xaf, 0x3c, 0xf3, 0xae, 0x6c, 0xec, 0xff, 0xfa, 
+	0xef, 0x7b, 0xfb, 0xfe, 0xfe, 0x7f, 0xfd, 0xfd, 
+	0xef, 0xfd, 0xf5, 0xff, 0x7f, 0x7f, 0xff, 0xfd, 
+	0xbd, 0x99, 0xfb, 0xbf, 0xfd, 0xf7, 0x4b, 0x7d, 
+	0xa5, 0xfd, 0x5f, 0x4f, 0x7c, 0xe2, 0xff, 0xfd, 
+	0x7f, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfd, 
+	0xdf, 0x7f, 0xff, 0x6d, 0xb7, 0xff, 0xfe, 0xf3, 
+	0xf5, 0xae, 0xff, 0xed, 0xb7, 0xdf, 0x7f, 0xfb, 
+	0xed, 0xff, 0xbd, 0x79, 0xff, 0xe7, 0x9f, 0x7f, 
+	0xe6, 0x19, 0x7f, 0xdd, 0x7f, 0xfe, 0xf3, 0xdf, 
+	0x7e, 0xfb, 0xbf, 0xbf, 0xff, 0xff, 0x73, 0x6f, 
+	0xec, 0xff, 0xf0, 0xe3, 0x4f, 0x3f, 0xfe, 0x6e, 
+	0xf3, 0xcf, 0x7f, 0xae, 0x7d, 0xf6, 0xd8, 0x6f, 
+	0x9f, 0xfd, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xdf, 
+	0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xdf, 0xff, 
+	0xee, 0xdf, 0xff, 0x7e, 0xff, 0xfd, 0xbf, 0xff, 
+	0xcf, 0xe6, 0xbe, 0xff, 0xfe, 0xff, 0xfb, 0xff, 
+	0xfe, 0xfb, 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xa9, 0x7f, 
+	0xc7, 0x5f, 0x7f, 0xdd, 0xf5, 0xdb, 0xfd, 0x2f, 
+	0xfc, 0xe3, 0xfd, 0xf7, 0x6f, 0x7f, 0xbf, 0xfd, 
+	0xf7, 0xff, 0x6a, 0xde, 0xff, 0x79, 0xe7, 0x9d, 
+	0x7f, 0xfe, 0xdb, 0xf7, 0x8b, 0xff, 0x7d, 0xd5, 
+	0x55, 0xbe, 0x5f, 0x7d, 0xb5, 0xd5, 0xdf, 0x9b, 
+	0xff, 0xff, 0xff, 0xff, 0xfa, 0xeb, 0xaf, 0xdb, 
+	0xff, 0xfa, 0xff, 0xff, 0xf7, 0xdf, 0xfe, 0xd6, 
+	0x5d, 0x77, 0xdd, 0xff, 0xe6, 0xff, 0xdf, 0xf0, 
+	0x83, 0x2e, 0xba, 0xf8, 0xf3, 0x8f, 0x0c, 0x6f, 
+	0xf8, 0xe3, 0x9f, 0x1f, 0x74, 0xd0, 0x45, 0x9f, 
+	0xbf, 0xf9, 0xff, 0xf3, 0xed, 0x77, 0xfe, 0xf9, 
+	0xfb, 0x9f, 0x2f, 0xde, 0xf3, 0xf4, 0xd3, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xff, 0x6f, 0xfe, 0xbf, 
+	0x2f, 0xbe, 0xfc, 0xfa, 0xeb, 0xff, 0xff, 0xea, 
+	0xf2, 0x0f, 0x7d, 0xf4, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xfe, 0xfd, 0x9b, 0xff, 0x3f, 0xe6, 0x9a, 0xef, 
+	0xbe, 0xbb, 0xbe, 0xbf, 0x6a, 0x7e, 0xf5, 0xcd, 
+	0x77, 0x7f, 0x7c, 0xf1, 0xd5, 0x77, 0xff, 0xe6, 
+	0xff, 0xfb, 0xee, 0xfb, 0xef, 0xbf, 0xff, 0x7f, 
+	0xbb, 0xee, 0xff, 0xfe, 0xf9, 0xe7, 0xdb, 0x7f, 
+	0xfe, 0xf9, 0xff, 0x8f, 0xf9, 0xdf, 0xf2, 0xfb, 
+	0xff, 0xff, 0xbf, 0xf4, 0xff, 0xfb, 0xff, 0xe7, 
+	0xe5, 0x97, 0xfe, 0x7f, 0xf9, 0xe5, 0x97, 0xff, 
+	0x6f, 0xea, 0xbf, 0xab, 0xae, 0xbf, 0xf6, 0x7a, 
+	0xcb, 0xaf, 0xbf, 0xfa, 0x75, 0x57, 0x5d, 0x7f, 
+	0xad, 0xf5, 0xd6, 0x5a, 0xff, 0x9a, 0xff, 0x77, 
+	0xfb, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfe, 0x33, 
+	0x9f, 0xeb, 0xf5, 0xff, 0xbf, 0x7f, 0xfe, 0xf9, 
+	0xf7, 0xff, 0xc6, 0xff, 0xfb, 0x9f, 0x7f, 0xff, 
+	0xf9, 0xff, 0xf7, 0x9e, 0x6f, 0xf5, 0xff, 0xed, 
+	0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x9e, 0xd9, 
+	0x77, 0xff, 0xff, 0xdb, 0xdd, 0x5f, 0xfa, 0xd5, 
+	0xb4, 0xf8, 0xff, 0xff, 0xff, 0xef, 0xf9, 0xe7, 
+	0xff, 0xff, 0xe6, 0x6f, 0xfe, 0xbf, 0xfe, 0xda, 
+	0xef, 0xaf, 0xbf, 0xec, 0xfa, 0xff, 0xff, 0x5f, 
+	0xfd, 0xf5, 0xc7, 0x5f, 0x4f, 0xf5, 0xd5, 0xff, 
+	0x9b, 0xfd, 0x9e, 0x7d, 0xee, 0xfd, 0xef, 0xbf, 
+	0xbf, 0xf9, 0xff, 0x7f, 0x3f, 0xff, 0xfc, 0xbb, 
+	0xdf, 0x7e, 0xbf, 0x6d, 0xff, 0xe6, 0xff, 0x7f, 
+	0x9f, 0xff, 0xfe, 0xbe, 0xfb, 0xfe, 0xff, 0xef, 
+	0xff, 0xff, 0xf5, 0xff, 0xef, 0x7d, 0xf7, 0xdf, 
+	0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0x8f, 0xfb, 
+	0xff, 0xf7, 0x7f, 0xfd, 0xef, 0xdb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfe, 
+	0xbf, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xdf, 
+	0x3f, 0xef, 0xdf, 0xe7, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0x7d, 0xcf, 0x17, 0xef, 
+	0xff, 0xfd, 0xf7, 0x3f, 0xff, 0xfc, 0xff, 0x17, 
+	0xef, 0xbf, 0xcf, 0xe7, 0xff, 0xdf, 0xff, 0xff, 
+	0x66, 0xdf, 0xdf, 0x7f, 0xfd, 0xff, 0x7f, 0xff, 
+	0x7f, 0xbf, 0xd9, 0xff, 0xbb, 0xff, 0xff, 0xdf, 
+	0xef, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf1, 
+	0xe7, 0x7d, 0xd7, 0xfe, 0xda, 0xe3, 0x7b, 0xff, 
+	0x7d, 0xf7, 0xdb, 0x6f, 0xff, 0xec, 0xd7, 0xdf, 
+	0xff, 0x6f, 0xdc, 0x6f, 0xff, 0xfb, 0xeb, 0x9f, 
+	0xfe, 0xfe, 0xfb, 0xef, 0xf7, 0x7f, 0xdc, 0xd1, 
+	0xc7, 0x0f, 0x3f, 0xfc, 0xf0, 0xff, 0x99, 0xff, 
+	0xff, 0xbf, 0xfe, 0xff, 0xf7, 0xbf, 0x7a, 0xdf, 
+	0xfb, 0xf7, 0xfb, 0xfd, 0xf7, 0xff, 0xff, 0xfb, 
+	0xbf, 0xff, 0xff, 0xa6, 0xff, 0x3f, 0xff, 0xfe, 
+	0xff, 0xc7, 0x3b, 0xbf, 0xa4, 0xf7, 0xbf, 0x37, 
+	0x7f, 0xfc, 0xfd, 0x87, 0xda, 0x7f, 0xff, 0x8f, 
+	0xf9, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xfb, 0xfe, 
+	0xdb, 0xf9, 0xff, 0xff, 0xad, 0xf2, 0xdf, 0x7f, 
+	0x9b, 0xfd, 0xf7, 0xff, 0x6d, 0xda, 0xff, 0xfe, 
+	0x3f, 0xfb, 0xbf, 0xf7, 0xda, 0xfe, 0xdb, 0x5c, 
+	0xef, 0xbd, 0xdd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 
+	0xff, 0x1b, 0xf7, 0xed, 0xf3, 0xfe, 0xfb, 0xef, 
+	0xb5, 0xd7, 0xfe, 0x35, 0xd7, 0x6b, 0xaf, 0xbd, 
+	0xf6, 0xda, 0x6b, 0xaf, 0xfd, 0xd7, 0xe6, 0xfe, 
+	0xee, 0xb5, 0x97, 0xff, 0xff, 0xfb, 0xbf, 0x99, 
+	0x67, 0xff, 0xf2, 0x7f, 0xb7, 0xdd, 0xf6, 0xda, 
+	0x6b, 0xaf, 0xbb, 0x99, 0xff, 0x7b, 0xf9, 0xe6, 
+	0xdb, 0xfb, 0xfe, 0x7b, 0xff, 0xfe, 0xdf, 0xdc, 
+	0x77, 0xcf, 0x2d, 0xd7, 0x5c, 0x73, 0xed, 0x6c, 
+	0xe6, 0xff, 0xfe, 0xdb, 0xfb, 0xb5, 0xff, 0xfe, 
+	0xfe, 0x7b, 0x5f, 0xff, 0xfd, 0xfd, 0xf5, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xbf, 0x19, 0xfb, 0xef, 0xbd, 
+	0xf6, 0x5e, 0xed, 0xbf, 0xfd, 0xf6, 0xef, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 
+	0xef, 0xe6, 0xbd, 0xff, 0xff, 0xff, 0x6f, 0xff, 
+	0xff, 0xee, 0xff, 0x6f, 0xfe, 0xff, 0xdd, 0x77, 
+	0xdf, 0x7d, 0xf7, 0xdd, 0xff, 0xbd, 0x79, 0x17, 
+	0x6f, 0xbe, 0xfd, 0xfe, 0xff, 0x2f, 0xff, 0xff, 
+	0xf6, 0xb7, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 
+	0xfe, 0x7f, 0x6f, 0xec, 0xdf, 0x7e, 0xfb, 0xec, 
+	0xbf, 0xbf, 0xfe, 0x7a, 0xed, 0x7e, 0x5f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xbf, 0x99, 
+	0xfb, 0xf6, 0xfb, 0x6f, 0xff, 0xff, 0xef, 0xbf, 
+	0x7f, 0xff, 0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0x4f, 0xe6, 0x7e, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xdb, 0xef, 0xfb, 0xdb, 0xff, 
+	0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xff, 
+	0xbb, 0xb9, 0xdf, 0x5b, 0x6f, 0xbf, 0xdd, 0xde, 
+	0xdf, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xd8, 0xfd, 
+	0xeb, 0xab, 0xbf, 0x36, 0xff, 0xeb, 0x6f, 0x9f, 
+	0xdd, 0xb5, 0xfb, 0xee, 0xbb, 0xef, 0xbe, 0xfb, 
+	0xee, 0xce, 0x9b, 0xff, 0xaf, 0xbf, 0xff, 0xfa, 
+	0xef, 0xaf, 0xf3, 0xff, 0xbb, 0xdf, 0x5f, 0x7f, 
+	0xfd, 0xf5, 0xd7, 0x5b, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xe8, 0xf3, 
+	0xcf, 0x3f, 0xfd, 0xd1, 0x47, 0x1f, 0x7d, 0xf4, 
+	0xd1, 0xe7, 0x9f, 0xbf, 0xf9, 0xef, 0xfb, 0xef, 
+	0xbf, 0x9f, 0xfe, 0xfa, 0xeb, 0x7f, 0xff, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdf, 
+	0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xa7, 0xbf, 
+	0xfe, 0xfa, 0xdf, 0xdf, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xbf, 
+	0xfe, 0xfb, 0xeb, 0xeb, 0xff, 0xbe, 0xfa, 0xef, 
+	0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 
+	0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xfa, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0x5f, 0xff, 0xbf, 0xf9, 
+	0xff, 0xfe, 0xca, 0x6f, 0xbf, 0xfc, 0xf7, 0xff, 
+	0x2f, 0x3f, 0xf2, 0xe9, 0x7f, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xf7, 0x6f, 0xfe, 0x7f, 0xa3, 0xad, 
+	0x39, 0xda, 0xea, 0x6b, 0xaf, 0x3e, 0xbe, 0x75, 
+	0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0xff, 
+	0x9a, 0xff, 0xff, 0xfe, 0xff, 0xee, 0xcd, 0xef, 
+	0xff, 0xff, 0xf1, 0xff, 0xeb, 0xf7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xef, 0xdf, 
+	0xff, 0xff, 0xf7, 0xce, 0xff, 0xff, 0xff, 0xfb, 
+	0xbf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9f, 0xf9, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0xfe, 0xab, 0xfd, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xdb, 0xef, 0xff, 0xff, 0x6f, 0xfc, 
+	0xff, 0xfe, 0xfb, 0xef, 0xef, 0xbf, 0xfe, 0xfb, 
+	0xc1, 0x77, 0x5f, 0xdd, 0xf7, 0xdf, 0x7f, 0xef, 
+	0xfd, 0xb7, 0xff, 0x9b, 0xff, 0xff, 0xbf, 0xff, 
+	0xbe, 0xdf, 0x6e, 0xbf, 0xff, 0xef, 0xed, 0xdf, 
+	0x7e, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0xe6, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xbf, 0xff, 0xf6, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xf1, 0xf7, 0xdf, 0xff, 0xbf, 0xe9, 0xbf, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x3f, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xfb, 0x7a, 0xfd, 0xff, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0x7b, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xfb, 0x7f, 
+	0xff, 0xbd, 0x7f, 0xdd, 0xff, 0xdf, 0xff, 0xff, 
+	0x3f, 0xff, 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xfa, 
+	0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xef, 0x5f, 
+	0xff, 0xdf, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xfe, 
+	0xff, 0x99, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0xff, 
+	0xff, 0xfe, 0x73, 0xbc, 0x7f, 0xff, 0x7f, 0xfe, 
+	0xff, 0xef, 0xff, 0xef, 0xff, 0xff, 0x66, 0xff, 
+	0xcf, 0x3e, 0xff, 0xfc, 0xf3, 0xdf, 0x3f, 0xdf, 
+	0xfc, 0xef, 0x9f, 0xfd, 0xfe, 0x79, 0xef, 0x9f, 
+	0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xbf, 0xdd, 0xff, 
+	0x5f, 0x7d, 0xb3, 0xcf, 0x7f, 0xff, 0xdf, 0x6f, 
+	0xff, 0x7f, 0xfe, 0xff, 0xee, 0xbf, 0xff, 0x6f, 
+	0xfe, 0xff, 0xff, 0xfb, 0xef, 0xbe, 0x3f, 0xfe, 
+	0x7b, 0xce, 0x75, 0xff, 0xbd, 0xf6, 0xdd, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xf7, 
+	0xff, 0xbf, 0x7f, 0xbf, 0xfd, 0xfd, 0xdf, 0xff, 
+	0xfe, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xa6, 0xff, 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xe7, 0xbf, 0xef, 0xdf, 0xf7, 0xdf, 0x7f, 0xdf, 
+	0xf9, 0xf7, 0xde, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x37, 0xff, 0xdd, 0xf3, 0xcb, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0x97, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0xff, 0x6f, 0xfe, 0xbb, 0xfe, 0xfe, 0xeb, 
+	0xef, 0xaf, 0xff, 0xbe, 0xfb, 0xdf, 0x7e, 0xef, 
+	0xed, 0xf7, 0xcd, 0x7a, 0xff, 0xfc, 0xff, 0x9b, 
+	0xff, 0xdf, 0x7f, 0xfa, 0xf9, 0xa7, 0xdf, 0x7e, 
+	0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xde, 0x7f, 0xff, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 
+	0xbf, 0xf9, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xbf, 
+	0xf7, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xbf, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 
+	0xfb, 0xfd, 0xf7, 0xf7, 0xff, 0xff, 0xbf, 0xb7, 
+	0xbf, 0xff, 0xf6, 0xfb, 0xef, 0xbe, 0xff, 0x7e, 
+	0xfb, 0xfe, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xcf, 0x7f, 0xff, 0xf7, 0xfd, 0xff, 0xbf, 
+	0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xf9, 0xf7, 0x9f, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xcf, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0xb7, 0xdf, 
+	0x7e, 0xbb, 0xed, 0xb7, 0xd7, 0x7e, 0xfb, 0xdb, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xf9, 
+	0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xfb, 0xfd, 
+	0xb7, 0xdf, 0x7e, 0xff, 0xfb, 0xef, 0xbf, 0xff, 
+	0xf6, 0xdb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xf7, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbd, 0xf7, 0xbe, 
+	0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xb7, 0xfb, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 
+	0xff, 0xaf, 0xbf, 0xfe, 0xea, 0xeb, 0xaf, 0xbf, 
+	0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7, 
+	0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 
+	0xbf, 0xfb, 0xbe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3d, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9e, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x5f, 0x7f, 0xfd, 0xe5, 
+	0xd7, 0x5d, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 
+	0xf2, 0xeb, 0xaf, 0xbf, 0xfe, 0xf8, 0x6f, 0xee, 
+	0xff, 0xfe, 0xfb, 0x6f, 0xb7, 0xbf, 0xfe, 0xfb, 
+	0x2f, 0x7f, 0xfd, 0xfd, 0xd7, 0xdb, 0x7f, 0xf9, 
+	0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 
+	0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 
+	0xe6, 0xfe, 0xdf, 0xee, 0xbf, 0xe7, 0xf6, 0xdf, 
+	0xee, 0xbf, 0xf7, 0x7d, 0xf7, 0xdf, 0x77, 0xff, 
+	0xbd, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0x31, 
+	0xf7, 0xd7, 0xfb, 0x7d, 0xb5, 0xf5, 0xb7, 0xd7, 
+	0x9d, 0xfa, 0xdb, 0xad, 0xbf, 0xbd, 0xfa, 0xeb, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPPSAMP_ROM_DIVROM0              0
+#define EPPSAMP_ROM_DIVROM1              16
+#define EPPSAMP_ROM_DIVROM2              32
+#define EPPSAMP_ROM_MULROM               48
+#define EPPSAMP_ROM_CLKSELROM            64
+
+
+/* rom locations */
+static const unsigned long eppsamp_roms[80] = {
+	 76047,  76213,  75715,  75881,  76215,  76049,  75883,  75717,
+	 75383,  75549,  75051,  75217,  75551,  75385,  75219,  75053,
+	 81993,  81661,  82161,  81829,  82159,  81827,  81995,  81663,
+	 81329,  80997,  81497,  81165,  81495,  81163,  81331,  80999,
+	 87928,  87264,  88094,  87430,  88096,  87432,  87930,  87266,
+	 87596,  86932,  87762,  87098,  87764,  87100,  87598,  86934,
+	 75966,  75302,  76134,  75470,  76132,  75468,  75968,  75304,
+	 75634,  74970,  75802,  75138,  75800,  75136,  75636,  74972,
+	 75946,  75282,  76112,  75448,  76114,  75450,  75948,  75284,
+	 75614,  74950,  75780,  75116,  75782,  75118,  75616,  74952
+};
+
diff --git a/main/fpga.h b/main/fpga.h
new file mode 100644
index 0000000..aa327d9
--- /dev/null
+++ b/main/fpga.h
@@ -0,0 +1,169 @@
+/*****************************************************************************/
+
+/*
+ *      fpga.h  --  FPGA test library exports (and imports).
+ *
+ *      Copyright (C) 1998, 1999, 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _FPGA_H
+#define _FPGA_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "sysdeps.h"
+#include "parport.h"
+
+/* ---------------------------------------------------------------------- */
+
+struct adapter_config {
+	unsigned int fclk;
+	unsigned int bitrate;
+	unsigned int intclk;
+	unsigned int extmodem;
+	unsigned int loopback;
+	unsigned int extstat;
+        unsigned int pttmute;
+	unsigned int filtmode;
+	unsigned int gain;
+};
+
+/* ---------------------------------------------------------------------- */
+
+extern void printconfig(const struct adapter_config *cfg);
+extern void parseconfig(struct adapter_config *cfg, const char *modestr);
+
+extern int adapter_start_no_firmware(void);
+extern int adapter_start_eppchk(void);
+extern int adapter_start_epp(struct adapter_config *cfg);
+extern int adapter_start_ecp(struct adapter_config *cfg);
+extern int adapter_start_eppafsk(struct adapter_config *cfg);
+extern int adapter_start_sppafsk(struct adapter_config *cfg);
+extern int adapter_start_eppsamp(struct adapter_config *cfg);
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void sppafsk_wrcmd(unsigned char d)
+{
+	parport_write_data(d);
+	parport_write_control(LPTCTRL_PROGRAM | 0x09);
+	parport_write_control(LPTCTRL_PROGRAM | 0x08);
+}
+
+extern inline void sppafsk_wrdata(unsigned char d)
+{
+	parport_write_data(d);
+	parport_write_control(LPTCTRL_PROGRAM | 0x01);
+	parport_write_control(LPTCTRL_PROGRAM | 0x00);
+}
+
+extern inline unsigned char sppafsk_rdcmd(void)
+{
+	unsigned char d1, d2;
+
+	parport_write_control(LPTCTRL_PROGRAM | 0x0b);
+	parport_read_status();
+	d2 = parport_read_status();
+	d1 = ((d2 & 0xe0) | ((d2 << 1) & 0x10)) >> 4;
+	parport_write_control(LPTCTRL_PROGRAM | 0x0a);
+	parport_read_status();
+	d2 = parport_read_status();
+	d1 |= (d2 & 0xe0) | ((d2 << 1) & 0x10);
+	return d1;
+}
+
+extern inline unsigned char sppafsk_rddata(void)
+{
+	unsigned char d1, d2;
+
+	parport_write_control(LPTCTRL_PROGRAM | 0x03);
+	parport_read_status();
+	d2 = parport_read_status();
+	d1 = ((d2 & 0xe0) | ((d2 << 1) & 0x10)) >> 4;
+	parport_write_control(LPTCTRL_PROGRAM | 0x02);
+	parport_read_status();
+	d2 = parport_read_status();
+	d1 |= (d2 & 0xe0) | ((d2 << 1) & 0x10);
+	return d1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * description of the test procedures defined
+ */
+
+extern const struct eppfpgatests {
+	const char *name;
+	const char *desc;
+	int (*func)(struct adapter_config *);
+} eppfpgatests[];
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * provided externally!
+ */
+
+extern int lprintf(unsigned vl, const char *format, ...)
+__attribute__ ((format (printf, 2, 3)));
+
+extern int tprintf(const char *format, ...)
+__attribute__ ((format (printf, 1, 2)));
+
+extern int idle_callback(unsigned us_delay);
+
+/* ---------------------------------------------------------------------- */
+
+extern int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len);
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void reset_modem(void)
+{
+	unsigned char null = 0;
+
+	parport_epp_write_addr(&null, 1);
+	parport_write_control(LPTCTRL_ADDRSTB);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned readboundary(const unsigned char *b, unsigned x)
+{
+	return (b[x >> 3] >> (x & 7)) & 1;
+}
+
+extern inline void writeboundary(unsigned char *b, unsigned x, int v)
+{
+	b[x >> 3] &= ~(1 << (x & 7));
+	b[x >> 3] |= (v & 1) << (x & 7);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern void boundary(unsigned int blen, const unsigned char *in, unsigned char *out, unsigned char eppdata);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _FPGA_H */
diff --git a/main/fpgatests.c b/main/fpgatests.c
new file mode 100644
index 0000000..a32ca0f
--- /dev/null
+++ b/main/fpgatests.c
@@ -0,0 +1,3151 @@
+/*****************************************************************************/
+
+/*
+ *      fpgatests.c  -- HDLC packet radio modem for EPP using FPGA utility library.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include "parport.h"
+#include "fpga.h"
+#include "util.h"
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ *The doubly scrambled BERR tests 
+ * (once in software, once in the modem)
+ * exercise the data exchange between modem and PC
+ */
+
+/* note: this is the reverse direction */
+
+#if 0
+#define SCRAM_TAP1  0x00001  /* X^17 */
+#define SCRAM_TAPN  0x21000  /* X^0+X^5 */
+
+#define DESCRAM_TAPSH1  0
+#define DESCRAM_TAPSH2  5
+#define DESCRAM_TAPSH3  17
+#endif
+
+#define DESCRAM_TAPSH1  0
+#define DESCRAM_TAPSH2  7
+#define DESCRAM_TAPSH3  10
+
+#define SCRAM_TAP1  1
+#define SCRAM_TAPN  ((1<<DESCRAM_TAPSH3)|(1<<(DESCRAM_TAPSH3-DESCRAM_TAPSH2)))
+
+/* ---------------------------------------------------------------------- */
+
+#include "epp_fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned readboundaryword(const unsigned char *b, const unsigned *x, unsigned num)
+{
+	unsigned mask = 1, ret = 0;
+
+        for (; num > 0; num--, x++, mask <<= 1)
+		if (readboundary(b, *x))
+			ret |= mask;
+	return ret;
+}
+
+static void writeboundaryword(unsigned char *b, const unsigned *x, unsigned num, unsigned v)
+{
+	unsigned sh = 0;
+
+        for (; num > 0; num--, x++, sh++)
+		writeboundary(b, *x, (v >> sh) & 1);
+}
+
+/* ========= BOUNDARY SCAN ONLY TESTS =================================== */
+
+/*
+ * RAM-Test
+ */
+
+static const unsigned int ram_addr_o[15] = 
+{
+	FPGA_PIN_RAMA0_O,
+	FPGA_PIN_RAMA1_O,
+	FPGA_PIN_RAMA2_O,
+	FPGA_PIN_RAMA3_O,
+	FPGA_PIN_RAMA4_O,
+	FPGA_PIN_RAMA5_O,
+	FPGA_PIN_RAMA6_O,
+	FPGA_PIN_RAMA7_O,
+	FPGA_PIN_RAMA8_O,
+	FPGA_PIN_RAMA9_O,
+	FPGA_PIN_RAMA10_O,
+	FPGA_PIN_RAMA11_O,
+	FPGA_PIN_RAMA12_O,
+	FPGA_PIN_RAMA13_O,
+	FPGA_PIN_RAMA14_O
+};
+
+static const unsigned int ram_addr_t[15] = 
+{
+	FPGA_PIN_RAMA0_T,
+	FPGA_PIN_RAMA1_T,
+	FPGA_PIN_RAMA2_T,
+	FPGA_PIN_RAMA3_T,
+	FPGA_PIN_RAMA4_T,
+	FPGA_PIN_RAMA5_T,
+	FPGA_PIN_RAMA6_T,
+	FPGA_PIN_RAMA7_T,
+	FPGA_PIN_RAMA8_T,
+	FPGA_PIN_RAMA9_T,
+	FPGA_PIN_RAMA10_T,
+	FPGA_PIN_RAMA11_T,
+	FPGA_PIN_RAMA12_T,
+	FPGA_PIN_RAMA13_T,
+	FPGA_PIN_RAMA14_T
+};
+
+static const unsigned int ram_data_t[8] = 
+{
+	FPGA_PIN_RAMD0_T,
+	FPGA_PIN_RAMD1_T,
+	FPGA_PIN_RAMD2_T,
+	FPGA_PIN_RAMD3_T,
+	FPGA_PIN_RAMD4_T,
+	FPGA_PIN_RAMD5_T,
+	FPGA_PIN_RAMD6_T,
+	FPGA_PIN_RAMD7_T
+};
+
+static const unsigned int ram_data_o[8] = 
+{
+	FPGA_PIN_RAMD0_O,
+	FPGA_PIN_RAMD1_O,
+	FPGA_PIN_RAMD2_O,
+	FPGA_PIN_RAMD3_O,
+	FPGA_PIN_RAMD4_O,
+	FPGA_PIN_RAMD5_O,
+	FPGA_PIN_RAMD6_O,
+	FPGA_PIN_RAMD7_O
+};
+
+static const unsigned int ram_data_i[8] = 
+{
+	FPGA_PIN_RAMD0_I,
+	FPGA_PIN_RAMD1_I,
+	FPGA_PIN_RAMD2_I,
+	FPGA_PIN_RAMD3_I,
+	FPGA_PIN_RAMD4_I,
+	FPGA_PIN_RAMD5_I,
+	FPGA_PIN_RAMD6_I,
+	FPGA_PIN_RAMD7_I
+};
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned int ramaccess(unsigned addr, unsigned data, unsigned write)
+{
+	unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+
+	memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+	writeboundaryword(bd1, ram_addr_t, 15, 0);
+	writeboundaryword(bd1, ram_addr_o, 15, addr);
+	writeboundary(bd1, FPGA_PIN_RAMCE_T, 0);
+	writeboundary(bd1, FPGA_PIN_RAMOE_T, 0);
+	writeboundary(bd1, FPGA_PIN_RAMWR_T, 0);
+	writeboundary(bd1, FPGA_PIN_RAMCE_O, 0);
+	writeboundary(bd1, FPGA_PIN_RAMOE_O, (write) & 1);
+	writeboundary(bd1, FPGA_PIN_RAMWR_O, (!write) & 1);
+	if (write) {
+		writeboundaryword(bd1, ram_data_t, 8, 0);
+		writeboundaryword(bd1, ram_data_o, 8, data);
+	}
+	boundary(FPGA_BOUND, bd1, bd2, 0);
+	writeboundary(bd1, FPGA_PIN_RAMCE_O, 1);
+	writeboundary(bd1, FPGA_PIN_RAMOE_O, 1);
+	writeboundary(bd1, FPGA_PIN_RAMWR_O, 1);	
+	boundary(FPGA_BOUND, bd1, bd2, 0);
+	if (write)
+		return 0;
+	return readboundaryword(bd2, ram_data_i, 8);
+}
+
+static unsigned char *to_bin(unsigned char *buf, unsigned val, unsigned num)
+{
+	unsigned int i;
+
+	for (i = 0; i < num; i++, val <<= 1)
+		buf[i] = ((val >> (num-1)) & 1) + '0';
+	buf[num] = 0;
+	return buf;
+}
+
+static unsigned ramtestdata(unsigned data)
+{
+	unsigned val;
+	unsigned char s[10];
+
+	ramaccess(0, data, 1);
+	val = ramaccess(0, 0, 0);
+	tprintf("Testing data pattern 0x%02x read 0x%02x  failure mask %8s\n",
+	       data, val, to_bin(s, val ^ data, 8));
+	idle_callback(0);
+	return val ^ data;
+}
+
+static unsigned ramtestaddr(void)
+{
+	unsigned char ramd[32768];
+	unsigned int i, j, k, l, mask = 0;
+	unsigned char s[16];
+
+	for (i = 0; i < 32768; i++) {
+		if (!(i & 0xff)) {
+			tprintf("Writing RAM address 0x%04x...\r", i);
+			if (idle_callback(0))
+				return mask;
+		}
+		ramd[i] = random();
+		ramaccess(i, ramd[i], 1);
+	}
+	for (i = 0; i < 32768; i++) {
+		if (!(i & 0xff)) {
+			tprintf("Reading RAM address 0x%04x...\r", i);
+			if (idle_callback(0))
+				return mask;
+		}
+		j = ramaccess(i, 0, 0);
+		if (j == ramd[i])
+			continue;
+		l = 0xffff;
+		for (k = 0; k < 32768; k++) {
+			if (ramd[k] != j)
+				continue;
+			if (hweight32(l) > hweight32(k ^ i))
+				l = k ^ i;
+		}
+		mask |= k;
+		tprintf("RAM address error at 0x%04x minimum error mask %15s\n", 
+		       i, to_bin(s, k, 15));
+		if (idle_callback(0))
+			return mask;
+	}
+	return mask;
+}
+
+static int ramtest(struct adapter_config *cfg)
+{
+	unsigned mask;
+	unsigned char s[16];
+	int i;
+
+	if ((i = adapter_start_no_firmware()))
+		return i;
+	tprintf("Performing RAM test...\n");
+	mask = ramtestdata(0xff);
+	mask |= ramtestdata(0x00);
+	mask |= ramtestdata(0x55);
+	mask |= ramtestdata(0xaa);
+	mask |= ramtestdata(0xcc);
+	mask |= ramtestdata(0x33);
+	if (mask) {
+		tprintf("RAM data error mask %s\nRAM data test failed, exiting\n", 
+		       to_bin(s, mask, 8));
+		reset_modem();
+		return -4;
+	}
+	if ((mask = ramtestaddr())) {
+		tprintf("RAM address error mask %s\nRAM address test failed, exiting\n", 
+			to_bin(s, mask, 15));
+		reset_modem();
+		return -5;
+	}
+	if (!idle_callback(0))
+		tprintf("\nRAM test passed\n");
+	reset_modem();
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * LED test
+ */
+
+static int ledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+	int i;
+
+	if ((i = adapter_start_no_firmware()))
+		return i;
+	memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+	tprintf("LED test, DISCONNECT PTT!!\n");
+	for (;;) {
+		led = (++led) & 3;
+		writeboundary(bd1, FPGA_PIN_LEDSTA_O, led != 0);
+		writeboundary(bd1, FPGA_PIN_LEDCON_O, led != 1);
+		writeboundary(bd1, FPGA_PIN_LEDDCD_O, led != 2);
+		writeboundary(bd1, FPGA_PIN_LEDPTT_O, led == 3);
+		writeboundary(bd1, FPGA_PIN_LEDCON_T, 0);
+		writeboundary(bd1, FPGA_PIN_LEDSTA_T, 0);
+		writeboundary(bd1, FPGA_PIN_LEDDCD_T, 0);
+		writeboundary(bd1, FPGA_PIN_LEDPTT_T, 0);
+		boundary(FPGA_BOUND, bd1, bd2, 0);
+		tprintf("Lighting LED %s\r", ((const char *[4]){ "STA", "CON", "DCD", "PTT"})[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * DAC test
+ */
+
+static const unsigned int dac_t[7] = 
+{
+	FPGA_PIN_DAC0_T,
+	FPGA_PIN_DAC1_T,
+	FPGA_PIN_DAC2_T,
+	FPGA_PIN_DAC3_T,
+	FPGA_PIN_DAC4_T,
+	FPGA_PIN_DAC5_T,
+	FPGA_PIN_DAC6_T
+};
+
+static const unsigned int dac_o[7] = 
+{
+	FPGA_PIN_DAC0_O,
+	FPGA_PIN_DAC1_O,
+	FPGA_PIN_DAC2_O,
+	FPGA_PIN_DAC3_O,
+	FPGA_PIN_DAC4_O,
+	FPGA_PIN_DAC5_O,
+	FPGA_PIN_DAC6_O
+};
+
+
+static int dactest(struct adapter_config *cfg)
+{
+	unsigned phase = 0, data, rot = 0;
+	unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+	int i;
+
+	if ((i = adapter_start_no_firmware()))
+		return i;
+	memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+	tprintf("DAC test\n");
+	for (;;) {
+		data = 64 + 63 * sin(M_PI / 128 * phase);
+		writeboundaryword(bd1, dac_t, 7, 0);
+		writeboundaryword(bd1, dac_o, 7, data);
+		boundary(FPGA_BOUND, bd1, bd2, 0);
+		phase = (phase + 1) & 0xff;
+		if (phase)
+			continue;
+		rot = (rot + 1) & 3;
+		tprintf("%c\r", "|\\-/"[rot]);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Parport Signal Tests
+ */
+
+static const unsigned int ppinsig[] = {
+	FPGA_PIN_EPPNWRITE_I,    /* strobe */
+	FPGA_PIN_EPPNDATASTB_I,  /* nAutoFD */
+	FPGA_PIN_EPPNRESET_I,    /* nInit */
+	FPGA_PIN_EPPNADDRSTB_I,  /* SlctIn */
+	FPGA_PIN_EPPDATA3_I,
+	FPGA_PIN_EPPDATA4_I,
+	FPGA_PIN_EPPDATA5_I,
+	FPGA_PIN_EPPDATA6_I,
+	FPGA_PIN_EPPDATA7_I
+};
+
+static const unsigned int ppoutsig[] = {
+	FPGA_PIN_EPPNERR_O,
+	FPGA_PIN_SPPPE_O
+};
+
+static const unsigned int ppoutsigt[] = {
+	FPGA_PIN_EPPNERR_T,
+	FPGA_PIN_SPPPE_T
+};
+
+static const char *ppsigstr[] = {
+	"nError (15)", "PE (12)", 
+	"nWrite/Strobe (1)", "nDataStb/nAutoFD (14)", "nReset/nInit (16)", "nAddrStb/nSlctIn (17)", 
+	"D3 (5)", "D4 (6)", "D5 (7)", "D6 (8)", "D7 (9)"
+};
+
+static unsigned ppsigcheckone(unsigned val)
+{
+	unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+	unsigned v;
+
+	memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+	writeboundaryword(bd1, ppoutsigt, 2, 0);
+	writeboundaryword(bd1, ppoutsig, 2, val);
+	parport_write_control(((val >> 2) & 0xf) ^ (LPTCTRL_WRITE|LPTCTRL_ADDRSTB|LPTCTRL_DATASTB));
+	boundary(FPGA_BOUND, bd1, bd2, val >> 3);
+	v = parport_read_status();
+	v = ((v >> 3) & 1) | ((v >> 4) & 2);
+	boundary(FPGA_BOUND, bd1, bd2, val >> 3);
+        parport_write_control(LPTCTRL_PROGRAM);
+	return v | ((readboundaryword(bd2, ppinsig, 9) << 2) & 0x7fc);
+}
+
+static int ppsigtest(struct adapter_config *cfg)
+{
+	unsigned val, v2, err[11];
+	int i, ret = 0;
+
+	if ((i = adapter_start_no_firmware()))
+		return i;
+	for (i = 0; i < 11; i++)
+		err[i] = 0;
+	tprintf("Checking parallel port signals...\n");
+	for (val = 0; val < 0x800; val++) {
+		/* make sure the FPGA is not reset */
+		if (!(val & ((LPTCTRL_ADDRSTB|LPTCTRL_PROGRAM)<<2)))
+			continue;
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+		v2 = ppsigcheckone(val);
+#if 0
+		tprintf("check: 0x%03x  ret: 0x%03x  diff: 0x%03x\n", val, v2, v2 ^ val);
+#endif
+		v2 ^= val;
+		if (val & 0x400)
+			v2 &= 0x7fc;
+		if (!v2)
+			continue;
+		ret = -1;
+		for (i = 0; i < 11; i++)
+			err[i] += ((v2 >> i) & 1);
+	}
+	tprintf("Parport Signal Errors:\n");
+	for (i = 0; i < 11; i++)
+		tprintf("%-22s  %5d\n", ppsigstr[i], err[i]);
+	reset_modem();
+	return ret;
+}
+
+/* ========= EPP CHECK FIRMWARE TESTS =================================== */
+
+static int chkcountertest(struct adapter_config *cfg)
+{
+	struct timeval time1, time2;
+	unsigned int cnt0 = 0, cnt1 = 0, cnt2 = 0, cnt3 = 0, 
+		prevcnt0 = 0, prevcnt1 = 0, prevcnt2 = 0, prevcnt3 = 0,
+		freq0 = 0, freq1 = 0, freq2 = 0, freq3 = 0, usec;
+	int i;
+	unsigned char eio[3];
+	
+	if ((i = adapter_start_eppchk()))
+		return i;
+	/* reset counters */
+	eio[0] = 0;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		goto errret;
+	tprintf("Frequency counter\n"
+	       "Counter value                Frequency (Hz)\n"
+	       "fclk__ clk___ RxC___ TxC___  fclk____ clk_____ RxC_____ TxC_____\n");
+	if (gettime(&time1)) {
+		reset_modem();
+		return -6;
+	}
+	for (;;) {
+		/* read counters */
+		eio[0] = 4;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_data(eio, 3) != 3)
+			goto errret;
+		cnt0 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+		eio[0] = 5;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_data(eio, 3) != 3)
+			goto errret;
+		cnt1 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+		eio[0] = 6;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_data(eio, 3) != 3)
+			goto errret;
+		cnt2 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+		eio[0] = 7;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_data(eio, 3) != 3)
+			goto errret;
+		cnt3 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+		if (gettime(&time2)) {
+			reset_modem();
+			return -6;
+		}
+		usec = ((time2.tv_sec - time1.tv_sec) % 60 * 1000000)
+			+ time2.tv_usec - time1.tv_usec;
+		if (usec >= 1000000) {
+			time1 = time2;
+			freq0 = ((cnt0 - prevcnt0) & 0xffffff) * 1000000.0 / usec;
+			prevcnt0 = cnt0;
+			freq1 = ((cnt1 - prevcnt1) & 0xffffff) * 8000000.0 / usec;
+			prevcnt1 = cnt1;
+			freq2 = ((cnt2 - prevcnt2) & 0xffffff) * 1000000.0 / usec;
+			prevcnt2 = cnt2;
+			freq3 = ((cnt3 - prevcnt3) & 0xffffff) * 1000000.0 / usec;
+			prevcnt3 = cnt3;
+		}
+		tprintf("%06x %06x %06x %06x  %8d %8d %8d %8d\r", 
+		       cnt0, cnt1, cnt2, cnt3, freq0, freq1, freq2, freq3);
+		if (idle_callback(200000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * LED test
+ */
+
+static int chkledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	int i;
+	unsigned char eio;
+	
+	if ((i = adapter_start_eppchk()))
+		return i;
+	tprintf("LED test, DISCONNECT PTT!!\n");
+	eio = 1;
+	if (parport_epp_write_addr(&eio, 1) != 1)
+		goto errret;
+	for (;;) {
+		led = (++led) & 3;
+		eio = 1 << led;
+		if (parport_epp_write_data(&eio, 1) != 1)
+			goto errret;
+		tprintf("Lighting LED %s\r", ((const char *[4]){ "DCD", "CON", "STA", "PTT"})[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * DAC test
+ */
+
+static int chkdactest(struct adapter_config *cfg)
+{
+	unsigned phase = 0, rot = 0;
+	unsigned char eio;
+	int i;
+	
+	if ((i = adapter_start_eppchk()))
+		return i;
+	tprintf("DAC test\n");
+	eio = 2;
+	if (parport_epp_write_addr(&eio, 1) != 1)
+		goto errret;
+	for (;;) {
+		eio = 128 + 127 * sin(M_PI / 128 * phase);
+		if (parport_epp_write_data(&eio, 1) != 1)
+			goto errret;
+		phase = (phase + 1) & 0xff;
+		if (phase)
+			continue;
+		rot = (rot + 1) & 3;
+		tprintf("%c\r", "|\\-/"[rot]);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Register test
+ */
+
+static int chkregtest(struct adapter_config *cfg)
+{
+	unsigned data, read, cnt = 0, err = 0;
+	unsigned char eio[5];
+	int i;
+	
+	if ((i = adapter_start_eppchk()))
+		return i;
+	tprintf("Checking LED register\n");
+	eio[0] = 1;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		goto errret;
+	for (data = 0; data < 0x100; data += 0x40) {
+		eio[0] = data;
+		if (parport_epp_write_data(eio, 1) != 1)
+			goto errret;
+		read = parport_read_status();
+		tprintf("LED register: 0x%02x  LPT port status: 0x%02x  %sOK\n", data, read, 
+		       (((data ^ (read << 4)) & 0x80) | ((data ^ (read << 1)) & 0x40)) ? "NOT " : "");
+	}
+	tprintf("EPP register read/write test\n");
+	for (;;) {
+		eio[0] = data;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 5) != 5)
+			goto errret;
+		if ((data ^ eio[0]) & 0xff)
+			err++;
+		cnt++;
+		data++;
+		tprintf("Count: %6d  Errors: %6d\r", cnt, err);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * RAM-Test
+ */
+
+static int chkramaccess(unsigned addr, unsigned data, unsigned write)
+{
+	unsigned char rd;
+	unsigned char eio[3];
+
+	eio[0] = 8;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		return -1;
+	eio[0] = addr & 0xff;
+	if (parport_epp_write_data(eio, 1) != 1)
+		return -1;
+	eio[0] = 9;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		return -1;
+	eio[0] = addr >> 8;
+	if (parport_epp_write_data(eio, 1) != 1)
+		return -1;
+	if (write) {
+		eio[0] = 11;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			return -1;
+		eio[0] = data;
+		if (parport_epp_write_data(eio, 1) != 1)
+			return -1;
+		eio[0] = 8;
+		eio[1] = 10;
+		eio[2] = 8;
+		if (parport_epp_write_addr(eio, 3) != 3)
+			return -1;
+		return 0;
+	}
+	eio[0] = 11;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		return -1;
+	if (parport_epp_read_data(eio, 1) != 1)
+		return -1;
+	rd = eio[0];
+	eio[0] = 8;
+	if (parport_epp_write_addr(eio, 1) != 1)
+		return -1;
+	return rd;
+}
+
+static int chkramtestdata(unsigned data)
+{
+	int val;
+	unsigned char s[10];
+
+	if (chkramaccess(0, data, 1))
+		return -1;
+	val = chkramaccess(0, 0, 0);
+	if (val == -1)
+		return -1;
+	tprintf("Testing data pattern 0x%02x read 0x%02x  failure mask %8s\n",
+	       data, val, to_bin(s, val ^ data, 8));
+	idle_callback(0);
+	return val ^ data;
+}
+
+static int chkramtestaddr(void)
+{
+	unsigned char ramd[32768];
+	unsigned int i, j, k, l, mask = 0;
+	unsigned char s[16];
+
+	for (i = 0; i < 32768; i++) {
+		if (!(i & 0xff)) {
+			tprintf("Writing RAM address 0x%04x...\r", i);
+			if (idle_callback(0))
+				return mask;
+		}
+		ramd[i] = random();
+		if (chkramaccess(i, ramd[i], 1))
+			return -1;
+	}
+	for (i = 0; i < 32768; i++) {
+		if (!(i & 0xff)) {
+			tprintf("Reading RAM address 0x%04x...\r", i);
+			if (idle_callback(0))
+				return mask;
+		}
+		j = chkramaccess(i, 0, 0);
+		if (j == -1)
+			return -1;
+		if (j == ramd[i])
+			continue;
+		l = 0xffff;
+		for (k = 0; k < 32768; k++) {
+			if (ramd[k] != j)
+				continue;
+			if (hweight32(l) > hweight32(k ^ i))
+				l = k ^ i;
+		}
+		mask |= k;
+		tprintf("RAM address error at 0x%04x minimum error mask %15s\n", 
+		       i, to_bin(s, k, 15));
+		if (idle_callback(0))
+			return mask;
+	}
+	return mask;
+}
+
+static int chkramtest(struct adapter_config *cfg)
+{
+	int mask, val;
+	unsigned char s[16];
+	int i;
+	
+	if ((i = adapter_start_eppchk()))
+		return i;
+	tprintf("Performing RAM test...\n");
+	if ((mask = chkramtestdata(0xff)) == -1)
+		goto errret;
+	if ((val = chkramtestdata(0x00)) == -1)
+		goto errret;
+	mask |= val;
+	if ((val = chkramtestdata(0x55)) == -1)
+		goto errret;
+	mask |= val;
+	if ((val = chkramtestdata(0xaa)) == -1)
+		goto errret;
+	mask |= val;
+	if ((val = chkramtestdata(0xcc)) == -1)
+		goto errret;
+	mask |= val;
+	if ((val = chkramtestdata(0x33)) == -1)
+		goto errret;
+	mask |= val;
+	if (mask) {
+		tprintf("RAM data error mask %s\nRAM data test failed, exiting\n", 
+		       to_bin(s, mask, 8));
+		reset_modem();
+		return -4;
+	}
+	if ((mask = chkramtestaddr()) == -1)
+		goto errret;
+	if (mask) {
+		tprintf("RAM address error mask %s\nRAM address test failed, exiting\n", 
+			to_bin(s, mask, 15));
+		reset_modem();
+		return -5;
+	}
+	if (!idle_callback(0))
+		tprintf("\nRAM test passed\n");
+	reset_modem();
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Sigma Delta A/D converter
+ */
+
+static int chkadctest(struct adapter_config *cfg)
+{
+	unsigned char eio;
+	int i;
+
+	if ((i = adapter_start_eppchk()))
+		return i;
+	tprintf("Performing SigmaDelta A/D converter test...\n");
+	tprintf("ADC signal is now routed to DAC...\n");
+	i = 19666660 / 9600;
+	eio = 0x1e;
+	if (parport_epp_write_addr(&eio, 1) != 1)
+		goto errret;
+	eio = i;
+	if (parport_epp_write_data(&eio, 1) != 1)
+		goto errret;
+	eio = 0x1f;
+	if (parport_epp_write_addr(&eio, 1) != 1)
+		goto errret;
+	eio = i >> 8;
+	if (parport_epp_write_data(&eio, 1) != 1)
+		goto errret;
+	eio = 0x10;
+	if (parport_epp_write_addr(&eio, 1) != 1)
+		goto errret;
+	for (;;) {
+		if (idle_callback(100000))
+			break;
+	}
+	reset_modem();
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ========= EPP FIRMWARE TESTS ========================================= */
+
+/*
+ * EPP LED test
+ */
+
+static int eppledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	if ((i = adapter_start_epp(cfg)))
+		return i;
+	tprintf("EPP port LED test\n");
+	for (;;) {
+		led = !led;
+		eio = led ? EPP_LED_STA : EPP_LED_CON;
+		if (parport_epp_write_addr(&eio, 1) != 1)
+			goto errret;
+		tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+static int eppledtest2(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	if ((i = adapter_start_epp(cfg)))
+		return i;
+	tprintf("EPP port LED test (fast)\n");
+	for (;;) {
+		led = !led;
+		eio = led ? EPP_LED_STA : EPP_LED_CON;
+		if (parport_epp_write_addr(&eio, 1) != 1)
+			goto errret;
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * EPP modem test
+ */
+
+static int eppmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+	unsigned int enc_state = 0x100;
+	unsigned int dec_state = 0;
+	unsigned int mask1, mask2;
+	unsigned char stat;
+        int cnt, cntx, i, j, icnt, ocnt, icntx, ocntx;
+	unsigned int berr = 0;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	unsigned char eio[2048];
+	
+	if ((i = adapter_start_epp(cfg)))
+		return i;
+	/* reset modem */
+	eio[0] = 0;
+	eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine TX fifo size from status bits */
+		switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+		case EPP_NTHF:
+			ocntx = 2048 - 256;
+			break;
+
+		case EPP_NTAEF:
+			ocntx = 2048 - 1793;
+			break;
+
+		case 0:
+			ocntx = 0;
+			break;
+
+		default:
+			ocntx = 2048 - 1025;
+			break;
+		}
+		/* determine RX fifo size from status bits */
+		switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+		case EPP_NRHF:
+			icntx = 0;
+			break;
+                
+		case EPP_NRAEF:
+			icntx = 1025;
+			break;
+                
+		case 0:
+			icntx = 1793;
+			break;
+                
+		default:
+			icntx = 256;
+			break;
+		}
+		ocnt = ocntx;
+		icnt = icntx;
+		/* try to determine the FIFO count if in extended mode */
+		if (cfg->extstat) {
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+getpid();
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+getpid();
+			icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+getpid();
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+getpid();
+			ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			ocnt = 16384 - (ocnt & 0x7fff);
+			icnt &= 0x7fff;
+#if 0
+			{
+				unsigned ocnt2, icnt2;
+				eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errret;
+				if (parport_epp_read_addr(eio, 2) != 2)
+					goto errret;
+				icnt2 = eio[0] | (((unsigned int)eio[1]) << 8);
+				eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errret;
+				if (parport_epp_read_addr(eio, 2) != 2)
+					goto errret;
+				ocnt2 = eio[0] | (((unsigned int)eio[1]) << 8);
+				eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errret;
+				ocnt2 = 16384 - (ocnt2 & 0x7fff);
+				icnt2 &= 0x7fff;
+
+				if (icnt != icnt2 || ocnt != ocnt2) {
+					printf("\nCOUNT ERROR!! icnt 0x%x icnt2 0x%x ocnt 0x%x ocnt2 0x%x\n",
+					       icnt, icnt2, ocnt, ocnt2);
+				}
+			}
+#endif
+
+		}
+		/* try to tx */
+		for (cntx = ocnt; cntx > 0; cntx -= cnt) {
+			cnt = cntx;
+			if (cnt > sizeof(eio))
+				cnt = sizeof(eio);
+			if (flags & 2) {
+				for (j = 0; j < cnt; j++) {
+					enc_state >>= 8;
+					for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN; 
+					     i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+						if (enc_state & mask1)
+							enc_state ^= mask2;
+					eio[j] = enc_state;
+				}
+			} else
+				memset(eio, 0, cnt);
+			if (parport_epp_write_data(eio, cnt) != cnt)
+				goto errret;
+		}
+		if (icnt <= 0) {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		} else {
+			for (cntx = icnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				if (parport_epp_read_data(eio, cnt) != cnt)
+					goto errret;
+				if (flags & 2) {
+					for (j = 0; j < cnt; j++) {
+						dec_state = (dec_state >> 8) | (((unsigned int)eio[j]) << DESCRAM_TAPSH3);
+						eio[j] = ((dec_state >> DESCRAM_TAPSH1) ^ 
+							  (dec_state >> DESCRAM_TAPSH2) ^
+							  (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+					}
+				}
+				for (j = 0; j < cnt; j++) {
+					if (eio[j])
+						berr += hweight8(eio[j]);
+					if (flags & 1)
+						for (i = 0; i < 8; i++)
+							fputc('0' + ((eio[j] >> i) & 1), stdout);
+				}
+			}
+			if (flags & 1)
+				fputc('\n', stdout);
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("BERR: %8d  DCD:%c  stat: %02x   icnt %5d icntx %5d ocnt %5d ocntx %5d\r", 
+		       berr, (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, icntx, ocnt, ocntx);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+static int eppmodemtest1(struct adapter_config *cfg)
+{
+	return eppmodemtest(cfg, 0);
+}
+
+static int eppmodemtest2(struct adapter_config *cfg)
+{
+	return eppmodemtest(cfg, 1);
+}
+
+static int eppmodemtest3(struct adapter_config *cfg)
+{
+	return eppmodemtest(cfg, 2);
+}
+
+static int eppmodemtest4(struct adapter_config *cfg)
+{
+	return eppmodemtest(cfg, 3);
+}
+
+/* ========= ECP FIRMWARE TESTS ========================================= */
+
+/*
+ * ECP LED test
+ */
+
+static int ecpledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	if ((i = adapter_start_ecp(cfg)))
+		return i;
+	tprintf("ECP port LED test\n");
+	for (;;) {
+		led = !led;
+		eio = 0xb0 | (led + 1);
+		if (parport_ecp_write_addr(&eio, 1) != 1)
+			goto errret;
+		tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "ECP timeout\n");
+	return -1;
+}
+
+static int ecpledtest2(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	if ((i = adapter_start_ecp(cfg)))
+		return i;
+	tprintf("ECP port LED test (fast)\n");
+	for (;;) {
+		led = !led;
+		eio = 0xb0 | (led + 1);
+		if (parport_ecp_write_addr(&eio, 1) != 1)
+			goto errret;
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "ECP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP modem test
+ */
+
+static int ecpmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+	unsigned int enc_state = 0x100;
+	unsigned int dec_state = 0;
+	unsigned int mask1, mask2;
+	unsigned char stat[6];
+	unsigned char data[4096];
+        int cnt, cntx, i, j, icnt, ocnt;
+	unsigned int berr = 0;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+
+	if ((i = adapter_start_ecp(cfg)))
+		return i;
+	data[0] = 0xaf;  /* reset register: all reset */
+	data[1] = 0xa0;  /* reset register: terminate reset */
+	data[2] = 0xb0;
+	if (parport_ecp_write_addr(data, 3) != 3)
+		goto errret;
+	for (;;) {
+		data[0] = 0x81;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		if (parport_ecp_read_data(stat, 6) != 6)
+			goto errret;
+		data[0] = 0x80;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		icnt = ((unsigned int)stat[2] << 8) | stat[1];
+		ocnt = ((unsigned int)stat[4] << 8) | stat[3];
+		/* read */
+		if (icnt > 0) {
+			for (cntx = icnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(data))
+					cnt = sizeof(data);
+				if (cnt > 0xfff)
+					cnt = 0xfff;
+				data[0] = 0xc0 | (cnt & 0xf);
+				data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+				data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+				if (parport_ecp_write_addr(data, 3) != 3)
+					goto errret;
+				if (parport_ecp_read_data(data, cnt) != cnt)
+					goto errret;
+				/* if doubly scrambled do it in place */
+				if (flags & 2) {
+					for (i = 0; i < cnt; i++) {
+						dec_state = (dec_state >> 8) | (((unsigned)data[i]) << DESCRAM_TAPSH3);
+						data[i] = (dec_state >> DESCRAM_TAPSH1) ^ 
+							(dec_state >> DESCRAM_TAPSH2) ^
+							(dec_state >> DESCRAM_TAPSH3);
+					}
+				}
+				for (i = 0; i < cnt; i++) {
+					if (data[i])
+						berr += hweight8(data[i]);
+					if (flags & 1)
+						for (i = 0; i < 8; i++)
+							fputc('0' + ((data[i] >> i) & 1), stdout);
+				}
+			}
+			if (flags & 1)
+				fputc('\n', stdout);
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+		/* write */
+		for (cntx = 16384 - ocnt; cntx > 0; cntx -= cnt) {
+			cnt = cntx;
+			if (cnt > sizeof(data))
+				cnt = sizeof(data);
+			if (flags & 2) {
+				for (i = 0; i < cnt; i++) {
+					enc_state >>= 8;
+					for (j = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN;
+					     j < 8; j++, mask1 <<= 1, mask2 <<= 1)
+						if (enc_state & mask1)
+							enc_state ^= mask2;
+					data[i] = enc_state;
+				}
+			} else
+				memset(data, 0, cnt);
+			if (parport_ecp_write_data(data, cnt) != cnt)
+				goto errret;
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("BERR: %8d  DCD:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+		       berr, (stat[0] & EPP_DCDBIT) ? '-' : 'D', stat[0], icnt, ocnt);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "ECP timeout\n");
+	return -1;
+}
+
+static int ecpmodemtest1(struct adapter_config *cfg)
+{
+	return ecpmodemtest(cfg, 0);
+}
+
+static int ecpmodemtest2(struct adapter_config *cfg)
+{
+	return ecpmodemtest(cfg, 1);
+}
+
+static int ecpmodemtest3(struct adapter_config *cfg)
+{
+	return ecpmodemtest(cfg, 2);
+}
+
+static int ecpmodemtest4(struct adapter_config *cfg)
+{
+	return ecpmodemtest(cfg, 3);
+}
+
+/* ========= EPPAFSK FIRMWARE TESTS ===================================== */
+
+/*
+ * EPP AFSK LED test
+ */
+
+static int eppafskledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_eppafsk(cfg)))
+		return i;
+	tprintf("EPPAFSK port LED test\n");
+	for (;;) {
+		led = !led;
+		eio = led ? EPP_LED_STA : EPP_LED_CON;
+		if (parport_epp_write_addr(&eio, 1) != 1)
+			goto errret;
+		tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+static int eppafskledtest2(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	unsigned char eio;
+	int i;
+	
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_eppafsk(cfg)))
+		return i;
+	tprintf("EPPAFSK port LED test (fast)\n");
+	for (;;) {
+		led = !led;
+		eio = led ? EPP_LED_STA : EPP_LED_CON;
+		if (parport_epp_write_addr(&eio, 1) != 1)
+			goto errret;
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * EPP AFSK modem test
+ */
+
+static int eppafskmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+	unsigned int enc_state = 0x100;
+	unsigned int dec_state = 0;
+	unsigned int mask1, mask2;
+	unsigned char stat, txbyte;
+        int i, j, icnt, ocnt;
+	unsigned int berr = 0;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	unsigned char eio[32];
+
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_eppafsk(cfg)))
+		return i;
+	txbyte = -((flags >> 1) & 1);
+	/* reset modem */
+	eio[0] = 0x00;
+	eio[1] = 0x18;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine the FIFO count */
+		eio[0] = 0x19;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		ocnt = 0x10 - (eio[0] & 0x1f);
+		eio[0] = 0x1a;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		icnt = eio[0] & 0x1f;
+		eio[0] = 0x18;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		/* try to tx */
+		if (ocnt > 0) {
+			if (flags & 2) {
+				for (j = 0; j < ocnt; j++) {
+					enc_state >>= 8;
+					for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN; 
+					     i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+						if (enc_state & mask1)
+							enc_state ^= mask2;
+					eio[j] = enc_state;
+				}
+			} else
+				memset(eio, 0, ocnt);
+			if (parport_epp_write_data(eio, ocnt) != ocnt)
+				goto errret;
+		}
+		if (icnt <= 0) {
+			if (idle_callback(1000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+		else {
+			if (parport_epp_read_data(eio, icnt) != icnt)
+				goto errret;
+			if (flags & 2) {
+				for (j = 0; j < icnt; j++) {
+					dec_state = (dec_state >> 8) | (((unsigned int)eio[j]) << DESCRAM_TAPSH3);
+					eio[j] = ((dec_state >> DESCRAM_TAPSH1) ^ 
+						  (dec_state >> DESCRAM_TAPSH2) ^
+						  (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+				}
+			}
+			for (j = 0; j < icnt; j++) {
+				if (eio[j])
+					berr += hweight8(eio[j]);
+				if (flags & 1)
+					for (i = 0; i < 8; i++)
+						fputc('0' + ((eio[j] >> i) & 1), stdout);
+			}
+			if (flags & 1)
+				fputc('\n', stdout);
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("BERR: %8d  DCD:%c PTT:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+		       berr, (stat & 0x80) ? '-' : 'D', (stat & 0x40) ? '-' : 'P', stat, icnt, ocnt);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+static int eppafskmodemtest1(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 0);
+}
+
+static int eppafskmodemtest2(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 1);
+}
+
+static int eppafskmodemtest3(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 2);
+}
+
+static int eppafskmodemtest4(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 3);
+}
+
+static int eppafskmodemtest5(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 4);
+}
+
+static int eppafskmodemtest6(struct adapter_config *cfg)
+{
+	return eppafskmodemtest(cfg, 6);
+}
+
+/* ========= SPPAFSK FIRMWARE TESTS ===================================== */
+
+/*
+ * SPP AFSK LED test
+ */
+
+static int sppafskledtest(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	int i;
+	
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_sppafsk(cfg)))
+		return i;
+	tprintf("SPPAFSK port LED test\n");
+	for (;;) {
+		led = !led;
+		sppafsk_wrcmd(led ? EPP_LED_STA : EPP_LED_CON);
+		tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+		if (idle_callback(500000)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+}
+
+static int sppafskledtest2(struct adapter_config *cfg)
+{
+	unsigned led = 0;
+	int i;
+	
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_eppafsk(cfg)))
+		return i;
+	tprintf("SPPAFSK port LED test (fast)\n");
+	for (;;) {
+		led = !led;
+		sppafsk_wrcmd(led ? EPP_LED_STA : EPP_LED_CON);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * SPP AFSK modem test
+ */
+
+static int sppafskmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+	unsigned int enc_state = 0x100;
+	unsigned int dec_state = 0;
+	unsigned int mask1, mask2;
+	unsigned char stat, txbyte;
+        int i, j, icnt, ocnt;
+	unsigned int berr = 0;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	unsigned char currx;
+
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_sppafsk(cfg)))
+		return i;
+	txbyte = -((flags >> 1) & 1);
+	/* reset modem */
+	sppafsk_wrcmd(0x00);
+	sppafsk_wrcmd(0x18);
+	for (;;) {
+		stat = sppafsk_rdcmd();
+		/* determine the FIFO count */
+		sppafsk_wrcmd(0x19);
+		ocnt = sppafsk_rdcmd();
+		sppafsk_wrcmd(0x1a);
+		icnt = sppafsk_rdcmd();
+		sppafsk_wrcmd(0x18);
+		if (icnt > 0x10 || ocnt > 0x10)
+			goto errret;
+		ocnt = 0x10 - ocnt;
+		/* try to tx */
+		if (ocnt > 0) {
+			if (flags & 2) {
+				for (j = 0; j < ocnt; j++) {
+					enc_state >>= 8;
+					for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN; 
+					     i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+						if (enc_state & mask1)
+							enc_state ^= mask2;
+					sppafsk_wrdata(enc_state);
+				}
+			} else {
+				for (j = 0; j < ocnt; j++) 
+					sppafsk_wrdata(0);
+			}
+		}
+		if (icnt <= 0) {
+			if (idle_callback(1000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+		else {
+			for (j = 0; j < icnt; j++) {
+				currx = sppafsk_rddata();
+				if (flags & 2) {
+					dec_state = (dec_state >> 8) | (((unsigned int)currx) << DESCRAM_TAPSH3);
+					currx = ((dec_state >> DESCRAM_TAPSH1) ^ 
+						 (dec_state >> DESCRAM_TAPSH2) ^
+						 (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+				}
+				if (currx)
+					berr += hweight8(currx);
+				if (flags & 1)
+					for (i = 0; i < 8; i++)
+						fputc('0' + ((currx >> i) & 1), stdout);
+			}
+			if (flags & 1)
+				fputc('\n', stdout);
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("BERR: %8d  DCD:%c PTT:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+		       berr, (stat & 0x80) ? '-' : 'D', (stat & 0x40) ? '-' : 'P', stat, icnt, ocnt);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "SPP bogus values read\n");
+	return -1;
+}
+
+static int sppafskmodemtest1(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 0);
+}
+
+static int sppafskmodemtest2(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 1);
+}
+
+static int sppafskmodemtest3(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 2);
+}
+
+static int sppafskmodemtest4(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 3);
+}
+
+static int sppafskmodemtest5(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 4);
+}
+
+static int sppafskmodemtest6(struct adapter_config *cfg)
+{
+	return sppafskmodemtest(cfg, 6);
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * HDLC receive tests
+ */
+
+static void tprintpkt(const unsigned char *pkt, unsigned len)
+{
+        unsigned char v1=1,cmd=0;
+        unsigned char i,j;
+
+        if (!pkt || len < 8)
+                return;
+        if (pkt[1] & 1) {
+                /*
+                 * FlexNet Header Compression
+                 */
+                v1 = 0;
+                cmd = (pkt[1] & 2) != 0;
+                tprintf("fm ? to ");
+                i = (pkt[2] >> 2) & 0x3f;
+                if (i)
+                        tprintf("%c",i+0x20);
+                i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f;
+                if (i)
+                        tprintf("%c", i+0x20);
+                i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f;
+                if (i)
+                        tprintf("%c", i+0x20);
+                i = pkt[4] & 0x3f;
+                if (i)
+                        tprintf("%c", i+0x20);
+                i = (pkt[5] >> 2) & 0x3f;
+                if (i)
+                        tprintf("%c", i+0x20);
+                i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f;
+                if (i)
+                        tprintf("%c", i+0x20);
+                tprintf("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2));
+                pkt += 7;
+                len -= 7;
+        } else {
+                /*
+                 * normal header
+                 */
+                if (len < 15)
+                        return;
+                if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) {
+                        v1 = 0;
+                        cmd = (pkt[6] & 0x80);
+                }
+                tprintf("fm ");
+                for(i = 7; i < 13; i++) 
+                        if ((pkt[i] &0xfe) != 0x40)
+                                tprintf("%c", pkt[i] >> 1);
+                tprintf("-%u to ", (pkt[13] >> 1) & 0xf);
+                for(i = 0; i < 6; i++) 
+                        if ((pkt[i] &0xfe) != 0x40)
+                                tprintf("%c", pkt[i] >> 1);
+                tprintf("-%u", (pkt[6] >> 1) & 0xf);
+                pkt += 14;
+                len -= 14;
+                if ((!(pkt[-1] & 1)) && (len >= 7))
+                        tprintf(" via ");
+                while ((!(pkt[-1] & 1)) && (len >= 7)) {
+                        for(i = 0; i < 6; i++) 
+                                if ((pkt[i] &0xfe) != 0x40)
+                                        tprintf("%c", pkt[i] >> 1);
+                        tprintf("-%u", (pkt[6] >> 1) & 0xf);
+                        pkt += 7;
+                        len -= 7;
+                        if ((!(pkt[-1] & 1)) && (len >= 7))
+                                tprintf(",");
+                }
+        }
+        if(!len) 
+                return;
+        i = *pkt++;
+        len--;
+        j = v1 ? ((i & 0x10) ? '!' : ' ') : 
+                ((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v'));
+        if (!(i & 1)) {
+                /*
+                 * Info frame
+                 */
+                tprintf(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j);
+        } else if (i & 2) {
+                /*
+                 * U frame
+                 */
+                switch (i & (~0x10)) {
+                case 0x03:
+                        tprintf(" UI%c", j);
+                        break;
+                case 0x2f:
+                        tprintf(" SABM%c", j);
+                        break;
+                case 0x43:
+                        tprintf(" DISC%c", j);
+                        break;
+                case 0x0f:
+                        tprintf(" DM%c", j);
+                        break;
+                case 0x63:
+                        tprintf(" UA%c", j);
+                        break;
+                case 0x87:
+                        tprintf(" FRMR%c", j);
+                        break;
+                default:
+                        tprintf(" unknown U (0x%x)%c", i & (~0x10), j);
+                        break;
+                }
+        } else {
+                /*
+                 * supervisory
+                 */
+                switch (i & 0xf) {
+                case 0x1:
+                        tprintf(" RR%u%c", (i >> 5) & 7, j);
+                        break;
+                case 0x5:
+                        tprintf(" RNR%u%c", (i >> 5) & 7, j);
+                        break;
+                case 0x9:
+                        tprintf(" REJ%u%c", (i >> 5) & 7, j);
+                        break;
+                default:
+                        tprintf(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j);
+                        break;
+                }
+        }
+        if (!len) {
+                tprintf("\n");
+                return;
+        }
+        tprintf(" pid=%02X\n", *pkt++);
+        len--;
+        j = 0;
+        while (len) {
+                i = *pkt++;
+		if ((i >= 32) && (i < 128))
+			tprintf("%c", i);
+		else if (i == 13) {
+                        if (j)
+                                tprintf("\n");
+                        j = 0;
+                } else
+                        tprintf(".");
+                if (i >= 32) 
+                        j = 1;
+                len--;
+        }
+        if (j)
+                tprintf("\n");
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+static const u_int16_t crc_ccitt_table[0x100] = {
+        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* --------------------------------------------------------------------- */
+
+extern inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = 0xffff;
+
+        for (;len>0;len--)
+                crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+        crc ^= 0xffff;
+	return crc;
+}
+
+extern inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        *buffer++ = crc;
+        *buffer++ = crc >> 8;
+}
+
+extern inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define MAXFLEN           512
+#define RXBUFFER_SIZE     ((MAXFLEN*6/5)+8)
+
+struct hdlc_receiver {
+        unsigned int bitbuf, bitstream, numbits, state;
+        unsigned char *bufptr;
+        int bufcnt;
+        unsigned char buf[RXBUFFER_SIZE];
+};
+
+extern inline void hdlc_initrx(struct hdlc_receiver *h)
+{       
+        memset(h, 0, sizeof(struct hdlc_receiver));
+        h->bufptr = h->buf;
+}
+
+static void do_rxpacket(struct hdlc_receiver *h)
+{
+	if (h->bufcnt < 4) 
+		return;
+	if (!check_crc_ccitt(h->buf, h->bufcnt)) 
+		return;
+	tprintf("                                                              \r");
+	tprintpkt(h->buf, h->bufcnt-2);
+}
+
+#define DECODEITERA(j)                                                        \
+({                                                                            \
+        if (!(notbitstream & (0x0fc << j)))              /* flag or abort */  \
+                goto flgabrt##j;                                              \
+        if ((bitstream & (0x1f8 << j)) == (0xf8 << j))   /* stuffed bit */    \
+                goto stuff##j;                                                \
+  enditer##j:                                                                 \
+})
+
+#define DECODEITERB(j)                                                                 \
+({                                                                                     \
+  flgabrt##j:                                                                          \
+        if (!(notbitstream & (0x1fc << j))) {              /* abort received */        \
+                state = 0;                                                             \
+                goto enditer##j;                                                       \
+        }                                                                              \
+        if ((bitstream & (0x1fe << j)) != (0x0fc << j))   /* flag received */          \
+                goto enditer##j;                                                       \
+        if (state)                                                                     \
+                do_rxpacket(h);                                                        \
+        h->bufcnt = 0;                                                                 \
+        h->bufptr = h->buf;                                                            \
+        state = 1;                                                                     \
+        numbits = 7-j;                                                                 \
+        goto enditer##j;                                                               \
+  stuff##j:                                                                            \
+        numbits--;                                                                     \
+        bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);        \
+        goto enditer##j;                                                               \
+})
+        
+/* ---------------------------------------------------------------------- */
+
+static void hdlc_receive(struct hdlc_receiver *h, u_int8_t *bits, int cnt)
+{
+        unsigned int bitbuf, notbitstream, bitstream, numbits, state;
+        u_int8_t ch;
+
+        numbits = h->numbits;
+        state = h->state;
+        bitstream = h->bitstream;
+        bitbuf = h->bitbuf;
+        for (; cnt > 0; cnt--) {
+                ch = *bits++;
+                bitstream >>= 8;
+                bitstream |= ch << 8;
+                bitbuf >>= 8;
+                bitbuf |= ch << 8;
+                numbits += 8;
+                notbitstream = ~bitstream;
+                DECODEITERA(0);
+                DECODEITERA(1);
+                DECODEITERA(2);
+                DECODEITERA(3);
+                DECODEITERA(4);
+                DECODEITERA(5);
+                DECODEITERA(6);
+                DECODEITERA(7);
+                goto enddec;
+                DECODEITERB(0);
+                DECODEITERB(1);
+                DECODEITERB(2);
+                DECODEITERB(3);
+                DECODEITERB(4);
+                DECODEITERB(5);
+                DECODEITERB(6);
+                DECODEITERB(7);
+          enddec:
+                while (state && numbits >= 8) {
+                        if (h->bufcnt >= RXBUFFER_SIZE) {
+                                state = 0;
+                        } else {
+                                *(h->bufptr)++ = bitbuf >> (16-numbits);
+                                h->bufcnt++;
+                                numbits -= 8;
+                        }
+                }
+        }
+        h->numbits = numbits;
+        h->state = state;
+        h->bitstream = bitstream;
+        h->bitbuf = bitbuf;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int epprx(struct adapter_config *cfg)
+{
+	u_int8_t stat;
+        int cnt, cntx, i, icnt, ocnt, icntx, ocntx;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	struct hdlc_receiver hdlcrx;
+	unsigned char eio[1024];
+
+	hdlc_initrx(&hdlcrx);
+	if ((i = adapter_start_epp(cfg)))
+		return i;
+	/* reset modem */
+	eio[0] = 0;
+	eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine TX fifo size from status bits */
+		switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+		case EPP_NTHF:
+			ocntx = 2048 - 256;
+			break;
+
+		case EPP_NTAEF:
+			ocntx = 2048 - 1793;
+			break;
+
+		case 0:
+			ocntx = 0;
+			break;
+
+		default:
+			ocntx = 2048 - 1025;
+			break;
+		}
+		/* determine RX fifo size from status bits */
+		switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+		case EPP_NRHF:
+			icntx = 0;
+			break;
+                
+		case EPP_NRAEF:
+			icntx = 1025;
+			break;
+                
+		case 0:
+			icntx = 1793;
+			break;
+                
+		default:
+			icntx = 256;
+			break;
+		}
+		ocnt = ocntx;
+		icnt = icntx;
+		/* try to determine the FIFO count if in extended mode */
+		if (cfg->extstat) {
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+			icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+			ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			ocnt = 16384 - (ocnt & 0x7fff);
+			icnt &= 0x7fff;
+		}
+		/* try to tx */
+#if 0
+		if (ocnt > 0) {
+		}
+#endif
+		if (icnt > 0) {
+			for (cntx = icnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				if (parport_epp_read_data(eio, cnt) != cnt)
+					goto errret;
+				hdlc_receive(&hdlcrx, eio, cnt);
+			}
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("DCD:%c  stat: %02x   icnt %5d icntx %5d ocnt %5d ocntx %5d\r", 
+		       (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, icntx, ocnt, ocntx);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecprx(struct adapter_config *cfg)
+{
+	u_int8_t stat[6];
+        int cnt, cntx, i, icnt, ocnt;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	unsigned char data[4096];
+	struct hdlc_receiver hdlcrx;
+
+	hdlc_initrx(&hdlcrx);
+	if ((i = adapter_start_ecp(cfg)))
+		return i;
+	data[0] = 0xaf;  /* reset register: all reset */
+	data[1] = 0xa0;  /* reset register: terminate reset */
+	data[2] = 0xb0;
+	if (parport_ecp_write_addr(data, 3) != 3)
+		goto errret;
+	for (;;) {
+		data[0] = 0x81;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		if (parport_ecp_read_data(stat, 6) != 6)
+			goto errret;
+		data[0] = 0x80;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		icnt = ((unsigned)stat[2] << 8) | stat[1];
+		ocnt = ((unsigned)stat[4] << 8) | stat[3];
+		/* read */
+		if (icnt > 0) {
+			for (cntx = icnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(data))
+					cnt = sizeof(data);
+				if (cnt > 0xfff)
+					cnt = 0xfff;
+				data[0] = 0xc0 | (cnt & 0xf);
+				data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+				data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+				if (parport_ecp_write_addr(data, 3) != 3)
+					goto errret;
+				if (parport_ecp_read_data(data, cnt) != cnt)
+					goto errret;
+				hdlc_receive(&hdlcrx, data, cnt);
+			}
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+		/* write */
+#if 0
+		if (ocnt < 8192) { /* fixme */
+			cnt = 8192 - ocnt;
+			if (cnt > sizeof(data))
+				cnt = sizeof(data);
+		}
+#endif
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("DCD:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+			(stat[0] & EPP_DCDBIT) ? '-' : 'D', stat[0], icnt, ocnt);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "ECP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int eppafskrx(struct adapter_config *cfg)
+{
+	u_int8_t stat;
+        int i, icnt, ocnt;
+#if 0
+	int j;
+	unsigned int pcnt = 0;
+#endif
+	unsigned char eio[32];
+	struct hdlc_receiver hdlcrx;
+
+	hdlc_initrx(&hdlcrx);
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_eppafsk(cfg)))
+		return i;
+	/* reset modem */
+	eio[0] = 0x00;
+	eio[1] = 0x18;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine the FIFO count */
+		eio[0] = 0x19;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		ocnt = 0x10 - (eio[0] & 0x1f);
+		eio[0] = 0x1a;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		icnt = eio[0] & 0x1f;
+		eio[0] = 0x18;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		/* try to tx */
+#if 0
+		if (ocnt > 0) {
+		}
+#endif
+		if (icnt > 0) {
+			if (parport_epp_read_data(eio, icnt) != icnt)
+				goto errret;
+#if 0
+			for (i = 0; i < icnt; i++)
+				for (j = 0; j < 8; j++)
+					putc('0' + ((eio[i] >> j) & 1), stdout);
+			fflush(stdout);
+#endif
+			hdlc_receive(&hdlcrx, eio, icnt);
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+#if 1
+		tprintf("DCD:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+		       (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, ocnt);
+#endif
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int sppafskrx(struct adapter_config *cfg)
+{
+	u_int8_t stat;
+        int i, icnt, ocnt;
+#if 0
+	unsigned int pcnt = 0;
+#endif
+	unsigned char eio[32];
+	struct hdlc_receiver hdlcrx;
+
+	hdlc_initrx(&hdlcrx);
+	cfg->bitrate = 1200;
+	if ((i = adapter_start_sppafsk(cfg)))
+		return i;
+	/* reset modem */
+	sppafsk_wrcmd(0x00);
+	sppafsk_wrcmd(0x18);
+	for (;;) {
+		stat = sppafsk_rdcmd();
+		/* determine the FIFO count */
+		sppafsk_wrcmd(0x19);
+		ocnt = sppafsk_rdcmd();
+		sppafsk_wrcmd(0x1a);
+		icnt = sppafsk_rdcmd();
+		sppafsk_wrcmd(0x18);
+		if (icnt > 0x10 || ocnt > 0x10)
+			goto errret;
+		ocnt = 0x10 - ocnt;
+		/* try to tx */
+#if 0
+		if (ocnt > 0) {
+		}
+#endif
+		if (icnt > 0) {
+			for (i = 0; i < icnt; i++)
+				eio[i] = sppafsk_rddata();
+			hdlc_receive(&hdlcrx, eio, icnt);
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+#if 0
+		pcnt = (++pcnt) & 0x3f;
+		if (pcnt)
+			continue;
+#endif
+		/* DCD has inverse logic */
+		tprintf("DCD:%c  stat: %02x   icnt %5d ocnt %5d\r", 
+		       (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, ocnt);
+		if (idle_callback(0)) {
+			reset_modem();
+			return 0;
+		}
+	}
+	return 0;
+
+errret:
+	lprintf(0, "SPP bogus values read\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Sample IO Firmware Tests
+ */
+
+static int sine1k(struct adapter_config *cfg)
+{
+#if 0
+	static const char scdisp[] = "                                                               *\n";
+#endif
+	signed char sine[128];
+	unsigned char eio[1024];
+	unsigned char ctrl = 0;
+	unsigned phase = 0, ledcnt = 0;
+	int i, icnt, ocnt, cnt, cntx;
+
+	cfg->bitrate = 8000;
+	if ((i = adapter_start_eppsamp(cfg)))
+		return i;
+	for (i = 0; i < sizeof(sine); i++)
+		sine[i] = 127 * sin((2.0 * M_PI / sizeof(sine)) * i);
+	tprintf("Sine 1k Test\n");
+	eio[0] = 7;
+	eio[1] = 0;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		/* determine the FIFO count */
+		eio[0] = ctrl | 1;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 2) != 2)
+			goto errret;
+		icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+		eio[0] = ctrl | 2;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 2) != 2)
+			goto errret;
+		ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+		eio[0] = ctrl;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		ocnt = 16384 - (ocnt & 0x7fff);
+		icnt &= 0x7fff;
+		/* try to tx */
+		if (ocnt > 0) {
+			for (cntx = ocnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				for (i = 0; i < cnt; i++) {
+					eio[i] = sine[(phase >> 9) & 0x7f];
+					phase += 0x1789;  /* pretty arbitrary */
+				}
+				if (parport_epp_write_data(eio, cnt) != cnt)
+					goto errret;
+			}
+		}
+		if (icnt > 0) {
+			for (cntx = icnt; cntx > 0; cntx -= cnt) {
+				cnt = cntx;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				if (parport_epp_read_data(eio, cnt) != cnt)
+					goto errret;
+				for (i = 0; i < cnt; i++) {
+#if 0
+					tprintf(scdisp + (((eio[i] + 128) & 0xff) / 4));
+#elif 1
+					if (i < 64)
+						tprintf("%4d\n", ((signed char)eio[i]));
+					else if (i == 64)
+						tprintf("--\n");
+#endif
+					if ((++ledcnt) >= 4000) {
+						ledcnt = 0;
+						ctrl += 0x40;
+					}
+				}
+			}
+		} else {
+			if (idle_callback(10000)) {
+				reset_modem();
+				return 0;
+			}
+		}
+	}
+
+errret:
+	lprintf(0, "EPP timeout\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+#include <linux/soundcard.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#define SNDLATENCY 4000   /* approx 1/2 seconds */
+#define PHASEFRAC  12
+#define PHASEMASK  ((1<<PHASEFRAC)-1)
+#define SINEOVERLAY
+
+static int saudio(struct adapter_config *cfg)
+{
+	unsigned char bufu[8192];   /* must be significantly bigger than SNDLATENCY! */
+	signed char bufs[8192];     /* must be significantly bigger than SNDLATENCY! */
+	audio_buf_info aboinfo, abiinfo;
+	int fddsp, apar;
+	unsigned srate;
+	unsigned char ctrl = 0;
+	unsigned phinceppdsp, phincdspepp, pheppdsp = 0, phdspepp = 0;
+	unsigned ledcnt = 0;
+	int i, icnt, ocnt, cnt, ocnts, omax;
+#ifdef SINEOVERLAY
+	signed char sine[128];
+	unsigned phase = 0;
+#endif
+
+#ifdef SINEOVERLAY
+	for (i = 0; i < sizeof(sine); i++)
+		sine[i] = 63 * sin((2.0 * M_PI / sizeof(sine)) * i);
+#endif
+	cfg->bitrate = 8000;
+	if ((i = adapter_start_eppsamp(cfg)))
+		return i;
+	if ((fddsp = open("/dev/dsp", O_RDWR | O_NONBLOCK)) == -1) {
+		lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+		return -1;
+	}
+	fcntl(fddsp, F_SETFL, fcntl(fddsp, F_GETFL, 0) | O_NONBLOCK);
+	if (ioctl(fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_DUPLEX)) {
+		lprintf(0, "full duplex soundcard required\n");
+		goto errsnd;
+	}
+	if (!(apar & DSP_CAP_TRIGGER)) {
+		lprintf(0, "soundcard does not support trigger\n");
+		goto errsnd;
+	}
+	if (ioctl(fddsp, SNDCTL_DSP_SETDUPLEX, 0) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETDUPLEX failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = AFMT_U8;
+	if (ioctl(fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), U8 not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	apar = 0;
+	if (ioctl(fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+		goto errsnd;
+	}
+	srate = cfg->bitrate;
+	if (ioctl(fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", 
+			strerror(errno), cfg->bitrate);
+		goto errsnd;
+	}
+	lprintf(1, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg->bitrate, srate);
+	if (abs(cfg->bitrate - srate) > cfg->bitrate / 2) {
+		lprintf(0, "sampling rates (%u,%u) too different\n", cfg->bitrate, srate);
+		goto errsnd;
+	}
+	phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + srate / 2) / srate;
+	phincdspepp = ((1 << PHASEFRAC) * srate + cfg->bitrate / 2) / cfg->bitrate;
+	lprintf(1, "epp->dsp phase inc: 0x%05x  dsp->epp phase inc: 0x%05x\n", phinceppdsp, phincdspepp);
+	if (ioctl(fddsp, SNDCTL_DSP_GETOSPACE, &aboinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (ioctl(fddsp, SNDCTL_DSP_GETISPACE, &abiinfo) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	if (aboinfo.fragstotal * aboinfo.fragsize < 2*SNDLATENCY ||
+	    abiinfo.fragstotal * abiinfo.fragsize < 2*SNDLATENCY) {
+		lprintf(0, "soundcard buffers too small (%u,%u)\n", 
+			aboinfo.fragstotal * aboinfo.fragsize, 
+			abiinfo.fragstotal * abiinfo.fragsize);
+		goto errsnd;
+	}
+	tprintf("Audio IO to Linux Soundcard\n");
+	/* reset the EPP adapter */
+	bufu[0] = 7;
+	bufu[1] = 0;
+	if (parport_epp_write_addr(bufu, 2) != 2)
+		goto errret;
+	/* prefill EPP adapter to nominal queue size */
+	memset(bufs, 0, SNDLATENCY);
+	if (parport_epp_write_data(bufs, SNDLATENCY) != SNDLATENCY)
+		goto errret;
+	/* prefill to nominal queue size and stard soundcard */
+	memset(bufu, 0x80, SNDLATENCY);
+	if ((i = write(fddsp, bufu, SNDLATENCY)) != SNDLATENCY) {
+		lprintf(0, "write(%d) failed %i (%s)\n", SNDLATENCY, i, strerror(errno));
+		goto errsnd;
+	}
+	apar = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT;
+	if (ioctl(fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+		lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+		goto errsnd;
+	}
+	/* start the whole thing */
+	for (;;) {
+		/* first do the epp->dsp direction */
+		/* get FIFO count */
+		bufu[0] = ctrl | 1;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(bufu, 2) != 2)
+			goto errret;
+		icnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+		bufu[0] = ctrl;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		icnt &= 0x7fff;
+		if (icnt > 0) {
+			if (icnt > sizeof(bufs)/2)
+				icnt = sizeof(bufs)/2;
+			if (parport_epp_read_data(bufs, icnt) != icnt)
+				goto errret;
+			pheppdsp &= PHASEMASK;
+			cnt = 0;
+			while (pheppdsp < (icnt << PHASEFRAC)) {
+				bufu[cnt] = bufs[pheppdsp >> PHASEFRAC] + 128;
+				pheppdsp += phinceppdsp;
+				cnt++;
+			}
+			if ((i = write(fddsp, bufu, cnt)) != cnt) {
+				lprintf(0, "write(%d) failed %i (%s)\n", cnt, i, strerror(errno));
+				goto errsnd;
+			}
+			if (ioctl(fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+				lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+				goto errsnd;
+			}
+			/* adjust speed */
+			lprintf(4, "icnt %d cnt %d odel %d\n", icnt, cnt, apar);
+			if (apar > SNDLATENCY)
+				phinceppdsp++;
+			else if (apar < SNDLATENCY)
+				phinceppdsp--;
+			if (phinceppdsp < (0x9 << (PHASEFRAC-4)) || phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+				lprintf(0, "phinceppdsp (0x%05x) out of range\n", phinceppdsp);
+				goto errsnd;
+			}
+			/* play games with the LEDS */
+			ledcnt += icnt;
+			if (ledcnt >= 4000) {
+				ledcnt %= 4000;
+				ctrl += 0x40;
+			}
+		}
+		/* next do the dsp->epp direction */
+		/* get FIFO count */
+		bufu[0] = ctrl | 2;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(bufu, 2) != 2)
+			goto errret;
+		ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+		bufu[0] = ctrl;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		ocnt &= 0x7fff;
+		omax = 16384 - ocnt;
+		/* read sound */
+		ocnts = read(fddsp, bufu, sizeof(bufu)/2);
+		if (ocnts == -1 && errno == EAGAIN)
+			ocnts = 0;
+		if (ocnts < 0) {
+			lprintf(0, "read(%d) failed %i (%s)\n", sizeof(bufu)/2, ocnts, strerror(errno));
+			goto errsnd;
+		}
+		if (ocnts > 0) {
+			phdspepp &= PHASEMASK;
+			cnt = 0;
+			while (phdspepp < (ocnts << PHASEFRAC)) {
+				bufs[cnt] = bufu[phdspepp >> PHASEFRAC] - 128;
+				phdspepp += phincdspepp;
+				cnt++;
+			}
+			if (cnt > omax) {
+				lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+				goto errsnd;
+			}
+#ifdef SINEOVERLAY
+			for (i = 0; i < cnt; i++) {
+				bufs[i] += sine[(phase >> 9) & 0x7f];
+				phase += 0x1789;  /* pretty arbitrary */
+			}
+#endif
+			if (parport_epp_write_data(bufs, cnt) != cnt)
+				goto errret;
+			/* reget the FIFO count */
+			bufu[0] = ctrl | 2;
+			if (parport_epp_write_addr(bufu, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(bufu, 2) != 2)
+				goto errret;
+			ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+			bufu[0] = ctrl;
+			if (parport_epp_write_addr(bufu, 1) != 1)
+				goto errret;
+			ocnt &= 0x7fff;
+			/* adjust speed */
+			lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+			if (ocnt > SNDLATENCY)
+				phincdspepp++;
+			else if (ocnt < SNDLATENCY)
+				phincdspepp--;
+			if (phincdspepp < (0x9 << (PHASEFRAC-4)) || phincdspepp > (0x1f << (PHASEFRAC-4))) {
+				lprintf(0, "phincdspepp (0x%05x) out of range\n", phincdspepp);
+				goto errsnd;
+			}
+		}
+		/* wait a bit */
+		if (idle_callback(50000)) {
+			reset_modem();
+			return 0;
+		}
+		lprintf(1, "phase increments: 0x%05x 0x%05x\n", phinceppdsp, phincdspepp);
+	}
+
+errret:
+	lprintf(0, "EPP timeout\n");
+errsnd:
+	close(fddsp);
+	return -1;
+}
+
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_DIRECTX
+
+#include <directx.h>
+
+#define SNDLATENCY 4000   /* approx 1/2 seconds */
+#define PHASEFRAC  12
+#define PHASEMASK  ((1<<PHASEFRAC)-1)
+#define SINEOVERLAY
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+        lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+        return TRUE;
+}
+
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+	switch (umsg) {
+		/* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't 
+		    want to pass these messages along for default processing. */
+	case WM_CLOSE:
+		DestroyWindow (hwnd);
+		return 0;
+
+	case WM_DESTROY:
+		PostQuitMessage (0);
+		return 0;
+	}
+	return DefWindowProc (hwnd, umsg, wParam, lParam);
+}
+
+static int saudio(struct adapter_config *cfg)
+{
+	LPDIRECTSOUND dsplay = NULL;
+	LPDIRECTSOUNDCAPTURE dsrec = NULL;
+	LPDIRECTSOUNDBUFFER playbuf = NULL;
+	LPDIRECTSOUNDCAPTUREBUFFER recbuf = NULL;
+	WNDCLASS wndclass;
+	HRESULT res;
+        WAVEFORMATEX waveformat;
+        DSBUFFERDESC bdesc;
+        DSCBUFFERDESC cbdesc;
+	HANDLE hinst;
+	HWND hwnd;
+	DWORD playbufsz, recbufsz, playptr = 0, recptr = 0;
+	DWORD lockbytes, lockbytes2, delay;
+	unsigned char *uptr;
+	unsigned char *uptr2;
+	unsigned char *uptr3;
+	int retval = -1;
+	unsigned char bufu[8];
+	signed char bufs[8192];     /* must be significantly bigger than SNDLATENCY! */
+	unsigned char ctrl = 0;
+	unsigned phinceppdsp, phincdspepp, pheppdsp = 0, phdspepp = 0;
+	unsigned ledcnt = 0;
+	int i, icnt, ocnt, cnt, ocnts, omax;
+#ifdef SINEOVERLAY
+	signed char sine[128];
+	unsigned phase = 0;
+#endif
+
+#ifdef SINEOVERLAY
+	for (i = 0; i < sizeof(sine); i++)
+		sine[i] = 63 * sin((2.0 * M_PI / sizeof(sine)) * i);
+#endif
+        lprintf(1, "DirectSound drivers\n");
+        DirectSoundEnumerateA(DSEnumProc, NULL);
+        lprintf(1, "DirectSoundCapture drivers\n");
+        DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+	hinst = GetModuleHandleA(0);
+	wndclass.style = CS_HREDRAW | CS_VREDRAW;
+	wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+	wndclass.cbClsExtra = 0;
+	wndclass.cbWndExtra = 0;
+	wndclass.hIcon = NULL;
+	wndclass.hInstance = hinst;
+	wndclass.hCursor = NULL;
+	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+	wndclass.lpszMenuName = NULL;
+	wndclass.lpszClassName = "MyClass";
+	if (!RegisterClass(&wndclass)) {
+		lprintf(0, "RegisterClass error, %d\n", GetLastError());
+		return -1;
+	}
+	hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+			      0, 0, 0, 0, NULL, NULL, hinst, NULL);
+	if (!hwnd) {
+		lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+		goto errcreatewin;
+	}
+        if (FAILED(res = DirectSoundCreate(NULL, &dsplay, NULL))) {
+                lprintf(0, "DirectSoundCreate error %lu\n", res);
+                goto errdscreate;
+        }
+        if (FAILED(res = IDirectSound_SetCooperativeLevel(dsplay, hwnd, DSSCL_NORMAL))) {
+                lprintf(0, "SetCooperativeLevel error %lu\n", res);
+                goto errdscreate1;
+        }
+        if (FAILED(res = DirectSoundCaptureCreate(NULL, &dsrec, NULL))) {
+                lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+                goto errdscreate1;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 8;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = 8000;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&cbdesc, 0, sizeof(cbdesc));
+        cbdesc.dwSize = sizeof(cbdesc);
+        cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+        recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        cbdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(dsrec, &cbdesc, &recbuf, NULL))) {
+                lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+                goto errdscreate2;
+        }
+        memset(&waveformat, 0, sizeof(waveformat));
+        waveformat.wFormatTag = WAVE_FORMAT_PCM;
+        waveformat.wBitsPerSample = 8;
+        waveformat.nChannels = 1;
+        waveformat.nSamplesPerSec = 8000;
+        waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+        waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+        memset(&bdesc, 0, sizeof(bdesc));
+        bdesc.dwSize = sizeof(bdesc);
+        bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+        playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+        bdesc.lpwfxFormat = &waveformat;
+        if (FAILED(res = IDirectSound_CreateSoundBuffer(dsplay, &bdesc, &playbuf, NULL))) {
+                lprintf(0, "CreateSoundBuffer error %lu\n", res);
+                goto errdscreate3;
+        }
+	cfg->bitrate = 8000;
+	if ((i = adapter_start_eppsamp(cfg))) {
+		retval = i;
+		goto errdscreate4;
+	}
+	phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + 8000 / 2) / 8000;
+	phincdspepp = ((1 << PHASEFRAC) * 8000 + cfg->bitrate / 2) / cfg->bitrate;
+	lprintf(1, "epp->dsp phase inc: 0x%05x  dsp->epp phase inc: 0x%05x\n", phinceppdsp, phincdspepp);
+	tprintf("Audio IO to DirectX\n");
+	/* reset the EPP adapter */
+	bufu[0] = 7;
+	bufu[1] = 0;
+	if (parport_epp_write_addr(bufu, 2) != 2)
+		goto errret;
+	/* prefill EPP adapter to nominal queue size */
+	memset(bufs, 0, SNDLATENCY);
+	if (parport_epp_write_data(bufs, SNDLATENCY) != SNDLATENCY)
+		goto errret;
+	/* prefill to nominal queue size and stard soundcard */
+	if (FAILED(res = IDirectSoundBuffer_Lock(playbuf, 0, SNDLATENCY, (LPVOID)&uptr, &lockbytes, NULL, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+                goto errresmodem;
+        }
+	memset(uptr, 0x80, SNDLATENCY);
+	if (FAILED(res = IDirectSoundBuffer_Unlock(playbuf, uptr, lockbytes, NULL, 0))) {
+                lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+                goto errresmodem;
+        }
+	playptr = SNDLATENCY;
+	if (FAILED(res = IDirectSoundBuffer_Play(playbuf, 0, 0, DSBPLAY_LOOPING))) {
+                lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+                goto errresmodem;
+        }
+	if (FAILED(res = IDirectSoundCaptureBuffer_Start(recbuf, DSCBSTART_LOOPING))) {
+                lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+                goto errresmodem;
+        }
+	/* start the whole thing */
+	for (;;) {
+		/* first do the epp->dsp direction */
+		/* get FIFO count */
+		bufu[0] = ctrl | 1;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(bufu, 2) != 2)
+			goto errret;
+		icnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+		bufu[0] = ctrl;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		icnt &= 0x7fff;
+		if (icnt > 0) {
+			if (icnt > sizeof(bufs)/2)
+				icnt = sizeof(bufs)/2;
+			if (parport_epp_read_data(bufs, icnt) != icnt)
+				goto errret;
+			pheppdsp &= PHASEMASK;
+			/* write to direct sound and convert */
+			if (FAILED(res = IDirectSoundBuffer_Lock(playbuf, playptr, SNDLATENCY, (LPVOID)&uptr, &lockbytes,
+								 (LPVOID)&uptr2, &lockbytes2, 0))) {
+				lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+				goto errresmodem;
+			}
+			uptr3 = uptr;
+			while (pheppdsp < (icnt << PHASEFRAC)) {
+				*uptr3++ = bufs[pheppdsp >> PHASEFRAC] + 128;
+				pheppdsp += phinceppdsp;
+				playptr++;
+				if (playptr >= playbufsz) {
+					playptr = 0;
+					uptr3 = uptr2;
+				}
+			}
+			if (FAILED(res = IDirectSoundBuffer_Unlock(playbuf, uptr, lockbytes, uptr2, lockbytes2))) {
+				lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+				goto errresmodem;
+			}
+			/* get output delay */
+			if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(playbuf, &delay, NULL))) {
+				lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+				goto errresmodem;
+			}
+			delay = (playbufsz + playptr - delay) % playbufsz;
+			/* adjust speed */
+			lprintf(4, "icnt %d cnt %d odel %u\n", icnt, cnt, delay);
+			if (delay > SNDLATENCY)
+				phinceppdsp++;
+			else if (delay < SNDLATENCY)
+				phinceppdsp--;
+			if (phinceppdsp < (0x9 << (PHASEFRAC-4)) || phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+				lprintf(0, "phinceppdsp (0x%05x) out of range\n", phinceppdsp);
+				goto errresmodem;
+			}
+			/* play games with the LEDS */
+			ledcnt += icnt;
+			if (ledcnt >= 4000) {
+				ledcnt %= 4000;
+				ctrl += 0x40;
+			}
+		}
+		/* next do the dsp->epp direction */
+		/* get FIFO count */
+		bufu[0] = ctrl | 2;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(bufu, 2) != 2)
+			goto errret;
+		ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+		bufu[0] = ctrl;
+		if (parport_epp_write_addr(bufu, 1) != 1)
+			goto errret;
+		ocnt &= 0x7fff;
+		omax = 16384 - ocnt;
+		/* read sound */
+		if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(recbuf, &delay, NULL))) {
+			lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+			goto errresmodem;
+		}
+		ocnts = (recbufsz + delay - recptr) % recbufsz;
+		if (ocnts > 0) {
+			if (FAILED(res = IDirectSoundCaptureBuffer_Lock(recbuf, recptr, SNDLATENCY, (LPVOID)&uptr, &lockbytes,
+									(LPVOID)&uptr2, &lockbytes2, 0))) {
+				lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+				goto errresmodem;
+			}
+			uptr3 = uptr;
+			phdspepp &= PHASEMASK;
+			cnt = 0;
+			while (phdspepp < (ocnts << PHASEFRAC)) {
+				if (phdspepp >= ((recbufsz - recptr) << PHASEFRAC)) {
+					uptr3 = uptr2;
+					phdspepp -= (recbufsz - recptr) << PHASEFRAC;
+					recptr = 0;
+				}
+				bufs[cnt] = uptr3[phdspepp >> PHASEFRAC] - 128;
+				phdspepp += phincdspepp;
+				cnt++;
+			}
+			recptr = (recptr + (phdspepp >> PHASEFRAC)) % recbufsz;
+			if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(recbuf, uptr, lockbytes, uptr2, lockbytes2))) {
+				lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+				goto errresmodem;
+			}
+			if (cnt > omax) {
+				lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+				goto errresmodem;
+			}
+#ifdef SINEOVERLAY
+			for (i = 0; i < cnt; i++) {
+				bufs[i] += sine[(phase >> 9) & 0x7f];
+				phase += 0x1789;  /* pretty arbitrary */
+			}
+#endif
+			if (parport_epp_write_data(bufs, cnt) != cnt)
+				goto errret;
+			/* reget the FIFO count */
+			bufu[0] = ctrl | 2;
+			if (parport_epp_write_addr(bufu, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(bufu, 2) != 2)
+				goto errret;
+			ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+			bufu[0] = ctrl;
+			if (parport_epp_write_addr(bufu, 1) != 1)
+				goto errret;
+			ocnt &= 0x7fff;
+			/* adjust speed */
+			lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+			if (ocnt > SNDLATENCY)
+				phincdspepp++;
+			else if (ocnt < SNDLATENCY)
+				phincdspepp--;
+			if (phincdspepp < (0x9 << (PHASEFRAC-4)) || phincdspepp > (0x1f << (PHASEFRAC-4))) {
+				lprintf(0, "phincdspepp (0x%05x) out of range\n", phincdspepp);
+				goto errresmodem;
+			}
+		}
+		/* wait a bit */
+		if (idle_callback(50000)) {
+			reset_modem();
+			retval = 0;
+			goto errresmodem;
+		}
+		lprintf(1, "phase increments: 0x%05x 0x%05x\n", phinceppdsp, phincdspepp);
+	}
+
+errret:
+	lprintf(0, "EPP timeout\n");
+errresmodem:
+	IDirectSoundBuffer_Stop(playbuf);
+	IDirectSoundCaptureBuffer_Stop(recbuf);
+	reset_modem();
+errdscreate4:
+	IDirectSoundBuffer_Release(playbuf);
+errdscreate3:
+	IDirectSoundCaptureBuffer_Release(recbuf);
+errdscreate2:
+	IDirectSoundCapture_Release(dsrec);
+errdscreate1:
+	IDirectSound_Release(dsplay);
+errdscreate:
+	DestroyWindow(hwnd);
+errcreatewin:
+	UnregisterClass("MyClass", hinst);
+	return -1;
+}
+
+#endif /* HAVE_DIRECTX */
+
+/* ---------------------------------------------------------------------- */
+
+const struct eppfpgatests eppfpgatests[] = {
+	{ "ram", "tests the on board SRAM", ramtest },
+	{ "bled", "tests the on board LED's using boundary scan", ledtest },
+	{ "dac", "tests the on board DAC", dactest },
+	{ "ppsig", "tests the parallel port signals using boundary scan", ppsigtest },
+	{ "led", "tests the CON and STA leds using EPP address write", eppledtest },
+	{ "ledfast", "tests the CON and STA leds using fast EPP address write", eppledtest2 },
+	{ "berr", "tests the complete adapter", eppmodemtest1 },
+	{ "berrv", "tests the complete adapter (verbose)", eppmodemtest2 },
+	{ "berrd", "tests the complete adapter (exercises data transfer)", eppmodemtest3 },
+	{ "berrdv", "tests the complete adapter (exercises data transfer, verbose)", eppmodemtest4 },
+	{ "ccnt", "frequency counter using the check firmware", chkcountertest },
+	{ "cdac", "fast DAC test using the check firmware", chkdactest },
+	{ "creg", "EPP register read/write test using the check firmware", chkregtest },
+	{ "cram", "fast RAM test using the check firmware", chkramtest },
+	{ "cled", "LED test using the check firmware", chkledtest },
+	{ "cadc", "tests the sigma delta A/D converter", chkadctest },
+	{ "ecpled", "tests the CON and STA leds using ECP write", ecpledtest },
+	{ "ecpledfast", "tests the CON and STA leds using fast ECP write", ecpledtest2 },
+	{ "ecpberr", "tests the complete adapter in ECP mode", ecpmodemtest1 },
+	{ "ecpberrv", "tests the complete adapter in ECP mode (verbose)", ecpmodemtest2 },
+	{ "ecpberrd", "tests the complete adapter in ECP mode (exercises data transfer)", ecpmodemtest3 },
+	{ "ecpberrdv", "tests the complete adapter in ECP mode (exercises data transfer, verbose)", ecpmodemtest4 },
+	{ "eppafskled", "tests the CON and STA leds using EPP address write", eppafskledtest },
+	{ "eppafskledfast", "tests the CON and STA leds using fast EPP address write", eppafskledtest2 },
+	{ "eppafskberr", "tests the complete adapter", eppafskmodemtest1 },
+	{ "eppafskberrv", "tests the complete adapter (verbose)", eppafskmodemtest2 },
+	{ "eppafskberrd", "tests the complete adapter (exercises data transfer)", eppafskmodemtest3 },
+	{ "eppafskberrdv", "tests the complete adapter (exercises data transfer, verbose)", eppafskmodemtest4 },
+	{ "eppafsktx0", "transmit AFSK 0 constantly", eppafskmodemtest5 },
+	{ "eppafsktx1", "transmit AFSK 1 constantly", eppafskmodemtest6 },
+	{ "sppafskled", "tests the CON and STA leds using EPP address write", sppafskledtest },
+	{ "sppafskledfast", "tests the CON and STA leds using fast EPP address write", sppafskledtest2 },
+	{ "sppafskberr", "tests the complete adapter", sppafskmodemtest1 },
+	{ "sppafskberrv", "tests the complete adapter (verbose)", sppafskmodemtest2 },
+	{ "sppafskberrd", "tests the complete adapter (exercises data transfer)", sppafskmodemtest3 },
+	{ "sppafskberrdv", "tests the complete adapter (exercises data transfer, verbose)", sppafskmodemtest4 },
+	{ "sppafsktx0", "transmit AFSK 0 constantly", sppafskmodemtest5 },
+	{ "sppafsktx1", "transmit AFSK 1 constantly", sppafskmodemtest6 },
+	{ "epprx", "decodes received packets using EPP mode", epprx },
+	{ "ecprx", "decodes received packets using ECP mode", ecprx },
+	{ "eppafskrx", "decodes received packets using EPP AFSK mode", eppafskrx },
+	{ "sppafskrx", "decodes received packets using SPP AFSK mode", sppafskrx },
+	{ "sine1k", "generate approx 1k sine using the sample IO firmware", sine1k },
+#if defined(HAVE_LINUX_SOUNDCARD_H) || defined(HAVE_DIRECTX)
+	{ "saudio", "generate approx 1k sine using the sample IO firmware", saudio },
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+	{ NULL, NULL, NULL }
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/getopt.c b/main/getopt.c
new file mode 100644
index 0000000..a59a013
--- /dev/null
+++ b/main/getopt.c
@@ -0,0 +1,731 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to roland at gnu.ai.mit.edu
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+   	Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+

+/* NOTE!!!  AIX requires this to be the first thing in the file.
+   Do not put ANYTHING before it!  */
+#if !defined (__GNUC__) && defined (_AIX)
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__))))
+#include <alloca.h>
+#else
+#ifndef _AIX
+char *alloca ();
+#endif
+#endif /* alloca.h */
+#endif /* not __GNUC__ */
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.  */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef	__GNU_LIBRARY__
+#undef	alloca
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#else	/* Not GNU C library.  */
+#define	__alloca	alloca
+#endif	/* GNU C library.  */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+   long-named option.  Because this is not POSIX.2 compliant, it is
+   being phased out.  */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* XXX 1003.2 says this must be 1 before any call.  */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return EOF with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+

+#ifdef	__GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+#include <string.h>
+#define	my_index	strchr
+#define	my_bcopy(src, dst, n)	memcpy ((dst), (src), (n))
+#else
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+	return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+static void
+my_bcopy (from, to, size)
+     const char *from;
+     char *to;
+     int size;
+{
+  int i;
+  for (i = 0; i < size; i++)
+    to[i] = from[i];
+}
+#endif				/* GNU C library.  */
+

+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
+  char **temp = (char **) __alloca (nonopts_size);
+
+  /* Interchange the two blocks of data in ARGV.  */
+
+  my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size);
+  my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt],
+	    (optind - last_nonopt) * sizeof (char *));
+  my_bcopy ((char *) temp,
+	    (char *) &argv[first_nonopt + optind - last_nonopt],
+	    nonopts_size);
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+

+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns `EOF'.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  int option_index;
+
+  optarg = 0;
+
+  /* Initialize the internal data when the first call is made.
+     Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  if (optind == 0)
+    {
+      first_nonopt = last_nonopt = optind = 1;
+
+      nextchar = NULL;
+
+      /* Determine how to handle the ordering of options and nonoptions.  */
+
+      if (optstring[0] == '-')
+	{
+	  ordering = RETURN_IN_ORDER;
+	  ++optstring;
+	}
+      else if (optstring[0] == '+')
+	{
+	  ordering = REQUIRE_ORDER;
+	  ++optstring;
+	}
+      else if (getenv ("POSIXLY_CORRECT") != NULL)
+	ordering = REQUIRE_ORDER;
+      else
+	ordering = PERMUTE;
+    }
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      if (ordering == PERMUTE)
+	{
+	  /* If we have just processed some options following some non-options,
+	     exchange them so that the options come first.  */
+
+	  if (first_nonopt != last_nonopt && last_nonopt != optind)
+	    exchange ((char **) argv);
+	  else if (last_nonopt != optind)
+	    first_nonopt = optind;
+
+	  /* Now skip any additional non-options
+	     and extend the range of non-options previously skipped.  */
+
+	  while (optind < argc
+		 && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+		 && (longopts == NULL
+		     || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif				/* GETOPT_COMPAT */
+		 )
+	    optind++;
+	  last_nonopt = optind;
+	}
+
+      /* Special ARGV-element `--' means premature end of options.
+	 Skip it like a null option,
+	 then exchange with previous non-options as if it were an option,
+	 then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+	{
+	  optind++;
+
+	  if (first_nonopt != last_nonopt && last_nonopt != optind)
+	    exchange ((char **) argv);
+	  else if (first_nonopt == last_nonopt)
+	    first_nonopt = optind;
+	  last_nonopt = argc;
+
+	  optind = argc;
+	}
+
+      /* If we have done all the ARGV-elements, stop the scan
+	 and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+	{
+	  /* Set the next-arg-index to point at the non-options
+	     that we previously skipped, so the caller will digest them.  */
+	  if (first_nonopt != last_nonopt)
+	    optind = first_nonopt;
+	  return EOF;
+	}
+
+      /* If we have come to a non-option and did not permute it,
+	 either stop the scan or describe it to the caller and pass it by.  */
+
+      if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+	  && (longopts == NULL
+	      || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif				/* GETOPT_COMPAT */
+	  )
+	{
+	  if (ordering == REQUIRE_ORDER)
+	    return EOF;
+	  optarg = argv[optind++];
+	  return 1;
+	}
+
+      /* We have found another option-ARGV-element.
+	 Start decoding its characters.  */
+
+      nextchar = (argv[optind] + 1
+		  + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  if (longopts != NULL
+      && ((argv[optind][0] == '-'
+	   && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+	  || argv[optind][0] == '+'
+#endif				/* GETOPT_COMPAT */
+	  ))
+    {
+      const struct option *p;
+      char *s = nextchar;
+      int exact = 0;
+      int ambig = 0;
+      const struct option *pfound = NULL;
+      int indfound;
+
+      while (*s && *s != '=')
+	s++;
+
+      /* Test all options for either exact match or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name;
+	   p++, option_index++)
+	if (!strncmp (p->name, nextchar, s - nextchar))
+	  {
+	    if (s - nextchar == strlen (p->name))
+	      {
+		/* Exact match found.  */
+		pfound = p;
+		indfound = option_index;
+		exact = 1;
+		break;
+	      }
+	    else if (pfound == NULL)
+	      {
+		/* First nonexact match found.  */
+		pfound = p;
+		indfound = option_index;
+	      }
+	    else
+	      /* Second nonexact match found.  */
+	      ambig = 1;
+	  }
+
+      if (ambig && !exact)
+	{
+	  if (opterr)
+	    fprintf (stderr, "%s: option `%s' is ambiguous\n",
+		     argv[0], argv[optind]);
+	  nextchar += strlen (nextchar);
+	  optind++;
+	  return '?';
+	}
+
+      if (pfound != NULL)
+	{
+	  option_index = indfound;
+	  optind++;
+	  if (*s)
+	    {
+	      /* Don't test has_arg with >, because some C compilers don't
+		 allow it to be used on enums.  */
+	      if (pfound->has_arg)
+		optarg = s + 1;
+	      else
+		{
+		  if (opterr)
+		    {
+		      if (argv[optind - 1][1] == '-')
+			/* --option */
+			fprintf (stderr,
+				 "%s: option `--%s' doesn't allow an argument\n",
+				 argv[0], pfound->name);
+		      else
+			/* +option or -option */
+			fprintf (stderr,
+			     "%s: option `%c%s' doesn't allow an argument\n",
+			     argv[0], argv[optind - 1][0], pfound->name);
+		    }
+		  nextchar += strlen (nextchar);
+		  return '?';
+		}
+	    }
+	  else if (pfound->has_arg == 1)
+	    {
+	      if (optind < argc)
+		optarg = argv[optind++];
+	      else
+		{
+		  if (opterr)
+		    fprintf (stderr, "%s: option `%s' requires an argument\n",
+			     argv[0], argv[optind - 1]);
+		  nextchar += strlen (nextchar);
+		  return optstring[0] == ':' ? ':' : '?';
+		}
+	    }
+	  nextchar += strlen (nextchar);
+	  if (longind != NULL)
+	    *longind = option_index;
+	  if (pfound->flag)
+	    {
+	      *(pfound->flag) = pfound->val;
+	      return 0;
+	    }
+	  return pfound->val;
+	}
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+	 or the option starts with '--' or is not a valid short
+	 option, then it's an error.
+	 Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+	  || argv[optind][0] == '+'
+#endif				/* GETOPT_COMPAT */
+	  || my_index (optstring, *nextchar) == NULL)
+	{
+	  if (opterr)
+	    {
+	      if (argv[optind][1] == '-')
+		/* --option */
+		fprintf (stderr, "%s: unrecognized option `--%s'\n",
+			 argv[0], nextchar);
+	      else
+		/* +option or -option */
+		fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+			 argv[0], argv[optind][0], nextchar);
+	    }
+	  nextchar = (char *) "";
+	  optind++;
+	  return '?';
+	}
+    }
+
+  /* Look at and handle the next option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+	if (opterr)
+	  {
+#if 0
+	    if (c < 040 || c >= 0177)
+	      fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+		       argv[0], c);
+	    else
+	      fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+	    /* 1003.2 specifies the format of this message.  */
+	    fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+	  }
+	optopt = c;
+	return '?';
+      }
+    if (temp[1] == ':')
+      {
+	if (temp[2] == ':')
+	  {
+	    /* This is an option that accepts an argument optionally.  */
+	    if (*nextchar != '\0')
+	      {
+		optarg = nextchar;
+		optind++;
+	      }
+	    else
+	      optarg = 0;
+	    nextchar = NULL;
+	  }
+	else
+	  {
+	    /* This is an option that requires an argument.  */
+	    if (*nextchar != '\0')
+	      {
+		optarg = nextchar;
+		/* If we end this ARGV-element by taking the rest as an arg,
+		   we must advance to the next element now.  */
+		optind++;
+	      }
+	    else if (optind == argc)
+	      {
+		if (opterr)
+		  {
+#if 0
+		    fprintf (stderr, "%s: option `-%c' requires an argument\n",
+			     argv[0], c);
+#else
+		    /* 1003.2 specifies the format of this message.  */
+		    fprintf (stderr, "%s: option requires an argument -- %c\n",
+			     argv[0], c);
+#endif
+		  }
+		optopt = c;
+		if (optstring[0] == ':')
+		  c = ':';
+		else
+		  c = '?';
+	      }
+	    else
+	      /* We already incremented `optind' once;
+		 increment it again when taking next ARGV-elt as argument.  */
+	      optarg = argv[optind++];
+	    nextchar = NULL;
+	  }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+			   (const struct option *) 0,
+			   (int *) 0,
+			   0);
+}
+
+#endif	/* _LIBC or not __GNU_LIBRARY__.  */
+

+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == EOF)
+	break;
+
+      switch (c)
+	{
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value `%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/main/getopt.h b/main/getopt.h
new file mode 100644
index 0000000..45541f5
--- /dev/null
+++ b/main/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument		(or 0) if the option does not take an argument,
+   required_argument	(or 1) if the option requires an argument,
+   optional_argument 	(or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if	__STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define	no_argument		0
+#define required_argument	1
+#define optional_argument	2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+		        const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+			     const char *shortopts,
+		             const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+			     const char *shortopts,
+		             const struct option *longopts, int *longind,
+			     int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/main/getopt1.c b/main/getopt1.c
new file mode 100644
index 0000000..a32615c
--- /dev/null
+++ b/main/getopt1.c
@@ -0,0 +1,176 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+	Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+

+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "getopt.h"
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef	NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif	/* _LIBC or not __GNU_LIBRARY__.  */
+

+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+	{"add", 1, 0, 0},
+	{"append", 0, 0, 0},
+	{"delete", 1, 0, 0},
+	{"verbose", 0, 0, 0},
+	{"create", 0, 0, 0},
+	{"file", 1, 0, 0},
+	{0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+		       long_options, &option_index);
+      if (c == EOF)
+	break;
+
+      switch (c)
+	{
+	case 0:
+	  printf ("option %s", long_options[option_index].name);
+	  if (optarg)
+	    printf (" with arg %s", optarg);
+	  printf ("\n");
+	  break;
+
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value `%s'\n", optarg);
+	  break;
+
+	case 'd':
+	  printf ("option d with value `%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/main/openpty.c b/main/openpty.c
new file mode 100644
index 0000000..7948e7f
--- /dev/null
+++ b/main/openpty.c
@@ -0,0 +1,88 @@
+/*****************************************************************************/
+
+/*
+ *      openpty.c  -- openpty.
+ *
+ *      From glibc2, Copyright (C) Free Software Foundation
+ *      Modified by Thomas Sailer, sailer at ife.ee.ethz.ch
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <errno.h>
+
+int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp)
+{
+        char line[11];
+        const char *cp1, *cp2;
+        int master, slave, ttygid;
+        struct group *gr;
+
+        strcpy (line, "/dev/ptyXX");
+	if (gr = getgrnam("tty"))
+                ttygid = gr->gr_gid;
+        else
+                ttygid = -1;
+        for (cp1 = "pqrs"; *cp1; cp1++) {
+                line[8] = *cp1;
+                for (cp2 = "0123456789abcdef"; *cp2; cp2++) {
+                        line[9] = *cp2;
+                        if ((master = open(line, O_RDWR, 0)) == -1) {
+                                if (errno == ENOENT)
+                                        return (-1);    /* out of ptys */
+                        } else {
+                                line[5] = 't';
+                                (void)chown(line, getuid(), ttygid);
+                                (void)chmod(line, S_IRUSR|S_IWUSR|S_IWGRP);
+#ifdef HAVE_REVOKE
+                                revoke(line);
+#endif
+                                if ((slave = open(line, O_RDWR, 0)) != -1) {
+                                        *amaster = master;
+                                        *aslave = slave;
+                                        if (name)
+                                                strcpy(name, line);
+                                        if (termp)
+                                                (void)tcsetattr(slave, TCSAFLUSH, termp);
+                                        if (winp)
+                                                (void)ioctl(slave, TIOCSWINSZ, (char *)winp);
+                                        return 0;
+                                }
+                                (void)close(master);
+                                line[5] = 'p';
+                        }
+                }
+        }
+        errno = ENOENT;   /* out of ptys */
+        return -1;
+}
diff --git a/main/parport.h b/main/parport.h
new file mode 100644
index 0000000..03c2fcc
--- /dev/null
+++ b/main/parport.h
@@ -0,0 +1,217 @@
+/*****************************************************************************/
+
+/*
+ *      parport.h  -- FPGA test library exports (and imports).
+ *
+ *      Copyright (C) 1998, 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _PARPORT_H
+#define _PARPORT_H
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "sysdeps.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT control register */
+#define LPTCTRL_PROGRAM       0x04   /* 0 to reprogram */
+#define LPTCTRL_WRITE         0x01
+#define LPTCTRL_ADDRSTB       0x08
+#define LPTCTRL_DATASTB       0x02
+#define LPTCTRL_INTEN         0x10
+#define LPTCTRL_DIRECTION     0x20
+
+/* LPT status register */
+#define LPTSTAT_SHIFT_NINTR   6
+#define LPTSTAT_WAIT          0x80
+#define LPTSTAT_NINTR         (1<<LPTSTAT_SHIFT_NINTR)
+#define LPTSTAT_PE            0x20
+#define LPTSTAT_DONE          0x10
+#define LPTSTAT_NERROR        0x08
+#define LPTSTAT_EPPTIMEOUT    0x01
+
+/* ECP device status register */
+#define LPTDSR_PERIPHACK      0x80  /* inv */
+#define LPTDSR_NACK           0x40  /* noninv */
+#define LPTDSR_NACKREVERSE    0x20  /* noninv */
+#define LPTDSR_SELECT         0x10  /* noninv */
+#define LPTDSR_NPERIPHREQ     0x08  /* noninv */
+
+/* ECP device control register */
+#define LPTDCR_DIRECTION      0x20  /* reverse dir when set */
+#define LPTDCR_ACKINTEN       0x10  /* enable int on rising edge of nAck */
+#define LPTDCR_1284MODE       0x08  /* inv */
+#define LPTDCR_NREVERSEREQ    0x04  /* noninv */
+#define LPTDCR_HOSTACK        0x02  /* inv */
+#define LPTDCR_STROBE         0x01  /* inv */
+
+/* EPP status register */
+#define EPP_DCDBIT      0x80
+#define EPP_PTTBIT      0x08
+#define EPP_NREF        0x01
+#define EPP_NRAEF       0x02
+#define EPP_NRHF        0x04
+#define EPP_NTHF        0x20
+#define EPP_NTAEF       0x10
+#define EPP_NTEF        EPP_PTTBIT
+
+/* EPP control register */
+#define EPP_TX_FIFO_ENABLE 0x10
+#define EPP_RX_FIFO_ENABLE 0x08
+#define EPP_MODEM_ENABLE   0x20
+#define EPP_LED_STA        0x80
+#define EPP_LED_CON        0x40
+#define EPP_LEDS           (EPP_LED_STA|EPP_LED_CON)
+#define EPP_IRQ_ENABLE     0x10
+
+#define PARPORT_CONTROL_STROBE    0x1
+#define PARPORT_CONTROL_AUTOFD    0x2
+#define PARPORT_CONTROL_INIT      0x4
+#define PARPORT_CONTROL_SELECT    0x8
+#define PARPORT_CONTROL_INTEN     0x10
+#define PARPORT_CONTROL_DIRECTION 0x20
+
+#define PARPORT_STATUS_ERROR      0x8
+#define PARPORT_STATUS_SELECT     0x10
+#define PARPORT_STATUS_PAPEROUT   0x20
+#define PARPORT_STATUS_ACK        0x40
+#define PARPORT_STATUS_BUSY       0x80
+
+/* ---------------------------------------------------------------------- */
+
+/* change mode constants */
+
+#define PARPORT_MODE_PCSPP              (1<<0)
+#define PARPORT_MODE_PCPS2              (1<<1)
+#define PARPORT_MODE_PCEPP              (1<<2)
+#define PARPORT_MODE_PCECR              (1<<3)  /* ECR Register Exists */
+#define PARPORT_MODE_PCECP              (1<<4)
+#define PARPORT_MODE_PCECPEPP           (1<<5)
+#define PARPORT_MODE_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+struct parport_ops {
+	unsigned char (*parport_read_data)(void);
+	void (*parport_write_data)(unsigned char d);
+	unsigned char (*parport_read_status)(void);
+	unsigned char (*parport_read_control)(void);
+	void (*parport_write_control)(unsigned char d);
+	void (*parport_frob_control)(unsigned char mask, unsigned char val);
+	unsigned (*parport_epp_write_data)(const void *buf, unsigned sz);
+	unsigned (*parport_epp_read_data)(void *buf, unsigned sz);
+	unsigned (*parport_epp_write_addr)(const void *buf, unsigned sz);
+	unsigned (*parport_epp_read_addr)(void *buf, unsigned sz);
+	unsigned (*parport_ecp_write_data)(const void *buf, unsigned sz);
+	unsigned (*parport_ecp_read_data)(void *buf, unsigned sz);
+	unsigned (*parport_ecp_write_addr)(const void *buf, unsigned sz);
+	unsigned (*parport_fpgaconfig_write)(const void *buf, unsigned sz);
+};
+
+extern struct parport_ops parport_ops;
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned char parport_read_data(void) {
+	return parport_ops.parport_read_data();
+}
+
+extern inline void parport_write_data(unsigned char d) {
+	parport_ops.parport_write_data(d);
+}
+
+extern inline unsigned char parport_read_status(void) {
+	return parport_ops.parport_read_status();
+}
+
+extern inline unsigned char parport_read_control(void) {
+	return parport_ops.parport_read_control();
+}
+
+extern inline void parport_write_control(unsigned char d) {
+	parport_ops.parport_write_control(d);
+}
+
+extern inline void parport_frob_control(unsigned char mask, unsigned char val) {
+	parport_ops.parport_frob_control(mask, val);
+}
+
+extern inline unsigned parport_epp_write_data(const void *buf, unsigned sz) {
+	return parport_ops.parport_epp_write_data(buf, sz);
+}
+
+extern inline unsigned parport_epp_read_data(void *buf, unsigned sz) {
+	return parport_ops.parport_epp_read_data(buf, sz);
+}
+
+extern inline unsigned parport_epp_write_addr(const void *buf, unsigned sz) {
+	return parport_ops.parport_epp_write_addr(buf, sz);
+}
+
+extern inline unsigned parport_epp_read_addr(void *buf, unsigned sz) {
+	return parport_ops.parport_epp_read_addr(buf, sz);
+}
+
+extern inline unsigned parport_ecp_write_data(const void *buf, unsigned sz) {
+	return parport_ops.parport_ecp_write_data(buf, sz);
+}
+
+extern inline unsigned parport_ecp_read_data(void *buf, unsigned sz) {
+	return parport_ops.parport_ecp_read_data(buf, sz);
+}
+
+extern inline unsigned parport_ecp_write_addr(const void *buf, unsigned sz) {
+	return parport_ops.parport_ecp_write_addr(buf, sz);
+}
+
+extern inline unsigned parport_fpgaconfig_write(const void *buf, unsigned sz) {
+	return parport_ops.parport_fpgaconfig_write(buf, sz);
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define PPFLAG_SWEMULEPP   1
+#define PPFLAG_SWEMULECP   2
+#define PPFLAG_FORCEHWEPP  4
+
+extern int parport_init_direct(unsigned io);
+extern int parport_init_direct_flags(unsigned io, unsigned int flags);
+extern int parport_init_ppuser(const char *path);
+extern int parport_init_ppdev(const char *path);
+extern int parport_init_ppkdrv(const char *ifname);
+extern int parport_init_ntddkgenport(void);
+extern int parport_init_win(unsigned int portnr);        
+extern int parport_init_win_flags(unsigned int portnr, unsigned int flags);
+extern void parport_stop_win(void);
+extern int parport_init_w9xring0(unsigned int portnr);        
+extern int parport_init_w9xring0_flags(unsigned int portnr, unsigned int flags);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _PARPORT_H */
diff --git a/main/ppdev.c b/main/ppdev.c
new file mode 100644
index 0000000..290eab8
--- /dev/null
+++ b/main/ppdev.c
@@ -0,0 +1,235 @@
+/*****************************************************************************/
+
+/*
+ *      ppdev.c  -- Parport access via Linux PPDEV device.
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppdev.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_dev_fd = -1;
+int pp_dev_mode;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_dev_exit(void)
+{
+	if (pp_dev_fd != -1) {
+		ioctl(pp_dev_fd, PPRELEASE, 0);
+		close(pp_dev_fd);
+	}
+	pp_dev_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void setmode(int newmode)
+{
+	int datadir = 0;
+
+	if (newmode == pp_dev_mode)
+		return;
+	pp_dev_mode = newmode;
+	ioctl(pp_dev_fd, PPSETMODE, &pp_dev_mode);
+	if (pp_dev_mode == IEEE1284_MODE_COMPAT)
+		ioctl(pp_dev_fd, PPDATADIR, &datadir);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_dev_read_data(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_dev_fd, PPRDATA, &r);
+	return r;
+}
+
+void parport_dev_write_data(unsigned char d)
+{
+	setmode(IEEE1284_MODE_COMPAT);
+	ioctl(pp_dev_fd, PPWDATA, &d);
+}
+
+unsigned char parport_dev_read_status(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_dev_fd, PPRSTATUS, &r);
+	return r;
+}
+
+
+unsigned char parport_dev_read_control(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_dev_fd, PPRCONTROL, &r);
+	return r;
+}
+
+void parport_dev_write_control(unsigned char d)
+{
+	ioctl(pp_dev_fd, PPWCONTROL, &d);
+}
+
+void parport_dev_frob_control(unsigned char mask, unsigned char val)
+{
+	struct ppdev_frob_struct f = { mask, val };
+
+	ioctl(pp_dev_fd, PPFCONTROL, &f);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_epp_write_data(const void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_EPP | IEEE1284_DATA);
+	ret = write(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+unsigned parport_dev_epp_read_data(void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_EPP | IEEE1284_DATA);
+	ret = read(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+unsigned parport_dev_epp_write_addr(const void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_EPP | IEEE1284_ADDR);
+	ret = write(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+unsigned parport_dev_epp_read_addr(void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_EPP | IEEE1284_ADDR);
+	ret = read(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_ecp_write_data(const void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_ECP | IEEE1284_DATA);
+	ret = write(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+unsigned parport_dev_ecp_write_addr(const void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_ECP | IEEE1284_ADDR);
+	ret = write(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+unsigned parport_dev_ecp_read_data(void *buf, unsigned sz)
+{
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_ECP | IEEE1284_DATA);
+	ret = read(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_fpgaconfig_write(const void *buf, unsigned sz)
+{
+#if 1
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		parport_dev_write_data(*bp);
+	return sz;
+#else
+	ssize_t ret;
+
+	setmode(IEEE1284_MODE_COMPAT);
+	ret = write(pp_dev_fd, buf, sz);
+	if (ret < 0)
+		return 0;
+	return ret;
+#endif
+}
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_dev_ops = {
+	parport_dev_read_data,
+	parport_dev_write_data,
+	parport_dev_read_status,
+	parport_dev_read_control,
+	parport_dev_write_control,
+	parport_dev_frob_control,
+	parport_dev_epp_write_data,
+	parport_dev_epp_read_data,
+	parport_dev_epp_write_addr,
+	parport_dev_epp_read_addr,
+	parport_dev_ecp_write_data,
+	parport_dev_ecp_read_data,
+	parport_dev_ecp_write_addr,
+	parport_dev_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppdev.h b/main/ppdev.h
new file mode 100644
index 0000000..4de2f79
--- /dev/null
+++ b/main/ppdev.h
@@ -0,0 +1,102 @@
+/*
+ * linux/drivers/char/ppdev.h
+ *
+ * User-space parallel port device driver (header file).
+ *
+ * Copyright (C) 1998-9 Tim Waugh <tim at cyberelk.demon.co.uk>
+ *
+ * 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 of the License, or (at your option) any later version.
+ *
+ */
+
+#define PP_MAJOR	99
+
+#define PP_IOCTL	'p'
+
+/* Set mode for read/write (e.g. IEEE1284_MODE_EPP) */
+#define PPSETMODE	_IOW(PP_IOCTL, 0x80, int)
+
+/* Read status */
+#define PPRSTATUS	_IOR(PP_IOCTL, 0x81, unsigned char)
+#define PPWSTATUS	OBSOLETE__IOW(PP_IOCTL, 0x82, unsigned char)
+
+/* Read/write control */
+#define PPRCONTROL	_IOR(PP_IOCTL, 0x83, unsigned char)
+#define PPWCONTROL	_IOW(PP_IOCTL, 0x84, unsigned char)
+
+struct ppdev_frob_struct {
+	unsigned char mask;
+	unsigned char val;
+};
+#define PPFCONTROL      _IOW(PP_IOCTL, 0x8e, struct ppdev_frob_struct)
+
+/* Read/write data */
+#define PPRDATA		_IOR(PP_IOCTL, 0x85, unsigned char)
+#define PPWDATA		_IOW(PP_IOCTL, 0x86, unsigned char)
+
+/* Read/write econtrol (not used) */
+#define PPRECONTROL	OBSOLETE__IOR(PP_IOCTL, 0x87, unsigned char)
+#define PPWECONTROL	OBSOLETE__IOW(PP_IOCTL, 0x88, unsigned char)
+
+/* Read/write FIFO (not used) */
+#define PPRFIFO		OBSOLETE__IOR(PP_IOCTL, 0x89, unsigned char)
+#define PPWFIFO		OBSOLETE__IOW(PP_IOCTL, 0x8a, unsigned char)
+
+/* Claim the port to start using it */
+#define PPCLAIM		_IO(PP_IOCTL, 0x8b)
+
+/* Release the port when you aren't using it */
+#define PPRELEASE	_IO(PP_IOCTL, 0x8c)
+
+/* Yield the port (release it if another driver is waiting,
+ * then reclaim) */
+#define PPYIELD		_IO(PP_IOCTL, 0x8d)
+
+/* Register device exclusively (must be before PPCLAIM). */
+#define PPEXCL		_IO(PP_IOCTL, 0x8f)
+
+/* Data line direction: non-zero for input mode. */
+#define PPDATADIR	_IOW(PP_IOCTL, 0x90, int)
+
+/* Negotiate a particular IEEE 1284 mode. */
+#define PPNEGOT		_IOW(PP_IOCTL, 0x91, int)
+
+/* IEEE1284 modes: 
+   Nibble mode, byte mode, ECP, ECPRLE and EPP are their own
+   'extensibility request' values.  Others are special.
+   'Real' ECP modes must have the IEEE1284_MODE_ECP bit set.  */
+#define IEEE1284_MODE_NIBBLE             0
+#define IEEE1284_MODE_BYTE              (1<<0)
+#define IEEE1284_MODE_COMPAT            (1<<8)
+#define IEEE1284_MODE_BECP              (1<<9) /* Bounded ECP mode */
+#define IEEE1284_MODE_ECP               (1<<4)
+#define IEEE1284_MODE_ECPRLE            (IEEE1284_MODE_ECP | (1<<5))
+#define IEEE1284_MODE_ECPSWE            (1<<10) /* Software-emulated */
+#define IEEE1284_MODE_EPP               (1<<6)
+#define IEEE1284_MODE_EPPSL             (1<<11) /* EPP 1.7 */
+#define IEEE1284_MODE_EPPSWE            (1<<12) /* Software-emulated */
+#define IEEE1284_DEVICEID               (1<<2)  /* This is a flag */
+
+/* For the benefit of parport_read/write, you can use these with
+ * parport_negotiate to use address operations.  They have no effect
+ * other than to make parport_read/write use address transfers. */
+#define IEEE1284_ADDR			(1<<13)	/* This is a flag */
+#define IEEE1284_DATA			 0	/* So is this */
+
+/* IEEE1284 phases */
+enum ieee1284_phase {
+	IEEE1284_PH_FWD_DATA,
+	IEEE1284_PH_FWD_IDLE,
+	IEEE1284_PH_TERMINATE,
+	IEEE1284_PH_NEGOTIATION,
+	IEEE1284_PH_HBUSY_DNA,
+	IEEE1284_PH_REV_IDLE,
+	IEEE1284_PH_HBUSY_DAVAIL,
+	IEEE1284_PH_REV_DATA,
+	IEEE1284_PH_ECP_SETUP,
+	IEEE1284_PH_ECP_FWD_TO_REV,
+	IEEE1284_PH_ECP_REV_TO_FWD
+};
diff --git a/main/ppdevinit.c b/main/ppdevinit.c
new file mode 100644
index 0000000..0a23fee
--- /dev/null
+++ b/main/ppdevinit.c
@@ -0,0 +1,97 @@
+/*****************************************************************************/
+
+/*
+ *      ppdevinit.c  -- Parport access via Linux PPDEV device (init routines).
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppdev.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_dev_fd;
+extern int pp_dev_mode;
+extern const struct parport_ops parport_dev_ops;
+extern void parport_dev_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppdev(const char *path)
+{
+	int datadir = 0;
+
+	if ((pp_dev_fd = open(path, O_RDWR | O_NONBLOCK)) == -1) {
+		lprintf(0, "Cannot open ppdev device %s (error %s)\n", path,
+			strerror(errno));
+		return -1;
+	}
+	if (ioctl(pp_dev_fd, PPEXCL, 0)) {
+		lprintf(0, "Cannot set exclusive mode on ppdev device %s (error %s)\n", path,
+			strerror(errno));
+		goto err;
+	}
+	if (ioctl(pp_dev_fd, PPCLAIM, 0)) {
+		lprintf(0, "Cannot claim ppdev device %s (error %s)\n", path,
+			strerror(errno));
+		goto err;
+	}
+	pp_dev_mode = IEEE1284_MODE_COMPAT;
+	if (ioctl(pp_dev_fd, PPSETMODE, &pp_dev_mode)) {
+		lprintf(0, "Cannot set mode on ppdev device %s (error %s)\n", path,
+			strerror(errno));
+		goto err;
+	}
+	if (ioctl(pp_dev_fd, PPDATADIR, &datadir)) {
+		lprintf(0, "Cannot set data direction on ppdev device %s (error %s)\n", path,
+			strerror(errno));
+		goto err;
+	}	
+	if (atexit(parport_dev_exit)) {
+		lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+		goto errrelease;
+	}
+	parport_ops = parport_dev_ops;
+	return 0;
+
+errrelease:
+	ioctl(pp_dev_fd, PPRELEASE, 0);
+err:
+	close(pp_dev_fd);
+	pp_dev_fd = -1;
+	return -1;
+}
diff --git a/main/ppdirect.c b/main/ppdirect.c
new file mode 100644
index 0000000..a2f8084
--- /dev/null
+++ b/main/ppdirect.c
@@ -0,0 +1,738 @@
+/*****************************************************************************/
+
+/*
+ *      ppdirect.c  -- Parport direct access.
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+unsigned int pp_direct_iobase = 0x378;
+unsigned int pp_direct_flags = 0;
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+	if (pp_direct_flags & FLAGS_PCECR)
+		outb(ecr, pp_direct_iobase + LPTREG_ECONTROL);
+}
+
+int pp_direct_epp_clear_timeout(void)
+{
+        unsigned char r;
+
+        if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+                return 1;
+        /* To clear timeout some chips require double read */
+	inb(pp_direct_iobase + LPTREG_STATUS);
+	r = inb(pp_direct_iobase + LPTREG_STATUS);
+	outb(r | 0x01, pp_direct_iobase + LPTREG_STATUS); /* Some reset by writing 1 */
+	outb(r & 0xfe, pp_direct_iobase + LPTREG_STATUS); /* Others by writing 0 */
+        r = inb(pp_direct_iobase + LPTREG_STATUS);
+        return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_direct_read_data(void)
+{
+	return inb(pp_direct_iobase + LPTREG_DATA);
+}
+
+void parport_direct_write_data(unsigned char d)
+{
+	outb(d, pp_direct_iobase + LPTREG_DATA);
+}
+
+unsigned char parport_direct_read_status(void)
+{
+	return inb(pp_direct_iobase + LPTREG_STATUS);
+}
+
+
+unsigned char parport_direct_read_control(void)
+{
+	return inb(pp_direct_iobase + LPTREG_CONTROL);
+}
+
+void parport_direct_write_control(unsigned char d)
+{
+	outb(d, pp_direct_iobase + LPTREG_CONTROL);
+}
+
+void parport_direct_frob_control(unsigned char mask, unsigned char val)
+{
+	unsigned char d = inb(pp_direct_iobase + LPTREG_CONTROL);
+	d = (d & (~mask)) ^ val;
+	outb(d, pp_direct_iobase + LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_EPPDATA);
+		if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_direct_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_direct_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = inb(pp_direct_iobase + LPTREG_EPPDATA);
+		if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_direct_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_direct_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_EPPADDR);
+		if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_direct_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_direct_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = inb(pp_direct_iobase + LPTREG_EPPADDR);
+		if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_direct_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_emul_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_direct_emul_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = inb(pp_direct_iobase + LPTREG_DATA);
+		outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_direct_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_direct_emul_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = inb(pp_direct_iobase + LPTREG_DATA);
+		outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (inb(pp_direct_iobase + LPTREG_DSR) & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	outb(0x26, pp_direct_iobase + LPTREG_DCR);
+	/* Event 49: PError goes high */
+	while (!(inb(pp_direct_iobase + LPTREG_DSR) & 0x20)) {
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	outb(0x04, pp_direct_iobase + LPTREG_DCR);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (!(inb(pp_direct_iobase + LPTREG_DSR) & 0x20))
+		return 0;
+	outb(0x24, pp_direct_iobase + LPTREG_DCR);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	outb(0x20, pp_direct_iobase + LPTREG_DCR);
+	while (inb(pp_direct_iobase + LPTREG_DSR) & 0x20) {
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+	unsigned fcnt = 0;
+
+	outb(0xd0, pp_direct_iobase + LPTREG_ECONTROL); /* FIFOtest mode */
+	while ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+		inb(pp_direct_iobase + LPTREG_TFIFO);
+		fcnt++;
+	}
+	printf("emptyfifo: FIFO contained %d bytes\n", fcnt);
+	outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return cnt - fcnt;
+}
+
+unsigned parport_direct_ecp_write_data(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			outsb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			outb(*bp++, pp_direct_iobase + LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+	}
+	outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_direct_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+	
+	if (ecp_reverse())
+		return 0;
+	outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x01)
+			if (!(--tmo)) {
+				outb(0xd0, pp_direct_iobase + LPTREG_ECONTROL); /* FIFOTEST mode */
+				while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) && sz > 0) {
+					*bp++ = inb(pp_direct_iobase + LPTREG_TFIFO);
+					sz--;
+					ret++;
+				}
+				outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+				return ret;
+			}
+		if (stat & 0x02 && sz >= 8) {
+			insb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			*bp++ = inb(pp_direct_iobase + LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_direct_ecp_write_addr(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			outsb(pp_direct_iobase + LPTREG_AFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			outb(*bp++, pp_direct_iobase + LPTREG_AFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+ 	}
+	outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = inb(pp_direct_iobase + LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+		outb(ctl | PARPORT_CONTROL_STROBE, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; !(inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_direct_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = inb(pp_direct_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+		outb(ctl | PARPORT_CONTROL_STROBE, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+		for (tmo = 0; !(inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_direct_emul_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+
+	if (ecp_reverse())
+		return 0;	
+	ctl = inb(pp_direct_iobase + LPTREG_CONTROL);
+	/* Set HostAck low to start accepting data. */
+	outb(ctl | PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			stat = inb(pp_direct_iobase + LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+		/* Read the data. */
+		*bp = inb(pp_direct_iobase + LPTREG_DATA);
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		outb(ctl & ~PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			stat = inb(pp_direct_iobase + LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+		/* Event 46: Set HostAck low and accept the data. */
+		outb(ctl | PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+ 
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_direct_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+	return sz;
+}
+#else
+
+unsigned parport_direct_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (pp_direct_modes & PARPORT_MODE_PCECR) {
+		outb(0x50, pp_direct_iobase + LPTREG_ECONTROL); /* COMPAT FIFO mode */
+		while (sz > 0) {
+			while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+				if (!(--tmo))
+					return emptyfifo(ret);
+			}
+			if (stat & 0x01 && sz >= 8) {
+				outsb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+				bp += 8;
+				sz -= 8;
+				ret += 8;
+			} else {
+				outb(*bp++, pp_direct_iobase + LPTREG_DFIFO);
+				sz--;
+				ret++;
+			}
+			tmo = 0x10000;
+		}
+		while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+		return ret;
+	}
+	for (ret = 0; ret < sz; ret++, bp++)
+		outb(*bp, pp_direct_iobase + LPTREG_DATA);
+	return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_direct_ops = {
+	parport_direct_read_data,
+	parport_direct_write_data,
+	parport_direct_read_status,
+	parport_direct_read_control,
+	parport_direct_write_control,
+	parport_direct_frob_control,
+	parport_direct_epp_write_data,
+	parport_direct_epp_read_data,
+	parport_direct_epp_write_addr,
+	parport_direct_epp_read_addr,
+	parport_direct_ecp_write_data,
+	parport_direct_ecp_read_data,
+	parport_direct_ecp_write_addr,
+	parport_direct_fpgaconfig_write
+};
+
+const struct parport_ops parport_direct_emul_ops = {
+	parport_direct_read_data,
+	parport_direct_write_data,
+	parport_direct_read_status,
+	parport_direct_read_control,
+	parport_direct_write_control,
+	parport_direct_frob_control,
+	parport_direct_emul_epp_write_data,
+	parport_direct_emul_epp_read_data,
+	parport_direct_emul_epp_write_addr,
+	parport_direct_emul_epp_read_addr,
+	parport_direct_emul_ecp_write_data,
+	parport_direct_emul_ecp_read_data,
+	parport_direct_emul_ecp_write_addr,
+	parport_direct_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
+
+struct parport_ops parport_ops = {
+	parport_direct_read_data,
+	parport_direct_write_data,
+	parport_direct_read_status,
+	parport_direct_read_control,
+	parport_direct_write_control,
+	parport_direct_frob_control,
+	parport_direct_emul_epp_write_data,
+	parport_direct_emul_epp_read_data,
+	parport_direct_emul_epp_write_addr,
+	parport_direct_emul_epp_read_addr,
+	parport_direct_emul_ecp_write_data,
+	parport_direct_emul_ecp_read_data,
+	parport_direct_emul_ecp_write_addr,
+	parport_direct_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppdirectinit.c b/main/ppdirectinit.c
new file mode 100644
index 0000000..0c0a254
--- /dev/null
+++ b/main/ppdirectinit.c
@@ -0,0 +1,677 @@
+/*****************************************************************************/
+
+/*
+ *      ppdirectinit.c  -- Parport direct access (init routines).
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_IOPL
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+extern inline int iopl(unsigned int level)
+{
+        OSVERSIONINFO info;
+
+        info.dwOSVersionInfoSize = sizeof(info);
+        if (GetVersionEx(&info) &&
+            (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+             info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+                return 0;
+        return 1;
+}
+#else
+extern inline int iopl(unsigned int level)
+{
+        return 0;
+}
+#endif
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern unsigned int pp_direct_iobase;
+extern unsigned int pp_direct_flags;
+extern const struct parport_ops parport_direct_ops, parport_direct_emul_ops;
+
+extern int pp_direct_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+#if 0
+#ifndef EPPEMUL
+
+static int detect_epp(void)
+{
+	/* pulse PROGRAM low, reset FPGA just to be safe */
+	outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+	usleep(10);
+	outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+	/* start of ordinary test */
+	if (!epp_clear_timeout())
+		return -1;
+	outb(inb(iobase + LPTREG_CONTROL) | 0x20, iobase + LPTREG_CONTROL);
+	outb(inb(iobase + LPTREG_CONTROL) | 0x10, iobase + LPTREG_CONTROL);
+	epp_clear_timeout();
+	inb(iobase + LPTREG_EPPDATA);
+	/* udelay(30); */
+	if (inb(iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+		epp_clear_timeout();
+		return 0;
+	}
+	/*return -1;*/
+	lprintf(3, "warning: no EPP timeout\n");
+	return 0;
+}
+
+#endif /* !EPPEMUL */
+
+static int detect_ecr(void)
+{
+	unsigned char r, oc, oec;
+
+	oec = inb(iobase + LPTREG_ECONTROL);
+	oc = inb(iobase + LPTREG_CONTROL);
+	if ((oc & 3) == (oec & 3)) {
+		outb(oc ^ 2, iobase + LPTREG_CONTROL);
+		r = inb(iobase + LPTREG_CONTROL);
+		if ((inb(iobase + LPTREG_ECONTROL) & 2) == (r & 2)) {
+			outb(oc, iobase + LPTREG_CONTROL);
+			return -1;
+		}
+	}
+	if ((oec & 3) != 1)
+		return -1;
+	outb(0x34, iobase + LPTREG_ECONTROL);
+	r = inb(iobase + LPTREG_ECONTROL);
+	outb(oc, iobase + LPTREG_CONTROL);
+	outb(oec, iobase + LPTREG_ECONTROL);
+	return -(r != 0x35);
+}
+
+int detect_port(void)
+{
+	outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+	pp_direct_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	outb(0xc, iobase+LPTREG_ECONTROL);
+	outb(0xc, iobase+LPTREG_CONTROL);
+	outb(0xaa, iobase+LPTREG_DATA);
+	if (inb(iobase+LPTREG_DATA) != 0xaa)
+		goto fail_spp;
+	outb(0x55, iobase+LPTREG_DATA);
+	if (inb(iobase+LPTREG_DATA) != 0x55)
+		goto fail_spp;
+#ifdef EPPEMUL
+	/* tentatively enable PS/2 mode if ECP port */
+	outb(0x20, iobase + LPTREG_ECONTROL);
+	outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+	if ((inb(iobase+LPTREG_CONTROL) & 0x3f) != LPTCTRL_PROGRAM)
+		goto fail_ps2;
+	outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, iobase+LPTREG_CONTROL);
+	if ((inb(iobase+LPTREG_CONTROL) & 0x3f) != (LPTCTRL_PROGRAM | LPTCTRL_DIRECTION))
+		goto fail_ps2;
+	return 0;
+
+  fail_ps2:
+	lprintf(3, "parport (PS/2 bidir) test failed\n");
+	return -1;
+
+#else /* !EPPEMUL */
+	if (!detect_ecr()) {
+		outb(0x80, iobase + LPTREG_ECONTROL);
+		lprintf(3, "parport SMSC style ECP+EPP detected\n");
+		return 0;
+	}
+	if (!detect_epp())
+		return 0;
+	/* goto fail_epp; */
+  fail_epp:
+	lprintf(3, "parport (EPP) test failed\n");
+	return -1;
+#endif /* !EPPEMUL */
+
+  fail_spp:
+	lprintf(3, "parport (SPP) test failed\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP routines
+ */
+
+static void ecp_port_cap(void)
+{
+	static const char *pwordstr[8] = { "2 bytes", "1 byte", "4 bytes", "3?", "4?", 
+					   "5?", "6?", "7?" };
+	static const char *irqstr[8] = { "jumpered", "7", "9", "10", "11", "14", "15", "5" };
+	static const char *dmastr[8] = { "jumpered 8bit", "1", "2", "3", "jumpered 16bit", "5", "6", "7" };
+	unsigned char cnfga, cnfgb;
+	unsigned int cnt, fwcnt, wthr = ~0, frcnt, rthr = ~0;
+
+	outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	outb(0xf0, iobase + LPTREG_ECONTROL); /* config mode */
+	cnfga = inb(iobase + LPTREG_CONFIGA);
+	cnfgb = inb(iobase + LPTREG_CONFIGB);
+	outb(cnfgb & 0x7f, iobase + LPTREG_CONFIGB);  /* disable compression */
+	outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	outb(0x04, iobase + LPTREG_DCR); /* direction=output */
+	outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+	for (cnt = 0; cnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+		outb(0, iobase + LPTREG_TFIFO);
+	outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+	for (fwcnt = 0; fwcnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x01); fwcnt++) {
+		inb(iobase + LPTREG_TFIFO);
+		if (inb(iobase + LPTREG_ECONTROL) & 0x04) {
+			wthr = fwcnt;
+			outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+		}
+	}
+	outb(0x24, iobase + LPTREG_DCR); /* direction=input */
+	outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+	for (cnt = 0; cnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+		outb(0, iobase + LPTREG_TFIFO);
+	outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+	for (frcnt = 0; frcnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x01); frcnt++) {
+		inb(iobase + LPTREG_TFIFO);
+		if (inb(iobase + LPTREG_ECONTROL) & 0x04) {
+			rthr = frcnt;
+			outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+		}
+	}
+	outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	outb(0x04, iobase + LPTREG_DCR); /* direction=output */
+	lprintf(3, "ECP capabilities: %s int, PWord %s, %sextra tx pipe, IRQ %s, DMA %s\n"
+		"Tx: FIFO size %d threshold %d  Rx: FIFO size %d threshold %d\n",
+		(cnfga & 0x80) ? "level" : "edge", pwordstr[(cnfga >> 4) & 7],
+		(cnfga & 0x04) ? "no" : "", irqstr[(cnfgb >> 3) & 7], dmastr[cnfgb & 7],
+		fwcnt, wthr, frcnt, rthr);
+}
+
+int detect_port_ecp(void)
+{
+	epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	outb(0xc, iobase+LPTREG_ECONTROL);
+	outb(0xc, iobase+LPTREG_CONTROL);
+	outb(0xaa, iobase+LPTREG_DATA);
+	if (inb(iobase+LPTREG_DATA) != 0xaa)
+		goto fail_spp;
+	outb(0x55, iobase+LPTREG_DATA);
+	if (inb(iobase+LPTREG_DATA) != 0x55)
+		goto fail_spp;
+	/* check for ECP ECR mode */
+	if (detect_ecr())
+		goto fail_ecp;
+	ecp_port_cap();
+	return 0;
+
+  fail_ecp:
+	lprintf(0, "parport (ECP) test failed\n");
+	return -1;
+
+  fail_spp:
+	lprintf(0, "parport (SPP) test failed\n");
+	return -1;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+	pp_direct_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	outb(0xc, pp_direct_iobase+LPTREG_ECONTROL);
+	outb(0xc, pp_direct_iobase+LPTREG_CONTROL);
+	outb(0xaa, pp_direct_iobase+LPTREG_DATA);
+	if (inb(pp_direct_iobase+LPTREG_DATA) != 0xaa)
+		return 0;
+	outb(0x55, pp_direct_iobase+LPTREG_DATA);
+	if (inb(pp_direct_iobase+LPTREG_DATA) != 0x55)
+		return 0;
+	return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+	unsigned char r = 0xc;
+
+	outb(r, pp_direct_iobase + LPTREG_CONTROL);
+	if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+		outb(r ^ 0x2, pp_direct_iobase + LPTREG_CONTROL); /* Toggle bit 1 */
+		r = inb(pp_direct_iobase + LPTREG_CONTROL);	
+		if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+			goto no_reg; /* Sure that no ECR register exists */
+	}
+
+	if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x3 ) != 0x1)
+		goto no_reg;
+
+	outb(0x34, pp_direct_iobase + LPTREG_ECONTROL);
+	if (inb(pp_direct_iobase + LPTREG_ECONTROL) != 0x35)
+		goto no_reg;
+
+	outb(0xc, pp_direct_iobase + LPTREG_CONTROL);
+	
+	/* Go to mode 000 */
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0, pp_direct_iobase + LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECR;
+
+ no_reg:
+	outb(0xc, pp_direct_iobase + LPTREG_CONTROL);
+	return 0; 
+}
+
+static int parport_ecp(void)
+{
+	int i;
+	int config;
+	int pword;
+	int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+	/* Find out FIFO depth */
+	outb(0x00, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+	outb(0xc0, pp_direct_iobase + LPTREG_ECONTROL); /* TEST FIFO */
+	for (i=0; i < 1024 && !(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x02); i++)
+		outb(0xaa, pp_direct_iobase + LPTREG_TFIFO);
+	/*
+	 * Using LGS chipset it uses ECR register, but
+	 * it doesn't support ECP or FIFO MODE
+	 */
+	if (i == 1024) {
+		outb(0x00, pp_direct_iobase + LPTREG_ECONTROL);
+		return 0;
+	}
+
+	fifo_depth = i;
+	lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+	/* Find out writeIntrThreshold */
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) | (1<<2), pp_direct_iobase + LPTREG_ECONTROL);
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_direct_iobase + LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		inb(pp_direct_iobase + LPTREG_TFIFO);
+		usleep(50);
+		if (inb(pp_direct_iobase + LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we know we can write if we get an
+                   interrupt. */
+		i = 0;
+
+	writeIntrThreshold = i;
+
+	/* Find out readIntrThreshold */
+	outb((inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0) | 0x20, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+	outb(inb(pp_direct_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+	outb((inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0) | 0xc0, pp_direct_iobase + LPTREG_ECONTROL); /* Test FIFO */
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) | (1<<2), pp_direct_iobase + LPTREG_ECONTROL);
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_direct_iobase + LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		outb(0xaa, pp_direct_iobase + LPTREG_TFIFO);
+		if (inb(pp_direct_iobase + LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we can read if we get an interrupt. */
+		i = 0;
+
+	readIntrThreshold = i;
+
+	outb(0x00, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+	outb(0xf4, pp_direct_iobase + LPTREG_ECONTROL); /* Configuration mode */
+	config = inb(pp_direct_iobase + LPTREG_CONFIGA);
+	pword = (config >> 4) & 0x7;
+	switch (pword) {
+	case 0:
+		pword = 2;
+		lprintf(0, "ECP: Unsupported pword size! (2)\n");
+		break;
+	case 2:
+		pword = 4;
+		lprintf(0, "ECP: Unsupported pword size! (4)\n");
+		break;
+	default:
+		lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+		/* Assume 1 */
+	case 1:
+		pword = 1;
+	}
+	lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+	config = inb(pp_direct_iobase + LPTREG_CONFIGB);
+	lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+	if (!(config & 0x40))
+		lprintf(3, "ECP: IRQ conflict!\n");
+
+	/* Go back to mode 000 */
+	outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0, pp_direct_iobase + LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection  */
+
+static int parport_epp(void)
+{
+	/* If EPP timeout bit clear then EPP available */
+	if (!pp_direct_epp_clear_timeout())
+		return 0;  /* No way to clear timeout */
+
+	/*
+	 * Theory:
+	 *     Write two values to the EPP address register and
+	 *     read them back. When the transfer times out, the state of
+	 *     the EPP register is undefined in some cases (EPP 1.9?) but
+	 *     in others (EPP 1.7, ECPEPP?) it is possible to read back
+	 *     its value.
+	 */
+
+	pp_direct_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	outb(0x55, pp_direct_iobase + LPTREG_EPPADDR);
+	pp_direct_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	if (inb(pp_direct_iobase + LPTREG_EPPADDR) == 0x55) {
+		outb(0xaa, pp_direct_iobase + LPTREG_EPPADDR);
+		pp_direct_epp_clear_timeout();
+		usleep(30); /* Wait for possible EPP timeout */
+		if (inb(pp_direct_iobase + LPTREG_EPPADDR) == 0xaa) {
+			pp_direct_epp_clear_timeout();
+			return PARPORT_MODE_PCEPP;
+		}
+	}
+
+	/*
+	 * Theory:
+	 *	Bit 0 of STR is the EPP timeout bit, this bit is 0
+	 *	when EPP is possible and is set high when an EPP timeout
+	 *	occurs (EPP uses the HALT line to stop the CPU while it does
+	 *	the byte transfer, an EPP timeout occurs if the attached
+	 *	device fails to respond after 10 micro seconds).
+	 *
+	 *	This bit is cleared by either reading it (National Semi)
+	 *	or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+	 *	This bit is always high in non EPP modes.
+	 */
+
+	outb(inb(pp_direct_iobase + LPTREG_CONTROL) | 0x20, pp_direct_iobase + LPTREG_CONTROL);
+	outb(inb(pp_direct_iobase + LPTREG_CONTROL) | 0x10, pp_direct_iobase + LPTREG_CONTROL);
+	pp_direct_epp_clear_timeout();
+	
+	inb(pp_direct_iobase + LPTREG_EPPDATA);
+	usleep(30);  /* Wait for possible EPP timeout */
+	
+	if (inb(pp_direct_iobase + LPTREG_STATUS) & 0x01) {
+		pp_direct_epp_clear_timeout();
+		return PARPORT_MODE_PCEPP;
+	}
+	return 0;
+}
+
+static int parport_ecpepp(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = inb(pp_direct_iobase + LPTREG_ECONTROL);
+	/* Search for SMC style EPP+ECP mode */
+	outb(0x80, pp_direct_iobase + LPTREG_ECONTROL);
+	mode = parport_epp();
+	outb(oecr, pp_direct_iobase + LPTREG_ECONTROL);
+       	return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines.  In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero.  So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present. 
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal.  Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic. 
+ */
+
+static int parport_ps2(void)
+{
+	int ok = 0;
+	unsigned char octr = inb(pp_direct_iobase + LPTREG_CONTROL);
+  
+	pp_direct_epp_clear_timeout();
+
+	outb(octr | 0x20, pp_direct_iobase + LPTREG_CONTROL);  /* try to tri-state the buffer */
+	
+	outb(0x55, pp_direct_iobase + LPTREG_DATA);
+	if (inb(pp_direct_iobase + LPTREG_DATA) != 0x55) ok++;
+	outb(0xaa, pp_direct_iobase + LPTREG_DATA);
+	if (inb(pp_direct_iobase + LPTREG_DATA) != 0xaa) ok++;
+
+	outb(octr, pp_direct_iobase);          /* cancel input mode */
+
+	return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = inb(pp_direct_iobase + LPTREG_ECONTROL);
+	outb(0x20, pp_direct_iobase + LPTREG_ECONTROL);
+      	mode = parport_ps2();
+	outb(oecr, pp_direct_iobase + LPTREG_ECONTROL);
+	return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_direct_flags(unsigned io, unsigned int flags)
+{
+	pp_direct_flags = FLAGS_PCSPP;
+	pp_direct_iobase = io;
+       	if (iopl(3)) {
+		lprintf(0, "Cannot get direct IO port access (iopl: %s)\n", strerror(errno));
+		return -1;
+	}
+	if (!parport_spp()) {
+		lprintf(0, "No parport present at 0x%x\n", pp_direct_iobase);
+		return -1;
+	}
+	if (parport_ecr()) {
+		pp_direct_flags |= FLAGS_PCECR;
+		pp_direct_flags |= parport_ecp();
+		pp_direct_flags |= parport_ecpps2();
+		pp_direct_flags |= parport_ecpepp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_direct_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_direct_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_direct_flags |= FLAGS_PCECPEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	} else {
+		pp_direct_flags |= parport_ps2();
+		pp_direct_flags |= parport_epp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_direct_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_direct_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_direct_flags |= FLAGS_PCEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	}
+	lprintf(0, "Parport 0x%x capabilities: SPP%s%s%s%s%s%s\n",
+		pp_direct_iobase,
+		(pp_direct_flags & FLAGS_PCPS2) ? ", PS2" : "",
+		(pp_direct_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+		(pp_direct_flags & FLAGS_PCECR) ? ", ECR" : "",
+		(pp_direct_flags & FLAGS_PCECP) ? ", ECP" : "",
+		(pp_direct_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+		(pp_direct_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+	if (!(pp_direct_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2)))  {
+		lprintf(0, "Parport 0x%x does not even support PS/2 mode, cannot use it\n",
+			pp_direct_iobase);
+		return -1;
+	}
+	lprintf(0, "Parport 0x%x using direct hardware access\n", pp_direct_iobase);
+	if (pp_direct_flags & FLAGS_PCECR)
+		outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	parport_ops = parport_direct_ops;
+	if ((flags & PPFLAG_SWEMULECP) || !(pp_direct_flags & FLAGS_PCECP)) {
+		parport_ops.parport_ecp_write_data = parport_direct_emul_ops.parport_ecp_write_data;
+		parport_ops.parport_ecp_read_data = parport_direct_emul_ops.parport_ecp_read_data;
+		parport_ops.parport_ecp_write_addr = parport_direct_emul_ops.parport_ecp_write_addr;
+		lprintf(0, "Parport 0x%x emulating ECP\n", pp_direct_iobase);
+	}
+	if ((flags & PPFLAG_SWEMULEPP) || !(pp_direct_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+		parport_ops.parport_epp_write_data = parport_direct_emul_ops.parport_epp_write_data;
+		parport_ops.parport_epp_read_data = parport_direct_emul_ops.parport_epp_read_data;
+		parport_ops.parport_epp_write_addr = parport_direct_emul_ops.parport_epp_write_addr;
+		parport_ops.parport_epp_read_addr = parport_direct_emul_ops.parport_epp_read_addr;
+		lprintf(0, "Parport 0x%x emulating EPP\n", pp_direct_iobase);
+	}
+	return 0;
+}
+
+int parport_init_direct(unsigned io)
+{
+        return parport_init_direct_flags(io, 0);
+}
diff --git a/main/ppkdrv.c b/main/ppkdrv.c
new file mode 100644
index 0000000..b161fc3
--- /dev/null
+++ b/main/ppkdrv.c
@@ -0,0 +1,290 @@
+/*****************************************************************************/
+
+/*
+ *      ppkdrv.c  -- Parport access via Linux kernel driver.
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <linux/socket.h>
+#include <net/if.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_kdrv_fd = -1;
+struct ifreq pp_kdrv_ifr;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_kdrv_exit(void)
+{
+	if (pp_kdrv_fd != -1)
+		close(pp_kdrv_fd);
+	pp_kdrv_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+struct eppflex_ioctl_params {
+	int cmd;
+	int mode;
+	union {
+		unsigned char d;
+		struct {
+			unsigned size;
+			unsigned char *data;
+		} blk;
+	} u;
+};
+
+#define EPPFLEX_PPRSTATUS       _IOR(0xbc, 0x81, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRCONTROL      _IOR(0xbc, 0x83, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWCONTROL      _IOW(0xbc, 0x84, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRDATA         _IOR(0xbc, 0x85, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWDATA         _IOW(0xbc, 0x86, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWFPGACFG      _IOW(0xbc, 0x87, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPDATA      _IOR(0xbc, 0x88, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPDATA      _IOW(0xbc, 0x89, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPADDR      _IOR(0xbc, 0x8a, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPADDR      _IOW(0xbc, 0x8b, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRECPDATA      _IOR(0xbc, 0x8c, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPDATA      _IOW(0xbc, 0x8d, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPCMD       _IOW(0xbc, 0x8e, struct eppflex_ioctl_params)
+#define EPPFLEX_PPCHANGEMODE    _IOW(0xbc, 0x8f, struct eppflex_ioctl_params)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_kdrv_read_data(void)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPRDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+	return i.u.d;
+}
+
+void parport_kdrv_write_data(unsigned char d)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.d = d;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+unsigned char parport_kdrv_read_status(void)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPRSTATUS, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+	return i.u.d;
+}
+
+
+unsigned char parport_kdrv_read_control(void)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPRCONTROL, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+	return i.u.d;
+}
+
+void parport_kdrv_write_control(unsigned char d)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWCONTROL, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.d = d;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+void parport_kdrv_frob_control(unsigned char mask, unsigned char val)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPRCONTROL, };
+	
+	ifr.ifr_data = (caddr_t)&i;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+	i.u.d = (i.u.d & (~mask)) ^ val;
+	i.cmd = EPPFLEX_PPWCONTROL;
+	ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_kdrv_epp_write_data(const void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWEPPDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+unsigned parport_kdrv_epp_read_data(void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPREPPDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+unsigned parport_kdrv_epp_write_addr(const void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWEPPADDR, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+unsigned parport_kdrv_epp_read_addr(void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPREPPADDR, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_kdrv_ecp_write_data(const void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWECPDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+unsigned parport_kdrv_ecp_write_addr(const void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWECPCMD, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+unsigned parport_kdrv_ecp_read_data(void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPRECPDATA, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+#if 0
+
+unsigned parport_kdrv_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		parport_kdrv_write_data(*bp);
+	return sz;
+}
+
+#else
+
+unsigned parport_kdrv_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	struct ifreq ifr = pp_kdrv_ifr;
+	struct eppflex_ioctl_params i = { EPPFLEX_PPWFPGACFG, };
+
+	ifr.ifr_data = (caddr_t)&i;
+	i.u.blk.size = sz;
+	i.u.blk.data = (void *)buf;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+		return 0;
+	return sz;
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_kdrv_ops = {
+	parport_kdrv_read_data,
+	parport_kdrv_write_data,
+	parport_kdrv_read_status,
+	parport_kdrv_read_control,
+	parport_kdrv_write_control,
+	parport_kdrv_frob_control,
+	parport_kdrv_epp_write_data,
+	parport_kdrv_epp_read_data,
+	parport_kdrv_epp_write_addr,
+	parport_kdrv_epp_read_addr,
+	parport_kdrv_ecp_write_data,
+	parport_kdrv_ecp_read_data,
+	parport_kdrv_ecp_write_addr,
+	parport_kdrv_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppkdrvinit.c b/main/ppkdrvinit.c
new file mode 100644
index 0000000..4379430
--- /dev/null
+++ b/main/ppkdrvinit.c
@@ -0,0 +1,114 @@
+/*****************************************************************************/
+
+/*
+ *      ppkdrvinit.c  -- Parport access via Linux kernel driver (init routines).
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/socket.h>
+#include <net/if.h>
+#include <linux/if_ether.h>
+#include <netinet/in.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_kdrv_fd;
+extern struct ifreq pp_kdrv_ifr;
+extern const struct parport_ops parport_kdrv_ops;
+extern void parport_kdrv_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+struct eppflex_ioctl_params {
+	int cmd;
+	int mode;
+	union {
+		unsigned char d;
+		struct {
+			unsigned size;
+			unsigned char *data;
+		} blk;
+	} u;
+};
+
+#define EPPFLEX_PPRSTATUS       _IOR(0xbc, 0x81, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRCONTROL      _IOR(0xbc, 0x83, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWCONTROL      _IOW(0xbc, 0x84, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRDATA         _IOR(0xbc, 0x85, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWDATA         _IOW(0xbc, 0x86, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWFPGACFG      _IOW(0xbc, 0x87, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPDATA      _IOR(0xbc, 0x88, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPDATA      _IOW(0xbc, 0x89, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPADDR      _IOR(0xbc, 0x8a, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPADDR      _IOW(0xbc, 0x8b, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRECPDATA      _IOR(0xbc, 0x8c, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPDATA      _IOW(0xbc, 0x8d, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPCMD       _IOW(0xbc, 0x8e, struct eppflex_ioctl_params)
+#define EPPFLEX_PPCHANGEMODE    _IOW(0xbc, 0x8f, struct eppflex_ioctl_params)
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppkdrv(const char *ifname)
+{
+	struct ifreq ifr;
+	struct eppflex_ioctl_params i;
+
+	strncpy(pp_kdrv_ifr.ifr_name, ifname, sizeof(pp_kdrv_ifr.ifr_name));
+	if ((pp_kdrv_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_AX25))) == -1) {
+		lprintf(0, "Cannot open socket (error %s)\n", strerror(errno));
+		return -1;
+	}
+	if (ioctl(pp_kdrv_fd, SIOCGIFINDEX, &pp_kdrv_ifr)) {
+		lprintf(0, "Cannot open interface %s (error %s)\n", ifname, strerror(errno));
+		close(pp_kdrv_fd);
+		return -1;
+	}
+	ifr = pp_kdrv_ifr;
+	i.cmd = EPPFLEX_PPRCONTROL;
+	ifr.ifr_data = (caddr_t)&i;
+	if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr)) {
+		lprintf(0, "Cannot access parport through kernel driver %s (error %s)\n", ifname,
+			strerror(errno));
+		close(pp_kdrv_fd);
+		return -1;
+	}
+	if (atexit(parport_kdrv_exit)) {
+		lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+		close(pp_kdrv_fd);
+		pp_kdrv_fd = -1;
+		return -1;
+	}
+	parport_ops = parport_kdrv_ops;
+	return 0;
+}
diff --git a/main/ppnt.c b/main/ppnt.c
new file mode 100644
index 0000000..33a8ef1
--- /dev/null
+++ b/main/ppnt.c
@@ -0,0 +1,1023 @@
+/*****************************************************************************/
+
+/*
+ *      ppnt.c  -- Parport direct access with NT eppflex.sys.
+ *
+ *      Copyright (C) 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
+    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+
+#define FILE_ANY_ACCESS                 0
+#define FILE_READ_ACCESS          (0x0001) 
+#define FILE_WRITE_ACCESS         (0x0002)
+
+#include "eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_nt_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_nt_flags = 0;
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_nt_read_data(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_data failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_data(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_data failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_status(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_status failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_status(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_status failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_control(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+       
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_control failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_control(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_control failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_nt_frob_control(unsigned char mask, unsigned char val)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = val;
+        rw.mask = mask;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_FROB_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_frob_control failed, error 0x%08lx\n", GetLastError());
+		return;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return;
+	}
+}
+
+unsigned char parport_nt_read_configa(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_configa failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_configa(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_configa failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_configb(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_configb failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_configb(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_configb failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_econtrol(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_econtrol failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_econtrol(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_econtrol failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_nt_frob_econtrol(unsigned char mask, unsigned char val)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = val;
+        rw.mask = mask;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_FROB_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_frob_econtrol failed, error 0x%08lx\n", GetLastError());
+		return;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return;
+	}
+}
+
+unsigned char parport_nt_read_eppaddr(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_eppaddr failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_eppaddr(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_eppaddr failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_eppdata(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_nt_read_eppdata failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_nt_write_eppdata(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_nt_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_nt_write_eppdata failed, error 0x%08lx\n", GetLastError());
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+	if (pp_nt_flags & FLAGS_PCECR)
+		parport_nt_write_econtrol(ecr);
+}
+
+int pp_nt_epp_clear_timeout(void)
+{
+        unsigned char r;
+
+        if (!(parport_nt_read_status() & LPTSTAT_EPPTIMEOUT))
+                return 1;
+        /* To clear timeout some chips require double read */
+	parport_nt_read_status();
+	r = parport_nt_read_status();
+	parport_nt_write_status(r | 0x01); /* Some reset by writing 1 */
+	parport_nt_write_status(r & 0xfe); /* Others by writing 0 */
+        r = parport_nt_read_status();
+        return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		parport_nt_write_eppdata(*bp);
+		if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_nt_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_nt_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = parport_nt_read_eppdata();
+		if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_nt_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_nt_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		parport_nt_write_eppaddr(*bp);
+		if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_nt_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_nt_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = parport_nt_read_eppaddr();
+		if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_nt_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_emul_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+	for (; sz > 0; sz--, bp++) {
+		parport_nt_write_data(*bp);
+		for (tmo = 0; ; tmo++) {
+			if (parport_nt_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_nt_emul_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (parport_nt_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = parport_nt_read_data();
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_nt_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+	for (; sz > 0; sz--, bp++) {
+		parport_nt_write_data(*bp);
+		for (tmo = 0; ; tmo++) {
+			if (parport_nt_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_nt_emul_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (parport_nt_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = parport_nt_read_data();
+		parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (parport_nt_read_status() & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	parport_nt_write_control(0x26);
+	/* Event 49: PError goes high */
+	while (!(parport_nt_read_status() & 0x20)) {
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	parport_nt_write_control(0x04);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (!(parport_nt_read_status() & 0x20))
+		return 0;
+	parport_nt_write_control(0x24);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	parport_nt_write_control(0x20);
+	while (parport_nt_read_status() & 0x20) {
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+	unsigned fcnt = 0;
+
+	parport_nt_write_econtrol(0xd0); /* FIFOtest mode */
+	while ((parport_nt_read_econtrol() & 0x01) && fcnt < 32 && fcnt < cnt) {
+		parport_nt_read_configa();
+		fcnt++;
+	}
+	lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+	parport_nt_write_econtrol(0x30); /* PS/2 mode */
+	return cnt - fcnt;
+}
+
+unsigned parport_nt_ecp_write_data(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+        
+	if (ecp_forward())
+		return 0;
+	parport_nt_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_nt_read_econtrol()) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+                                parport_nt_write_configa(bp[i]);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			parport_nt_write_configa(*bp++);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+	}
+	parport_nt_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_nt_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+	unsigned int i;
+        
+	if (ecp_reverse())
+		return 0;
+	parport_nt_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_nt_read_econtrol()) & 0x01)
+			if (!(--tmo)) {
+				parport_nt_write_econtrol(0xd0); /* FIFOTEST mode */
+				while (!(parport_nt_read_econtrol() & 0x01) && sz > 0) {
+					*bp++ = parport_nt_read_configa();
+					sz--;
+					ret++;
+				}
+				parport_nt_write_econtrol(0x30); /* PS/2 mode */
+				return ret;
+			}
+		if (stat & 0x02 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+                                bp[i] = parport_nt_read_configa();
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			*bp++ = parport_nt_read_configa();
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	parport_nt_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_nt_ecp_write_addr(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+        
+	if (ecp_forward())
+		return 0;
+	parport_nt_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_nt_read_econtrol()) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+				parport_nt_write_data(bp[i]);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			parport_nt_write_data(*bp++);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+ 	}
+	parport_nt_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = parport_nt_read_control() & ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	parport_nt_write_control(ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		parport_nt_write_data(*bp);
+		parport_nt_write_control(ctl | PARPORT_CONTROL_STROBE);
+		for (tmo = 0; parport_nt_read_status() & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		parport_nt_write_control(ctl);
+		for (tmo = 0; !(parport_nt_read_status() & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_nt_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = parport_nt_read_control() | PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	parport_nt_write_control(ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		parport_nt_write_data(*bp);
+		parport_nt_write_control(ctl | PARPORT_CONTROL_STROBE);
+		for (tmo = 0; parport_nt_read_status() & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		parport_nt_write_control(ctl);
+		for (tmo = 0; !(parport_nt_read_status() & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_nt_emul_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+
+	if (ecp_reverse())
+		return 0;	
+	ctl = parport_nt_read_control();
+	/* Set HostAck low to start accepting data. */
+	parport_nt_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			stat = parport_nt_read_status();
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+		/* Read the data. */
+		*bp = parport_nt_read_data();
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		parport_nt_write_control(ctl & ~PARPORT_CONTROL_AUTOFD);
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			stat = parport_nt_read_status();
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+		/* Event 46: Set HostAck low and accept the data. */
+		parport_nt_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+ 
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_nt_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		parport_nt_write_data(*bp);
+	return sz;
+}
+#else
+
+unsigned parport_nt_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+
+	if (pp_nt_modes & PARPORT_MODE_PCECR) {
+		parport_nt_write_econtrol(0x50); /* COMPAT FIFO mode */
+		while (sz > 0) {
+			while ((stat = parport_nt_read_econtrol()) & 0x02) {
+				if (!(--tmo))
+					return emptyfifo(ret);
+			}
+			if (stat & 0x01 && sz >= 8) {
+                                for (i = 0; i < 8; i++)
+                                        parport_nt_write_configa(bp[i]);
+				bp += 8;
+				sz -= 8;
+				ret += 8;
+			} else {
+				parport_nt_write_configa(*bp++);
+				sz--;
+				ret++;
+			}
+			tmo = 0x10000;
+		}
+		while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		parport_nt_write_econtrol(0x30); /* PS/2 mode */
+		return ret;
+	}
+	for (ret = 0; ret < sz; ret++, bp++)
+		parport_nt_write_data(*bp);
+	return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_nt_ops = {
+	parport_nt_read_data,
+	parport_nt_write_data,
+	parport_nt_read_status,
+	parport_nt_read_control,
+	parport_nt_write_control,
+	parport_nt_frob_control,
+	parport_nt_epp_write_data,
+	parport_nt_epp_read_data,
+	parport_nt_epp_write_addr,
+	parport_nt_epp_read_addr,
+	parport_nt_ecp_write_data,
+	parport_nt_ecp_read_data,
+	parport_nt_ecp_write_addr,
+	parport_nt_fpgaconfig_write
+};
+
+const struct parport_ops parport_nt_emul_ops = {
+	parport_nt_read_data,
+	parport_nt_write_data,
+	parport_nt_read_status,
+	parport_nt_read_control,
+	parport_nt_write_control,
+	parport_nt_frob_control,
+	parport_nt_emul_epp_write_data,
+	parport_nt_emul_epp_read_data,
+	parport_nt_emul_epp_write_addr,
+	parport_nt_emul_epp_read_addr,
+	parport_nt_emul_ecp_write_data,
+	parport_nt_emul_ecp_read_data,
+	parport_nt_emul_ecp_write_addr,
+	parport_nt_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppntddkgenport.c b/main/ppntddkgenport.c
new file mode 100644
index 0000000..a283815
--- /dev/null
+++ b/main/ppntddkgenport.c
@@ -0,0 +1,813 @@
+/*****************************************************************************/
+
+/*
+ *      ppntddkgenport.c  -- Parport direct access with NTDDK genport.sys.
+ *
+ *      Copyright (C) 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
+    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+
+#define FILE_ANY_ACCESS                 0
+#define FILE_READ_ACCESS          (0x0001) 
+#define FILE_WRITE_ACCESS         (0x0002)
+
+#define GPD_TYPE 40000
+
+#define IOCTL_GPD_READ_PORT_UCHAR \
+    CTL_CODE( GPD_TYPE, 0x900, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_READ_PORT_USHORT \
+    CTL_CODE( GPD_TYPE, 0x901, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_READ_PORT_ULONG \
+    CTL_CODE( GPD_TYPE, 0x902, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_WRITE_PORT_UCHAR \
+    CTL_CODE(GPD_TYPE,  0x910, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+#define IOCTL_GPD_WRITE_PORT_USHORT \
+    CTL_CODE(GPD_TYPE,  0x911, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+#define IOCTL_GPD_WRITE_PORT_ULONG \
+    CTL_CODE(GPD_TYPE,  0x912, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+typedef struct  _GENPORT_WRITE_INPUT {
+	ULONG PortNumber;     /* Port # to write to */
+	union {               /* Data to be output to port */
+		ULONG  LongData;
+		USHORT ShortData;
+		UCHAR  CharData;
+	};
+} GENPORT_WRITE_INPUT;
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_ntddkgenport_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_ntddkgenport_flags = 0;
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char pp_ntddkgenport_inb(unsigned int port)
+{
+	ULONG p = port;
+	UCHAR ch;
+	BOOL res;
+	DWORD retl;
+
+	if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_ntddkgenport_handle, IOCTL_GPD_READ_PORT_UCHAR, &p, sizeof(p), &ch, sizeof(ch), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: inb ioctl failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(ch)) {
+		lprintf(0, "Parport: inb ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+	return ch;
+}
+
+void pp_ntddkgenport_outb(unsigned char val, unsigned int port)
+{
+	GENPORT_WRITE_INPUT buf;
+	BOOL res;
+	DWORD retl;
+
+	if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE)
+		return;
+	buf.PortNumber = port;
+	buf.CharData = val;
+	res = DeviceIoControl(pp_ntddkgenport_handle, IOCTL_GPD_WRITE_PORT_UCHAR, &buf, sizeof(buf), NULL, 0, &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: outb ioctl failed, error 0x%08lx\n", GetLastError());
+		return;
+	}
+}
+
+void pp_ntddkgenport_insb(unsigned int port, unsigned char *bp, unsigned int len)
+{
+	for (; len > 0; len--, bp++)
+		*bp = pp_ntddkgenport_inb(port);
+}
+
+void pp_ntddkgenport_outsb(unsigned int port, const unsigned char *bp, unsigned int len)
+{
+	for (; len > 0; len--, bp++)
+		pp_ntddkgenport_outb(*bp, port);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+	if (pp_ntddkgenport_flags & FLAGS_PCECR)
+		pp_ntddkgenport_outb(ecr, LPTREG_ECONTROL);
+}
+
+int pp_ntddkgenport_epp_clear_timeout(void)
+{
+        unsigned char r;
+
+        if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+                return 1;
+        /* To clear timeout some chips require double read */
+	pp_ntddkgenport_inb(LPTREG_STATUS);
+	r = pp_ntddkgenport_inb(LPTREG_STATUS);
+	pp_ntddkgenport_outb(r | 0x01, LPTREG_STATUS); /* Some reset by writing 1 */
+	pp_ntddkgenport_outb(r & 0xfe, LPTREG_STATUS); /* Others by writing 0 */
+        r = pp_ntddkgenport_inb(LPTREG_STATUS);
+        return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_ntddkgenport_read_data(void)
+{
+	return pp_ntddkgenport_inb(LPTREG_DATA);
+}
+
+void parport_ntddkgenport_write_data(unsigned char d)
+{
+	pp_ntddkgenport_outb(d, LPTREG_DATA);
+}
+
+unsigned char parport_ntddkgenport_read_status(void)
+{
+	return pp_ntddkgenport_inb(LPTREG_STATUS);
+}
+
+
+unsigned char parport_ntddkgenport_read_control(void)
+{
+	return pp_ntddkgenport_inb(LPTREG_CONTROL);
+}
+
+void parport_ntddkgenport_write_control(unsigned char d)
+{
+	pp_ntddkgenport_outb(d, LPTREG_CONTROL);
+}
+
+void parport_ntddkgenport_frob_control(unsigned char mask, unsigned char val)
+{
+	unsigned char d = pp_ntddkgenport_inb(LPTREG_CONTROL);
+	d = (d & (~mask)) ^ val;
+	pp_ntddkgenport_outb(d, LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_EPPDATA);
+		if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_ntddkgenport_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_ntddkgenport_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = pp_ntddkgenport_inb(LPTREG_EPPDATA);
+		if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_ntddkgenport_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_ntddkgenport_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_EPPADDR);
+		if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_ntddkgenport_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_ntddkgenport_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = pp_ntddkgenport_inb(LPTREG_EPPADDR);
+		if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_ntddkgenport_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_emul_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = pp_ntddkgenport_inb(LPTREG_DATA);
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = pp_ntddkgenport_inb(LPTREG_DATA);
+		pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (pp_ntddkgenport_inb(LPTREG_DSR) & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	pp_ntddkgenport_outb(0x26, LPTREG_DCR);
+	/* Event 49: PError goes high */
+	while (!(pp_ntddkgenport_inb(LPTREG_DSR) & 0x20)) {
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	pp_ntddkgenport_outb(0x04, LPTREG_DCR);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (!(pp_ntddkgenport_inb(LPTREG_DSR) & 0x20))
+		return 0;
+	pp_ntddkgenport_outb(0x24, LPTREG_DCR);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	pp_ntddkgenport_outb(0x20, LPTREG_DCR);
+	while (pp_ntddkgenport_inb(LPTREG_DSR) & 0x20) {
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+	unsigned fcnt = 0;
+
+	pp_ntddkgenport_outb(0xd0, LPTREG_ECONTROL); /* FIFOtest mode */
+	while ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+		pp_ntddkgenport_inb(LPTREG_TFIFO);
+		fcnt++;
+	}
+	lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+	pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+	return cnt - fcnt;
+}
+
+unsigned parport_ntddkgenport_ecp_write_data(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			pp_ntddkgenport_outsb(LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			pp_ntddkgenport_outb(*bp++, LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+	}
+	pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_ntddkgenport_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+	
+	if (ecp_reverse())
+		return 0;
+	pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x01)
+			if (!(--tmo)) {
+				pp_ntddkgenport_outb(0xd0, LPTREG_ECONTROL); /* FIFOTEST mode */
+				while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) && sz > 0) {
+					*bp++ = pp_ntddkgenport_inb(LPTREG_TFIFO);
+					sz--;
+					ret++;
+				}
+				pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+				return ret;
+			}
+		if (stat & 0x02 && sz >= 8) {
+			pp_ntddkgenport_insb(LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			*bp++ = pp_ntddkgenport_inb(LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_ntddkgenport_ecp_write_addr(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			pp_ntddkgenport_outsb(LPTREG_AFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			pp_ntddkgenport_outb(*bp++, LPTREG_AFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+ 	}
+	pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = pp_ntddkgenport_inb(LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+		pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_STROBE, LPTREG_CONTROL);
+		for (tmo = 0; pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+		for (tmo = 0; !(pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_ntddkgenport_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = pp_ntddkgenport_inb(LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+		pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_STROBE, LPTREG_CONTROL);
+		for (tmo = 0; pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+		for (tmo = 0; !(pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_ntddkgenport_emul_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+
+	if (ecp_reverse())
+		return 0;	
+	ctl = pp_ntddkgenport_inb(LPTREG_CONTROL);
+	/* Set HostAck low to start accepting data. */
+	pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			stat = pp_ntddkgenport_inb(LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+		/* Read the data. */
+		*bp = pp_ntddkgenport_inb(LPTREG_DATA);
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		pp_ntddkgenport_outb(ctl & ~PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			stat = pp_ntddkgenport_inb(LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+		/* Event 46: Set HostAck low and accept the data. */
+		pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+ 
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_ntddkgenport_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+	return sz;
+}
+#else
+
+unsigned parport_ntddkgenport_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (pp_ntddkgenport_modes & PARPORT_MODE_PCECR) {
+		pp_ntddkgenport_outb(0x50, LPTREG_ECONTROL); /* COMPAT FIFO mode */
+		while (sz > 0) {
+			while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+				if (!(--tmo))
+					return emptyfifo(ret);
+			}
+			if (stat & 0x01 && sz >= 8) {
+				pp_ntddkgenport_outsb(LPTREG_DFIFO, bp, 8);
+				bp += 8;
+				sz -= 8;
+				ret += 8;
+			} else {
+				pp_ntddkgenport_outb(*bp++, LPTREG_DFIFO);
+				sz--;
+				ret++;
+			}
+			tmo = 0x10000;
+		}
+		while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+		return ret;
+	}
+	for (ret = 0; ret < sz; ret++, bp++)
+		pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+	return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_ntddkgenport_ops = {
+	parport_ntddkgenport_read_data,
+	parport_ntddkgenport_write_data,
+	parport_ntddkgenport_read_status,
+	parport_ntddkgenport_read_control,
+	parport_ntddkgenport_write_control,
+	parport_ntddkgenport_frob_control,
+	parport_ntddkgenport_epp_write_data,
+	parport_ntddkgenport_epp_read_data,
+	parport_ntddkgenport_epp_write_addr,
+	parport_ntddkgenport_epp_read_addr,
+	parport_ntddkgenport_ecp_write_data,
+	parport_ntddkgenport_ecp_read_data,
+	parport_ntddkgenport_ecp_write_addr,
+	parport_ntddkgenport_fpgaconfig_write
+};
+
+const struct parport_ops parport_ntddkgenport_emul_ops = {
+	parport_ntddkgenport_read_data,
+	parport_ntddkgenport_write_data,
+	parport_ntddkgenport_read_status,
+	parport_ntddkgenport_read_control,
+	parport_ntddkgenport_write_control,
+	parport_ntddkgenport_frob_control,
+	parport_ntddkgenport_emul_epp_write_data,
+	parport_ntddkgenport_emul_epp_read_data,
+	parport_ntddkgenport_emul_epp_write_addr,
+	parport_ntddkgenport_emul_epp_read_addr,
+	parport_ntddkgenport_emul_ecp_write_data,
+	parport_ntddkgenport_emul_ecp_read_data,
+	parport_ntddkgenport_emul_ecp_write_addr,
+	parport_ntddkgenport_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppntddkgenportinit.c b/main/ppntddkgenportinit.c
new file mode 100644
index 0000000..3bcc464
--- /dev/null
+++ b/main/ppntddkgenportinit.c
@@ -0,0 +1,469 @@
+/*****************************************************************************/
+
+/*
+ *      ppntddkgenportinit.c  -- Parport direct access with NTDDK genport.sys (init routines).
+ *
+ *      Copyright (C) 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVNAME "\\\\.\\GpdDev"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_ntddkgenport_handle;
+extern unsigned int pp_ntddkgenport_flags;
+extern const struct parport_ops parport_ntddkgenport_ops, parport_ntddkgenport_emul_ops;
+
+extern unsigned char pp_ntddkgenport_inb(unsigned int port);
+extern void pp_ntddkgenport_outb(unsigned char val, unsigned int port);
+extern int pp_ntddkgenport_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+	pp_ntddkgenport_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	pp_ntddkgenport_outb(0xc, LPTREG_ECONTROL);
+	pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+	pp_ntddkgenport_outb(0xaa, LPTREG_DATA);
+	if (pp_ntddkgenport_inb(LPTREG_DATA) != 0xaa)
+		return 0;
+	pp_ntddkgenport_outb(0x55, LPTREG_DATA);
+	if (pp_ntddkgenport_inb(LPTREG_DATA) != 0x55)
+		return 0;
+	return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+	unsigned char r = 0xc;
+
+	pp_ntddkgenport_outb(r, LPTREG_CONTROL);
+	if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+		pp_ntddkgenport_outb(r ^ 0x2, LPTREG_CONTROL); /* Toggle bit 1 */
+		r = pp_ntddkgenport_inb(LPTREG_CONTROL);	
+		if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+			goto no_reg; /* Sure that no ECR register exists */
+	}
+
+	if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x3 ) != 0x1)
+		goto no_reg;
+
+	pp_ntddkgenport_outb(0x34, LPTREG_ECONTROL);
+	if (pp_ntddkgenport_inb(LPTREG_ECONTROL) != 0x35)
+		goto no_reg;
+
+	pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+	
+	/* Go to mode 000 */
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0, LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECR;
+
+ no_reg:
+	pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+	return 0; 
+}
+
+static int parport_ecp(void)
+{
+	int i;
+	int config;
+	int pword;
+	int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+	/* Find out FIFO depth */
+	pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL); /* Reset FIFO */
+	pp_ntddkgenport_outb(0xc0, LPTREG_ECONTROL); /* TEST FIFO */
+	for (i=0; i < 1024 && !(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x02); i++)
+		pp_ntddkgenport_outb(0xaa, LPTREG_TFIFO);
+	/*
+	 * Using LGS chipset it uses ECR register, but
+	 * it doesn't support ECP or FIFO MODE
+	 */
+	if (i == 1024) {
+		pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL);
+		return 0;
+	}
+
+	fifo_depth = i;
+	lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+	/* Find out writeIntrThreshold */
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) | (1<<2), LPTREG_ECONTROL);
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~(1<<2) , LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		pp_ntddkgenport_inb(LPTREG_TFIFO);
+		usleep(50);
+		if (pp_ntddkgenport_inb(LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we know we can write if we get an
+                   interrupt. */
+		i = 0;
+
+	writeIntrThreshold = i;
+
+	/* Find out readIntrThreshold */
+	pp_ntddkgenport_outb((pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0) | 0x20, LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, LPTREG_CONTROL);
+	pp_ntddkgenport_outb((pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0) | 0xc0, LPTREG_ECONTROL); /* Test FIFO */
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) | (1<<2), LPTREG_ECONTROL);
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~(1<<2) , LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		pp_ntddkgenport_outb(0xaa, LPTREG_TFIFO);
+		if (pp_ntddkgenport_inb(LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we can read if we get an interrupt. */
+		i = 0;
+
+	readIntrThreshold = i;
+
+	pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL); /* Reset FIFO */
+	pp_ntddkgenport_outb(0xf4, LPTREG_ECONTROL); /* Configuration mode */
+	config = pp_ntddkgenport_inb(LPTREG_CONFIGA);
+	pword = (config >> 4) & 0x7;
+	switch (pword) {
+	case 0:
+		pword = 2;
+		lprintf(0, "ECP: Unsupported pword size! (2)\n");
+		break;
+	case 2:
+		pword = 4;
+		lprintf(0, "ECP: Unsupported pword size! (4)\n");
+		break;
+	default:
+		lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+		/* Assume 1 */
+	case 1:
+		pword = 1;
+	}
+	lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+	config = pp_ntddkgenport_inb(LPTREG_CONFIGB);
+	lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+	if (!(config & 0x40))
+		lprintf(3, "ECP: IRQ conflict!\n");
+
+	/* Go back to mode 000 */
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0, LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection  */
+
+static int parport_epp(void)
+{
+	/* If EPP timeout bit clear then EPP available */
+	if (!pp_ntddkgenport_epp_clear_timeout())
+		return 0;  /* No way to clear timeout */
+
+	/*
+	 * Theory:
+	 *     Write two values to the EPP address register and
+	 *     read them back. When the transfer times out, the state of
+	 *     the EPP register is undefined in some cases (EPP 1.9?) but
+	 *     in others (EPP 1.7, ECPEPP?) it is possible to read back
+	 *     its value.
+	 */
+
+	pp_ntddkgenport_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	pp_ntddkgenport_outb(0x55, LPTREG_EPPADDR);
+	pp_ntddkgenport_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	if (pp_ntddkgenport_inb(LPTREG_EPPADDR) == 0x55) {
+		pp_ntddkgenport_outb(0xaa, LPTREG_EPPADDR);
+		pp_ntddkgenport_epp_clear_timeout();
+		usleep(30); /* Wait for possible EPP timeout */
+		if (pp_ntddkgenport_inb(LPTREG_EPPADDR) == 0xaa) {
+			pp_ntddkgenport_epp_clear_timeout();
+			return PARPORT_MODE_PCEPP;
+		}
+	}
+
+	/*
+	 * Theory:
+	 *	Bit 0 of STR is the EPP timeout bit, this bit is 0
+	 *	when EPP is possible and is set high when an EPP timeout
+	 *	occurs (EPP uses the HALT line to stop the CPU while it does
+	 *	the byte transfer, an EPP timeout occurs if the attached
+	 *	device fails to respond after 10 micro seconds).
+	 *
+	 *	This bit is cleared by either reading it (National Semi)
+	 *	or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+	 *	This bit is always high in non EPP modes.
+	 */
+
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | 0x20, LPTREG_CONTROL);
+	pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | 0x10, LPTREG_CONTROL);
+	pp_ntddkgenport_epp_clear_timeout();
+	
+	pp_ntddkgenport_inb(LPTREG_EPPDATA);
+	usleep(30);  /* Wait for possible EPP timeout */
+	
+	if (pp_ntddkgenport_inb(LPTREG_STATUS) & 0x01) {
+		pp_ntddkgenport_epp_clear_timeout();
+		return PARPORT_MODE_PCEPP;
+	}
+	return 0;
+}
+
+static int parport_ecpepp(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = pp_ntddkgenport_inb(LPTREG_ECONTROL);
+	/* Search for SMC style EPP+ECP mode */
+	pp_ntddkgenport_outb(0x80, LPTREG_ECONTROL);
+	mode = parport_epp();
+	pp_ntddkgenport_outb(oecr, LPTREG_ECONTROL);
+       	return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines.  In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero.  So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present. 
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal.  Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic. 
+ */
+
+static int parport_ps2(void)
+{
+	int ok = 0;
+	unsigned char octr = pp_ntddkgenport_inb(LPTREG_CONTROL);
+  
+	pp_ntddkgenport_epp_clear_timeout();
+
+	pp_ntddkgenport_outb(octr | 0x20, LPTREG_CONTROL);  /* try to tri-state the buffer */
+	
+	pp_ntddkgenport_outb(0x55, LPTREG_DATA);
+	if (pp_ntddkgenport_inb(LPTREG_DATA) != 0x55) ok++;
+	pp_ntddkgenport_outb(0xaa, LPTREG_DATA);
+	if (pp_ntddkgenport_inb(LPTREG_DATA) != 0xaa) ok++;
+
+	pp_ntddkgenport_outb(octr, 0);          /* cancel input mode */
+
+	return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = pp_ntddkgenport_inb(LPTREG_ECONTROL);
+	pp_ntddkgenport_outb(0x20, LPTREG_ECONTROL);
+      	mode = parport_ps2();
+	pp_ntddkgenport_outb(oecr, LPTREG_ECONTROL);
+	return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ntddkgenport(void)
+{
+	if (pp_ntddkgenport_handle != INVALID_HANDLE_VALUE)
+		CloseHandle(pp_ntddkgenport_handle);
+	pp_ntddkgenport_handle = CreateFile(DEVNAME, GENERIC_READ | GENERIC_WRITE,
+					    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+					    OPEN_EXISTING, 0, NULL);
+	if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE) {
+		lprintf(0, "Cannot open genport.sys driver, error 0x%08lx\n", GetLastError());
+		return -1;
+	}
+	pp_ntddkgenport_flags = FLAGS_PCSPP;
+	if (!parport_spp()) {
+		lprintf(0, "No parport present\n");
+		goto err;
+	}
+	if (parport_ecr()) {
+		pp_ntddkgenport_flags |= FLAGS_PCECR;
+		pp_ntddkgenport_flags |= parport_ecp();
+		pp_ntddkgenport_flags |= parport_ecpps2();
+		pp_ntddkgenport_flags |= parport_ecpepp();
+	} else {
+		pp_ntddkgenport_flags |= parport_ps2();
+		pp_ntddkgenport_flags |= parport_epp();
+	}
+	lprintf(0, "Parport capabilities: SPP");
+	if (pp_ntddkgenport_flags & FLAGS_PCPS2)
+		lprintf(0, ", PS2");
+	if (pp_ntddkgenport_flags & FLAGS_PCEPP)
+		lprintf(0, ", EPP");
+	if (pp_ntddkgenport_flags & FLAGS_PCECR)
+		lprintf(0, ", ECR");
+	if (pp_ntddkgenport_flags & FLAGS_PCECP)
+		lprintf(0, ", ECP");
+	if (pp_ntddkgenport_flags & FLAGS_PCECPEPP)
+		lprintf(0, ", ECPEPP");
+	if (pp_ntddkgenport_flags & FLAGS_PCECPPS2)
+		lprintf(0, ", ECPPS2");
+	if (!(pp_ntddkgenport_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2)))  {
+		lprintf(0, "\nParport does not even support PS/2 mode, cannot use it\n");
+		goto err;
+	}
+	lprintf(0, "\nParport using NTDDK genport.sys hardware access");
+	if (pp_ntddkgenport_flags & FLAGS_PCECR)
+		pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+	parport_ops = parport_ntddkgenport_ops;
+	if (!(pp_ntddkgenport_flags & FLAGS_PCECP)) {
+		parport_ops.parport_ecp_write_data = parport_ntddkgenport_emul_ops.parport_ecp_write_data;
+		parport_ops.parport_ecp_read_data = parport_ntddkgenport_emul_ops.parport_ecp_read_data;
+		parport_ops.parport_ecp_write_addr = parport_ntddkgenport_emul_ops.parport_ecp_write_addr;
+		lprintf(0, ", emulating ECP");
+	}
+	if (!(pp_ntddkgenport_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+		parport_ops.parport_epp_write_data = parport_ntddkgenport_emul_ops.parport_epp_write_data;
+		parport_ops.parport_epp_read_data = parport_ntddkgenport_emul_ops.parport_epp_read_data;
+		parport_ops.parport_epp_write_addr = parport_ntddkgenport_emul_ops.parport_epp_write_addr;
+		parport_ops.parport_epp_read_addr = parport_ntddkgenport_emul_ops.parport_epp_read_addr;
+		lprintf(0, ", emulating EPP");
+	}
+	lprintf(0, "\n");
+	return 0;
+
+  err:
+	CloseHandle(pp_ntddkgenport_handle);
+	pp_ntddkgenport_handle = INVALID_HANDLE_VALUE;
+	return -1;
+}
diff --git a/main/ppntinit.c b/main/ppntinit.c
new file mode 100644
index 0000000..d709214
--- /dev/null
+++ b/main/ppntinit.c
@@ -0,0 +1,587 @@
+/*****************************************************************************/
+
+/*
+ *      ppntinit.c  -- Parport direct access with NT eppflex.sys (init routines).
+ *
+ *      Copyright (C) 2000-2001  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVNAME "\\\\.\\GpdDev"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_nt_handle;
+extern unsigned int pp_nt_flags;
+extern const struct parport_ops parport_nt_ops, parport_nt_emul_ops;
+
+extern unsigned char parport_nt_read_data(void);
+extern void parport_nt_write_data(unsigned char d);
+extern unsigned char parport_nt_read_status(void);
+extern unsigned char parport_nt_read_control(void);
+extern void parport_nt_write_control(unsigned char d);
+extern void parport_nt_frob_control(unsigned char mask, unsigned char val);
+extern unsigned char parport_nt_read_configa(void);
+extern void parport_nt_write_configa(unsigned char d);
+extern unsigned char parport_nt_read_configb(void);
+extern void parport_nt_write_configb(unsigned char d);
+extern unsigned char parport_nt_read_econtrol(void);
+extern void parport_nt_write_econtrol(unsigned char d);
+extern void parport_nt_frob_econtrol(unsigned char mask, unsigned char val);
+extern unsigned char parport_nt_read_eppaddr(void);
+extern void parport_nt_write_eppaddr(unsigned char d);
+extern unsigned char parport_nt_read_eppdata(void);
+extern void parport_nt_write_eppdata(unsigned char d);
+extern int pp_nt_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+	pp_nt_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	parport_nt_write_econtrol(0xc);
+	parport_nt_write_control(0xc);
+	parport_nt_write_data(0xaa);
+	if (parport_nt_read_data() != 0xaa)
+		return 0;
+	parport_nt_write_data(0x55);
+	if (parport_nt_read_data() != 0x55)
+		return 0;
+	return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+	unsigned char r = 0xc;
+
+	parport_nt_write_control(r);
+	if ((parport_nt_read_econtrol() & 0x3) == (r & 0x3)) {
+		parport_nt_write_control(r ^ 0x2); /* Toggle bit 1 */
+		r = parport_nt_read_control();	
+		if ((parport_nt_read_econtrol() & 0x2) == (r & 0x2))
+			goto no_reg; /* Sure that no ECR register exists */
+	}
+
+	if ((parport_nt_read_econtrol() & 0x3 ) != 0x1)
+		goto no_reg;
+
+	parport_nt_write_econtrol(0x34);
+	if (parport_nt_read_econtrol() != 0x35)
+		goto no_reg;
+
+	parport_nt_write_control(0xc);
+	
+	/* Go to mode 000 */
+	parport_nt_frob_econtrol(0xe0, 0);
+
+	return PARPORT_MODE_PCECR;
+
+ no_reg:
+	parport_nt_write_control(0xc);
+	return 0; 
+}
+
+static int parport_ecp(void)
+{
+	int i;
+	int config;
+	int pword;
+	int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+	/* Find out FIFO depth */
+	parport_nt_write_econtrol(0x00); /* Reset FIFO */
+	parport_nt_write_econtrol(0xc0); /* TEST FIFO */
+	for (i=0; i < 1024 && !(parport_nt_read_econtrol() & 0x02); i++)
+		parport_nt_write_configa(0xaa);
+	/*
+	 * Using LGS chipset it uses ECR register, but
+	 * it doesn't support ECP or FIFO MODE
+	 */
+	if (i == 1024) {
+		parport_nt_write_econtrol(0x00);
+		return 0;
+	}
+
+	fifo_depth = i;
+	lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+	/* Find out writeIntrThreshold */
+        parport_nt_frob_econtrol((1<<2), (1<<2));
+        parport_nt_frob_econtrol((1<<2), 0);
+	for (i = 1; i <= fifo_depth; i++) {
+		parport_nt_read_configa();
+		usleep(50);
+		if (parport_nt_read_econtrol() & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we know we can write if we get an
+                   interrupt. */
+		i = 0;
+
+	writeIntrThreshold = i;
+
+	/* Find out readIntrThreshold */
+        parport_nt_frob_econtrol(0xe0, 0x20); /* Reset FIFO, PS2 */
+	parport_nt_frob_control(PARPORT_CONTROL_DIRECTION, PARPORT_CONTROL_DIRECTION);
+	parport_nt_frob_econtrol(0xe0, 0xc0); /* Test FIFO */
+        parport_nt_frob_econtrol((1<<2), (1<<2));
+        parport_nt_frob_econtrol((1<<2), 0);
+        for (i = 1; i <= fifo_depth; i++) {
+		parport_nt_write_configa(0xaa);
+		if (parport_nt_read_econtrol() & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we can read if we get an interrupt. */
+		i = 0;
+
+	readIntrThreshold = i;
+
+	parport_nt_write_econtrol(0x00); /* Reset FIFO */
+	parport_nt_write_econtrol(0xf4); /* Configuration mode */
+	config = parport_nt_read_configa();
+	pword = (config >> 4) & 0x7;
+	switch (pword) {
+	case 0:
+		pword = 2;
+		lprintf(0, "ECP: Unsupported pword size! (2)\n");
+		break;
+	case 2:
+		pword = 4;
+		lprintf(0, "ECP: Unsupported pword size! (4)\n");
+		break;
+	default:
+		lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+		/* Assume 1 */
+	case 1:
+		pword = 1;
+	}
+	lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+	config = parport_nt_read_configb();
+	lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+	if (!(config & 0x40))
+		lprintf(3, "ECP: IRQ conflict!\n");
+
+	/* Go back to mode 000 */
+	parport_nt_frob_econtrol(0xe0, 0);
+
+	return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection  */
+
+static int parport_epp(void)
+{
+	/* If EPP timeout bit clear then EPP available */
+	if (!pp_nt_epp_clear_timeout())
+		return 0;  /* No way to clear timeout */
+
+	/*
+	 * Theory:
+	 *     Write two values to the EPP address register and
+	 *     read them back. When the transfer times out, the state of
+	 *     the EPP register is undefined in some cases (EPP 1.9?) but
+	 *     in others (EPP 1.7, ECPEPP?) it is possible to read back
+	 *     its value.
+	 */
+
+	pp_nt_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	parport_nt_write_eppaddr(0x55);
+	pp_nt_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	if (parport_nt_read_eppaddr() == 0x55) {
+		parport_nt_write_eppaddr(0xaa);
+		pp_nt_epp_clear_timeout();
+		usleep(30); /* Wait for possible EPP timeout */
+		if (parport_nt_read_eppaddr() == 0xaa) {
+			pp_nt_epp_clear_timeout();
+			return PARPORT_MODE_PCEPP;
+		}
+	}
+
+	/*
+	 * Theory:
+	 *	Bit 0 of STR is the EPP timeout bit, this bit is 0
+	 *	when EPP is possible and is set high when an EPP timeout
+	 *	occurs (EPP uses the HALT line to stop the CPU while it does
+	 *	the byte transfer, an EPP timeout occurs if the attached
+	 *	device fails to respond after 10 micro seconds).
+	 *
+	 *	This bit is cleared by either reading it (National Semi)
+	 *	or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+	 *	This bit is always high in non EPP modes.
+	 */
+
+	parport_nt_frob_control(0x20, 0x20);
+	parport_nt_frob_control(0x10, 0x10);
+	pp_nt_epp_clear_timeout();
+	
+	parport_nt_read_eppdata();
+	usleep(30);  /* Wait for possible EPP timeout */
+	
+	if (parport_nt_read_status() & 0x01) {
+		pp_nt_epp_clear_timeout();
+		return PARPORT_MODE_PCEPP;
+	}
+	return 0;
+}
+
+static int parport_ecpepp(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = parport_nt_read_econtrol();
+	/* Search for SMC style EPP+ECP mode */
+	parport_nt_write_econtrol(0x80);
+	mode = parport_epp();
+	parport_nt_write_econtrol(oecr);
+       	return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines.  In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero.  So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present. 
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal.  Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic. 
+ */
+
+static int parport_ps2(void)
+{
+	int ok = 0;
+	unsigned char octr = parport_nt_read_control();
+  
+	pp_nt_epp_clear_timeout();
+
+	parport_nt_write_control(octr | 0x20);  /* try to tri-state the buffer */
+	
+	parport_nt_write_data(0x55);
+	if (parport_nt_read_data() != 0x55) ok++;
+	parport_nt_write_data(0xaa);
+	if (parport_nt_read_data() != 0xaa) ok++;
+
+	parport_nt_write_control(octr);          /* cancel input mode */
+
+	return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = parport_nt_read_econtrol();
+	parport_nt_write_econtrol(0x20);
+      	mode = parport_ps2();
+	parport_nt_write_econtrol(oecr);
+	return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SERVICENAME        "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY      "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY      "System32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+                              SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+                              SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+        if (!hserv) {
+                lprintf(5, "Cannot create service, error 0x%08lx\n", GetLastError());
+                hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+                if (!hserv) {
+                        lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+                        goto closescm;
+                }
+        }
+        if (!StartService(hserv, 0, NULL)) {
+                lprintf(5, "Cannot start service, error 0x%08lx\n", GetLastError());
+                goto closeserv;
+        }
+        lprintf(1, "Service %s started successfully\n", SERVICENAME);
+        ret = 0;
+
+  closeserv:
+        if (!CloseServiceHandle(hserv))
+                lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+static int stop_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        SERVICE_STATUS sstat;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+        if (!hserv) {
+                lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+                goto closescm;
+        }
+        ret = 0;
+        if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+                lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!DeleteService(hserv)) {
+                lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!ret)
+                lprintf(1, "Service %s stopped successfully\n", SERVICENAME);
+        if (!CloseServiceHandle(hserv))
+                lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void parport_stop_nt(void)
+{
+        if (pp_nt_handle != INVALID_HANDLE_VALUE)
+                CloseHandle(pp_nt_handle);
+	pp_nt_handle = INVALID_HANDLE_VALUE;
+        stop_service();
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_nt_flags(unsigned int portnr, unsigned int flags)
+{
+        char buf[32];
+
+	if (pp_nt_handle != INVALID_HANDLE_VALUE)
+		CloseHandle(pp_nt_handle);
+        start_service();
+        snprintf(buf, sizeof(buf), "\\\\.\\eppflex\\%u", portnr);
+	pp_nt_handle = CreateFile(buf, GENERIC_READ | GENERIC_WRITE,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                                  OPEN_EXISTING, 0, NULL);
+	if (pp_nt_handle == INVALID_HANDLE_VALUE) {
+		lprintf(0, "Cannot open eppflex.sys driver, error 0x%08lx\n", GetLastError());
+		goto err;
+	}
+	pp_nt_flags = FLAGS_PCSPP;
+	if (!parport_spp()) {
+		lprintf(0, "No parport present\n");
+		goto err;
+	}
+	if (parport_ecr()) {
+		pp_nt_flags |= FLAGS_PCECR;
+		pp_nt_flags |= parport_ecp();
+		pp_nt_flags |= parport_ecpps2();
+		pp_nt_flags |= parport_ecpepp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_nt_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_nt_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_nt_flags |= FLAGS_PCECPEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	} else {
+		pp_nt_flags |= parport_ps2();
+		pp_nt_flags |= parport_epp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_nt_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_nt_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_nt_flags |= FLAGS_PCEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	}
+	lprintf(0, "Parport capabilities: SPP%s%s%s%s%s%s\n",
+		(pp_nt_flags & FLAGS_PCPS2) ? ", PS2" : "",
+		(pp_nt_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+		(pp_nt_flags & FLAGS_PCECR) ? ", ECR" : "",
+		(pp_nt_flags & FLAGS_PCECP) ? ", ECP" : "",
+		(pp_nt_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+		(pp_nt_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+	if (!(pp_nt_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2)))  {
+		lprintf(0, "Parport does not even support PS/2 mode, cannot use it\n");
+		goto err;
+	}
+	lprintf(0, "Parport using NT eppflex.sys hardware access");
+	if (pp_nt_flags & FLAGS_PCECR)
+		parport_nt_write_econtrol(0x30); /* PS/2 mode */
+	parport_ops = parport_nt_ops;
+	if ((flags & PPFLAG_SWEMULECP) || !(pp_nt_flags & FLAGS_PCECP)) {
+		parport_ops.parport_ecp_write_data = parport_nt_emul_ops.parport_ecp_write_data;
+		parport_ops.parport_ecp_read_data = parport_nt_emul_ops.parport_ecp_read_data;
+		parport_ops.parport_ecp_write_addr = parport_nt_emul_ops.parport_ecp_write_addr;
+		lprintf(0, ", emulating ECP");
+	}
+	if ((flags & PPFLAG_SWEMULEPP) || !(pp_nt_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+		parport_ops.parport_epp_write_data = parport_nt_emul_ops.parport_epp_write_data;
+		parport_ops.parport_epp_read_data = parport_nt_emul_ops.parport_epp_read_data;
+		parport_ops.parport_epp_write_addr = parport_nt_emul_ops.parport_epp_write_addr;
+		parport_ops.parport_epp_read_addr = parport_nt_emul_ops.parport_epp_read_addr;
+		lprintf(0, ", emulating EPP");
+	}
+	lprintf(0, "\n");
+	return 0;
+
+  err:
+        parport_stop_nt();
+	return -1;
+}
+
+int parport_init_nt(unsigned int portnr)
+{
+        return parport_init_nt_flags(portnr, 0);
+}
diff --git a/main/ppuser.c b/main/ppuser.c
new file mode 100644
index 0000000..8f8a0d5
--- /dev/null
+++ b/main/ppuser.c
@@ -0,0 +1,450 @@
+/*****************************************************************************/
+
+/*
+ *      ppuser.c  -- Parport access via Linux PPUSER device.
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppuser.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_user_fd = -1;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_user_exit(void)
+{
+	if (pp_user_fd != -1) {
+		ioctl(pp_user_fd, PPRELEASE, 0);
+		close(pp_user_fd);
+	}
+	pp_user_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_user_read_data(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_user_fd, PPRDATA, &r);
+	return r;
+}
+
+void parport_user_write_data(unsigned char d)
+{
+	ioctl(pp_user_fd, PPWDATA, &d);
+}
+
+unsigned char parport_user_read_status(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_user_fd, PPRSTATUS, &r);
+	return r;
+}
+
+
+unsigned char parport_user_read_control(void)
+{
+	unsigned char r;
+	
+	ioctl(pp_user_fd, PPRCONTROL, &r);
+	return r;
+}
+
+void parport_user_write_control(unsigned char d)
+{
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+}
+
+void parport_user_frob_control(unsigned char mask, unsigned char val)
+{
+	unsigned char d;
+	
+	ioctl(pp_user_fd, PPRCONTROL, &d);
+	d = (d & (~mask)) ^ val;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_user_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+	unsigned char d;
+
+	d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	for (; sz > 0; sz--, bp++) {
+		ioctl(pp_user_fd, PPWDATA, bp);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (d & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (!(d & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_user_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+	unsigned char d;
+
+	d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (d & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (!(d & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ioctl(pp_user_fd, PPRDATA, bp);
+		d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_user_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+	unsigned char d;
+
+	d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	for (; sz > 0; sz--, bp++) {
+		ioctl(pp_user_fd, PPWDATA, bp);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (d & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (!(d & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_user_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+	unsigned char d;
+
+	d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (d & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		for (tmo = 0; ; tmo++) {
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+			if (!(d & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ioctl(pp_user_fd, PPRDATA, bp);
+		d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+	unsigned char d;
+
+	ioctl(pp_user_fd, PPRSTATUS, &d);
+	if (d & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	d = 0x26;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	/* Event 49: PError goes high */
+	for (;;) {
+		ioctl(pp_user_fd, PPRSTATUS, &d);
+		if (d & 0x20)
+			break;
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	d = 0x04;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+	unsigned char d;
+
+	ioctl(pp_user_fd, PPRSTATUS, &d);
+	if (!(d & 0x20))
+		return 0;
+	d = 0x24;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	d = 0x20;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	for (;;) {
+		ioctl(pp_user_fd, PPRSTATUS, &d);
+		if (!(d & 0x20))
+			break;
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+unsigned parport_user_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl, d;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ioctl(pp_user_fd, PPRCONTROL, &ctl);
+	ctl &= ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	ioctl(pp_user_fd, PPWCONTROL, &ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		ioctl(pp_user_fd, PPWDATA, bp);
+		d = ctl | PARPORT_CONTROL_STROBE;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		tmo = 0;
+		do {
+			if (tmo > 0x1000)
+				return ret;
+			tmo++;
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+		} while (d & PARPORT_STATUS_BUSY);
+		ioctl(pp_user_fd, PPWCONTROL, &ctl);
+		tmo = 0;
+		do {
+			if (tmo > 0x1000)
+				return ret;
+			tmo++;
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+		} while (!(d & PARPORT_STATUS_BUSY));
+	}
+	return ret;
+}
+
+unsigned parport_user_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl, d;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ioctl(pp_user_fd, PPRCONTROL, &ctl);
+	ctl |= PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	ioctl(pp_user_fd, PPWCONTROL, &ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		ioctl(pp_user_fd, PPWDATA, bp);
+		d = ctl | PARPORT_CONTROL_STROBE;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+		tmo = 0;
+		do {
+			if (tmo > 0x1000)
+				return ret;
+			tmo++;
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+		} while (d & PARPORT_STATUS_BUSY);
+		ioctl(pp_user_fd, PPWCONTROL, &ctl);
+		tmo = 0;
+		do {
+			if (tmo > 0x1000)
+				return ret;
+			tmo++;
+			ioctl(pp_user_fd, PPRSTATUS, &d);
+		} while (!(d & PARPORT_STATUS_BUSY));
+	}
+	return ret;
+}
+
+unsigned parport_user_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+	unsigned char d;
+
+	if (ecp_reverse())
+		return 0;
+	ioctl(pp_user_fd, PPRCONTROL, &ctl);
+	/* Set HostAck low to start accepting data. */
+	d = ctl | PARPORT_CONTROL_AUTOFD;
+	ioctl(pp_user_fd, PPWCONTROL, &d);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			ioctl(pp_user_fd, PPRSTATUS, &stat);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+
+		/* Read the data. */
+		ioctl(pp_user_fd, PPRDATA, bp);
+
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		d = ctl & ~PARPORT_CONTROL_AUTOFD;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			ioctl(pp_user_fd, PPRSTATUS, &stat);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+
+		/* Event 46: Set HostAck low and accept the data. */
+		d = ctl | PARPORT_CONTROL_AUTOFD;
+		ioctl(pp_user_fd, PPWCONTROL, &d);
+
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_user_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		parport_user_write_data(*bp);
+	return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_user_ops = {
+	parport_user_read_data,
+	parport_user_write_data,
+	parport_user_read_status,
+	parport_user_read_control,
+	parport_user_write_control,
+	parport_user_frob_control,
+	parport_user_epp_write_data,
+	parport_user_epp_read_data,
+	parport_user_epp_write_addr,
+	parport_user_epp_read_addr,
+	parport_user_ecp_write_data,
+	parport_user_ecp_read_data,
+	parport_user_ecp_write_addr,
+	parport_user_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppuser.h b/main/ppuser.h
new file mode 100644
index 0000000..2b32be0
--- /dev/null
+++ b/main/ppuser.h
@@ -0,0 +1,48 @@
+/*
+ * User-space parallel port device driver (header file).
+ *
+ * Copyright (C) 1998-9 Tim Waugh <tim at cyberelk.demon.co.uk>
+ *
+ * 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 of the License, or (at your option) any later version.
+ *
+ */
+
+#define PP_MAJOR	99
+
+#define PP_IOCTL	'p'
+
+/* Set mode for read/write (e.g. PARPORT_MODE_PCEPP) */
+#define PPSETMODE	_IOW(PP_IOCTL, 0x80, int)
+
+/* Read/write status */
+#define PPRSTATUS	_IOR(PP_IOCTL, 0x81, unsigned char)
+#define PPWSTATUS	_IOW(PP_IOCTL, 0x82, unsigned char)
+
+/* Read/write control */
+#define PPRCONTROL	_IOR(PP_IOCTL, 0x83, unsigned char)
+#define PPWCONTROL	_IOW(PP_IOCTL, 0x84, unsigned char)
+
+/* Read/write data */
+#define PPRDATA		_IOR(PP_IOCTL, 0x85, unsigned char)
+#define PPWDATA		_IOW(PP_IOCTL, 0x86, unsigned char)
+
+/* Read/write econtrol */
+#define PPRECONTROL	_IOR(PP_IOCTL, 0x87, unsigned char)
+#define PPWECONTROL	_IOW(PP_IOCTL, 0x88, unsigned char)
+
+/* Read/write FIFO */
+#define PPRFIFO		_IOR(PP_IOCTL, 0x89, unsigned char)
+#define PPWFIFO		_IOW(PP_IOCTL, 0x8a, unsigned char)
+
+/* Claim the port to start using it */
+#define PPCLAIM		_IO(PP_IOCTL, 0x8b)
+
+/* Release the port when you aren't using it */
+#define PPRELEASE	_IO(PP_IOCTL, 0x8c)
+
+/* Yield the port (release it if another driver is waiting,
+ * then reclaim) */
+#define PPYIELD		_IO(PP_IOCTL, 0x8d)
diff --git a/main/ppuserinit.c b/main/ppuserinit.c
new file mode 100644
index 0000000..f99d3a5
--- /dev/null
+++ b/main/ppuserinit.c
@@ -0,0 +1,80 @@
+/*****************************************************************************/
+
+/*
+ *      ppuserinit.c  -- Parport access via Linux PPUSER device (init routines).
+ *
+ *      Copyright (C) 1998-1999  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppuser.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_user_fd;
+extern const struct parport_ops parport_user_ops;
+extern void parport_user_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppuser(const char *path)
+{
+	unsigned char d;
+
+	if ((pp_user_fd = open(path, O_RDWR | O_NONBLOCK)) == -1) {
+		lprintf(0, "Cannot open ppuser device %s (error %s)\n", path,
+			strerror(errno));
+		return -1;
+	}
+	if (ioctl(pp_user_fd, PPCLAIM, 0)) {
+		lprintf(0, "Cannot claim ppuser device %s (error %s)\n", path,
+			strerror(errno));
+		close(pp_user_fd);
+		pp_user_fd = -1;
+		return -1;
+	}
+	if (atexit(parport_user_exit)) {
+		lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+		ioctl(pp_user_fd, PPRELEASE, 0);
+		close(pp_user_fd);
+		pp_user_fd = -1;
+		return -1;
+	}
+	d = 0x30;  /* set PS/2 mode */
+	ioctl(pp_user_fd, PPWECONTROL, &d);
+	parport_ops = parport_user_ops;
+	return 0;
+}
diff --git a/main/ppw9xring0.c b/main/ppw9xring0.c
new file mode 100644
index 0000000..bac28a7
--- /dev/null
+++ b/main/ppw9xring0.c
@@ -0,0 +1,797 @@
+/*****************************************************************************/
+
+/*
+ *      ppw9xring0.c  --  Parport direct access under Win9x using Ring0 hack.
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+unsigned int pp_w9xring0_iobase = 0x378;
+unsigned int pp_w9xring0_flags = 0;
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+asm(".text\n\t"
+    ".align\t4\n"
+    "_do_ring0_inb:\n\t"
+    "inb %dx,%al\n\t"
+    "lret\n\n\t"
+    ".align\t4\n"
+    "_do_ring0_outb:\n\t"
+    "outb %al,%dx\n\t"
+    "lret\n\n\t"
+    ".align\t4\n\t"
+    ".data\n\t");
+
+extern int do_ring0_inb(int,int);
+extern int do_ring0_outb(int,int);
+
+static int call_ring0(int (*routine)(int,int), int param1, int param2)
+{
+        unsigned short gdtbase[3];
+        unsigned short callgateaddr[3];
+        struct gdt {
+                unsigned short offslo;
+                unsigned short selector;
+                unsigned short flags;
+                unsigned short offshi;
+        } *gdt, *mygdt;
+        unsigned int i, maxgdt;
+        int ret;
+        
+        asm("sgdt\t%0" : "=m" (gdtbase));
+        gdt = (struct gdt *)((gdtbase[2] << 16) | gdtbase[1]);
+        maxgdt = gdtbase[0]/8; /* gdt limit */
+        for (i = 1; i < maxgdt; i++) {
+                if (!gdt[i].flags && !gdt[i].selector && !gdt[i].offslo && !gdt[i].offshi)
+                        break;
+        }
+        if (i >= maxgdt) {
+                lprintf(3, "Cannot find free GDT entry\n");
+                return -1;
+        }
+        mygdt = &gdt[i];
+        mygdt->flags = (1 << 15) | /* present */
+                (0x0c00) |         /* type: call gate */
+                (3 << 13) |        /* DPL */
+                0;                 /* dword count */
+        mygdt->selector = 0x28;
+        mygdt->offslo = ((unsigned long)routine);
+        mygdt->offshi = ((unsigned long)routine) >> 16;
+        callgateaddr[0] = callgateaddr[1] = 0;
+        callgateaddr[2] = (i << 3) | 3;
+        asm("lcall\t%1" : "=a" (ret) : "m" (callgateaddr[0]), "d" (param1), "0" (param2) : "memory");
+        memset(mygdt, 0, sizeof(struct gdt));
+        return ret;
+}
+
+unsigned char ring0_inb(unsigned int port)
+{
+        return call_ring0(do_ring0_inb, port, 0);
+}
+
+void ring0_outb(unsigned char val, unsigned int port)
+{
+        call_ring0(do_ring0_outb, port, val);
+}
+
+void ring0_outsb(unsigned int port, const unsigned char *bp, unsigned int count)
+{
+        while (count > 0) {
+                ring0_outb(*bp++, port);
+                count--;
+        }
+}
+
+void ring0_insb(unsigned int port, unsigned char *bp, unsigned int count)
+{
+        while (count > 0) {
+                *bp++ = ring0_inb(port);
+                count--;
+        }
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+	if (pp_w9xring0_flags & FLAGS_PCECR)
+		ring0_outb(ecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+}
+
+int pp_w9xring0_epp_clear_timeout(void)
+{
+        unsigned char r;
+
+        if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+                return 1;
+        /* To clear timeout some chips require double read */
+	ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+	r = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+	ring0_outb(r | 0x01, pp_w9xring0_iobase + LPTREG_STATUS); /* Some reset by writing 1 */
+	ring0_outb(r & 0xfe, pp_w9xring0_iobase + LPTREG_STATUS); /* Others by writing 0 */
+        r = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+        return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_w9xring0_read_data(void)
+{
+	return ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+}
+
+void parport_w9xring0_write_data(unsigned char d)
+{
+	ring0_outb(d, pp_w9xring0_iobase + LPTREG_DATA);
+}
+
+unsigned char parport_w9xring0_read_status(void)
+{
+	return ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+}
+
+
+unsigned char parport_w9xring0_read_control(void)
+{
+	return ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+void parport_w9xring0_write_control(unsigned char d)
+{
+	ring0_outb(d, pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+void parport_w9xring0_frob_control(unsigned char mask, unsigned char val)
+{
+	unsigned char d = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+	d = (d & (~mask)) ^ val;
+	ring0_outb(d, pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_EPPDATA);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_w9xring0_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_w9xring0_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = ring0_inb(pp_w9xring0_iobase + LPTREG_EPPDATA);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_w9xring0_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_w9xring0_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_EPPADDR);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_w9xring0_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_w9xring0_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+			pp_w9xring0_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_emul_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+		for (tmo = 0; ; tmo++) {
+			if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ; tmo++) {
+			if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+		ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	ring0_outb(0x26, pp_w9xring0_iobase + LPTREG_DCR);
+	/* Event 49: PError goes high */
+	while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20)) {
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	ring0_outb(0x04, pp_w9xring0_iobase + LPTREG_DCR);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20))
+		return 0;
+	ring0_outb(0x24, pp_w9xring0_iobase + LPTREG_DCR);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	ring0_outb(0x20, pp_w9xring0_iobase + LPTREG_DCR);
+	while (ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20) {
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+	unsigned fcnt = 0;
+
+	ring0_outb(0xd0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* FIFOtest mode */
+	while ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+		ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+		fcnt++;
+	}
+	printf("emptyfifo: FIFO contained %d bytes\n", fcnt);
+	ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return cnt - fcnt;
+}
+
+unsigned parport_w9xring0_ecp_write_data(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			ring0_outsb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+	}
+	ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_w9xring0_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+	
+	if (ecp_reverse())
+		return 0;
+	ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x01)
+			if (!(--tmo)) {
+				ring0_outb(0xd0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* FIFOTEST mode */
+				while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) && sz > 0) {
+					*bp++ = ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+					sz--;
+					ret++;
+				}
+				ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+				return ret;
+			}
+		if (stat & 0x02 && sz >= 8) {
+			ring0_insb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			*bp++ = ring0_inb(pp_w9xring0_iobase + LPTREG_DFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_w9xring0_ecp_write_addr(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (ecp_forward())
+		return 0;
+	ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+			ring0_outsb(pp_w9xring0_iobase + LPTREG_AFIFO, bp, 8);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_AFIFO);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+ 	}
+	ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+		ring0_outb(ctl | PARPORT_CONTROL_STROBE, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; !(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_w9xring0_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+		ring0_outb(ctl | PARPORT_CONTROL_STROBE, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+		for (tmo = 0; !(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_w9xring0_emul_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+
+	if (ecp_reverse())
+		return 0;	
+	ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+	/* Set HostAck low to start accepting data. */
+	ring0_outb(ctl | PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			stat = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+		/* Read the data. */
+		*bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		ring0_outb(ctl & ~PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			stat = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+		/* Event 46: Set HostAck low and accept the data. */
+		ring0_outb(ctl | PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+ 
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_w9xring0_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+	return sz;
+}
+#else
+
+unsigned parport_w9xring0_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+
+	if (pp_w9xring0_modes & PARPORT_MODE_PCECR) {
+		ring0_outb(0x50, pp_w9xring0_iobase + LPTREG_ECONTROL); /* COMPAT FIFO mode */
+		while (sz > 0) {
+			while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+				if (!(--tmo))
+					return emptyfifo(ret);
+			}
+			if (stat & 0x01 && sz >= 8) {
+				ring0_outsb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+				bp += 8;
+				sz -= 8;
+				ret += 8;
+			} else {
+				ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_DFIFO);
+				sz--;
+				ret++;
+			}
+			tmo = 0x10000;
+		}
+		while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+		return ret;
+	}
+	for (ret = 0; ret < sz; ret++, bp++)
+		ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+	return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_w9xring0_ops = {
+	parport_w9xring0_read_data,
+	parport_w9xring0_write_data,
+	parport_w9xring0_read_status,
+	parport_w9xring0_read_control,
+	parport_w9xring0_write_control,
+	parport_w9xring0_frob_control,
+	parport_w9xring0_epp_write_data,
+	parport_w9xring0_epp_read_data,
+	parport_w9xring0_epp_write_addr,
+	parport_w9xring0_epp_read_addr,
+	parport_w9xring0_ecp_write_data,
+	parport_w9xring0_ecp_read_data,
+	parport_w9xring0_ecp_write_addr,
+	parport_w9xring0_fpgaconfig_write
+};
+
+const struct parport_ops parport_w9xring0_emul_ops = {
+	parport_w9xring0_read_data,
+	parport_w9xring0_write_data,
+	parport_w9xring0_read_status,
+	parport_w9xring0_read_control,
+	parport_w9xring0_write_control,
+	parport_w9xring0_frob_control,
+	parport_w9xring0_emul_epp_write_data,
+	parport_w9xring0_emul_epp_read_data,
+	parport_w9xring0_emul_epp_write_addr,
+	parport_w9xring0_emul_epp_read_addr,
+	parport_w9xring0_emul_ecp_write_data,
+	parport_w9xring0_emul_ecp_read_data,
+	parport_w9xring0_emul_ecp_write_addr,
+	parport_w9xring0_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppw9xring0init.c b/main/ppw9xring0init.c
new file mode 100644
index 0000000..71c88e3
--- /dev/null
+++ b/main/ppw9xring0init.c
@@ -0,0 +1,681 @@
+/*****************************************************************************/
+
+/*
+ *      ppw9xring0init.c  --  Parport direct access under Win9x using Ring0 hack (init routines).
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_IOPL
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+extern inline int iopl(unsigned int level)
+{
+        OSVERSIONINFO info;
+
+        info.dwOSVersionInfoSize = sizeof(info);
+        if (GetVersionEx(&info) &&
+            (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+             info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+                return 0;
+        return 1;
+}
+#else
+extern inline int iopl(unsigned int level)
+{
+        return 0;
+}
+#endif
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern unsigned int pp_w9xring0_iobase;
+extern unsigned int pp_w9xring0_flags;
+extern const struct parport_ops parport_w9xring0_ops, parport_w9xring0_emul_ops;
+
+extern unsigned char ring0_inb(unsigned int port);
+extern void ring0_outb(unsigned char val, unsigned int port);
+extern void ring0_outsb(unsigned int port, const unsigned char *bp, unsigned int count);
+extern void ring0_insb(unsigned int port, unsigned char *bp, unsigned int count);
+extern int pp_w9xring0_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+#if 0
+#ifndef EPPEMUL
+
+static int detect_epp(void)
+{
+	/* pulse PROGRAM low, reset FPGA just to be safe */
+	ring0_outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+	usleep(10);
+	ring0_outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+	/* start of ordinary test */
+	if (!epp_clear_timeout())
+		return -1;
+	ring0_outb(ring0_inb(iobase + LPTREG_CONTROL) | 0x20, iobase + LPTREG_CONTROL);
+	ring0_outb(ring0_inb(iobase + LPTREG_CONTROL) | 0x10, iobase + LPTREG_CONTROL);
+	epp_clear_timeout();
+	ring0_inb(iobase + LPTREG_EPPDATA);
+	/* udelay(30); */
+	if (ring0_inb(iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+		epp_clear_timeout();
+		return 0;
+	}
+	/*return -1;*/
+	lprintf(3, "warning: no EPP timeout\n");
+	return 0;
+}
+
+#endif /* !EPPEMUL */
+
+static int detect_ecr(void)
+{
+	unsigned char r, oc, oec;
+
+	oec = ring0_inb(iobase + LPTREG_ECONTROL);
+	oc = ring0_inb(iobase + LPTREG_CONTROL);
+	if ((oc & 3) == (oec & 3)) {
+		ring0_outb(oc ^ 2, iobase + LPTREG_CONTROL);
+		r = ring0_inb(iobase + LPTREG_CONTROL);
+		if ((ring0_inb(iobase + LPTREG_ECONTROL) & 2) == (r & 2)) {
+			ring0_outb(oc, iobase + LPTREG_CONTROL);
+			return -1;
+		}
+	}
+	if ((oec & 3) != 1)
+		return -1;
+	ring0_outb(0x34, iobase + LPTREG_ECONTROL);
+	r = ring0_inb(iobase + LPTREG_ECONTROL);
+	ring0_outb(oc, iobase + LPTREG_CONTROL);
+	ring0_outb(oec, iobase + LPTREG_ECONTROL);
+	return -(r != 0x35);
+}
+
+int detect_port(void)
+{
+	ring0_outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+	pp_w9xring0_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	ring0_outb(0xc, iobase+LPTREG_ECONTROL);
+	ring0_outb(0xc, iobase+LPTREG_CONTROL);
+	ring0_outb(0xaa, iobase+LPTREG_DATA);
+	if (ring0_inb(iobase+LPTREG_DATA) != 0xaa)
+		goto fail_spp;
+	ring0_outb(0x55, iobase+LPTREG_DATA);
+	if (ring0_inb(iobase+LPTREG_DATA) != 0x55)
+		goto fail_spp;
+#ifdef EPPEMUL
+	/* tentatively enable PS/2 mode if ECP port */
+	ring0_outb(0x20, iobase + LPTREG_ECONTROL);
+	ring0_outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+	if ((ring0_inb(iobase+LPTREG_CONTROL) & 0x3f) != LPTCTRL_PROGRAM)
+		goto fail_ps2;
+	ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_W9XRING0ION, iobase+LPTREG_CONTROL);
+	if ((ring0_inb(iobase+LPTREG_CONTROL) & 0x3f) != (LPTCTRL_PROGRAM | LPTCTRL_W9XRING0ION))
+		goto fail_ps2;
+	return 0;
+
+  fail_ps2:
+	lprintf(3, "parport (PS/2 bidir) test failed\n");
+	return -1;
+
+#else /* !EPPEMUL */
+	if (!detect_ecr()) {
+		ring0_outb(0x80, iobase + LPTREG_ECONTROL);
+		lprintf(3, "parport SMSC style ECP+EPP detected\n");
+		return 0;
+	}
+	if (!detect_epp())
+		return 0;
+	/* goto fail_epp; */
+  fail_epp:
+	lprintf(3, "parport (EPP) test failed\n");
+	return -1;
+#endif /* !EPPEMUL */
+
+  fail_spp:
+	lprintf(3, "parport (SPP) test failed\n");
+	return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP routines
+ */
+
+static void ecp_port_cap(void)
+{
+	static const char *pwordstr[8] = { "2 bytes", "1 byte", "4 bytes", "3?", "4?", 
+					   "5?", "6?", "7?" };
+	static const char *irqstr[8] = { "jumpered", "7", "9", "10", "11", "14", "15", "5" };
+	static const char *dmastr[8] = { "jumpered 8bit", "1", "2", "3", "jumpered 16bit", "5", "6", "7" };
+	unsigned char cnfga, cnfgb;
+	unsigned int cnt, fwcnt, wthr = ~0, frcnt, rthr = ~0;
+
+	ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	ring0_outb(0xf0, iobase + LPTREG_ECONTROL); /* config mode */
+	cnfga = ring0_inb(iobase + LPTREG_CONFIGA);
+	cnfgb = ring0_inb(iobase + LPTREG_CONFIGB);
+	ring0_outb(cnfgb & 0x7f, iobase + LPTREG_CONFIGB);  /* disable compression */
+	ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	ring0_outb(0x04, iobase + LPTREG_DCR); /* w9xring0ion=output */
+	ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+	for (cnt = 0; cnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+		ring0_outb(0, iobase + LPTREG_TFIFO);
+	ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+	for (fwcnt = 0; fwcnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x01); fwcnt++) {
+		ring0_inb(iobase + LPTREG_TFIFO);
+		if (ring0_inb(iobase + LPTREG_ECONTROL) & 0x04) {
+			wthr = fwcnt;
+			ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+		}
+	}
+	ring0_outb(0x24, iobase + LPTREG_DCR); /* w9xring0ion=input */
+	ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+	for (cnt = 0; cnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+		ring0_outb(0, iobase + LPTREG_TFIFO);
+	ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+	for (frcnt = 0; frcnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x01); frcnt++) {
+		ring0_inb(iobase + LPTREG_TFIFO);
+		if (ring0_inb(iobase + LPTREG_ECONTROL) & 0x04) {
+			rthr = frcnt;
+			ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+		}
+	}
+	ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	ring0_outb(0x04, iobase + LPTREG_DCR); /* w9xring0ion=output */
+	lprintf(3, "ECP capabilities: %s int, PWord %s, %sextra tx pipe, IRQ %s, DMA %s\n"
+		"Tx: FIFO size %d threshold %d  Rx: FIFO size %d threshold %d\n",
+		(cnfga & 0x80) ? "level" : "edge", pwordstr[(cnfga >> 4) & 7],
+		(cnfga & 0x04) ? "no" : "", irqstr[(cnfgb >> 3) & 7], dmastr[cnfgb & 7],
+		fwcnt, wthr, frcnt, rthr);
+}
+
+int detect_port_ecp(void)
+{
+	epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	ring0_outb(0xc, iobase+LPTREG_ECONTROL);
+	ring0_outb(0xc, iobase+LPTREG_CONTROL);
+	ring0_outb(0xaa, iobase+LPTREG_DATA);
+	if (ring0_inb(iobase+LPTREG_DATA) != 0xaa)
+		goto fail_spp;
+	ring0_outb(0x55, iobase+LPTREG_DATA);
+	if (ring0_inb(iobase+LPTREG_DATA) != 0x55)
+		goto fail_spp;
+	/* check for ECP ECR mode */
+	if (detect_ecr())
+		goto fail_ecp;
+	ecp_port_cap();
+	return 0;
+
+  fail_ecp:
+	lprintf(0, "parport (ECP) test failed\n");
+	return -1;
+
+  fail_spp:
+	lprintf(0, "parport (SPP) test failed\n");
+	return -1;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+	pp_w9xring0_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	ring0_outb(0xc, pp_w9xring0_iobase+LPTREG_ECONTROL);
+	ring0_outb(0xc, pp_w9xring0_iobase+LPTREG_CONTROL);
+	ring0_outb(0xaa, pp_w9xring0_iobase+LPTREG_DATA);
+	if (ring0_inb(pp_w9xring0_iobase+LPTREG_DATA) != 0xaa)
+		return 0;
+	ring0_outb(0x55, pp_w9xring0_iobase+LPTREG_DATA);
+	if (ring0_inb(pp_w9xring0_iobase+LPTREG_DATA) != 0x55)
+		return 0;
+	return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+	unsigned char r = 0xc;
+
+	ring0_outb(r, pp_w9xring0_iobase + LPTREG_CONTROL);
+	if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+		ring0_outb(r ^ 0x2, pp_w9xring0_iobase + LPTREG_CONTROL); /* Toggle bit 1 */
+		r = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);	
+		if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+			goto no_reg; /* Sure that no ECR register exists */
+	}
+
+	if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x3 ) != 0x1)
+		goto no_reg;
+
+	ring0_outb(0x34, pp_w9xring0_iobase + LPTREG_ECONTROL);
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) != 0x35)
+		goto no_reg;
+
+	ring0_outb(0xc, pp_w9xring0_iobase + LPTREG_CONTROL);
+	
+	/* Go to mode 000 */
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0, pp_w9xring0_iobase + LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECR;
+
+ no_reg:
+	ring0_outb(0xc, pp_w9xring0_iobase + LPTREG_CONTROL);
+	return 0; 
+}
+
+static int parport_ecp(void)
+{
+	int i;
+	int config;
+	int pword;
+	int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+	/* Find out FIFO depth */
+	ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+	ring0_outb(0xc0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* TEST FIFO */
+	for (i=0; i < 1024 && !(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x02); i++)
+		ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_TFIFO);
+	/*
+	 * Using LGS chipset it uses ECR register, but
+	 * it doesn't support ECP or FIFO MODE
+	 */
+	if (i == 1024) {
+		ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL);
+		return 0;
+	}
+
+	fifo_depth = i;
+	lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+	/* Find out writeIntrThreshold */
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) | (1<<2), pp_w9xring0_iobase + LPTREG_ECONTROL);
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_w9xring0_iobase + LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+		usleep(50);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we know we can write if we get an
+                   interrupt. */
+		i = 0;
+
+	writeIntrThreshold = i;
+
+	/* Find out readIntrThreshold */
+	ring0_outb((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0) | 0x20, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+	ring0_outb((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0) | 0xc0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Test FIFO */
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) | (1<<2), pp_w9xring0_iobase + LPTREG_ECONTROL);
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_w9xring0_iobase + LPTREG_ECONTROL);
+	for (i = 1; i <= fifo_depth; i++) {
+		ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_TFIFO);
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we can read if we get an interrupt. */
+		i = 0;
+
+	readIntrThreshold = i;
+
+	ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+	ring0_outb(0xf4, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Configuration mode */
+	config = ring0_inb(pp_w9xring0_iobase + LPTREG_CONFIGA);
+	pword = (config >> 4) & 0x7;
+	switch (pword) {
+	case 0:
+		pword = 2;
+		lprintf(0, "ECP: Unsupported pword size! (2)\n");
+		break;
+	case 2:
+		pword = 4;
+		lprintf(0, "ECP: Unsupported pword size! (4)\n");
+		break;
+	default:
+		lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+		/* Assume 1 */
+	case 1:
+		pword = 1;
+	}
+	lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+	config = ring0_inb(pp_w9xring0_iobase + LPTREG_CONFIGB);
+	lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+	if (!(config & 0x40))
+		lprintf(3, "ECP: IRQ conflict!\n");
+
+	/* Go back to mode 000 */
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0, pp_w9xring0_iobase + LPTREG_ECONTROL);
+
+	return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection  */
+
+static int parport_epp(void)
+{
+	/* If EPP timeout bit clear then EPP available */
+	if (!pp_w9xring0_epp_clear_timeout())
+		return 0;  /* No way to clear timeout */
+
+	/*
+	 * Theory:
+	 *     Write two values to the EPP address register and
+	 *     read them back. When the transfer times out, the state of
+	 *     the EPP register is undefined in some cases (EPP 1.9?) but
+	 *     in others (EPP 1.7, ECPEPP?) it is possible to read back
+	 *     its value.
+	 */
+
+	pp_w9xring0_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	ring0_outb(0x55, pp_w9xring0_iobase + LPTREG_EPPADDR);
+	pp_w9xring0_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR) == 0x55) {
+		ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_EPPADDR);
+		pp_w9xring0_epp_clear_timeout();
+		usleep(30); /* Wait for possible EPP timeout */
+		if (ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR) == 0xaa) {
+			pp_w9xring0_epp_clear_timeout();
+			return PARPORT_MODE_PCEPP;
+		}
+	}
+
+	/*
+	 * Theory:
+	 *	Bit 0 of STR is the EPP timeout bit, this bit is 0
+	 *	when EPP is possible and is set high when an EPP timeout
+	 *	occurs (EPP uses the HALT line to stop the CPU while it does
+	 *	the byte transfer, an EPP timeout occurs if the attached
+	 *	device fails to respond after 10 micro seconds).
+	 *
+	 *	This bit is cleared by either reading it (National Semi)
+	 *	or writing a 1 to the bit (SMC, UMC, Wring0_inbond), others ???
+	 *	This bit is always high in non EPP modes.
+	 */
+
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | 0x20, pp_w9xring0_iobase + LPTREG_CONTROL);
+	ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | 0x10, pp_w9xring0_iobase + LPTREG_CONTROL);
+	pp_w9xring0_epp_clear_timeout();
+	
+	ring0_inb(pp_w9xring0_iobase + LPTREG_EPPDATA);
+	usleep(30);  /* Wait for possible EPP timeout */
+	
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & 0x01) {
+		pp_w9xring0_epp_clear_timeout();
+		return PARPORT_MODE_PCEPP;
+	}
+	return 0;
+}
+
+static int parport_ecpepp(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL);
+	/* Search for SMC style EPP+ECP mode */
+	ring0_outb(0x80, pp_w9xring0_iobase + LPTREG_ECONTROL);
+	mode = parport_epp();
+	ring0_outb(oecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+       	return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data w9xring0ion; setting this high
+ * allows us to read data from the data lines.  In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero.  So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present. 
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal.  Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic. 
+ */
+
+static int parport_ps2(void)
+{
+	int ok = 0;
+	unsigned char octr = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+  
+	pp_w9xring0_epp_clear_timeout();
+
+	ring0_outb(octr | 0x20, pp_w9xring0_iobase + LPTREG_CONTROL);  /* try to tri-state the buffer */
+	
+	ring0_outb(0x55, pp_w9xring0_iobase + LPTREG_DATA);
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_DATA) != 0x55) ok++;
+	ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_DATA);
+	if (ring0_inb(pp_w9xring0_iobase + LPTREG_DATA) != 0xaa) ok++;
+
+	ring0_outb(octr, pp_w9xring0_iobase);          /* cancel input mode */
+
+	return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL);
+	ring0_outb(0x20, pp_w9xring0_iobase + LPTREG_ECONTROL);
+      	mode = parport_ps2();
+	ring0_outb(oecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+	return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_w9xring0_flags(unsigned io, unsigned int flags)
+{
+	pp_w9xring0_flags = FLAGS_PCSPP;
+	pp_w9xring0_iobase = io;
+       	if (iopl(3)) {
+		lprintf(0, "Cannot get direct IO port access (iopl: %s)\n", strerror(errno));
+		return -1;
+	}
+	if (!parport_spp()) {
+		lprintf(0, "No parport present at 0x%x\n", pp_w9xring0_iobase);
+		return -1;
+	}
+	if (parport_ecr()) {
+		pp_w9xring0_flags |= FLAGS_PCECR;
+		pp_w9xring0_flags |= parport_ecp();
+		pp_w9xring0_flags |= parport_ecpps2();
+		pp_w9xring0_flags |= parport_ecpepp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_w9xring0_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_w9xring0_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_w9xring0_flags |= FLAGS_PCECPEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	} else {
+		pp_w9xring0_flags |= parport_ps2();
+		pp_w9xring0_flags |= parport_epp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_w9xring0_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_w9xring0_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_w9xring0_flags |= FLAGS_PCEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	}
+	lprintf(0, "Parport 0x%x capabilities: SPP%s%s%s%s%s%s\n",
+		pp_w9xring0_iobase,
+		(pp_w9xring0_flags & FLAGS_PCPS2) ? ", PS2" : "",
+		(pp_w9xring0_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+		(pp_w9xring0_flags & FLAGS_PCECR) ? ", ECR" : "",
+		(pp_w9xring0_flags & FLAGS_PCECP) ? ", ECP" : "",
+		(pp_w9xring0_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+		(pp_w9xring0_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+	if (!(pp_w9xring0_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2)))  {
+		lprintf(0, "Parport 0x%x does not even support PS/2 mode, cannot use it\n",
+			pp_w9xring0_iobase);
+		return -1;
+	}
+	lprintf(0, "Parport 0x%x using direct Win9x Ring0 hardware access\n", pp_w9xring0_iobase);
+	if (pp_w9xring0_flags & FLAGS_PCECR)
+		ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+	parport_ops = parport_w9xring0_ops;
+	if ((flags & PPFLAG_SWEMULECP) || !(pp_w9xring0_flags & FLAGS_PCECP)) {
+		parport_ops.parport_ecp_write_data = parport_w9xring0_emul_ops.parport_ecp_write_data;
+		parport_ops.parport_ecp_read_data = parport_w9xring0_emul_ops.parport_ecp_read_data;
+		parport_ops.parport_ecp_write_addr = parport_w9xring0_emul_ops.parport_ecp_write_addr;
+		lprintf(0, "Parport 0x%x emulating ECP\n", pp_w9xring0_iobase);
+	}
+	if ((flags & PPFLAG_SWEMULEPP) || !(pp_w9xring0_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+		parport_ops.parport_epp_write_data = parport_w9xring0_emul_ops.parport_epp_write_data;
+		parport_ops.parport_epp_read_data = parport_w9xring0_emul_ops.parport_epp_read_data;
+		parport_ops.parport_epp_write_addr = parport_w9xring0_emul_ops.parport_epp_write_addr;
+		parport_ops.parport_epp_read_addr = parport_w9xring0_emul_ops.parport_epp_read_addr;
+		lprintf(0, "Parport 0x%x emulating EPP\n", pp_w9xring0_iobase);
+	}
+	return 0;
+}
+
+int parport_init_w9xring0(unsigned io)
+{
+        return parport_init_w9xring0_flags(io, 0);
+}
diff --git a/main/ppwin.c b/main/ppwin.c
new file mode 100644
index 0000000..c765927
--- /dev/null
+++ b/main/ppwin.c
@@ -0,0 +1,1010 @@
+/*****************************************************************************/
+
+/*
+ *      ppnt.c  -- Parport direct access with eppflex.sys/vxd.
+ *
+ *      Copyright (C) 2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#include "w9xdrv/eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_win_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_win_flags = 0;
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_win_read_data(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_data failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_data(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_data failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_status(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_status failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_status(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_status failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_control(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+       
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_control failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_control(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_control failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_win_frob_control(unsigned char mask, unsigned char val)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = val;
+        rw.mask = mask;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_FROB_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_frob_control failed, error 0x%08lx\n", GetLastError());
+		return;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return;
+	}
+}
+
+unsigned char parport_win_read_configa(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_configa failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_configa(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_configa failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_configb(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_configb failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_configb(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_configb failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_econtrol(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_econtrol failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_econtrol(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_econtrol failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_win_frob_econtrol(unsigned char mask, unsigned char val)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = val;
+        rw.mask = mask;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_FROB_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_frob_econtrol failed, error 0x%08lx\n", GetLastError());
+		return;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return;
+	}
+}
+
+unsigned char parport_win_read_eppaddr(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_eppaddr failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_eppaddr(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_eppaddr failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_eppdata(void)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return 0xff;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res) {
+		lprintf(0, "Parport: parport_win_read_eppdata failed, error 0x%08lx\n", GetLastError());
+		return 0xff;
+	}
+	if (retl != sizeof(rw)) {
+		lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+		return 0xff;
+	}
+        return rw.data;
+}
+
+void parport_win_write_eppdata(unsigned char d)
+{
+        struct eppflex_rwdata rw;
+        BOOL res;
+        DWORD retl;
+        
+	if (pp_win_handle == INVALID_HANDLE_VALUE)
+		return;
+        rw.data = d;
+	res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+	if (!res)
+		lprintf(0, "Parport: parport_win_write_eppdata failed, error 0x%08lx\n", GetLastError());
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+	if (pp_win_flags & FLAGS_PCECR)
+		parport_win_write_econtrol(ecr);
+}
+
+int pp_win_epp_clear_timeout(void)
+{
+        unsigned char r;
+
+        if (!(parport_win_read_status() & LPTSTAT_EPPTIMEOUT))
+                return 1;
+        /* To clear timeout some chips require double read */
+	parport_win_read_status();
+	r = parport_win_read_status();
+	parport_win_write_status(r | 0x01); /* Some reset by writing 1 */
+	parport_win_write_status(r & 0xfe); /* Others by writing 0 */
+        r = parport_win_read_status();
+        return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		parport_win_write_eppdata(*bp);
+		if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_win_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_win_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = parport_win_read_eppdata();
+		if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_win_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_win_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		parport_win_write_eppaddr(*bp);
+		if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_win_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_win_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+
+	setecr(0x90); /* EPP mode */
+	for (; sz > 0; sz--, bp++) {
+		*bp = parport_win_read_eppaddr();
+		if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+			pp_win_epp_clear_timeout();
+			goto rt;
+		}
+		ret++;
+	}
+ rt:
+	setecr(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_emul_epp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+	for (; sz > 0; sz--, bp++) {
+		parport_win_write_data(*bp);
+		for (tmo = 0; ; tmo++) {
+			if (parport_win_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_win_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_win_emul_epp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (parport_win_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_win_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = parport_win_read_data();
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_win_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+	for (; sz > 0; sz--, bp++) {
+		parport_win_write_data(*bp);
+		for (tmo = 0; ; tmo++) {
+			if (parport_win_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_win_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+		ret++;
+	}
+	return ret;
+}
+
+unsigned parport_win_emul_epp_read_addr(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo;
+
+	parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+	for (; sz > 0; sz--, bp++) {
+		for (tmo = 0; ; tmo++) {
+			if (parport_win_read_status() & LPTSTAT_WAIT)
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB);
+		for (tmo = 0; ; tmo++) {
+			if (!(parport_win_read_status() & LPTSTAT_WAIT))
+				break;
+			if (tmo > 1000)
+				return ret;
+		}
+		*bp = parport_win_read_data();
+		parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+		ret++;
+	}
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (parport_win_read_status() & 0x20)
+		return 0;
+	/* Event 47: Set nInit high */
+	parport_win_write_control(0x26);
+	/* Event 49: PError goes high */
+	while (!(parport_win_read_status() & 0x20)) {
+		if (!(--tmo))
+			return -1;
+	}
+	/* start driving the bus */
+	parport_win_write_control(0x04);
+	return 0;
+}
+
+static int ecp_reverse(void)
+{
+	unsigned tmo = 0x10000;
+
+	if (!(parport_win_read_status() & 0x20))
+		return 0;
+	parport_win_write_control(0x24);
+	/* Event 39: Set nInit low to initiate bus reversal */
+	parport_win_write_control(0x20);
+	while (parport_win_read_status() & 0x20) {
+		if (!(--tmo))
+			return -1;
+	}
+	return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+	unsigned fcnt = 0;
+
+	parport_win_write_econtrol(0xd0); /* FIFOtest mode */
+	while ((parport_win_read_econtrol() & 0x01) && fcnt < 32 && fcnt < cnt) {
+		parport_win_read_configa();
+		fcnt++;
+	}
+	lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+	parport_win_write_econtrol(0x30); /* PS/2 mode */
+	return cnt - fcnt;
+}
+
+unsigned parport_win_ecp_write_data(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+        
+	if (ecp_forward())
+		return 0;
+	parport_win_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_win_read_econtrol()) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+                                parport_win_write_configa(bp[i]);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			parport_win_write_configa(*bp++);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+	}
+	parport_win_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_win_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+	unsigned int i;
+        
+	if (ecp_reverse())
+		return 0;
+	parport_win_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_win_read_econtrol()) & 0x01)
+			if (!(--tmo)) {
+				parport_win_write_econtrol(0xd0); /* FIFOTEST mode */
+				while (!(parport_win_read_econtrol() & 0x01) && sz > 0) {
+					*bp++ = parport_win_read_configa();
+					sz--;
+					ret++;
+				}
+				parport_win_write_econtrol(0x30); /* PS/2 mode */
+				return ret;
+			}
+		if (stat & 0x02 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+                                bp[i] = parport_win_read_configa();
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			*bp++ = parport_win_read_configa();
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	parport_win_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+unsigned parport_win_ecp_write_addr(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = (const unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+        
+	if (ecp_forward())
+		return 0;
+	parport_win_write_econtrol(0x70); /* ECP mode */
+	while (sz > 0) {
+		while ((stat = parport_win_read_econtrol()) & 0x02) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		if (stat & 0x01 && sz >= 8) {
+                        for (i = 0; i < 8; i++)
+				parport_win_write_data(bp[i]);
+			bp += 8;
+			sz -= 8;
+			ret += 8;
+		} else {
+			parport_win_write_data(*bp++);
+			sz--;
+			ret++;
+		}
+		tmo = 0x10000;
+	}
+	while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+		if (!(--tmo))
+			return emptyfifo(ret);
+ 	}
+	parport_win_write_econtrol(0x30); /* PS/2 mode */
+	return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = parport_win_read_control() & ~PARPORT_CONTROL_AUTOFD;
+	/* HostAck high (data, not command) */
+	parport_win_write_control(ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		parport_win_write_data(*bp);
+		parport_win_write_control(ctl | PARPORT_CONTROL_STROBE);
+		for (tmo = 0; parport_win_read_status() & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		parport_win_write_control(ctl);
+		for (tmo = 0; !(parport_win_read_status() & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_win_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret;
+	unsigned char ctl;
+	unsigned tmo;
+
+	if (ecp_forward())
+		return 0;
+	ctl = parport_win_read_control() | PARPORT_CONTROL_AUTOFD;
+	/* HostAck low (command, not data) */
+	parport_win_write_control(ctl);
+	for (ret = 0; ret < sz; ret++, bp++) {
+		parport_win_write_data(*bp);
+		parport_win_write_control(ctl | PARPORT_CONTROL_STROBE);
+		for (tmo = 0; parport_win_read_status() & PARPORT_STATUS_BUSY; tmo++)
+			if (tmo > 0x1000)
+				return ret;
+		parport_win_write_control(ctl);
+		for (tmo = 0; !(parport_win_read_status() & PARPORT_STATUS_BUSY); tmo++)
+			if (tmo > 0x1000)
+				return ret;
+	}
+	return ret;
+}
+
+unsigned parport_win_emul_ecp_read_data(void *buf, unsigned sz)
+{
+	unsigned char *bp = (unsigned char *)buf;
+	unsigned ret = 0;
+	unsigned char ctl, stat;
+	int command;
+	unsigned tmo;
+
+	if (ecp_reverse())
+		return 0;	
+	ctl = parport_win_read_control();
+	/* Set HostAck low to start accepting data. */
+	parport_win_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+	while (ret < sz) {
+		/* Event 43: Peripheral sets nAck low. It can take as
+                   long as it wants. */
+		tmo = 0;
+		do {
+			stat = parport_win_read_status();
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (stat & PARPORT_STATUS_ACK);
+		/* Is this a command? */
+		command = stat & PARPORT_STATUS_BUSY;
+		if (command) {
+			//lprintf(3, "ECP: warning: emulation does not support RLE\n");
+			goto out;
+		}
+		/* Read the data. */
+		*bp = parport_win_read_data();
+		/* Event 44: Set HostAck high, acknowledging handshake. */
+		parport_win_write_control(ctl & ~PARPORT_CONTROL_AUTOFD);
+		/* Event 45: The peripheral has 35ms to set nAck high. */
+		tmo = 0;
+		do {
+			stat = parport_win_read_status();
+			if ((++tmo) > 0x10000)
+				goto out;
+		} while (!(stat & PARPORT_STATUS_ACK));
+		/* Event 46: Set HostAck low and accept the data. */
+		parport_win_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+		/* Normal data byte. */
+		bp++;
+		ret++;
+	}
+
+ out:
+	return ret;
+}
+ 
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_win_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned u;
+
+	for (u = 0; u < sz; u++, bp++)
+		parport_win_write_data(*bp);
+	return sz;
+}
+#else
+
+unsigned parport_win_fpgaconfig_write(const void *buf, unsigned sz)
+{
+	const unsigned char *bp = buf;
+	unsigned ret = 0;
+	unsigned tmo = 0x10000;
+	unsigned char stat;
+        unsigned int i;
+
+	if (pp_win_modes & PARPORT_MODE_PCECR) {
+		parport_win_write_econtrol(0x50); /* COMPAT FIFO mode */
+		while (sz > 0) {
+			while ((stat = parport_win_read_econtrol()) & 0x02) {
+				if (!(--tmo))
+					return emptyfifo(ret);
+			}
+			if (stat & 0x01 && sz >= 8) {
+                                for (i = 0; i < 8; i++)
+                                        parport_win_write_configa(bp[i]);
+				bp += 8;
+				sz -= 8;
+				ret += 8;
+			} else {
+				parport_win_write_configa(*bp++);
+				sz--;
+				ret++;
+			}
+			tmo = 0x10000;
+		}
+		while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+			if (!(--tmo))
+				return emptyfifo(ret);
+		}
+		parport_win_write_econtrol(0x30); /* PS/2 mode */
+		return ret;
+	}
+	for (ret = 0; ret < sz; ret++, bp++)
+		parport_win_write_data(*bp);
+	return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_win_ops = {
+	parport_win_read_data,
+	parport_win_write_data,
+	parport_win_read_status,
+	parport_win_read_control,
+	parport_win_write_control,
+	parport_win_frob_control,
+	parport_win_epp_write_data,
+	parport_win_epp_read_data,
+	parport_win_epp_write_addr,
+	parport_win_epp_read_addr,
+	parport_win_ecp_write_data,
+	parport_win_ecp_read_data,
+	parport_win_ecp_write_addr,
+	parport_win_fpgaconfig_write
+};
+
+const struct parport_ops parport_win_emul_ops = {
+	parport_win_read_data,
+	parport_win_write_data,
+	parport_win_read_status,
+	parport_win_read_control,
+	parport_win_write_control,
+	parport_win_frob_control,
+	parport_win_emul_epp_write_data,
+	parport_win_emul_epp_read_data,
+	parport_win_emul_epp_write_addr,
+	parport_win_emul_epp_read_addr,
+	parport_win_emul_ecp_write_data,
+	parport_win_emul_ecp_read_data,
+	parport_win_emul_ecp_write_addr,
+	parport_win_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppwininit.c b/main/ppwininit.c
new file mode 100644
index 0000000..ddc3cd7
--- /dev/null
+++ b/main/ppwininit.c
@@ -0,0 +1,624 @@
+/*****************************************************************************/
+
+/*
+ *      ppntinit.c  -- Parport direct access with eppflex.sys/vxd (init routines).
+ *
+ *      Copyright (C) 2000-2001  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#include "w9xdrv/eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL       0x402
+#define LPTREG_CONFIGB        0x401
+#define LPTREG_CONFIGA        0x400
+#define LPTREG_TFIFO          0x400
+#define LPTREG_DFIFO          0x400
+#define LPTREG_AFIFO          0x000
+#define LPTREG_DSR            0x001
+#define LPTREG_DCR            0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA        0x004
+#define LPTREG_EPPADDR        0x003
+/* standard registers */
+#define LPTREG_CONTROL        0x002
+#define LPTREG_STATUS         0x001
+#define LPTREG_DATA           0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL  0x80
+#define LPTCFGA_IMPIDMASK     0x70
+#define LPTCFGA_IMPID16BIT    0x00
+#define LPTCFGA_IMPID8BIT     0x10
+#define LPTCFGA_IMPID32BIT    0x20
+#define LPTCFGA_NOPIPELINE    0x04
+#define LPTCFGA_PWORDCOUNT    0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS      0x80
+#define LPTCFGB_INTRVALUE     0x40
+#define LPTCFGB_IRQMASK       0x38
+#define LPTCFGB_IRQ5          0x38
+#define LPTCFGB_IRQ15         0x30
+#define LPTCFGB_IRQ14         0x28
+#define LPTCFGB_IRQ11         0x20
+#define LPTCFGB_IRQ10         0x18
+#define LPTCFGB_IRQ9          0x10
+#define LPTCFGB_IRQ7          0x08
+#define LPTCFGB_IRQJUMPER     0x00
+#define LPTCFGB_DMAMASK       0x07
+#define LPTCFGB_DMA7          0x07
+#define LPTCFGB_DMA6          0x06
+#define LPTCFGB_DMA5          0x05
+#define LPTCFGB_DMAJUMPER16   0x04
+#define LPTCFGB_DMA3          0x03
+#define LPTCFGB_DMA2          0x02
+#define LPTCFGB_DMA1          0x01
+#define LPTCFGB_DMAJUMPER8    0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK       0xe0
+#define LPTECR_MODESPP        0x00
+#define LPTECR_MODEPS2        0x20
+#define LPTECR_MODESPPFIFO    0x40
+#define LPTECR_MODEECP        0x60
+#define LPTECR_MODEECPEPP     0x80
+#define LPTECR_MODETEST       0xc0
+#define LPTECR_MODECFG        0xe0
+#define LPTECR_NERRINTRDIS    0x10
+#define LPTECR_DMAEN          0x08
+#define LPTECR_SERVICEINTR    0x04
+#define LPTECR_FIFOFULL       0x02
+#define LPTECR_FIFOEMPTY      0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_win_handle;
+extern unsigned int pp_win_flags;
+extern const struct parport_ops parport_win_ops, parport_win_emul_ops;
+
+extern unsigned char parport_win_read_data(void);
+extern void parport_win_write_data(unsigned char d);
+extern unsigned char parport_win_read_status(void);
+extern unsigned char parport_win_read_control(void);
+extern void parport_win_write_control(unsigned char d);
+extern void parport_win_frob_control(unsigned char mask, unsigned char val);
+extern unsigned char parport_win_read_configa(void);
+extern void parport_win_write_configa(unsigned char d);
+extern unsigned char parport_win_read_configb(void);
+extern void parport_win_write_configb(unsigned char d);
+extern unsigned char parport_win_read_econtrol(void);
+extern void parport_win_write_econtrol(unsigned char d);
+extern void parport_win_frob_econtrol(unsigned char mask, unsigned char val);
+extern unsigned char parport_win_read_eppaddr(void);
+extern void parport_win_write_eppaddr(unsigned char d);
+extern unsigned char parport_win_read_eppdata(void);
+extern void parport_win_write_eppdata(unsigned char d);
+extern int pp_win_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP              (1<<0)
+#define FLAGS_PCPS2              (1<<1)
+#define FLAGS_PCEPP              (1<<2)
+#define FLAGS_PCECR              (1<<3)  /* ECR Register Exists */
+#define FLAGS_PCECP              (1<<4)
+#define FLAGS_PCECPEPP           (1<<5)
+#define FLAGS_PCECPPS2           (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+	pp_win_epp_clear_timeout();  /* prevent lockup of some SMSC IC's */
+	/* this routine is mostly copied from Linux Kernel parport */
+	parport_win_write_econtrol(0xc);
+	parport_win_write_control(0xc);
+	parport_win_write_data(0xaa);
+	if (parport_win_read_data() != 0xaa)
+		return 0;
+	parport_win_write_data(0x55);
+	if (parport_win_read_data() != 0x55)
+		return 0;
+	return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+	unsigned char r = 0xc;
+
+	parport_win_write_control(r);
+	if ((parport_win_read_econtrol() & 0x3) == (r & 0x3)) {
+		parport_win_write_control(r ^ 0x2); /* Toggle bit 1 */
+		r = parport_win_read_control();	
+		if ((parport_win_read_econtrol() & 0x2) == (r & 0x2))
+			goto no_reg; /* Sure that no ECR register exists */
+	}
+
+	if ((parport_win_read_econtrol() & 0x3 ) != 0x1)
+		goto no_reg;
+
+	parport_win_write_econtrol(0x34);
+	if (parport_win_read_econtrol() != 0x35)
+		goto no_reg;
+
+	parport_win_write_control(0xc);
+	
+	/* Go to mode 000 */
+	parport_win_frob_econtrol(0xe0, 0);
+
+	return PARPORT_MODE_PCECR;
+
+ no_reg:
+	parport_win_write_control(0xc);
+	return 0; 
+}
+
+static int parport_ecp(void)
+{
+	int i;
+	int config;
+	int pword;
+	int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+	/* Find out FIFO depth */
+	parport_win_write_econtrol(0x00); /* Reset FIFO */
+	parport_win_write_econtrol(0xc0); /* TEST FIFO */
+	for (i=0; i < 1024 && !(parport_win_read_econtrol() & 0x02); i++)
+		parport_win_write_configa(0xaa);
+	/*
+	 * Using LGS chipset it uses ECR register, but
+	 * it doesn't support ECP or FIFO MODE
+	 */
+	if (i == 1024) {
+		parport_win_write_econtrol(0x00);
+		return 0;
+	}
+
+	fifo_depth = i;
+	lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+	/* Find out writeIntrThreshold */
+        parport_win_frob_econtrol((1<<2), (1<<2));
+        parport_win_frob_econtrol((1<<2), 0);
+	for (i = 1; i <= fifo_depth; i++) {
+		parport_win_read_configa();
+		usleep(50);
+		if (parport_win_read_econtrol() & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we know we can write if we get an
+                   interrupt. */
+		i = 0;
+
+	writeIntrThreshold = i;
+
+	/* Find out readIntrThreshold */
+        parport_win_frob_econtrol(0xe0, 0x20); /* Reset FIFO, PS2 */
+	parport_win_frob_control(PARPORT_CONTROL_DIRECTION, PARPORT_CONTROL_DIRECTION);
+	parport_win_frob_econtrol(0xe0, 0xc0); /* Test FIFO */
+        parport_win_frob_econtrol((1<<2), (1<<2));
+        parport_win_frob_econtrol((1<<2), 0);
+        for (i = 1; i <= fifo_depth; i++) {
+		parport_win_write_configa(0xaa);
+		if (parport_win_read_econtrol() & (1<<2))
+			break;
+	}
+
+	if (i <= fifo_depth)
+		lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+	else
+		/* Number of bytes we can read if we get an interrupt. */
+		i = 0;
+
+	readIntrThreshold = i;
+
+	parport_win_write_econtrol(0x00); /* Reset FIFO */
+	parport_win_write_econtrol(0xf4); /* Configuration mode */
+	config = parport_win_read_configa();
+	pword = (config >> 4) & 0x7;
+	switch (pword) {
+	case 0:
+		pword = 2;
+		lprintf(0, "ECP: Unsupported pword size! (2)\n");
+		break;
+	case 2:
+		pword = 4;
+		lprintf(0, "ECP: Unsupported pword size! (4)\n");
+		break;
+	default:
+		lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+		/* Assume 1 */
+	case 1:
+		pword = 1;
+	}
+	lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+	config = parport_win_read_configb();
+	lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+	if (!(config & 0x40))
+		lprintf(3, "ECP: IRQ conflict!\n");
+
+	/* Go back to mode 000 */
+	parport_win_frob_econtrol(0xe0, 0);
+
+	return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection  */
+
+static int parport_epp(void)
+{
+	/* If EPP timeout bit clear then EPP available */
+	if (!pp_win_epp_clear_timeout())
+		return 0;  /* No way to clear timeout */
+
+	/*
+	 * Theory:
+	 *     Write two values to the EPP address register and
+	 *     read them back. When the transfer times out, the state of
+	 *     the EPP register is undefined in some cases (EPP 1.9?) but
+	 *     in others (EPP 1.7, ECPEPP?) it is possible to read back
+	 *     its value.
+	 */
+
+	pp_win_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	parport_win_write_eppaddr(0x55);
+	pp_win_epp_clear_timeout();
+	usleep(30); /* Wait for possible EPP timeout */
+
+	if (parport_win_read_eppaddr() == 0x55) {
+		parport_win_write_eppaddr(0xaa);
+		pp_win_epp_clear_timeout();
+		usleep(30); /* Wait for possible EPP timeout */
+		if (parport_win_read_eppaddr() == 0xaa) {
+			pp_win_epp_clear_timeout();
+			return PARPORT_MODE_PCEPP;
+		}
+	}
+
+	/*
+	 * Theory:
+	 *	Bit 0 of STR is the EPP timeout bit, this bit is 0
+	 *	when EPP is possible and is set high when an EPP timeout
+	 *	occurs (EPP uses the HALT line to stop the CPU while it does
+	 *	the byte transfer, an EPP timeout occurs if the attached
+	 *	device fails to respond after 10 micro seconds).
+	 *
+	 *	This bit is cleared by either reading it (National Semi)
+	 *	or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+	 *	This bit is always high in non EPP modes.
+	 */
+
+	parport_win_frob_control(0x20, 0x20);
+	parport_win_frob_control(0x10, 0x10);
+	pp_win_epp_clear_timeout();
+	
+	parport_win_read_eppdata();
+	usleep(30);  /* Wait for possible EPP timeout */
+	
+	if (parport_win_read_status() & 0x01) {
+		pp_win_epp_clear_timeout();
+		return PARPORT_MODE_PCEPP;
+	}
+	return 0;
+}
+
+static int parport_ecpepp(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = parport_win_read_econtrol();
+	/* Search for SMC style EPP+ECP mode */
+	parport_win_write_econtrol(0x80);
+	mode = parport_epp();
+	parport_win_write_econtrol(oecr);
+       	return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines.  In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero.  So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present. 
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal.  Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic. 
+ */
+
+static int parport_ps2(void)
+{
+	int ok = 0;
+	unsigned char octr = parport_win_read_control();
+  
+	pp_win_epp_clear_timeout();
+
+	parport_win_write_control(octr | 0x20);  /* try to tri-state the buffer */
+	
+	parport_win_write_data(0x55);
+	if (parport_win_read_data() != 0x55) ok++;
+	parport_win_write_data(0xaa);
+	if (parport_win_read_data() != 0xaa) ok++;
+
+	parport_win_write_control(octr);          /* cancel input mode */
+
+	return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+	int mode;
+	unsigned char oecr;
+
+	oecr = parport_win_read_econtrol();
+	parport_win_write_econtrol(0x20);
+      	mode = parport_ps2();
+	parport_win_write_econtrol(oecr);
+	return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SERVICENAME        "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY      "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY      "System32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+                              SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+                              SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+        if (!hserv) {
+                lprintf(5, "Cannot create service, error 0x%08lx\n", GetLastError());
+                hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+                if (!hserv) {
+                        lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+                        goto closescm;
+                }
+        }
+        if (!StartService(hserv, 0, NULL)) {
+                lprintf(5, "Cannot start service, error 0x%08lx\n", GetLastError());
+                goto closeserv;
+        }
+        lprintf(1, "Service %s started successfully\n", SERVICENAME);
+        ret = 0;
+
+  closeserv:
+        if (!CloseServiceHandle(hserv))
+                lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+static int stop_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        SERVICE_STATUS sstat;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+        if (!hserv) {
+                lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+                goto closescm;
+        }
+        ret = 0;
+        if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+                lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!DeleteService(hserv)) {
+                lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!ret)
+                lprintf(1, "Service %s stopped successfully\n", SERVICENAME);
+        if (!CloseServiceHandle(hserv))
+                lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline int isnt()
+{
+        OSVERSIONINFO info;
+
+        info.dwOSVersionInfoSize = sizeof(info);
+        if (GetVersionEx(&info) && info.dwPlatformId == VER_PLATFORM_WIN32_NT)
+                return 1;
+        return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void parport_stop_win(void)
+{
+        DWORD bytesret;
+        int nt = isnt();
+
+        if (pp_win_handle != INVALID_HANDLE_VALUE) {
+                if (!nt)
+                        DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_RELEASEPORT, NULL, 0, NULL, 0, &bytesret, NULL);
+                CloseHandle(pp_win_handle);
+        }
+	pp_win_handle = INVALID_HANDLE_VALUE;
+        if (nt)
+                stop_service();
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_win_flags(unsigned int portnr, unsigned int flags)
+{
+        char buf[32];
+        DWORD bytesret;
+        
+	if (pp_win_handle != INVALID_HANDLE_VALUE)
+		CloseHandle(pp_win_handle);
+        if (isnt()) {
+                start_service();
+                snprintf(buf, sizeof(buf), "\\\\.\\eppflex\\%u", portnr);
+                pp_win_handle = CreateFile(buf, GENERIC_READ | GENERIC_WRITE,
+                                           FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                                           OPEN_EXISTING, 0, NULL);
+                if (pp_win_handle == INVALID_HANDLE_VALUE) {
+                        lprintf(0, "Cannot open eppflex.sys driver, error 0x%08lx\n", GetLastError());
+                        goto err;
+                }
+        } else {
+                pp_win_handle = CreateFile("\\\\.\\EPPFLEX.VXD", 0, 0, NULL, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
+                if (pp_win_handle == INVALID_HANDLE_VALUE) {
+                        lprintf(0, "Cannot open eppflex.vxd driver, error 0x%08lx\n", GetLastError());
+                        goto err;
+                }
+                if (!DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_ACQUIREPORT, &portnr, sizeof(portnr),
+                                     NULL, 0, &bytesret, NULL)) {
+                        CloseHandle(pp_win_handle);
+                        pp_win_handle = INVALID_HANDLE_VALUE;
+                        lprintf(0, "Cannot open acquire port LPT%u, error 0x%08lx\n", portnr+1, GetLastError());
+                        goto err;
+                }
+        }
+	pp_win_flags = FLAGS_PCSPP;
+	if (!parport_spp()) {
+		lprintf(0, "No parport present\n");
+		goto err;
+	}
+	if (parport_ecr()) {
+		pp_win_flags |= FLAGS_PCECR;
+		pp_win_flags |= parport_ecp();
+		pp_win_flags |= parport_ecpps2();
+		pp_win_flags |= parport_ecpepp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_win_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_win_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_win_flags |= FLAGS_PCECPEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	} else {
+		pp_win_flags |= parport_ps2();
+		pp_win_flags |= parport_epp();
+		if ((flags & PPFLAG_FORCEHWEPP) && 
+		    (pp_win_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+		    !(pp_win_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+			pp_win_flags |= FLAGS_PCEPP;
+		else
+			flags &= ~PPFLAG_FORCEHWEPP;
+	}
+	lprintf(0, "Parport capabilities: SPP%s%s%s%s%s%s\n",
+		(pp_win_flags & FLAGS_PCPS2) ? ", PS2" : "",
+		(pp_win_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+		(pp_win_flags & FLAGS_PCECR) ? ", ECR" : "",
+		(pp_win_flags & FLAGS_PCECP) ? ", ECP" : "",
+		(pp_win_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+		(pp_win_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+	if (!(pp_win_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2)))  {
+		lprintf(0, "Parport does not even support PS/2 mode, cannot use it\n");
+		goto err;
+	}
+	lprintf(0, "Parport using eppflex.sys/vxd hardware access");
+	if (pp_win_flags & FLAGS_PCECR)
+		parport_win_write_econtrol(0x30); /* PS/2 mode */
+	parport_ops = parport_win_ops;
+	if ((flags & PPFLAG_SWEMULECP) || !(pp_win_flags & FLAGS_PCECP)) {
+		parport_ops.parport_ecp_write_data = parport_win_emul_ops.parport_ecp_write_data;
+		parport_ops.parport_ecp_read_data = parport_win_emul_ops.parport_ecp_read_data;
+		parport_ops.parport_ecp_write_addr = parport_win_emul_ops.parport_ecp_write_addr;
+		lprintf(0, ", emulating ECP");
+	}
+	if ((flags & PPFLAG_SWEMULEPP) || !(pp_win_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+		parport_ops.parport_epp_write_data = parport_win_emul_ops.parport_epp_write_data;
+		parport_ops.parport_epp_read_data = parport_win_emul_ops.parport_epp_read_data;
+		parport_ops.parport_epp_write_addr = parport_win_emul_ops.parport_epp_write_addr;
+		parport_ops.parport_epp_read_addr = parport_win_emul_ops.parport_epp_read_addr;
+		lprintf(0, ", emulating EPP");
+	}
+	lprintf(0, "\n");
+	return 0;
+
+  err:
+        parport_stop_win();
+	return -1;
+}
+
+int parport_init_win(unsigned int portnr)
+{
+        return parport_init_win_flags(portnr, 0);
+}
diff --git a/main/snprintpkt.c b/main/snprintpkt.c
new file mode 100644
index 0000000..61fc50d
--- /dev/null
+++ b/main/snprintpkt.c
@@ -0,0 +1,255 @@
+/*****************************************************************************/
+
+/*
+ *      snprintpkt.c  --  Print an AX.25 packet (with header) into a buffer.
+ *
+ *      Copyright (C) 1996  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *        Swiss Federal Institute of Technology (ETH), Electronics Lab
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ *  This is the Linux realtime sound output driver
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <stdio.h>
+
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define ADDCH(c)             \
+do {                         \
+	if (p + 1 >= endp)   \
+		return -1;   \
+	*p++ = (c);          \
+} while(0)
+
+#define ADDSTR(s)            \
+do {                         \
+	int l = strlen(s);   \
+	if (p + l >= endp)   \
+		return -1;   \
+	memcpy(p, s, l);     \
+	p += l;              \
+} while(0)
+
+#ifdef HAVE_SNPRINTF
+
+#define ADDF(fmt, args...)                            \
+do {                                                  \
+	int xlen = snprintf(p, endp-p, fmt, ## args); \
+	if (xlen < 0)                                 \
+		return -1;                            \
+	p += xlen;                                    \
+} while(0)
+
+#else /* HAVE_SNPRINTF */
+
+#define ADDF(fmt, args...)                            \
+do {                                                  \
+	char xbuf[64];				      \
+	int xlen = sprintf(xbuf, fmt, ## args);	      \
+	if (p + xlen >= endp)                         \
+		return -1;			      \
+	memcpy(p, xbuf, xlen);                        \
+	p += xlen;                                    \
+} while(0)
+
+#endif /* HAVE_SNPRINTF */
+
+int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len)
+{
+	u_int8_t v1=1 , cmd=0;
+	u_int8_t i, j;
+	char *p = buf;
+	char *endp = buf + sz;
+
+	if (sz < 2)
+		return -1;
+	*buf = 0;
+	if (!pkt || len < 8)
+		return 0;
+	if (pkt[1] & 1) {
+		/*
+		 * FlexNet Header Compression
+		 */
+		v1 = 0;
+		cmd = (pkt[1] & 2) != 0;
+		ADDSTR("fm ? to ");
+		i = (pkt[2] >> 2) & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		i = pkt[4] & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		i = (pkt[5] >> 2) & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f;
+		if (i) {
+			ADDCH(i+0x20);
+		}
+		ADDF("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2));
+		pkt += 7;
+		len -= 7;
+	} else {
+		/*
+		 * normal header
+		 */
+		if (len < 15)
+			return 0;
+		if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) {
+			v1 = 0;
+			cmd = (pkt[6] & 0x80);
+		}
+		ADDSTR("fm ");
+		for(i = 7; i < 13; i++) 
+			if ((pkt[i] &0xfe) != 0x40) {
+				ADDCH(pkt[i] >> 1);
+			}
+		ADDF("-%u to ", (pkt[13] >> 1) & 0xf);
+		for(i = 0; i < 6; i++) 
+			if ((pkt[i] &0xfe) != 0x40) {
+				ADDCH(pkt[i] >> 1);
+			}
+		ADDF("-%u", (pkt[6] >> 1) & 0xf);
+		pkt += 14;
+		len -= 14;
+		if ((!(pkt[-1] & 1)) && (len >= 7)) {
+			ADDSTR(" via ");
+		}
+		while ((!(pkt[-1] & 1)) && (len >= 7)) {
+			for(i = 0; i < 6; i++) 
+				if ((pkt[i] &0xfe) != 0x40) {
+					ADDCH(pkt[i] >> 1);
+				}
+			ADDF("-%u", (pkt[6] >> 1) & 0xf);
+			pkt += 7;
+			len -= 7;
+			if ((!(pkt[-1] & 1)) && (len >= 7)) {
+				ADDCH(',');
+			}
+		}
+	}
+	if (!len) {
+		*p = 0;
+		return p - buf;
+	}
+	i = *pkt++;
+	len--;
+	j = v1 ? ((i & 0x10) ? '!' : ' ') : 
+		((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v'));
+	if (!(i & 1)) {
+		/*
+		 * Info frame
+		 */
+		ADDF(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j);
+	} else if (i & 2) {
+		/*
+		 * U frame
+		 */
+		switch (i & (~0x10)) {
+		case 0x03:
+			ADDF(" UI%c", j);
+			break;
+		case 0x2f:
+			ADDF(" SABM%c", j);
+			break;
+		case 0x43:
+			ADDF(" DISC%c", j);
+			break;
+		case 0x0f:
+			ADDF(" DM%c", j);
+			break;
+		case 0x63:
+			ADDF(" UA%c", j);
+			break;
+		case 0x87:
+			ADDF(" FRMR%c", j);
+			break;
+		default:
+			ADDF(" unknown U (0x%x)%c", i & (~0x10), j);
+			break;
+		}
+	} else {
+		/*
+		 * supervisory
+		 */
+		switch (i & 0xf) {
+		case 0x1:
+			ADDF(" RR%u%c", (i >> 5) & 7, j);
+			break;
+		case 0x5:
+			ADDF(" RNR%u%c", (i >> 5) & 7, j);
+			break;
+		case 0x9:
+			ADDF(" REJ%u%c", (i >> 5) & 7, j);
+			break;
+		default:
+			ADDF(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j);
+			break;
+		}
+	}
+	if (!len) {
+		ADDCH('\n');
+		*p = 0;
+		return p - buf;
+	}
+	ADDF(" pid=%02X\n", *pkt++);
+	len--;
+	j = 0;
+	while (len) {
+		i = *pkt++;
+		if ((i >= 32) && (i < 128)) {
+			ADDCH(i);
+		}
+		else if (i == 13) {
+			if (j) {
+				ADDCH('\n');
+			}
+			j = 0;
+		} else {
+			ADDCH('.');
+		}
+		if (i >= 32) 
+			j = 1;
+		len--;
+	}
+	if (j) {
+		ADDCH('\n');
+	}
+	*p = 0;
+	return p - buf;
+}
+
diff --git a/main/sppafsk_firmware.h b/main/sppafsk_firmware.h
new file mode 100644
index 0000000..78f6aeb
--- /dev/null
+++ b/main/sppafsk_firmware.h
@@ -0,0 +1,1551 @@
+/*****************************************************************************/
+
+/*
+ *      sppafsk_firmware.h  -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define SPPAFSK_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char sppafsk_firmware[] = {
+	0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff, 
+	0xf5, 0xfd, 0xd7, 0xdb, 0xff, 0xbd, 0xfd, 0xff, 
+	0xff, 0xfe, 0xfe, 0xef, 0xef, 0xff, 0xfe, 0xfe, 
+	0xff, 0x9b, 0xff, 0xff, 0xaf, 0xfd, 0xfb, 0xfb, 
+	0xfe, 0xaf, 0xef, 0xff, 0xfe, 0xd7, 0xff, 0x7f, 
+	0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf8, 0xed, 0x9f, 
+	0xff, 0xfe, 0xf8, 0xed, 0x8f, 0x77, 0xfc, 0xf6, 
+	0xc7, 0x6f, 0x7f, 0xfc, 0xf6, 0xc7, 0xef, 0x6f, 
+	0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xf5, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x7f, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xbf, 
+	0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 
+	0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9, 
+	0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 
+	0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xaf, 0xbf, 
+	0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xd7, 
+	0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0x9b, 
+	0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xbd, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xff, 
+	0xed, 0xb7, 0xdf, 0x7a, 0x7b, 0xed, 0xb6, 0xdf, 
+	0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x69, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0x7e, 0xfb, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdb, 0x77, 
+	0xff, 0x7d, 0xef, 0xbf, 0xef, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 
+	0xcf, 0x3f, 0xdb, 0xfe, 0xfb, 0xcd, 0x7f, 0xfe, 
+	0xd9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xf7, 0xff, 
+	0x6f, 0xfe, 0xff, 0xfd, 0xe7, 0xdf, 0x77, 0xff, 
+	0xfd, 0xf7, 0x9f, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 
+	0xe7, 0x9f, 0x6b, 0xfe, 0xf9, 0xe6, 0x9f, 0x7f, 
+	0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfc, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6, 
+	0xdb, 0x6f, 0xbf, 0xfd, 0xf7, 0xdb, 0xdf, 0x7e, 
+	0xfb, 0xad, 0xbf, 0xef, 0x7e, 0xfb, 0xaf, 0xff, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xed, 
+	0xe7, 0xff, 0x7b, 0xff, 0xff, 0xe6, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xf7, 
+	0xff, 0xdf, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xff, 0x7f, 0xff, 0xdd, 
+	0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0x9f, 0xff, 0xff, 0xff, 0xf3, 0xfb, 0x6f, 0xfe, 
+	0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x9b, 0xff, 0x5f, 0xdf, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xff, 
+	0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xfe, 0xfd, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 0x7f, 0x7b, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xbf, 0x7f, 0x7f, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xef, 0xbf, 0xff, 0xfd, 
+	0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 
+	0x7f, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0x7d, 0xfd, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 
+	0xbf, 0xff, 0xde, 0xb9, 0xcf, 0xff, 0xff, 0xfc, 
+	0xf7, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff, 
+	0xff, 0x7e, 0xff, 0xf7, 0xfa, 0xd3, 0xaf, 0xbf, 
+	0xfd, 0x7c, 0xbf, 0xff, 0x7f, 0xfe, 0xf4, 0xff, 
+	0xdf, 0xff, 0xbf, 0xf9, 0xff, 0x5f, 0xbc, 0xff, 
+	0xfe, 0xff, 0xfb, 0xdf, 0xef, 0x3f, 0xff, 0xff, 
+	0xff, 0x7f, 0xef, 0xfb, 0xff, 0x9f, 0xff, 0x6f, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xff, 0xca, 0xaf, 0xbd, 0xfc, 0xff, 
+	0xab, 0xbf, 0xbf, 0xfe, 0xe5, 0xfb, 0x7f, 0x7f, 
+	0xfd, 0xf7, 0xff, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfb, 0xff, 0xb7, 0xfd, 0xf7, 0x7b, 0xeb, 0xbf, 
+	0xff, 0xfd, 0xf7, 0xc7, 0x7f, 0x7f, 0xfd, 0xdf, 
+	0xd7, 0xff, 0x6f, 0xfe, 0x7f, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xfe, 0xfe, 0xef, 0xb7, 0xff, 0xfd, 
+	0xff, 0xdf, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0x9b, 
+	0xfe, 0xbf, 0xe5, 0xc2, 0x2b, 0x3b, 0xff, 0xbf, 
+	0xfe, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xbf, 0x66, 0xff, 0xfb, 0xec, 
+	0xa7, 0x5f, 0xfe, 0xff, 0xaf, 0xff, 0xff, 0xfd, 
+	0xff, 0xdf, 0x7b, 0xfd, 0xfd, 0xf7, 0xdf, 0xff, 
+	0xb7, 0xf9, 0xdf, 0x7e, 0xbb, 0xed, 0xa6, 0xcb, 
+	0x3b, 0xeb, 0xfc, 0xfd, 0xbd, 0xbc, 0xdc, 0xf3, 
+	0xaf, 0xad, 0xfc, 0xfa, 0xff, 0x6f, 0xd4, 0xd7, 
+	0x5e, 0x7b, 0xed, 0xed, 0xff, 0xff, 0x7a, 0xfe, 
+	0xdd, 0x7f, 0xbf, 0xfd, 0xf6, 0xdb, 0xff, 0x3d, 
+	0xfd, 0x5f, 0x99, 0xfb, 0xbf, 0xd9, 0x66, 0x9b, 
+	0x78, 0xff, 0x9f, 0xfe, 0xfb, 0x9e, 0xfe, 0xdf, 
+	0x7f, 0xfe, 0xf9, 0x7f, 0xff, 0xfd, 0xef, 0x66, 
+	0xfe, 0x7b, 0xe5, 0x95, 0x67, 0xde, 0xb9, 0xf1, 
+	0xda, 0x7f, 0xed, 0x7a, 0xff, 0xdd, 0x57, 0x5c, 
+	0x73, 0xdf, 0xbd, 0xb3, 0xb1, 0xff, 0x5e, 0x7b, 
+	0xef, 0xbd, 0xbf, 0xfb, 0xeb, 0x2f, 0x6f, 0xed, 
+	0xfd, 0xf7, 0xff, 0xff, 0xfd, 0xfd, 0xdf, 0xf7, 
+	0x66, 0xec, 0xff, 0xb6, 0xdb, 0x6f, 0xaf, 0xbf, 
+	0xff, 0xfb, 0xdb, 0xdf, 0x7c, 0xff, 0xf7, 0xff, 
+	0xdf, 0xff, 0xfd, 0xfd, 0xbf, 0x99, 0xf7, 0xef, 
+	0xbf, 0xef, 0xbe, 0xff, 0xfe, 0xfb, 0x6f, 0x37, 
+	0xbb, 0xfd, 0xb7, 0xff, 0x7f, 0xfe, 0xed, 0xb7, 
+	0xdf, 0xf6, 0xe6, 0xfd, 0xfb, 0xef, 0xb3, 0xcf, 
+	0x3a, 0xff, 0xf7, 0xf7, 0xdf, 0xff, 0xfb, 0xfb, 
+	0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbd, 0xb1, 
+	0xff, 0xfa, 0xeb, 0xaf, 0xff, 0x5e, 0x5b, 0x6d, 
+	0xb6, 0xcf, 0xf9, 0xf7, 0xdd, 0x7f, 0x9f, 0xdd, 
+	0xf7, 0xd9, 0xf6, 0x66, 0xe6, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xff, 0xdf, 0x7f, 0xbf, 0xfd, 0xfb, 0xbf, 
+	0xff, 0xfe, 0xff, 0xe7, 0xff, 0x7f, 0xff, 0x3f, 
+	0x9b, 0xfb, 0xef, 0xbf, 0xfd, 0xf6, 0xff, 0xfe, 
+	0xef, 0xbf, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfe, 0x7f, 
+	0xff, 0xf5, 0xd7, 0xdf, 0xff, 0xbf, 0xff, 0xfa, 
+	0xe5, 0xd7, 0x7f, 0x7f, 0xff, 0xff, 0xfb, 0x5f, 
+	0xff, 0xbb, 0x79, 0xdf, 0x6f, 0xbf, 0xfd, 0xf6, 
+	0xfb, 0xf7, 0xdb, 0xa7, 0x7f, 0xf5, 0xe5, 0xbb, 
+	0xdf, 0xfe, 0xfb, 0xef, 0x97, 0x7f, 0x6f, 0xfe, 
+	0xff, 0xcf, 0x3a, 0xeb, 0xac, 0xbf, 0xff, 0xfb, 
+	0xcb, 0xdf, 0xf7, 0xfd, 0xf6, 0xdf, 0xef, 0x7f, 
+	0xfd, 0xfe, 0xff, 0x9b, 0xff, 0xff, 0x8f, 0x2e, 
+	0x7a, 0xe8, 0xf3, 0x8f, 0x3e, 0xfa, 0xdc, 0x47, 
+	0x9f, 0x7f, 0xf6, 0xf9, 0x43, 0x9f, 0x7f, 0xfe, 
+	0xe6, 0xff, 0xeb, 0xaf, 0xbf, 0x7e, 0xfa, 0xfb, 
+	0xbf, 0xbf, 0xfe, 0xf5, 0xdf, 0x7f, 0x7f, 0xff, 
+	0xff, 0xd3, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 
+	0xeb, 0xaa, 0xbf, 0xfe, 0xfb, 0xfb, 0xef, 0x7f, 
+	0xfd, 0xfd, 0xff, 0xdf, 0xff, 0xfd, 0xf5, 0xdf, 
+	0xff, 0x6f, 0xfe, 0xbf, 0xfa, 0xef, 0xbf, 0xfd, 
+	0xbe, 0xff, 0xfb, 0xeb, 0x5f, 0xfd, 0xfd, 0xf7, 
+	0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xaf, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xbf, 0xff, 
+	0xfa, 0xdb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0xff, 0xff, 
+	0xff, 0xf4, 0xd3, 0x4f, 0x2d, 0xfd, 0xe4, 0xaf, 
+	0xf7, 0x7f, 0xf9, 0xe5, 0xff, 0x5f, 0xfe, 0xbf, 
+	0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xba, 0xeb, 0x2f, 
+	0xbf, 0xea, 0x32, 0xd7, 0x1f, 0x7f, 0xdd, 0x75, 
+	0x57, 0x5f, 0x77, 0xfd, 0x6f, 0xfe, 0xff, 0xfb, 
+	0xef, 0xff, 0xff, 0x7f, 0xff, 0x7d, 0xff, 0xfe, 
+	0xeb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0xff, 0x1b, 0xff, 0x7f, 0xff, 0xef, 0xbf, 0xfd, 
+	0xfa, 0xfb, 0xfd, 0xf7, 0xff, 0xfb, 0xfe, 0x7f, 
+	0xff, 0xff, 0xef, 0xef, 0xff, 0x7f, 0xe6, 0xff, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x9f, 0xf9, 0xff, 0x3b, 0xd3, 0xcd, 
+	0x3f, 0xff, 0xf8, 0xe3, 0x8f, 0x7f, 0x78, 0xf1, 
+	0xff, 0x5f, 0x7f, 0xb4, 0xfd, 0xc6, 0xff, 0x6f, 
+	0xfc, 0xbf, 0xbb, 0xff, 0xfe, 0xfb, 0x7f, 0xff, 
+	0xff, 0xf7, 0xba, 0x7f, 0xff, 0xff, 0xaf, 0xff, 
+	0xdf, 0xfb, 0x7f, 0xff, 0x99, 0xff, 0xff, 0xff, 
+	0xfe, 0xfb, 0xe7, 0xbd, 0xbb, 0xdc, 0xfb, 0xdb, 
+	0x7f, 0xff, 0xff, 0xa7, 0xd7, 0xff, 0x7f, 0xfc, 
+	0xff, 0xc6, 0xff, 0xff, 0xcf, 0x3f, 0xf9, 0xf6, 
+	0xd3, 0x8f, 0x3b, 0xf6, 0xf8, 0xe7, 0xdf, 0x7f, 
+	0xfc, 0xb1, 0xbf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0xdf, 0xfb, 0xe1, 0xf3, 0xf6, 0xfb, 0xff, 0xf7, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0x7e, 
+	0xef, 0x3f, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 
+	0xff, 0xff, 0xf7, 0xf7, 0xff, 0xfb, 0x6f, 0xff, 
+	0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xf7, 
+	0xaf, 0xfe, 0xbf, 0xeb, 0xae, 0xbb, 0xf6, 0xf7, 
+	0x53, 0x7b, 0xff, 0xdd, 0xf7, 0xff, 0x4f, 0xbf, 
+	0xbf, 0xf9, 0xff, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 
+	0xfb, 0xab, 0xaa, 0xef, 0xee, 0xff, 0x47, 0x1f, 
+	0x7f, 0xfc, 0xff, 0xde, 0xff, 0x6f, 0xfe, 0xff, 
+	0xfb, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfb, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xfe, 
+	0xff, 0xbf, 0xff, 0xff, 0xc7, 0xdf, 0x7e, 0xff, 
+	0xfd, 0xf7, 0xdf, 0xdf, 0xff, 0xfd, 0x3f, 0x66, 
+	0xff, 0xff, 0xbf, 0xbf, 0xfe, 0xff, 0xef, 0xff, 
+	0xff, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xef, 0xfd, 
+	0xf7, 0xdf, 0xff, 0xb7, 0xf9, 0xff, 0x7f, 0x7d, 
+	0xef, 0xbd, 0xcf, 0x3f, 0xfb, 0xb9, 0xf3, 0x3f, 
+	0xb7, 0xff, 0xf9, 0xe7, 0xff, 0xb7, 0xdf, 0xff, 
+	0x6f, 0xd6, 0xff, 0xdf, 0x7f, 0xeb, 0xfc, 0xf3, 
+	0x9f, 0x7e, 0xef, 0xfc, 0x67, 0xbf, 0xff, 0xf7, 
+	0xdf, 0xef, 0xfd, 0xfd, 0x5f, 0x9b, 0xfb, 0xff, 
+	0xef, 0x1d, 0x7e, 0xfd, 0x6f, 0xdf, 0x1f, 0xff, 
+	0xfd, 0x6d, 0x97, 0xbd, 0xf6, 0xdb, 0xc3, 0x7f, 
+	0xdf, 0xee, 0x66, 0xfe, 0xff, 0xff, 0xfe, 0x7b, 
+	0xbf, 0xcd, 0xf1, 0xfe, 0x2b, 0xdd, 0x73, 0xed, 
+	0x3d, 0x37, 0x5c, 0x73, 0xff, 0xad, 0xb3, 0xb1, 
+	0xff, 0xff, 0xdf, 0xbf, 0xaf, 0xfc, 0xf6, 0xef, 
+	0xef, 0xff, 0x7f, 0xf7, 0xdf, 0x77, 0xff, 0xfd, 
+	0xf7, 0xf7, 0xff, 0x66, 0xee, 0xff, 0xff, 0xf7, 
+	0xeb, 0xaf, 0xff, 0xfc, 0xfe, 0xeb, 0xff, 0x7f, 
+	0xff, 0xff, 0xf7, 0xdf, 0xff, 0xfd, 0xff, 0xbf, 
+	0x9b, 0xf7, 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 
+	0xdb, 0xff, 0xff, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 
+	0xfb, 0xfd, 0xb7, 0xdf, 0xf6, 0xe6, 0xfd, 0xff, 
+	0x7f, 0xf7, 0x9f, 0xff, 0x9f, 0xfd, 0xff, 0xff, 
+	0xff, 0xfc, 0xf3, 0xef, 0x3f, 0xff, 0xfb, 0xfb, 
+	0xcf, 0xbd, 0xb1, 0xff, 0x7b, 0xed, 0xb4, 0xdf, 
+	0x76, 0xe3, 0xec, 0xbf, 0xd7, 0xfd, 0xf7, 0xdb, 
+	0x67, 0xbf, 0xfd, 0xf7, 0xdd, 0xfe, 0x66, 0xe6, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x6f, 0xff, 
+	0xfd, 0xff, 0xbf, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 
+	0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xa6, 0xfe, 0xff, 0x2f, 0xff, 0xfe, 0xef, 0x9d, 
+	0xb7, 0x9f, 0xff, 0xf5, 0xdf, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xff, 0xdf, 0xff, 0xab, 0x79, 0xff, 0xff, 
+	0xe9, 0x67, 0xff, 0xfd, 0xe7, 0xdb, 0x7f, 0x7f, 
+	0xf5, 0xe5, 0x93, 0x5f, 0x3e, 0xf9, 0xee, 0xb7, 
+	0x7f, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xff, 0x7f, 
+	0x9f, 0xfc, 0xfb, 0xfb, 0x5f, 0xf7, 0xff, 0xff, 
+	0xff, 0xff, 0x7f, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 
+	0xff, 0x8f, 0x1e, 0xff, 0xfc, 0xb3, 0x8f, 0x3f, 
+	0x3f, 0xd4, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0x47, 
+	0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xaf, 0xd7, 
+	0xfe, 0xfb, 0xff, 0xbf, 0xbf, 0x4f, 0xf5, 0xd7, 
+	0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdf, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xeb, 0xef, 0xbf, 0xff, 0xff, 
+	0xeb, 0xff, 0xef, 0xfd, 0xf5, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf5, 0xf7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xfb, 0xfb, 0xbf, 0xbf, 0xfa, 0xfa, 0xfb, 0x5f, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0xbf, 0xde, 0xfe, 0xfb, 
+	0xaf, 0xbf, 0xfe, 0x7f, 0xd7, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xbf, 0x4f, 0xff, 0xdf, 0xf6, 0xda, 0x6f, 0xbf, 
+	0xfd, 0xef, 0xa7, 0xbf, 0xfe, 0xfa, 0xcb, 0xf7, 
+	0x5f, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xb7, 0xfe, 
+	0xba, 0xeb, 0xaf, 0xbb, 0xee, 0xba, 0xd7, 0x5b, 
+	0x7d, 0xfd, 0xd5, 0x57, 0x5c, 0x7f, 0xed, 0x6b, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0x3f, 0xff, 
+	0xbe, 0xcb, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xfb, 
+	0xf7, 0xdf, 0xfb, 0xff, 0x1b, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xee, 0xfe, 
+	0xff, 0xfb, 0xef, 0xbf, 0xfb, 0xff, 0xbf, 0xff, 
+	0x7f, 0x66, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 
+	0x1f, 0xbf, 0xed, 0x2f, 0xf6, 0xea, 0xbb, 0x7f, 
+	0x7e, 0xfb, 0xe7, 0x83, 0x1f, 0x7f, 0xbc, 0xf5, 
+	0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xbf, 0xff, 0xef, 
+	0xff, 0xbf, 0xfd, 0xfb, 0xff, 0x7f, 0xff, 0xd6, 
+	0xfd, 0xf7, 0xdf, 0xd7, 0xfc, 0xeb, 0xff, 0x9b, 
+	0xff, 0x9f, 0xff, 0xf6, 0xf7, 0xfb, 0xbf, 0xff, 
+	0xf6, 0xb9, 0xde, 0xfd, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xdd, 0xff, 0xe6, 0xff, 0xff, 0xef, 
+	0xfb, 0xff, 0xef, 0xd3, 0x8f, 0xbf, 0x7d, 0xfc, 
+	0xd6, 0xdf, 0x73, 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 
+	0xbf, 0xf9, 0xff, 0xff, 0xdb, 0xff, 0xe3, 0xf7, 
+	0xfb, 0xfd, 0xbf, 0x3f, 0xeb, 0xff, 0xdf, 0xef, 
+	0xfd, 0xfd, 0xff, 0x9b, 0xef, 0x6f, 0xfe, 0xff, 
+	0xef, 0x2f, 0xfe, 0xf7, 0xde, 0xff, 0xff, 0xff, 
+	0x9f, 0x7f, 0xf4, 0xbe, 0x7f, 0xfd, 0xdb, 0xff, 
+	0x9e, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xeb, 0xfb, 0xff, 0xfb, 0xbf, 0xeb, 0xfe, 
+	0xfa, 0xfe, 0xfb, 0x9f, 0xef, 0xff, 0xbd, 0xfe, 
+	0x9b, 0x5f, 0xff, 0xbf, 0xf1, 0xff, 0xfb, 0x7f, 
+	0xff, 0xef, 0xf7, 0xdb, 0xeb, 0x9f, 0xf7, 0x7b, 
+	0xb7, 0xdf, 0x7f, 0xfb, 0xfd, 0xf7, 0xd7, 0xff, 
+	0x67, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfa, 0xff, 0xef, 0xff, 0x7f, 0xfd, 0xf7, 0xd7, 
+	0x7f, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xfe, 0xef, 
+	0xbd, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0x9e, 0x7b, 
+	0x56, 0xff, 0xcd, 0xf7, 0x9f, 0xff, 0xf3, 0xfd, 
+	0xfd, 0xbf, 0x66, 0xff, 0xfb, 0xbf, 0xff, 0xff, 
+	0xfe, 0xef, 0xff, 0xb3, 0x5e, 0xfd, 0x97, 0x4b, 
+	0x67, 0xfd, 0xf5, 0xd2, 0xff, 0xfb, 0xb7, 0xf9, 
+	0xff, 0x3e, 0xeb, 0xef, 0xe7, 0xff, 0x7e, 0xea, 
+	0xb5, 0x7f, 0xa5, 0xf5, 0x56, 0x5b, 0x6d, 0xbd, 
+	0xd5, 0xdf, 0xff, 0x6f, 0xd4, 0xbf, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xde, 0x3f, 0xef, 0x5f, 0xaf, 
+	0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xff, 0xff, 0x5f, 
+	0x99, 0xfb, 0xff, 0xbd, 0x5e, 0xde, 0x79, 0xff, 
+	0x8b, 0x6e, 0x73, 0xf5, 0x4a, 0x7b, 0xdd, 0xf4, 
+	0xd7, 0x4d, 0x7b, 0xfd, 0xef, 0x66, 0xfe, 0x7f, 
+	0xbf, 0xfe, 0x37, 0xde, 0xbf, 0xf6, 0x9e, 0x6b, 
+	0x5f, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xee, 
+	0xbd, 0xb3, 0xb1, 0xff, 0xff, 0xeb, 0xef, 0xef, 
+	0xf7, 0xff, 0xff, 0xfb, 0x7f, 0xbf, 0xbe, 0xff, 
+	0xff, 0xff, 0xbf, 0xbf, 0xd5, 0xf7, 0x66, 0xec, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 
+	0xdf, 0x7f, 0x79, 0xed, 0xb5, 0xd7, 0x5e, 0x0b, 
+	0xed, 0xff, 0xbf, 0x99, 0xf7, 0xff, 0xdb, 0xff, 
+	0xff, 0xff, 0xff, 0xf3, 0xcf, 0xbf, 0xbb, 0xdf, 
+	0x77, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xff, 0xf7, 
+	0xe6, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0xe7, 0x5d, 0xcd, 0xf7, 0xd9, 0x65, 0x97, 
+	0x5d, 0xf6, 0xf9, 0xff, 0xbd, 0xb1, 0xff, 0xfb, 
+	0xec, 0xb5, 0xdf, 0xfe, 0xfb, 0x6c, 0x3f, 0x7b, 
+	0xb9, 0xf4, 0xd3, 0x4f, 0x7f, 0xfd, 0xf4, 0xdb, 
+	0xef, 0x66, 0xe6, 0xff, 0x3f, 0xff, 0xfd, 0xf3, 
+	0xff, 0x6f, 0xff, 0xff, 0xdf, 0x7f, 0xdb, 0xec, 
+	0xb1, 0xdf, 0x36, 0x7b, 0x7f, 0x3f, 0x9b, 0xfb, 
+	0xff, 0xf7, 0xef, 0xbf, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0x7f, 0xdf, 0x6e, 0xbb, 0xed, 0xb7, 0xdd, 
+	0xfe, 0xff, 0xef, 0xe6, 0xfe, 0xfb, 0xf7, 0xbf, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xdb, 0x8f, 0xd7, 
+	0x5a, 0x6b, 0xad, 0xb5, 0xd6, 0xfe, 0xff, 0xbb, 
+	0x79, 0xff, 0xee, 0xdf, 0xbf, 0xfe, 0xfa, 0xf6, 
+	0xcf, 0xef, 0xff, 0xb3, 0xdf, 0x7f, 0xfd, 0xf5, 
+	0xd7, 0xdf, 0x9b, 0x7f, 0x6f, 0xfe, 0xf7, 0xff, 
+	0xff, 0xfb, 0xee, 0xdb, 0xff, 0xff, 0xfd, 0xf7, 
+	0xfd, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3f, 0xbb, 0xec, 
+	0xf2, 0xcf, 0x3e, 0xf2, 0xfc, 0x45, 0x0f, 0x7d, 
+	0xf4, 0xd1, 0x47, 0x8f, 0x7d, 0xfe, 0xe6, 0xff, 
+	0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 
+	0xff, 0xe5, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0x6f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0xff, 
+	0xeb, 0xaf, 0xfe, 0xef, 0xaf, 0x7f, 0x79, 0xf5, 
+	0xd6, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7, 0xff, 0x6f, 
+	0xfe, 0xff, 0xfb, 0xfb, 0xbf, 0xff, 0xfe, 0xff, 
+	0xfe, 0xef, 0x5f, 0x75, 0xf5, 0xd5, 0x57, 0x5f, 
+	0x7d, 0xb5, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xbf, 
+	0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfe, 0xfb, 0xd7, 
+	0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 
+	0xff, 0xe6, 0xff, 0x5b, 0x2f, 0xbf, 0xfd, 0xf6, 
+	0xff, 0xef, 0xff, 0xfc, 0xec, 0xf7, 0x9f, 0xfe, 
+	0x6a, 0xc9, 0xa7, 0x5f, 0xfe, 0xbb, 0xf9, 0xff, 
+	0xad, 0xb7, 0xde, 0x5a, 0xeb, 0xaf, 0xba, 0x7c, 
+	0x2a, 0xd7, 0x1d, 0x6f, 0xfd, 0xd5, 0x57, 0x5f, 
+	0x7b, 0xed, 0x6f, 0xfe, 0xbf, 0xfb, 0xff, 0x7b, 
+	0xe7, 0xfe, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 
+	0xdf, 0xfe, 0xbf, 0xff, 0x9e, 0xfb, 0xff, 0x1b, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 
+	0xbf, 0xef, 0xfd, 0xf7, 0xef, 0x9f, 0xff, 0xfb, 
+	0xef, 0xfb, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xf7, 
+	0xfe, 0xfb, 0xef, 0xff, 0xf7, 0xdf, 0xaf, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb, 
+	0x9f, 0xf9, 0xff, 0xff, 0xfb, 0xaf, 0xbf, 0xee, 
+	0xef, 0xef, 0xef, 0x6f, 0x7d, 0x37, 0xf7, 0x9f, 
+	0x5b, 0xb8, 0xf7, 0xd7, 0xff, 0x67, 0xfc, 0xff, 
+	0xbf, 0xf7, 0xef, 0xbf, 0xff, 0xfb, 0xfe, 0xde, 
+	0xdc, 0xbe, 0xff, 0xef, 0xfb, 0xbf, 0xf7, 0xff, 
+	0xab, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xfe, 
+	0xfb, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xdd, 0xb7, 
+	0xed, 0x7f, 0xff, 0xdf, 0xff, 0xdf, 0x7f, 0xc6, 
+	0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xf9, 0xdf, 0xff, 0xff, 
+	0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x8f, 
+	0xbf, 0x9f, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfe, 
+	0x6f, 0x7e, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xef, 0xeb, 0xff, 0xff, 0xff, 0x7f, 0xff, 
+	0xff, 0xff, 0xff, 0x7f, 0xef, 0x9b, 0xff, 0xff, 
+	0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdf, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xeb, 0xb7, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xdf, 0xfe, 0xff, 0xfc, 0xff, 
+	0xff, 0xfd, 0xf7, 0xdb, 0xef, 0xff, 0xbf, 0xf9, 
+	0xff, 0xfb, 0xe7, 0x17, 0x5f, 0xfe, 0xf9, 0x7d, 
+	0xff, 0xfb, 0x7d, 0xf6, 0xff, 0x5f, 0x77, 0xfd, 
+	0xf5, 0xdf, 0xff, 0x6f, 0xbe, 0xff, 0xfe, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xfe, 0xfb, 0xbf, 0xff, 
+	0xbe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xf7, 0xff, 
+	0x1b, 0xfe, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x6c, 
+	0xfe, 0xf5, 0xe7, 0xff, 0xf9, 0xfc, 0xf7, 0xf7, 
+	0x54, 0x5f, 0x7d, 0xf5, 0x3f, 0x66, 0xff, 0xfb, 
+	0xef, 0xbf, 0xff, 0x7e, 0xfa, 0xff, 0xf3, 0xfd, 
+	0xff, 0xff, 0xff, 0x7d, 0x3f, 0xff, 0x7f, 0xff, 
+	0xfd, 0xb7, 0xf9, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 
+	0xdf, 0xeb, 0xff, 0x7f, 0xff, 0xeb, 0xcf, 0xda, 
+	0xda, 0xef, 0xb7, 0xff, 0xfe, 0xff, 0x6f, 0xd6, 
+	0xd7, 0x5e, 0x7b, 0xed, 0xb5, 0xd7, 0xfe, 0xff, 
+	0xf7, 0xbf, 0xfd, 0xb6, 0xf7, 0xda, 0x4b, 0x2f, 
+	0xbd, 0xf4, 0x5f, 0x9b, 0xfb, 0xbf, 0xdb, 0x6e, 
+	0x7b, 0xed, 0xe5, 0xff, 0xff, 0xe7, 0xff, 0xff, 
+	0x5e, 0xff, 0x37, 0xd3, 0x4d, 0x2f, 0xad, 0xee, 
+	0x66, 0xfa, 0xbb, 0xe6, 0xbe, 0x6b, 0xae, 0xb9, 
+	0xff, 0xff, 0xfd, 0xff, 0xbf, 0xdf, 0x7d, 0xaf, 
+	0x7e, 0xfb, 0xeb, 0xb3, 0xb3, 0xb1, 0xff, 0xfe, 
+	0xfb, 0xef, 0xbf, 0xff, 0xdb, 0xff, 0xf5, 0xf7, 
+	0xfb, 0xbf, 0xdf, 0xdf, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0x66, 0xe6, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 
+	0xff, 0xfe, 0x3f, 0xff, 0xfb, 0xae, 0xff, 0xf7, 
+	0xdf, 0x52, 0x7b, 0xed, 0xb5, 0xbf, 0x9b, 0xf5, 
+	0xef, 0xbf, 0xef, 0xbe, 0xfb, 0xfe, 0xfb, 0xff, 
+	0xb7, 0xbb, 0xff, 0xf6, 0xdf, 0x7d, 0xf5, 0xdd, 
+	0x77, 0xdf, 0xf7, 0xe6, 0xfd, 0xfb, 0xef, 0xb3, 
+	0xcf, 0x3e, 0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xfe, 
+	0x6b, 0xe7, 0x9f, 0x5f, 0x7e, 0xf9, 0xe7, 0xbd, 
+	0xb1, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 
+	0xef, 0xb3, 0xdd, 0x7d, 0x76, 0xdf, 0x4f, 0x3f, 
+	0xbd, 0xf4, 0xd2, 0xff, 0x66, 0xe6, 0xbf, 0xff, 
+	0xfe, 0xfb, 0xef, 0xbf, 0x7f, 0xbf, 0xfd, 0xf3, 
+	0xb7, 0xff, 0xff, 0xb1, 0xc7, 0x3e, 0xfb, 0xed, 
+	0x3f, 0x9b, 0xfb, 0xef, 0xbf, 0xfd, 0xf6, 0xdb, 
+	0x6f, 0xef, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0x7f, 
+	0xed, 0xb6, 0xdd, 0x7e, 0xfb, 0xef, 0xa6, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 
+	0xf8, 0xcd, 0x17, 0xff, 0xfb, 0xed, 0xb7, 0xdf, 
+	0x7e, 0xfb, 0xab, 0x61, 0xff, 0xf7, 0xdd, 0x77, 
+	0xdf, 0xfd, 0xf7, 0xcf, 0x2f, 0xdf, 0xf9, 0xe5, 
+	0x7f, 0xdf, 0x6d, 0xd7, 0x5d, 0x77, 0x7f, 0x63, 
+	0xfe, 0xdf, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfe, 0xef, 0xfe, 0xfd, 0xbb, 0xf5, 0xf7, 0xdf, 
+	0x7f, 0xff, 0x7d, 0xff, 0x9a, 0xff, 0xff, 0x8b, 
+	0x3e, 0xfa, 0xe8, 0xa3, 0xcf, 0x3e, 0xf2, 0xdc, 
+	0xe7, 0x1f, 0x3d, 0xf6, 0xd8, 0x67, 0x9f, 0x7d, 
+	0xbe, 0xe6, 0xff, 0xeb, 0xae, 0xbf, 0xfe, 0xfa, 
+	0xeb, 0xef, 0xff, 0xff, 0xfd, 0xdf, 0x5f, 0x3f, 
+	0xff, 0xfc, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfa, 0xea, 0xaf, 0xbf, 0xfe, 0xfa, 0xff, 0xff, 
+	0xff, 0xfd, 0xf5, 0xd7, 0x7b, 0xff, 0xfd, 0xf7, 
+	0xdf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff, 
+	0xdf, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 0xff, 0x1b, 
+	0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xfe, 0xfb, 0xdf, 0x7f, 0xff, 0xbf, 0xfd, 0xf7, 
+	0xdf, 0x7f, 0xff, 0x3f, 0xe6, 0xfd, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xbf, 
+	0xfe, 0xff, 0xfe, 0xfa, 0xfd, 0xf7, 0x5f, 0xf8, 
+	0xbf, 0xa9, 0xff, 0xaf, 0xbe, 0xfe, 0xfa, 0xeb, 
+	0xaf, 0xbf, 0xfe, 0xba, 0x57, 0x5f, 0x7f, 0xfc, 
+	0x35, 0xd7, 0x5f, 0x75, 0xed, 0x6b, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbd, 0x7f, 0xff, 0xfd, 
+	0x7f, 0xfe, 0xfd, 0xe5, 0xff, 0xed, 0xff, 0xf8, 
+	0xc7, 0xff, 0x1b, 0xff, 0xfb, 0xff, 0xff, 0x7f, 
+	0xff, 0xff, 0xff, 0xfb, 0x7f, 0xef, 0xfb, 0x7d, 
+	0xfd, 0xbf, 0xff, 0xdf, 0x7f, 0xfd, 0x7f, 0xe6, 
+	0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0xff, 0xd5, 0x7b, 0xef, 0xfd, 0xdd, 0x7f, 0xff, 
+	0xde, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xef, 
+	0xcf, 0xff, 0xfe, 0xfb, 0xcb, 0x2f, 0x7f, 0xfc, 
+	0xf7, 0xde, 0x57, 0x5f, 0xfc, 0xf4, 0xd7, 0xfd, 
+	0x6f, 0xfe, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xda, 0xbf, 0x7f, 0xbf, 0xff, 0x37, 
+	0xff, 0xff, 0xdd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 
+	0xbf, 0xef, 0xbf, 0xfb, 0xef, 0x9f, 0xfd, 0xff, 
+	0xdb, 0xfa, 0x7e, 0xf7, 0xbf, 0xc7, 0x5f, 0x7f, 
+	0xff, 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0xff, 0xfd, 0xe9, 0xf7, 0xff, 
+	0xfb, 0xff, 0x3f, 0xf7, 0xff, 0xbf, 0xbf, 0xf9, 
+	0xdf, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x7f, 
+	0xff, 0xbf, 0x95, 0xbd, 0xff, 0xff, 0xfb, 0xff, 
+	0xed, 0xfb, 0xdb, 0x6f, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xf7, 0xdf, 0xf7, 0xff, 0xff, 0xfd, 0xfb, 
+	0xff, 0xfb, 0xfe, 0xef, 0xff, 0xff, 0x71, 0xff, 
+	0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xe6, 0xbf, 0xef, 0xff, 0xfe, 0xff, 0xfd, 0xff, 
+	0xff, 0xfb, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xef, 
+	0xbb, 0xfd, 0xfc, 0xfa, 0xff, 0x3f, 0xf7, 0xfc, 
+	0xf5, 0xfb, 0x7f, 0x7b, 0xfd, 0xf5, 0xdb, 0x5f, 
+	0xdf, 0xbf, 0xe1, 0xff, 0xf8, 0xe3, 0x8f, 0xfd, 
+	0xf6, 0xff, 0xe3, 0x8f, 0xfd, 0x75, 0xb5, 0xdd, 
+	0xef, 0xfd, 0xfd, 0xf3, 0xdb, 0xff, 0x67, 0xfe, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0x76, 0xff, 0xff, 0xf5, 0x7f, 0xbf, 0xff, 
+	0xf6, 0xfa, 0xff, 0x9b, 0xfe, 0xbf, 0xfc, 0xf6, 
+	0xee, 0xef, 0xf5, 0xff, 0xfa, 0x4e, 0x9e, 0x5f, 
+	0xff, 0xff, 0xf5, 0xff, 0x7f, 0x7b, 0xf5, 0xbf, 
+	0x66, 0xff, 0xbb, 0xef, 0xbf, 0xfb, 0x3e, 0xff, 
+	0xef, 0xbe, 0xcb, 0xf7, 0xf7, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xb7, 0xf9, 0xdf, 0x7e, 
+	0xfb, 0xbd, 0xe7, 0x5f, 0x56, 0xfb, 0xbd, 0x67, 
+	0x9f, 0x75, 0x96, 0x5f, 0x7f, 0xbd, 0xfe, 0xfe, 
+	0xf3, 0x6f, 0xd4, 0xd7, 0x5e, 0x7b, 0xed, 0xff, 
+	0x27, 0x5b, 0x7b, 0xed, 0x7f, 0x7f, 0xff, 0xd5, 
+	0xff, 0x59, 0x67, 0xbf, 0xf4, 0x5f, 0x99, 0xfb, 
+	0xbf, 0xd9, 0x66, 0xfe, 0x6f, 0x7f, 0xff, 0x66, 
+	0xde, 0xff, 0x4f, 0xff, 0xfb, 0xf5, 0xd3, 0x7f, 
+	0x7b, 0xad, 0x6e, 0x66, 0xfe, 0x7b, 0xef, 0xbd, 
+	0xff, 0x9e, 0xfd, 0xef, 0x95, 0xf7, 0xdf, 0x50, 
+	0xff, 0xfe, 0x77, 0xd4, 0xdf, 0xee, 0xfb, 0xb3, 
+	0xb1, 0xff, 0xfe, 0xfb, 0xbd, 0xfd, 0xff, 0xfe, 
+	0x7b, 0xbf, 0x7f, 0x9f, 0xff, 0xc7, 0x5b, 0xdf, 
+	0xff, 0xfd, 0xfd, 0xff, 0x66, 0xec, 0xff, 0xf6, 
+	0x5b, 0x6e, 0xff, 0xbf, 0xdf, 0xdb, 0x6f, 0x7f, 
+	0xaf, 0xff, 0x75, 0xfc, 0xff, 0x7f, 0xff, 0xb5, 
+	0xbf, 0x9b, 0xf7, 0xef, 0xbf, 0xaf, 0xbf, 0xff, 
+	0x7f, 0xa3, 0xff, 0xbf, 0xfb, 0xfd, 0xb7, 0xfb, 
+	0x7f, 0xfb, 0xff, 0x37, 0xdf, 0x77, 0xe6, 0xfd, 
+	0xfb, 0xef, 0xb3, 0xcb, 0xff, 0x9f, 0xef, 0xbf, 
+	0xcf, 0xff, 0xfa, 0xfb, 0xef, 0xff, 0xff, 0x77, 
+	0xdb, 0xe7, 0x9d, 0xb1, 0xff, 0xfa, 0xeb, 0xaf, 
+	0xdf, 0x7e, 0xf3, 0xeb, 0xaf, 0xdf, 0xdd, 0xb6, 
+	0xd9, 0x77, 0xaf, 0xed, 0x75, 0xd3, 0xff, 0x66, 
+	0xe6, 0xbf, 0xff, 0xfe, 0xfb, 0xf3, 0xdb, 0xfb, 
+	0xfe, 0xfb, 0xf3, 0x9f, 0x7f, 0xfe, 0xff, 0xff, 
+	0x3f, 0x7f, 0xec, 0x3f, 0x9b, 0xfb, 0xef, 0xbf, 
+	0xfd, 0xb6, 0xff, 0xfd, 0xbf, 0xff, 0xb6, 0xff, 
+	0xf7, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0x5d, 0xfb, 
+	0xef, 0xe6, 0xfe, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 
+	0x0d, 0xfd, 0xfd, 0xf7, 0xf5, 0xd6, 0xef, 0x7c, 
+	0xff, 0xff, 0xd3, 0x7f, 0xfb, 0xbb, 0x79, 0xff, 
+	0xef, 0xbf, 0xff, 0xfa, 0xfa, 0xa7, 0xbf, 0xfd, 
+	0x7e, 0xfb, 0xe6, 0x3f, 0xcf, 0x7e, 0xb9, 0xc5, 
+	0x77, 0x7f, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xeb, 
+	0xff, 0xfb, 0xdf, 0xbf, 0xeb, 0xd5, 0x7f, 0xfd, 
+	0xef, 0xdf, 0xff, 0x7f, 0xfd, 0xfd, 0xff, 0x9b, 
+	0xff, 0xff, 0x8f, 0x3e, 0xfa, 0xec, 0x73, 0xcf, 
+	0x3f, 0xfa, 0xfc, 0x67, 0x9f, 0x7f, 0xf6, 0xd1, 
+	0x47, 0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xeb, 0xaf, 
+	0xbf, 0xfe, 0xff, 0xff, 0xaf, 0xbf, 0xfe, 0xf7, 
+	0x97, 0xff, 0x7c, 0xff, 0xff, 0x17, 0xdf, 0xff, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0xfe, 
+	0xff, 0xeb, 0xaf, 0x7f, 0xff, 0xf7, 0xff, 0xdf, 
+	0x7f, 0xfd, 0xf5, 0xdf, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xfa, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xea, 0xbf, 
+	0xff, 0x7f, 0xfb, 0xdf, 0xdf, 0xff, 0x7f, 0xf5, 
+	0xd7, 0xff, 0x9b, 0xff, 0xaf, 0xff, 0xff, 0xff, 
+	0xef, 0xff, 0xbf, 0xfe, 0xff, 0xbb, 0xff, 0xfe, 
+	0xff, 0xf7, 0xd7, 0x5f, 0x7f, 0xff, 0xff, 0xe6, 
+	0xff, 0xbf, 0xff, 0xff, 0xfd, 0xef, 0xfb, 0xff, 
+	0xfd, 0xfc, 0xed, 0xf7, 0xff, 0x7b, 0xf9, 0xff, 
+	0xa7, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 
+	0xfa, 0xfa, 0xe3, 0x2e, 0xbe, 0xfe, 0xea, 0x16, 
+	0x5d, 0x7e, 0xbd, 0xf5, 0xd7, 0x5e, 0x77, 0xfd, 
+	0x6f, 0xfe, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0xfe, 
+	0xfc, 0xe3, 0xcf, 0xdf, 0xdf, 0xf9, 0xe6, 0xff, 
+	0xff, 0xff, 0xfe, 0x7f, 0xff, 0x1b, 0xff, 0xa7, 
+	0xef, 0xff, 0xda, 0xff, 0x9f, 0xb7, 0x7c, 0xf6, 
+	0xfd, 0xdb, 0xf7, 0xff, 0xee, 0x7f, 0xff, 0xff, 
+	0xff, 0x7f, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xef, 0xfd, 0xff, 0xff, 0xfe, 0xef, 0xdb, 0x5f, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9f, 0xf9, 
+	0xff, 0xfc, 0xf3, 0xbf, 0xff, 0xfb, 0xfe, 0xf1, 
+	0xbe, 0x7e, 0xfd, 0xe5, 0xf3, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0x7f, 0x6f, 0xfc, 0xff, 0xff, 0xff, 
+	0xf7, 0xff, 0xfb, 0xfe, 0xff, 0xfb, 0x3b, 0xff, 
+	0xfd, 0xd7, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xbd, 
+	0x99, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xef, 0xff, 
+	0xff, 0xff, 0xf3, 0xfb, 0x5f, 0xfb, 0xdd, 0xff, 
+	0xdf, 0x7f, 0xff, 0xfc, 0xff, 0xc6, 0xff, 0xdf, 
+	0xff, 0xff, 0xef, 0xdf, 0x7f, 0xff, 0x3f, 0xff, 
+	0xdf, 0xe7, 0x9f, 0x7e, 0xfd, 0xf9, 0xef, 0xcf, 
+	0xfe, 0xbf, 0xf9, 0xdf, 0xff, 0xff, 0xff, 0xff, 
+	0xf9, 0xff, 0xbf, 0xbf, 0xaf, 0xff, 0xfd, 0xf7, 
+	0xfe, 0xff, 0xbd, 0xff, 0xdf, 0xff, 0x6f, 0x7e, 
+	0xff, 0xff, 0xff, 0xe3, 0xff, 0x7f, 0x7b, 0xdd, 
+	0xdb, 0x5f, 0xdf, 0x9f, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xfe, 0xf5, 0x99, 0xff, 0xfe, 0xff, 0xff, 
+	0xfb, 0xff, 0xd7, 0xfe, 0x7e, 0xfe, 0xff, 0xfe, 
+	0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 
+	0xe6, 0xff, 0xfe, 0xaf, 0xb3, 0xce, 0xf3, 0xeb, 
+	0xff, 0xbf, 0x7e, 0xff, 0xd5, 0xef, 0xff, 0xbd, 
+	0xd5, 0xfe, 0xef, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 
+	0xcf, 0xbf, 0xff, 0xba, 0xdb, 0xdf, 0xff, 0x77, 
+	0xe5, 0xbe, 0xd7, 0x7e, 0xe9, 0xfd, 0xff, 0x9f, 
+	0xff, 0x6f, 0xfe, 0xff, 0xff, 0xbd, 0xaf, 0xcf, 
+	0xff, 0xfa, 0xff, 0xbd, 0xff, 0xff, 0xf7, 0xff, 
+	0xd6, 0x7f, 0xff, 0xdf, 0xfb, 0xff, 0x1b, 0xfe, 
+	0xff, 0xa7, 0xf3, 0xeb, 0xff, 0xff, 0xbc, 0xcb, 
+	0x2f, 0x3f, 0xdf, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 
+	0xff, 0xff, 0x3f, 0x66, 0xff, 0xff, 0xef, 0xbf, 
+	0xfd, 0xff, 0xdf, 0x6f, 0xe7, 0xcb, 0xfd, 0xf7, 
+	0xfe, 0xff, 0xff, 0xbd, 0xf7, 0xff, 0xff, 0xb7, 
+	0xf9, 0x5f, 0x7b, 0xaf, 0xed, 0xe7, 0x57, 0xfa, 
+	0xfb, 0xfc, 0xe7, 0xf7, 0xf7, 0xfc, 0xde, 0x7f, 
+	0xff, 0xbd, 0xda, 0xff, 0x6f, 0xd6, 0xf3, 0x5e, 
+	0x7b, 0xed, 0xfd, 0xb3, 0xfe, 0xfe, 0xf7, 0xff, 
+	0x6f, 0x3f, 0xff, 0xff, 0xdf, 0x7f, 0x9f, 0xfd, 
+	0x5f, 0x9b, 0xfb, 0xff, 0xbd, 0xf7, 0x5b, 0xfc, 
+	0xb5, 0xdd, 0xf6, 0xbf, 0xf5, 0xe3, 0xb7, 0xff, 
+	0xf5, 0xfa, 0xff, 0x7f, 0xdd, 0xee, 0x66, 0xfe, 
+	0x7f, 0xef, 0xbd, 0x77, 0xef, 0x7b, 0xb2, 0xfd, 
+	0x5d, 0x75, 0x7b, 0xcf, 0xad, 0xd7, 0xde, 0x7f, 
+	0x5f, 0xb5, 0xb3, 0xb1, 0xff, 0xfb, 0xef, 0xef, 
+	0xed, 0xff, 0xfe, 0x6f, 0xff, 0xff, 0xfb, 0xff, 
+	0xdd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 
+	0xee, 0xff, 0xfe, 0xdb, 0x6f, 0xef, 0xff, 0xf6, 
+	0xdb, 0xdb, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0x9b, 0xe7, 0xff, 0xff, 
+	0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 
+	0xff, 0xb7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x9f, 
+	0xf7, 0xe6, 0xdd, 0xff, 0xff, 0xf3, 0xff, 0x6f, 
+	0xff, 0xff, 0xff, 0xd9, 0xef, 0xfe, 0xfb, 0x8f, 
+	0xbf, 0xff, 0xff, 0xff, 0xcf, 0xbd, 0xb1, 0xff, 
+	0xfb, 0xeb, 0xaf, 0xdf, 0xbe, 0xfb, 0xed, 0xb7, 
+	0xd9, 0x7d, 0x76, 0xdb, 0x6f, 0x9f, 0xfd, 0xf7, 
+	0xdb, 0xff, 0x66, 0xe6, 0xdf, 0xff, 0xfe, 0xfb, 
+	0xf3, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xb7, 0x7f, 
+	0x7e, 0xfb, 0xe7, 0xbf, 0x7f, 0xfe, 0x3f, 0x9b, 
+	0xfb, 0xfe, 0xbf, 0xfd, 0xfe, 0xfe, 0xfb, 0xef, 
+	0xef, 0xbf, 0xff, 0xfb, 0xdf, 0xbf, 0xff, 0xfd, 
+	0xfd, 0xef, 0xff, 0xaf, 0xa6, 0x7e, 0xff, 0xff, 
+	0xfd, 0xf7, 0x7b, 0xff, 0xef, 0xfd, 0xf0, 0xf7, 
+	0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xef, 
+	0xbb, 0x61, 0xdf, 0xef, 0xbf, 0xfd, 0xbe, 0xe9, 
+	0xea, 0xaf, 0x2f, 0xfa, 0xff, 0xec, 0x9b, 0x7f, 
+	0x7e, 0xfb, 0xee, 0x9b, 0x7b, 0x63, 0xfe, 0xff, 
+	0xff, 0xba, 0xff, 0xbf, 0xff, 0xcf, 0xfe, 0xed, 
+	0x7f, 0x77, 0xff, 0xff, 0xdf, 0xef, 0xff, 0xff, 
+	0xf7, 0xff, 0x9b, 0xff, 0xff, 0x87, 0x3e, 0xff, 
+	0xf8, 0xa3, 0xcb, 0x3e, 0xf7, 0xf4, 0xe7, 0x9f, 
+	0x7f, 0xfc, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 
+	0xff, 0xef, 0xa7, 0xbf, 0xfe, 0xff, 0xff, 0xef, 
+	0xff, 0xfe, 0xe7, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xdf, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xeb, 
+	0xaf, 0xff, 0xff, 0xfa, 0xee, 0xbf, 0xff, 0xfb, 
+	0xfd, 0xf7, 0x7f, 0x7f, 0xff, 0xfd, 0xdf, 0xff, 
+	0x6f, 0xfe, 0xdf, 0xda, 0xef, 0xab, 0xff, 0xfe, 
+	0xeb, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0xfd, 0xf7, 0xff, 0x1b, 0xfe, 0xef, 
+	0xff, 0xff, 0xfa, 0xff, 0xaf, 0xff, 0xfe, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 
+	0xff, 0xff, 0xe6, 0xff, 0xdf, 0x3f, 0xfd, 0xbf, 
+	0xf2, 0x7f, 0x6f, 0x3d, 0xfd, 0xe5, 0xa7, 0x9f, 
+	0xfa, 0xfb, 0xdd, 0x77, 0xfb, 0xff, 0xbf, 0xe9, 
+	0xff, 0xaf, 0xbe, 0xfe, 0xfa, 0x6b, 0xaf, 0xbf, 
+	0xee, 0x7a, 0xd7, 0x5f, 0x77, 0xfd, 0x55, 0xd7, 
+	0x5d, 0x7f, 0xed, 0x6b, 0xfe, 0xbf, 0xff, 0xef, 
+	0xff, 0xdf, 0xfb, 0xff, 0xec, 0xef, 0xff, 0xbf, 
+	0xfe, 0xff, 0xf3, 0xff, 0xbf, 0xdf, 0xff, 0xff, 
+	0x1b, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xff, 
+	0xff, 0xfd, 0xff, 0xfe, 0xef, 0xef, 0xff, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0x7f, 0x66, 0xff, 0xff, 
+	0xff, 0xff, 0xf7, 0xf7, 0xff, 0x7f, 0xdf, 0x4e, 
+	0xff, 0xbf, 0xed, 0xf9, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xcf, 0x1f, 
+	0xfe, 0xbf, 0xff, 0xbf, 0xff, 0x79, 0xfe, 0xc7, 
+	0xfb, 0xe7, 0xff, 0xf1, 0xff, 0xff, 0x6f, 0xfe, 
+	0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 
+	0xfe, 0xbd, 0xef, 0x7f, 0xdb, 0xfd, 0xff, 0x77, 
+	0xff, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xbd, 0xbd, 
+	0xf7, 0xe7, 0xff, 0xef, 0xff, 0xf6, 0xbf, 0xfe, 
+	0xff, 0xff, 0xb7, 0xdf, 0x7f, 0xff, 0xff, 0xff, 
+	0xe6, 0xff, 0x7f, 0x7f, 0xbf, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xb7, 0x5f, 0xef, 0xfe, 
+	0xf5, 0xd3, 0xdf, 0xf7, 0xbf, 0xd9, 0xdf, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
+	0x3f, 0xfd, 0xff, 0xff, 0xeb, 0xfb, 0xef, 0xdf, 
+	0xff, 0x6f, 0xfe, 0xfd, 0xff, 0xf7, 0xff, 0xcd, 
+	0xff, 0x7f, 0xff, 0xd5, 0xf7, 0xff, 0xbf, 0xf1, 
+	0x7f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x9f, 0xfb, 0xff, 0xf7, 
+	0xfb, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xaf, 0xff, 
+	0xff, 0xfd, 0xeb, 0xab, 0xd7, 0x72, 0xff, 0xbd, 
+	0x7f, 0x7e, 0xfd, 0xe7, 0x9b, 0xff, 0xff, 0xbf, 
+	0xf1, 0xff, 0xfb, 0xef, 0x7f, 0xfe, 0xb9, 0xfa, 
+	0xeb, 0x8f, 0x7f, 0x69, 0xff, 0xdb, 0x7f, 0x7f, 
+	0xfd, 0xf5, 0xdd, 0xff, 0x67, 0xfe, 0xff, 0xfe, 
+	0xfd, 0xff, 0xfe, 0xff, 0xff, 0x6f, 0xbf, 0xff, 
+	0xff, 0xff, 0xf5, 0xdf, 0xdf, 0x7f, 0xff, 0xf6, 
+	0xfb, 0x9b, 0xfe, 0xef, 0xbf, 0xff, 0xff, 0xff, 
+	0xbc, 0xb2, 0x9a, 0x2b, 0x77, 0xff, 0xad, 0xfb, 
+	0xcd, 0xdf, 0xdf, 0x7f, 0xff, 0xbf, 0x66, 0xff, 
+	0xef, 0xbf, 0xbd, 0xff, 0xff, 0xfb, 0xff, 0xff, 
+	0x5c, 0xfd, 0xfc, 0xf3, 0x4f, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xb7, 0xf9, 0xdf, 0x7b, 0xef, 0xef, 
+	0xd5, 0xdf, 0x6e, 0xbf, 0x3c, 0xff, 0x95, 0x55, 
+	0xbe, 0xde, 0x68, 0xbf, 0xf7, 0xde, 0xf9, 0x6f, 
+	0xd4, 0x97, 0x5f, 0x7e, 0xeb, 0xfc, 0xd7, 0x5e, 
+	0x7a, 0xa7, 0xdc, 0x7f, 0x3d, 0xdf, 0xf7, 0xcb, 
+	0x2f, 0xbf, 0x7c, 0x5e, 0x99, 0xfb, 0xef, 0xbf, 
+	0xbf, 0xff, 0x7f, 0xb7, 0x95, 0x16, 0xde, 0xf5, 
+	0xcd, 0xfb, 0xbf, 0xde, 0xf7, 0x7e, 0xb3, 0xad, 
+	0xee, 0x66, 0xfe, 0xaf, 0xb7, 0xfe, 0xfb, 0xef, 
+	0x78, 0xf7, 0x9d, 0x25, 0xfd, 0xf7, 0xfe, 0xad, 
+	0xf7, 0xbd, 0xf7, 0xce, 0xb3, 0x93, 0xb1, 0xff, 
+	0xfb, 0xee, 0xaf, 0xff, 0x1b, 0xde, 0x7e, 0xeb, 
+	0xff, 0xed, 0xfd, 0xef, 0xbf, 0xab, 0xfd, 0xfd, 
+	0xf5, 0xff, 0x66, 0xec, 0xbf, 0xff, 0xfe, 0xeb, 
+	0xef, 0xd5, 0xf6, 0xda, 0x7b, 0xdf, 0x7b, 0xef, 
+	0x7f, 0xfe, 0x6b, 0xff, 0xfd, 0xf7, 0xbf, 0x99, 
+	0xf7, 0xef, 0xbf, 0xef, 0xbf, 0xdf, 0xee, 0xbb, 
+	0xef, 0xf7, 0xfb, 0xff, 0xb7, 0x9d, 0xff, 0xff, 
+	0xdd, 0x77, 0xdf, 0x77, 0xe6, 0xfd, 0xfb, 0xef, 
+	0xb3, 0xce, 0x23, 0xff, 0xfc, 0xf3, 0x9b, 0xdf, 
+	0xff, 0xff, 0xef, 0x3f, 0x7f, 0xfe, 0xf9, 0xe7, 
+	0xbd, 0xb1, 0xff, 0xda, 0xeb, 0xbf, 0xff, 0x58, 
+	0xfa, 0xeb, 0x25, 0xfe, 0xfd, 0xf7, 0xdb, 0x69, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0xbf, 0x6e, 0xe6, 0xbf, 
+	0xff, 0xfe, 0xff, 0xff, 0x9f, 0x7d, 0xf6, 0xfb, 
+	0xf7, 0xff, 0xdf, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0x3b, 0x9b, 0x7b, 0xef, 0xbf, 0xfd, 0xff, 
+	0xff, 0x6d, 0xb7, 0xfd, 0xff, 0xfe, 0xff, 0xf7, 
+	0xbd, 0xf7, 0xb7, 0xdf, 0x7e, 0xdb, 0xef, 0xe6, 
+	0xde, 0xff, 0xaf, 0x9f, 0xde, 0x52, 0x7f, 0xbf, 
+	0xfd, 0xf0, 0xb5, 0xd7, 0xfe, 0xbd, 0xff, 0xfd, 
+	0xf6, 0xdb, 0x7f, 0xbb, 0x79, 0xff, 0xf7, 0xc9, 
+	0x2f, 0xbf, 0xf8, 0xef, 0xbb, 0x77, 0x7e, 0xd7, 
+	0xd5, 0x3f, 0xff, 0x7c, 0xf7, 0xdd, 0x77, 0x7f, 
+	0x6f, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbb, 
+	0xfe, 0x7e, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 
+	0x7b, 0xff, 0xbd, 0x77, 0xff, 0x9b, 0xff, 0xff, 
+	0xcf, 0x3f, 0xff, 0xfc, 0xa3, 0xcf, 0x3e, 0xf7, 
+	0xf4, 0xe7, 0x9f, 0x7b, 0xfe, 0xd9, 0x67, 0x9f, 
+	0x7d, 0xfe, 0xe6, 0xff, 0xeb, 0xff, 0xff, 0xff, 
+	0xf2, 0xeb, 0xef, 0xff, 0xfe, 0xf7, 0xdf, 0xff, 
+	0xfe, 0xfb, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9, 
+	0xff, 0xfa, 0xff, 0xff, 0xbf, 0xfc, 0xfa, 0xef, 
+	0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xfd, 
+	0xf7, 0xdd, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xfa, 
+	0xeb, 0xff, 0xfe, 0xfb, 0xeb, 0xbf, 0x7f, 0xfd, 
+	0xf5, 0xdf, 0x3f, 0xdf, 0x7d, 0xf7, 0xdd, 0xff, 
+	0x9b, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xff, 0xff, 
+	0xbf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 
+	0xf7, 0xdf, 0x77, 0xff, 0xff, 0x66, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0xbe, 0xf5, 
+	0xe5, 0x77, 0xdf, 0x7f, 0xf9, 0xed, 0xff, 0xff, 
+	0xf9, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xfe, 0xe2, 
+	0xab, 0xae, 0x9f, 0xee, 0xba, 0x96, 0x5f, 0x6f, 
+	0xb9, 0x75, 0x57, 0x5f, 0x7f, 0xfd, 0x6f, 0xfe, 
+	0xff, 0xf7, 0xff, 0xff, 0xde, 0xff, 0x6f, 0xff, 
+	0xdb, 0xff, 0xbd, 0xfe, 0xe7, 0x9f, 0xcb, 0xff, 
+	0xff, 0xff, 0xe7, 0x1b, 0xff, 0xfb, 0xdf, 0xff, 
+	0xff, 0xfd, 0xf7, 0xf3, 0xef, 0x6e, 0xff, 0xff, 
+	0xbe, 0xf6, 0xf4, 0xff, 0xfd, 0xb7, 0xff, 0xff, 
+	0xe6, 0x7f, 0xfd, 0x77, 0xdf, 0xf3, 0xf7, 0x7f, 
+	0xff, 0xee, 0xfb, 0xff, 0xff, 0x7f, 0xf9, 0xf3, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xe9, 0xff, 0xfe, 
+	0x6f, 0xbd, 0xff, 0xdf, 0xfc, 0xf3, 0x2f, 0xf7, 
+	0xb9, 0xf7, 0xf7, 0x1f, 0x7f, 0xff, 0xf5, 0xd7, 
+	0xfb, 0x67, 0xfc, 0xff, 0xfd, 0xff, 0xf7, 0xfb, 
+	0xff, 0xff, 0xdf, 0xe6, 0xf7, 0xff, 0xfe, 0xf7, 
+	0xef, 0xff, 0xfe, 0x7d, 0xf7, 0xfd, 0x99, 0xff, 
+	0xff, 0xbb, 0x7f, 0xf1, 0xff, 0xfe, 0xef, 0xf2, 
+	0xbf, 0xf5, 0x7d, 0xde, 0x7b, 0xf3, 0xdf, 0x5b, 
+	0x7f, 0xdd, 0xff, 0xc6, 0xdf, 0xff, 0xff, 0xbf, 
+	0xde, 0xf7, 0xdf, 0xef, 0xff, 0x9d, 0xef, 0xe6, 
+	0x4f, 0xff, 0xff, 0xf5, 0x57, 0x5f, 0xf7, 0x8f, 
+	0xf9, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0x4f, 0xfd, 0xdf, 0xcf, 0xfd, 0xff, 0xff, 0xeb, 
+	0xfb, 0xef, 0xbd, 0xfd, 0x6f, 0xfe, 0x3f, 0xff, 
+	0xbc, 0xe3, 0xff, 0x3b, 0xf7, 0xbc, 0x9f, 0xff, 
+	0x9f, 0xff, 0xd8, 0xe2, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0x99, 0xff, 0xaf, 0xbb, 0xfd, 0xf7, 0xbf, 
+	0x7f, 0xbf, 0xfd, 0xbf, 0xff, 0xff, 0x7f, 0xfd, 
+	0xf5, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xea, 0x27, 0xdb, 0x67, 0xfa, 0xe3, 0x77, 0xb7, 
+	0xfe, 0xd5, 0xd3, 0x6b, 0x6f, 0x7d, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xff, 
+	0xff, 0xf6, 0xf3, 0xdf, 0x37, 0xdf, 0xe5, 0xbf, 
+	0xdd, 0x7f, 0x7d, 0xdd, 0xe5, 0xd1, 0xff, 0x6f, 
+	0xfe, 0x7f, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0x7e, 
+	0xff, 0xef, 0xbf, 0xbf, 0xd7, 0xf5, 0xef, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xff, 0x9b, 0xfe, 0xfb, 0xff, 
+	0xff, 0xf7, 0xbf, 0xfd, 0xff, 0xff, 0xf7, 0x7f, 
+	0xfd, 0xd7, 0xf3, 0xff, 0xfe, 0xff, 0xff, 0x7f, 
+	0xff, 0xa6, 0xff, 0xaf, 0xbf, 0xff, 0xcb, 0xce, 
+	0x2f, 0xf9, 0xd6, 0x5a, 0x97, 0x7f, 0xff, 0xe7, 
+	0xf3, 0xfd, 0xf7, 0xde, 0xff, 0xaf, 0xd9, 0xff, 
+	0xee, 0xfb, 0xef, 0xa4, 0xff, 0x76, 0xbd, 0xec, 
+	0x72, 0xbb, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0xf7, 
+	0xdf, 0xff, 0x65, 0xfe, 0xb7, 0xdf, 0x1e, 0xff, 
+	0xbd, 0xb6, 0x5f, 0x7f, 0xfb, 0xdd, 0x7f, 0x35, 
+	0xff, 0xff, 0x7b, 0xef, 0xbd, 0xf7, 0xfa, 0x9b, 
+	0xf5, 0xb5, 0xd7, 0xfe, 0x7f, 0xed, 0xb5, 0xff, 
+	0x5f, 0x7b, 0xdd, 0x5b, 0xe7, 0x3f, 0xff, 0xf2, 
+	0xcb, 0x2f, 0x9f, 0x57, 0xe6, 0x7e, 0x6d, 0xbf, 
+	0xbd, 0xf7, 0xfe, 0x6f, 0xf6, 0xd9, 0x66, 0x37, 
+	0xf1, 0xff, 0xb7, 0xbf, 0xf6, 0xdf, 0x6d, 0xb3, 
+	0x9b, 0x99, 0x6f, 0xae, 0xb9, 0xaf, 0xbe, 0xff, 
+	0xde, 0xbf, 0xef, 0x7e, 0xf7, 0xfc, 0x7f, 0xeb, 
+	0x35, 0xff, 0xfd, 0xf2, 0xee, 0x6c, 0xec, 0xbf, 
+	0x5b, 0xee, 0xeb, 0xbf, 0xbf, 0xff, 0xef, 0xbb, 
+	0xdc, 0x47, 0xff, 0xfb, 0xef, 0xca, 0x7f, 0xff, 
+	0xfd, 0xbd, 0x99, 0xfb, 0xbf, 0xf5, 0xf6, 0x0a, 
+	0x6f, 0xbf, 0xbd, 0xf7, 0x5b, 0x5f, 0xca, 0xfb, 
+	0x9f, 0xff, 0xde, 0x7f, 0xff, 0xfd, 0xef, 0xc6, 
+	0xbd, 0xdb, 0x6b, 0xfb, 0xed, 0xbf, 0xfb, 0x7f, 
+	0xbb, 0xad, 0x6c, 0xfb, 0x7f, 0xff, 0x7d, 0xfd, 
+	0xf7, 0xdd, 0xf7, 0x9d, 0x79, 0x5f, 0xe6, 0x9b, 
+	0x2c, 0xf2, 0xcb, 0xff, 0x8f, 0x7c, 0xf2, 0xb3, 
+	0xdf, 0xff, 0xfb, 0x6f, 0xf7, 0x5d, 0xf6, 0x79, 
+	0x67, 0xe4, 0xaf, 0xf8, 0xe2, 0xcf, 0xaf, 0xbf, 
+	0xfe, 0xe3, 0x0b, 0x5f, 0xb6, 0xfd, 0x77, 0xda, 
+	0x57, 0x7f, 0xfd, 0xf5, 0xbf, 0x99, 0xf9, 0xef, 
+	0xbf, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe, 
+	0xf5, 0xed, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xce, 0xe6, 0xfe, 0xfb, 0x6f, 0xff, 0xfb, 
+	0xf6, 0xfb, 0xff, 0xbf, 0xed, 0xdd, 0xfd, 0x7b, 
+	0xef, 0xfd, 0xfd, 0xb7, 0xdf, 0xf6, 0xbb, 0xb9, 
+	0xff, 0xc7, 0x1f, 0x7f, 0xfc, 0xf7, 0xdf, 0x1d, 
+	0x7f, 0x7c, 0xe3, 0xb5, 0xff, 0xff, 0xfd, 0xff, 
+	0xfd, 0xf7, 0xff, 0x6e, 0xde, 0xf7, 0xf9, 0xe7, 
+	0x9f, 0xff, 0xfa, 0xfb, 0xe7, 0x9f, 0x77, 0x7c, 
+	0xd7, 0xcf, 0x3f, 0xfb, 0x75, 0xd7, 0xdd, 0xdf, 
+	0x9b, 0xff, 0x7f, 0xb7, 0x6c, 0x2a, 0xeb, 0xff, 
+	0xbf, 0x7c, 0xba, 0xff, 0x5f, 0xff, 0xff, 0xdf, 
+	0xff, 0x7d, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 
+	0xa2, 0x8f, 0x3e, 0xfa, 0xfc, 0xa3, 0x8f, 0x3c, 
+	0xef, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xd9, 0x67, 
+	0x97, 0xbf, 0xf9, 0xff, 0xa2, 0xcb, 0x2f, 0xbf, 
+	0xfe, 0xfa, 0xeb, 0x2f, 0x7e, 0xf3, 0xf7, 0x3f, 
+	0xff, 0x7f, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 
+	0x9f, 0xbe, 0xfa, 0xcb, 0xaf, 0xaf, 0xfe, 0xfa, 
+	0xeb, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 
+	0xfd, 0x77, 0xfd, 0x9b, 0xfd, 0xaf, 0xfe, 0xf9, 
+	0xef, 0xbf, 0xaf, 0xfe, 0xfb, 0xef, 0x7f, 0x7f, 
+	0xfd, 0xf7, 0xdf, 0x57, 0xdf, 0x7d, 0xf7, 0xff, 
+	0xe6, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xbf, 0xeb, 
+	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
+	0xf5, 0xf7, 0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xef, 
+	0xff, 0x3f, 0xbf, 0xfd, 0xef, 0x9a, 0xff, 0xfd, 
+	0xef, 0x8f, 0xf7, 0xd7, 0xfe, 0x7f, 0xdf, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0x6b, 0x8f, 0xbe, 0xe8, 
+	0xea, 0xcb, 0xad, 0xbf, 0xf6, 0xe5, 0x97, 0x5b, 
+	0x76, 0xf9, 0xd5, 0xd7, 0x5e, 0xff, 0x9b, 0xff, 
+	0x3f, 0xfb, 0xf4, 0xa3, 0xfb, 0xff, 0xba, 0x7c, 
+	0xff, 0xfe, 0xcf, 0xbf, 0xf9, 0xe5, 0xff, 0xff, 
+	0xff, 0xf7, 0xf9, 0xc6, 0xbf, 0xe9, 0xaf, 0xdd, 
+	0xfd, 0xbf, 0xff, 0x1f, 0xfa, 0xfd, 0xff, 0xfe, 
+	0x6f, 0x79, 0xcf, 0x7f, 0xff, 0xfd, 0xbf, 0xbf, 
+	0xf9, 0xf7, 0xff, 0xfe, 0xaf, 0xef, 0xdf, 0xdf, 
+	0xff, 0x7f, 0xfb, 0xfb, 0xff, 0xb7, 0x7f, 0xff, 
+	0xff, 0xff, 0xff, 0xfb, 0x6f, 0xfc, 0xb7, 0xf6, 
+	0x7a, 0xe9, 0xaf, 0xdf, 0xde, 0xe8, 0xe2, 0xd9, 
+	0x6f, 0xfe, 0x7d, 0xe7, 0xdf, 0x6b, 0xf5, 0xf5, 
+	0xff, 0x99, 0xff, 0xaf, 0xba, 0xfe, 0xf9, 0xda, 
+	0xfe, 0xbf, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xfd, 
+	0xff, 0xdf, 0x5f, 0xdf, 0x5b, 0x5f, 0xe6, 0xbf, 
+	0xe7, 0x9f, 0xff, 0xf4, 0xfb, 0xeb, 0x97, 0x3f, 
+	0xfc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xf6, 0xff, 
+	0x5b, 0xbf, 0xbf, 0xf9, 0x7f, 0xfa, 0xeb, 0xff, 
+	0x3f, 0xfb, 0xf7, 0xeb, 0xae, 0xbf, 0xdb, 0xef, 
+	0xff, 0xef, 0x7e, 0xfb, 0xdf, 0xe6, 0xef, 0x67, 
+	0xfe, 0xff, 0xff, 0xdf, 0x1d, 0xef, 0xff, 0xfd, 
+	0xff, 0xfe, 0xfd, 0xdf, 0xdf, 0xbf, 0xff, 0x7f, 
+	0xfe, 0xef, 0xf7, 0xff, 0x9b, 0xdf, 0xfb, 0xfe, 
+	0xeb, 0xbe, 0xdf, 0x8f, 0x3f, 0xeb, 0xff, 0xe7, 
+	0x9e, 0x7f, 0xbe, 0xc9, 0xfb, 0xbf, 0xff, 0x7f, 
+	0x7f, 0xe6, 0x7f, 0xff, 0xfd, 0xbf, 0x1f, 0xff, 
+	0xdf, 0xb6, 0xff, 0xf7, 0xf5, 0xd5, 0x4b, 0xff, 
+	0xfb, 0xff, 0xeb, 0xff, 0xff, 0xbf, 0xb9, 0xff, 
+	0xff, 0xdd, 0xff, 0xff, 0xfc, 0x7f, 0xd5, 0xb4, 
+	0xf6, 0xfd, 0xfe, 0xff, 0xb5, 0x7f, 0xfd, 0xf7, 
+	0xfb, 0xff, 0x6f, 0xfe, 0xbf, 0xec, 0xfa, 0x7f, 
+	0x3f, 0xfe, 0xfa, 0xdf, 0xf7, 0xbe, 0x76, 0xf9, 
+	0xf7, 0xff, 0x5f, 0xff, 0xf8, 0xff, 0xff, 0x9b, 
+	0xfb, 0xff, 0xfb, 0xfb, 0xff, 0xf3, 0xbf, 0xff, 
+	0xfb, 0xef, 0xff, 0xfd, 0xfb, 0xfe, 0x7f, 0xff, 
+	0x7f, 0xff, 0xdf, 0xff, 0x86, 0xff, 0x2f, 0xbf, 
+	0xf2, 0xfb, 0xf7, 0xbb, 0xbf, 0xf1, 0xf2, 0xf5, 
+	0x5c, 0x73, 0x79, 0xe7, 0xff, 0x3c, 0xff, 0xff, 
+	0x8f, 0xd9, 0xff, 0xef, 0xbb, 0xf9, 0xfe, 0xf7, 
+	0xf6, 0xff, 0xbc, 0xff, 0x9f, 0x7d, 0xf6, 0xdf, 
+	0xfe, 0x2f, 0xff, 0xff, 0xff, 0x6d, 0xfe, 0x97, 
+	0xfe, 0x3f, 0xdf, 0xbf, 0xa5, 0xff, 0x3b, 0xaf, 
+	0xfd, 0x6f, 0xb7, 0xdd, 0x9e, 0x7f, 0x7f, 0x37, 
+	0xff, 0xff, 0x9b, 0xf5, 0xec, 0xa7, 0xdf, 0x37, 
+	0xff, 0xed, 0xff, 0xdf, 0x7b, 0xd5, 0x6b, 0xaf, 
+	0xbd, 0xf6, 0xdc, 0x7b, 0xcf, 0xff, 0xd7, 0xe6, 
+	0xfe, 0x6f, 0xb5, 0xc5, 0x67, 0xfe, 0x7a, 0xf5, 
+	0x8b, 0x57, 0xb5, 0xda, 0x6c, 0x33, 0xf7, 0xbf, 
+	0xfd, 0x5f, 0xff, 0xbb, 0x99, 0xff, 0x9e, 0x79, 
+	0xff, 0x9d, 0x7a, 0xeb, 0xb9, 0xef, 0xdf, 0xef, 
+	0xbc, 0xf2, 0xde, 0xff, 0xf3, 0xdf, 0x52, 0xff, 
+	0x6c, 0xec, 0xff, 0xfe, 0xfb, 0xf7, 0xa9, 0xe7, 
+	0xba, 0xff, 0xbb, 0xfb, 0x4b, 0xff, 0xfd, 0xdf, 
+	0xea, 0x7a, 0xff, 0xff, 0xbf, 0x99, 0xfb, 0xef, 
+	0xbd, 0xf6, 0x5f, 0xea, 0xe8, 0xbd, 0xff, 0x5e, 
+	0xd7, 0x76, 0xfb, 0xed, 0xb7, 0x7f, 0x7f, 0xff, 
+	0xff, 0xef, 0xe6, 0xf9, 0xff, 0xff, 0xfb, 0x8e, 
+	0xbf, 0xfd, 0xff, 0xff, 0xbf, 0x3c, 0xf7, 0xdc, 
+	0xf3, 0xcf, 0xff, 0xff, 0xed, 0xb7, 0xbc, 0x79, 
+	0xff, 0x7f, 0xff, 0xf7, 0xe7, 0x9f, 0xff, 0xbf, 
+	0xed, 0x7e, 0x9f, 0x7d, 0xf6, 0xd9, 0xe5, 0xff, 
+	0xff, 0xfe, 0x7b, 0x6f, 0xec, 0xff, 0x4e, 0x7b, 
+	0xed, 0xbf, 0xff, 0x56, 0xfb, 0xe8, 0x57, 0x3f, 
+	0xfd, 0xf4, 0xd3, 0x6b, 0xfe, 0xdd, 0x37, 0xbf, 
+	0x99, 0xf9, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xff, 
+	0xff, 0x6f, 0xfe, 0xb6, 0xc6, 0x32, 0xcb, 0xac, 
+	0xfb, 0xff, 0xbf, 0xff, 0xcf, 0xa6, 0xbe, 0xff, 
+	0xfe, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xee, 0xff, 
+	0xed, 0xb5, 0xd7, 0x5e, 0xdb, 0xff, 0xff, 0xf7, 
+	0xff, 0xbb, 0xb9, 0xdf, 0xdb, 0x6b, 0xff, 0xfc, 
+	0xfe, 0xff, 0xef, 0xff, 0xfd, 0xed, 0xb5, 0xff, 
+	0xfe, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0x6a, 0xd8, 
+	0xbf, 0xfb, 0x6a, 0xbf, 0x67, 0xb7, 0xfa, 0xee, 
+	0x89, 0xde, 0x7d, 0xf5, 0xdf, 0x7e, 0xfd, 0xfd, 
+	0xfb, 0xee, 0xdf, 0x9b, 0xff, 0xbc, 0xb7, 0xee, 
+	0xf7, 0xed, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 
+	0x77, 0xfd, 0xf5, 0xde, 0x7b, 0xff, 0xfd, 0xff, 
+	0xe6, 0xff, 0xfb, 0xb3, 0xcf, 0x3f, 0xfe, 0xe8, 
+	0xf2, 0x8f, 0x3e, 0xf7, 0xf9, 0x43, 0x1f, 0x5d, 
+	0xfe, 0xd9, 0xc5, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 
+	0xff, 0x7f, 0xfe, 0xfe, 0xf7, 0xcf, 0x7f, 0x7e, 
+	0xff, 0xff, 0xd3, 0x5f, 0x7f, 0xff, 0xef, 0xff, 
+	0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xbf, 
+	0xbf, 0xbe, 0xf6, 0xeb, 0x7f, 0xff, 0xff, 0xf5, 
+	0xd7, 0x57, 0xff, 0x7b, 0xff, 0xff, 0x9b, 0xff, 
+	0xbf, 0xfe, 0xfa, 0xef, 0xef, 0x7f, 0xfa, 0xfb, 
+	0xef, 0x5f, 0x5f, 0xed, 0xf7, 0x5f, 0x77, 0x7f, 
+	0xf7, 0xfd, 0xff, 0x86, 0xbf, 0xfb, 0xff, 0xff, 
+	0xff, 0xfe, 0xeb, 0xff, 0xbf, 0xfe, 0xfd, 0xd7, 
+	0xfb, 0xff, 0xdf, 0xf5, 0x9f, 0xdf, 0xff, 0x8f, 
+	0xd9, 0xff, 0xfe, 0xcb, 0x6f, 0xbf, 0xf8, 0xf4, 
+	0xfb, 0x3f, 0xfd, 0xe9, 0x87, 0xb7, 0xff, 0x7e, 
+	0xff, 0xff, 0xff, 0xff, 0x6f, 0xfa, 0xbf, 0xab, 
+	0xa5, 0x39, 0xee, 0xfa, 0xab, 0x2f, 0xbf, 0xec, 
+	0xc4, 0x97, 0x5c, 0x7d, 0xbd, 0xb5, 0xd7, 0x5f, 
+	0xff, 0x9a, 0xff, 0x7f, 0xdd, 0xc9, 0xf6, 0xff, 
+	0x5e, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xf7, 
+	0xfd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xff, 
+	0xf7, 0xdf, 0x6f, 0xff, 0xff, 0xdb, 0xff, 0xfb, 
+	0xdd, 0xef, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xfe, 
+	0xff, 0xbf, 0x9f, 0xf9, 0xff, 0xc7, 0xfd, 0xff, 
+	0xff, 0xff, 0xf7, 0xbf, 0x77, 0xdb, 0x7b, 0x6e, 
+	0xff, 0xff, 0x7d, 0xfd, 0xff, 0xff, 0xff, 0x6f, 
+	0xfe, 0xb7, 0xff, 0xea, 0xf3, 0x8f, 0xfe, 0xdf, 
+	0xb7, 0xeb, 0x9d, 0xff, 0xfd, 0xf7, 0xdf, 0xdd, 
+	0xef, 0xbf, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xfe, 
+	0x7e, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0x7e, 
+	0xdf, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xf7, 0x6f, 
+	0xff, 0xe6, 0xff, 0xff, 0x6d, 0x7f, 0xee, 0xbf, 
+	0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xf7, 
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xaf, 0xf9, 0xff, 
+	0xfe, 0xfb, 0xaf, 0xff, 0xff, 0xbf, 0xdb, 0x7f, 
+	0xff, 0xef, 0xee, 0xfb, 0xff, 0xff, 0xf7, 0xbf, 
+	0xff, 0xff, 0x6f, 0xfa, 0xff, 0xd6, 0xfe, 0xff, 
+	0xfd, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 
+	0xdf, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x9b, 
+	0xff, 0x8f, 0xff, 0xb7, 0xfc, 0xf5, 0xe6, 0x3b, 
+	0x7f, 0x77, 0xfd, 0xef, 0x73, 0xff, 0xf1, 0xc5, 
+	0xfb, 0x6f, 0xfe, 0xff, 0xe6, 0x7f, 0xf7, 0xfb, 
+	0xbb, 0xed, 0xfd, 0xfb, 0xbb, 0xff, 0xff, 0xff, 
+	0xff, 0xcd, 0xff, 0xbb, 0xf7, 0x7f, 0xff, 0xfe, 
+	0xbf, 0xf9, 0xbf, 0x7f, 0xeb, 0xbf, 0x9f, 0xfe, 
+	0xf2, 0xf7, 0xfd, 0x7d, 0x9d, 0xff, 0xdd, 0x7f, 
+	0xff, 0xff, 0xfe, 0xcf, 0xff, 0x6f, 0xfc, 0xdf, 
+	0xff, 0xeb, 0xef, 0xae, 0xbb, 0xfe, 0xff, 0xef, 
+	0xff, 0xfe, 0xf7, 0x7f, 0xcf, 0xef, 0xef, 0xff, 
+	0xdb, 0xff, 0x99, 0xfd, 0xff, 0xfe, 0xfe, 0xfc, 
+	0xff, 0xff, 0xff, 0xd3, 0xed, 0xff, 0xff, 0x7d, 
+	0xff, 0xdb, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xa6, 
+	0x7f, 0xad, 0xff, 0xe7, 0xfb, 0x6b, 0xed, 0xaf, 
+	0xbf, 0xf5, 0xdd, 0x57, 0x73, 0xfd, 0xfd, 0xfd, 
+	0xff, 0xff, 0xfc, 0xaf, 0xd9, 0x9f, 0xf7, 0xff, 
+	0xf5, 0xa7, 0xfb, 0xfe, 0xeb, 0xbf, 0xd7, 0x95, 
+	0xf5, 0xb4, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0xff, 
+	0x6d, 0xde, 0xd7, 0xcc, 0x3e, 0x9f, 0xed, 0xb7, 
+	0x9f, 0x7a, 0xef, 0x7d, 0xff, 0xf5, 0xb7, 0xd4, 
+	0xf3, 0xfb, 0xff, 0xfd, 0xfc, 0x1b, 0xf5, 0x4d, 
+	0xf3, 0xcf, 0x6f, 0xed, 0xb5, 0xb3, 0x5e, 0x7e, 
+	0xf5, 0x7f, 0x7f, 0x9f, 0xf7, 0xfe, 0xff, 0xe7, 
+	0x9d, 0x57, 0xe6, 0xfe, 0x6a, 0xe7, 0xff, 0xf7, 
+	0x9b, 0x6d, 0xaf, 0xbd, 0x6f, 0xbd, 0xdb, 0x7e, 
+	0xb2, 0x5d, 0xf4, 0xff, 0xff, 0xff, 0xbb, 0x99, 
+	0xff, 0x56, 0xbc, 0xff, 0x99, 0xfb, 0xae, 0xa9, 
+	0xbf, 0xda, 0x55, 0xd6, 0xf7, 0xed, 0x7d, 0xf5, 
+	0xff, 0x7f, 0xeb, 0x64, 0xec, 0xff, 0xf6, 0xfe, 
+	0x77, 0xef, 0xbe, 0x5f, 0x2e, 0xef, 0x75, 0x69, 
+	0xb5, 0xd7, 0xd7, 0x7f, 0xff, 0xff, 0xfd, 0xbf, 
+	0x19, 0xfb, 0x6f, 0xfd, 0xff, 0x5f, 0x6f, 0xbf, 
+	0xbc, 0xcf, 0x7e, 0xf5, 0x50, 0x43, 0xeb, 0xf7, 
+	0xdf, 0xff, 0xff, 0xfd, 0x6f, 0xe6, 0x3d, 0xdf, 
+	0xff, 0xff, 0x2e, 0xf6, 0xdb, 0x7e, 0xbb, 0xff, 
+	0x6c, 0xbf, 0xfd, 0xfe, 0xff, 0x7f, 0xfe, 0xff, 
+	0xff, 0x9d, 0x79, 0xdf, 0x6f, 0xff, 0xfd, 0xbf, 
+	0xf9, 0x26, 0x8b, 0xec, 0x7f, 0x93, 0x45, 0x3e, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0x6f, 0xec, 
+	0xc7, 0x4c, 0xfb, 0xec, 0x2f, 0xbe, 0xf4, 0xe3, 
+	0xeb, 0x5f, 0xf8, 0xf1, 0xe7, 0xda, 0x7f, 0xdf, 
+	0xfd, 0xf6, 0xab, 0x9b, 0xf9, 0xf7, 0xff, 0x6f, 
+	0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe, 0xf7, 0xff, 
+	0xff, 0xff, 0xfe, 0xfb, 0xff, 0x9f, 0xdf, 0xce, 
+	0xe6, 0xfe, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0x9b, 
+	0xff, 0xbf, 0xff, 0xed, 0xff, 0xff, 0xdf, 0x7f, 
+	0xff, 0xff, 0xfb, 0xef, 0xbb, 0xb9, 0x7f, 0xdf, 
+	0xeb, 0xff, 0xfc, 0xf1, 0xc7, 0x9f, 0xff, 0x7f, 
+	0xa1, 0xa5, 0x37, 0xfa, 0x7f, 0xff, 0xf5, 0xfb, 
+	0xdf, 0x6e, 0xde, 0xd7, 0xe9, 0xf2, 0xbf, 0x7f, 
+	0xfe, 0xf9, 0xe7, 0xdf, 0x57, 0x7c, 0xf1, 0x4c, 
+	0x9f, 0x7f, 0x3e, 0xf9, 0xed, 0xdf, 0x9b, 0xff, 
+	0xbf, 0xbb, 0xfe, 0xef, 0xfd, 0xaf, 0x9f, 0xea, 
+	0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf2, 0x5f, 
+	0xff, 0xdf, 0xff, 0xe6, 0xff, 0xfb, 0xa3, 0xcf, 
+	0x3f, 0xf7, 0xc8, 0xa3, 0xcf, 0x2f, 0xef, 0xf8, 
+	0xc7, 0x9e, 0x7d, 0xf6, 0xd1, 0xc7, 0x9f, 0xbf, 
+	0xf9, 0xff, 0xff, 0xeb, 0x77, 0x9f, 0xfc, 0xf2, 
+	0xcb, 0xaf, 0xfb, 0xf3, 0xce, 0x9f, 0x7f, 0x7e, 
+	0xf9, 0xf5, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xfa, 0xdf, 0x2f, 0xbf, 0xfc, 0xf2, 0xeb, 0xfb, 
+	0xef, 0xff, 0xf7, 0x97, 0x5f, 0x7e, 0xfd, 0xfd, 
+	0xff, 0x9b, 0xff, 0xbf, 0xfe, 0xfe, 0xef, 0xab, 
+	0xff, 0xfe, 0xfb, 0xfa, 0x57, 0x5f, 0xfd, 0xf1, 
+	0xf7, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xe6, 0xff, 
+	0xfb, 0xaf, 0xf7, 0xdf, 0xfa, 0xff, 0xff, 0xbf, 
+	0xfe, 0xf5, 0xd6, 0x7f, 0x7f, 0xf9, 0xef, 0xd7, 
+	0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xf4, 0xdf, 0x2f, 
+	0xfe, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xef, 0xc9, 
+	0xff, 0xdf, 0x7f, 0xfa, 0xff, 0xff, 0xf7, 0x6f, 
+	0xfe, 0xbf, 0xeb, 0xaf, 0xbd, 0xfe, 0xfa, 0xab, 
+	0xae, 0xbf, 0xfa, 0xf5, 0x56, 0x4f, 0x2e, 0xc9, 
+	0xf1, 0xd7, 0x5f, 0xfb, 0x9b, 0xcf, 0xff, 0xbd, 
+	0xef, 0xe1, 0xcf, 0xf6, 0xfe, 0xfb, 0xbf, 0xbf, 
+	0x7f, 0xf6, 0xd1, 0xbf, 0xff, 0xff, 0xff, 0xff, 
+	0xf9, 0xe6, 0xff, 0xbf, 0xfb, 0x7b, 0xfd, 0x3e, 
+	0xff, 0xf7, 0xf3, 0xed, 0xfb, 0xd5, 0xcd, 0xbf, 
+	0xff, 0xff, 0xfd, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 
+	0xff, 0xff, 0x5b, 0xff, 0xbe, 0xef, 0xff, 0xfe, 
+	0xff, 0xfb, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0x6f, 0xdc, 0xf7, 0xed, 0xf0, 0xeb, 
+	0xa7, 0xbd, 0xfc, 0xfa, 0xeb, 0x5f, 0x36, 0xfd, 
+	0xf7, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x19, 
+	0xf7, 0xff, 0xfb, 0xbf, 0xd5, 0xeb, 0x7f, 0xf7, 
+	0x7e, 0xfa, 0x3e, 0x7d, 0xdf, 0x7f, 0xf7, 0xef, 
+	0xff, 0xff, 0xff, 0x7f, 0xa6, 0xbd, 0xef, 0x2f, 
+	0xff, 0xf6, 0xdb, 0xfb, 0x8e, 0x7f, 0xde, 0xfc, 
+	0xf7, 0xd9, 0xff, 0xdf, 0xff, 0xcf, 0x7f, 0xf7, 
+	0xbf, 0xf1, 0xfb, 0xfd, 0xff, 0xff, 0x3f, 0xfb, 
+	0xff, 0x7f, 0x6d, 0x3f, 0xef, 0xff, 0xbf, 0xff, 
+	0xfe, 0xcf, 0xff, 0xe7, 0xff, 0x67, 0xfc, 0xfd, 
+	0xd7, 0xf7, 0xdf, 0xe7, 0xe5, 0xff, 0xdf, 0xfb, 
+	0x7f, 0xfb, 0xef, 0xff, 0xfb, 0xef, 0xff, 0xff, 
+	0xf7, 0xfb, 0x1b, 0xff, 0xff, 0xbf, 0x68, 0xfa, 
+	0xfe, 0xcf, 0xda, 0x7f, 0xef, 0xfd, 0xe7, 0xf7, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6, 
+	0xff, 0xbf, 0xfe, 0xf7, 0xff, 0xff, 0xdb, 0xfe, 
+	0xf7, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 
+	0x7f, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 
+	0xf4, 0xff, 0xdf, 0x6f, 0xdc, 0xfe, 0xdb, 0xff, 
+	0xff, 0x97, 0x5e, 0xfe, 0xfd, 0xf5, 0xd7, 0xff, 
+	0x6f, 0xfe, 0xff, 0xec, 0xff, 0xff, 0x3e, 0xcf, 
+	0xfe, 0x7f, 0xeb, 0xfb, 0x77, 0xfd, 0xf7, 0xdf, 
+	0xff, 0xff, 0xfd, 0xf6, 0xff, 0x9b, 0xff, 0xbf, 
+	0xfe, 0xef, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfb, 0xfe, 0xf7, 0xf7, 0xaf, 0xff, 
+	0xfd, 0xff, 0x86, 0xff, 0xbf, 0xf5, 0xf2, 0xfb, 
+	0xff, 0x1f, 0xfc, 0xf3, 0xc3, 0x9d, 0xd7, 0x59, 
+	0x4d, 0xf5, 0xf7, 0x3c, 0xff, 0xff, 0x8f, 0xd9, 
+	0xff, 0xee, 0xff, 0xff, 0xfe, 0x9f, 0x1f, 0xff, 
+	0xff, 0x7f, 0xef, 0xff, 0xff, 0xf3, 0xff, 0x3d, 
+	0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xe7, 0xcf, 0x2f, 
+	0xff, 0xec, 0xff, 0x93, 0x53, 0xa9, 0x55, 0xed, 
+	0xbf, 0xdf, 0x7e, 0x79, 0x6f, 0xb5, 0xb5, 0xff, 
+	0x9b, 0xf5, 0xec, 0xf3, 0xcf, 0x7f, 0xee, 0xdf, 
+	0x77, 0xcd, 0x3a, 0xd7, 0x4b, 0x2f, 0xbd, 0x74, 
+	0xde, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0x7f, 
+	0xf6, 0xd7, 0x57, 0xbe, 0xfd, 0xeb, 0xfd, 0xf6, 
+	0xfd, 0xd7, 0x4e, 0x7b, 0xcd, 0xf6, 0xd7, 0x4f, 
+	0xff, 0xbb, 0x99, 0xff, 0xde, 0xfd, 0xff, 0x95, 
+	0x6f, 0xff, 0x4b, 0xf5, 0x59, 0xf7, 0xbf, 0xfd, 
+	0xea, 0xbb, 0xfd, 0xdf, 0x78, 0xbf, 0x6c, 0xec, 
+	0xbf, 0xbe, 0x7d, 0xf7, 0xef, 0xf3, 0xff, 0xda, 
+	0xeb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x77, 0xfe, 
+	0xff, 0xff, 0xaf, 0x99, 0xfb, 0xaf, 0xfd, 0x97, 
+	0x1f, 0xeb, 0xf5, 0xbf, 0xd6, 0xde, 0xff, 0x5e, 
+	0x6b, 0xed, 0xb5, 0x9f, 0x5f, 0x7f, 0xfd, 0xef, 
+	0xe6, 0xfd, 0xff, 0xb6, 0xeb, 0xce, 0xff, 0xdf, 
+	0x76, 0xef, 0xff, 0x7e, 0xf7, 0xd5, 0x77, 0xdf, 
+	0xef, 0xff, 0xdd, 0xf7, 0xbd, 0x69, 0xff, 0x7f, 
+	0xbf, 0xf7, 0xf7, 0xfb, 0x7f, 0xde, 0xf9, 0xff, 
+	0x9d, 0x7f, 0xfe, 0xf9, 0xe7, 0xf3, 0x7f, 0xfe, 
+	0x79, 0x6f, 0xec, 0xff, 0xee, 0xfb, 0xed, 0xb6, 
+	0xd7, 0x7c, 0xfb, 0xef, 0x7f, 0x2f, 0xfd, 0xf5, 
+	0xd3, 0x5f, 0x3f, 0xed, 0xf4, 0xbf, 0x99, 0xf9, 
+	0xf7, 0xdf, 0x6f, 0xbf, 0xff, 0xf7, 0xfb, 0xfb, 
+	0xff, 0xff, 0xcf, 0x3e, 0x7b, 0xec, 0xf7, 0xcd, 
+	0x36, 0xfb, 0xcf, 0xe6, 0x7e, 0xff, 0xbb, 0xef, 
+	0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb6, 
+	0xdd, 0x76, 0xfb, 0xdf, 0xb5, 0xd7, 0xfe, 0xbb, 
+	0xa9, 0xdf, 0xda, 0x3f, 0xff, 0xfc, 0xf7, 0xe2, 
+	0xdf, 0xbf, 0xfd, 0xef, 0xb7, 0xdf, 0x7e, 0xfb, 
+	0xff, 0xf5, 0xd7, 0xff, 0x6a, 0xde, 0xbf, 0xda, 
+	0xaf, 0xbf, 0x2d, 0xba, 0xdc, 0xef, 0xaf, 0xff, 
+	0x7d, 0xb7, 0xdd, 0x77, 0x7f, 0xfc, 0xfb, 0xef, 
+	0xdf, 0x9b, 0xff, 0xbf, 0xfb, 0xeb, 0xff, 0xff, 
+	0xaf, 0xbf, 0xdf, 0xfb, 0xd7, 0xdd, 0x7f, 0xff, 
+	0xfd, 0xfe, 0xef, 0xf7, 0xff, 0xff, 0xe6, 0xff, 
+	0xff, 0xf3, 0xcf, 0x3d, 0x7a, 0xc8, 0xb3, 0x8b, 
+	0x1e, 0x75, 0xd9, 0x67, 0x9f, 0x7d, 0x76, 0xd0, 
+	0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 0xdf, 0x7f, 
+	0xfe, 0x5f, 0xfa, 0xff, 0xbf, 0x5f, 0xfd, 0xfd, 
+	0xf7, 0xdf, 0xff, 0xdb, 0xfe, 0xff, 0xff, 0x6f, 
+	0xfe, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xbf, 0xfe, 
+	0xff, 0xee, 0x5f, 0xd7, 0xfd, 0xf7, 0xdf, 0x7f, 
+	0x5f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xb7, 0xfe, 
+	0xf9, 0xef, 0xbf, 0xbf, 0xbf, 0xeb, 0x6f, 0x7f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x3f, 0x5b, 0x7f, 0xfd, 
+	0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 
+	0xeb, 0xbf, 0xfb, 0xfe, 0x7f, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xf7, 0xfe, 0xff, 0xff, 0x8f, 0xd9, 0xff, 
+	0xf2, 0xff, 0x6f, 0xff, 0xfd, 0xff, 0x1b, 0x6f, 
+	0x7f, 0xfb, 0xe9, 0xff, 0xdf, 0x7e, 0xfb, 0xed, 
+	0xb7, 0xff, 0x6f, 0xfa, 0xbf, 0x6b, 0x2f, 0xbe, 
+	0x7e, 0xe8, 0xab, 0x2f, 0xbf, 0xfe, 0x35, 0xd3, 
+	0x5f, 0x7f, 0xad, 0x75, 0x57, 0x5d, 0xfb, 0x9b, 
+	0xff, 0x3f, 0xff, 0xfc, 0xf4, 0xf9, 0xff, 0x3f, 
+	0xfd, 0x7c, 0xe7, 0xfd, 0xfd, 0xff, 0xb9, 0x17, 
+	0xdb, 0x7b, 0xdf, 0xbf, 0xc6, 0xff, 0xf5, 0xbf, 
+	0x7f, 0xef, 0xdf, 0x3f, 0xdf, 0xeb, 0xff, 0x7f, 
+	0xfd, 0xee, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xfd, 
+	0x9f, 0xf9, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 
+	0x67, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0x7f, 0xfd, 0xff, 0xff, 0xfd, 0x6f, 0xfe, 0xb7, 
+	0xfe, 0xfa, 0xcf, 0xf7, 0xbf, 0xff, 0x7f, 0xfa, 
+	0x7a, 0x7f, 0xbe, 0xf5, 0x77, 0x57, 0xdf, 0xb7, 
+	0xf6, 0xff, 0x9b, 0xff, 0x9f, 0xb7, 0xfe, 0xff, 
+	0xff, 0x7f, 0xfe, 0x7f, 0xfb, 0x77, 0xf7, 0x7f, 
+	0xfb, 0xb6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xcf, 0xff, 0x8f, 0xf6, 0xff, 0x5f, 0x1f, 
+	0xfb, 0xef, 0x7f, 0x4e, 0x7f, 0xe7, 0xe7, 0xb7, 
+	0xff, 0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xfe, 0x7f, 
+	0xcf, 0xbf, 0xfb, 0xff, 0xeb, 0x6f, 0x9f, 0xfb, 
+	0x3f, 0xf7, 0xff, 0xff, 0xfe, 0xf5, 0xf7, 0xff, 
+	0x6f, 0xfe, 0xbd, 0xf5, 0xff, 0xfb, 0xef, 0xf7, 
+	0x1f, 0x6f, 0xfb, 0xf7, 0xf7, 0xf7, 0xe7, 0x7f, 
+	0xf7, 0xfd, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xff, 
+	0xef, 0xff, 0xff, 0xfd, 0xd7, 0x7f, 0x7f, 0xfc, 
+	0xef, 0x5e, 0x7f, 0xf8, 0xfe, 0x7f, 0xfd, 0xf3, 
+	0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xef, 0xff, 
+	0xbf, 0xdf, 0xdf, 0xfc, 0xfd, 0xf7, 0xff, 0x7f, 
+	0xff, 0xff, 0x5e, 0xff, 0xff, 0xff, 0xbf, 0xa9, 
+	0x7f, 0xff, 0xef, 0xad, 0xbd, 0x7e, 0x73, 0xff, 
+	0xdd, 0xef, 0xbb, 0xf5, 0x96, 0x7f, 0xf7, 0xff, 
+	0x77, 0xfb, 0xef, 0x6f, 0xfc, 0xff, 0xfe, 0xf8, 
+	0xef, 0xaf, 0x7f, 0xfe, 0xf7, 0x3e, 0xf7, 0xff, 
+	0xfd, 0xf5, 0xbf, 0xff, 0xfb, 0xfd, 0xf7, 0xff, 
+	0x99, 0xff, 0xbf, 0xff, 0xff, 0x6b, 0xff, 0xbf, 
+	0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xfd, 
+	0xff, 0x5f, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xff, 
+	0xff, 0xd7, 0xfb, 0x6f, 0x9e, 0xbf, 0xe6, 0xf3, 
+	0xd7, 0xff, 0xff, 0xaf, 0x9f, 0xdd, 0xff, 0xff, 
+	0xff, 0xaf, 0xd9, 0xff, 0xff, 0xff, 0xe5, 0xff, 
+	0xcb, 0xcf, 0xdf, 0xfc, 0x7f, 0xfb, 0xbd, 0xff, 
+	0xfe, 0x67, 0xff, 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 
+	0xa7, 0xff, 0x7b, 0xbd, 0xb9, 0xff, 0xf5, 0x7a, 
+	0xbd, 0xd5, 0x2f, 0xff, 0xff, 0xd4, 0xd9, 0x6d, 
+	0xbd, 0x75, 0xfe, 0x1b, 0xf5, 0xec, 0xb3, 0xff, 
+	0xfe, 0xfb, 0x5f, 0xb7, 0x9f, 0x7d, 0xdf, 0x5f, 
+	0xff, 0x9f, 0xf5, 0xf7, 0xeb, 0xaf, 0xff, 0x57, 
+	0xc6, 0x7e, 0x4d, 0x6f, 0xdf, 0x7d, 0x76, 0xfd, 
+	0xbb, 0xd7, 0x35, 0xb7, 0xfa, 0x4c, 0xbb, 0xcd, 
+	0xbc, 0xd7, 0x4f, 0xff, 0xbb, 0x99, 0xff, 0xf6, 
+	0xd9, 0x63, 0xaf, 0x6d, 0xff, 0xfb, 0x76, 0x48, 
+	0xef, 0xde, 0x5b, 0xe5, 0x3d, 0xef, 0x5f, 0x79, 
+	0xed, 0x64, 0xec, 0xbf, 0x1e, 0x7a, 0xe8, 0xaf, 
+	0xff, 0xff, 0xfb, 0xff, 0xdf, 0xdb, 0x07, 0xf5, 
+	0x57, 0x71, 0xff, 0xff, 0xff, 0xbf, 0x99, 0xfb, 
+	0x6f, 0x94, 0x5d, 0xf2, 0xdb, 0xff, 0xbf, 0xf7, 
+	0xde, 0xdf, 0xfe, 0xe7, 0xf5, 0x75, 0xde, 0x5e, 
+	0x7f, 0xfd, 0x6f, 0xc6, 0xfd, 0xdf, 0x7e, 0xdb, 
+	0xed, 0xb7, 0xdd, 0xff, 0xf3, 0xff, 0xfe, 0xbf, 
+	0xff, 0xf6, 0xdb, 0xfe, 0xf7, 0xdf, 0xf7, 0x9d, 
+	0x71, 0xff, 0x7f, 0xbd, 0xf9, 0xc6, 0x9b, 0x7f, 
+	0xbf, 0xf9, 0xfe, 0xff, 0xcf, 0x3f, 0xef, 0x6c, 
+	0xf7, 0xfd, 0xf7, 0x79, 0x6f, 0xec, 0xdf, 0xbc, 
+	0xe3, 0x8d, 0x37, 0xd6, 0x6e, 0xfb, 0xcf, 0x7f, 
+	0xaf, 0xb1, 0xe6, 0x1a, 0x57, 0x7f, 0xfd, 0xb4, 
+	0xaa, 0x9b, 0xf9, 0xf3, 0xdf, 0x6f, 0xff, 0xfc, 
+	0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xf7, 0xcf, 0x36, 0xfb, 0xcf, 0xe6, 0xfe, 
+	0xfe, 0xfb, 0xf7, 0xdf, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0x7f, 0xb7, 
+	0xd7, 0xfe, 0xbb, 0xb9, 0xff, 0xf2, 0x4f, 0x3f, 
+	0xf5, 0xd4, 0x7f, 0x6f, 0x7d, 0x7d, 0xef, 0xcf, 
+	0x3f, 0xff, 0xfc, 0xef, 0xff, 0xd7, 0xdf, 0x6e, 
+	0xde, 0xbf, 0xfa, 0xea, 0xab, 0xaf, 0xfe, 0xfd, 
+	0xab, 0xbd, 0x7c, 0x7d, 0xf3, 0xc7, 0x33, 0xff, 
+	0xf4, 0xff, 0xee, 0xdf, 0x9b, 0xff, 0xbf, 0xfb, 
+	0xfe, 0xfb, 0xef, 0xff, 0xf7, 0xfe, 0x7f, 0xf7, 
+	0xfb, 0x7d, 0xbd, 0x5f, 0xfb, 0xff, 0xff, 0xff, 
+	0xff, 0xe6, 0xff, 0xff, 0xe3, 0x8f, 0x3f, 0xfe, 
+	0xfc, 0xe3, 0xcf, 0x3f, 0xf7, 0xf1, 0x67, 0x1e, 
+	0x7f, 0xfe, 0xf9, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 
+	0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xef, 0xff, 
+	0x7f, 0xff, 0xef, 0xbf, 0xdf, 0x7f, 0xfd, 0xff, 
+	0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xef, 
+	0xbf, 0xbf, 0xfd, 0xfb, 0xff, 0x7f, 0xff, 0xfb, 
+	0xe7, 0xf7, 0x5f, 0xff, 0xff, 0xf5, 0xff, 0x9b, 
+	0xff, 0xbf, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 
+	0xfa, 0xef, 0x77, 0xff, 0xfd, 0xf5, 0xdf, 0x57, 
+	0xff, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff, 0xf7, 
+	0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 
+	0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0x4f, 0xbf, 0xfd, 
+	0x7f, 0xdb, 0xef, 0xef, 0xff, 0xfd, 0xf7, 0xdf, 
+	0x7e, 0xf3, 0xe7, 0x97, 0xff, 0x6f, 0xfa, 0x7f, 
+	0xeb, 0xae, 0xbb, 0xe6, 0xfa, 0xe3, 0xaf, 0xbb, 
+	0xfe, 0x75, 0xc7, 0x1f, 0x3f, 0xf5, 0xd5, 0x57, 
+	0x5f, 0xfb, 0x9b, 0xbf, 0xff, 0xfd, 0xfb, 0xff, 
+	0xcb, 0x3e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xef, 
+	0xb6, 0xd9, 0x67, 0xff, 0xf7, 0xfe, 0xf9, 0xc6, 
+	0xff, 0xff, 0xfb, 0xff, 0xbf, 0xfd, 0xff, 0xff, 
+	0xeb, 0xef, 0xff, 0x7b, 0xf7, 0xbf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xd9, 0xbf, 0x6f, 0xff, 
+	0xff, 0x7f, 0xfb, 0xd2, 0xfd, 0xf7, 0xdf, 0xdb, 
+	0xbf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 
+	0x6f, 0xfe, 0xbf, 0xfe, 0x7a, 0x2b, 0xef, 0xff, 
+	0xfe, 0xfb, 0xff, 0xfe, 0xc7, 0xf9, 0xf7, 0xdd, 
+	0xff, 0x7f, 0xfd, 0xf1, 0xff, 0x99, 0xff, 0x9f, 
+	0x7f, 0xde, 0xf9, 0xdf, 0xe7, 0xfe, 0xbf, 0xff, 
+	0xff, 0xdf, 0xb7, 0xff, 0xdf, 0xff, 0x3d, 0x5f, 
+	0xff, 0x7f, 0xe6, 0xbf, 0xff, 0xbe, 0xff, 0xb5, 
+	0xfb, 0xff, 0xef, 0x7f, 0xfe, 0xfe, 0xcf, 0xdf, 
+	0x7f, 0xdf, 0xff, 0x7f, 0xfd, 0xff, 0xbf, 0xf9, 
+	0xff, 0xff, 0xdf, 0xfd, 0x3f, 0xf6, 0xff, 0xbf, 
+	0xaf, 0x7f, 0xfd, 0xf5, 0x7f, 0x5f, 0x5f, 0xff, 
+	0x75, 0xf7, 0xff, 0x67, 0xfe, 0xfe, 0xff, 0xf7, 
+	0x7f, 0xff, 0xf7, 0xef, 0xff, 0xfe, 0xf7, 0xef, 
+	0xd7, 0x7f, 0xff, 0x7f, 0xff, 0xef, 0xd7, 0xfb, 
+	0x9b, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0xce, 
+	0x3e, 0xff, 0xff, 0xe7, 0xbf, 0xff, 0xf7, 0xff, 
+	0xff, 0xff, 0x9f, 0xff, 0x7f, 0xe6, 0xff, 0xfe, 
+	0xfd, 0xdf, 0xff, 0xfb, 0xb3, 0xcf, 0xff, 0xff, 
+	0xf9, 0xef, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xff, 
+	0xff, 0xbf, 0xf9, 0xff, 0x7a, 0xeb, 0xff, 0xff, 
+	0xed, 0xfb, 0xaf, 0xbe, 0xff, 0xfd, 0xe7, 0xff, 
+	0x7f, 0xc7, 0xbf, 0xe7, 0xff, 0xff, 0x6f, 0xfc, 
+	0xff, 0xfe, 0xfa, 0xff, 0xf7, 0x7f, 0xf6, 0xf9, 
+	0xef, 0x7b, 0xff, 0xfd, 0x9f, 0xdd, 0x7e, 0xf3, 
+	0xfd, 0xf7, 0xff, 0x9b, 0xef, 0xdf, 0xff, 0xff, 
+	0xef, 0xff, 0xdf, 0x7f, 0x7f, 0xfc, 0xd7, 0x9f, 
+	0xfd, 0xdf, 0xf5, 0xdf, 0x5f, 0xff, 0xfd, 0xff, 
+	0x86, 0xff, 0xef, 0xff, 0xff, 0x5f, 0xea, 0x3b, 
+	0xbf, 0xbe, 0x9f, 0xff, 0xff, 0xdf, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0xff, 
+	0xff, 0xaf, 0xa7, 0xfc, 0xf6, 0xdb, 0xef, 0xff, 
+	0x3f, 0xff, 0xf7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 
+	0xff, 0x6d, 0xfe, 0xa7, 0xce, 0xfe, 0xff, 0xaf, 
+	0xf7, 0xde, 0x3e, 0x7b, 0xff, 0xaf, 0x8d, 0xf7, 
+	0xd6, 0x5b, 0x6f, 0xbd, 0xf5, 0xff, 0x9b, 0xf5, 
+	0xed, 0xb7, 0xff, 0x7a, 0xeb, 0xb5, 0xd7, 0xfe, 
+	0xfe, 0xff, 0x7b, 0xef, 0xbd, 0xfe, 0xfa, 0xeb, 
+	0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0xee, 0x32, 0xff, 
+	0xbf, 0xdf, 0x7b, 0xbf, 0xd5, 0xff, 0xbf, 0xdd, 
+	0xc2, 0x7f, 0xfd, 0xb5, 0xd3, 0x4c, 0xfb, 0xbb, 
+	0x99, 0xfe, 0xef, 0xd9, 0xa7, 0xfe, 0xfb, 0xde, 
+	0x7b, 0xf7, 0xfe, 0xef, 0xdf, 0x73, 0xff, 0xbf, 
+	0x6f, 0x3e, 0xfb, 0xbe, 0x6c, 0xec, 0xbf, 0xbe, 
+	0x7a, 0xfc, 0xaf, 0xfe, 0xfe, 0xde, 0xea, 0xbf, 
+	0xab, 0x75, 0xf7, 0xff, 0xf6, 0xdf, 0xff, 0xff, 
+	0xbf, 0x99, 0xfb, 0xef, 0xbf, 0x5d, 0xfa, 0xeb, 
+	0xbf, 0xfd, 0xf6, 0xfa, 0xff, 0xf8, 0xff, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xef, 0xe6, 0xfd, 
+	0xff, 0x76, 0xff, 0x6f, 0xff, 0xff, 0xee, 0xff, 
+	0xff, 0x76, 0xbb, 0xfd, 0x7f, 0xdf, 0x7d, 0xf7, 
+	0xfd, 0xf7, 0xbd, 0x79, 0xff, 0x7f, 0xbf, 0xfd, 
+	0xf7, 0xd7, 0x3f, 0xff, 0xff, 0xff, 0xbf, 0xcf, 
+	0xf3, 0xdf, 0x65, 0x9f, 0x7d, 0xf6, 0x79, 0x6f, 
+	0xec, 0xff, 0x6e, 0xe3, 0xee, 0xbb, 0xb9, 0xfe, 
+	0x7a, 0xed, 0x75, 0x9f, 0xf1, 0xb5, 0xd3, 0x4b, 
+	0x3f, 0xbd, 0xf4, 0xbf, 0x99, 0xf9, 0xff, 0xcf, 
+	0xff, 0xff, 0xbf, 0xef, 0xbf, 0xff, 0xff, 0xff, 
+	0xf7, 0x7f, 0xdf, 0xed, 0xb3, 0xcd, 0x3e, 0xfb, 
+	0xcf, 0xe6, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0xdb, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x7f, 
+	0x7b, 0xed, 0xb6, 0xd7, 0xfe, 0xbb, 0xa9, 0xff, 
+	0xfb, 0x4b, 0xf7, 0xbf, 0xf6, 0xdf, 0x7f, 0xaf, 
+	0xff, 0xaf, 0xcf, 0xff, 0xff, 0x7f, 0xfd, 0xf5, 
+	0xd7, 0xff, 0x6a, 0xd8, 0xff, 0xdc, 0xea, 0xdf, 
+	0x2f, 0xfe, 0xfb, 0xef, 0xdb, 0xfd, 0xfd, 0xb3, 
+	0xef, 0x57, 0xf9, 0xfd, 0xb7, 0xdf, 0xdf, 0x9b, 
+	0xff, 0xbf, 0xff, 0xfe, 0xff, 0xeb, 0xae, 0xfb, 
+	0x7f, 0xfa, 0xff, 0x7f, 0xaf, 0xbf, 0xf5, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xf3, 
+	0xcf, 0x3f, 0xfa, 0xe8, 0xf3, 0x8f, 0x3f, 0xff, 
+	0x91, 0xe5, 0x9f, 0x7f, 0xf4, 0xd1, 0x47, 0x9f, 
+	0xbf, 0xf9, 0xff, 0xfa, 0xef, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0xbf, 0xff, 0xff, 0xef, 0x97, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 
+	0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xff, 
+	0xff, 0xff, 0x7b, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 
+	0xf5, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xfa, 0xff, 
+	0xbf, 0xff, 0xbe, 0xfa, 0xfb, 0x7f, 0xff, 0x75, 
+	0xf9, 0xd5, 0x57, 0x5f, 0x7d, 0xf5, 0xff, 0x86, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 
+	0xff, 0xff, 0xff, 0xf7, 0x5d, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x8f, 0xf9, 0xff, 0xf2, 0xcb, 
+	0x2f, 0xff, 0xff, 0xf3, 0xbf, 0xef, 0xfe, 0xff, 
+	0xcf, 0xa7, 0xdf, 0x7e, 0xfb, 0xef, 0xa7, 0xff, 
+	0x6f, 0xfa, 0xff, 0xeb, 0xad, 0xbf, 0xfe, 0xd8, 
+	0xeb, 0x8f, 0xb7, 0xee, 0xf5, 0xd7, 0x5a, 0x7f, 
+	0xdd, 0xf5, 0xc7, 0x5d, 0xff, 0x9b, 0xff, 0xdf, 
+	0xdf, 0x7f, 0xdd, 0xbf, 0xff, 0xfe, 0xf3, 0xbf, 
+	0x9f, 0xdf, 0xdd, 0xfd, 0xf9, 0xf7, 0xdf, 0xfd, 
+	0xff, 0xbf, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xd3, 
+	0xff, 0xff, 0xff, 0xcf, 0xfb, 0xfd, 0xff, 0xff, 
+	0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf9, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xfd, 
+	0xfb, 0xff, 0xdd, 0xef, 0xef, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xfa, 
+	0xab, 0xa7, 0xef, 0x7e, 0xfb, 0xcd, 0x5b, 0xff, 
+	0xfd, 0xf1, 0x47, 0x5f, 0x7f, 0xbd, 0xf5, 0xff, 
+	0x9b, 0xff, 0x5f, 0x7f, 0xfe, 0xf5, 0xd7, 0xff, 
+	0xfe, 0xff, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xdf, 
+	0xdf, 0x7f, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xdf, 
+	0x9f, 0x7f, 0xfe, 0xab, 0xfb, 0x6e, 0xbf, 0xef, 
+	0xf6, 0xd7, 0x3f, 0x7f, 0xff, 0xe5, 0xd7, 0x7f, 
+	0xf7, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xed, 0x1f, 
+	0xbf, 0xfe, 0xff, 0x7f, 0x7f, 0xbb, 0x69, 0xfe, 
+	0xff, 0x7f, 0xff, 0xdd, 0xf7, 0x7f, 0x6f, 0xfe, 
+	0xff, 0xff, 0xff, 0x7b, 0xbf, 0xff, 0xfe, 0xff, 
+	0xff, 0xce, 0xbe, 0xfd, 0x7f, 0xff, 0xdf, 0x7e, 
+	0x3b, 0xed, 0xfb, 0x9b, 0xfd, 0xff, 0xff, 0xdf, 
+	0xef, 0xf3, 0x7b, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 
+	0xfd, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xff, 
+	0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xe7, 0xff, 
+	0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 
+	0xff, 0xb7, 0x7f, 0xf9, 0x7b, 0xef, 0xbd, 0xf7, 
+	0xdf, 0x75, 0xd7, 0xff, 0xe7, 0xfb, 0xef, 0xbc, 
+	0xff, 0x6f, 0xfc, 0xff, 0xff, 0xef, 0x37, 0xf7, 
+	0xde, 0xfa, 0xf8, 0xe2, 0x7f, 0xff, 0xed, 0xb7, 
+	0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x99, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 
+	0xff, 0xef, 0x7f, 0xff, 0xfe, 0xff, 0xfe, 0xbf, 
+	0xff, 0xbe, 0xff, 0xa6, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xcf, 0xff, 0xe9, 0xe4, 0xf2, 0xbf, 0x7a, 
+	0xf3, 0x7d, 0xff, 0xf5, 0xff, 0x5f, 0xff, 0x8f, 
+	0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5e, 
+	0xf9, 0xe5, 0xf3, 0x9f, 0xff, 0x7f, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xdf, 0xff, 0x6d, 0xfe, 0xff, 0xff, 
+	0xfe, 0xff, 0xbf, 0xff, 0xd7, 0x6b, 0xbb, 0xff, 
+	0xaf, 0xf7, 0xff, 0xdc, 0x5f, 0xaf, 0xfd, 0xfd, 
+	0xff, 0x9b, 0xf5, 0xff, 0xb7, 0xff, 0xff, 0xff, 
+	0xef, 0xd7, 0x5e, 0xfb, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xf4, 0x79, 0xef, 0xfd, 0xd7, 0xa6, 0x7e, 
+	0xfd, 0xbb, 0xff, 0xff, 0xdf, 0xed, 0xe5, 0xfd, 
+	0x66, 0xbf, 0xfa, 0xea, 0x5b, 0xab, 0xb4, 0xf2, 
+	0xc3, 0xb3, 0xbb, 0x99, 0x5f, 0xff, 0xaf, 0xbf, 
+	0xda, 0x1b, 0xaa, 0x79, 0xef, 0xfd, 0xef, 0x3e, 
+	0xfb, 0xca, 0xac, 0xaf, 0xf4, 0xda, 0xea, 0x6c, 
+	0xe6, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf6, 0xfe, 
+	0xfb, 0xfb, 0xbf, 0x8f, 0xbe, 0xfa, 0xdf, 0xfe, 
+	0x7f, 0xfd, 0xfd, 0xbf, 0x99, 0xfb, 0xff, 0xbf, 
+	0xfe, 0xfb, 0x7f, 0xa9, 0xff, 0xf6, 0xdb, 0xff, 
+	0xf8, 0xab, 0xaf, 0xdf, 0xff, 0xdf, 0xff, 0xfd, 
+	0xef, 0xc6, 0xbd, 0xff, 0xff, 0xfb, 0x6f, 0x37, 
+	0xfe, 0xfe, 0xbb, 0xff, 0xf6, 0xdf, 0x7f, 0x97, 
+	0x9f, 0x7f, 0xfe, 0xf9, 0xff, 0xbd, 0x79, 0x1f, 
+	0xff, 0xff, 0xf5, 0xff, 0xf9, 0x7f, 0xfd, 0xfc, 
+	0xff, 0x3f, 0xff, 0xfe, 0xfb, 0xee, 0xbf, 0xdf, 
+	0xfe, 0x7b, 0x6f, 0xec, 0xff, 0xfe, 0xfb, 0xee, 
+	0x3f, 0xfe, 0xbe, 0xfa, 0xeb, 0x75, 0xbf, 0x3d, 
+	0x76, 0x9f, 0x69, 0xb7, 0xdd, 0x76, 0xbf, 0x99, 
+	0xf9, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xff, 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xfe, 0xfb, 
+	0xe7, 0xb7, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xfb, 
+	0xff, 0xff, 0xff, 0xff, 0x6f, 0xbf, 0xff, 0xf7, 
+	0xdd, 0x7f, 0xdf, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 
+	0xbb, 0xb9, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xf1, 
+	0xfb, 0x7f, 0xff, 0xfd, 0xa7, 0x9f, 0x7f, 0xde, 
+	0xed, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xde, 0xff, 
+	0xff, 0xf2, 0xdd, 0x7d, 0xde, 0xfc, 0xef, 0xbf, 
+	0xfd, 0xfd, 0xf7, 0xdf, 0x5f, 0xff, 0xfd, 0x95, 
+	0xdf, 0xcf, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfb, 
+	0xbd, 0xa7, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xed, 
+	0xff, 0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xfe, 0xe6, 
+	0xff, 0xff, 0xf3, 0xcf, 0x3e, 0xff, 0xe8, 0xa3, 
+	0xcf, 0x3f, 0xef, 0xf9, 0xe7, 0x96, 0x39, 0xfc, 
+	0xf9, 0x43, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xef, 
+	0xff, 0xbf, 0xfd, 0xfb, 0xeb, 0xaf, 0xff, 0xfb, 
+	0xef, 0x3f, 0x7f, 0xbf, 0xfd, 0xfd, 0xd3, 0xdf, 
+	0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x3f, 0xff, 
+	0xfe, 0xfa, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf5, 
+	0xdb, 0x7f, 0xbf, 0xf5, 0xff, 0x9b, 0xff, 0xff, 
+	0xff, 0xfe, 0xfe, 0xbf, 0xff, 0xff, 0xfb, 0xea, 
+	0x3f, 0xff, 0xfc, 0xd7, 0xdd, 0x7f, 0xff, 0xfd, 
+	0xf7, 0xff, 0xe6, 0xff, 0xff, 0xef, 0xbf, 0xff, 
+	0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 
+	0xff, 0xbd, 0xff, 0xf7, 0xfb, 0xff, 0x8f, 0xd9, 
+	0xff, 0xef, 0xcb, 0xeb, 0xaf, 0xfc, 0xe6, 0x4f, 
+	0xff, 0xff, 0xfb, 0xed, 0xb7, 0x9f, 0xfe, 0xf3, 
+	0xe5, 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xeb, 0xaf, 
+	0xb9, 0xde, 0x7a, 0xeb, 0xaf, 0xbe, 0xee, 0xd5, 
+	0xc7, 0x5d, 0x75, 0xfd, 0x75, 0xd7, 0x5f, 0xff, 
+	0x9b, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xe7, 
+	0xef, 0xff, 0xef, 0x97, 0x1f, 0x7e, 0xdb, 0xff, 
+	0xf7, 0xff, 0x7f, 0xff, 0xff, 0xc6, 0xfb, 0xff, 
+	0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x7f, 
+	0x73, 0xd7, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xd7, 0xdd, 0x7f, 0xef, 0xdf, 0xff, 0xfa, 
+	0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x6f, 0xfc, 
+	0xff, 0xfb, 0xfa, 0xcb, 0xef, 0x37, 0xff, 0xf4, 
+	0xcf, 0x7f, 0xfe, 0xf9, 0xf9, 0xc7, 0x7f, 0x7f, 
+	0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0x7f, 0xfd, 
+	0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 
+	0xf7, 0x7f, 0x7b, 0xf7, 0x3f, 0x7f, 0xff, 0xff, 
+	0x66, 0xef, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 
+	0xff, 0xbf, 0xbf, 0xfe, 0xf7, 0xff, 0xff, 0xfb, 
+	0xff, 0xff, 0xfb, 0xff, 0xbf, 0xd9, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 
+	0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 
+	0xff, 0x6f, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xf7, 
+	0xff, 0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xdf, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b, 0xff, 
+	0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xfd, 
+	0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xe7, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xfe, 
+	0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 
+	0xf9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xbf, 
+	0x7f, 0xff, 0xf3, 0x93, 0x7f, 0xff, 0xff, 0x7f, 
+	0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xdf, 
+	0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf7, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 
+	0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xfd, 
+	0xf8, 0xe7, 0x9f, 0x7f, 0xfa, 0xf9, 0xe7, 0x1f, 
+	0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x3f, 0xff, 0xfb, 0x6f, 
+	0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x6f, 
+	0xfe, 0xff, 0xfe, 0xfa, 0xe3, 0xb7, 0xfd, 0xee, 
+	0x7b, 0xed, 0x7e, 0xff, 0xbd, 0xf6, 0xdf, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 
+	0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
+	0xff, 0xa6, 0xff, 0xef, 0xaf, 0x7f, 0xfe, 0xfb, 
+	0xaf, 0xbf, 0xff, 0xfc, 0xf7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 
+	0xfc, 0xf7, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 
+	0x77, 0xfe, 0xf9, 0xe7, 0x9f, 0x3f, 0xfe, 0xf9, 
+	0xe7, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0x9b, 
+	0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 
+	0xfa, 0xe9, 0x4f, 0x3f, 0xfd, 0xf4, 0xd3, 0x4f, 
+	0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf, 
+	0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xdf, 0xbb, 
+	0xef, 0xbf, 0xfb, 0xfe, 0xfb, 0xef, 0xbf, 0xfb, 
+	0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 
+	0xfb, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0x7f, 0xf7, 
+	0xbb, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xdb, 0x1f, 0xfb, 0xff, 0xff, 0xef, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 
+	0xff, 0xdf, 0x7f, 0xff, 0xf9, 0xf7, 0xd7, 0x7f, 
+	0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 
+	0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf, 
+	0x7e, 0xf3, 0xad, 0x37, 0xdf, 0x7e, 0xfb, 0xdb, 
+	0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xf9, 
+	0x6f, 0xfe, 0xff, 0xf5, 0xdf, 0x7f, 0xfb, 0xfd, 
+	0xf5, 0xdf, 0x7f, 0xef, 0xdb, 0xef, 0xbb, 0xff, 
+	0xfe, 0xfb, 0xef, 0xaf, 0xff, 0x9b, 0xff, 0x7f, 
+	0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 
+	0xbd, 0xff, 0x7e, 0xfa, 0xee, 0xbf, 0xff, 0xfe, 
+	0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xbb, 
+	0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 
+	0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfc, 0xbf, 0xf9, 
+	0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0x6b, 0x2f, 0xbf, 
+	0xff, 0xfe, 0x77, 0x5f, 0x7f, 0xff, 0xf5, 0xf7, 
+	0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xf9, 0xef, 
+	0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd, 
+	0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xcf, 0xff, 
+	0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 
+	0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9f, 
+	0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f, 
+	0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 
+	0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xbf, 0xf9, 0xff, 0x1b, 0x7f, 0xfd, 0xf1, 
+	0xd7, 0x1b, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 
+	0xfa, 0xeb, 0xaf, 0xbf, 0xde, 0xf8, 0x6f, 0xee, 
+	0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xee, 0xfb, 
+	0x2f, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0x7f, 0xff, 
+	0xfd, 0x77, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 
+	0xff, 0xff, 0xff, 0xff, 0xdf, 0xef, 0x7f, 0xff, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+	0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 
+	0xef, 0xbb, 0xe7, 0x6d, 0xf7, 0xdd, 0x77, 0xff, 
+	0x7f, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xfd, 
+	0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xf6, 0xdb, 
+	0xdb, 0x7a, 0xfb, 0xad, 0xbf, 0xdd, 0xfa, 0xeb, 
+	0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define SPPAFSK_ROM_DIVROM0              0
+#define SPPAFSK_ROM_DIVROM1              16
+#define SPPAFSK_ROM_DIVROM2              32
+#define SPPAFSK_ROM_SWROMIE              48
+#define SPPAFSK_ROM_SWROMOE              64
+#define SPPAFSK_ROM_CLKSELROM            80
+#define SPPAFSK_ROM_PTTMUTEROM           96
+
+
+/* rom locations */
+static const unsigned long sppafsk_roms[112] = {
+	 49076,  48908,  49408,  49240,  49740,  49572,  50072,  49904,
+	 48910,  49074,  49242,  49406,  49574,  49738,  49906,  50070,
+	 42914,  42746,  43578,  43410,  43246,  43078,  43910,  43742,
+	 42748,  42912,  43412,  43576,  43080,  43244,  43744,  43908,
+	 39924,  40092,  39592,  39760,  39260,  39428,  38928,  39096,
+	 40090,  39926,  39758,  39594,  39426,  39262,  39094,  38930,
+	 55062,  54894,  55726,  55558,  55394,  55226,  56058,  55890,
+	 54896,  55060,  55560,  55724,  55228,  55392,  55892,  56056,
+	 42944,  42776,  43608,  43440,  43276,  43108,  43940,  43772,
+	 42778,  42942,  43442,  43606,  43110,  43274,  43774,  43938,
+	 34039,  33375,  34205,  33541,  34207,  33543,  34041,  33377,
+	 33707,  33043,  33873,  33209,  33875,  33211,  33709,  33045,
+	 67065,  66897,  67397,  67229,  67729,  67561,  68061,  67893,
+	 66899,  67063,  67231,  67395,  67563,  67727,  67895,  68059
+};
+
diff --git a/main/sysdeps.h b/main/sysdeps.h
new file mode 100644
index 0000000..9729a24
--- /dev/null
+++ b/main/sysdeps.h
@@ -0,0 +1,244 @@
+/*****************************************************************************/
+
+/*
+ *      sysdeps.h  --  System dependencies.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _SYSDEPS_H
+#define _SYSDEPS_H
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#ifdef GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include <stdarg.h>
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Bittypes
+ */
+
+#ifndef HAVE_BITTYPES
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+typedef int int8_t __attribute__((__mode__(__QI__)));
+typedef unsigned int u_int8_t __attribute__((__mode__(__QI__)));
+typedef int int16_t __attribute__((__mode__(__HI__)));
+typedef unsigned int u_int16_t __attribute__((__mode__(__HI__)));
+typedef int int32_t __attribute__((__mode__(__SI__)));
+typedef unsigned int u_int32_t __attribute__((__mode__(__SI__)));
+typedef int int64_t __attribute__((__mode__(__DI__)));
+typedef unsigned int u_int64_t __attribute__((__mode__(__DI__)));
+#else
+typedef char /* deduced */ int8_t __attribute__((__mode__(__QI__)));
+typedef unsigned char /* deduced */ u_int8_t __attribute__((__mode__(__QI__)));
+typedef short /* deduced */ int16_t __attribute__((__mode__(__HI__)));
+typedef unsigned short /* deduced */ u_int16_t __attribute__((__mode__(__HI__)));
+typedef long /* deduced */ int32_t __attribute__((__mode__(__SI__)));
+typedef unsigned long /* deduced */ u_int32_t __attribute__((__mode__(__SI__)));
+typedef long long /* deduced */ int64_t __attribute__((__mode__(__DI__)));
+typedef unsigned long long /* deduced */ u_int64_t __attribute__((__mode__(__DI__)));
+#endif
+
+#endif /* !HAVE_BITTYPES */
+
+/* ---------------------------------------------------------------------- */
+/*
+ * IO routines
+ */
+
+#ifndef HAVE_IOFUNCS
+
+extern inline unsigned char inb(unsigned short port)
+{
+        unsigned char ret;
+        __asm__ __volatile__("inb %w1,%b0" : "=a" (ret) : "d" (port));
+        return ret;
+}
+
+extern inline void outb(unsigned char val, unsigned short port)
+{
+        __asm__ __volatile__("outb %b0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline unsigned short inw(unsigned short port)
+{
+        unsigned short ret;
+        __asm__ __volatile__("inw %w1,%w0" : "=a" (ret) : "d" (port));
+        return ret;
+}
+
+extern inline void outw(unsigned short val, unsigned short port)
+{
+        __asm__ __volatile__("outw %w0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline unsigned int inl(unsigned short port)
+{
+        unsigned int ret;
+        __asm__ __volatile__("inl %w1,%0" : "=a" (ret) : "d" (port));
+        return ret;
+}
+
+extern inline void outl(unsigned int val, unsigned short port)
+{
+        __asm__ __volatile__("outl %0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline void insb(unsigned short port, unsigned char *addr, unsigned long count)
+{
+        __asm__ __volatile__("cld ; rep ; insb" : "=D" (addr), "=c" (count) : 
+                             "d" (port),"0" (addr),"1" (count));
+}
+
+extern inline void outsb(unsigned short port, const unsigned char *addr, unsigned long count)
+{
+        __asm__ __volatile__("cld ; rep ; outsb" : "=S" (addr), "=c" (count) : 
+                             "d" (port),"0" (addr),"1" (count));
+}
+
+#endif /* !HAVE_IOFUNCS */
+
+/* ---------------------------------------------------------------------- */
+/*
+ * syslog routines
+ */
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#else
+
+#define LOG_EMERG       0       /* system is unusable */
+#define LOG_ALERT       1       /* action must be taken immediately */
+#define LOG_CRIT        2       /* critical conditions */
+#define LOG_ERR         3       /* error conditions */
+#define LOG_WARNING     4       /* warning conditions */
+#define LOG_NOTICE      5       /* normal but significant condition */
+#define LOG_INFO        6       /* informational */
+#define LOG_DEBUG       7       /* debug-level messages */
+
+/* facility codes */
+#define LOG_KERN        (0<<3)  /* kernel messages */
+#define LOG_USER        (1<<3)  /* random user-level messages */
+#define LOG_MAIL        (2<<3)  /* mail system */
+#define LOG_DAEMON      (3<<3)  /* system daemons */
+#define LOG_AUTH        (4<<3)  /* security/authorization messages */
+#define LOG_SYSLOG      (5<<3)  /* messages generated internally by syslogd */
+#define LOG_LPR         (6<<3)  /* line printer subsystem */
+#define LOG_NEWS        (7<<3)  /* network news subsystem */
+#define LOG_UUCP        (8<<3)  /* UUCP subsystem */
+#define LOG_CRON        (9<<3)  /* clock daemon */
+#define LOG_AUTHPRIV    (10<<3) /* security/authorization messages (private) */
+#define LOG_FTP         (11<<3) /* ftp daemon */
+
+extern inline void closelog(void) {}
+extern inline void openlog(__const char *__ident, int __option, int __facility) {}
+extern inline void vsyslog(int __pri, __const char *__fmt, va_list __ap) {}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef __MINGW32__
+#include <windows.h>
+extern inline void usleep(unsigned long x)
+{
+	Sleep(x / 1000);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_GETTIMEOFDAY
+
+#include <sys/time.h>
+#include <unistd.h>
+
+extern inline int gettime(struct timeval *tv)
+{
+	return gettimeofday(tv, NULL);
+}
+
+#elif HAVE_GETSYSTEMTIME
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#if 0
+struct timeval {
+        long    tv_sec;
+        long    tv_usec;
+};
+#endif
+
+extern inline int gettime(struct timeval *tv)
+{
+	SYSTEMTIME tm;
+
+	GetSystemTime(&tm);
+	tv->tv_usec = 1000UL * tm.wMilliseconds;
+	tv->tv_sec = tm.wSecond + 60 * tm.wMinute + 3600 * tm.wHour + 86400 * tm.wDay;
+	return 0;
+}
+
+#else
+
+#error "Don't know how to get a high resolution time"
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_RANDOM
+
+extern inline long int random(void)
+{
+	return rand();
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+#endif /* _SYSDEPS_H */
diff --git a/main/syslog.c b/main/syslog.c
new file mode 100644
index 0000000..d1aa702
--- /dev/null
+++ b/main/syslog.c
@@ -0,0 +1,70 @@
+/*****************************************************************************/
+
+/*
+ *      syslog.c  -- Syslog "abstraction" routines.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _COMPILE_LIBFPGA
+#include "libfpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(GO32)
+
+int syslogprintf(unsigned vl, const char *format, va_list ap)
+{
+	return 0;
+}
+
+int syslogopen(const char *ident)
+{
+	return -1;
+}
+
+#else
+
+#include <syslog.h>
+
+int syslogprintf(unsigned vl, const char *format, va_list ap)
+{
+        static const int logprio[] = { LOG_ERR, LOG_INFO };
+	vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+	return 0;
+}
+
+int syslogopen(const char *ident)
+{
+	openlog(ident, LOG_PID, LOG_USER);
+	return 0;
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/util.h b/main/util.h
new file mode 100644
index 0000000..7083fc2
--- /dev/null
+++ b/main/util.h
@@ -0,0 +1,70 @@
+/*****************************************************************************/
+
+/*
+ *      util.h  --  Some utility functions.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned int hweight32(unsigned int w)
+{
+        unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
+        res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
+        res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
+        res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
+        return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
+}
+
+extern inline unsigned int hweight16(unsigned int w)
+{
+        unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555);
+        res = (res & 0x3333) + ((res >> 2) & 0x3333);
+        res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F);
+        return (res & 0x00FF) + ((res >> 8) & 0x00FF);
+}
+
+extern inline unsigned int hweight8(unsigned int w)
+{
+        unsigned int res = (w & 0x55) + ((w >> 1) & 0x55);
+        res = (res & 0x33) + ((res >> 2) & 0x33);
+        return (res & 0x0F) + ((res >> 4) & 0x0F);
+}
+
+extern inline unsigned char rev8(unsigned char x)
+{
+	static const unsigned char rev4[16] = {
+		0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7,15
+	};
+
+	return (rev4[x & 15] << 4) | rev4[(x >> 4) & 15];
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* _UTIL_H */
+
diff --git a/main/vsnprintf.c b/main/vsnprintf.c
new file mode 100644
index 0000000..0b9ab56
--- /dev/null
+++ b/main/vsnprintf.c
@@ -0,0 +1,194 @@
+/*
+ * This file is derived from GLIB by Thomas Sailer, <sailer at ife.ee.ethz.ch>
+ *
+ *
+ * GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static unsigned int printf_string_upper_bound (const char *format, va_list args)
+{
+	unsigned int len = 1;
+  
+	while (*format) {
+		int long_int = 0;
+		int extra_long = 0;
+		char c;
+      
+		c = *format++;
+      
+		if (c == '%') {
+			int done = 0;
+	  
+			while (*format && !done) {
+				switch (*format++) {
+					char *string_arg;
+		  
+				case '*':
+					len += va_arg (args, int);
+					break;
+				case '1':
+				case '2':
+				case '3':
+				case '4':
+				case '5':
+				case '6':
+				case '7':
+				case '8':
+				case '9':
+					/* add specified format length, since it might exceed the
+					 * size we assume it to have.
+					 */
+					format -= 1;
+					len += strtol (format, (char**) &format, 10);
+					break;
+				case 'h':
+					/* ignore short int flag, since all args have at least the
+					 * same size as an int
+					 */
+					break;
+				case 'l':
+					if (long_int)
+						extra_long = 1; /* linux specific */
+					else
+						long_int = 1;
+					break;
+				case 'q':
+				case 'L':
+					long_int = 1;
+					extra_long = 1;
+					break;
+				case 's':
+					string_arg = va_arg (args, char *);
+					if (string_arg)
+						len += strlen (string_arg);
+					else {
+						/* add enough padding to hold "(null)" identifier */
+						len += 16;
+					}
+					done = 1;
+					break;
+				case 'd':
+				case 'i':
+				case 'o':
+				case 'u':
+				case 'x':
+				case 'X':
+					if (long_int)
+						(void) va_arg (args, long);
+					else
+						(void) va_arg (args, int);
+					len += extra_long ? 64 : 32;
+					done = 1;
+					break;
+				case 'D':
+				case 'O':
+				case 'U':
+					(void) va_arg (args, long);
+					len += 32;
+					done = 1;
+					break;
+				case 'e':
+				case 'E':
+				case 'f':
+				case 'g':
+					(void) va_arg (args, double);
+					len += extra_long ? 64 : 32;
+					done = 1;
+					break;
+				case 'c':
+					(void) va_arg (args, int);
+					len += 1;
+					done = 1;
+					break;
+				case 'p':
+				case 'n':
+					(void) va_arg (args, void*);
+					len += 32;
+					done = 1;
+					break;
+				case '%':
+					len += 1;
+					done = 1;
+					break;
+				default:
+					/* ignore unknow/invalid flags */
+					break;
+				}
+			}
+		}
+		else
+			len += 1;
+	}
+	return len;
+}
+
+/* WARNING: This does only work for i386 (plus a few others, but not eg. alpha) !!!! */
+#define VA_COPY(x,y) (x) = (y)
+
+static char *strdup_vprintf (const char *format, va_list args1)
+{
+	char *buffer;
+	va_list args2;
+
+	VA_COPY (args2, args1);
+	buffer = malloc(printf_string_upper_bound (format, args1));
+	if (buffer)
+		vsprintf (buffer, format, args2);
+	va_end (args2);
+	return buffer;
+}
+
+int snprintf (char *str, size_t n, char const *fmt, ...)
+{
+	char *printed;
+	va_list args;
+	int len;
+
+	va_start(args, fmt);
+	printed = strdup_vprintf (fmt, args);
+	va_end (args);
+	if (!printed)
+		return -1;
+	len = strlen(printed);
+	strncpy(str, printed, n);
+	str[n-1] = '\0';
+	free(printed);
+	return len >= n ? -1 : len;
+}
+
+int vsnprintf (char *str, size_t n, char const *fmt, va_list args)
+{
+	char *printed;
+	int len;
+  
+	printed = strdup_vprintf (fmt, args);
+	if (!printed)
+		return -1;
+	len = strlen(printed);
+	strncpy(str, printed, n);
+	str[n-1] = '\0';
+	free(printed);
+	return len >= n ? -1 : len;
+}
diff --git a/missing b/missing
new file mode 100755
index 0000000..cbe2b0e
--- /dev/null
+++ b/missing
@@ -0,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# 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.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+    if test -z "$files"; then
+      files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+      test -z "$files" || files="$files.in"
+    else
+      files=`echo "$files" | sed -e 's/:/ /g'`
+    fi
+    test -z "$files" && files="config.h.in"
+    touch $files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print \
+      | sed 's/^\(.*\).am$/touch \1.in/' \
+      | sh
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..7021fe2
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 1998/07/03 21:25:39 martijn Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/ntdrv/Makefile.am b/ntdrv/Makefile.am
new file mode 100644
index 0000000..3220d89
--- /dev/null
+++ b/ntdrv/Makefile.am
@@ -0,0 +1,9 @@
+EXTRA_DIST = eppflex.c eppflex.rc eppflex.h eppflex.inf eppflex.sys testload.c sources makefile
+
+if WIN32
+
+noinst_PROGRAMS = testload
+
+testload_SOURCES = testload.c
+
+endif
diff --git a/ntdrv/Makefile.in b/ntdrv/Makefile.in
new file mode 100644
index 0000000..ec7b80a
--- /dev/null
+++ b/ntdrv/Makefile.in
@@ -0,0 +1,313 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = eppflex.c eppflex.rc eppflex.h eppflex.inf eppflex.sys testload.c sources makefile
+
+ at WIN32_TRUE@noinst_PROGRAMS = @WIN32_TRUE at testload
+
+ at WIN32_TRUE@testload_SOURCES = @WIN32_TRUE at testload.c
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+ at WIN32_TRUE@noinst_PROGRAMS =  testload$(EXEEXT)
+PROGRAMS =  $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+ at WIN32_TRUE@testload_OBJECTS =  testload.$(OBJEXT)
+testload_LDADD = $(LDADD)
+testload_DEPENDENCIES = 
+testload_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(testload_SOURCES)
+OBJECTS = $(testload_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps ntdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+testload$(EXEEXT): $(testload_OBJECTS) $(testload_DEPENDENCIES)
+	@rm -f testload$(EXEEXT)
+	$(LINK) $(testload_LDFLAGS) $(testload_OBJECTS) $(testload_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = ntdrv
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstPROGRAMS mostlyclean-compile \
+		mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstPROGRAMS clean-compile clean-tags clean-generic \
+		mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstPROGRAMS distclean-compile distclean-tags \
+		distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstPROGRAMS \
+		maintainer-clean-compile maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/ntdrv/eppflex.c b/ntdrv/eppflex.c
new file mode 100644
index 0000000..c6a3669
--- /dev/null
+++ b/ntdrv/eppflex.c
@@ -0,0 +1,428 @@
+
+#include "ntddk.h"
+#include "string.h"
+#include "ddk/parallel.h"
+
+#include "eppflex.h"
+
+
+#define printk DbgPrint
+#define kmalloc(size) ExAllocatePool(NonPagedPool,size)
+#define kfree ExFreePool
+
+#if 0
+#define VLOG(x)  do { x; } while (0)
+#else
+#define VLOG(x)  do {  } while (0)
+#endif
+
+#if 1
+#define ELOG(x)  do { x; } while (0)
+#else
+#define ELOG(x)  do {  } while (0)
+#endif
+
+struct eppflex {
+        unsigned int dummy;
+};
+
+struct eppflexfile {
+        PDEVICE_OBJECT pdo;
+        PFILE_OBJECT pdfo;
+        PARALLEL_PORT_INFORMATION info;
+        PARALLEL_PNP_INFORMATION pnpinfo;
+};
+
+
+static NTSTATUS parcompletion(PDEVICE_OBJECT devobj, PIRP irp, PKEVENT event)
+{
+        KeSetEvent(event, 0, FALSE);
+        return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+static NTSTATUS callparport(struct eppflexfile *fs, unsigned long ioctlcode,
+			    void *buffer, unsigned int inlen, unsigned int outlen,
+			    LARGE_INTEGER *timeout)
+{
+        NTSTATUS status;
+        PIRP irp;
+        PIO_STACK_LOCATION irpsp;
+        KEVENT event;
+
+        irp = IoAllocateIrp((CCHAR)(fs->pdo->StackSize+1), FALSE);
+        if (!irp)
+                return STATUS_INSUFFICIENT_RESOURCES;
+        irpsp = IoGetNextIrpStackLocation(irp);
+        irpsp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+        irpsp->Parameters.DeviceIoControl.OutputBufferLength = outlen;
+        irpsp->Parameters.DeviceIoControl.InputBufferLength = inlen;
+        irpsp->Parameters.DeviceIoControl.IoControlCode = ioctlcode;
+        irp->AssociatedIrp.SystemBuffer = buffer;
+  
+        KeInitializeEvent(&event, NotificationEvent, FALSE);
+        IoSetCompletionRoutine(irp, parcompletion, &event, TRUE, TRUE, TRUE);
+        status = IoCallDriver(fs->pdo, irp);
+        if (!NT_SUCCESS(status)) {
+                IoFreeIrp(irp);
+                return status;
+        }
+  
+        status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, timeout);
+        if (status == STATUS_TIMEOUT) {
+                IoCancelIrp(irp);
+                status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+        }
+        status = irp->IoStatus.Status;
+        IoFreeIrp(irp);
+        return status;
+}
+
+static NTSTATUS read_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+        NTSTATUS status = STATUS_SUCCESS;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+        struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+  
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        fs = fileobj->FsContext;
+
+        irp->IoStatus.Information = 0;
+        if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct eppflex_rwdata))
+                status = STATUS_INVALID_PARAMETER;
+        else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+                 (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+                status = STATUS_ACCESS_VIOLATION;
+        else {
+                rw->data = READ_PORT_UCHAR(port);
+                irp->IoStatus.Information = sizeof(struct eppflex_rwdata);
+        }
+        irp->IoStatus.Status = status;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static NTSTATUS write_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+        NTSTATUS status = STATUS_SUCCESS;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+        struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+  
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        fs = fileobj->FsContext;
+
+        irp->IoStatus.Information = 0;
+        if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct eppflex_rwdata))
+                status = STATUS_INVALID_PARAMETER;
+        else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+                 (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+                status = STATUS_ACCESS_VIOLATION;
+        else {
+                WRITE_PORT_UCHAR(port, rw->data);
+        }
+        irp->IoStatus.Status = status;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static NTSTATUS frob_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+        NTSTATUS status = STATUS_SUCCESS;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+        struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+        UCHAR data;
+
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        fs = fileobj->FsContext;
+
+        irp->IoStatus.Information = 0;
+        if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct eppflex_rwdata) ||
+            irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct eppflex_rwdata))
+                status = STATUS_INVALID_PARAMETER;
+        else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+                 (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+                status = STATUS_ACCESS_VIOLATION;
+        else {
+                data = READ_PORT_UCHAR(port);
+                data = (data & ~rw->mask) ^ rw->data;
+                WRITE_PORT_UCHAR(port, data);
+                rw->data = data;
+                irp->IoStatus.Information = sizeof(struct eppflex_rwdata);
+        }
+        irp->IoStatus.Status = status;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static NTSTATUS ioctl(PDEVICE_OBJECT devobj, PIRP irp)
+{
+        NTSTATUS status = STATUS_NOT_IMPLEMENTED;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        fs = fileobj->FsContext;
+
+        VLOG(printk("eppflex: ioctl\n"));
+
+        if (!fs) {
+                status = irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+                IoCompleteRequest(irp, IO_NO_INCREMENT);
+                return status;
+        }
+        switch (irpsp->Parameters.DeviceIoControl.IoControlCode) {
+        case IOCTL_EPPFLEX_READ_DATA:
+                return read_port(devobj, irp, fs->info.Controller);
+
+        case IOCTL_EPPFLEX_WRITE_DATA:
+                return write_port(devobj, irp, fs->info.Controller);
+
+        case IOCTL_EPPFLEX_READ_STATUS:
+                return read_port(devobj, irp, fs->info.Controller + 1);
+
+        case IOCTL_EPPFLEX_WRITE_STATUS:
+                return write_port(devobj, irp, fs->info.Controller + 1);
+
+        case IOCTL_EPPFLEX_READ_CONTROL:
+                return read_port(devobj, irp, fs->info.Controller + 2);
+
+        case IOCTL_EPPFLEX_WRITE_CONTROL:
+                return write_port(devobj, irp, fs->info.Controller + 2);
+
+        case IOCTL_EPPFLEX_FROB_CONTROL:
+                return frob_port(devobj, irp, fs->info.Controller + 2);
+
+        case IOCTL_EPPFLEX_READ_ECONTROL:
+                return read_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+        case IOCTL_EPPFLEX_WRITE_ECONTROL:
+                return write_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+        case IOCTL_EPPFLEX_FROB_ECONTROL:
+                return frob_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+        case IOCTL_EPPFLEX_READ_CONFIGA:
+                return read_port(devobj, irp, fs->pnpinfo.EcpController);
+
+        case IOCTL_EPPFLEX_WRITE_CONFIGA:
+                return write_port(devobj, irp, fs->pnpinfo.EcpController);
+
+        case IOCTL_EPPFLEX_READ_CONFIGB:
+                return read_port(devobj, irp, fs->pnpinfo.EcpController + 1);
+
+        case IOCTL_EPPFLEX_WRITE_CONFIGB:
+                return write_port(devobj, irp, fs->pnpinfo.EcpController + 1);
+
+        case IOCTL_EPPFLEX_READ_EPPADDR:
+                return read_port(devobj, irp, fs->info.Controller + 3);
+
+        case IOCTL_EPPFLEX_WRITE_EPPADDR:
+                return write_port(devobj, irp, fs->info.Controller + 3);
+
+        case IOCTL_EPPFLEX_READ_EPPDATA:
+                return read_port(devobj, irp, fs->info.Controller + 4);
+
+        case IOCTL_EPPFLEX_WRITE_EPPDATA:
+                return write_port(devobj, irp, fs->info.Controller + 4);
+        }
+        irp->IoStatus.Status = status;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static NTSTATUS create(PDEVICE_OBJECT devobj, PIRP irp)
+{
+        NTSTATUS status;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        WCHAR ppname[22] = L"\\Device\\ParallelPort0";
+        UNICODE_STRING uppname;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+        ULONG devnr = 0;
+        LARGE_INTEGER timeout;
+        unsigned int i;
+        
+        VLOG(printk("eppflex: create\n"));
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        status = STATUS_NO_MEMORY;
+        fileobj->FsContext = fs = kmalloc(sizeof(struct eppflexfile));
+        if (!fs)
+                goto out;
+
+        VLOG(printk("eppflex: filename length: %u\n", fileobj->FileName.Length));
+
+        for (i = 0; i < fileobj->FileName.Length; i++) {
+                VLOG(printk("eppflex: fn[%2u]: %04x\n", i, fileobj->FileName.Buffer[i]));
+                if (fileobj->FileName.Buffer[i] == (WCHAR)'\\')
+                        continue;
+                if (fileobj->FileName.Buffer[i] < (WCHAR)'0' ||
+                    fileobj->FileName.Buffer[i] > (WCHAR)'9')
+                        break;
+                devnr = 10 * devnr + fileobj->FileName.Buffer[i] - (WCHAR)'0';
+        }
+        
+        VLOG(printk("eppflex: Device number %lu\n", devnr));
+
+        status = STATUS_INVALID_PARAMETER;
+        if (devnr > 9)
+                goto out;
+    
+
+        ppname[20] = ((WCHAR)'0') + (WCHAR)devnr;
+        RtlInitUnicodeString(&uppname, ppname);
+
+        status = IoGetDeviceObjectPointer(&uppname, STANDARD_RIGHTS_ALL, &fs->pdfo, &fs->pdo);
+        if (!NT_SUCCESS(status)) {
+                ELOG(printk("eppflex: cannot open parallel port %u\n", devnr));
+                goto out;
+        }
+    
+        timeout.QuadPart = -(LONGLONG)10*1000*500;  /* 500ms, in 100ns units */
+        status = callparport(fs, IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO,
+                             &fs->info, 0, sizeof(fs->info), &timeout);
+        if (!NT_SUCCESS(status)) {
+                ELOG(printk("eppflex: GET_PARALLEL_PORT_INFO error 0x%lx\n", status));
+                goto out;
+        }
+        status = callparport(fs, IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO,
+                             &fs->pnpinfo, 0, sizeof(fs->pnpinfo), &timeout);
+        if (!NT_SUCCESS(status)) {
+                ELOG(printk("eppflex: warning: GET_PARALLEL_PNP_INFO error 0x%lx\n", status));
+                fs->pnpinfo.EcpController = fs->info.Controller + 0x400;
+                fs->pnpinfo.SpanOfEcpController = fs->info.SpanOfController;
+                fs->pnpinfo.HardwareCapabilities = 0;
+                fs->pnpinfo.FifoDepth = 0;
+                fs->pnpinfo.FifoWidth = 0;
+        }
+
+        VLOG(printk("eppflex: ioaddr: 0x%x(%u)  ecpioaddr: 0x%x(%u)  cap: 0x%x  FIFO: %d,%d\n",
+                    fs->info.Controller, fs->info.SpanOfController,
+                    fs->pnpinfo.EcpController, fs->pnpinfo.SpanOfEcpController,
+                    fs->pnpinfo.HardwareCapabilities, fs->pnpinfo.FifoDepth, fs->pnpinfo.FifoWidth));
+        
+        timeout.QuadPart = -(LONGLONG)10*1000*50;  /* 50ms, in 100ns units */
+        status = callparport(fs, IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE, NULL, 0, 0, &timeout);
+        if (!NT_SUCCESS(status)) {
+                ELOG(printk("eppflex: PARALLEL_PORT_ALLOCATE error 0x%lx\n", status));
+                goto out;
+        }
+
+        status = STATUS_SUCCESS;
+
+  out:
+        if (!NT_SUCCESS(status) && fs) {
+                kfree(fs);
+                fileobj->FsContext = NULL;
+        }
+        irp->IoStatus.Status = status;
+        irp->IoStatus.Information = 0L;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static NTSTATUS close(PDEVICE_OBJECT devobj, PIRP irp)
+{
+        NTSTATUS status;
+        PIO_STACK_LOCATION irpsp;
+        PFILE_OBJECT fileobj;
+        struct eppflex *s = devobj->DeviceExtension;
+        struct eppflexfile *fs;
+        LARGE_INTEGER timeout;
+
+        irpsp = IoGetCurrentIrpStackLocation(irp);
+        fileobj = irpsp->FileObject;
+        fs = fileobj->FsContext;
+        VLOG(printk("eppflex: close\n"));
+        if (fs) {
+
+                timeout.QuadPart = -(LONGLONG)10*1000*50;  /* 50ms, in 100ns units */
+                status = callparport(fs, IOCTL_INTERNAL_RELEASE_PARALLEL_PORT_INFO, NULL, 0, 0, &timeout);
+                if (!NT_SUCCESS(status))
+                        ELOG(printk("eppflex: RELEASE_PARALLEL_PORT_INFO error 0x%lx\n", status));
+                status = callparport(fs, IOCTL_INTERNAL_PARALLEL_PORT_FREE, NULL, 0, 0, &timeout);
+                if (!NT_SUCCESS(status))
+                        ELOG(printk("eppflex: PARALLEL_PORT_FREE error 0x%lx\n", status));
+                ObDereferenceObject(fs->pdfo);
+                kfree(fs);
+                fileobj->FsContext = NULL;
+        }
+        status = irp->IoStatus.Status = STATUS_SUCCESS;
+        irp->IoStatus.Information = 0L;
+        IoCompleteRequest(irp, IO_NO_INCREMENT);
+        return status;
+}
+
+static void unload(PDRIVER_OBJECT drvobj)
+{
+        struct eppflex *s = drvobj->DeviceObject->DeviceExtension;
+        UNICODE_STRING nameString, linkString;
+
+        printk("eppflex: stop\n");
+
+        IoDeleteDevice(drvobj->DeviceObject);
+        RtlInitUnicodeString(&linkString, L"\\DosDevices\\EPPFLEX" );
+        RtlInitUnicodeString(&nameString, L"\\Device\\eppflex" );
+        IoDeleteSymbolicLink(&linkString);
+}
+
+NTSTATUS DriverEntry(PDRIVER_OBJECT drvobj, PUNICODE_STRING RegistryPath)
+{
+        UNICODE_STRING nameString, linkString;
+        PDEVICE_OBJECT devobj;
+        NTSTATUS status;
+        struct eppflex *s;
+
+
+        /*
+         * Create the device object.
+         */
+        RtlInitUnicodeString(&nameString, L"\\Device\\eppflex" );
+        status = IoCreateDevice(drvobj, sizeof(struct eppflex), &nameString, FILE_DEVICE_UNKNOWN, 0, TRUE, &devobj);
+        if (!NT_SUCCESS(status))
+                return status;
+
+        /*
+         * Create the symbolic link so the VDD can find us.
+         */
+        RtlInitUnicodeString( &linkString, L"\\DosDevices\\EPPFLEX" );
+        status = IoCreateSymbolicLink (&linkString, &nameString);
+        if (!NT_SUCCESS(status)) {
+                IoDeleteDevice(drvobj->DeviceObject);
+                return status;
+        }
+
+        /*
+         * Initialize the driver object with this device driver's entry points.
+         */
+
+        drvobj->DriverUnload = unload;
+        drvobj->MajorFunction[IRP_MJ_CREATE] = create;
+        drvobj->MajorFunction[IRP_MJ_CLOSE] = close;
+        drvobj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ioctl;
+
+        s = devobj->DeviceExtension;
+
+        /*
+         * Initialize the device extension.
+         */
+
+        printk("eppflex: started "__DATE__" "__TIME__"\n");
+
+        return STATUS_SUCCESS;
+}
diff --git a/ntdrv/eppflex.h b/ntdrv/eppflex.h
new file mode 100644
index 0000000..fcd47ab
--- /dev/null
+++ b/ntdrv/eppflex.h
@@ -0,0 +1,49 @@
+
+#ifndef CTL_CODE
+#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method))
+#endif
+
+#ifndef METHOD_BUFFERED
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+#endif
+
+#ifndef FILE_ANY_ACCESS
+#define FILE_ANY_ACCESS                 0
+#define FILE_READ_ACCESS          (0x0001) 
+#define FILE_WRITE_ACCESS         (0x0002)
+#endif
+
+
+#define FILE_DEVICE_EPPFLEX 0x80aa
+
+struct eppflex_rwdata {
+  unsigned char data;
+  unsigned char mask;
+};
+
+#define IOCTL_EPPFLEX_READ_DATA         CTL_CODE(FILE_DEVICE_EPPFLEX,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_DATA        CTL_CODE(FILE_DEVICE_EPPFLEX,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_STATUS       CTL_CODE(FILE_DEVICE_EPPFLEX,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_STATUS      CTL_CODE(FILE_DEVICE_EPPFLEX,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONTROL      CTL_CODE(FILE_DEVICE_EPPFLEX,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_CONTROL      CTL_CODE(FILE_DEVICE_EPPFLEX,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_ECONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_ECONTROL    CTL_CODE(FILE_DEVICE_EPPFLEX,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_ECONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGA      CTL_CODE(FILE_DEVICE_EPPFLEX, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGA     CTL_CODE(FILE_DEVICE_EPPFLEX, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGB      CTL_CODE(FILE_DEVICE_EPPFLEX, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGB     CTL_CODE(FILE_DEVICE_EPPFLEX, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPADDR      CTL_CODE(FILE_DEVICE_EPPFLEX, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPADDR     CTL_CODE(FILE_DEVICE_EPPFLEX, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPDATA      CTL_CODE(FILE_DEVICE_EPPFLEX, 16, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPDATA     CTL_CODE(FILE_DEVICE_EPPFLEX, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/* only W9x */
+#define IOCTL_EPPFLEX_ACQUIREPORT       CTL_CODE(FILE_DEVICE_EPPFLEX, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_RELEASEPORT       CTL_CODE(FILE_DEVICE_EPPFLEX, 65, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
diff --git a/ntdrv/eppflex.inf b/ntdrv/eppflex.inf
new file mode 100644
index 0000000..1f3c668
--- /dev/null
+++ b/ntdrv/eppflex.inf
@@ -0,0 +1,57 @@
+[Version]
+Signature="$CHICAGO$"
+Class=Ports
+provider=%MSFT%
+;LayoutFile=layout.inf
+DriverVer=07/21/2000,1.0.0.1
+
+[SourceDisksNames]
+1="EPPFLEX Installation Disk",,,""
+
+[SourceDisksFiles]
+eppflex.sys = 1,,
+
+[Manufacturer]
+%MfgName%=Baycom
+
+[Baycom]
+%EppFlexDev.DeviceDesc%=EPPFLEX_Dev
+
+;[PreCopySection]
+;HKR,,NoSetupUI,,1
+
+[DestinationDirs]
+EPPFLEX.Files.Ext = 10,System32\Drivers
+
+[EPPFLEX_Dev.NT]
+CopyFiles=EPPFLEX.Files.Ext
+AddReg=EPPFLEX.AddReg
+
+[EPPFLEX_Dev.NT.Services]
+Addservice = EPPFLEX, 0x00000002, EPPFLEX.AddService
+
+[EPPFLEX.AddService]
+DisplayName    = %EPPFLEX.SvcDesc%
+ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
+StartType      = 3                  ; SERVICE_DEMAND_START
+ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
+ServiceBinary  = %10%\System32\Drivers\eppflex.sys
+LoadOrderGroup = Base
+
+[EPPFLEX.AddReg]
+HKR,,DevLoader,,*ntkern
+HKR,,NTMPDriver,,eppflex.sys
+;HKLM,"System\Currentcontrolset\Services\USBFLEX\Parameters","TotalBuffers",0x10001,256
+
+
+[EPPFLEX.Files.Ext]
+eppflex.sys
+
+;---------------------------------------------------------------;
+
+[Strings]
+MSFT="Baycom"
+MfgName="Baycom Hard- und Software GmbH"
+EppFlexDev.DeviceDesc="EPPFLEX Radio Modem"
+EPPFLEX.SvcDesc="eppflex.sys EPPFLEX Modem Driver"
+
diff --git a/ntdrv/eppflex.rc b/ntdrv/eppflex.rc
new file mode 100644
index 0000000..1365ca6
--- /dev/null
+++ b/ntdrv/eppflex.rc
@@ -0,0 +1,38 @@
+#include <windows.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+            VALUE "FileDescription", "eppflex\0"
+            VALUE "FileVersion", "1, 0, 0, 1\0"
+            VALUE "InternalName", "Baycom EPPFLEX FlexNet kernel driver\0"
+            VALUE "LegalCopyright", "Copyright � 2000\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "eppflex.sys\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "EPPFLEX\0"
+            VALUE "ProductVersion", "1.00a\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
diff --git a/ntdrv/eppflex.sys b/ntdrv/eppflex.sys
new file mode 100755
index 0000000..f6b94e8
Binary files /dev/null and b/ntdrv/eppflex.sys differ
diff --git a/ntdrv/makefile b/ntdrv/makefile
new file mode 100755
index 0000000..9348f56
--- /dev/null
+++ b/ntdrv/makefile
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the components of Windows NT
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
+
diff --git a/ntdrv/sources b/ntdrv/sources
new file mode 100755
index 0000000..515f607
--- /dev/null
+++ b/ntdrv/sources
@@ -0,0 +1,7 @@
+TARGETNAME=eppflex
+TARGETPATH=obj
+TARGETTYPE=DRIVER
+
+SOURCES=eppflex.c \
+	eppflex.rc
+
diff --git a/ntdrv/testload.c b/ntdrv/testload.c
new file mode 100755
index 0000000..907eeda
--- /dev/null
+++ b/ntdrv/testload.c
@@ -0,0 +1,128 @@
+#include <windows.h>
+#include <stdio.h>
+
+static void getdir(void)
+{
+        HKEY key;
+        char buf[256];
+        DWORD blen, rtype;
+
+        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\FlexNet", 0, KEY_READ, &key) != ERROR_SUCCESS) {
+                fprintf(stderr, "Cannot open registry key\n");
+                return;
+        }
+        blen = sizeof(buf);
+        if (RegQueryValueEx(key, "Home", NULL, &rtype, buf, &blen) != ERROR_SUCCESS || rtype != REG_SZ)
+                fprintf(stderr, "Invalid/Nonexisting Registry Key/Type\n");
+        else
+                printf("FlexNet Directory %s\n", buf);
+        RegCloseKey(key);
+}
+
+#define SERVICENAME        "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY      "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY      "system32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                fprintf(stderr, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+                              SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+                              SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+        if (!hserv) {
+                fprintf(stderr, "Cannot create service, error 0x%08lx\n", GetLastError());
+                hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+                if (!hserv) {
+                        fprintf(stderr, "Cannot open service, error 0x%08lx\n", GetLastError());
+                        goto closescm;
+                }
+        }
+        if (!StartService(hserv, 0, NULL)) {
+                fprintf(stderr, "Cannot start service, error 0x%08lx\n", GetLastError());
+                goto closeserv;
+        }
+        printf("Service %s started successfully\n", SERVICENAME);
+        ret = 0;
+
+  closeserv:
+        if (!CloseServiceHandle(hserv))
+                fprintf(stderr, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                fprintf(stderr, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+static int stop_service(void)
+{
+        int ret = -1;
+        SC_HANDLE hscm, hserv;
+        SERVICE_STATUS sstat;
+        
+        hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+        if (!hscm) {
+                fprintf(stderr, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+        if (!hserv) {
+                fprintf(stderr, "Cannot open service, error 0x%08lx\n", GetLastError());
+                goto closescm;
+        }
+        ret = 0;
+        if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+                fprintf(stderr, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!DeleteService(hserv)) {
+                fprintf(stderr, "Cannot delete service, error 0x%08lx\n", GetLastError());
+                ret = -1;
+        }
+        if (!ret)
+                printf("Service %s stopped successfully\n", SERVICENAME);
+        if (!CloseServiceHandle(hserv))
+                fprintf(stderr, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+  closescm:
+        if (!CloseServiceHandle(hscm))
+                fprintf(stderr, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+        return ret;
+}
+
+static int open_driver(void)
+{
+        HANDLE hdrv;
+        hdrv = CreateFile("\\\\.\\eppflex\\0", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
+                          NULL, OPEN_EXISTING, 0, NULL);
+        if (hdrv == INVALID_HANDLE_VALUE) {
+                fprintf(stderr, "Cannot open driver, error 0x%08lx\n", GetLastError());
+                return -1;
+        }
+        CloseHandle(hdrv);
+        return 0;
+}
+
+int main(int argc, char *argv[])
+{
+        getdir();
+
+        if (argc < 2) {
+                fprintf(stderr, "usage: testload [r|s|o]\n");
+                exit(1);
+        }
+        if (!strcmp(argv[1], "r"))
+                exit(start_service() ? 1 : 0);
+        if (!strcmp(argv[1], "s"))
+                exit(stop_service() ? 1 : 0);
+        if (!strcmp(argv[1], "o"))
+                exit(open_driver() ? 1 : 0);
+        fprintf(stderr, "Invalid command: %s\n", argv[1]);
+        exit(1);
+}
diff --git a/po/ChangeLog b/po/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..111b40f
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,248 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper at gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+ at SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = $(prefix)/share/gettext/po
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = PATH=../src:$$PATH @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = PATH=../src:$$PATH @XGETTEXT@
+MSGMERGE = PATH=../src:$$PATH msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES = cat-id-tbl.c
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+	$(COMPILE) $<
+
+.po.pox:
+	$(MAKE) $(PACKAGE).pot
+	$(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+	$(MSGFMT) -o $@ $<
+
+.po.gmo:
+	file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+	  && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+	sed -f ../intl/po2msg.sed < $< > $*.msg \
+	  && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all- at USE_NLS@
+
+all-yes: cat-id-tbl.c $(CATALOGS)
+all-no:
+
+$(srcdir)/$(PACKAGE).pot: $(POTFILES)
+	$(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+	  --add-comments --keyword=_ --keyword=N_ \
+	  --files-from=$(srcdir)/POTFILES.in \
+	&& test ! -f $(PACKAGE).po \
+	   || ( rm -f $(srcdir)/$(PACKAGE).pot \
+		&& mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot )
+
+$(srcdir)/cat-id-tbl.c: stamp-cat-id; @:
+$(srcdir)/stamp-cat-id: $(PACKAGE).pot
+	rm -f cat-id-tbl.tmp
+	sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \
+		| sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp
+	if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \
+	  rm cat-id-tbl.tmp; \
+	else \
+	  echo cat-id-tbl.c changed; \
+	  rm -f $(srcdir)/cat-id-tbl.c; \
+	  mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \
+	fi
+	cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data- at USE_NLS@
+install-data-no: all
+install-data-yes: all
+	if test -r "$(MKINSTALLDIRS)"; then \
+	  $(MKINSTALLDIRS) $(datadir); \
+	else \
+	  $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \
+	fi
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  case "$$cat" in \
+	    *.gmo) destdir=$(gnulocaledir);; \
+	    *)     destdir=$(localedir);; \
+	  esac; \
+	  lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+	  dir=$$destdir/$$lang/LC_MESSAGES; \
+	  if test -r "$(MKINSTALLDIRS)"; then \
+	    $(MKINSTALLDIRS) $$dir; \
+	  else \
+	    $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+	  fi; \
+	  if test -r $$cat; then \
+	    $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+	    echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+	  else \
+	    $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+	    echo "installing $(srcdir)/$$cat as" \
+		 "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+	  fi; \
+	  if test -r $$cat.m; then \
+	    $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+	    echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+	  else \
+	    if test -r $(srcdir)/$$cat.m ; then \
+	      $(INSTALL_DATA) $(srcdir)/$$cat.m \
+		$$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+	      echo "installing $(srcdir)/$$cat as" \
+		   "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+	    else \
+	      true; \
+	    fi; \
+	  fi; \
+	done
+	if test "$(PACKAGE)" = "gettext"; then \
+	  if test -r "$(MKINSTALLDIRS)"; then \
+	    $(MKINSTALLDIRS) $(gettextsrcdir); \
+	  else \
+	    $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+	  fi; \
+	  $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+			  $(gettextsrcdir)/Makefile.in.in; \
+	else \
+	  : ; \
+	fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+	catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+	  rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+	  rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+	  rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+	  rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+	done
+	rm -f $(gettextsrcdir)/po-Makefile.in.in
+
+check: all
+
+cat-id-tbl.o: ../intl/libgettext.h
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+	rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp
+	rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	rm -f $(GMOFILES)
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+	dists="$(DISTFILES)"; \
+	for file in $$dists; do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	    || cp -p $(srcdir)/$$file $(distdir); \
+	done
+
+update-po: Makefile
+	$(MAKE) $(PACKAGE).pot
+	PATH=`pwd`/../src:$$PATH; \
+	cd $(srcdir); \
+	catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+	  mv $$lang.po $$lang.old.po; \
+	  echo "$$lang:"; \
+	  if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \
+	    rm -f $$lang.old.po; \
+	  else \
+	    echo "msgmerge for $$cat failed!"; \
+	    rm -f $$lang.po; \
+	    mv $$lang.old.po $$lang.po; \
+	  fi; \
+	done
+
+POTFILES: POTFILES.in
+	( if test 'x$(srcdir)' != 'x.'; then \
+	    posrcprefix='$(top_srcdir)/'; \
+	  else \
+	    posrcprefix="../"; \
+	  fi; \
+	  rm -f $@-t $@ \
+	    && (sed -e '/^#/d' -e '/^[ 	]*$$/d' \
+		    -e "s at .*@	$$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+		| sed -e '$$s/\\$$//') > $@-t \
+	    && chmod a-w $@-t \
+	    && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+	cd .. \
+	  && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+	       $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..30320a0
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,7 @@
+# List of source files containing translatable strings.
+
+eppfm2/src/main.c
+eppfm2/src/audio.c
+eppfm2/src/interface.c
+eppfm2/src/widgets.c
+eppfm2/src/support.c
diff --git a/po/baycomepp.pot b/po/baycomepp.pot
new file mode 100644
index 0000000..c67a284
--- /dev/null
+++ b/po/baycomepp.pot
@@ -0,0 +1,281 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2000-08-07 21:33+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: eppfm2/src/main.c:346
+msgid "Squelch on"
+msgstr ""
+
+#: eppfm2/src/interface.c:585 eppfm2/src/main.c:346
+msgid "Squelch off"
+msgstr ""
+
+#: eppfm2/src/interface.c:62
+msgid "EPPFM Input/Output Configuration"
+msgstr ""
+
+#: eppfm2/src/interface.c:72
+msgid "Soundcard Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:100 eppfm2/src/interface.c:116
+msgid "/dev/dsp"
+msgstr ""
+
+#: eppfm2/src/interface.c:101 eppfm2/src/interface.c:117
+msgid "/dev/dsp1"
+msgstr ""
+
+#: eppfm2/src/interface.c:121
+msgid "Soundcard for Recording"
+msgstr ""
+
+#: eppfm2/src/interface.c:134
+msgid "Soundcard for Playback"
+msgstr ""
+
+#: eppfm2/src/interface.c:147
+msgid "Parallel Port Driver Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:176
+msgid "0x378"
+msgstr ""
+
+#: eppfm2/src/interface.c:177
+msgid "0x278"
+msgstr ""
+
+#: eppfm2/src/interface.c:194
+msgid "/dev/ppuser0"
+msgstr ""
+
+#: eppfm2/src/interface.c:195
+msgid "/dev/ppuser1"
+msgstr ""
+
+#: eppfm2/src/interface.c:199
+msgid "IO Address"
+msgstr ""
+
+#: eppfm2/src/interface.c:211
+msgid "File"
+msgstr ""
+
+#: eppfm2/src/interface.c:223
+msgid "Driver Selection"
+msgstr ""
+
+#: eppfm2/src/interface.c:235
+msgid "Direct Parport Access"
+msgstr ""
+
+#: eppfm2/src/interface.c:246
+msgid "ppdev Kernel Driver"
+msgstr ""
+
+#: eppfm2/src/interface.c:257
+msgid "Modem Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:284
+msgid "19666600"
+msgstr ""
+
+#: eppfm2/src/interface.c:285
+msgid "9830400"
+msgstr ""
+
+#: eppfm2/src/interface.c:289
+msgid "FPGA clock frequency"
+msgstr ""
+
+#: eppfm2/src/interface.c:311 eppfm2/src/interface.c:744
+msgid "Ok"
+msgstr ""
+
+#: eppfm2/src/interface.c:319
+msgid "Continue"
+msgstr ""
+
+#: eppfm2/src/interface.c:321
+msgid "Quit"
+msgstr ""
+
+#: eppfm2/src/interface.c:329
+msgid "Quit the application"
+msgstr ""
+
+#: eppfm2/src/interface.c:387
+msgid "EPPFM"
+msgstr ""
+
+#: eppfm2/src/interface.c:415
+msgid "_File"
+msgstr ""
+
+#: eppfm2/src/interface.c:424
+msgid "File Menu"
+msgstr ""
+
+#: eppfm2/src/interface.c:436
+msgid "_DTMF keypad..."
+msgstr ""
+
+#: eppfm2/src/interface.c:448
+msgid "_Oscilloscope display..."
+msgstr ""
+
+#: eppfm2/src/interface.c:460
+msgid "_Spectrum Display..."
+msgstr ""
+
+#: eppfm2/src/interface.c:481
+msgid "_Quit"
+msgstr ""
+
+#: eppfm2/src/interface.c:493
+msgid "_Help"
+msgstr ""
+
+#: eppfm2/src/interface.c:514
+msgid "_About"
+msgstr ""
+
+#: eppfm2/src/interface.c:568
+msgid "PTT"
+msgstr ""
+
+#: eppfm2/src/interface.c:577
+msgid "1750"
+msgstr ""
+
+#: eppfm2/src/interface.c:593
+msgid "DTMF"
+msgstr ""
+
+#: eppfm2/src/interface.c:601 eppfm2/src/interface.c:1144
+msgid "Scope"
+msgstr ""
+
+#: eppfm2/src/interface.c:609 eppfm2/src/interface.c:1175
+msgid "Spectrum"
+msgstr ""
+
+#: eppfm2/src/interface.c:690
+msgid "About"
+msgstr ""
+
+#: eppfm2/src/interface.c:708
+msgid "written by:"
+msgstr ""
+
+#: eppfm2/src/interface.c:718
+msgid "Thomas Sailer"
+msgstr ""
+
+#: eppfm2/src/interface.c:727
+msgid "HB9JNX/AE4WA"
+msgstr ""
+
+#: eppfm2/src/interface.c:797
+msgid "DTMF Keypad"
+msgstr ""
+
+#: eppfm2/src/interface.c:807
+msgid "Keys transmitted"
+msgstr ""
+
+#: eppfm2/src/interface.c:834
+msgid "Clear"
+msgstr ""
+
+#: eppfm2/src/interface.c:843
+msgid "Keypad"
+msgstr ""
+
+#: eppfm2/src/interface.c:861
+msgid "8"
+msgstr ""
+
+#: eppfm2/src/interface.c:871
+msgid "9"
+msgstr ""
+
+#: eppfm2/src/interface.c:881
+msgid "A"
+msgstr ""
+
+#: eppfm2/src/interface.c:891
+msgid "4"
+msgstr ""
+
+#: eppfm2/src/interface.c:901
+msgid "5"
+msgstr ""
+
+#: eppfm2/src/interface.c:911
+msgid "6"
+msgstr ""
+
+#: eppfm2/src/interface.c:921
+msgid "B"
+msgstr ""
+
+#: eppfm2/src/interface.c:931
+msgid "1"
+msgstr ""
+
+#: eppfm2/src/interface.c:941
+msgid "2"
+msgstr ""
+
+#: eppfm2/src/interface.c:951
+msgid "3"
+msgstr ""
+
+#: eppfm2/src/interface.c:961
+msgid "C"
+msgstr ""
+
+#: eppfm2/src/interface.c:971
+msgid "*"
+msgstr ""
+
+#: eppfm2/src/interface.c:981
+msgid "0"
+msgstr ""
+
+#: eppfm2/src/interface.c:991
+msgid "#"
+msgstr ""
+
+#: eppfm2/src/interface.c:1001
+msgid "D"
+msgstr ""
+
+#: eppfm2/src/interface.c:1011
+msgid "7"
+msgstr ""
+
+#: eppfm2/src/support.c:117
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: eppfm2/src/support.c:126
+#, c-format
+msgid "Error loading pixmap file: %s"
+msgstr ""
diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c
new file mode 100644
index 0000000..1cc87ba
--- /dev/null
+++ b/po/cat-id-tbl.c
@@ -0,0 +1,79 @@
+/* Automatically generated by po2tbl.sed from baycomepp.pot.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+const struct _msg_ent _msg_tbl[] = {
+  {"", 1},
+  {"Squelch on", 2},
+  {"Squelch off", 3},
+  {"EPPFM Input/Output Configuration", 4},
+  {"Soundcard Settings", 5},
+  {"/dev/dsp", 6},
+  {"/dev/dsp1", 7},
+  {"Soundcard for Recording", 8},
+  {"Soundcard for Playback", 9},
+  {"Parallel Port Driver Settings", 10},
+  {"0x378", 11},
+  {"0x278", 12},
+  {"/dev/ppuser0", 13},
+  {"/dev/ppuser1", 14},
+  {"IO Address", 15},
+  {"File", 16},
+  {"Driver Selection", 17},
+  {"Direct Parport Access", 18},
+  {"ppdev Kernel Driver", 19},
+  {"Modem Settings", 20},
+  {"19666600", 21},
+  {"9830400", 22},
+  {"FPGA clock frequency", 23},
+  {"Ok", 24},
+  {"Continue", 25},
+  {"Quit", 26},
+  {"Quit the application", 27},
+  {"EPPFM", 28},
+  {"_File", 29},
+  {"File Menu", 30},
+  {"_DTMF keypad...", 31},
+  {"_Oscilloscope display...", 32},
+  {"_Spectrum Display...", 33},
+  {"_Quit", 34},
+  {"_Help", 35},
+  {"_About", 36},
+  {"PTT", 37},
+  {"1750", 38},
+  {"DTMF", 39},
+  {"Scope", 40},
+  {"Spectrum", 41},
+  {"About", 42},
+  {"written by:", 43},
+  {"Thomas Sailer", 44},
+  {"HB9JNX/AE4WA", 45},
+  {"DTMF Keypad", 46},
+  {"Keys transmitted", 47},
+  {"Clear", 48},
+  {"Keypad", 49},
+  {"8", 50},
+  {"9", 51},
+  {"A", 52},
+  {"4", 53},
+  {"5", 54},
+  {"6", 55},
+  {"B", 56},
+  {"1", 57},
+  {"2", 58},
+  {"3", 59},
+  {"C", 60},
+  {"*", 61},
+  {"0", 62},
+  {"#", 63},
+  {"D", 64},
+  {"7", 65},
+  {"Couldn't find pixmap file: %s", 66},
+  {"Error loading pixmap file: %s", 67},
+};
+
+int _msg_tbl_length = 67;
diff --git a/po/stamp-cat-id b/po/stamp-cat-id
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/po/stamp-cat-id
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/udriver/Makefile.am b/udriver/Makefile.am
new file mode 100644
index 0000000..4380e3e
--- /dev/null
+++ b/udriver/Makefile.am
@@ -0,0 +1,41 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir)/main -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -fPIC -DPIC
+
+if BAYCOMDRV
+DRVPROGS = baycomepp
+DRVEXECSCR = baycomfpga_init.so
+DRVLIBS = libdrvinit.a
+else
+DRVPROGS =
+endif
+
+noinst_LIBRARIES = $(DRVLIBS)
+libexec_SCRIPTS = $(DRVEXECSCR)
+
+man_MANS = baycomepp.8
+
+sbin_PROGRAMS = $(DRVPROGS)
+
+libdrvinit_a_SOURCES = \
+	drvinit.c
+
+baycomfpga_init.so: drvinit.o $(top_builddir)/main/libinit.a $(LIBOBJS)
+	$(CC) -shared -Wl,-soname -Wl,baycomfpga_init.so -o $@ $^
+
+baycomepp_SOURCES = \
+	drvresident.c
+
+baycomepp_LDADD = \
+	$(top_builddir)/main/libresident.a $(top_builddir)/main/libmisc.a \
+	$(DRVLIBOBJS) -ldl
+
+baycomepp_LDFLAGS = \
+	-rdynamic -Wl,-Map -Wl,baycomepp.map -Wl,--rpath -Wl,$(libexecdir)
+
+CLEANFILES = baycomepp.map baycomfpga_init.so
+
+noinst_HEADERS =   \
+	drv.h
+
+EXTRA_DIST = baycomepp.8 baycomepp.initscript
diff --git a/udriver/Makefile.in b/udriver/Makefile.in
new file mode 100644
index 0000000..cd397b4
--- /dev/null
+++ b/udriver/Makefile.in
@@ -0,0 +1,463 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -I$(top_srcdir)/main -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -fPIC -DPIC
+ at BAYCOMDRV_TRUE@DRVPROGS = @BAYCOMDRV_TRUE at baycomepp
+ at BAYCOMDRV_FALSE@DRVPROGS = 
+ at BAYCOMDRV_TRUE@DRVEXECSCR = @BAYCOMDRV_TRUE at baycomfpga_init.so
+ at BAYCOMDRV_TRUE@DRVLIBS = @BAYCOMDRV_TRUE at libdrvinit.a
+
+noinst_LIBRARIES = $(DRVLIBS)
+libexec_SCRIPTS = $(DRVEXECSCR)
+
+man_MANS = baycomepp.8
+
+sbin_PROGRAMS = $(DRVPROGS)
+
+libdrvinit_a_SOURCES = \
+	drvinit.c
+
+
+baycomepp_SOURCES = \
+	drvresident.c
+
+
+baycomepp_LDADD = \
+	$(top_builddir)/main/libresident.a $(top_builddir)/main/libmisc.a \
+	$(DRVLIBOBJS) -ldl
+
+
+baycomepp_LDFLAGS = \
+	-rdynamic -Wl,-Map -Wl,baycomepp.map -Wl,--rpath -Wl,$(libexecdir)
+
+
+CLEANFILES = baycomepp.map baycomfpga_init.so
+
+noinst_HEADERS = \
+	drv.h
+
+
+EXTRA_DIST = baycomepp.8 baycomepp.initscript
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libdrvinit_a_LIBADD = 
+libdrvinit_a_OBJECTS =  drvinit.$(OBJEXT)
+ at BAYCOMDRV_FALSE@sbin_PROGRAMS = 
+ at BAYCOMDRV_TRUE@sbin_PROGRAMS =  baycomepp$(EXEEXT)
+PROGRAMS =  $(sbin_PROGRAMS)
+
+baycomepp_OBJECTS =  drvresident.$(OBJEXT)
+baycomepp_DEPENDENCIES =  $(top_builddir)/main/libresident.a \
+$(top_builddir)/main/libmisc.a
+SCRIPTS =  $(libexec_SCRIPTS)
+
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man8dir = $(mandir)/man8
+MANS = $(man_MANS)
+
+NROFF = nroff
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libdrvinit_a_SOURCES) $(baycomepp_SOURCES)
+OBJECTS = $(libdrvinit_a_OBJECTS) $(baycomepp_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps udriver/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libdrvinit.a: $(libdrvinit_a_OBJECTS) $(libdrvinit_a_DEPENDENCIES)
+	-rm -f libdrvinit.a
+	$(AR) cru libdrvinit.a $(libdrvinit_a_OBJECTS) $(libdrvinit_a_LIBADD)
+	$(RANLIB) libdrvinit.a
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+	-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(sbindir)
+	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+	     $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	  else :; fi; \
+	done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	list='$(sbin_PROGRAMS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+	done
+
+baycomepp$(EXEEXT): $(baycomepp_OBJECTS) $(baycomepp_DEPENDENCIES)
+	@rm -f baycomepp$(EXEEXT)
+	$(LINK) $(baycomepp_LDFLAGS) $(baycomepp_OBJECTS) $(baycomepp_LDADD) $(LIBS)
+
+install-libexecSCRIPTS: $(libexec_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(libexecdir)
+	@list='$(libexec_SCRIPTS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+	  else if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+	  else :; fi; fi; \
+	done
+
+uninstall-libexecSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	list='$(libexec_SCRIPTS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+	done
+
+install-man8:
+	$(mkinstalldirs) $(DESTDIR)$(man8dir)
+	@list='$(man8_MANS)'; \
+	l2='$(man_MANS)'; for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
+	done
+
+uninstall-man8:
+	@list='$(man8_MANS)'; \
+	l2='$(man_MANS)'; for i in $$l2; do \
+	  case "$$i" in \
+	    *.8*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
+	  rm -f $(DESTDIR)$(man8dir)/$$inst; \
+	done
+install-man: $(MANS)
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-man8
+uninstall-man:
+	@$(NORMAL_UNINSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = udriver
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+drvinit.o: drvinit.c ../config.h ../main/getopt.h drv.h ../main/fpga.h \
+	../main/sysdeps.h ../main/parport.h
+drvresident.o: drvresident.c ../config.h ../main/getopt.h drv.h \
+	../main/fpga.h ../main/sysdeps.h ../main/parport.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS install-libexecSCRIPTS
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-libexecSCRIPTS \
+		uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(sbindir) $(DESTDIR)$(libexecdir) \
+		$(DESTDIR)$(mandir)/man8
+
+
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+		mostlyclean-sbinPROGRAMS mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-sbinPROGRAMS \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+		distclean-sbinPROGRAMS distclean-tags distclean-generic \
+		clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+		maintainer-clean-compile maintainer-clean-sbinPROGRAMS \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-sbinPROGRAMS \
+distclean-sbinPROGRAMS clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS \
+uninstall-sbinPROGRAMS install-sbinPROGRAMS uninstall-libexecSCRIPTS \
+install-libexecSCRIPTS install-man8 uninstall-man8 install-man \
+uninstall-man tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+baycomfpga_init.so: drvinit.o $(top_builddir)/main/libinit.a $(LIBOBJS)
+	$(CC) -shared -Wl,-soname -Wl,baycomfpga_init.so -o $@ $^
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/udriver/baycomepp.8 b/udriver/baycomepp.8
new file mode 100644
index 0000000..d3d2ea1
--- /dev/null
+++ b/udriver/baycomepp.8
@@ -0,0 +1,140 @@
+.\" Copyright 1999 Thomas Sailer (sailer at ife.ee.ethz.ch)
+.\" May be distributed under the GNU General Public License
+.\"
+.\" "
+.TH BAYCOMEPP 8 "13 May 1998" "BaycomEPP 0.2" "Linux AX.25 Utilities Manual"
+.SH NAME
+baycomepp \- Baycom EPP modem driver
+.SH SYNOPSIS
+.B baycomepp
+.B "[ \-lknvcaz ]"
+.B "[\-p portaddr]"
+.B "[\-m modestr]"
+.B "[\--epp]"
+.B "[\--ecp]"
+.B "[\--eppconv]"
+.B "[\--eppafsk]"
+.B "[\--ifname name]"
+.B "[\--hwaddr callsign]"
+.B "[\--ipaddr ipaddress]"
+.B "[\--netmask netmask]"
+.B "[\--broadcast broadcast]"
+
+
+.SH DESCRIPTION
+.B baycomepp
+is a user mode driver for the Baycom EPP modem family. It currently
+supports the conventional EPP modem (using the IDT 72xxx FIFO's)
+and the FPGA (Xilinx XCS10) variant. The driver automatically
+initializes the FPGA modem depending on the requested mode.
+In order to keep the resident memory footprint small (approx
+20kBytes plus standard system shared libraries like libc),
+the initialization code is contained in a shared library called
+.I "baycomfpga_init.so".
+This driver is able to automatically attach itself to the
+kernel network stack as a network interface (usually called
+ax0). To do this it requires the Linux Kernel MKISS driver
+(enable CONFIG_MKISS).
+
+
+.SH OPTIONS
+.B baycomepp
+accepts the following options:
+
+.TP
+.B \-h
+.B \--help
+Display an overview of the available command line parameters and exit.
+.TP
+.B \-v
+.B \--verbose
+Increases the verbosity of the output. May be cumulated.
+.TP
+.B \-p
+.B \--port
+Specifies the base address of the EPP capable parallel port to which
+the modem is connected. Use the
+.I 0x
+prefix to specify hexadecimal numbers.
+.TP
+.B \-m
+.B \--mode
+Specifies various ``firmware'' options.
+.TP
+.B \-n
+.B \--no-daemon
+Do not start up in background as a daemon. Also log received
+and transmitted packets to stdout.
+.TP
+.B \-l
+.B \--log
+Log to syslog.
+.TP
+.B \-k
+.B \--kill
+Kill running baycomepp daemons. Don't start the driver proper.
+.TP
+.B \--epp
+Start up in EPP FSK mode. Requires the FPGA version.
+.TP
+.B \--eppafsk
+Start up in EPP AFSK mode. Requires the FPGA version.
+.TP
+.B \--ecp
+Start up in ECP FSK mode. Requires the FPGA version.
+.TP
+.B \--eppconv
+Start up in conventional EPP FSK mode. Requires the conventional version.
+.TP
+.B \--ifname
+Set the name of the interface (requires Linux 2.2.x)
+.TP
+.B \--hwaddr
+Set the hardware address (callsign) of the interface
+.TP
+.B \--ipaddr
+Set the ip address of the interface
+.TP
+.B \--netmask
+Set the netmask of the interface
+.TP
+.B \--broadcast
+Set the broadcast address of the interface
+
+
+.SH "FIRMWARE OPTIONS"
+
+.TP
+.B intclk
+uses FPGA internal clock; \fBdon't\fP use if an external oscillator is on board.
+.TP
+.B extclk
+uses the external oscillator; recommended if the internal modem is used, as the
+frequency of the FPGA oscillator is not accurate enough.
+.TP
+.B intmodem
+uses the internal modem
+.TP
+.B extmodem
+uses a DF9IC type modem connected to the high speed modem connector
+.TP
+.B divider=x
+sets the clock divider for the internal modem (baud=fquartz/16/divider)
+.TP
+.B loopback
+sets an internal modem loopback
+.TP
+.B extstat
+allows extended status readback
+.TP
+.B noextstat
+disallows extended status readback
+
+
+.SH "SEE ALSO"
+.nf
+.BR ifconfig "\ (8), " sethdlc "\ (8), "
+.fi
+
+.SH AUTHOR
+baycomepp was written by Thomas Sailer, HB9JNX/AE4WA (sailer at ife.ee.ethz.ch).
diff --git a/udriver/baycomepp.initscript b/udriver/baycomepp.initscript
new file mode 100755
index 0000000..d07f735
--- /dev/null
+++ b/udriver/baycomepp.initscript
@@ -0,0 +1,63 @@
+#! /bin/sh
+#
+# baycomepp     Start Baycom EPP driver.
+#
+# Author:       Thomas Sailer, <sailer at ife.ee.ethz.ch>
+#
+# chkconfig: 345 50 50
+# description: This script starts/stops the Baycom EPP driver
+# processname: baycomepp
+# pidfile: /var/run/baycomepp.pid
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+# Get config.
+. /etc/sysconfig/network
+
+## Check that networking is up.
+#if [ ${NETWORKING} = "no" ]
+#then
+#	exit 0
+#fi
+
+[ -f /usr/sbin/baycomepp ] || exit 0
+
+EPPCONV="-m divider=64 --epp"
+EPPIF=ax0
+MYCALL=hb9jnx
+MYIP=44.142.52.99
+GWCALL=hb9w-11
+GWPATH=hb9zrh
+GWIP=44.142.52.7
+GWMODE="-ipmode v"
+
+# See how we were called.
+case "$1" in
+  start)
+	echo -n "Starting BaycomEPP driver: "
+	if /usr/sbin/baycomepp -v -v -v -l ${EPPCONV} --hwaddr=${MYCALL} --ipaddr=${MYIP}; then
+	    /sbin/route add -host ${GWIP} dev ${EPPIF}
+	    /sbin/arp -H ax25 -s ${GWIP} ${GWCALL}
+	    /usr/sbin/axparms -route add ${EPPIF} ${GWCALL} ${GWPATH} ${GWMODE}
+	    /sbin/route add -net 44.0.0.0 netmask 255.0.0.0 gw ${GWIP}
+	else
+	    echo "unable to start BaycomEPP"
+	    exit 1
+	fi
+	echo
+	;;
+  stop)
+	echo -n "Stopping BaycomEPP driver: "
+	/usr/sbin/baycomepp -k
+	echo
+	;;
+  status)
+	killall -USR1 baycomepp
+	;;
+  *)
+	echo "Usage: baycomepp {start|stop|status}"
+	exit 1
+esac
+
+exit 0
diff --git a/udriver/drv.h b/udriver/drv.h
new file mode 100644
index 0000000..54b6581
--- /dev/null
+++ b/udriver/drv.h
@@ -0,0 +1,172 @@
+/*****************************************************************************/
+
+/*
+ *      drv.h  -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ *
+ *      Copyright (C) 1998  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _DRV_H
+#define _DRV_H
+
+/* --------------------------------------------------------------------- */
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <syslog.h>
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define KISS_FEND   ((unsigned char)0300)
+#define KISS_FESC   ((unsigned char)0333)
+#define KISS_TFEND  ((unsigned char)0334)
+#define KISS_TFESC  ((unsigned char)0335)
+
+#define KISS_CMD_DATA       0
+#define KISS_CMD_TXDELAY    1
+#define KISS_CMD_PPERSIST   2
+#define KISS_CMD_SLOTTIME   3
+#define KISS_CMD_TXTAIL     4
+#define KISS_CMD_FULLDUP    5
+#define KISS_CMD_HARDWARE   6
+#define KISS_CMD_FECLEVEL   8
+#define KISS_CMD_RETURN     255
+
+/* --------------------------------------------------------------------- */
+
+#define MAXFLEN           512
+#define RXBUFFER_SIZE     ((MAXFLEN*6/5)+8)
+#define TXBUFFER_SIZE     8192
+
+#define KISSOUTBUF_SIZE   8192
+#define KISSINBUF_SIZE    (2*MAXFLEN+8)
+
+struct baycomepp_state {
+	int kissfd;
+
+	struct adapter_config config;
+
+	struct {
+		unsigned bitrate, bitrateby25;
+		int slotcnt, flagcnt;
+		int dcd, ptt;
+		int calib;
+		enum { tx_idle = 0, tx_keyup, tx_data, tx_tail } state;
+	} access;
+
+        struct chaccesspar {
+                unsigned int txdelay;
+                unsigned int slottime;
+                unsigned int ppersist;
+                unsigned int txtail;
+                unsigned int fulldup;
+        } chaccesspar;
+
+	struct hdlc_receiver {
+		unsigned int bitbuf, bitstream, numbits, state;
+		unsigned char *bufptr;
+		int bufcnt;
+		unsigned char buf[RXBUFFER_SIZE];
+	} hrx;
+
+	struct hdlc_transmitter {
+		unsigned rd, wr;
+		u_int8_t buf[TXBUFFER_SIZE];
+	} htx;
+
+        struct {
+                unsigned ptr;
+                u_int8_t b[KISSINBUF_SIZE];
+        } kissin;
+
+        struct {
+                unsigned rd;
+                unsigned wr;
+                u_int8_t b[KISSOUTBUF_SIZE];
+        } kissout;
+
+        struct statistics {
+		unsigned long pkt_in;
+		unsigned long pkt_out;
+		unsigned long pkt_outerr;
+		unsigned long bytes_in;
+		unsigned long bytes_out;
+                unsigned long kiss_out;
+                unsigned long kiss_outerr;
+                unsigned long kiss_in;
+                unsigned long kiss_inerr;
+                unsigned long ptt_keyed;
+		unsigned int intcnt, icnt1, icnt2, icnt3, ocnt1, ocnt2, ocnt3;
+		u_int8_t status;
+        } stat;
+
+};
+
+/* --------------------------------------------------------------------- */
+
+extern int logging;
+extern int logpackets;
+extern struct baycomepp_state state;
+extern const char *progname;
+
+/* --------------------------------------------------------------------- */
+
+#define SEV_FATAL    LOG_CRIT
+#define SEV_ERROR    LOG_ERR
+#define SEV_WARNING  LOG_WARNING
+#define SEV_NOTICE   LOG_NOTICE
+#define SEV_INFO     LOG_INFO
+#define SEV_DEBUG    LOG_DEBUG
+
+extern void errprintf(int severity, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
+extern void errstr(int severity, const char *st);
+extern void sighandler(int sig);
+extern void sig_usr1(int sig);
+extern void sig_usr2(int sig);
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef __i386__
+#define GETTICK(x)                                                \
+({                                                                \
+	__asm__ __volatile__("rdtsc" : "=a" (x) : : "dx");        \
+})
+#else /* __i386__ */
+#define GETTICK(x)  ((x)=0)
+#endif /* __i386__ */
+
+/* --------------------------------------------------------------------- */
+
+#define MODE_EPP     0
+#define MODE_ECP     1
+#define MODE_EPPAFSK 2
+#define MODE_EPPCONV 3  /* conventional modem */
+
+/* --------------------------------------------------------------------- */
+#endif /* _DRV_H */
diff --git a/udriver/drvinit.c b/udriver/drvinit.c
new file mode 100644
index 0000000..e494e6e
--- /dev/null
+++ b/udriver/drvinit.c
@@ -0,0 +1,837 @@
+/*****************************************************************************/
+
+/*
+ *      drvinit.c  -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ *                    Init code (discarded at runtime).
+ *
+ *      Copyright (C) 1998-2000  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/param.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+#include <errno.h>
+#include <ctype.h>
+
+#ifdef HAVE_LINUX_IF_H
+#include <linux/if.h>
+#elif defined(HAVE_NET_IF_H)
+#include <net/if.h>
+#endif
+
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_PTY_H
+#include <pty.h>
+#else
+extern int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct  winsize *winp);
+#endif
+
+#include "drv.h"
+#include "parport.h"
+#include "fpga.h"
+
+#ifdef HAVE_MKISS
+#include <sys/socket.h>
+/* glibc2.0 does not have sockaddr_ax25, ifr.ifr_newname and SIOCSIFNAME */
+#include <linux/ax25.h>
+#include <linux/sockios.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#endif
+
+/* --------------------------------------------------------------------- */
+
+#define PIDFILE LOCALSTATEDIR "/run/baycomepp.pid"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+
+#ifdef HAVE_MKISS
+
+struct ifconfig {
+	char ifname[IFNAMSIZ];
+	ax25_address hwaddr;
+	struct in_addr ipaddr, netmask, broadcast;
+};
+
+#define IFCONFIGINIT { "", { "" }, { INADDR_NONE }, { INADDR_NONE }, { INADDR_NONE } }
+
+#else /* !HAVE_MKISS */
+
+struct ifconfig {
+	char ifname[PATH_MAX];
+};
+
+#define IFCONFIGINIT { "" }
+
+#endif /* !HAVE_MKISS */
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+        static const int logprio[] = { LOG_ERR, LOG_INFO };
+        va_list ap;
+        int r = 0;
+
+        if (vl > verboselevel)
+                return 0;
+	va_start(ap, format);
+	if (logging)
+		vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+	else {
+		r = fprintf(stderr, "baycomepp[%u]: ", getpid());
+		r += vfprintf(stderr, format, ap);
+	}
+	va_end(ap);
+        return r;
+}
+
+int tprintf(const char *format, ...)
+{
+	va_list ap;
+	int i;
+
+        va_start(ap, format);
+        i = vprintf(format, ap);
+        va_end(ap);
+	fflush(stdout);
+	return i;
+}
+
+int idle_callback(unsigned us_delay)
+{
+	return 1;
+}
+
+/* --------------------------------------------------------------------- */
+#ifdef HAVE_MKISS
+
+static inline void ifconfigure(struct ifconfig *cfg)
+{
+	int master, slave, fd, disc = N_AX25, encap = 4;
+	char mbuf[512], *mptr = mbuf;
+	struct sockaddr_ax25 sax25;
+	struct sockaddr_in sin;
+	struct termios tm;
+        struct ifreq ifr;
+	unsigned i;
+
+	openpty(&master, &slave, NULL, NULL, NULL);
+	/* set pty/tty pair to raw */
+	memset(&tm, 0, sizeof(tm));
+	tm.c_cflag = CS8 | CREAD | CLOCAL;
+	if (tcsetattr(master, TCSANOW, &tm))
+		errstr(SEV_WARNING, "master: tcsetattr");
+	memset(&tm, 0, sizeof(tm));
+	tm.c_cflag = CS8 | CREAD | CLOCAL;
+	if (tcsetattr(slave, TCSANOW, &tm))
+		errstr(SEV_WARNING, "slave: tcsetattr");
+        if (ioctl(master, TIOCSETD, &disc) == -1)
+                errstr(SEV_FATAL, "ioctl: TIOCSETD");
+	if (ioctl(master, SIOCGIFNAME, ifr.ifr_name) == -1)
+                errstr(SEV_FATAL, "ioctl: SIOCGIFNAME");
+        if (ioctl(master, SIOCSIFENCAP, &encap) == -1)
+                errstr(SEV_FATAL, "ioctl: SIOCSIFENCAP");
+	/* configure interface */
+        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+                errstr(SEV_FATAL, "socket");
+#ifdef HAVE_IFRNEWNAME
+	if (cfg->ifname[0]) {
+		strncpy(ifr.ifr_newname, cfg->ifname, sizeof(ifr.ifr_newname));
+		if (ioctl(fd, SIOCSIFNAME, &ifr) == -1) {
+			errstr(SEV_WARNING, "ioctl: SIOCSIFNAME");
+			errprintf(SEV_WARNING, "baycomepp: cannot set ifname to %s, using %s (old kernel version?)\n",
+				  cfg->ifname, ifr.ifr_name);
+		} else {
+			memcpy(ifr.ifr_name, ifr.ifr_newname, sizeof(ifr.ifr_name));
+		}
+	}
+#endif /* HAVE_IFRNEWNAME */
+	mptr += sprintf(mptr, "ifname %s mtu 256", ifr.ifr_name);
+	ifr.ifr_mtu = 256;
+        if (ioctl(fd, SIOCSIFMTU, &ifr) < 0)
+                errstr(SEV_FATAL, "ioctl: SIOCSIFMTU");
+	if (cfg->hwaddr.ax25_call[0]) {
+		sax25.sax25_family = AF_AX25;
+		memcpy(&sax25.sax25_call, &cfg->hwaddr, sizeof(sax25.sax25_call));
+		sax25.sax25_ndigis = 0;
+		memcpy(&ifr.ifr_hwaddr, &sax25, sizeof(ifr.ifr_hwaddr));
+		if (ioctl(fd, SIOCSIFHWADDR, &ifr) == -1)
+			errstr(SEV_WARNING, "ioctl: SIOCSIFHWADDR");
+		else {
+			mptr += sprintf(mptr, " hwaddr ");
+			for (i = 0; i < 6; i++)
+				if (sax25.sax25_call.ax25_call[i] != (' ' << 1))
+					*mptr++ = (sax25.sax25_call.ax25_call[i] >> 1) & 0x7f;
+			mptr += sprintf(mptr, "-%d", (sax25.sax25_call.ax25_call[6] >> 1) & 0x7f);
+		}
+	}
+	if (cfg->ipaddr.s_addr != INADDR_NONE) {
+		sin.sin_family = AF_INET;
+		sin.sin_addr = cfg->ipaddr;
+		memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr));
+		if (ioctl(fd, SIOCSIFADDR, &ifr) == -1)
+			errstr(SEV_WARNING, "ioctl: SIOCSIFADDR");
+		else
+			mptr += sprintf(mptr, " ipaddr %s", inet_ntoa(cfg->ipaddr));
+	}
+	if (cfg->netmask.s_addr != INADDR_NONE) {
+		sin.sin_family = AF_INET;
+		sin.sin_addr = cfg->netmask;
+		memcpy(&ifr.ifr_netmask, &sin, sizeof(ifr.ifr_netmask));
+		if (ioctl(fd, SIOCSIFNETMASK, &ifr) == -1)
+			errstr(SEV_WARNING, "ioctl: SIOCSIFNETMASK");
+		else
+			mptr += sprintf(mptr, " netmask %s", inet_ntoa(cfg->netmask));
+	}
+	if (cfg->broadcast.s_addr != INADDR_NONE) {
+		sin.sin_family = AF_INET;
+		sin.sin_addr = cfg->broadcast;
+		memcpy(&ifr.ifr_broadaddr, &sin, sizeof(ifr.ifr_broadaddr));
+		if (ioctl(fd, SIOCSIFBRDADDR, &ifr) == -1)
+			errstr(SEV_WARNING, "ioctl: SIOCSIFBRDADDR");
+		else
+			mptr += sprintf(mptr, " broadcast %s", inet_ntoa(cfg->broadcast));
+	}
+        if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1)
+                errstr(SEV_FATAL, "ioctl: SIOCGIFFLAGS");
+        ifr.ifr_flags &= ~IFF_NOARP;
+        ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
+        if (ioctl(fd, SIOCSIFFLAGS, &ifr) == -1) {
+		printf("flags: 0x%x name %s\n", ifr.ifr_flags, ifr.ifr_name);
+                errstr(SEV_FATAL, "ioctl: SIOCSIFFLAGS");
+	}
+        close(fd);
+	/* prepare modem state etc. */
+	state.kissfd = slave;
+	/* don't close the master side! */
+	fcntl(state.kissfd, F_SETFL, fcntl(state.kissfd, F_GETFL, 0) | O_NONBLOCK);
+	errprintf(SEV_INFO, "baycomepp: %s\n", mbuf);
+}
+
+#else /* !HAVE_MKISS */
+
+static inline void ifconfigure(struct ifconfig *cfg)
+{
+	int master, slave;
+	struct termios tm;
+	char ttyname[32];
+
+	openpty(&master, &slave, ttyname, NULL, NULL);
+	/* set pty/tty pair to raw */
+	memset(&tm, 0, sizeof(tm));
+	tm.c_cflag = CS8 | CREAD | CLOCAL;
+	if (tcsetattr(master, TCSANOW, &tm))
+		errstr(SEV_WARNING, "master: tcsetattr");
+	memset(&tm, 0, sizeof(tm));
+	tm.c_cflag = CS8 | CREAD | CLOCAL;
+	if (tcsetattr(slave, TCSANOW, &tm))
+		errstr(SEV_WARNING, "slave: tcsetattr");
+	/* make link */
+	if (cfg->ifname[0]) {
+		//fchmod(slave, 0600);
+		unlink(cfg->ifname);
+		if (symlink(ttyname, cfg->ifname)) 
+			errprintf(SEV_WARNING, "baycomepp: symlink error: %s -> %s\n", ttyname, cfg->ifname);
+	}
+	/* prepare modem state etc. */
+	state.kissfd = master;
+	close(slave);
+	/* don't close the master side! */
+	fcntl(state.kissfd, F_SETFL, fcntl(state.kissfd, F_GETFL, 0) | O_NONBLOCK);
+	errprintf(SEV_INFO, "baycomepp: starting AX.25 interface %s\n", cfg->ifname ? cfg->ifname : ttyname);
+}
+
+#endif /* !HAVE_MKISS */
+
+/* --------------------------------------------------------------------- */
+
+static void write_pid(pid_t pid)
+{
+	FILE *f = fopen(PIDFILE, "a");
+	if (!f) {
+		errprintf(SEV_INFO, "cannot open PID file %s\n", PIDFILE);
+		return;
+	}
+	fprintf(f, "%i\n", pid);
+	fclose(f);
+}
+
+/* --------------------------------------------------------------------- */
+
+static void kill_baycomeppd(void)
+{
+	FILE *f = fopen(PIDFILE, "r");
+	pid_t pid;
+
+	if (!f) {
+		errprintf(SEV_INFO, "cannot open PID file %s\n", PIDFILE);
+		return;
+	}
+	while (fscanf(f, " %i \n", &pid) == 1) 
+		if (pid <= 0 || pid == getpid())
+			errprintf(SEV_INFO, "invalid pid %i\n", pid);
+		else {
+			kill(pid, SIGTERM);
+			errprintf(SEV_INFO, "terminating process %i\n", pid);
+		}
+	fclose(f);
+	unlink(PIDFILE);
+}
+
+/* --------------------------------------------------------------------- */
+
+static void init(int mode)
+{
+	unsigned char eio[2048];
+	u_int8_t stat;
+	u_int8_t statecp[6];
+	int cnt, icnt;
+	struct timeval tv1, tv2;
+	unsigned long usec;
+	unsigned bytecnt = 0;
+
+	/* we need this here so that the bitrate autoprobe works correctly */
+	/*
+	 * set the process to realtime privs
+	 */
+#ifdef HAVE_SCHED_H
+	{
+		struct sched_param schp;
+		memset(&schp, 0, sizeof(schp));
+		schp.sched_priority = sched_get_priority_min(SCHED_RR)+1;
+#if 1
+		if (sched_setscheduler(0, SCHED_RR, &schp) != 0)
+			errstr(SEV_ERROR, "sched_setscheduler");
+#endif
+	}
+#endif /* HAVE_SCHED_H */
+	/*
+	 * lock memory down
+	 */
+	if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) 
+		errstr(SEV_ERROR, "mlockall");
+       	switch(mode) {
+	case MODE_EPP:
+		if (adapter_start_epp(&state.config))
+			exit(1);
+		/* reset modem */
+		eio[0] = 0;
+		eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+		if (parport_epp_write_addr(eio, 2) != 2)
+			goto errret;
+		gettimeofday(&tv1, NULL);
+		for (;;) {
+			if (parport_epp_read_addr(&stat, 1) != 1)
+				goto errret;
+			/* try to determine the FIFO count if in extended mode */
+			if (state.config.extstat) {
+				eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errret;
+				if (parport_epp_read_addr(eio, 2) != 2)
+					goto errret;
+				icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+				eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+				if (parport_epp_write_addr(eio, 1) != 1)
+					goto errret;
+				icnt &= 0x7fff;
+			} else {
+				/* determine RX fifo size from status bits */
+				switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+				case EPP_NRHF:
+					icnt = 0;
+					break;
+                
+				case EPP_NRAEF:
+					icnt = 1025;
+					break;
+                
+				case 0:
+					icnt = 1793;
+					break;
+                
+				default:
+					icnt = 256;
+					break;
+				}
+			}
+			/* rx */
+			while (icnt > 0) {
+				cnt = icnt;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				icnt -= cnt;
+				bytecnt += cnt;
+				if (parport_epp_read_data(eio, cnt) != cnt)
+					goto errret;
+			}
+			gettimeofday(&tv2, NULL);
+			usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+			if (usec >= 500000)
+				break;
+			usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+		}
+		break;
+
+	case MODE_ECP:
+		if (adapter_start_ecp(&state.config))
+			exit(1);
+		eio[0] = 0xaf;  /* reset register: all reset */
+		eio[1] = 0xa0;  /* reset register: terminate reset */
+		eio[2] = 0xb0;
+		if (parport_ecp_write_addr(eio, 3) != 3)
+			goto errret;
+		gettimeofday(&tv1, NULL);
+		for (;;) {
+			eio[0] = 0x81;
+			if (parport_ecp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_ecp_read_data(statecp, 6) != 6)
+				goto errret;
+			eio[0] = 0x80;
+			if (parport_ecp_write_addr(eio, 1) != 1)
+				goto errret;
+			icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+			/* read */
+			while (icnt > 0) {
+				cnt = icnt;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				icnt -= cnt;
+				bytecnt += cnt;
+				eio[0] = 0xc0 | (cnt & 0xf);
+				eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+				eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+				if (parport_ecp_write_addr(eio, 3) != 3)
+					goto errret;
+				if (parport_ecp_read_data(eio, cnt) != cnt)
+					goto errret;
+			}
+			gettimeofday(&tv2, NULL);
+			usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+			if (usec >= 500000)
+				break;
+			usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+		}
+		break;
+
+	case MODE_EPPAFSK:
+		state.config.bitrate = 1200;
+		if (adapter_start_eppafsk(&state.config))
+			exit(1);
+		/* reset modem */
+		eio[0] = 0x00;
+		eio[1] = 0x18;
+		if (parport_epp_write_addr(eio, 2) != 2)
+			goto errret;
+		gettimeofday(&tv1, NULL);
+		for (;;) {
+			if (parport_epp_read_addr(&stat, 1) != 1)
+				goto errret;
+			/* determine the FIFO count */
+			eio[0] = 0x1a;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(eio, 1) != 1)
+				goto errret;
+			icnt = eio[0] & 0x1f;
+			eio[0] = 0x18;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			/* rx */
+			if (icnt > 0) {
+				if (parport_epp_read_data(eio, icnt) != icnt)
+					goto errret;
+				bytecnt += icnt;
+			}
+			gettimeofday(&tv2, NULL);
+			usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+			if (usec >= 500000)
+				break;
+			usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+		}
+		break;
+
+	case MODE_EPPCONV:
+		/* reset modem */
+		eio[0] = 0;
+		eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+		if (parport_epp_write_addr(eio, 2) != 2)
+			goto errret;
+		gettimeofday(&tv1, NULL);
+		for (;;) {
+			if (parport_epp_read_addr(&stat, 1) != 1)
+				goto errret;
+			/* try to determine the FIFO count if in extended mode */
+			/* determine RX fifo size from status bits */
+			switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+			case EPP_NRHF:
+				icnt = 0;
+				break;
+                        
+			case EPP_NRAEF:
+				icnt = 1025;
+				break;
+
+			case 0:
+				icnt = 1793;
+				break;
+                        
+			default:
+				icnt = 256;
+				break;
+			}
+			/* rx */
+			while (icnt > 0) {
+				cnt = icnt;
+				if (cnt > sizeof(eio))
+					cnt = sizeof(eio);
+				icnt -= cnt;
+				bytecnt += cnt;
+				if (parport_epp_read_data(eio, cnt) != cnt)
+					goto errret;
+			}
+			gettimeofday(&tv2, NULL);
+			usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+			if (usec >= 500000)
+				break;
+			usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2
+					 ms! */
+		}
+		for (icnt = 0; icnt < 256; icnt++) {
+			if (parport_epp_read_addr(&stat, 1) != 1)
+				goto errret;
+			if (!(stat & EPP_NREF))
+				break;
+			if (parport_epp_read_data(eio, 1) != 1)
+				goto errret;
+			bytecnt++;
+		}
+		break;
+
+	default:
+		exit(1);
+	}
+	state.access.bitrate = (bytecnt * 8000000ULL + usec / 2ULL) / usec;
+	state.access.bitrateby25 = (state.access.bitrate + 12) / 25;
+	errprintf(SEV_INFO, "autoprobed bitrate: %u\n", state.access.bitrate);
+	return;
+
+errret:
+	errprintf(SEV_FATAL, "Modem timeout\n");	
+}
+
+static void init2(struct ifconfig *ifcfg)
+{
+	ifconfigure(ifcfg);
+	/*
+	 * sigusr1 is used to display the current state
+	 */
+	if (signal(SIGUSR1, sig_usr1) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+	if (signal(SIGUSR2, sig_usr2) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+	if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+	if (signal(SIGTERM, sighandler) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+	/* start the modem */
+	state.access.state = tx_idle;
+	state.access.slotcnt = 1;
+}
+
+/* --------------------------------------------------------------------- */
+/*
+ * convert_call_entry is taken from the ax25 library
+ */
+
+static inline int convert_call_entry(const char *name, char *buf)
+{
+        int ct = 0;
+        int ssid = 0;
+        const char *p = name;
+        char c;
+
+        while (ct < 6) {
+                c = toupper(*p);
+                if (c == '-' || c == '\0')
+                        break;
+                if (!isalnum(c)) {
+			fprintf(stderr, "baycomepp: invalid symbol in callsign %s\n", name);
+                        return -1;
+                }
+                buf[ct] = c << 1;
+                p++;
+                ct++;
+        }
+        for ( ; ct < 6; ct++)
+                buf[ct] = ' ' << 1;
+        if (*p != '\0') {
+                p++;
+                if (sscanf(p, "%d", &ssid) != 1 || ssid < 0 || ssid > 15) {
+                        fprintf(stderr, "baycomepp: SSID must follow '-' and "
+				  "be numeric in the range 0-15 - %s\n", name);
+                        return -1;
+                }
+        }
+        buf[6] = ((ssid + '0') << 1) & 0x1E;
+        return 0;
+}
+
+/* --------------------------------------------------------------------- */
+
+int driver_init(int argc, char *argv[])
+{
+        static const struct option long_options[] = {
+		{ "epp", 0, 0, 0x400+MODE_EPP },
+		{ "ecp", 0, 0, 0x400+MODE_ECP },
+		{ "eppafsk", 0, 0, 0x400+MODE_EPPAFSK },
+		{ "eppconv", 0, 0, 0x400+MODE_EPPCONV },
+		{ "log", 0, 0, 'l' },
+		{ "kill", 0, 0, 'k' },
+		{ "mode", 1, 0, 'm' },
+		{ "port", 1, 0, 'p' },
+		{ "verbose", 0, 0, 'v' },
+		{ "no-daemon", 0, 0, 'n' },
+#ifdef HAVE_MKISS
+#ifdef HAVE_IFRNEWNAME
+		{ "ifname", 1, 0, 0x500 },
+#endif /* HAVE_IFRNEWNAME */
+		{ "hwaddr", 1, 0, 0x501 },
+		{ "ipaddr", 1, 0, 0x502 },
+		{ "netmask", 1, 0, 0x503 },
+		{ "broadcast", 1, 0, 0x504 },
+#else /* !HAVE_MKISS */
+		{ "iflink", 1, 0, 0x600 },
+#endif /* !HAVE_MKISS */
+		{ 0, 0, 0, 0}
+        };
+	struct ifconfig ifcfg = IFCONFIGINIT;
+	int c;
+	int err = 0;
+	pid_t pid;
+	int daemon = 1;
+	int mode = MODE_EPP;
+	int pfds[2];
+	unsigned iobase = 0x378;
+
+	printf("baycomepp v" VERSION " (c) 1998-2000,2002 by Thomas Sailer, HB9JNX/AE4WA"
+#ifdef EPPLONG
+	       "  (epplong)"
+#endif
+#ifdef EPPEMUL
+	       "  (eppemul)"
+#endif
+	       "\n");
+	/* initialize state struct */
+	memset(&state, 0, sizeof(state));
+	state.hrx.bufptr = state.hrx.buf;
+	state.config = (struct adapter_config) { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+	state.chaccesspar = (struct chaccesspar) { 10, 10, 40, 3, 0 };
+	/* parse arguments */
+	while ((c = getopt_long(argc, argv, "lknvm:p:caz", long_options, NULL)) != EOF)
+		switch (c) {
+		case 'l':
+			logging = 1;
+			break;
+
+		case 'k':
+			kill_baycomeppd();
+			exit(0);
+
+		case 'n':
+			daemon = 0;
+			logpackets = 1;
+			break;
+
+		case 'v':
+			verboselevel++;
+			break;
+
+		case 'm':
+			parseconfig(&state.config, optarg);
+			state.config.extstat = 1;
+			break;
+
+		case 'p': 
+			iobase = strtoul(optarg, NULL, 0);
+			if (iobase <= 0 || iobase >= 0x3f8)
+				err++;
+			break;
+
+		case 0x400+MODE_EPPAFSK:
+		case 'a':
+			mode = MODE_EPPAFSK;
+			break;
+
+		case 0x400+MODE_ECP:
+		case 'c':
+			mode = MODE_ECP;
+			break;
+
+		case 0x400+MODE_EPPCONV:
+		case 'z':
+			mode = MODE_EPPCONV;
+			break;
+
+		case 0x400+MODE_EPP:
+			mode = MODE_EPP;
+			break;
+
+#ifdef HAVE_MKISS
+		case 0x500: /* ifname */
+			if (strlen(optarg) >= IFNAMSIZ) {
+				fprintf(stderr, "baycomepp: ifname \"%s\"too long\n", optarg);
+				err++;
+			}
+			strncpy(ifcfg.ifname, optarg, sizeof(ifcfg.ifname)-1);
+			ifcfg.ifname[sizeof(ifcfg.ifname)-1] = 0;
+			break;
+
+		case 0x501: /* hwaddr */
+			if (convert_call_entry(optarg, ifcfg.hwaddr.ax25_call))
+				err++;
+			break;
+
+		case 0x502: /* ipaddr */
+			if (!inet_aton(optarg, &ifcfg.ipaddr)) {
+				fprintf(stderr, "baycomepp: invalid ip address \"%s\"\n", optarg);
+				err++;
+			}
+			break;
+
+		case 0x503: /* netmask */
+			if (!inet_aton(optarg, &ifcfg.netmask)) {
+				fprintf(stderr, "baycomepp: invalid netmask \"%s\"\n", optarg);
+				err++;
+			}
+			break;
+
+		case 0x504: /* broadcast */
+			if (!inet_aton(optarg, &ifcfg.broadcast)) {
+				fprintf(stderr, "baycomepp: invalid broadcast address \"%s\"\n", optarg);
+				err++;
+			}
+			break;
+
+#else /* !HAVE_MKISS */
+		case 0x600: /* iflink */
+			strncpy(ifcfg.ifname, optarg, sizeof(ifcfg.ifname)-1);
+			ifcfg.ifname[sizeof(ifcfg.ifname)-1] = 0;
+			break;
+#endif /* !HAVE_MKISS */
+
+		default:
+			err++;
+			break;
+		}
+	if (err) {
+		fprintf(stderr, "usage: baycomepp [-c <cfgfilename>] [-l] [-k] [-n] [-v] [-p <portaddr>] [-m <modestr>]\n"
+#ifdef HAVE_MKISS
+			"                 [--ifname=<name>] [--hwaddr=<call>] [--ipaddr=<ip>]\n"
+			"                 [--netmask=<ip>] [--broadcast=<ip>]\n"
+#else /* !HAVE_MKISS */
+			"                 [--iflink=<name>]\n"
+#endif /* !HAVE_MKISS */
+			"  mode options:\n"
+			"    intclk    uses FPGA internal clock; DON'T use if an external osc is on board\n"
+			"    extclk    uses the external oscillator; recommended if the internal modem is used\n"
+			"    intmodem  uses the internal modem\n"
+			"    extmodem  uses a DF9IC type modem connected to the high speed modem connector\n"
+			"    fclk=     sets the FPGA clock frequency (default 19.6666 MHz)\n"
+			"    bitrate=  sets the bitrate for the FSK modem\n"
+			"    loopback  sets an internal modem loopback\n"
+			"    extstat   allows extended status readback\n"
+			"    noextstat disallows extended status readback\n");
+		exit(1);
+	}
+	if (parport_init_direct(iobase))
+		errprintf(SEV_FATAL, "no parport found at 0x%x\n", iobase);	
+	init(mode);
+	if (!daemon) {
+		setsid(); /* become a process group leader and drop controlling terminal */
+		fclose(stdin); /* no more standard in */
+		if (logging)
+			openlog(progname, LOG_PID, LOG_DAEMON);
+		init2(&ifcfg);
+		return mode;
+	}
+	if (pipe(pfds)) {
+		errstr(SEV_FATAL, "pipe\n");
+		exit(1);
+	}
+	switch (pid = fork()) {
+	case -1:
+		errstr(SEV_FATAL, "fork\n");
+		exit(1);
+
+	case 0: /* child process */
+		close(pfds[0]);
+		setsid(); /* become a process group leader and drop controlling terminal */
+		fclose(stdin); /* no more standard in */
+		if (logging)
+			openlog(progname, LOG_PID, LOG_DAEMON);
+		init2(&ifcfg);
+		if (write(pfds[1], &mode, sizeof(mode)) != sizeof(mode))
+			errstr(SEV_ERROR, "write\n");
+		close(pfds[1]);
+		return mode;
+
+	default:
+		close(pfds[1]);
+		err = read(pfds[0], &c, sizeof(c));
+		if (err != sizeof(c))
+			errprintf(SEV_FATAL, "baycomepp: modem init failed (read: %d errno: %d %s)\n",
+				  err, errno, strerror(errno));
+		write_pid(pid);
+		fprintf(stderr, "baycomepp: child pid: %u\n", pid);
+		break;
+	}
+	exit(0);
+}
diff --git a/udriver/drvresident.c b/udriver/drvresident.c
new file mode 100644
index 0000000..20acc8f
--- /dev/null
+++ b/udriver/drvresident.c
@@ -0,0 +1,1109 @@
+/*****************************************************************************/
+
+/*
+ *      drvresident.c  -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ *
+ *      Copyright (C) 1998-2000, 2002  Thomas Sailer (sailer at ife.ee.ethz.ch)
+ *
+ *      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 of the License, 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.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <dlfcn.h>
+
+#include "drv.h"
+#include "parport.h"
+
+/* ---------------------------------------------------------------------- */
+
+int logging = 0;
+int logpackets = 0;
+struct baycomepp_state state;
+const char *progname = "baycomepp";
+
+/* --------------------------------------------------------------------- */
+/*
+ * Logging functions
+ */
+
+void errprintf(int severity, const char *fmt, ...)
+{
+	va_list args;
+
+	va_start(args, fmt);
+	if (logging) {
+		char tmp[512];
+		vsnprintf(tmp, sizeof(tmp), fmt, args);
+		syslog(severity, tmp);
+	} else {
+		fprintf(stderr, "baycomepp[%u]: ", getpid());
+		vfprintf(stderr, fmt, args);
+	}
+	va_end(args);
+	if (severity <= SEV_FATAL)
+		exit(1);
+}
+
+/* --------------------------------------------------------------------- */
+
+void errstr(int severity, const char *st)
+{
+	errprintf(severity, "%s: %s\n", st, strerror(errno));
+}
+
+/* --------------------------------------------------------------------- */
+
+void epp_error(const char *msg)
+{
+	errprintf(SEV_FATAL, msg);
+}
+
+/* --------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+const u_int16_t crc_ccitt_table[0x100] = {
+        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* --------------------------------------------------------------------- */
+
+extern inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = 0xffff;
+
+        for (;len>0;len--)
+                crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+        crc ^= 0xffff;
+	return crc;
+}
+
+extern inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        *buffer++ = crc;
+        *buffer++ = crc >> 8;
+}
+
+extern inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+        u_int16_t crc = calc_crc_ccitt(buffer, len);
+        return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define ADDRXCH(x)                        \
+do {                                      \
+	state.kissout.b[wr] = (x);           \
+	wr = (wr + 1) % KISSOUTBUF_SIZE;  \
+	if (wr == rd)                     \
+		goto errout;              \
+        total++;                          \
+} while (0);
+
+static size_t rxpacket(const struct iovec *vector, size_t count)
+{
+	u_int8_t *bp;
+	size_t len;
+	size_t total = 0;
+	unsigned wr = state.kissout.wr;
+	unsigned rd = state.kissout.rd;
+
+	ADDRXCH(KISS_FEND);
+	for (; count > 0; count--, vector++) {
+		for (bp = vector->iov_base, len = vector->iov_len; len > 0; len--, bp++) {
+			if (*bp == KISS_FEND) {
+				ADDRXCH(KISS_FESC);
+				ADDRXCH(KISS_TFEND);
+			} else if (*bp == KISS_FESC) {
+				ADDRXCH(KISS_FESC);
+				ADDRXCH(KISS_TFESC);
+			} else {
+				ADDRXCH(*bp);
+			}
+		}
+	}
+	if (total <= 1)
+		return 0;
+	ADDRXCH(KISS_FEND);
+	state.kissout.wr = wr;
+	state.stat.kiss_out++;
+	return total;
+
+  errout:
+	state.stat.kiss_outerr++;
+	return 0;
+}
+
+#undef ADDRXCH
+
+/* --------------------------------------------------------------------- */
+/*
+ * high performance HDLC encoder
+ * yes, it's ugly, but generates pretty good code
+ */
+
+#define ENCODEITERA(j)                         \
+({                                             \
+        if (!(notbitstream & (0x1f0 << j)))    \
+                goto stuff##j;                 \
+  encodeend##j:                                \
+})
+
+#define ENCODEITERB(j)                                          \
+({                                                              \
+  stuff##j:                                                     \
+        bitstream &= ~(0x100 << j);                             \
+        bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) |        \
+                ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1);  \
+        numbit++;                                               \
+        notbitstream = ~bitstream;                              \
+        goto encodeend##j;                                      \
+})
+
+static int hdlc_enqueue(u_int8_t *pkt, int len)
+{
+        unsigned bitstream, notbitstream, bitbuf, numbit, crc;
+	u_int8_t crcarr[2];
+	unsigned wr = state.htx.wr;
+
+	state.htx.buf[wr] = 0x7e;
+	wr = (wr + 1) % TXBUFFER_SIZE;
+	if (wr == state.htx.rd)
+		return -1;
+	crc = calc_crc_ccitt(pkt, len);
+	crcarr[0] = crc;
+	crcarr[1] = crc >> 8;
+	bitstream = bitbuf = numbit = 0;
+	while (len > -2) {
+		bitstream >>= 8;
+		bitstream |= ((unsigned int)*pkt) << 8;
+		bitbuf |= ((unsigned int)*pkt) << numbit;
+		notbitstream = ~bitstream;
+		pkt++;
+		len--;
+		if (!len)
+			pkt = crcarr;
+		ENCODEITERA(0);
+		ENCODEITERA(1);
+		ENCODEITERA(2);
+		ENCODEITERA(3);
+		ENCODEITERA(4);
+		ENCODEITERA(5);
+		ENCODEITERA(6);
+		ENCODEITERA(7);
+		goto enditer;
+		ENCODEITERB(0);
+		ENCODEITERB(1);
+		ENCODEITERB(2);
+		ENCODEITERB(3);
+		ENCODEITERB(4);
+		ENCODEITERB(5);
+		ENCODEITERB(6);
+		ENCODEITERB(7);
+	enditer:
+		numbit += 8;
+		while (numbit >= 8) {
+			state.htx.buf[wr] = bitbuf;
+			wr = (wr + 1) % TXBUFFER_SIZE;
+			if (wr == state.htx.rd)
+				return -1;
+			bitbuf >>= 8;
+			numbit -= 8;
+		}
+	}
+	bitbuf |= 0x7e7e << numbit;
+	numbit += 16;
+	while (numbit >= 8) {
+		state.htx.buf[wr] = bitbuf;
+		wr = (wr + 1) % TXBUFFER_SIZE;
+		if (wr == state.htx.rd)
+			return -1;
+		bitbuf >>= 8;
+		numbit -= 8;
+	}
+	state.htx.wr = wr;
+	return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void do_rxpacket(void)
+{
+	static const u_int8_t kissdata = KISS_CMD_DATA;
+	struct iovec iov[2];
+	char buf[512];
+
+	if (state.hrx.bufcnt < 4) 
+		return;
+	if (!check_crc_ccitt(state.hrx.buf, state.hrx.bufcnt)) 
+		return;
+	iov[0].iov_len = 1;
+	iov[0].iov_base = &kissdata;
+	iov[1].iov_len = state.hrx.bufcnt-2;
+	iov[1].iov_base = state.hrx.buf;
+	rxpacket(iov, 2);
+	state.stat.pkt_in++;
+	if (!logpackets)
+		return;
+	if (snprintpkt(buf, sizeof(buf), state.hrx.buf, state.hrx.bufcnt-2) != -1)
+		printf("rx: %s", buf);
+}
+
+#define DECODEITERA(j)                                                        \
+({                                                                            \
+        if (!(notbitstream & (0x0fc << j)))              /* flag or abort */  \
+                goto flgabrt##j;                                              \
+        if ((bitstream & (0x1f8 << j)) == (0xf8 << j))   /* stuffed bit */    \
+                goto stuff##j;                                                \
+  enditer##j:                                                                 \
+})
+
+#define DECODEITERB(j)                                                                 \
+({                                                                                     \
+  flgabrt##j:                                                                          \
+        if (!(notbitstream & (0x1fc << j))) {              /* abort received */        \
+                stat = 0;                                                              \
+                goto enditer##j;                                                       \
+        }                                                                              \
+        if ((bitstream & (0x1fe << j)) != (0x0fc << j))   /* flag received */          \
+                goto enditer##j;                                                       \
+        if (stat)                                                                      \
+                do_rxpacket();                                                         \
+        state.hrx.bufcnt = 0;                                                          \
+        state.hrx.bufptr = state.hrx.buf;                                              \
+        stat = 1;                                                                      \
+        numbits = 7-j;                                                                 \
+        goto enditer##j;                                                               \
+  stuff##j:                                                                            \
+        numbits--;                                                                     \
+        bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);        \
+        goto enditer##j;                                                               \
+})
+        
+/* --------------------------------------------------------------------- */
+
+static void hdlc_receive(u_int8_t *pkt, int len)
+{
+        unsigned int bitbuf, notbitstream, bitstream, numbits, stat;
+
+	state.stat.bytes_in += len;
+	numbits = state.hrx.numbits;
+	stat = state.hrx.state;
+	bitstream = state.hrx.bitstream;
+	bitbuf = state.hrx.bitbuf;
+	for (; len > 0; len--, pkt++) {
+		bitstream >>= 8;
+		bitstream |= ((unsigned int)*pkt) << 8;
+		bitbuf >>= 8;
+		bitbuf |= ((unsigned int)*pkt) << 8;
+		numbits += 8;
+		notbitstream = ~bitstream;
+		DECODEITERA(0);
+		DECODEITERA(1);
+		DECODEITERA(2);
+		DECODEITERA(3);
+		DECODEITERA(4);
+		DECODEITERA(5);
+		DECODEITERA(6);
+		DECODEITERA(7);
+		goto enddec;
+		DECODEITERB(0);
+		DECODEITERB(1);
+		DECODEITERB(2);
+		DECODEITERB(3);
+		DECODEITERB(4);
+		DECODEITERB(5);
+		DECODEITERB(6);
+		DECODEITERB(7);
+	enddec:
+		while (stat && numbits >= 8) {
+			if (state.hrx.bufcnt >= RXBUFFER_SIZE) {
+				stat = 0;
+			} else {
+				*(state.hrx.bufptr)++ = bitbuf >> (16-numbits);
+				state.hrx.bufcnt++;
+				numbits -= 8;
+			}
+		}
+	}
+        state.hrx.numbits = numbits;
+	state.hrx.state = stat;
+	state.hrx.bitstream = bitstream;
+	state.hrx.bitbuf = bitbuf;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static u_int16_t random_seed;
+
+extern inline u_int16_t random_num(void)
+{
+	random_seed = 28629 * random_seed + 157;
+	return random_seed;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * here we do the channel access algorithm, and process calibration bytes
+ */
+
+extern inline void arbitrate(void)
+{
+	if (state.htx.rd == state.htx.wr)
+		return;
+	if (!state.chaccesspar.fulldup) {
+		if (state.access.slotcnt > 0)
+			return;
+		state.access.slotcnt = state.chaccesspar.slottime;
+		if (state.access.dcd)
+			return;
+		if ((random_num() % 256) > state.chaccesspar.ppersist)
+			return;
+	}
+	state.access.state = tx_keyup;
+	state.access.flagcnt = (state.access.bitrateby25 * state.chaccesspar.txdelay) >> 5;
+	state.stat.ptt_keyed++;
+}
+
+static int hdlc_transmit(u_int8_t *pkt, int len)
+{
+	int ret = 0, i;
+
+	while (len > 0) {
+		switch (state.access.state) {
+		case tx_keyup:
+			i = state.access.flagcnt;
+			if (i <= 0) {
+				state.access.state = tx_data;
+				break;
+			}
+			if (i > len)
+				i = len;
+			state.access.flagcnt -= i;
+			memset(pkt, 0x7e, i);
+			ret += i;
+			pkt += i;
+			len -= i;
+			break;
+			
+		case tx_data:
+			if (state.htx.rd == state.htx.wr) {
+				state.access.state = tx_tail;
+				state.access.flagcnt = (state.access.bitrateby25 * state.chaccesspar.txtail) >> 5;
+				break;
+			}
+			i = ((state.htx.rd > state.htx.wr) ? TXBUFFER_SIZE : state.htx.wr) - state.htx.rd;
+			if (i > len)
+				i = len;
+			memcpy(pkt, state.htx.buf + state.htx.rd, i);
+			state.htx.rd = (state.htx.rd + i) % TXBUFFER_SIZE;
+			ret += i;
+			pkt += i;
+			len -= i;
+			break;			
+
+		case tx_tail:
+			i = state.access.flagcnt;
+			if (i <= 0) {
+				if (state.access.ptt)
+					return ret;
+				state.access.state = tx_idle;
+				state.access.slotcnt = state.chaccesspar.slottime;
+				break;
+			}
+			if (i > len)
+				i = len;
+			state.access.flagcnt -= i;
+			memset(pkt, 0x7e, i);
+			ret += i;
+			pkt += i;
+			len -= i;
+			break;
+
+		default:
+			arbitrate();
+			if (state.access.state == tx_keyup)
+				break;
+			i = state.access.calib;
+			if (i <= 0)
+				return ret;
+			if (i > len)
+				i = len;
+			state.access.calib -= i;
+			memset(pkt, 0, i);
+			ret += i;
+			pkt += i;
+			len -= i;
+			break;
+		}
+	}
+	return ret;
+}
+
+/* --------------------------------------------------------------------- */
+
+void sighandler(int sig)
+{
+	errprintf(LOG_INFO, "terminating on receiving signal %i\n", sig);
+	reset_modem();
+	exit(0);
+}
+
+/* --------------------------------------------------------------------- */
+
+void sig_usr2(int sig)
+{
+	if (state.access.calib > 0) {
+		errprintf(LOG_DEBUG, "terminating calibration\n");
+		state.access.calib = 0;
+	} else {
+		errprintf(LOG_DEBUG, "calibrating for 1min\n");
+		state.access.calib = state.access.bitrate * (60/8);
+	}
+	if (signal(SIGUSR2, sig_usr2) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+}
+
+/* --------------------------------------------------------------------- */
+
+void sig_usr1(int sig)
+{
+	printf("Statistics:\n  KISS out: %ld errors: %ld  in: %ld errors: %ld\n"
+	       "  Packets out: %ld  in: %ld\n"
+	       "  Bytes out: %ld  in: %ld\n"
+	       "  PTT:%c  DCD:%c  PTT keyed: %ld\n"
+	       "  ch par: txdel %u slot %u ppersist %u txtail %u fulldup %u\n"
+	       "  status 0x%02x  icnt %d %d %d  ocnt %d %d %d  IntRate: %d\n",
+	       state.stat.kiss_out, state.stat.kiss_outerr,
+	       state.stat.kiss_in, state.stat.kiss_inerr,
+	       state.stat.pkt_out, state.stat.pkt_in, 
+	       state.stat.bytes_out, state.stat.bytes_in,
+	       state.access.ptt ? 'P' : '-', state.access.dcd ? 'D' : '-', state.stat.ptt_keyed,
+	       state.chaccesspar.txdelay, state.chaccesspar.slottime, state.chaccesspar.ppersist,
+	       state.chaccesspar.txtail, state.chaccesspar.fulldup,
+	       state.stat.status, state.stat.icnt1, state.stat.icnt2, state.stat.icnt3,
+	       state.stat.ocnt1, state.stat.ocnt2, state.stat.ocnt3, state.stat.intcnt);
+
+	printf("TX: rd %d wr %d  st: %d  slotcnt: %d\n",
+	       state.htx.rd, state.htx.wr, state.access.state, state.access.slotcnt);
+
+	if (signal(SIGUSR1, sig_usr1) == SIG_ERR)
+		errstr(SEV_ERROR, "signal");
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Process KISS io
+ */
+
+extern inline void process_pkt(u_int8_t *pkt, unsigned int len)
+{
+	char buf[512];
+
+	if (len < 2)
+		return;
+	switch (pkt[0]) {
+	case KISS_CMD_DATA:
+		if (hdlc_enqueue(pkt+1, len-1))
+			state.stat.pkt_outerr++;
+		else
+			state.stat.pkt_out++;
+		if (!logpackets)
+			return;
+		if (snprintpkt(buf, sizeof(buf), pkt+1, len-1) != -1)
+			printf("tx: %s", buf);
+		return;
+
+	case KISS_CMD_TXDELAY:
+		state.chaccesspar.txdelay = pkt[1];
+		errprintf(SEV_INFO, "kiss: txdelay = %ums\n", state.chaccesspar.txdelay*10);
+		return;
+			
+	case KISS_CMD_SLOTTIME:
+		state.chaccesspar.slottime = pkt[1];
+		errprintf(SEV_INFO, "kiss: slottime = %ums\n", state.chaccesspar.slottime*10);
+		return;
+
+	case KISS_CMD_PPERSIST:
+		state.chaccesspar.ppersist = pkt[1];
+		errprintf(SEV_INFO, "kiss: ppersist = %u/256\n", state.chaccesspar.ppersist);
+		return;
+
+	case KISS_CMD_TXTAIL:
+		state.chaccesspar.txtail = pkt[1];
+		errprintf(SEV_INFO, "kiss: txtail = %ums\n", state.chaccesspar.txtail*10);
+		return;
+
+	case KISS_CMD_FULLDUP:
+		state.chaccesspar.fulldup = !!pkt[1];
+		errprintf(SEV_INFO, "kiss: %sduplex\n", state.chaccesspar.fulldup ? "full" : "half");
+		return;
+
+	default:
+		errprintf(SEV_WARNING, "unknown kiss packet: 0x%02x 0x%02x\n", pkt[0], pkt[1]);
+		return;
+	}
+}
+
+/* --------------------------------------------------------------------- */
+
+/* we decode on the fly in place */
+
+extern inline void kiss_decode(u_int8_t *b, int len)
+{
+	int nlen = 0;
+	u_int8_t *p1 = b, *p2 = b;
+
+      	while (len > 0) {
+		if (*p1 != KISS_FESC) {
+			*p2++ = *p1++;
+			nlen++;
+			len--;
+			continue;
+		}
+		if (len < 2)
+			goto err; /* invalid escape */
+		if (p1[1] == KISS_TFEND)
+			*p2++ = KISS_FEND;
+		else if (p1[1] == KISS_TFESC)
+			*p2++ = KISS_FESC;
+		else
+			goto err; /* invalid escape */
+		nlen++;
+		p1 += 2;
+		len -= 2;
+	}
+	process_pkt(b, nlen);
+	state.stat.kiss_in++;
+	return;
+ err:
+	state.stat.kiss_inerr++;
+}
+
+/* --------------------------------------------------------------------- */
+
+extern inline void kiss_read(void)
+{
+	char *cp1, *cp2, *endp;
+	int i;
+
+	if (state.kissin.ptr >= KISSINBUF_SIZE)  /* discard oversized packets */
+		state.kissin.ptr = 0;
+	i = read(state.kissfd, state.kissin.b + state.kissin.ptr, KISSINBUF_SIZE - state.kissin.ptr);
+	if (i < 0) {
+		if (errno == EAGAIN)
+			return;
+		errstr(SEV_FATAL, "read");
+	}
+	if (i == 0)
+		return;
+	state.kissin.ptr += i;
+	endp = state.kissin.b + state.kissin.ptr;
+	cp1 = memchr(state.kissin.b, KISS_FEND, state.kissin.ptr);
+	while (cp1) {
+		cp2 = memchr(cp1+1, KISS_FEND, endp - cp1 - 1);
+		if (!cp2) {
+			state.kissin.ptr = endp-cp1;
+			memmove(state.kissin.b, cp1, state.kissin.ptr);
+			return;
+		}
+		kiss_decode(cp1+1, cp2-cp1-1);
+		cp1 = cp2;
+	}
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void kiss_write(void)
+{
+	struct iovec iov[2];
+	int i;
+
+	if (state.kissout.rd == state.kissout.wr)
+		return;
+	if (state.kissout.rd > state.kissout.wr) {
+		iov[0].iov_len = KISSOUTBUF_SIZE - state.kissout.rd;
+		iov[0].iov_base = state.kissout.b + state.kissout.rd;
+		iov[1].iov_len = state.kissout.wr;
+		iov[1].iov_base = state.kissout.b;
+		i = writev(state.kissfd, iov, 2);
+	} else
+		i = write(state.kissfd, state.kissout.b + state.kissout.rd, 
+			  state.kissout.wr - state.kissout.rd);
+	if (i < 0) {
+		if (errno == EAGAIN)
+			return;
+		errstr(SEV_FATAL, "read");
+	}
+	state.kissout.rd = (state.kissout.rd + i) % KISSOUTBUF_SIZE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void handle_kiss(void)
+{
+	kiss_read();
+	kiss_write();
+	/* reschedule */
+	usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+	state.stat.intcnt++;
+	state.access.slotcnt--;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP Mode
+ */
+
+/* _MUST_ not return! */
+
+static void epp_modem(void)
+{
+	unsigned char eio[1024];
+	u_int8_t stat;
+	int cnt, icnt, ocnt, icntx, ocntx;
+	
+	/* reset modem */
+	eio[0] = 0;
+	eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine TX fifo size from status bits */
+		switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+		case EPP_NTHF:
+			ocntx = 2048 - 256;
+			break;
+
+		case EPP_NTAEF:
+			ocntx = 2048 - 1793;
+			break;
+
+		case 0:
+			ocntx = 0;
+			break;
+
+		default:
+			ocntx = 2048 - 1025;
+			break;
+		}
+		/* determine RX fifo size from status bits */
+		switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+		case EPP_NRHF:
+			icntx = 0;
+			break;
+                
+		case EPP_NRAEF:
+			icntx = 1025;
+			break;
+                
+		case 0:
+			icntx = 1793;
+			break;
+                
+		default:
+			icntx = 256;
+			break;
+		}
+		/* try to determine the FIFO count if in extended mode */
+		if (state.config.extstat) {
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+			icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			if (parport_epp_read_addr(eio, 2) != 2)
+				goto errret;
+			ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+			eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+			if (parport_epp_write_addr(eio, 1) != 1)
+				goto errret;
+			ocnt = 16384 - (ocnt & 0x7fff);
+			icnt &= 0x7fff;
+		} else {
+			ocnt = ocntx;
+			icnt = icntx;
+		}
+		/* update status */
+		state.stat.icnt3 = state.stat.icnt1;
+		state.stat.icnt1 = icnt;
+		state.stat.icnt2 = icntx;
+		state.stat.ocnt3 = state.stat.ocnt1;
+		state.stat.ocnt1 = ocnt;
+		state.stat.ocnt2 = ocntx;
+		state.stat.status = stat;
+		state.access.dcd = !(stat & EPP_DCDBIT);
+		state.access.ptt = !!(stat & EPP_PTTBIT);
+		/* rx */
+		while (icnt > 0) {
+			cnt = icnt;
+			if (cnt > sizeof(eio))
+				cnt = sizeof(eio);
+			icnt -= cnt;
+			if (parport_epp_read_data(eio, cnt) != cnt)
+				goto errret;
+			hdlc_receive(eio, cnt);
+		}
+		/* tx */
+		if (ocnt > 0) {
+			if (ocnt > sizeof(eio))
+				ocnt = sizeof(eio);
+			cnt = hdlc_transmit(eio, ocnt);
+			if (parport_epp_write_data(eio, cnt) != cnt)
+				goto errret;
+		}
+		/* KISS and reschedule */
+		handle_kiss();
+	}
+errret:
+	errprintf(SEV_FATAL, "Modem timeout\n");	
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * ECP Mode
+ */
+
+/* _MUST_ not return! */
+
+static void ecp_modem(void)
+{
+	u_int8_t data[1024];
+	unsigned char stat[6];
+        int cnt, icnt, ocnt;
+	
+	data[0] = 0xaf;  /* reset register: all reset */
+	data[1] = 0xa0;  /* reset register: terminate reset */
+	data[2] = 0xb0;
+	if (parport_ecp_write_addr(data, 3) != 3)
+		goto errret;
+	for (;;) {
+		data[0] = 0x81;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		if (parport_ecp_read_data(stat, 6) != 6)
+			goto errret;
+		data[0] = 0x80;
+		if (parport_ecp_write_addr(data, 1) != 1)
+			goto errret;
+		icnt = ((unsigned)stat[2] << 8) | stat[1];
+		ocnt = ((unsigned)stat[4] << 8) | stat[3];
+		/* update status */
+		state.stat.icnt3 = state.stat.icnt2;
+		state.stat.icnt2 = state.stat.icnt1;
+		state.stat.icnt1 = icnt;
+		state.stat.ocnt3 = state.stat.ocnt2;
+		state.stat.ocnt2 = state.stat.ocnt1;
+		state.stat.ocnt1 = ocnt;
+		state.stat.status = stat[0];
+		state.access.dcd = !(stat[0] & 0x80);
+		state.access.ptt = !(stat[0] & 0x40);
+		/* read */
+		while (icnt > 0) {
+			cnt = icnt;
+			if (cnt > sizeof(data))
+				cnt = sizeof(data);
+			icnt -= cnt;
+			data[0] = 0xc0 | (cnt & 0xf);
+			data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+			data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+			if (parport_ecp_write_addr(data, 3) != 3)
+				goto errret;
+			if (parport_ecp_read_data(data, cnt) != cnt)
+				goto errret;
+			hdlc_receive(data, cnt);
+		}
+		/* write */
+		if (ocnt < 8192) { /* fixme */
+			cnt = 8192 - ocnt;
+			if (cnt > sizeof(data))
+				cnt = sizeof(data);
+			cnt = hdlc_transmit(data, cnt);
+			if (parport_ecp_write_data(data, cnt) != cnt)
+				goto errret;
+		}
+		/* KISS and reschedule */
+		handle_kiss();
+	}
+errret:
+	errprintf(SEV_FATAL, "Modem timeout\n");	
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP AFSK Mode
+ */
+
+/* _MUST_ not return! */
+
+static void eppafsk_modem(void)
+{
+	unsigned char eio[32];
+	u_int8_t stat;
+        int cnt, icnt, ocnt;
+
+	/* reset modem */
+	eio[0] = 0x00;
+	eio[1] = 0x18;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+	for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+		/* determine the FIFO count */
+		eio[0] = 0x19;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		ocnt = 0x10 - (eio[0] & 0x1f);
+		eio[0] = 0x1a;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		if (parport_epp_read_addr(eio, 1) != 1)
+			goto errret;
+		icnt = eio[0] & 0x1f;
+		eio[0] = 0x18;
+		if (parport_epp_write_addr(eio, 1) != 1)
+			goto errret;
+		/* update status */
+		state.stat.icnt3 = state.stat.icnt2;
+		state.stat.icnt2 = state.stat.icnt1;
+		state.stat.icnt1 = icnt;
+		state.stat.ocnt3 = state.stat.ocnt2;
+		state.stat.ocnt2 = state.stat.ocnt1;
+		state.stat.ocnt1 = ocnt;
+		state.stat.status = stat;
+		state.access.dcd = !(stat & 0x80);
+		state.access.ptt = !(stat & 0x40);
+		/* rx */
+		if (icnt > 0) {
+			if (parport_epp_read_data(eio, icnt) != icnt)
+				goto errret;
+			hdlc_receive(eio, icnt);
+		}
+		/* tx */
+		if (ocnt > 0) {
+			cnt = hdlc_transmit(eio, ocnt);
+			if (parport_epp_write_data(eio, cnt) != cnt)
+				goto errret;
+		}
+		/* KISS and reschedule */
+		handle_kiss();
+	}
+errret:
+	errprintf(SEV_FATAL, "Modem timeout\n");	
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP conventional Mode
+ */
+
+/* _MUST_ not return! */
+
+static void eppconv_modem(void)
+{
+	unsigned char eio[1024];
+        u_int8_t stat;
+        int cnt, i, icnt, ocnt;
+        
+        /* reset modem */
+	eio[0] = 0;
+	eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+	if (parport_epp_write_addr(eio, 2) != 2)
+		goto errret;
+        for (;;) {
+		if (parport_epp_read_addr(&stat, 1) != 1)
+			goto errret;
+                /* determine TX fifo size from status bits */
+                switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+                case EPP_NTHF:
+                        ocnt = 2048 - 256;
+                        break;
+
+                case EPP_NTAEF:
+                        ocnt = 2048 - 1793;
+                        break;
+
+                case 0:
+                        ocnt = 0;
+                        break;
+
+                default:
+                        ocnt = 2048 - 1025;
+                        break;
+                }
+                /* determine RX fifo size from status bits */
+                switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+                case EPP_NRHF:
+                        icnt = 0;
+                        break;
+                
+                case EPP_NRAEF:
+                        icnt = 1025;
+                        break;
+                
+                case 0:
+                        icnt = 1793;
+                        break;
+                
+                default:
+                        icnt = 256;
+                        break;
+                }
+                /* update status */
+                state.stat.icnt3 = state.stat.icnt2;
+                state.stat.icnt2 = state.stat.icnt1;
+                state.stat.icnt1 = icnt;
+                state.stat.ocnt3 = state.stat.ocnt2;
+                state.stat.ocnt2 = state.stat.ocnt1;
+                state.stat.ocnt1 = ocnt;
+                state.stat.status = stat;
+                state.access.dcd = !(stat & EPP_DCDBIT);
+                state.access.ptt = !!(stat & EPP_PTTBIT);
+                /* rx */
+                if (icnt == 0 && state.access.bitrate < 100000) {
+                        cnt = 0;
+                        i = (state.access.bitrate < 50000) ? 256 : 128;
+                        while (i > 0 && cnt < sizeof(eio) && stat & EPP_NREF) {
+				if (parport_epp_read_data(eio+cnt, 1) != 1)
+					goto errret;
+				cnt++;
+                                i--;
+				if (parport_epp_read_addr(&stat, 1) != 1)
+					goto errret;
+                        }
+                        hdlc_receive(eio, cnt);
+                }
+                while (icnt > 0) {
+                        cnt = icnt;
+                        if (cnt > sizeof(eio))
+                                cnt = sizeof(eio);
+                        icnt -= cnt;
+ 			if (parport_epp_read_data(eio, cnt) != cnt)
+				goto errret;
+                        hdlc_receive(eio, cnt);
+                }
+                /* tx */
+                if (ocnt > 0) {
+                        if (ocnt > sizeof(eio))
+                                ocnt = sizeof(eio);
+                        cnt = hdlc_transmit(eio, ocnt);
+			if (parport_epp_write_data(eio, cnt) != cnt)
+				goto errret;
+                }
+                /* KISS and reschedule */
+                handle_kiss();
+        }
+errret:
+	errprintf(SEV_FATAL, "Modem timeout\n");	
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+	void *so;
+	int (*drvinit)(int argc, char *argv[]);
+	int mode;
+
+	if (!(so = dlopen("baycomfpga_init.so", RTLD_NOW)) || !(drvinit = dlsym(so, "driver_init"))) {
+		fprintf(stderr, "baycomepp: cannot load initialization code from baycomfpga_init.so\n");
+		exit(1);
+	}
+	mode = drvinit(argc, argv);
+	dlclose(so);
+	switch(mode) {
+	case MODE_EPP:
+		epp_modem();
+	case MODE_ECP:
+		ecp_modem();
+	case MODE_EPPAFSK:
+		eppafsk_modem();
+	case MODE_EPPCONV:
+		eppconv_modem();
+	}
+	exit(1);
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/w9xdrv/MAKEFILE b/w9xdrv/MAKEFILE
new file mode 100644
index 0000000..1210327
--- /dev/null
+++ b/w9xdrv/MAKEFILE
@@ -0,0 +1,72 @@
+BUILD_TYPE=base
+!INCLUDE $(BASEDIR)\inc\master.mk
+
+# sample make file for building vxd virtual device for Windows
+
+NAME = eppflex
+
+#       Definitions for the debug level 
+
+!ifdef DEBUG
+DDEBUG  =-DDEBLEVEL=1 -DDEBUG
+!else
+DDEBUG  =-DDEBLEVEL=0
+!endif
+
+#       Definitions for MASM 6 Assembler
+
+CC         = cl
+ASM        = ml
+ASMENV     = ML
+CFLAGS     = -DWIN32 -DCON -Di386 -D_X86_ -D_NTWIN -W3 -Gs -D_DEBUG -Zi -I$(INC32)
+CVXDFLAGS  = -Oi -Zdp -Gs -c -DIS_32 -Zl -DDEBLEVEL=1 -DDEBUG -DWANTVXDWRAPS=1 -I$(INC32)
+LFLAGS     = -machine:i386 -debug:notmapped,full -debugtype:cv -VXD $(BASEDIR)\lib\i386\free\vxdwraps.clb
+AFLAGS     = -coff -DBLD_COFF -DIS_32 -W2 -Zd -c -Cx -DMASM6 -DDEBLEVEL=1 -DDEBUG -I$(INC32)
+
+#       MASM 6 only inference rules
+
+.asm{obj\i386}.obj:
+	set $(ASMENV)=$(AFLAGS)
+	$(ASM) -Fo$*.obj $< 
+
+.c{obj\i386}.obj:
+	$(CC) $(CVXDFLAGS) -Fo$@ %s
+
+.rc{obj\i386}.res:
+	$(RC16B) -r -i $(INC16);$(INC32) -fo$@ %s
+
+all : obj\i386\$(NAME).vxd
+
+OBJS = obj\i386\eppflex.obj obj\i386\eppfctrl.obj
+
+obj\i386\vxdstub.exe: obj\i386\vxdstub.obj
+!ifndef PASS0ONLY
+	@echo link -OUT:$@
+	$(LINK16) obj\i386\vxdstub.obj;
+!endif
+
+obj\i386\generic.obj: generic.asm
+
+obj\i386\$(NAME).vxd: $(NAME).def $(OBJS) obj\i386\$(NAME).res
+!ifndef PASS0ONLY
+		@echo link -OUT:$@
+        link @<<obj\i386\$(NAME).lnk
+$(LFLAGS) 
+-ignore:4078 -ignore:4039
+/OUT:obj\i386\$(NAME).vxd
+/MAP:obj\i386\$(NAME).map
+/DEF:$(NAME).def
+$(OBJS)
+<<
+	$(DDKROOT)\bin\Win98\adrc2vxd.exe obj\i386\$(NAME).vxd obj\i386\$(NAME).res
+        mapsym -s -o obj\i386\$(NAME).sym obj\i386\$(NAME).map
+!endif
+
+clean:
+    - at if exist obj\i386\*.obj del obj\i386\*.obj
+    - at if exist obj\i386\*.vxd del obj\i386\*.vxd
+    - at if exist obj\i386\*.exp del obj\i386\*.exp
+    - at if exist obj\i386\*.lib del obj\i386\*.lib
+    - at if exist obj\i386\*.map del obj\i386\*.map
+    - at if exist obj\i386\*.sym del obj\i386\*.sym
+    - at if exist *.bak del *.bak
diff --git a/w9xdrv/Makefile.am b/w9xdrv/Makefile.am
new file mode 100644
index 0000000..12bf6e6
--- /dev/null
+++ b/w9xdrv/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = MAKEFILE SOURCES eppfctrl.asm eppflex.c eppflex.def eppflex.h eppflex.vxd eppflex.rc
diff --git a/w9xdrv/Makefile.in b/w9xdrv/Makefile.in
new file mode 100644
index 0000000..2219b2f
--- /dev/null
+++ b/w9xdrv/Makefile.in
@@ -0,0 +1,215 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = MAKEFILE SOURCES eppfctrl.asm eppflex.c eppflex.def eppflex.h eppflex.vxd eppflex.rc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps w9xdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = w9xdrv
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/w9xdrv/SOURCES b/w9xdrv/SOURCES
new file mode 100644
index 0000000..ce425b7
--- /dev/null
+++ b/w9xdrv/SOURCES
@@ -0,0 +1,8 @@
+TARGETNAME=eppflex
+TARGETTYPE=DRIVER
+TARGETPATH=obj
+NTTARGETFILE0=
+
+
+SOURCES=
+
diff --git a/w9xdrv/eppfctrl.asm b/w9xdrv/eppfctrl.asm
new file mode 100644
index 0000000..0255a9d
--- /dev/null
+++ b/w9xdrv/eppfctrl.asm
@@ -0,0 +1,54 @@
+    .386p
+
+;******************************************************************
+;                I N C L U D E S
+;******************************************************************
+
+    include vmm.inc
+    include debug.inc
+
+;==================================================================
+;        V I R T U A L   D E V I C E   D E C L A R A T I O N
+;==================================================================
+
+DECLARE_VIRTUAL_DEVICE    EPPFLEX, 1, 0, ControlProc, \
+        UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
+
+VxD_LOCKED_CODE_SEG
+
+;==================================================================
+;
+;   PROCEDURE: ControlProc
+;
+;   DESCRIPTION:
+;    Device control procedure for the SKELETON VxD
+;
+;   ENTRY:
+;    EAX = Control call ID
+;
+;   EXIT:
+;    If carry clear then
+;        Successful
+;    else
+;        Control call failed
+;
+;   USES:
+;    EAX, EBX, ECX, EDX, ESI, EDI, Flags
+;
+;==================================================================
+
+BeginProc ControlProc
+    Control_Dispatch SYS_DYNAMIC_DEVICE_INIT, \
+                    _OnSysDynamicDeviceInit, cCall, <ebx>
+    Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT, \
+                    _OnSysDynamicDeviceExit, cCall, <ebx>
+    Control_Dispatch W32_DEVICEIOCONTROL, \
+                    _OnW32DeviceIoControl, cCall, <esi>
+    clc
+    ret
+
+EndProc ControlProc
+
+VxD_LOCKED_CODE_ENDS
+
+    END
diff --git a/w9xdrv/eppflex.c b/w9xdrv/eppflex.c
new file mode 100644
index 0000000..abcc5c5
--- /dev/null
+++ b/w9xdrv/eppflex.c
@@ -0,0 +1,418 @@
+/*
+ * Thomas Sailer, (C) 2000
+ */
+
+#include <basedef.h>
+#include <vmm.h>
+#include <vmmreg.h>
+#include <debug.h>
+#include <vwin32.h>
+#include <vcomm.h>        /* must be included before VXDWRAPS.H */
+#include <vxdwraps.h>
+#include <winerror.h>
+#include <configmg.h>
+#include "eppflex.h"
+
+#pragma VxD_LOCKED_CODE_SEG
+#pragma VxD_LOCKED_DATA_SEG
+
+#define printk(x) Out_Debug_String(x)
+
+#define MAXPORTS 4
+
+static struct portconfig {
+	unsigned int addr0, addr0end;
+	unsigned int addr1, addr1end;
+	int irq;
+	int dma;
+} portconfig[MAXPORTS];
+
+static DWORD porthandle = 0;
+static PFN conthandler = NULL;
+static unsigned int portnr;
+
+static DWORD StealNotifyHandler( void *RefData, DWORD dwNotification )
+{
+        /* steal handler: we do not allow anyone to steal our port */
+        return FALSE;
+}
+
+static UCHAR inb(WORD port)
+{
+        _asm {
+                mov dx,[port]
+                in al,dx
+                jmp del1
+del1:           jmp del2
+del2:           xor ah,ah
+        }
+}
+
+static void outb(UCHAR data, WORD port)
+{
+        _asm {
+                mov dx,[port]
+                mov al,byte ptr data
+                out dx,al
+                jmp del1
+del1:           jmp del2
+del2:
+        }
+}
+
+static void releaseport(void)
+{
+        if (!conthandler)
+                return;
+        (*conthandler)(RELEASE_RESOURCE, porthandle, StealNotifyHandler);
+        porthandle = 0;
+}
+
+static int acquireport(unsigned int port)
+{
+        char lptname[] = "LPTx";
+        int ret;
+        
+        if (porthandle)
+                releaseport();
+        porthandle = 0;
+        if (port >= MAXPORTS)
+                return ERROR_BAD_DEVICE;
+	if (!portconfig[port].addr0)
+		return ERROR_BAD_DEVICE;
+	portnr = port;
+	lptname[3] = '1' + port;
+        conthandler = VCOMM_Get_Contention_Handler(lptname);
+        if (!conthandler)
+                return ERROR_BAD_DEVICE;
+        porthandle = VCOMM_Map_Name_To_Resource(lptname);
+        if (!porthandle)
+                return ERROR_BAD_DEVICE;
+        ret = (*conthandler)(ACQUIRE_RESOURCE, porthandle, StealNotifyHandler, porthandle, TRUE);
+        if (!ret)
+                return ERROR_BAD_DEVICE;
+        return NO_ERROR;
+}
+
+/*
+ * LPT find configuration stuff
+ */
+
+static void printknum(DWORD num)
+{
+	char buf[16];
+	char *cp = &buf[16];
+
+	*--cp = 0;
+	do {
+		*--cp = '0' + (num % 10);
+		num /= 10;
+	} while (num);
+	printk(cp);
+}
+
+static void printkhex(DWORD num, DWORD digits)
+{
+	char buf[9];
+	char *cp = &buf[9];
+
+	*--cp = 0;
+	if (digits > 8)
+		digits = 8;
+	if (!digits)
+		return;
+	do {
+		if ((num & 15) >= 10)
+			*--cp = 'A' - 10 + (num & 15);
+		else
+			*--cp = '0' + (num & 15);
+		num >>= 4;
+		digits--;
+	} while (digits);
+	printk(cp);
+}
+
+static void printdevid(DEVNODE dn)
+{
+	char buf[MAX_DEVICE_ID_LEN];
+
+	if (CM_Get_Device_ID(dn, buf, sizeof(buf), 0) != CR_SUCCESS)
+		return;
+	printk("Device ID: ");
+	printk(buf);
+	printk("\n");
+}
+
+static void nodefoundport(DEVNODE dn, unsigned int portnr)
+{
+	LOG_CONF lc;
+	RES_DES rd;
+	IO_DES iod;
+	IRQ_DES irqd;
+	DMA_DES dmad;
+	struct portconfig cfg;
+
+	if (portnr >= MAXPORTS) {
+		printk("Port number overflow\n");
+		return;
+	}
+	cfg.addr0 = cfg.addr0end = cfg.addr1 = cfg.addr1end = 0;
+	cfg.irq = cfg.dma = -1;
+	if (CM_Get_First_Log_Conf(&lc, dn, ALLOC_LOG_CONF) == CR_SUCCESS) {
+		rd = (RES_DES)lc;
+		while (CM_Get_Next_Res_Des(&rd, rd, ResType_IO, NULL, 0) == CR_SUCCESS) {
+			if (CM_Get_Res_Des_Data(rd, &iod, sizeof(iod), 0) == CR_SUCCESS) {
+				if (iod.IOD_Alloc_Base >= 0x400) {
+					cfg.addr1 = iod.IOD_Alloc_Base;
+					cfg.addr1end = iod.IOD_Alloc_End;
+				} else {
+					cfg.addr0 = iod.IOD_Alloc_Base;
+					cfg.addr0end = iod.IOD_Alloc_End;
+				}
+			}
+		}
+		rd = (RES_DES)lc;
+		while (CM_Get_Next_Res_Des(&rd, rd, ResType_IRQ, NULL, 0) == CR_SUCCESS) {
+			if (CM_Get_Res_Des_Data(rd, &irqd, sizeof(irqd), 0) == CR_SUCCESS) {
+				cfg.irq = irqd.IRQD_Alloc_Num;
+			}
+		}
+		rd = (RES_DES)lc;
+		while (CM_Get_Next_Res_Des(&rd, rd, ResType_DMA, NULL, 0) == CR_SUCCESS) {
+			if (CM_Get_Res_Des_Data(rd, &dmad, sizeof(dmad), 0) == CR_SUCCESS) {
+				cfg.dma = dmad.DD_Alloc_Chan;
+			}
+		}
+	}
+	if (cfg.addr0)
+		portconfig[portnr] = cfg;
+	printk("LPT");
+	printknum(portnr+1);
+	printk(": IO Ranges: ");
+	printkhex(cfg.addr0, 4);
+	printk("-");
+	printkhex(cfg.addr0end, 4);
+	printk(" ");
+	printkhex(cfg.addr1, 4);
+	printk("-");
+	printkhex(cfg.addr1end, 4);
+	if (cfg.irq != -1) {
+		printk("  IRQ ");
+		printknum(cfg.irq);
+	}
+	if (cfg.dma != -1) {
+		printk("  DMA ");
+		printknum(cfg.dma);
+	}
+	printk("\n");
+}
+
+static void nodeconfig(DEVNODE dn)
+{
+	char key[MAX_VMM_REG_KEY_LEN];
+	char portname[64];
+	ULONG portsz;
+	VMMHKEY hkey;
+
+	if (CM_Get_DevNode_Key(dn, NULL, &key, sizeof(key), CM_REGISTRY_HARDWARE) == CR_SUCCESS) {
+		portsz = sizeof(portname);
+		if (_RegOpenKey(HKEY_LOCAL_MACHINE, key, &hkey) == ERROR_SUCCESS) {
+			if (_RegQueryValueEx(hkey, "PORTNAME", NULL, NULL, portname, &portsz) == ERROR_SUCCESS) {
+				printdevid(dn);
+				printk("Port name: ");
+				printk(portname);
+				printk("\n");
+				if (portname[0] = 'L' && portname[1] == 'P' && portname[2] == 'T' && portname[4] == 0)
+					nodefoundport(dn, portname[3] - '1');
+			}
+			_RegCloseKey(hkey);
+		}
+	}
+}
+
+static void nodesubtree(DEVNODE dn)
+{
+	DWORD dnch;
+
+	do {
+		nodeconfig(dn);
+		if (CM_Get_Child(&dnch, dn, 0) == CR_SUCCESS)
+			nodesubtree(dnch);
+	} while (CM_Get_Sibling(&dn, dn, 0) == CR_SUCCESS);
+}
+
+static void retrieveconfig(void)
+{
+	DEVNODE dn;
+	CONFIGRET ret;
+
+	ret = CM_Locate_DevNode(&dn, NULL, 0);
+	if (ret != CR_SUCCESS) {
+		printk("Locate_DevNode error: ");
+		printknum(ret);
+		printk("\n");
+		return;
+	}
+	nodesubtree(dn);
+}
+
+BOOL OnSysDynamicDeviceInit(void)
+{
+	printk("eppflex: dynamic init\n");
+
+	memset(portconfig, 0, sizeof(portconfig));
+	retrieveconfig();
+
+        return TRUE;
+}
+
+BOOL OnSysDynamicDeviceExit(void)
+{
+	printk("eppflex: dynamic exit\n");
+        if (porthandle)
+                releaseport();
+        return TRUE;
+}
+
+static DWORD read_port(PDIOCPARAMETERS p, WORD port)
+{
+        struct eppflex_rwdata *rwout = (struct eppflex_rwdata *)p->lpvOutBuffer;
+
+        if (!porthandle)
+                return ERROR_INVALID_PARAMETER;
+        if (p->cbOutBuffer < sizeof(struct eppflex_rwdata))
+                return ERROR_INVALID_PARAMETER;
+	if (!port)
+		return ERROR_INVALID_PARAMETER;
+	if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+	    (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+		return ERROR_INVALID_PARAMETER;
+        rwout->data = inb(port);
+	if (p->lpcbBytesReturned)
+		*((DWORD *)p->lpcbBytesReturned) = sizeof(struct eppflex_rwdata);
+        return NO_ERROR;
+}
+
+static DWORD write_port(PDIOCPARAMETERS p, WORD port)
+{
+        struct eppflex_rwdata *rwin = (struct eppflex_rwdata *)p->lpvInBuffer;
+
+        if (!porthandle)
+                return ERROR_INVALID_PARAMETER;
+        if (p->cbInBuffer < sizeof(struct eppflex_rwdata))
+                return ERROR_INVALID_PARAMETER;
+	if (!port)
+		return ERROR_INVALID_PARAMETER;
+	if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+	    (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+		return ERROR_INVALID_PARAMETER;
+        outb(rwin->data, port);
+	if (p->lpcbBytesReturned)
+		*((DWORD *)p->lpcbBytesReturned) = 0;
+        return NO_ERROR;
+}
+
+static DWORD frob_port(PDIOCPARAMETERS p, WORD port)
+{
+        struct eppflex_rwdata *rwin = (struct eppflex_rwdata *)p->lpvInBuffer;
+        struct eppflex_rwdata *rwout = (struct eppflex_rwdata *)p->lpvOutBuffer;
+        unsigned char data;
+        
+        if (!porthandle)
+                return ERROR_INVALID_PARAMETER;
+        if (p->cbInBuffer < sizeof(struct eppflex_rwdata) ||
+            p->cbOutBuffer < sizeof(struct eppflex_rwdata))
+                return ERROR_INVALID_PARAMETER;
+	if (!port)
+		return ERROR_INVALID_PARAMETER;
+	if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+	    (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+		return ERROR_INVALID_PARAMETER;
+        data = inb(port);
+        data = (data & ~rwin->mask) ^ rwin->data;
+        outb(data, port);
+        rwout->data = data;
+        rwout->mask = rwin->mask;
+	if (p->lpcbBytesReturned)
+		*((DWORD *)p->lpcbBytesReturned) = sizeof(struct eppflex_rwdata);
+        return NO_ERROR;
+}
+
+DWORD OnW32DeviceIoControl(PDIOCPARAMETERS p)
+{
+	if (p->lpcbBytesReturned)
+		*((DWORD *)p->lpcbBytesReturned) = 0;
+        switch (p->dwIoControlCode) {
+        case DIOC_OPEN:
+                return NO_ERROR;
+                
+        case DIOC_CLOSEHANDLE:
+                return NO_ERROR;
+
+        case IOCTL_EPPFLEX_READ_DATA:
+                return read_port(p, (WORD)(portconfig[portnr].addr0));
+
+        case IOCTL_EPPFLEX_WRITE_DATA:
+                return write_port(p, (WORD)(portconfig[portnr].addr0));
+
+        case IOCTL_EPPFLEX_READ_STATUS:
+                return read_port(p, (WORD)(portconfig[portnr].addr0 + 1));
+
+        case IOCTL_EPPFLEX_WRITE_STATUS:
+                return write_port(p, (WORD)(portconfig[portnr].addr0 + 1));
+
+        case IOCTL_EPPFLEX_READ_CONTROL:
+                return read_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+        case IOCTL_EPPFLEX_WRITE_CONTROL:
+                return write_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+        case IOCTL_EPPFLEX_FROB_CONTROL:
+                return frob_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+        case IOCTL_EPPFLEX_READ_ECONTROL:
+                return read_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+        case IOCTL_EPPFLEX_WRITE_ECONTROL:
+                return write_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+        case IOCTL_EPPFLEX_FROB_ECONTROL:
+                return frob_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+        case IOCTL_EPPFLEX_READ_CONFIGA:
+                return read_port(p, (WORD)(portconfig[portnr].addr1));
+
+        case IOCTL_EPPFLEX_WRITE_CONFIGA:
+                return write_port(p, (WORD)(portconfig[portnr].addr1));
+
+        case IOCTL_EPPFLEX_READ_CONFIGB:
+                return read_port(p, (WORD)(portconfig[portnr].addr1 + 1));
+
+        case IOCTL_EPPFLEX_WRITE_CONFIGB:
+                return write_port(p, (WORD)(portconfig[portnr].addr1 + 1));
+
+        case IOCTL_EPPFLEX_READ_EPPADDR:
+                return read_port(p, (WORD)(portconfig[portnr].addr0 + 3));
+
+        case IOCTL_EPPFLEX_WRITE_EPPADDR:
+                return write_port(p, (WORD)(portconfig[portnr].addr0 + 3));
+
+        case IOCTL_EPPFLEX_READ_EPPDATA:
+                return read_port(p, (WORD)(portconfig[portnr].addr0 + 4));
+
+        case IOCTL_EPPFLEX_WRITE_EPPDATA:
+                return write_port(p, (WORD)(portconfig[portnr].addr0 + 4));
+
+        case IOCTL_EPPFLEX_ACQUIREPORT:
+                if (p->cbInBuffer < sizeof(unsigned int))
+                        return ERROR_INVALID_PARAMETER;
+                return acquireport(*((unsigned int *)p->lpvInBuffer));
+                
+        case IOCTL_EPPFLEX_RELEASEPORT:
+                releaseport();
+                return NO_ERROR;
+     
+        default:
+                return ERROR_NOT_SUPPORTED;
+        }
+}
diff --git a/w9xdrv/eppflex.def b/w9xdrv/eppflex.def
new file mode 100644
index 0000000..8417bd1
--- /dev/null
+++ b/w9xdrv/eppflex.def
@@ -0,0 +1,27 @@
+VXD EPPFLEX DYNAMIC
+SEGMENTS
+	_LTEXT   	CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+	_LDATA   	CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+	_TEXT   	CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+	_DATA   	CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+	_LPTEXT  	CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+	_CONST		CLASS 'LCODE'	PRELOAD NONDISCARDABLE
+	_BSS		CLASS 'LCODE'	PRELOAD NONDISCARDABLE
+	_TLS		CLASS 'LCODE'	PRELOAD NONDISCARDABLE
+	_ITEXT   	CLASS 'ICODE'   DISCARDABLE
+	_IDATA   	CLASS 'ICODE'   DISCARDABLE
+	_PTEXT   	CLASS 'PCODE'   NONDISCARDABLE
+	_PDATA   	CLASS 'PCODE'   NONDISCARDABLE
+	_STEXT   	CLASS 'SCODE'   RESIDENT
+	_SDATA   	CLASS 'SCODE'   RESIDENT
+	_MSGTABLE  	CLASS 'MCODE' 	PRELOAD NONDISCARDABLE IOPL
+	_MSGDATA   	CLASS 'MCODE' 	PRELOAD NONDISCARDABLE IOPL
+	_IMSGTABLE 	CLASS 'MCODE' 	PRELOAD DISCARDABLE IOPL
+	_IMSGDATA  	CLASS 'MCODE' 	PRELOAD DISCARDABLE IOPL
+	_DBOSTART	CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+	_DBOCODE	CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+	_DBODATA	CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+	_16ICODE 	CLASS '16ICODE' PRELOAD DISCARDABLE
+	_RCODE   	CLASS 'RCODE'
+EXPORTS
+	EPPFLEX_DDB @1
diff --git a/w9xdrv/eppflex.h b/w9xdrv/eppflex.h
new file mode 100644
index 0000000..fcd47ab
--- /dev/null
+++ b/w9xdrv/eppflex.h
@@ -0,0 +1,49 @@
+
+#ifndef CTL_CODE
+#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method))
+#endif
+
+#ifndef METHOD_BUFFERED
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+#endif
+
+#ifndef FILE_ANY_ACCESS
+#define FILE_ANY_ACCESS                 0
+#define FILE_READ_ACCESS          (0x0001) 
+#define FILE_WRITE_ACCESS         (0x0002)
+#endif
+
+
+#define FILE_DEVICE_EPPFLEX 0x80aa
+
+struct eppflex_rwdata {
+  unsigned char data;
+  unsigned char mask;
+};
+
+#define IOCTL_EPPFLEX_READ_DATA         CTL_CODE(FILE_DEVICE_EPPFLEX,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_DATA        CTL_CODE(FILE_DEVICE_EPPFLEX,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_STATUS       CTL_CODE(FILE_DEVICE_EPPFLEX,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_STATUS      CTL_CODE(FILE_DEVICE_EPPFLEX,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONTROL      CTL_CODE(FILE_DEVICE_EPPFLEX,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_CONTROL      CTL_CODE(FILE_DEVICE_EPPFLEX,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_ECONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_ECONTROL    CTL_CODE(FILE_DEVICE_EPPFLEX,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_ECONTROL     CTL_CODE(FILE_DEVICE_EPPFLEX,  9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGA      CTL_CODE(FILE_DEVICE_EPPFLEX, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGA     CTL_CODE(FILE_DEVICE_EPPFLEX, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGB      CTL_CODE(FILE_DEVICE_EPPFLEX, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGB     CTL_CODE(FILE_DEVICE_EPPFLEX, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPADDR      CTL_CODE(FILE_DEVICE_EPPFLEX, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPADDR     CTL_CODE(FILE_DEVICE_EPPFLEX, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPDATA      CTL_CODE(FILE_DEVICE_EPPFLEX, 16, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPDATA     CTL_CODE(FILE_DEVICE_EPPFLEX, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/* only W9x */
+#define IOCTL_EPPFLEX_ACQUIREPORT       CTL_CODE(FILE_DEVICE_EPPFLEX, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_RELEASEPORT       CTL_CODE(FILE_DEVICE_EPPFLEX, 65, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
diff --git a/w9xdrv/eppflex.rc b/w9xdrv/eppflex.rc
new file mode 100644
index 0000000..af45d2e
--- /dev/null
+++ b/w9xdrv/eppflex.rc
@@ -0,0 +1,38 @@
+#include <windows.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+            VALUE "FileDescription", "eppflex\0"
+            VALUE "FileVersion", "1, 0, 0, 1\0"
+            VALUE "InternalName", "Baycom EPPFLEX FlexNet kernel driver\0"
+            VALUE "LegalCopyright", "Copyright � 2000\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "eppflex.vxd\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "EPPFLEX\0"
+            VALUE "ProductVersion", "1.00a\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
diff --git a/w9xdrv/eppflex.vxd b/w9xdrv/eppflex.vxd
new file mode 100644
index 0000000..9e8d685
Binary files /dev/null and b/w9xdrv/eppflex.vxd differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/baycomepp.git



More information about the pkg-hamradio-commits mailing list